docs(reference): import Dune: Awakening server-manager references
Phase 2 references for the host-agent Dune adapter, moved out of volatile /tmp
into docs/reference-repos/ (per Commander). Three upstream projects, .git +
node_modules + compiled binaries stripped (16MB source). Nested AI-instruction
files (.claude/, CLAUDE.md) removed so they don't pollute Corrosion sessions.
- icehunter/ dune-admin (Go+React) — 4 control planes; SETUP_DOCKER.md is the
closest analog to our agent's Dune docker control plane (compose
lifecycle, docker logs, RabbitMQ-via-exec, dune Postgres schema)
- adainrivers/ Rust/Tauri desktop — SSH+k8s BattleGroup control, maintenance
daemon, in-game admin console (Rust idiom reference)
- the4rchangel/ Node web UI replacing battlegroup.bat — matches the Commander's
Hyper-V self-host path + game-config schema
See docs/reference-repos/README.md for the full index + how we use each.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
-- get_actors_location_data_with_permission(in_actor_ids bigint[]) -> SETOF dune.actorpermissionlocationdata
|
||||
-- oid: 58272 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.get_actors_location_data_with_permission(in_actor_ids bigint[])
|
||||
RETURNS SETOF dune.actorpermissionlocationdata
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT actors.id, actors.partition_id, actors.map, actors.dimension_index, actors.transform
|
||||
FROM actors
|
||||
WHERE actors.id = ANY(in_actor_ids);
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,17 @@
|
||||
-- get_permission_actors_for_server(in_server_info dune.serverinfo) -> SETOF dune.actorpermissioncombineddata
|
||||
-- oid: 58326 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.get_permission_actors_for_server(in_server_info dune.serverinfo)
|
||||
RETURNS SETOF dune.actorpermissioncombineddata
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
return query
|
||||
with ids as (
|
||||
select array_agg(actors.id) as ids
|
||||
from permission_actor join actors on actors.id = permission_actor.actor_id
|
||||
where server_info_match(actors, in_server_info) and actors.owner_account_id is null
|
||||
)
|
||||
select permissions.* from ids, get_permission_for_actors(ids.ids) as permissions;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,11 @@
|
||||
-- get_permission_for_actor(in_actor_id bigint) -> dune.actorpermissioncombineddata
|
||||
-- oid: 58327 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.get_permission_for_actor(in_actor_id bigint)
|
||||
RETURNS dune.actorpermissioncombineddata
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
return (select get_permission_for_actors(array[in_actor_id]) limit 1);
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,49 @@
|
||||
-- get_permission_for_actors(in_actor_id bigint[]) -> SETOF dune.actorpermissioncombineddata
|
||||
-- oid: 58328 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.get_permission_for_actors(in_actor_id bigint[])
|
||||
RETURNS SETOF dune.actorpermissioncombineddata
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
-- ActorPermissionData
|
||||
ROW(
|
||||
ROW(
|
||||
permission_actor.actor_id,
|
||||
permission_actor.actor_name,
|
||||
actors.class,
|
||||
permission_actor.actor_type,
|
||||
permission_actor.access_level,
|
||||
permission_actor.is_child
|
||||
)::ActorPermissionEntry,
|
||||
array_agg(
|
||||
ROW(
|
||||
permission_actor_rank.rank,
|
||||
permission_actor_rank.player_id
|
||||
)::ActorPermissionRankData
|
||||
) FILTER (WHERE permission_actor_rank.player_id IS NOT NULL),
|
||||
array_agg(guild_members.guild_id) FILTER (WHERE permission_actor_rank.player_id IS NOT NULL)
|
||||
)::ActorPermissionData AS data,
|
||||
|
||||
-- ActorPermissionLocationData
|
||||
ROW(
|
||||
actors.id,
|
||||
actors.partition_id,
|
||||
actors.map,
|
||||
actors.dimension_index,
|
||||
actors.transform
|
||||
)::ActorPermissionLocationData AS loc
|
||||
FROM
|
||||
permission_actor
|
||||
LEFT JOIN permission_actor_rank on permission_actor.actor_id = permission_actor_rank.permission_actor_id
|
||||
LEFT JOIN guild_members ON guild_members.player_id = permission_actor_rank.player_id
|
||||
LEFT JOIN actors ON actors.id = permission_actor.actor_id
|
||||
WHERE
|
||||
permission_actor.actor_id = ANY(in_actor_id)
|
||||
GROUP BY
|
||||
permission_actor.actor_id,
|
||||
actors.id;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,18 @@
|
||||
-- get_permission_for_player_actors(in_player_id bigint, in_min_rank smallint) -> SETOF dune.actorpermissioncombineddata
|
||||
-- oid: 58329 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.get_permission_for_player_actors(in_player_id bigint, in_min_rank smallint)
|
||||
RETURNS SETOF dune.actorpermissioncombineddata
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
WITH player_owned_actors AS
|
||||
(
|
||||
SELECT array_agg(permission_actor_id) AS ids
|
||||
FROM permission_actor_rank join actors on actors.id = permission_actor_rank.permission_actor_id
|
||||
WHERE permission_actor_rank.player_id = in_player_id AND permission_actor_rank.rank <= in_min_rank and actors.owner_account_id is null
|
||||
)
|
||||
SELECT permissions.* FROM player_owned_actors, get_permission_for_actors(player_owned_actors.ids) AS permissions;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,83 @@
|
||||
-- permission_actor_create_or_update_base_marker(in_actor_id bigint, in_player_id bigint, in_rank smallint) -> void
|
||||
-- oid: 58485 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_actor_create_or_update_base_marker(in_actor_id bigint, in_player_id bigint, in_rank smallint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_marker_type TEXT := 'HomeBase';
|
||||
out_owner_id BIGINT;
|
||||
out_owner_name Text;
|
||||
out_dimension_index INTEGER;
|
||||
out_x REAL;
|
||||
out_y REAL;
|
||||
out_z REAL;
|
||||
out_totem_name Text;
|
||||
out_map_name Text;
|
||||
out_map_name_id SMALLINT;
|
||||
out_actor_type smallint;
|
||||
BEGIN
|
||||
|
||||
-- Get owner data
|
||||
SELECT player_id, character_name
|
||||
INTO out_owner_id, out_owner_name
|
||||
FROM permission_actor_rank
|
||||
JOIN player_state on player_controller_id = player_id
|
||||
WHERE rank = 1::smallint AND permission_actor_id = in_actor_id
|
||||
LIMIT 1;
|
||||
|
||||
-- Get target and totem data
|
||||
SELECT dimension_index, (transform).location.x, (transform).location.y, (transform).location.z, actor_name, map, actor_type
|
||||
INTO out_dimension_index, out_x, out_y, out_z, out_totem_name, out_map_name, out_actor_type
|
||||
FROM permission_actor_rank
|
||||
JOIN permission_actor on actor_id = permission_actor_id
|
||||
JOIN player_state on player_controller_id = player_id
|
||||
JOIN actors ON permission_actor_id = actors.id
|
||||
WHERE permission_actor_id = in_actor_id AND player_id = in_player_id
|
||||
LIMIT 1;
|
||||
|
||||
SELECT map_name_id
|
||||
INTO out_map_name_id
|
||||
FROM map_names
|
||||
WHERE map_name = out_map_name;
|
||||
|
||||
IF out_actor_type = 3 OR out_actor_type = 4 THEN -- Totem || TotemSmall
|
||||
INSERT INTO markers ("dimension_index", "marker_hash_id", "map_name_id", "marker", "area_id", "area_radius", "long_range", "payload")
|
||||
VALUES(out_dimension_index,
|
||||
in_actor_id,
|
||||
out_map_name_id,
|
||||
ROW(
|
||||
out_marker_type,
|
||||
out_x, out_y, out_z,
|
||||
'EMarkerPayloadType::Permissions'
|
||||
)::MARKER,
|
||||
0,
|
||||
0,
|
||||
FALSE,
|
||||
jsonb_build_object(
|
||||
'OwnerUID', out_owner_id,
|
||||
'OwnerName', out_owner_name,
|
||||
'TotemName', out_totem_name,
|
||||
'TotemId', in_actor_id
|
||||
)
|
||||
)
|
||||
ON CONFLICT (marker_hash_id, dimension_index, map_name_id)
|
||||
DO UPDATE SET
|
||||
marker = EXCLUDED.marker;
|
||||
|
||||
INSERT INTO player_markers ("dimension_index", "player_id", "marker_hash_id", "map_name_id", "discovery_level", "discovery_method", "payload")
|
||||
VALUES(out_dimension_index,
|
||||
in_player_id,
|
||||
in_actor_id,
|
||||
out_map_name_id,
|
||||
3, -- EMarkerDiscoveryLevel::Discovered
|
||||
10, -- EMarkerDiscoveryMethod::Permissions
|
||||
'{}'::JSONB
|
||||
)
|
||||
ON CONFLICT (dimension_index, player_id, marker_hash_id, map_name_id)
|
||||
DO NOTHING;
|
||||
END IF;
|
||||
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,17 @@
|
||||
-- permission_actor_destroy(in_actor_id bigint) -> void
|
||||
-- oid: 58486 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_actor_destroy(in_actor_id bigint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
DELETE FROM permission_actor_rank WHERE permission_actor_id = in_actor_id;
|
||||
DELETE FROM permission_actor WHERE actor_id = in_actor_id;
|
||||
-- Destroy map markers related with this actor
|
||||
DELETE FROM markers WHERE marker_hash_id = in_actor_id;
|
||||
DELETE FROM player_markers WHERE marker_hash_id = in_actor_id;
|
||||
|
||||
PERFORM pg_notify('permission_notify_channel', format('destroy#{"ActorId" : %s}', in_actor_id));
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,20 @@
|
||||
-- permission_actor_register(in_entry dune.actorpermissionentry, in_owner_rank dune.actorpermissionrankdata) -> void
|
||||
-- oid: 58487 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_actor_register(in_entry dune.actorpermissionentry, in_owner_rank dune.actorpermissionrankdata)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
INSERT INTO
|
||||
permission_actor("actor_id", "actor_name", "actor_type", "access_level", "is_child")
|
||||
VALUES(in_entry.actor_id, in_entry.actor_name, in_entry.actor_type, in_entry.access_level, in_entry.is_child);
|
||||
|
||||
IF NOT in_entry.is_child THEN
|
||||
INSERT INTO permission_actor_rank("permission_actor_id", "player_id", "rank")
|
||||
VALUES(in_entry.actor_id, in_owner_rank.player_id, in_owner_rank.rank);
|
||||
END IF;
|
||||
|
||||
-- there is no pg_notify here as the use cases where it may be needed are very low and we do not want to pay that cost. If we find any scenario where we need it, it can be added
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,39 @@
|
||||
-- permission_actor_takeover(in_entry dune.actorpermissionentry, in_owner_rank dune.actorpermissionrankdata) -> void
|
||||
-- oid: 58488 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_actor_takeover(in_entry dune.actorpermissionentry, in_owner_rank dune.actorpermissionrankdata)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
found_actor_id BIGINT;
|
||||
found_guild_id BIGINT;
|
||||
found_previous_owner BIGINT;
|
||||
BEGIN
|
||||
|
||||
-- Check if the actor is already owned to avoid exploits
|
||||
SELECT player_id into found_previous_owner FROM permission_actor_rank WHERE permission_actor_id = in_entry.actor_id AND rank = 1::smallint;
|
||||
IF found_previous_owner IS NOT NULL THEN
|
||||
RAISE NOTICE 'Player % trying to claim ownership over actor % already owned by player %.',
|
||||
in_owner_rank.player_id, in_entry.actor_id, found_previous_owner;
|
||||
return;
|
||||
END IF;
|
||||
|
||||
SELECT actor_id FROM permission_actor WHERE actor_id = in_entry.actor_id INTO found_actor_id;
|
||||
IF NOT FOUND THEN
|
||||
PERFORM permission_actor_register(in_entry, in_owner_rank);
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
SELECT guild_id FROM guild_members WHERE player_id = in_entry.actor_id INTO found_guild_id;
|
||||
IF NOT FOUND THEN
|
||||
found_guild_id := 0;
|
||||
END IF;
|
||||
|
||||
DELETE FROM permission_actor_rank WHERE permission_actor_id = in_entry.actor_id;
|
||||
INSERT INTO permission_actor_rank("permission_actor_id", "player_id", "rank")
|
||||
VALUES(in_entry.actor_id, in_owner_rank.player_id, in_owner_rank.rank);
|
||||
|
||||
PERFORM pg_notify('permission_notify_channel', format('takeover#{"ActorId" : %s , "PlayerId" : %s, "PlayerGuildId" : %s}', in_entry.actor_id, in_owner_rank.player_id, found_guild_id));
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,19 @@
|
||||
-- permission_actor_update_marker_location(in_actor_id bigint, in_location_x real, in_location_y real, in_location_z real) -> void
|
||||
-- oid: 58489 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_actor_update_marker_location(in_actor_id bigint, in_location_x real, in_location_y real, in_location_z real)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
UPDATE markers SET marker =
|
||||
(
|
||||
(marker).marker_type,
|
||||
in_location_x,
|
||||
in_location_y,
|
||||
in_location_z,
|
||||
(marker).payload_type
|
||||
)
|
||||
WHERE marker_hash_id = in_actor_id;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,16 @@
|
||||
-- permission_remove_player_rank(in_actor_id bigint, in_player_id bigint) -> void
|
||||
-- oid: 58490 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_remove_player_rank(in_actor_id bigint, in_player_id bigint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
DELETE FROM permission_actor_rank WHERE permission_actor_id = in_actor_id AND player_id = in_player_id;
|
||||
|
||||
-- Remove from player_markers using player id and, actor id as hash id
|
||||
DELETE FROM player_markers WHERE player_id = in_player_id AND marker_hash_id = in_actor_id;
|
||||
|
||||
PERFORM pg_notify('permission_notify_channel', format('remove_rank#{"ActorId" : %s , "PlayerId" : %s}', in_actor_id, in_player_id));
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,13 @@
|
||||
-- permission_set_access_level(in_actor_id bigint, in_access_level smallint) -> void
|
||||
-- oid: 58491 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_set_access_level(in_actor_id bigint, in_access_level smallint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
UPDATE permission_actor SET access_level = in_access_level WHERE permission_actor.actor_id = in_actor_id;
|
||||
|
||||
PERFORM pg_notify('permission_notify_channel', format('set_access_level#{"ActorId" : %s , "AccessLevel" : %s}', in_actor_id, in_access_level));
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,24 @@
|
||||
-- permission_set_name(in_actor_id bigint, in_name text) -> void
|
||||
-- oid: 58492 kind: FUNCTION category: permission
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.permission_set_name(in_actor_id bigint, in_name text)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
UPDATE permission_actor SET actor_name = in_name WHERE permission_actor.actor_id = in_actor_id;
|
||||
|
||||
UPDATE markers SET marker =
|
||||
(
|
||||
(marker).marker_type,
|
||||
(marker).x,
|
||||
(marker).y,
|
||||
(marker).z,
|
||||
(marker).payload_type
|
||||
),
|
||||
payload = jsonb_set(payload, '{TotemName}', to_jsonb(in_name) , false)
|
||||
WHERE marker_hash_id = in_actor_id;
|
||||
|
||||
PERFORM pg_notify('permission_notify_channel', format('set_name#{"ActorId" : %s , "Name" : "%s"}', in_actor_id, in_name));
|
||||
END
|
||||
$function$
|
||||
Reference in New Issue
Block a user