From 4299a2a517b3933adb9cb0b06c560f38aa67a79c Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sat, 14 Mar 2026 14:22:56 +0200 Subject: [PATCH] Move some setMetadata to actions --- .../loaders/q.match.$id.server.ts | 20 ++------------- .../sendouq/actions/q.looking.server.ts | 25 ++++++++++++++++++- app/features/sendouq/actions/q.server.ts | 17 +++++++++++++ .../sendouq/loaders/q.looking.server.ts | 15 ----------- app/features/sendouq/q-utils.server.ts | 15 +++++++++++ 5 files changed, 58 insertions(+), 34 deletions(-) diff --git a/app/features/sendouq-match/loaders/q.match.$id.server.ts b/app/features/sendouq-match/loaders/q.match.$id.server.ts index 52a94be46..79a474526 100644 --- a/app/features/sendouq-match/loaders/q.match.$id.server.ts +++ b/app/features/sendouq-match/loaders/q.match.$id.server.ts @@ -1,13 +1,11 @@ import type { LoaderFunctionArgs } from "react-router"; import { getUser } from "~/features/auth/core/user.server"; -import * as ChatSystemMessage from "~/features/chat/ChatSystemMessage.server"; import { SendouQ } from "~/features/sendouq/core/SendouQ.server"; import * as PrivateUserNoteRepository from "~/features/sendouq/PrivateUserNoteRepository.server"; import { reportedWeaponsToArrayOfArrays } from "~/features/sendouq-match/core/reported-weapons.server"; import * as ReportedWeaponRepository from "~/features/sendouq-match/ReportedWeaponRepository.server"; import * as SQMatchRepository from "~/features/sendouq-match/SQMatchRepository.server"; import { notFoundIfFalsy, parseParams } from "~/utils/remix.server"; -import { sendouQMatchPage } from "~/utils/urls"; import { qMatchPageParamsSchema } from "../q-match-schemas"; export const loader = async ({ params }: LoaderFunctionArgs) => { @@ -34,21 +32,6 @@ export const loader = async ({ params }: LoaderFunctionArgs) => { ? await ReportedWeaponRepository.findByMatchId(matchId) : null; - const participantIds = [ - ...matchUnmapped.groupAlpha.members, - ...matchUnmapped.groupBravo.members, - ].map((m) => m.id); - if (match.chatCode && !match.isLocked) { - ChatSystemMessage.setMetadata({ - chatCode: match.chatCode, - header: `Match #${matchId}`, - subtitle: "SendouQ", - url: sendouQMatchPage(matchId), - participantUserIds: participantIds, - expiresAfter: { hours: 2 }, - }); - } - return { match, reportedWeapons: match.reportedAt @@ -60,8 +43,9 @@ export const loader = async ({ params }: LoaderFunctionArgs) => { }) : null, rawReportedWeapons, + // xxx: as a safety measure, it'd be good to send chat code also when user is in the match chatCode: - user?.roles.includes("STAFF") && !participantIds.includes(user.id) + user?.roles.includes("STAFF") && !matchUsers.includes(user.id) ? match.chatCode : null, }; diff --git a/app/features/sendouq/actions/q.looking.server.ts b/app/features/sendouq/actions/q.looking.server.ts index 86f5046cd..60133cfcc 100644 --- a/app/features/sendouq/actions/q.looking.server.ts +++ b/app/features/sendouq/actions/q.looking.server.ts @@ -17,7 +17,7 @@ import { refreshSendouQInstance, SendouQ } from "../core/SendouQ.server"; import * as PrivateUserNoteRepository from "../PrivateUserNoteRepository.server"; import { lookingSchema } from "../q-schemas.server"; import { resolveFutureMatchModes } from "../q-utils"; -import { SendouQError } from "../q-utils.server"; +import { SendouQError, setGroupChatMetadata } from "../q-utils.server"; // this function doesn't throw normally because we are assuming // if there is a validation error the user saw stale data @@ -128,6 +128,15 @@ export const action: ActionFunction = async ({ request }) => { ChatSystemMessage.removeRoom(theirGroup.chatCode); } + const survivingGroup = + SendouQ.findUncensoredGroupById(survivingGroupId); + if (survivingGroup?.chatCode) { + setGroupChatMetadata({ + chatCode: survivingGroup.chatCode, + members: survivingGroup.members, + }); + } + break; } case "MATCH_UP": { @@ -169,6 +178,20 @@ export const action: ActionFunction = async ({ request }) => { await refreshSendouQInstance(); + if (createdMatch.chatCode) { + ChatSystemMessage.setMetadata({ + chatCode: createdMatch.chatCode, + header: `Match #${createdMatch.id}`, + subtitle: "SendouQ", + url: sendouQMatchPage(createdMatch.id), + participantUserIds: [ + ...ownGroup.members.map((m) => m.id), + ...theirGroup.members.map((m) => m.id), + ], + expiresAfter: { hours: 2 }, + }); + } + if (ownGroup.chatCode && theirGroup.chatCode) { ChatSystemMessage.send([ { diff --git a/app/features/sendouq/actions/q.server.ts b/app/features/sendouq/actions/q.server.ts index 90891ea88..c8932255a 100644 --- a/app/features/sendouq/actions/q.server.ts +++ b/app/features/sendouq/actions/q.server.ts @@ -17,6 +17,7 @@ import { refreshSendouQInstance, SendouQ } from "../core/SendouQ.server"; import { JOIN_CODE_SEARCH_PARAM_KEY } from "../q-constants"; import { frontPageSchema } from "../q-schemas.server"; import { userCanJoinQueueAt } from "../q-utils"; +import { setGroupChatMetadata } from "../q-utils.server"; export const action: ActionFunction = async ({ request }) => { const user = requireUser(); @@ -36,6 +37,14 @@ export const action: ActionFunction = async ({ request }) => { await refreshSendouQInstance(); + const createdGroup = SendouQ.findOwnGroup(user.id); + if (createdGroup?.chatCode) { + setGroupChatMetadata({ + chatCode: createdGroup.chatCode, + members: createdGroup.members, + }); + } + return redirect( data.direct === "true" ? SENDOUQ_LOOKING_PAGE : SENDOUQ_PREPARING_PAGE, ); @@ -61,6 +70,14 @@ export const action: ActionFunction = async ({ request }) => { await refreshSendouQInstance(); + const joinedGroup = SendouQ.findOwnGroup(user.id); + if (joinedGroup?.chatCode) { + setGroupChatMetadata({ + chatCode: joinedGroup.chatCode, + members: joinedGroup.members, + }); + } + return redirect( groupInvitedTo.status === "PREPARING" ? SENDOUQ_PREPARING_PAGE diff --git a/app/features/sendouq/loaders/q.looking.server.ts b/app/features/sendouq/loaders/q.looking.server.ts index a22a69cc1..dbdbb2780 100644 --- a/app/features/sendouq/loaders/q.looking.server.ts +++ b/app/features/sendouq/loaders/q.looking.server.ts @@ -1,9 +1,7 @@ import type { LoaderFunctionArgs } from "react-router"; import { requireUser } from "~/features/auth/core/user.server"; -import * as ChatSystemMessage from "~/features/chat/ChatSystemMessage.server"; import * as SQGroupRepository from "~/features/sendouq/SQGroupRepository.server"; import { cachedStreams } from "~/features/sendouq-streams/core/streams.server"; -import { SENDOUQ_LOOKING_PAGE } from "~/utils/urls"; import { groupExpiryStatus } from "../core/groups"; import { SendouQ } from "../core/SendouQ.server"; import * as PrivateUserNoteRepository from "../PrivateUserNoteRepository.server"; @@ -34,19 +32,6 @@ export const loader = async ({ request }: LoaderFunctionArgs) => { }); } - if (ownGroup?.chatCode) { - const memberIds = ownGroup.members.map((m: { id: number }) => m.id); - - ChatSystemMessage.setMetadata({ - chatCode: ownGroup.chatCode, - header: `Group (${memberIds.length}/4)`, - subtitle: "SendouQ", - url: SENDOUQ_LOOKING_PAGE, - participantUserIds: memberIds, - expiresAfter: { hours: 2 }, - }); - } - return { groups: ownGroup && groupExpiryStatus(ownGroup.latestActionAt) === "EXPIRED" diff --git a/app/features/sendouq/q-utils.server.ts b/app/features/sendouq/q-utils.server.ts index c13c5782b..ede2492b2 100644 --- a/app/features/sendouq/q-utils.server.ts +++ b/app/features/sendouq/q-utils.server.ts @@ -1,4 +1,5 @@ import { redirect } from "react-router"; +import * as ChatSystemMessage from "~/features/chat/ChatSystemMessage.server"; import { TIERS } from "~/features/mmr/mmr-constants"; import type { TieredSkill } from "~/features/mmr/tiered.server"; import { @@ -46,6 +47,20 @@ export function sqRedirectIfNeeded({ throw redirect(newLocation); } +export function setGroupChatMetadata(group: { + chatCode: string; + members: { id: number }[]; +}) { + ChatSystemMessage.setMetadata({ + chatCode: group.chatCode, + header: `Group (${group.members.length}/4)`, + subtitle: "SendouQ", + url: SENDOUQ_LOOKING_PAGE, + participantUserIds: group.members.map((m) => m.id), + expiresAfter: { hours: 2 }, + }); +} + const allTiersOrdered = TIERS.flatMap((t) => [ { name: t.name, isPlus: true }, { name: t.name, isPlus: false },