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,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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$

View File

@@ -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$