import { CommandInteraction, CommandInteractionOptionResolver, TextChannel, SlashCommandBuilder, SlashCommandStringOption, SlashCommandUserOption, SlashCommandIntegerOption, } from 'discord.js'; import {Command} from '../../classes/command'; import {logger} from '../../logger' import {getContest, putRead} from '../../functions/database'; function isTextChannel(data: unknown): data is TextChannel{ return (data as TextChannel).name !== undefined; } type CIOR = CommandInteractionOptionResolver; class Read extends Command{ get name(){return "read";} get description(){return "Add timestamp to read a problem";} async execute(interaction: CommandInteraction): Promise{ if(!isTextChannel(interaction.channel)){ await interaction.reply({ content: `Channel name doesn't exist!` }); logger.error(`Channel name doesn't exist`); return; } try{ let problemId = (interaction.options as CIOR).getString('problem'); const estimate = (interaction.options as CIOR).getInteger('estimate') ?? -1; const specifiedUser = (interaction.options as CIOR).getUser('user'); const contestName = interaction.channel.name; const channelId = interaction.channel.id; const contest = await getContest(channelId); const time = new Date(); if(problemId === null){ logger.error('Options error in "read".'); return; } const user = specifiedUser ?? interaction.user; problemId = problemId.toUpperCase(); if(contest === null){ await interaction.reply({ content: `The contest in this channel didn't start!` }); logger.error(`Contest ${contestName} didn't start`); return; } const sessionId: string = await putRead( user, problemId, channelId, time.valueOf(), estimate*1000*60 + contest.startTime ); let content = `Problem ${problemId} read by ${user.username}`; if(estimate !== -1) content += `, estimate in ${estimate} min`; content += `. (session id: ${sessionId})`; await interaction.reply({content: logger.log(content)}); }catch(error: unknown){ logger.error(`Error occur while reading problem`); return; } } override build(): SlashCommandBuilder | Omit{ return new SlashCommandBuilder() .setName(this.name) .setDescription(this.description) .addStringOption((option: SlashCommandStringOption) => option .setName('problem') .setDescription('The id of the problem.') .setMinLength(1).setMaxLength(1) .setRequired(true) ) .addIntegerOption((option: SlashCommandIntegerOption) => option .setName('estimate') .setDescription('The estimate coding time of the problem.') ) .addUserOption((option: SlashCommandUserOption) => option .setName('user') .setDescription('Who read the problem, default is yourself') ) } }; export const command = new Read();