docs(reference): import Dune: Awakening server-manager references
All checks were successful
CI / backend-types (push) Successful in 10s
CI / frontend-build (push) Successful in 15s
CI / agent-tests (push) Successful in 39s
CI / integration (push) Successful in 22s

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:
Vantz Stockwell
2026-06-11 21:08:05 -04:00
parent 0715492ddf
commit 651a35d4be
1334 changed files with 238971 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
-- accept_guild_invite(in_invite_id bigint, in_role_id smallint, in_max_guild_count_per_player integer, in_max_members_per_guild integer, in_neutral_faction_id smallint) -> void
-- oid: 58116 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.accept_guild_invite(in_invite_id bigint, in_role_id smallint, in_max_guild_count_per_player integer, in_max_members_per_guild integer, in_neutral_faction_id smallint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
member_count INTEGER := 0;
player_id BIGINT := 0;
found_guild_id BIGINT := 0;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- check if invite exists
SELECT guild_invites.player_id, guild_invites.guild_id FROM guild_invites WHERE invite_id = in_invite_id INTO player_id, found_guild_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Trying to accept non exiting invite %.', in_invite_id;
END IF;
-- delete invite
DELETE FROM guild_invites WHERE invite_id = in_invite_id;
SELECT INTO member_count COUNT(*) FROM guild_members where guild_members.guild_id = found_guild_id;
-- check if we've reached guild member limit
IF member_count >= in_max_members_per_guild THEN
RAISE EXCEPTION 'Cannot insert more than % members per guild.', in_max_members_per_guild;
END IF;
-- add member
PERFORM add_guild_member(player_id, found_guild_id, in_role_id, in_max_guild_count_per_player, in_max_members_per_guild, in_neutral_faction_id);
END
$function$

View File

@@ -0,0 +1,50 @@
-- add_guild_invite(in_player_id bigint, in_guild_id bigint, in_sender_player_id bigint, in_invite_sent_timespan bigint, in_max_guild_invites_per_guild integer) -> void
-- oid: 58121 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.add_guild_invite(in_player_id bigint, in_guild_id bigint, in_sender_player_id bigint, in_invite_sent_timespan bigint, in_max_guild_invites_per_guild integer)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
invite_count INTEGER := 0;
out_invite_id INTEGER;
out_guild_name TEXT;
out_guild_description TEXT;
out_player_name TEXT;
out_sender_name TEXT;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- check if guild exists
SELECT guild_name, guild_description INTO out_guild_name, out_guild_description FROM guilds WHERE guild_id = in_guild_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Trying to add invite to non existing guild %.', in_guild_id;
END IF;
-- check if we've reached the invite limit
SELECT INTO invite_count COUNT(*) FROM guild_invites WHERE guild_invites.guild_id = in_guild_id;
IF invite_count >= in_max_guild_invites_per_guild THEN
RAISE EXCEPTION 'Cannot insert more than % guild invites per guild.', in_max_guild_invites_per_guild;
END IF;
-- check if this player already has an invite to this guild
IF EXISTS (SELECT FROM guild_invites WHERE guild_id = in_guild_id AND player_id = in_player_id) THEN
RAISE EXCEPTION 'Trying to add invite to a player that already has an invite to this guild.';
END IF;
-- add invite
INSERT INTO guild_invites("guild_id", "player_id", "sender_player_id", "invite_sent_timespan") VALUES(in_guild_id, in_player_id, in_sender_player_id, in_invite_sent_timespan) RETURNING "invite_id" INTO out_invite_id;
SELECT player_state.character_name INTO out_player_name
FROM player_state
WHERE player_state.player_controller_id = in_player_id;
SELECT player_state.character_name INTO out_sender_name
FROM player_state
WHERE player_state.player_controller_id = in_sender_player_id;
PERFORM pg_notify('guild_notify_channel', format(
'add_invite#{"InviteId" : %s, "PlayerId" : %s , "GuildId" : %s, "GuildName" : "%s", "PlayerName" : "%s", "GuildDescription" : "%s", "SenderPlayerId" : %s, "SenderPlayerName" : "%s", "InviteSentUniverseTime" : %s}',
out_invite_id, in_player_id, in_guild_id, out_guild_name, out_player_name, out_guild_description, in_sender_player_id, out_sender_name, in_invite_sent_timespan));
END
$function$

View File

@@ -0,0 +1,53 @@
-- add_guild_member(in_player_id bigint, in_guild_id bigint, in_role_id smallint, in_max_guild_count_per_player integer, in_max_members_per_guild integer, in_neutral_faction_id smallint) -> void
-- oid: 58122 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.add_guild_member(in_player_id bigint, in_guild_id bigint, in_role_id smallint, in_max_guild_count_per_player integer, in_max_members_per_guild integer, in_neutral_faction_id smallint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
guild_count INTEGER := 0;
should_clear_invites SMALLINT := 0;
player_faction_id SMALLINT;
guild_record record;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- we need to check if the player is already part of max amount of guilds before being able to add them
SELECT INTO guild_count COUNT(*) FROM guild_members WHERE player_id = in_player_id;
IF guild_count >= in_max_guild_count_per_player THEN
RAISE EXCEPTION 'Cannot insert more than % guild entries for each user.', in_max_guild_count_per_player;
END IF;
SELECT * INTO guild_record
FROM guilds
WHERE guild_id = in_guild_id;
-- check if guild exists
IF guild_record IS NULL THEN
RAISE EXCEPTION 'Trying to add user to non existing guild %.', in_guild_id;
END IF;
player_faction_id := get_player_faction(in_player_id, in_neutral_faction_id);
IF player_faction_id != in_neutral_faction_id AND guild_record.guild_faction != in_neutral_faction_id AND player_faction_id != guild_record.guild_faction THEN
RAISE EXCEPTION 'Trying to add user to with non compatible. player faction: %, guild faction: %', player_faction_id, guild_record.guild_faction;
END IF;
IF (SELECT COUNT(*) FROM guild_members where guild_members.guild_id = in_guild_id) = in_max_members_per_guild - 1 THEN
should_clear_invites := 1;
END IF;
-- insert member
INSERT INTO guild_members("player_id", "guild_id", "role_id") VALUES(in_player_id, in_guild_id, in_role_id);
-- delete invite
IF should_clear_invites = 1 THEN
DELETE FROM guild_invites WHERE guild_id = in_guild_id;
ELSE
DELETE FROM guild_invites WHERE guild_id = in_guild_id AND player_id = in_player_id;
END IF;
PERFORM pg_notify('guild_notify_channel', format('add_player#{"PlayerId" : %s , "PlayerFactionId" : %s, "GuildId" : %s, "RoleId" : %s, "ShouldClearInvites" : %s}', in_player_id, player_faction_id, in_guild_id, in_role_id, should_clear_invites));
END
$function$

View File

@@ -0,0 +1,26 @@
-- break_guild_allegiance(in_guild_id bigint, in_neutral_faction_id smallint) -> void
-- oid: 58155 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.break_guild_allegiance(in_guild_id bigint, in_neutral_faction_id smallint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
guild_data_record record;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
SELECT * INTO guild_data_record FROM guilds WHERE guild_id = in_guild_id;
IF guild_data_record IS NULL THEN
RAISE EXCEPTION 'Trying to break guild allegiance of a non existing guild: %', in_guild_id;
END IF;
if guild_data_record.guild_faction = in_neutral_faction_id THEN
RAISE EXCEPTION 'Guild already has neutral faction';
END IF;
UPDATE guilds SET guild_faction = in_neutral_faction_id WHERE guilds.guild_id = in_guild_id;
PERFORM pg_notify('guild_notify_channel', format('break_guild_allegiance#{"GuildId" : %s , "OldGuildFactionDbId" : %s, "NewGuildFactionDbId" : %s}', in_guild_id, guild_data_record.guild_faction, in_neutral_faction_id));
END
$function$

View File

@@ -0,0 +1,11 @@
-- clean_old_guild_invites(in_cutoff_timespan bigint) -> void
-- oid: 58167 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.clean_old_guild_invites(in_cutoff_timespan bigint)
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
DELETE FROM guild_invites WHERE invite_sent_timespan < in_cutoff_timespan;
END
$function$

View File

@@ -0,0 +1,37 @@
-- create_guild(in_player_id bigint, in_neutral_faction smallint, in_guild_name text, in_guild_desc text, in_max_guild_count_per_player integer, OUT out_guild_id bigint, OUT out_success boolean, OUT out_fail_reason dune.guildcreatefailreason) -> record
-- oid: 58183 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.create_guild(in_player_id bigint, in_neutral_faction smallint, in_guild_name text, in_guild_desc text, in_max_guild_count_per_player integer, OUT out_guild_id bigint, OUT out_success boolean, OUT out_fail_reason dune.guildcreatefailreason)
RETURNS record
LANGUAGE plpgsql
AS $function$
DECLARE
guild_count integer;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
IF EXISTS (SELECT 1 FROM guilds WHERE guild_name ILIKE in_guild_name) THEN
out_guild_id := 0;
out_success := FALSE;
out_fail_reason := 'NameAlreadyTaken'::GuildCreateFailReason; -- 1 represents NAME_ALREADY_EXISTS
RETURN;
END IF;
-- we need to check if the player is already part of max amount of guilds before being able to add them
SELECT INTO guild_count COUNT(*) FROM guild_members WHERE player_id = in_player_id;
IF guild_count >= in_max_guild_count_per_player THEN
out_guild_id := 0;
out_success := FALSE;
out_fail_reason := 'QueryError'::GuildCreateFailReason;
RETURN;
END IF;
INSERT INTO guilds("guild_id", "guild_name", "guild_faction", "guild_description") VALUES(DEFAULT, in_guild_name, in_neutral_faction , in_guild_desc) RETURNING "guild_id" INTO out_guild_id;
INSERT INTO guild_members("player_id", "guild_id", "role_id") VALUES(in_player_id, out_guild_id, 100);
PERFORM pg_notify('guild_notify_channel', format('add_player#{"PlayerId" : %s , "PlayerFactionId" : %s, "GuildId" : %s, "RoleId" : 100, "ShouldClearInvites" : 0}', in_player_id, get_player_faction(in_player_id, in_neutral_faction), out_guild_id));
out_success := TRUE;
out_fail_reason := 'None'::GuildCreateFailReason;
END
$function$

View File

@@ -0,0 +1,29 @@
-- demote_guild_member(in_guild_id bigint, in_player_id bigint, in_new_role smallint) -> void
-- oid: 58233 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.demote_guild_member(in_guild_id bigint, in_player_id bigint, in_new_role smallint)
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- check if new admin is actualy in guild
IF NOT EXISTS(SELECT FROM guild_members WHERE player_id = in_player_id AND guild_id = in_guild_id) THEN
RAISE EXCEPTION 'Trying to demote player not in guild %.', in_player_id;
END IF;
IF is_player_guild_admin(in_player_id, in_guild_id) THEN
RAISE EXCEPTION 'Trying to demote admin. promote a member to admin instead.';
END IF;
if in_new_role = 100 THEN
RAISE EXCEPTION 'Trying to demote to admin.';
END IF;
-- set new player to new role
UPDATE guild_members SET role_id = in_new_role WHERE player_id = in_player_id AND guild_id = in_guild_id;
PERFORM pg_notify('guild_notify_channel', format('demote_player#{"PlayerId" : %s , "GuildId" : %s, "NewRole" : %s}', in_player_id, in_guild_id, in_new_role));
END
$function$

View File

@@ -0,0 +1,28 @@
-- disband_guild(in_guild_id bigint) -> void
-- oid: 58237 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.disband_guild(in_guild_id bigint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
out_guild_name TEXT;
members_list BIGINT[];
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- check if guild exists
SELECT guild_name INTO out_guild_name FROM guilds WHERE guild_id = in_guild_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Trying to disband non existing guild %.', in_guild_id;
END IF;
-- get members list
members_list := ARRAY(SELECT player_id FROM guild_members WHERE guild_id = in_guild_id);
-- delete
DELETE FROM guilds WHERE guild_id = in_guild_id;
PERFORM pg_notify('guild_notify_channel', format('guild_disband#{"GuildId" : %s , "GuildName" : "%s", "PlayerIds" : %s}', in_guild_id, out_guild_name, to_json(members_list)::text));
END
$function$

View File

@@ -0,0 +1,14 @@
-- get_guild_data(in_guild_id bigint) -> TABLE(guild_name text, guild_faction_id smallint, guild_description text)
-- oid: 58307 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.get_guild_data(in_guild_id bigint)
RETURNS TABLE(guild_name text, guild_faction_id smallint, guild_description text)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT guilds.guild_name, guilds.guild_faction, guilds.guild_description
FROM guilds
WHERE guild_id = in_guild_id;
END
$function$

View File

@@ -0,0 +1,15 @@
-- get_guild_data_for_player(in_player_id bigint) -> TABLE(guild_id bigint, guild_factions_id smallint, guild_name text, guild_description text, player_id bigint, role_id smallint, player_faction_id smallint)
-- oid: 58308 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.get_guild_data_for_player(in_player_id bigint)
RETURNS TABLE(guild_id bigint, guild_factions_id smallint, guild_name text, guild_description text, player_id bigint, role_id smallint, player_faction_id smallint)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT guilds.guild_id, guilds.guild_faction, guilds.guild_name, guilds.guild_description, guild_members.player_id, guild_members.role_id, player_faction.faction_id
FROM guilds JOIN guild_members on (guilds.guild_id = guild_members.guild_id)
LEFT JOIN player_faction on player_faction.actor_id = guild_members.player_id
WHERE guild_members.player_id = in_player_id;
END
$function$

View File

@@ -0,0 +1,17 @@
-- get_guild_for_player(in_player_id bigint) -> bigint
-- oid: 58309 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.get_guild_for_player(in_player_id bigint)
RETURNS bigint
LANGUAGE plpgsql
AS $function$
DECLARE
found_guild_id integer;
BEGIN
SELECT guild_id FROM guild_members WHERE player_id = in_player_id INTO found_guild_id;
IF NOT FOUND THEN
RETURN 0;
END IF;
RETURN found_guild_id;
END
$function$

View File

@@ -0,0 +1,15 @@
-- get_guild_invites(in_guild_id bigint) -> TABLE(invite_id bigint, player_id bigint, sender_player_id bigint, invite_sent_timespan bigint, character_name text, sender_character_name text)
-- oid: 58310 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.get_guild_invites(in_guild_id bigint)
RETURNS TABLE(invite_id bigint, player_id bigint, sender_player_id bigint, invite_sent_timespan bigint, character_name text, sender_character_name text)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY SELECT guild_invites.invite_id, guild_invites.player_id, guild_invites.sender_player_id, guild_invites.invite_sent_timespan, player_state.character_name, sender_player_state.character_name AS sender_character_name
FROM guild_invites
JOIN player_state ON player_state.player_controller_id = guild_invites.player_id
JOIN player_state AS sender_player_state ON sender_player_state.player_controller_id = guild_invites.sender_player_id
WHERE guild_id = in_guild_id;
END
$function$

View File

@@ -0,0 +1,15 @@
-- get_guild_members(in_guild_id bigint) -> TABLE(player_id bigint, role_id smallint, player_faction_id smallint)
-- oid: 58311 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.get_guild_members(in_guild_id bigint)
RETURNS TABLE(player_id bigint, role_id smallint, player_faction_id smallint)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT guild_members.player_id, guild_members.role_id, player_faction.faction_id
FROM guild_members
LEFT JOIN player_faction ON player_faction.actor_id = guild_members.player_id
WHERE guild_id = in_guild_id;
END
$function$

View File

@@ -0,0 +1,43 @@
-- guild_handle_actor_delete(in_player_id bigint) -> void
-- oid: 58366 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.guild_handle_actor_delete(in_player_id bigint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
out_guild_id BIGINT;
out_new_leader_id BIGINT;
out_guild_count INT;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- remove invites
PERFORM reject_guild_invite(invite_id) FROM guild_invites
where player_id = in_player_id OR sender_player_id = in_player_id;
-- Get member guild id
SELECT guild_id INTO out_guild_id FROM guild_members WHERE player_id = in_player_id;
IF FOUND THEN
SELECT INTO out_guild_count COUNT(*) FROM guild_members WHERE guild_id = out_guild_id;
IF out_guild_count < 2 THEN
PERFORM disband_guild(out_guild_id);
ELSE
-- Promote new leder
IF is_player_guild_admin(in_player_id, out_guild_id) THEN
SELECT player_id into out_new_leader_id from guild_members
WHERE guild_id = out_guild_id AND player_id <> in_player_id
LIMIT 1;
IF out_new_leader_id IS NOT NULL THEN
PERFORM promote_guild_member(out_guild_id, out_new_leader_id, 100::smallint);
END IF;
END IF;
-- remove member
PERFORM remove_guild_members(ARRAY[in_player_id], out_guild_id, 0::smallint);
END IF;
END IF;
END
$function$

View File

@@ -0,0 +1,11 @@
-- guilds_get_exclusive_operation_lock() -> void
-- oid: 58367 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.guilds_get_exclusive_operation_lock()
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
PERFORM pg_advisory_xact_lock(601145); -- GUILDS in leet :/
END;
$function$

View File

@@ -0,0 +1,52 @@
-- pledge_guild_allegiance(in_guild_id bigint, in_guild_leader_player_id bigint, in_neutral_faction_id smallint) -> void
-- oid: 58496 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.pledge_guild_allegiance(in_guild_id bigint, in_guild_leader_player_id bigint, in_neutral_faction_id smallint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
guilds_changed SMALLINT := 0;
guild_data_record record;
guild_leader_record record;
guild_leader_faction_id SMALLINT;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
SELECT * INTO guild_leader_record FROM guild_members
LEFT JOIN player_faction ON actor_id = in_guild_leader_player_id
WHERE player_id = in_guild_leader_player_id AND is_player_guild_admin(in_guild_leader_player_id, in_guild_id);
IF guild_leader_record IS NULL THEN
RAISE EXCEPTION 'Trying to change a faction for a player: % without a guild', in_guild_leader_player_id;
END IF;
SELECT * INTO guild_data_record FROM guilds WHERE guild_id = in_guild_id;
IF guild_data_record IS NULL THEN
RAISE EXCEPTION 'Trying to change a faction in non existing guild: %', in_guild_id;
END IF;
IF guild_leader_record.faction_id IS NULL THEN
guild_leader_faction_id := in_neutral_faction_id;
ELSE
guild_leader_faction_id := guild_leader_record.faction_id;
END IF;
if guild_leader_faction_id = in_neutral_faction_id THEN
RAISE EXCEPTION 'Guild leader has neutral faction, cannot change faction to neutral';
ELSEIF guild_data_record.guild_faction = guild_leader_faction_id THEN
RAISE EXCEPTION 'Guild already has the same allegiance: % as the guild leader %', in_guild_id, guild_data_record.guild_faction;
END IF;
UPDATE guilds SET guild_faction = guild_leader_faction_id WHERE guilds.guild_id = in_guild_id;
PERFORM pg_notify('guild_notify_channel', format('pledge_guild_allegiance#{"GuildId" : %s , "OldGuildFactionDbId" : %s, "NewGuildFactionDbId" : %s}', in_guild_id, guild_data_record.guild_faction, guild_leader_faction_id));
PERFORM remove_guild_members(ARRAY(
SELECT player_id FROM guild_members
JOIN player_faction ON guild_members.player_id = player_faction.actor_id
WHERE guild_leader_faction_id != player_faction.faction_id AND player_faction.faction_id != in_neutral_faction_id AND guild_members.guild_id = in_guild_id),
in_guild_id,
2::smallint
);
END
$function$

View File

@@ -0,0 +1,26 @@
-- promote_guild_member(in_guild_id bigint, in_player_id bigint, in_new_role smallint) -> void
-- oid: 58498 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.promote_guild_member(in_guild_id bigint, in_player_id bigint, in_new_role smallint)
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- check if new admin is actualy in guild
IF NOT EXISTS(SELECT FROM guild_members WHERE player_id = in_player_id AND guild_id = in_guild_id) THEN
RAISE EXCEPTION 'Trying to promte player not in guild %.', in_player_id;
END IF;
if in_new_role = 100 THEN
-- set admin to member
UPDATE guild_members SET role_id = 50 WHERE guild_id = in_guild_id AND role_id = 100;
END IF;
-- set new player to new role
UPDATE guild_members SET role_id = in_new_role WHERE player_id = in_player_id AND guild_id = in_guild_id;
PERFORM pg_notify('guild_notify_channel', format('promote_player#{"PlayerId" : %s , "GuildId" : %s, "NewRole" : %s}', in_player_id, in_guild_id, in_new_role));
END
$function$

View File

@@ -0,0 +1,24 @@
-- reject_guild_invite(in_invite_id bigint) -> void
-- oid: 58514 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.reject_guild_invite(in_invite_id bigint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
player_id BIGINT := 0;
guild_id BIGINT := 0;
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- check if invite exists
SELECT guild_invites.player_id, guild_invites.guild_id FROM guild_invites WHERE invite_id = in_invite_id INTO player_id, guild_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Trying to remove non exiting invite %.', in_invite_id;
END IF;
DELETE FROM guild_invites WHERE invite_id = in_invite_id;
PERFORM pg_notify('guild_notify_channel', format('reject_invite#{"PlayerId" : %s , "GuildId" : %s}', player_id, guild_id));
END
$function$

View File

@@ -0,0 +1,28 @@
-- remove_guild_members(in_player_ids bigint[], in_guild_id bigint, in_remove_reason smallint) -> void
-- oid: 58518 kind: FUNCTION category: guild
CREATE OR REPLACE FUNCTION dune.remove_guild_members(in_player_ids bigint[], in_guild_id bigint, in_remove_reason smallint)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
out_guild_name TEXT;
players_removed BIGINT[];
BEGIN
PERFORM guilds_get_exclusive_operation_lock();
-- check if guild exists
SELECT guild_name INTO out_guild_name FROM guilds WHERE guild_id = in_guild_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Trying to disband non existing guild %.', in_guild_id;
END IF;
WITH removed_members AS (
DELETE FROM guild_members
WHERE player_id = ANY(in_player_ids) AND NOT is_player_guild_admin(player_id, in_guild_id)
RETURNING *
) SELECT array_agg(player_id) from removed_members INTO players_removed;
PERFORM pg_notify('guild_notify_channel', format('remove_players#{"PlayerIds" : [%s] , "GuildId" : %s, "GuildName" : "%s", "GuildRemoveReason" : %s}', ARRAY_TO_STRING(players_removed, ','), in_guild_id, out_guild_name, in_remove_reason));
END
$function$