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,44 @@
|
||||
-- accept_party_invite(in_invite_id bigint, in_platform_session_id text, in_max_party_member_count integer) -> dune.partyacceptinviteresult
|
||||
-- oid: 58117 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.accept_party_invite(in_invite_id bigint, in_platform_session_id text, in_max_party_member_count integer)
|
||||
RETURNS dune.partyacceptinviteresult
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_player_id BIGINT;
|
||||
out_sender_id BIGINT;
|
||||
out_party_id BIGINT;
|
||||
out_player_platform_name TEXT;
|
||||
out_player_platform_id TEXT;
|
||||
out_sender_platform_name TEXT;
|
||||
out_sender_platform_session_id TEXT;
|
||||
out_accept_error PartyAcceptInviteResult DEFAULT 'Success'::PartyAcceptInviteResult;
|
||||
BEGIN
|
||||
PERFORM parties_get_exclusive_operation_lock();
|
||||
|
||||
-- check if invite exists
|
||||
SELECT party_id, player_id, sender_player_id, sender_platform_name, sender_platform_session_id FROM party_invites
|
||||
WHERE invite_id = in_invite_id INTO out_party_id, out_player_id, out_sender_id, out_sender_platform_name, out_sender_platform_session_id;
|
||||
IF NOT FOUND THEN
|
||||
RAISE EXCEPTION 'Trying to accept non exiting party invite %.', in_invite_id;
|
||||
out_accept_error = 'NonExistingInvite'::PartyAcceptInviteResult;
|
||||
END IF;
|
||||
|
||||
-- query receiver platform data
|
||||
SELECT acc.platform_name, acc.platform_id INTO out_player_platform_name, out_player_platform_id
|
||||
FROM accounts acc LEFT JOIN player_state ps ON acc.id=ps.account_id
|
||||
WHERE ps.player_controller_id = out_player_id;
|
||||
|
||||
IF out_party_id IS NULL THEN
|
||||
PERFORM internal_create_party(in_invite_id, out_sender_id, out_sender_platform_session_id, out_sender_platform_name,
|
||||
out_player_id, in_platform_session_id, out_player_platform_name);
|
||||
ELSE
|
||||
out_accept_error := internal_add_party_member(in_invite_id, out_party_id, out_player_id, in_platform_session_id, out_player_platform_name, in_max_party_member_count);
|
||||
END IF;
|
||||
|
||||
-- Delete any sent or reiceived invites from the player who's accepting the invitation
|
||||
DELETE FROM party_invites WHERE sender_player_id = out_player_id OR player_id = out_player_id;
|
||||
RETURN out_accept_error;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,46 @@
|
||||
-- add_party_invite(in_sender_player_id bigint, in_sender_platform_name text, in_sender_platform_session_id text, in_player_id bigint, in_max_party_member_count integer, in_invite_sent_timespan bigint) -> void
|
||||
-- oid: 58128 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.add_party_invite(in_sender_player_id bigint, in_sender_platform_name text, in_sender_platform_session_id text, in_player_id bigint, in_max_party_member_count integer, in_invite_sent_timespan bigint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_already_in_party BOOLEAN;
|
||||
out_already_invited BOOLEAN;
|
||||
out_sender_existing_party_id BIGINT;
|
||||
out_sender_party_count INTEGER;
|
||||
out_invite_id BIGINT;
|
||||
out_player_name TEXT;
|
||||
out_sender_name TEXT;
|
||||
BEGIN
|
||||
|
||||
-- check if invited player is already invited
|
||||
SELECT INTO out_already_invited EXISTS (SELECT 1 FROM party_invites where player_id = in_player_id AND sender_player_id = in_sender_player_id);
|
||||
IF out_already_invited THEN
|
||||
RAISE EXCEPTION 'The player % already has an invite from %.', in_player_id, in_sender_player_id;
|
||||
END IF;
|
||||
|
||||
-- check if the sender party is full
|
||||
SELECT party_id INTO out_sender_existing_party_id from parties where party_leader_id = in_sender_player_id;
|
||||
SELECT INTO out_sender_party_count COUNT(*) FROM party_members WHERE party_id = out_sender_existing_party_id;
|
||||
|
||||
IF out_sender_existing_party_id IS NOT NULL AND out_sender_party_count >= in_max_party_member_count THEN
|
||||
RAISE EXCEPTION 'Trying to invite player % for a party id % that is full.', in_player_id, out_sender_existing_party_id;
|
||||
END IF;
|
||||
|
||||
-- add invite
|
||||
INSERT INTO party_invites("player_id", "party_id", "sender_player_id", "sender_platform_name", "sender_platform_session_id", "invite_sent_timespan")
|
||||
VALUES(in_player_id, out_sender_existing_party_id, in_sender_player_id, in_sender_platform_name, in_sender_platform_session_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('party_notify_channel', format(
|
||||
'add_invite#{"InviteId" : %s, "SenderId" : %s, "SenderName" : "%s", "PlayerId" : %s , "PlayerName" : "%s", "InviteSentUniverseTime" : %s}',
|
||||
out_invite_id, in_sender_player_id, out_sender_name, in_player_id, out_player_name, in_invite_sent_timespan));
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,14 @@
|
||||
-- clean_expired_party_invites(in_invite_expire_seconds integer) -> void
|
||||
-- oid: 58165 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.clean_expired_party_invites(in_invite_expire_seconds integer)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
PERFORM parties_get_exclusive_operation_lock();
|
||||
|
||||
PERFORM remove_party_invite(invite_id, 0::smallint) FROM party_invites
|
||||
WHERE CURRENT_TIMESTAMP > TO_TIMESTAMP(invite_sent_timespan) + INTERVAL '1 second' * in_invite_expire_seconds;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,28 @@
|
||||
-- disband_party(in_party_id bigint) -> void
|
||||
-- oid: 58238 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.disband_party(in_party_id bigint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
invite_ids BIGINT[];
|
||||
sender_ids BIGINT[];
|
||||
player_ids BIGINT[];
|
||||
BEGIN
|
||||
PERFORM parties_get_exclusive_operation_lock();
|
||||
|
||||
DELETE FROM party_members WHERE party_id = in_party_id;
|
||||
DELETE FROM parties WHERE party_id = in_party_id;
|
||||
DELETE FROM platform_parties_mapping WHERE dune_party_id = in_party_id;
|
||||
|
||||
WITH removed_invites AS (
|
||||
DELETE FROM party_invites
|
||||
WHERE party_id = in_party_id
|
||||
RETURNING *
|
||||
) SELECT array_agg(invite_id), array_agg(sender_player_id), array_agg(player_id) from removed_invites INTO invite_ids, sender_ids, player_ids;
|
||||
|
||||
PERFORM pg_notify('party_notify_channel', format('disband_party#{"PartyId" : %s, "InviteIds" : [%s] , "SenderIds" : [%s] , "PlayerIds" : [%s]}',
|
||||
in_party_id, ARRAY_TO_STRING(invite_ids, ','), ARRAY_TO_STRING(sender_ids, ','), ARRAY_TO_STRING(player_ids, ',')));
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,16 @@
|
||||
-- get_party_members(in_party_id bigint) -> TABLE(player_id bigint, fls_id text, party_id bigint)
|
||||
-- oid: 58325 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.get_party_members(in_party_id bigint)
|
||||
RETURNS TABLE(player_id bigint, fls_id text, party_id bigint)
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT pm.player_id, acc.user, pm.party_id
|
||||
FROM party_members pm
|
||||
LEFT JOIN player_state ps ON ps.player_controller_id = pm.player_id
|
||||
LEFT JOIN accounts acc ON acc.id = ps.account_id
|
||||
WHERE pm.party_id = in_party_id;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,61 @@
|
||||
-- internal_add_party_member(in_invite_id bigint, in_party_id bigint, in_player_id bigint, in_platform_session_id text, in_platform_name text, in_max_party_member_count integer) -> dune.partyacceptinviteresult
|
||||
-- oid: 58391 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.internal_add_party_member(in_invite_id bigint, in_party_id bigint, in_player_id bigint, in_platform_session_id text, in_platform_name text, in_max_party_member_count integer)
|
||||
RETURNS dune.partyacceptinviteresult
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
party_exists BOOLEAN;
|
||||
member_count INTEGER;
|
||||
out_platform_members_count INTEGER;
|
||||
out_player_name TEXT;
|
||||
out_accept_error PartyAcceptInviteResult DEFAULT 'Success'::PartyAcceptInviteResult;
|
||||
BEGIN
|
||||
|
||||
-- check if party exists
|
||||
SELECT INTO party_exists EXISTS (SELECT 1 FROM parties WHERE party_id = in_party_id);
|
||||
IF NOT party_exists THEN
|
||||
PERFORM remove_party_invite(in_invite_id, 2::smallint); -- PartyNoLongerExists = 2
|
||||
RAISE NOTICE 'Trying to add player % to non existing party %.', in_player_id, in_party_id;
|
||||
out_accept_error = 'NonExistingParty'::PartyAcceptInviteResult;
|
||||
RETURN out_accept_error;
|
||||
END IF;
|
||||
|
||||
-- check party member count
|
||||
SELECT INTO member_count COUNT(*) FROM party_members WHERE party_id = in_party_id;
|
||||
IF member_count >= in_max_party_member_count THEN
|
||||
PERFORM remove_party_invite(in_invite_id, 1::smallint); -- PartyFull = 1
|
||||
RAISE NOTICE 'Trying to add more members than the allowed % to party %.', in_max_party_member_count, in_party_id;
|
||||
out_accept_error = 'PartyFull'::PartyAcceptInviteResult;
|
||||
RETURN out_accept_error;
|
||||
END IF;
|
||||
|
||||
-- insert member
|
||||
INSERT INTO party_members("player_id", "party_id") VALUES(in_player_id, in_party_id);
|
||||
|
||||
-- track platform information
|
||||
SELECT num_of_players INTO out_platform_members_count FROM platform_parties_mapping WHERE platform_name = in_platform_name AND dune_party_id = in_party_id;
|
||||
IF out_platform_members_count IS NOT NULL THEN
|
||||
-- there was a platform session for the player's party
|
||||
UPDATE platform_parties_mapping SET num_of_players = out_platform_members_count+1 WHERE platform_name = in_platform_name AND dune_party_id = in_party_id;
|
||||
ELSE
|
||||
-- no mapping for this platform yet, add
|
||||
INSERT INTO platform_parties_mapping ("platform_session_id", "platform_name", "dune_party_id", "num_of_players")
|
||||
SELECT in_platform_session_id, in_platform_name, in_party_id, 1
|
||||
WHERE in_platform_session_id <> '' AND in_platform_name <> '';
|
||||
END IF;
|
||||
|
||||
-- Get player name
|
||||
SELECT player_state.character_name INTO out_player_name
|
||||
FROM player_state WHERE player_state.player_controller_id = in_player_id;
|
||||
|
||||
PERFORM remove_party_invite(in_invite_id, 0::smallint); -- Silent = 0
|
||||
|
||||
PERFORM pg_notify('party_notify_channel', format(
|
||||
'add_party_member#{"PartyId" : %s, "PlayerId" : %s, "PlayerName" : "%s", "PlayerPlatformName" : "%s", "PlayerPlatformSessionId" : "%s"}',
|
||||
in_party_id, in_player_id, out_player_name, in_platform_name, in_platform_session_id));
|
||||
|
||||
RETURN out_accept_error;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,70 @@
|
||||
-- internal_create_party(in_invite_id bigint, in_leader_id bigint, in_leader_platform_session_id text, in_leader_platform_name text, in_member_id bigint, in_platform_session_id text, in_platform_name text) -> bigint
|
||||
-- oid: 58392 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.internal_create_party(in_invite_id bigint, in_leader_id bigint, in_leader_platform_session_id text, in_leader_platform_name text, in_member_id bigint, in_platform_session_id text, in_platform_name text)
|
||||
RETURNS bigint
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
leader_registered BOOLEAN;
|
||||
players_belong_to_party BOOLEAN;
|
||||
out_party_id BIGINT;
|
||||
out_player_name TEXT;
|
||||
out_leader_name TEXT;
|
||||
BEGIN
|
||||
|
||||
-- Check if the leader already exists in the parties table
|
||||
SELECT INTO leader_registered EXISTS (SELECT 1 FROM parties WHERE party_leader_id = in_leader_id);
|
||||
IF leader_registered THEN
|
||||
RAISE EXCEPTION 'Leader already has a party.';
|
||||
END IF;
|
||||
|
||||
-- Check if either the leader or member already exists in the party_members table
|
||||
SELECT INTO players_belong_to_party EXISTS (SELECT 1 FROM party_members WHERE player_id = in_leader_id OR player_id = in_member_id);
|
||||
IF players_belong_to_party THEN
|
||||
RAISE EXCEPTION 'One of the players is already in a party.';
|
||||
END IF;
|
||||
|
||||
-- If neither condition is met, insert the new party and members
|
||||
INSERT INTO parties ("party_leader_id") VALUES (in_leader_id) RETURNING party_id INTO out_party_id;
|
||||
INSERT INTO party_members (player_id, party_id) VALUES (in_leader_id, out_party_id), (in_member_id, out_party_id);
|
||||
|
||||
-- Update all of the leaders invites to have the new party as party id
|
||||
UPDATE party_invites SET party_id = out_party_id WHERE sender_player_id = in_leader_id;
|
||||
|
||||
-- Get leader name
|
||||
SELECT player_state.character_name INTO out_leader_name
|
||||
FROM player_state WHERE player_state.player_controller_id = in_leader_id;
|
||||
|
||||
-- Get member name
|
||||
SELECT player_state.character_name INTO out_player_name
|
||||
FROM player_state WHERE player_state.player_controller_id = in_member_id;
|
||||
|
||||
-- Handle platform sessions mapping for new party
|
||||
IF in_leader_platform_name = in_platform_name THEN
|
||||
-- If players are from the same platform and leader has session id (console), we create mapping (if their platform_name and session_id are valid)
|
||||
INSERT INTO platform_parties_mapping ("platform_session_id", "platform_name", "dune_party_id", "num_of_players")
|
||||
SELECT in_leader_platform_session_id, in_leader_platform_name, out_party_id, 2
|
||||
WHERE in_leader_platform_session_id <> '' AND in_leader_platform_name <> '';
|
||||
ELSE
|
||||
-- Create leader's platform session mapping if their platform_name and session_id are valid
|
||||
INSERT INTO platform_parties_mapping ("platform_session_id", "platform_name", "dune_party_id", "num_of_players")
|
||||
SELECT in_leader_platform_session_id, in_leader_platform_name, out_party_id, 1
|
||||
WHERE in_leader_platform_session_id <> '' AND in_leader_platform_name <> '';
|
||||
|
||||
-- Create member's platform session mapping if their platform_name and session_id are valid
|
||||
INSERT INTO platform_parties_mapping ("platform_session_id", "platform_name", "dune_party_id", "num_of_players")
|
||||
SELECT in_platform_session_id, in_platform_name, out_party_id, 1
|
||||
WHERE in_platform_session_id <> '' AND in_platform_name <> '';
|
||||
END IF;
|
||||
|
||||
PERFORM remove_party_invite(in_invite_id, 0::smallint); -- Silent = 0
|
||||
|
||||
PERFORM pg_notify('party_notify_channel', format(
|
||||
'create_party#{"PartyId" : %s, "LeaderId" : %s, "LeaderName" : "%s", "LeaderPlatformName" : "%s", "LeaderPlatformSessionId" : "%s", "MemberId" : %s, "MemberName" : "%s", "MemberPlatformName" : "%s", "MemberPlatformSessionId" : "%s"}',
|
||||
out_party_id, in_leader_id, out_leader_name, in_leader_platform_name, in_leader_platform_session_id, in_member_id, out_player_name, in_platform_name, in_platform_session_id));
|
||||
|
||||
RETURN out_party_id;
|
||||
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,41 @@
|
||||
-- join_platform_session_party(in_leader_platform_id text, in_player_platform_id text, in_platform_session_id text, in_platform_name text, in_max_party_member_count integer) -> dune.partyacceptinviteresult
|
||||
-- oid: 58396 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.join_platform_session_party(in_leader_platform_id text, in_player_platform_id text, in_platform_session_id text, in_platform_name text, in_max_party_member_count integer)
|
||||
RETURNS dune.partyacceptinviteresult
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_party_id BIGINT;
|
||||
out_accept_error PartyAcceptInviteResult DEFAULT 'Success'::PartyAcceptInviteResult;
|
||||
out_leader_id BIGINT;
|
||||
out_player_id BIGINT;
|
||||
BEGIN
|
||||
IF in_platform_name IS NULL OR length(in_platform_name) = 0 THEN
|
||||
RAISE EXCEPTION 'platform_name must not be empty';
|
||||
END IF;
|
||||
IF in_platform_session_id IS NULL OR length(in_platform_session_id) = 0 THEN
|
||||
RAISE EXCEPTION 'platform_session_id must not be empty';
|
||||
END IF;
|
||||
|
||||
-- Fetch party id, but do nothing with it
|
||||
SELECT dune_party_id INTO out_party_id
|
||||
FROM platform_parties_mapping
|
||||
WHERE platform_session_id = in_platform_session_id
|
||||
AND platform_name = in_platform_name
|
||||
LIMIT 1;
|
||||
|
||||
out_leader_id = get_controller_id_from_platform_id(in_leader_platform_id);
|
||||
out_player_id = get_controller_id_from_platform_id(in_player_platform_id);
|
||||
|
||||
IF out_party_id IS NULL THEN
|
||||
-- Using same platform name and platform session id cause they are joining through system invite, they'll always be the same platform.
|
||||
PERFORM internal_create_party(NULL, out_leader_id, in_platform_session_id, in_platform_name,
|
||||
out_player_id, in_platform_session_id, in_platform_name);
|
||||
ELSE
|
||||
out_accept_error := internal_add_party_member(NULL, out_party_id, out_player_id, in_platform_session_id, in_platform_name, in_max_party_member_count);
|
||||
END IF;
|
||||
|
||||
RETURN out_accept_error;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,34 @@
|
||||
-- promote_new_party_leader(in_party_id bigint) -> void
|
||||
-- oid: 58499 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.promote_new_party_leader(in_party_id bigint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_current_leader BIGINT;
|
||||
out_new_leader BIGINT;
|
||||
BEGIN
|
||||
PERFORM parties_get_exclusive_operation_lock();
|
||||
|
||||
-- get current leader
|
||||
SELECT party_leader_id FROM parties where party_id = in_party_id into out_current_leader;
|
||||
IF out_current_leader IS NULL THEN
|
||||
RAISE EXCEPTION 'Promoting a player to a non existing party %.', in_party_id;
|
||||
END IF;
|
||||
|
||||
-- get first member in the party that is online and is not the party leader
|
||||
SELECT party_members.player_id INTO out_new_leader FROM party_members
|
||||
JOIN player_state ON player_state.player_controller_id = party_members.player_id
|
||||
WHERE party_members.party_id = in_party_id
|
||||
AND party_members.player_id <> out_current_leader
|
||||
AND player_state.online_status = 'Online';
|
||||
|
||||
IF out_new_leader IS NOT NULL THEN
|
||||
-- promote
|
||||
UPDATE parties SET party_leader_id = out_new_leader WHERE party_id = in_party_id;
|
||||
PERFORM pg_notify('party_notify_channel', format('promote_party_leader#{"PartyId" : %s, "PlayerId" : %s}', in_party_id, out_new_leader));
|
||||
END IF;
|
||||
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,37 @@
|
||||
-- promote_party_leader_to(in_party_id bigint, in_player_id bigint) -> void
|
||||
-- oid: 58500 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.promote_party_leader_to(in_party_id bigint, in_player_id bigint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_current_leader BIGINT;
|
||||
out_new_leader BIGINT;
|
||||
BEGIN
|
||||
PERFORM parties_get_exclusive_operation_lock();
|
||||
|
||||
-- get current leader
|
||||
SELECT party_leader_id FROM parties where party_id = in_party_id into out_current_leader;
|
||||
IF out_current_leader IS NULL THEN
|
||||
RAISE EXCEPTION 'Promoting a player to a non existing party %.', in_party_id;
|
||||
END IF;
|
||||
|
||||
-- get new member if it is online
|
||||
SELECT party_members.player_id INTO out_new_leader FROM party_members
|
||||
JOIN player_state ON player_state.player_controller_id = party_members.player_id
|
||||
WHERE party_members.party_id = in_party_id
|
||||
AND party_members.player_id = in_player_id
|
||||
AND player_state.online_status = 'Online';
|
||||
|
||||
IF out_new_leader IS NOT NULL THEN
|
||||
-- promote
|
||||
UPDATE parties SET party_leader_id = out_new_leader WHERE party_id = in_party_id;
|
||||
PERFORM pg_notify('party_notify_channel', format('promote_party_leader#{"PartyId" : %s, "PlayerId" : %s}', in_party_id, out_new_leader));
|
||||
ELSE
|
||||
RAISE EXCEPTION 'Promopromoting player %, which is offline or does not belong to the party.', in_party_id;
|
||||
-- pg_notify for feedback?
|
||||
END IF;
|
||||
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,18 @@
|
||||
-- remove_party_invite(in_invite_id bigint, in_remove_reason smallint) -> void
|
||||
-- oid: 58523 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.remove_party_invite(in_invite_id bigint, in_remove_reason smallint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_sender_player_id BIGINT;
|
||||
out_player_id BIGINT;
|
||||
BEGIN
|
||||
-- delete invite
|
||||
IF in_invite_id IS NOT NULL THEN
|
||||
DELETE FROM party_invites WHERE invite_id = in_invite_id RETURNING player_id, sender_player_id INTO out_player_id, out_sender_player_id;
|
||||
PERFORM pg_notify('party_notify_channel', format('remove_invite#{"InviteId" : %s, "Reason" : %s, "SenderId" : %s, "PlayerId" : %s}', in_invite_id, in_remove_reason, out_sender_player_id, out_player_id));
|
||||
END IF;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,58 @@
|
||||
-- remove_party_member(in_player_id bigint, in_remove_reason smallint) -> void
|
||||
-- oid: 58524 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.remove_party_member(in_player_id bigint, in_remove_reason smallint)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
DECLARE
|
||||
out_party_id BIGINT;
|
||||
out_player_platform_name TEXT;
|
||||
member_count BIGINT;
|
||||
out_platform_members_count BIGINT;
|
||||
removed_player_id BIGINT;
|
||||
removed_is_leader BOOLEAN;
|
||||
BEGIN
|
||||
PERFORM parties_get_exclusive_operation_lock();
|
||||
|
||||
DELETE FROM party_members WHERE player_id = in_player_id RETURNING player_id, party_id INTO removed_player_id, out_party_id;
|
||||
|
||||
IF removed_player_id IS NOT NULL THEN
|
||||
-- check if there are more than 1 player in the party
|
||||
SELECT INTO member_count COUNT(*) FROM party_members WHERE party_id = out_party_id;
|
||||
IF member_count > 1 THEN
|
||||
-- check if removed player is leader
|
||||
SELECT INTO removed_is_leader EXISTS (SELECT 1 FROM parties WHERE party_leader_id = removed_player_id);
|
||||
IF removed_is_leader THEN
|
||||
-- TODO promote player other player
|
||||
PERFORM promote_new_party_leader(out_party_id);
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
SELECT accounts.platform_name INTO out_player_platform_name FROM accounts
|
||||
JOIN actors ON actors.id = in_player_id
|
||||
WHERE accounts.id = actors.owner_account_id;
|
||||
|
||||
SELECT num_of_players INTO out_platform_members_count FROM platform_parties_mapping WHERE platform_name = out_player_platform_name AND dune_party_id = out_party_id;
|
||||
IF out_platform_members_count IS NOT NULL THEN
|
||||
-- there was a platform session for the player's party
|
||||
IF out_platform_members_count <= 1 THEN
|
||||
-- if player leaving causes no players to be in that platform session anymore, remove entry
|
||||
DELETE FROM platform_parties_mapping WHERE platform_name = out_player_platform_name AND dune_party_id = out_party_id;
|
||||
ELSE
|
||||
-- still players, decrease platform player count
|
||||
UPDATE platform_parties_mapping SET num_of_players = out_platform_members_count-1 WHERE platform_name = out_player_platform_name AND dune_party_id = out_party_id;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
PERFORM pg_notify('party_notify_channel', format(
|
||||
'remove_party_member#{"PlayerId" : %s, "PartyId" : %s, "PlayerPlatformName" : "%s", "PartyRemoveReason" : %s}',
|
||||
removed_player_id, out_party_id, out_player_platform_name, in_remove_reason));
|
||||
|
||||
If member_count <= 1 THEN
|
||||
PERFORM disband_party(out_party_id);
|
||||
END IF;
|
||||
|
||||
END IF;
|
||||
END
|
||||
$function$
|
||||
@@ -0,0 +1,25 @@
|
||||
-- update_party_platform_session(in_party_id bigint, in_platform_session_id text, in_platform_name text) -> void
|
||||
-- oid: 58628 kind: FUNCTION category: party
|
||||
|
||||
CREATE OR REPLACE FUNCTION dune.update_party_platform_session(in_party_id bigint, in_platform_session_id text, in_platform_name text)
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS $function$
|
||||
BEGIN
|
||||
IF in_platform_session_id IS NULL OR length(in_platform_session_id) = 0 THEN
|
||||
RAISE EXCEPTION 'in_platform_session_id must not be empty';
|
||||
END IF;
|
||||
|
||||
IF in_platform_name IS NULL OR length(in_platform_name) = 0 THEN
|
||||
RAISE EXCEPTION 'platform_name must not be empty';
|
||||
END IF;
|
||||
|
||||
INSERT INTO platform_parties_mapping (platform_session_id, platform_name, dune_party_id)
|
||||
VALUES (in_platform_session_id, in_platform_name, in_party_id)
|
||||
ON CONFLICT (platform_name, dune_party_id)
|
||||
DO UPDATE SET platform_session_id = EXCLUDED.platform_session_id;
|
||||
|
||||
PERFORM pg_notify('party_notify_channel', format('update_party_platform_id#{"PartyId" : %s, "PlatformSessionId" : "%s", "PlatformName" : "%s"}',
|
||||
in_party_id, in_platform_session_id, in_platform_name));
|
||||
END
|
||||
$function$
|
||||
Reference in New Issue
Block a user