export namespace score { /** * Resolve, validate and persist a score submission for a given userKey. * Used by both the slash command handler and the modal submit handler. */ export async function submitForUser(input: ScoreSubmitInput): Promise { const { userKey, pts, k, d, atk, def, heal, submittedByOfficer = false } = input; const { char, borrowedFrom } = getEffectiveCharacter(userKey); if (!char) { return { ok: false, message: "โŒ No active character found. Use `/tg char set-active` first." }; } // Resolve slot let slot: number | null = null; if (typeof input.slot === "number") { slot = input.slot; } else if (typeof input.slot === "string") { slot = normalizeSlot(input.slot); if (slot === null) { return { ok: false, message: `โŒ Could not parse slot "${input.slot}".` }; } } else { slot = detectSlot() ?? Config.get({ section: "poll", key: "slots" }).find((s) => s.active)?.tgHour ?? 20; } await submitScore({ userKey: borrowedFrom ?? userKey, playedBy: borrowedFrom ? userKey : undefined, characterName: char.name, cls: char.class, nation: char.nation, pts, k, d, slot, atk, def, heal, submittedByOfficer, }); const scoreEmoji = getEmoji("score") || "๐Ÿ“Š"; const kdEmoji = getEmoji("kd") || "โš”๏ธ"; const borrowNote = borrowedFrom ? ` *(borrowed from ${borrowedFrom})*` : ""; const kdNote = k !== undefined && d !== undefined ? `\n${kdEmoji} ${k}/${d}` : ""; const statsNote = [ atk !== undefined ? `ATK: ${atk}` : null, def !== undefined ? `DEF: ${def}` : null, heal !== undefined ? `HEAL: ${heal}` : null, ].filter(Boolean).join(" ยท "); const charDisplay = format.char(char); return { ok: true, message: `โœ… ${scoreEmoji} **${pts}** submitted for ${charDisplay}${borrowNote} (${slot}:00 TG)${kdNote}${statsNote ? `\n${statsNote}` : ""}`, // message: `โœ… ${scoreEmoji} **${pts}** submitted for ${charDisplay}${borrowNote} (${slot}:00 TG)${kdNote}${statsNote ? `\n${statsNote}` : ""}`, }; } }