import { getAccountInfo, getClanInfo } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n"; import { Locale } from "discord.js"; import { CommandWrapper } from "../components/CommandWrapper"; import { GenericStats } from "../components/GenericStats"; import { NoData } from "../components/NoData"; import { TitleBar } from "../components/TitleBar"; import { addClanChoices } from "../core/discord/addClanChoices"; import { autocompleteClan } from "../core/discord/autocompleteClan"; import { createLocalizedCommand } from "../core/discord/createLocalizedCommand"; import { localizationObject } from "../core/discord/localizationObject"; import { resolveClanFromCommand } from "../core/discord/resolveClanFromCommand"; import { translator } from "../core/localization/translator"; import type { CommandRegistry } from "../events/interactionCreate"; const DEFAULT_THRESHOLD = 7; export const inactiveCommand = new Promise((resolve) => { resolve({ command: createLocalizedCommand("inactive") .addStringOption(addClanChoices) .addNumberOption((option) => { const { strings } = translator(Locale.EnglishUS); return option .setName("threshold") .setNameLocalizations( localizationObject( (strings) => strings.bot.commands.inactive.options.threshold.name, undefined, true ) ) .setDescription( strings.bot.commands.inactive.options.threshold.description ) .setDescriptionLocalizations( localizationObject( (strings) => strings.bot.commands.inactive.options.threshold.description ) ) .setMinValue(0); }), async handler(interaction) { const { strings } = translator(interaction.locale); const { region, id } = await resolveClanFromCommand(interaction); const threshold = interaction.options.getNumber("threshold")! ?? DEFAULT_THRESHOLD; const time = new Date().getTime() / 1000; const clanInfo = await getClanInfo(region, id); const accountInfo = await getAccountInfo(region, clanInfo.members_ids); const inactive = accountInfo .map( (account) => [ account.nickname, (time - account.last_battle_time) / 60 / 60 / 24, ] as [string, number] ) .filter(([, inactiveDays]) => inactiveDays >= threshold) .sort((a, b) => b[1] - a[1]) .map( ([name, days]) => [ name, literals(strings.bot.commands.inactive.body.listing, { days: days.toFixed(0), }), ] as [string, string] ); const hasInactiveMembers = inactive.length > 0; return ( {!hasInactiveMembers && ( )} {hasInactiveMembers && } ); }, autocomplete: autocompleteClan, }); });