diff --git a/scripts/help_logger.py b/scripts/help_logger.py index de98696..770e67e 100644 --- a/scripts/help_logger.py +++ b/scripts/help_logger.py @@ -15,10 +15,11 @@ def main(): client = gspread.authorize(CREDENTIALS) sheet = client.open_by_key(SHEET_ID).sheet1 - grupo = ' '.join(sys.argv[1]) - cierre = sys.argv[2] - brindador = ' '.join(sys.argv[3:]) - sheet.append_row([grupo, cierre, brindador]) + fechaDeCreacion = sys.argv[1] + grupo = sys.argv[2] + cierre = sys.argv[3] + brindador = ' '.join(sys.argv[4:]) + sheet.append_row([fechaDeCreacion, grupo, cierre, brindador]) if __name__ == "__main__": main() diff --git a/src/client/Client.ts b/src/client/Client.ts index 06cc395..c7fa138 100644 --- a/src/client/Client.ts +++ b/src/client/Client.ts @@ -11,6 +11,10 @@ import path from 'path'; import fs from 'fs'; import cron from 'node-cron'; import child_process from 'child_process'; +import * as commands from '../commands/index.ts'; +import * as events from '../events/index.ts'; +import * as buttons from '../components/buttons/index.ts'; +import * as embeds from '../components/embed_pages/index.ts'; class Bot extends Client { public logger: Consola = consola; @@ -44,15 +48,10 @@ class Bot extends Client { private async loadCommands() { this.logger.info(`Loading commands...`); - const commandFiles: string[] = fs - .readdirSync(path.resolve(__dirname, '../commands')) - .filter((file) => file.endsWith('.js')); - - for (const file of commandFiles) { - const command: Command = require(`../commands/${file}`); + Object.values(commands).forEach(command => { this.commands.set(command.data.name, command); this.logger.success(`Command ${command.data.name} loaded.`); - } + }); this.logger.success(`Commands loaded.`); } @@ -60,35 +59,25 @@ class Bot extends Client { private async loadEvents() { this.logger.info(`Loading events...`); - const eventFiles = fs - .readdirSync(path.resolve(__dirname, '../events')) - .filter((file) => file.endsWith('.js')); - - for (const file of eventFiles) { - const event = require(`../events/${file}`); - if (event.once) { - this.once(event.name, (...args) => event.execute(...args)); - } else { - this.on(event.name, (...args) => event.execute(...args)); - } - this.logger.success(`Listening to ${event.name} event.`); - } + Object.values(events).forEach(event => { + if (event.once) { + this.once(event.name, (...args) => event.execute(...args)); + } else { + this.on(event.name, (...args) => event.execute(...args)); + } + this.logger.success(`Listening to ${event.name} event.`); + }); this.logger.success(`Events loaded.`); } private async loadButtons() { this.logger.info(`Loading buttons...`); - - const buttonFiles: string[] = fs - .readdirSync(path.resolve(__dirname, '../components/buttons')) - .filter((file) => file.endsWith('.js')); - - for (const file of buttonFiles) { - const button: Button = require(`../components/buttons/${file}`); + + Object.values(buttons).forEach(button => { this.buttons.set(button.data.customId!, button); this.logger.success(`Button ${button.data.customId} loaded.`); - } + }); this.logger.success(`Buttons loaded.`); } @@ -96,12 +85,7 @@ class Bot extends Client { public async loadEmbeds() { this.logger.info(`Loading embeds...`); - const embedFiles: string[] = fs - .readdirSync(path.resolve(__dirname, '../components/embed_pages')) - .filter((file) => file.endsWith('.js')); - - for (const file of embedFiles) { - const embed: EmbedPageInterface = require(`../components/embed_pages/${file}`); + Object.values(embeds).forEach(embed => { this.embeds.set(embed.data.name, embed.data); if ( embed.data.name === 'students' || @@ -113,7 +97,8 @@ class Bot extends Client { await embed.data.send(); this.logger.success(`Embed ${embed.data.name} sent.`); } - } + }); + this.logger.success(`Sent ${this.embeds.size} embeds.`); } @@ -191,21 +176,41 @@ class Bot extends Client { ]); } - public logHelp(creator: string, helper: string, end: string) { + public logHelp( + creationDate: Date, + creator: string, + helper: string, + end: string + ) { this.logger.info( - `Logging help asked by ${creator} helped by Grupo ${helper} (${end})` + `Logging help asked by ${helper} helped by Grupo ${creator} (${end})` ); - if (creator.split(' ').length > 1) { - creator = creator.split(' ')[1]; - } child_process.spawn('python3', [ `./scripts/help_logger.py`, + Bot.dateFromISO( + creationDate.toISOString(), + 'America/Argentina/Buenos_Aires' + ), creator, end, helper, ]); this.logger.success('Help logged.'); } + + static dateFromISO(isoDate: string, timeZone: string) { + const date = new Date(isoDate); + return date.toLocaleTimeString('es-ES', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + hour12: false, + timeZone: timeZone, + }); + } } export { Bot as AlgoBot }; diff --git a/src/commands/index.ts b/src/commands/index.ts new file mode 100644 index 0000000..888c7a5 --- /dev/null +++ b/src/commands/index.ts @@ -0,0 +1,4 @@ +export * from "EmbedMessageCommand.ts" +export * from "GradesCommand.ts" +export * from "PapersCommand.ts" +export * from "RequestGroupRoleCommand.ts" diff --git a/src/components/buttons/AnswerQueryButton.ts b/src/components/buttons/AnswerQueryButton.ts index ce4d410..173878e 100644 --- a/src/components/buttons/AnswerQueryButton.ts +++ b/src/components/buttons/AnswerQueryButton.ts @@ -29,6 +29,7 @@ export const execute = async (interaction: ButtonInteraction) => { ); client.logHelp( + interaction.createdAt, group ? group.name.split(' ')[1] : consultee.displayName, consultor.displayName, 'Brindada' diff --git a/src/components/buttons/CancelQueryButton.ts b/src/components/buttons/CancelQueryButton.ts index 60a7ca6..bc44d3c 100644 --- a/src/components/buttons/CancelQueryButton.ts +++ b/src/components/buttons/CancelQueryButton.ts @@ -27,6 +27,7 @@ export const execute = async (interaction: ButtonInteraction) => { }); client.logHelp( + interaction.createdAt, group ? group.name.split(' ')[1] : member.displayName, '-', 'Desestimada' diff --git a/src/components/buttons/index.ts b/src/components/buttons/index.ts new file mode 100644 index 0000000..34cd1ae --- /dev/null +++ b/src/components/buttons/index.ts @@ -0,0 +1,4 @@ +export * from 'AnswerQueryButton.ts' +export * from 'QueueQueryButton.ts' +export * from 'CancelQueryButton.ts' +export * from 'ReadmeButton.ts' diff --git a/src/components/embed_pages/ClassInfoEmbedPage.ts b/src/components/embed_pages/ClassInfoEmbedPage.ts index c094e50..56cae94 100644 --- a/src/components/embed_pages/ClassInfoEmbedPage.ts +++ b/src/components/embed_pages/ClassInfoEmbedPage.ts @@ -1,6 +1,7 @@ import { EmbedPage } from '../models/EmbedPage'; import { client } from '../../index'; import * as event from '../../../assets/event.json'; +import { AlgoBot } from '../../client/Client'; export const data = new EmbedPage( client, @@ -22,10 +23,10 @@ export const data = new EmbedPage( }, { name: 'Detalles de la clase', - value: `Empieza el ${dateFromISO( + value: `Empieza el ${AlgoBot.dateFromISO( event.start.dateTime, event.start.timeZone - )} y termina el ${dateFromISO( + )} y termina el ${AlgoBot.dateFromISO( event.end.dateTime, event.end.timeZone )}`, @@ -56,20 +57,6 @@ export const data = new EmbedPage( .roles.cache.get(client.config.studentRoleID)}` ); -function dateFromISO(isoDate: string, timeZone: string) { - const date = new Date(isoDate); - return date.toLocaleTimeString('es-ES', { - weekday: 'long', - year: 'numeric', - month: 'long', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', - hour12: false, - timeZone: timeZone, - }); -} - function extractTopicsFromEventDescription(eventDescription: string): string { let classTopics = eventDescription.split('Temas a tratar: ')[1]; classTopics = classTopics.split('Paper a tener leĆ­do: ')[0]; diff --git a/src/components/embed_pages/index.ts b/src/components/embed_pages/index.ts new file mode 100644 index 0000000..329620d --- /dev/null +++ b/src/components/embed_pages/index.ts @@ -0,0 +1,5 @@ +export * from 'PapersEmbedPage.ts' +export * from 'ClassInfoEmbedPage.ts' +export * from 'ReadmeEmbedPage.ts' +export * from 'StudentsEmbedPage.ts' +export * from 'TeachersQueryQueueEmbedPage.ts' diff --git a/src/deploy-commands.ts b/src/deploy-commands.ts index 121c59f..d2b302f 100644 --- a/src/deploy-commands.ts +++ b/src/deploy-commands.ts @@ -4,6 +4,7 @@ import { Command } from './interfaces/Command'; import fs from 'fs'; import path from 'path'; import consola from 'consola'; +import * as commandFiles from './commands/index.ts'; import dotenv from 'dotenv'; dotenv.config(); @@ -15,14 +16,10 @@ const commands: { default_permission: boolean | undefined; }[] = []; -const commandFiles: string[] = fs - .readdirSync(path.resolve(__dirname, 'commands')) - .filter((file) => file.endsWith('.js')); -for (const file of commandFiles) { - const command: Command = require(`./commands/${file}`); +Object.values(commandFiles).forEach(command => { commands.push(command.data.toJSON()); -} +}); const rest = new REST({ version: '9' }).setToken(process.env.TOKEN as string); diff --git a/src/events/index.ts b/src/events/index.ts new file mode 100644 index 0000000..f988a7b --- /dev/null +++ b/src/events/index.ts @@ -0,0 +1,9 @@ +export * from 'DebugEvent.ts' +export * from 'ErrorEvent.ts' +export * from 'GuildMemberAddEvent.ts' +export * from 'GuildMemberRemoteEvent.ts' +export * from 'InteractionCreateEvent.ts' +export * from 'MessageCreateEvent.ts' +export * from 'ReadyEvent.ts' +export * from 'VoiceStateUpdate.ts' +export * from 'WarnEvent.ts'