import { ChatInputCommandInteraction } from "discord.js"; import { cfg } from "../../systems/config"; import { resolveUser, hasOfficerRole } from "../../systems/users"; import { submitScore, detectSlot, normalizeSlot } from "../../systems/scores"; import { getActiveCharacter } from "../../systems/characters"; import { resolveNation } from "../../systems/nations"; import { replyAndDelete } from "../../utils"; export async function handleScoreSet(interaction: ChatInputCommandInteraction): Promise { const member = await interaction.guild!.members.fetch(interaction.user.id); const isOfficer = hasOfficerRole(member, cfg("officerRoles")); const nameArg = interaction.options.getString("name"); const ptsArg = interaction.options.getInteger("pts", true); const slotArg = interaction.options.getString("slot"); // Officers can specify a name, players cannot let usermapKey: string | null; let targetMember = member; if (nameArg) { if (!isOfficer) return void replyAndDelete(interaction, "❌ Only officers can submit scores for other players."); usermapKey = nameArg; } else { const user = await resolveUser(member); usermapKey = user.usermapKey; } if (!usermapKey) return void replyAndDelete(interaction, "❌ You are not registered in the system."); const char = getActiveCharacter(usermapKey); if (!char) return void replyAndDelete(interaction, "❌ No active character found. Use `/tg char set-active` first."); // Resolve slot 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(); if (slot === null) { return void replyAndDelete(interaction, "❌ No active score window detected. Specify a slot explicitly."); } } await submitScore({ usermapKey, characterName: char.name, cls: char.class, nation: char.nation, pts: ptsArg, slot, submittedByOfficer: isOfficer && !!nameArg, }); return void replyAndDelete(interaction, `✅ Score of **${ptsArg}** submitted for **${char.name}** (${slot}:00 TG).`); }