import { ChatInputCommandInteraction } from "discord.js"; import { Config } from "@systems/config"; import { resolveUser, hasOfficerRole } from "@systems/users"; import { submitScore, detectSlot, normalizeSlot } from "@systems/scores"; import { getEffectiveCharacter } from "@systems/borrow"; import { replyAndDelete } from "@utils"; import { Emoji } from "@systems/emojis"; import { Discord } from "@discord"; import { User } from "@systems/users"; export async function handleScoreSet(interaction: ChatInputCommandInteraction): Promise { const options = Discord.Interaction.options(interaction); const member = await interaction.guild!.members.fetch(interaction.user.id); const isOfficer = User.hasOfficerRole({ member: member, officerRoles: Config.get({ section: "roles", key: "officer" })}); const nameArg = options.string({ key: "name" }); const ptsArg = options.integer({ key: "pts", required: true }); const slotArg = options.string({ key: "slot" }); const k = options.integer({ key: "k" }) ?? undefined; const d = options.integer({ key: "d" }) ?? undefined; const atk = options.integer({ key: "atk" }) ?? undefined; const def = options.integer({ key: "def" }) ?? undefined; const heal = options.integer({ key: "heal" }) ?? undefined; let userKey: string | null; if (nameArg) { if (!isOfficer) return void replyAndDelete(interaction, "โŒ Only officers can submit scores for other players."); userKey = nameArg; } else { const user = await resolveUser(member); userKey = user.userKey; } if (!userKey) return void replyAndDelete(interaction, "โŒ You are not registered in the system."); const { char, borrowedFrom } = getEffectiveCharacter(userKey); if (!char) return void replyAndDelete(interaction, "โŒ No active character found. Use `/tg char set-active` first."); let slot: number | null = null; if (slotArg) { slot = normalizeSlot(slotArg); if (slot === null) return void replyAndDelete(interaction, `โŒ Could not parse slot "${slotArg}".`); } 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.key, nation: char.nation, pts: ptsArg!, k, d, slot, atk, def, heal, submittedByOfficer: isOfficer && !!nameArg, }); const scoreEmoji = Emoji.get("score") || "๐Ÿ“Š"; const kdEmoji = Emoji.get("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(" ยท "); return void replyAndDelete(interaction, `โœ… ${scoreEmoji} **${ptsArg}** submitted for **${char.name}**${borrowNote} (${slot}:00 TG)${kdNote}${statsNote ? `\n${statsNote}` : ""}`, true ); }