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 { getEmoji } from "@systems/emojis"; export async function handleScoreSet(interaction: ChatInputCommandInteraction): Promise { const member = await interaction.guild!.members.fetch(interaction.user.id); const isOfficer = hasOfficerRole(member, Config.get({ section: "roles", key: "officer" })); const nameArg = interaction.options.getString("name"); const ptsArg = interaction.options.getInteger("pts", true); const slotArg = interaction.options.getString("slot"); const kills = interaction.options.getInteger("k") ?? undefined; const deaths = interaction.options.getInteger("d") ?? undefined; const k = interaction.options.getInteger("k") ?? undefined; const d = interaction.options.getInteger("d") ?? undefined; const atk = interaction.options.getInteger("atk") ?? undefined; const def = interaction.options.getInteger("def") ?? undefined; const heal = interaction.options.getInteger("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, nation: char.nation, pts: ptsArg, k, d, slot, atk, def, heal, submittedByOfficer: isOfficer && !!nameArg, }); const scoreEmoji = getEmoji("score") || "๐Ÿ“Š"; const kdEmoji = getEmoji("kd") || "โš”๏ธ"; const borrowNote = borrowedFrom ? ` *(borrowed from ${borrowedFrom})*` : ""; const kdNote = kills !== undefined && deaths !== undefined ? `\n${kdEmoji} ${kills}/${deaths}` : ""; 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 ); }