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,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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
@@ -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$
|
||||
Reference in New Issue
Block a user