Son aktivite 1 month ago

nuno bu gisti düzenledi 1 month ago. Düzenlemeye git

1 file changed, 83 insertions

set.ts(dosya oluşturuldu)

@@ -0,0 +1,83 @@
1 + import { ChatInputCommandInteraction } from "discord.js";
2 + import { Config } from "@systems/config";
3 + import { resolveUser, hasOfficerRole } from "@systems/users";
4 + import { Score } from "@systems/score";
5 + import { detectSlot, normalizeSlot } from "@systems/scores";
6 + import { getEffectiveCharacter } from "@systems/borrow";
7 + import { replyAndDelete } from "@utils";
8 + import { Emoji } from "@systems/emojis";
9 + import { Discord } from "@discord";
10 + import { User } from "@systems/users";
11 + import { Logger } from "@systems/logger";
12 + import { SlotHour } from "@root/src/types";
13 + const log = Logger.for("score-set");
14 +
15 + export async function handleScoreSet(interaction: ChatInputCommandInteraction): Promise<void> {
16 + const options = Discord.Interaction.options<ChatInputCommandInteraction>(interaction);
17 +
18 + const member = await interaction.guild!.members.fetch(interaction.user.id);
19 + const isOfficer = User.hasOfficerRole({
20 + member: member,
21 + officerRoles: Config.get({ section: "roles", key: "officer"
22 + })});
23 + const nameArg = options.string({ key: "name" });
24 + const ptsArg = options.integer({ key: "pts", required: true });
25 + const slotArg = options.string({ key: "slot" });
26 + const k = options.integer({ key: "k" }) ?? undefined;
27 + const d = options.integer({ key: "d" }) ?? undefined;
28 + const atk = options.integer({ key: "atk" }) ?? undefined;
29 + const def = options.integer({ key: "def" }) ?? undefined;
30 + const heal = options.integer({ key: "heal" }) ?? undefined;
31 +
32 + let userKey: string | null;
33 + if (nameArg) {
34 + if (!isOfficer) return void replyAndDelete(interaction, "❌ Only officers can submit scores for other players.");
35 + userKey = nameArg;
36 + } else {
37 + const user = await resolveUser(member);
38 + userKey = user.userKey;
39 + }
40 +
41 + if (!userKey) return void replyAndDelete(interaction, "❌ You are not registered in the system.");
42 +
43 + const { char, borrowedFrom } = getEffectiveCharacter(userKey);
44 + if (!char) return void replyAndDelete(interaction, "❌ No active character found. Use `/tg char set-active` first.");
45 +
46 + let slot: number | null = null;
47 + if (slotArg) {
48 + slot = normalizeSlot(slotArg);
49 + if (slot === null) return void replyAndDelete(interaction, `❌ Could not parse slot "${slotArg}".`);
50 + } else {
51 + slot = detectSlot() ?? Config.get({ section: "poll", key: "slots" }).find((s) => s.active)?.tgHour ?? 20;
52 + }
53 +
54 + log.debug(`Submitting score: slot=${slot} (type: ${typeof slot}) date=${new Date().toISOString().slice(0,10)}`);
55 +
56 + await Score.submit({
57 + character: char,
58 + playedBy: borrowedFrom ? userKey : undefined,
59 + pts: ptsArg!,
60 + k,
61 + d,
62 + atk,
63 + def,
64 + heal,
65 + slot: slot as SlotHour,
66 + submittedByOfficer: isOfficer && !!nameArg,
67 + });
68 +
69 + const scoreEmoji = Emoji.get("score") || "📊";
70 + const kdEmoji = Emoji.get("kd") || "⚔️";
71 + const borrowNote = borrowedFrom ? ` *(borrowed from ${borrowedFrom})*` : "";
72 + const kdNote = k !== undefined && d !== undefined ? `\n${kdEmoji} ${k}/${d}` : "";
73 + const statsNote = [
74 + atk !== undefined ? `ATK: ${atk}` : null,
75 + def !== undefined ? `DEF: ${def}` : null,
76 + heal !== undefined ? `HEAL: ${heal}` : null,
77 + ].filter(Boolean).join(" · ");
78 +
79 + return void replyAndDelete(interaction,
80 + `✅ ${scoreEmoji} **${ptsArg}** submitted for **${char.name}**${borrowNote} (${slot}:00 TG)${kdNote}${statsNote ? `\n${statsNote}` : ""}`,
81 + true
82 + );
83 + }
Daha yeni Daha eski