From d2bcf160b6a6ca82efe2031573601d2e549772a0 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Mon, 16 Mar 2026 19:53:54 +0200 Subject: [PATCH] Progress --- .../tournament-bracket/core/tests/mocks-li.ts | 17 ------ .../core/tests/mocks-sos.ts | 27 --------- .../core/tests/mocks-zones-weekly.ts | 10 ---- .../tournament-bracket/core/tests/mocks.ts | 13 ----- .../core/tests/test-utils.ts | 1 - .../TournamentLFGRepository.server.ts | 39 +------------ .../actions/to.$id.looking.server.ts | 14 ++++- .../components/LFGGroupCard.module.css | 38 ++++++------- .../routes/to.$id.looking.module.css | 55 ++++++------------ .../tournament-lfg/routes/to.$id.looking.tsx | 57 ++++++++++--------- .../tournament/TournamentRepository.server.ts | 25 -------- .../tournament/routes/to.$id.register.tsx | 1 - app/features/tournament/routes/to.$id.tsx | 26 +-------- locales/da/tournament.json | 5 +- locales/de/tournament.json | 5 +- locales/en/tournament.json | 5 +- locales/es-ES/tournament.json | 5 +- locales/es-US/tournament.json | 5 +- locales/fr-CA/tournament.json | 5 +- locales/fr-EU/tournament.json | 5 +- locales/he/tournament.json | 5 +- locales/it/tournament.json | 5 +- locales/ja/tournament.json | 5 +- locales/ko/tournament.json | 3 +- locales/nl/tournament.json | 3 +- locales/pl/tournament.json | 3 +- locales/pt-BR/tournament.json | 5 +- locales/ru/tournament.json | 5 +- locales/zh/tournament.json | 5 +- 29 files changed, 128 insertions(+), 269 deletions(-) diff --git a/app/features/tournament-bracket/core/tests/mocks-li.ts b/app/features/tournament-bracket/core/tests/mocks-li.ts index de7379f4e..9a2aeca9c 100644 --- a/app/features/tournament-bracket/core/tests/mocks-li.ts +++ b/app/features/tournament-bracket/core/tests/mocks-li.ts @@ -7106,7 +7106,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "260999523806085120", discordAvatar: "4f15f20946fbd992ee9d694a539e6317", customUrl: "elemental", - role: "ORGANIZER", }, { @@ -7116,7 +7115,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "176095582534762496", discordAvatar: "89e15b6e74f5abdef1183c9416434dde", customUrl: "pock", - role: "ORGANIZER", }, { @@ -7126,7 +7124,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "87494390724964352", discordAvatar: "3b82ee3101ba39120b6a65c042a04a37", customUrl: "inkfarer", - role: "STREAMER", }, { @@ -7136,7 +7133,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "334504066405367808", discordAvatar: "0d31f0d52ebfeaa0216fcacb86eb140a", customUrl: "shads", - role: "ORGANIZER", }, { @@ -7146,7 +7142,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "112254088992792576", discordAvatar: "711e8d48f316687faa4fdb41ab9298f0", customUrl: "kitsunekeira", - role: "ORGANIZER", }, { @@ -7156,7 +7151,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "412316772637736981", discordAvatar: "1408d204fa8a128efd2d2625476468c2", customUrl: null, - role: "ORGANIZER", }, { @@ -7166,7 +7160,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "578038263433134080", discordAvatar: "f552df977e0165e7fb93d1ce2a7512d4", customUrl: "bars", - role: "ORGANIZER", }, { @@ -7176,7 +7169,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "230161540299489280", discordAvatar: "a_3ca2a0737b2c1e2b5e82ddc98fe79c8b", customUrl: "bowen", - role: "ORGANIZER", }, { @@ -7186,7 +7178,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "678892046534311936", discordAvatar: "11490e6c0ace327ebc32a117b9e0510c", customUrl: "toes", - role: "ORGANIZER", }, { @@ -7196,7 +7187,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "512418782933811221", discordAvatar: "c3afd465b53dedbb97fb9dd504d01305", customUrl: "neato", - role: "ORGANIZER", }, { @@ -7206,7 +7196,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "182994907907096585", discordAvatar: "31da63dcb6dd1dbe4c3f135c105f07e7", customUrl: "strings", - role: "ORGANIZER", }, { @@ -7216,7 +7205,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "725416982681223259", discordAvatar: "cb9bf51b05f22c763a2b4812bdd574cc", customUrl: "michi", - role: "ORGANIZER", }, { @@ -7226,7 +7214,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "367803257717784599", discordAvatar: "b8ad30de9487a9699093b728098e01d0", customUrl: "glumbaron", - role: "ORGANIZER", }, { @@ -7236,7 +7223,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "1058063829973618698", discordAvatar: "dc110c2d77ea84e470c87a18ac0b7e5d", customUrl: "lemon7890", - role: "ORGANIZER", }, { @@ -7246,7 +7232,6 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "1132918323697418310", discordAvatar: "48089383c5d666ae7ef8417d205bfa1f", customUrl: "eemeee", - role: "ORGANIZER", }, { @@ -7256,11 +7241,9 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "689577992430944281", discordAvatar: "911c0ac66f9489406ea4ae970e7ed5b0", customUrl: "pin-eye", - role: "ORGANIZER", }, ], - subCounts: [], bracketProgressionOverrides: [], isFinalized: 0, teams: [ diff --git a/app/features/tournament-bracket/core/tests/mocks-sos.ts b/app/features/tournament-bracket/core/tests/mocks-sos.ts index fd50c25b9..85e53c169 100644 --- a/app/features/tournament-bracket/core/tests/mocks-sos.ts +++ b/app/features/tournament-bracket/core/tests/mocks-sos.ts @@ -2209,7 +2209,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "333766288969302018", discordAvatar: "42d40d5ae6ff7081ae57bc02b6e2f717", customUrl: null, - role: "ORGANIZER", }, { @@ -2219,7 +2218,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "260999523806085120", discordAvatar: "a_71a6a4b4f76bd79bc9d7743e322a879d", customUrl: "elemental", - role: "ORGANIZER", }, { @@ -2229,7 +2227,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "468596581357060097", discordAvatar: "940589e5c6793a5cbbab2adebd84fe0b", customUrl: null, - role: "ORGANIZER", }, { @@ -2239,7 +2236,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "418176537561661441", discordAvatar: "bab3e7a9cdb2071de7f2ae29256fc83b", customUrl: null, - role: "ORGANIZER", }, { @@ -2249,7 +2245,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "302160815132246016", discordAvatar: "da7cfcd1a5b8bee37cfa5d308b0898eb", customUrl: "mashimashi", - role: "ORGANIZER", }, { @@ -2259,7 +2254,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "183025242266927104", discordAvatar: "a9475b488962953152c60f4f138b1618", customUrl: "tux", - role: "ORGANIZER", }, { @@ -2269,7 +2263,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "343219263655510021", discordAvatar: "f30c675fc07203ca112d93fd03b5cc96", customUrl: "tbob408", - role: "ORGANIZER", }, { @@ -2279,7 +2272,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "390444783425945602", discordAvatar: "e821ac7a457033d6c990bcaf518287e5", customUrl: null, - role: "STREAMER", }, { @@ -2289,7 +2281,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "422790410566500352", discordAvatar: "77b479e49ec0d09edb8f9b975bff04ce", customUrl: "reefsixes", - role: "ORGANIZER", }, { @@ -2299,7 +2290,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "360259023389327361", discordAvatar: "c5a2506e46e135b2568ef48242f669e8", customUrl: "kloud", - role: "ORGANIZER", }, { @@ -2309,7 +2299,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "247504664378081280", discordAvatar: "a_a60bcc9c76d4baa9814287fdc5c28fe9", customUrl: "pipedreamdx", - role: "STREAMER", }, { @@ -2319,7 +2308,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "184478601171828737", discordAvatar: "75dedb3527b73d9571151f0a00d1c365", customUrl: "scepidilionz", - role: "ORGANIZER", }, { @@ -2329,7 +2317,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "565712290020589569", discordAvatar: "498b21d6f64dcd56d06e61c2ec39e571", customUrl: "rooster", - role: "ORGANIZER", }, { @@ -2339,7 +2326,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "103988435785650176", discordAvatar: "5fef4bf0c1b8a6a76fe2f43b956bfc3d", customUrl: "tulip", - role: "ORGANIZER", }, { @@ -2349,7 +2335,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "221418644297482250", discordAvatar: "6b7156dcd0582ee160564bfa0c5cdc0e", customUrl: "fusionboltzgx", - role: "ORGANIZER", }, { @@ -2359,7 +2344,6 @@ export const SWIM_OR_SINK_167 = ( discordId: "458714559855722497", discordAvatar: "b815bb6090c2b32fec23f1336fae5663", customUrl: null, - role: "ORGANIZER", }, { @@ -2369,20 +2353,9 @@ export const SWIM_OR_SINK_167 = ( discordId: "599633578648928307", discordAvatar: "f5139304fb364bca35634a8e5cd11c0f", customUrl: "phantom_spl", - role: "ORGANIZER", }, ], - subCounts: [ - { - visibility: "+3", - count: 1, - }, - { - visibility: "ALL", - count: 17, - }, - ], bracketProgressionOverrides: overrides ?? [], isFinalized: 0, teams: [ diff --git a/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts b/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts index 2af5b11cc..09f62cb7c 100644 --- a/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts +++ b/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts @@ -347,7 +347,6 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "395757059922198548", discordAvatar: "2a569302e9545c6a07f8f8aa337d139d", customUrl: "penis", - role: "ORGANIZER", }, { @@ -357,7 +356,6 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "267963609924108288", discordAvatar: "85090cfe2e0da693355bcec9740c1eaa", customUrl: "cookie", - role: "ORGANIZER", }, { @@ -367,7 +365,6 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "507102073427460098", discordAvatar: "bd634c91f7d0475f3671956fa9a2110a", customUrl: null, - role: "ORGANIZER", }, { @@ -377,16 +374,9 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "111682034056835072", discordAvatar: "f1191c94b1da5396a06b620408017c1f", customUrl: "weizihao", - role: "ORGANIZER", }, ], - subCounts: [ - { - visibility: "ALL", - count: 4, - }, - ], bracketProgressionOverrides: [], teams: [ { diff --git a/app/features/tournament-bracket/core/tests/mocks.ts b/app/features/tournament-bracket/core/tests/mocks.ts index 5b03407ba..6fe741749 100644 --- a/app/features/tournament-bracket/core/tests/mocks.ts +++ b/app/features/tournament-bracket/core/tests/mocks.ts @@ -1460,7 +1460,6 @@ export const PADDLING_POOL_257 = () => "Hosted by Dapple Productions.\n\nThe longest tournament series in Splatoon!\nEvery week a tournament!\n\n✓ DE or Groups into SE\n✓ All Modes (Picnic system)\n✓ Badge prize\n✓ A well-ran tournament experience\n\nCome join!", rules: null, logoUrl: "/test.png", - subCounts: [], startTime: 1709748000, author: { id: 860, @@ -1478,7 +1477,6 @@ export const PADDLING_POOL_257 = () => discordId: "178489224192851969", discordAvatar: "8b8c1d85cc525ea366f3ce2a6a594c05", customUrl: "pinky", - role: "ORGANIZER", }, { @@ -1488,7 +1486,6 @@ export const PADDLING_POOL_257 = () => discordId: "275213752025088000", discordAvatar: "25bf68c5aa4e622ceb5a241c34841c6d", customUrl: null, - role: "ORGANIZER", }, { @@ -1498,7 +1495,6 @@ export const PADDLING_POOL_257 = () => discordId: "195618756800675841", discordAvatar: "a_03ec4bbcb2a4ab000237c9f3e9e71508", customUrl: "sdomi19", - role: "ORGANIZER", }, { @@ -1508,7 +1504,6 @@ export const PADDLING_POOL_257 = () => discordId: "413759870333091884", discordAvatar: "a_b55f70ada809a600e73c5088b910e659", customUrl: "brufnie", - role: "STREAMER", }, ], @@ -8058,7 +8053,6 @@ export const PADDLING_POOL_255 = () => description: null, rules: null, logoUrl: "/test.png", - subCounts: [], startTime: 1708538400, author: { id: 860, @@ -8076,7 +8070,6 @@ export const PADDLING_POOL_255 = () => discordId: "178489224192851969", discordAvatar: "8b8c1d85cc525ea366f3ce2a6a594c05", customUrl: "pinky", - role: "ORGANIZER", }, { @@ -8086,7 +8079,6 @@ export const PADDLING_POOL_255 = () => discordId: "275213752025088000", discordAvatar: "25bf68c5aa4e622ceb5a241c34841c6d", customUrl: null, - role: "ORGANIZER", }, { @@ -8096,7 +8088,6 @@ export const PADDLING_POOL_255 = () => discordId: "195618756800675841", discordAvatar: "a_03ec4bbcb2a4ab000237c9f3e9e71508", customUrl: "sdomi19", - role: "ORGANIZER", }, { @@ -8106,7 +8097,6 @@ export const PADDLING_POOL_255 = () => discordId: "413759870333091884", discordAvatar: "a_b55f70ada809a600e73c5088b910e659", customUrl: "brufnie", - role: "STREAMER", }, ], @@ -14982,7 +14972,6 @@ export const IN_THE_ZONE_32 = ({ description: "Part of sendou.ink ranked season 2", rules: null, logoUrl: "/test.png", - subCounts: [], startTime: 1707588000, author: { id: 274, @@ -15000,7 +14989,6 @@ export const IN_THE_ZONE_32 = ({ discordId: "163771047068303360", discordAvatar: "b33d8f230218d6a92705a63fdf803851", customUrl: "alicetheto", - role: "STREAMER", }, { @@ -15010,7 +14998,6 @@ export const IN_THE_ZONE_32 = ({ discordId: "413759870333091884", discordAvatar: "a_b55f70ada809a600e73c5088b910e659", customUrl: "brufnie", - role: "STREAMER", }, ], diff --git a/app/features/tournament-bracket/core/tests/test-utils.ts b/app/features/tournament-bracket/core/tests/test-utils.ts index ed1426958..7373144e8 100644 --- a/app/features/tournament-bracket/core/tests/test-utils.ts +++ b/app/features/tournament-bracket/core/tests/test-utils.ts @@ -74,7 +74,6 @@ export const testTournament = ({ name: "test", castTwitchAccounts: [], bracketProgressionOverrides: [], - subCounts: [], staff: [], tieBreakerMapPool: [], toSetMapPool: [], diff --git a/app/features/tournament-lfg/TournamentLFGRepository.server.ts b/app/features/tournament-lfg/TournamentLFGRepository.server.ts index 0e678031d..748dc3353 100644 --- a/app/features/tournament-lfg/TournamentLFGRepository.server.ts +++ b/app/features/tournament-lfg/TournamentLFGRepository.server.ts @@ -63,7 +63,6 @@ type TournamentLFGMemberObject = { languages: Tables["User"]["languages"]; vc: Tables["User"]["vc"]; pronouns: Tables["User"]["pronouns"]; - country: Tables["User"]["country"]; role: Tables["TournamentTeamMember"]["role"]; isStayAsSub: Tables["TournamentTeamMember"]["isStayAsSub"]; weapons: Tables["User"]["qWeaponPool"]; @@ -105,8 +104,6 @@ export async function findLookingTeamsByTournamentId(tournamentId: number) { languages: eb.ref("User.languages"), vc: eb.ref("User.vc"), pronouns: eb.ref("User.pronouns"), - // xxx: is it better to show country rather than languages? - country: eb.ref("User.country"), role: eb.ref("TournamentTeamMember.role"), isStayAsSub: eb.ref("TournamentTeamMember.isStayAsSub"), weapons: eb.ref("User.qWeaponPool"), @@ -146,7 +143,6 @@ export async function findSubGroups(tournamentId: number) { languages: eb.ref("User.languages"), vc: eb.ref("User.vc"), pronouns: eb.ref("User.pronouns"), - country: eb.ref("User.country"), role: eb.ref("TournamentTeamMember.role"), isStayAsSub: eb.ref("TournamentTeamMember.isStayAsSub"), weapons: eb.ref("User.qWeaponPool"), @@ -349,7 +345,6 @@ export function leaveLfg({ ) .select([ "TournamentTeamMember.tournamentTeamId", - "TournamentTeamMember.role", "TournamentTeam.isPlaceholder", ]) .where("TournamentTeamMember.userId", "=", userId) @@ -373,40 +368,10 @@ export function leaveLfg({ return; } - // xxx: or just call TournamentTeam.unregister? - // xxx: also leaving team should not be possible via this so remove that code await trx - .deleteFrom("TournamentTeamMember") - .where("userId", "=", userId) - .where("tournamentTeamId", "=", userTeam.tournamentTeamId) + .deleteFrom("TournamentTeam") + .where("id", "=", userTeam.tournamentTeamId) .execute(); - - const remainingMembers = await trx - .selectFrom("TournamentTeamMember") - .select(["userId", "role"]) - .where("tournamentTeamId", "=", userTeam.tournamentTeamId) - .execute(); - - if (remainingMembers.length === 0) { - await trx - .deleteFrom("TournamentTeam") - .where("id", "=", userTeam.tournamentTeamId) - .execute(); - return; - } - - if (userTeam.role === "OWNER") { - const newOwner = - remainingMembers.find((m) => m.role === "MANAGER") ?? - remainingMembers[0]; - - await trx - .updateTable("TournamentTeamMember") - .set({ role: "OWNER" }) - .where("userId", "=", newOwner.userId) - .where("tournamentTeamId", "=", userTeam.tournamentTeamId) - .execute(); - } }); } diff --git a/app/features/tournament-lfg/actions/to.$id.looking.server.ts b/app/features/tournament-lfg/actions/to.$id.looking.server.ts index aa4c8984b..d810ef26f 100644 --- a/app/features/tournament-lfg/actions/to.$id.looking.server.ts +++ b/app/features/tournament-lfg/actions/to.$id.looking.server.ts @@ -1,6 +1,9 @@ import type { ActionFunctionArgs } from "react-router"; import { requireUser } from "~/features/auth/core/user.server"; -import { tournamentFromDBCached } from "~/features/tournament-bracket/core/Tournament.server"; +import { + clearTournamentDataCache, + tournamentFromDBCached, +} from "~/features/tournament-bracket/core/Tournament.server"; import { errorToastIfFalsy, parseParams, @@ -14,7 +17,6 @@ import { survivingTeamId } from "../tournament-lfg-utils"; // xxx: prevent actions in certain cases? like when tournament has started // xxx: add `requireNotBannedByOrganization` & other checks from deleted to.$id.subs.new.tsx route -// xxx: add `clearTournamentDataCache` export const action = async ({ request, params }: ActionFunctionArgs) => { const user = requireUser(); @@ -54,6 +56,12 @@ export const action = async ({ request, params }: ActionFunctionArgs) => { const team = tournament.teamMemberOfByUser(user); if (team) { + // xxx: or isManager, also just show errorToast no return null + const isTeamOwner = team.members.some( + (m) => m.userId === user.id && m.isOwner, + ); + if (!isTeamOwner) return null; + errorToastIfFalsy( team.members.length < tournament.maxMembersPerTeam, "Team is already at max capacity", @@ -248,5 +256,7 @@ export const action = async ({ request, params }: ActionFunctionArgs) => { } } + clearTournamentDataCache(tournamentId); + return null; }; diff --git a/app/features/tournament-lfg/components/LFGGroupCard.module.css b/app/features/tournament-lfg/components/LFGGroupCard.module.css index 4cb0fc638..36df807e3 100644 --- a/app/features/tournament-lfg/components/LFGGroupCard.module.css +++ b/app/features/tournament-lfg/components/LFGGroupCard.module.css @@ -1,24 +1,24 @@ .group { - background-color: var(--bg-lighter-solid); + background-color: var(--color-bg-high); width: 100%; - border-radius: var(--rounded); - padding: var(--s-2-5); + border-radius: var(--radius-box); + padding: var(--s-3); display: flex; flex-direction: column; gap: var(--s-4); position: relative; - color: var(--text); + color: var(--color-text); } .member { display: flex; gap: var(--s-2); align-items: center; - background-color: var(--bg-darker); - border-radius: var(--rounded); - font-size: var(--fonts-xsm); - font-weight: var(--semi-bold); - padding-inline-end: var(--s-2-5); + background-color: var(--color-bg); + border-radius: var(--radius-box); + font-size: var(--font-sm); + font-weight: var(--weight-semi); + padding-inline-end: var(--s-3); } .name { @@ -26,20 +26,20 @@ text-overflow: ellipsis; overflow: hidden; max-width: 7.5rem; - font-size: var(--fonts-xs); - color: var(--text); + font-size: var(--font-xs); + color: var(--color-text); } .extraInfo { - font-size: var(--fonts-xs); - background-color: var(--bg-darker); - border-radius: var(--rounded); + font-size: var(--font-xs); + background-color: var(--color-bg); + border-radius: var(--radius-box); padding: var(--s-0-5) var(--s-1-5); width: max-content; display: flex; align-items: center; gap: var(--s-1); - font-weight: var(--semi-bold); + font-weight: var(--weight-semi); min-height: 24px; } @@ -51,12 +51,12 @@ .star { min-width: 18px; max-width: 18px; - color: var(--theme-secondary); + color: var(--color-text-second); stroke-width: 2; } .starInactive { - color: var(--text-lighter); + color: var(--color-text-high); } .teamHeader { @@ -66,6 +66,6 @@ } .teamName { - font-size: var(--fonts-xxs); - font-weight: var(--semi-bold); + font-size: var(--font-2xs); + font-weight: var(--weight-semi); } diff --git a/app/features/tournament-lfg/routes/to.$id.looking.module.css b/app/features/tournament-lfg/routes/to.$id.looking.module.css index 054c275fb..31b5e77e4 100644 --- a/app/features/tournament-lfg/routes/to.$id.looking.module.css +++ b/app/features/tournament-lfg/routes/to.$id.looking.module.css @@ -2,7 +2,7 @@ display: grid; justify-content: center; grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: var(--s-7); + gap: var(--s-6); } .containerMobile { @@ -17,10 +17,10 @@ .header { text-align: center; - font-size: var(--fonts-xxs); - font-weight: var(--semi-bold); + font-size: var(--font-2xs); + font-weight: var(--weight-semi); text-transform: uppercase; - color: var(--theme); + color: var(--color-text-accent); display: flex; align-items: center; } @@ -30,9 +30,9 @@ flex: 1; content: ""; padding: 2px; - background-color: var(--theme-transparent); + background-color: var(--color-bg-high); margin: 5px; - border-radius: var(--rounded); + border-radius: var(--radius-box); } .subsContainer { @@ -49,13 +49,12 @@ grid-template-areas: "avatar name" "avatar info" - "spacer spacer" - "weapon-top-text weapon-top-images" + "weapons weapons" "message message"; border-radius: var(--radius-box); background-color: var(--color-bg-high); padding: var(--s-4); - column-gap: var(--s-2-5); + column-gap: var(--s-3); border: var(--border-style); } @@ -67,6 +66,7 @@ .subsSectionName { grid-area: name; align-self: flex-end; + font-weight: var(--weight-semi); } .subsSectionInfo { @@ -98,41 +98,22 @@ } .subsSectionWeaponText { - font-weight: var(--semi-bold); - font-size: var(--fonts-xs); + font-weight: var(--weight-semi); + font-size: var(--font-xs); + color: var(--color-text-high); align-self: center; } -.subsSectionWeaponTopText { - grid-area: weapon-top-text; +.subsSectionWeapons { + grid-area: weapons; + display: flex; + align-items: center; + gap: var(--s-2); + padding-block-start: var(--s-2); } .subsSectionWeaponImages { display: flex; gap: var(--s-1); - width: 11rem; align-items: center; } - -.subsSectionWeaponTopImages { - grid-area: weapon-top-images; -} - -.subsSectionSpacer { - grid-area: spacer; - height: 18px; -} - -@container (width >= 640px) { - .section { - grid-template-columns: max-content 1fr max-content max-content; - grid-template-areas: - "avatar name weapon-top-text weapon-top-images" - "avatar info . ." - "message message message message"; - } - - .subsSectionSpacer { - display: none; - } -} diff --git a/app/features/tournament-lfg/routes/to.$id.looking.tsx b/app/features/tournament-lfg/routes/to.$id.looking.tsx index e4153549b..2317244a8 100644 --- a/app/features/tournament-lfg/routes/to.$id.looking.tsx +++ b/app/features/tournament-lfg/routes/to.$id.looking.tsx @@ -7,6 +7,7 @@ import { Link, useFetcher, useLoaderData } from "react-router"; import { Avatar } from "~/components/Avatar"; import { SendouButton } from "~/components/elements/Button"; import { SendouDialog } from "~/components/elements/Dialog"; +import { SendouPopover } from "~/components/elements/Popover"; import { SendouTab, SendouTabList, @@ -52,7 +53,6 @@ export default function TournamentLFGShell() { return ; } -// xxx: show one button to join at the top with dialog opening? instead of two inline // xxx: no button if already in the tournament // xxx: can we reuse the column layout with sendouq? function TournamentLFGPage() { @@ -324,24 +324,13 @@ function SubCard({ sub }: { sub: SubEntry }) { {sub.username} -
{infos}
{sub.weapons ? ( - <> -
+
+
{t("tournament:subs.prefersToPlay")}
-
+
{sub.weapons.map((wpn) => ( ))}
- +
) : null} {sub.message ? (
{sub.message}
@@ -414,7 +403,7 @@ function JoinQueueForm() { } function TeamQueueSection() { - const { t } = useTranslation(["q"]); + const { t } = useTranslation(["q", "tournament"]); const data = useLoaderData() as Extract< LookingLoaderData, { mode: "looking" } @@ -426,20 +415,36 @@ function TeamQueueSection() { const isAtMaxMembers = data.ownTeam.members.length >= tournament.maxMembersPerTeam; + const canJoinQueue = + data.ownTeam.usersRole === "OWNER" || data.ownTeam.usersRole === "MANAGER"; return (
{!isAtMaxMembers ? ( - - - {t("q:looking.joinQPromptMembers")} - - + canJoinQueue ? ( + + + {t("q:looking.joinQPromptMembers")} + + + ) : ( +
+ + {t("q:looking.joinQPromptMembers")} + + } + > + {t("tournament:lfg.askCaptainToJoinQueue")} + +
+ ) ) : null}
); diff --git a/app/features/tournament/TournamentRepository.server.ts b/app/features/tournament/TournamentRepository.server.ts index 17144c941..58d50a4df 100644 --- a/app/features/tournament/TournamentRepository.server.ts +++ b/app/features/tournament/TournamentRepository.server.ts @@ -8,7 +8,6 @@ import type { PreparedMaps, Tables, TournamentSettings, - TournamentSub, } from "~/db/tables"; import * as Progression from "~/features/tournament-bracket/core/Progression"; import { Status } from "~/modules/brackets-model"; @@ -85,7 +84,6 @@ export async function findById(id: number) { "TournamentOrganizationMember.userId", "TournamentOrganizationMember.role", ...COMMON_USER_FIELDS, - "User.pronouns", ]) .whereRef( @@ -114,29 +112,11 @@ export async function findById(id: number) { .innerJoin("User", "TournamentStaff.userId", "User.id") .select([ ...COMMON_USER_FIELDS, - "User.pronouns", "TournamentStaff.role", ]) .where("TournamentStaff.tournamentId", "=", id), ).as("staff"), - jsonArrayFrom( - eb - .selectFrom("TournamentTeamMember") - .innerJoin( - "TournamentTeam", - "TournamentTeam.id", - "TournamentTeamMember.tournamentTeamId", - ) - .select(({ fn }) => [ - sql`'ALL'`.as("visibility"), - fn.countAll().as("count"), - ]) - .where("TournamentTeam.tournamentId", "=", id) - // xxx: this is not correct - .where("TournamentTeam.isPlaceholder", "=", 1) - .where("TournamentTeamMember.isStayAsSub", "=", 1), - ).as("subCounts"), jsonArrayFrom( eb .selectFrom("TournamentBracketProgressionOverride") @@ -322,11 +302,6 @@ export async function findById(id: number) { return { ...result, - // TODO: types broke with dependency update somehow - subCounts: result.subCounts as Array<{ - visibility: TournamentSub["visibility"]; - count: number; - }>, teams: result.teams.map((team) => ({ ...team, members: team.members.map(({ ordinal, ...member }) => member), diff --git a/app/features/tournament/routes/to.$id.register.tsx b/app/features/tournament/routes/to.$id.register.tsx index 6d193faa3..449c712ad 100644 --- a/app/features/tournament/routes/to.$id.register.tsx +++ b/app/features/tournament/routes/to.$id.register.tsx @@ -74,7 +74,6 @@ import { import { useTournament } from "./to.$id"; export { loader, action }; -// xxx: handle placeholder team made // xxx: allow promoting members to managers export default function TournamentRegisterPage() { const isMounted = useIsMounted(); diff --git a/app/features/tournament/routes/to.$id.tsx b/app/features/tournament/routes/to.$id.tsx index 2eb1868dc..4a9d1d516 100644 --- a/app/features/tournament/routes/to.$id.tsx +++ b/app/features/tournament/routes/to.$id.tsx @@ -16,7 +16,6 @@ import { Tournament } from "~/features/tournament-bracket/core/Tournament"; import { useIsMounted } from "~/hooks/useIsMounted"; import type { SendouRouteHandle } from "~/utils/remix.server"; import { removeMarkdown } from "~/utils/strings"; -import { assertUnreachable } from "~/utils/types"; import { tournamentDivisionsPage, tournamentPage, @@ -116,29 +115,6 @@ export function TournamentLayout() { window.tourney = tournament; }, [tournament]); } - const subsCount = () => - // biome-ignore lint/suspicious/useIterableCallbackReturn: Biome 2.3.1 upgrade - tournament.ctx.subCounts.reduce((acc, cur) => { - if (cur.visibility === "ALL") return acc + cur.count; - - const userPlusTier = user?.plusTier ?? 4; - - switch (cur.visibility) { - case "+1": { - return userPlusTier === 1 ? acc + cur.count : acc; - } - case "+2": { - return userPlusTier <= 2 ? acc + cur.count : acc; - } - case "+3": { - return userPlusTier <= 3 ? acc + cur.count : acc; - } - default: { - assertUnreachable(cur.visibility); - } - } - }, 0); - return (
@@ -185,7 +161,7 @@ export function TournamentLayout() { {tournament.registrationOpen ? t("tournament:tabs.looking") - : t("tournament:tabs.subs", { count: subsCount() })} + : t("tournament:tabs.subs")} ) : null} {tournament.hasStarted && !tournament.everyBracketOver ? ( diff --git a/locales/da/tournament.json b/locales/da/tournament.json index 614ac15e7..b9368a8d0 100644 --- a/locales/da/tournament.json +++ b/locales/da/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Seedninger", "tabs.results": "", "tabs.streams": "Streams ({{count}})", - "tabs.subs": "Suppleanter ({{count}})", + "tabs.subs": "Suppleanter", "tabs.looking": "", "pre.steps.header": "Fuldfør disse trin for at spille", "pre.steps.name": "Holdnavn", @@ -150,5 +150,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/de/tournament.json b/locales/de/tournament.json index 7d03dc284..e4f3cae9f 100644 --- a/locales/de/tournament.json +++ b/locales/de/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Seeds", "tabs.results": "Ergebnisse", "tabs.streams": "Streams ({{count}})", - "tabs.subs": "Ersatzspieler ({{count}})", + "tabs.subs": "Ersatzspieler", "tabs.looking": "", "pre.steps.header": "Folge diesen Schritten, um zu spielen", "pre.steps.name": "Teamname", @@ -150,5 +150,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/en/tournament.json b/locales/en/tournament.json index bc05bfbf2..7f056f285 100644 --- a/locales/en/tournament.json +++ b/locales/en/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Seeds", "tabs.results": "Results", "tabs.streams": "Streams ({{count}})", - "tabs.subs": "Subs ({{count}})", + "tabs.subs": "Subs", "tabs.looking": "LFG", "pre.steps.header": "Complete these steps to play", "pre.steps.name": "Team name", @@ -150,5 +150,6 @@ "progression.error.NEGATIVE_PROGRESSION": "Negative progression only possible for double elimination", "progression.error.NO_SE_SOURCE": "Single elimination is not a valid source bracket", "progression.error.NO_DE_POSITIVE": "Double elimination is not valid for positive progression", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "Swiss bracket with early advance/elimination must lead to another bracket" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "Swiss bracket with early advance/elimination must lead to another bracket", + "lfg.askCaptainToJoinQueue": "Ask your team's captain or a manager to join the queue" } diff --git a/locales/es-ES/tournament.json b/locales/es-ES/tournament.json index 70e5dab56..d33287a90 100644 --- a/locales/es-ES/tournament.json +++ b/locales/es-ES/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Listas de Equipos", "tabs.results": "Resultados", "tabs.streams": "Streams ({{count}})", - "tabs.subs": "Subs ({{count}})", + "tabs.subs": "Subs", "tabs.looking": "", "pre.steps.header": "Completa estos pasos para jugar", "pre.steps.name": "Nombre de equipo", @@ -152,5 +152,6 @@ "progression.error.NEGATIVE_PROGRESSION": "La progresión negativa solo es posible en eliminación doble", "progression.error.NO_SE_SOURCE": "La eliminación simple no es un cuadro de origen válido", "progression.error.NO_DE_POSITIVE": "La eliminación doble no es válida para progresión positiva", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "El cuadro suizo con avance/eliminación anticipada debe llevar a otro cuadro" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "El cuadro suizo con avance/eliminación anticipada debe llevar a otro cuadro", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/es-US/tournament.json b/locales/es-US/tournament.json index da9a70b6b..b635e67fb 100644 --- a/locales/es-US/tournament.json +++ b/locales/es-US/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Listas de Equipos", "tabs.results": "", "tabs.streams": "Streams ({{count}})", - "tabs.subs": "Subs ({{count}})", + "tabs.subs": "Subs", "tabs.looking": "", "pre.steps.header": "Completa estos pasos para jugar", "pre.steps.name": "Nombre de equipo", @@ -152,5 +152,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/fr-CA/tournament.json b/locales/fr-CA/tournament.json index 230634f42..8bddfb9b0 100644 --- a/locales/fr-CA/tournament.json +++ b/locales/fr-CA/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Seeds", "tabs.results": "", "tabs.streams": "Diffusions ({{count}})", - "tabs.subs": "Remplaçants ({{count}})", + "tabs.subs": "Remplaçants", "tabs.looking": "", "pre.steps.header": "Complétez ces étapes pour jouer", "pre.steps.name": "Nom de l'équipe", @@ -152,5 +152,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/fr-EU/tournament.json b/locales/fr-EU/tournament.json index 55f9dec34..508c7e09f 100644 --- a/locales/fr-EU/tournament.json +++ b/locales/fr-EU/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Seeds", "tabs.results": "Resultats", "tabs.streams": "Diffusions ({{count}})", - "tabs.subs": "Remplaçants ({{count}})", + "tabs.subs": "Remplaçants", "tabs.looking": "", "pre.steps.header": "Complétez ces étapes pour jouer", "pre.steps.name": "Nom de l'équipe", @@ -152,5 +152,6 @@ "progression.error.NEGATIVE_PROGRESSION": "Negative progression only possible for double elimination", "progression.error.NO_SE_SOURCE": "Single elimination is not a valid source bracket", "progression.error.NO_DE_POSITIVE": "Double elimination is not valid for positive progression", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/he/tournament.json b/locales/he/tournament.json index e648088e4..b02d130ae 100644 --- a/locales/he/tournament.json +++ b/locales/he/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "דירוג", "tabs.results": "", "tabs.streams": "שידורים חיים ({{count}})", - "tabs.subs": "מחליפים ({{count}})", + "tabs.subs": "מחליפים", "tabs.looking": "", "pre.steps.header": "השלימו את השלבים הבאים כדי לשחק", "pre.steps.name": "שם קבוצה", @@ -152,5 +152,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/it/tournament.json b/locales/it/tournament.json index 1b7af13e9..a96e7f5cd 100644 --- a/locales/it/tournament.json +++ b/locales/it/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Seed", "tabs.results": "Resultati", "tabs.streams": "Stream ({{count}})", - "tabs.subs": "Sub ({{count}})", + "tabs.subs": "Sub", "tabs.looking": "", "pre.steps.header": "Completa questi passaggi per giocare", "pre.steps.name": "Nome team", @@ -152,5 +152,6 @@ "progression.error.NEGATIVE_PROGRESSION": "La progressione negativa è disponibile solo in doppia eliminazione", "progression.error.NO_SE_SOURCE": "Eliminazione singola non è un bracket sorgente valido", "progression.error.NO_DE_POSITIVE": "Doppia eliminazione non è valida per progressione positiva", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/ja/tournament.json b/locales/ja/tournament.json index 3bdceb91d..fdee31ba3 100644 --- a/locales/ja/tournament.json +++ b/locales/ja/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "シード", "tabs.results": "結果", "tabs.streams": "配信 ({{count}})", - "tabs.subs": "サブ ({{count}})", + "tabs.subs": "サブ", "tabs.looking": "", "pre.steps.header": "トーナメント参加のために下記を入力してください", "pre.steps.name": "チーム名", @@ -146,5 +146,6 @@ "progression.error.NEGATIVE_PROGRESSION": "逆の進行はダブルエリ三ネーションの時のみ可能です", "progression.error.NO_SE_SOURCE": "シングルエリ三ネーションは妥当なブラケットではないです", "progression.error.NO_DE_POSITIVE": "ダブルエリミネーションは普通の進行(前向き)では妥当ではないです", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/ko/tournament.json b/locales/ko/tournament.json index 9181f4f57..e515476e5 100644 --- a/locales/ko/tournament.json +++ b/locales/ko/tournament.json @@ -146,5 +146,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/nl/tournament.json b/locales/nl/tournament.json index c8292a3fe..f4100dcc2 100644 --- a/locales/nl/tournament.json +++ b/locales/nl/tournament.json @@ -150,5 +150,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/pl/tournament.json b/locales/pl/tournament.json index f76a2e68a..d51b15db7 100644 --- a/locales/pl/tournament.json +++ b/locales/pl/tournament.json @@ -154,5 +154,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/pt-BR/tournament.json b/locales/pt-BR/tournament.json index 24502032f..7c7f2e65b 100644 --- a/locales/pt-BR/tournament.json +++ b/locales/pt-BR/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Sementes", "tabs.results": "", "tabs.streams": "Transmissões ({{count}})", - "tabs.subs": "Inscritos ({{count}})", + "tabs.subs": "Inscritos", "tabs.looking": "", "pre.steps.header": "Complete esses passos para jogar", "pre.steps.name": "Nome do time", @@ -152,5 +152,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/ru/tournament.json b/locales/ru/tournament.json index 05dfb61d7..e748f4327 100644 --- a/locales/ru/tournament.json +++ b/locales/ru/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "Семена", "tabs.results": "Результаты", "tabs.streams": "Трансляции: ({{count}})", - "tabs.subs": "Запасные: ({{count}})", + "tabs.subs": "Запасные", "tabs.looking": "", "pre.steps.header": "Завершите следующие шаги, чтобы закончить регистрацию", "pre.steps.name": "Имя команды", @@ -154,5 +154,6 @@ "progression.error.NEGATIVE_PROGRESSION": "Отрицательная прогрессия возможна только в Double Elimination турнирах", "progression.error.NO_SE_SOURCE": "Single elimination не валидная сетка-исток", "progression.error.NO_DE_POSITIVE": "Double elimination не валидно для позитивной прогрессии", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" } diff --git a/locales/zh/tournament.json b/locales/zh/tournament.json index 1d960ab4f..773f8682c 100644 --- a/locales/zh/tournament.json +++ b/locales/zh/tournament.json @@ -7,7 +7,7 @@ "tabs.seeds": "种子", "tabs.results": "", "tabs.streams": "直播 ({{count}})", - "tabs.subs": "替补 ({{count}})", + "tabs.subs": "替补", "tabs.looking": "", "pre.steps.header": "参加比赛需完成以下步骤", "pre.steps.name": "队伍名称", @@ -146,5 +146,6 @@ "progression.error.NEGATIVE_PROGRESSION": "", "progression.error.NO_SE_SOURCE": "", "progression.error.NO_DE_POSITIVE": "", - "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "" + "progression.error.SWISS_EARLY_ADVANCE_NO_DESTINATION": "", + "lfg.askCaptainToJoinQueue": "" }