From 1447e8c0e49c718e679bc771fff995c34b12e28b Mon Sep 17 00:00:00 2001 From: "Ean Milligan (Bastion)" Date: Sat, 3 Sep 2022 00:48:23 -0400 Subject: [PATCH] Rework eventHandlers to have their own files --- config.example.ts | 2 +- deps.ts | 2 +- mod.ts | 2 +- src/eventHandlers.ts | 191 ------------------------------------ src/events.ts | 17 ++++ src/events/_index.ts | 13 +++ src/events/debug.ts | 8 ++ src/events/guildCreate.ts | 40 ++++++++ src/events/guildDelete.ts | 29 ++++++ src/events/messageCreate.ts | 79 +++++++++++++++ src/events/ready.ts | 72 ++++++++++++++ 11 files changed, 261 insertions(+), 194 deletions(-) delete mode 100644 src/eventHandlers.ts create mode 100644 src/events.ts create mode 100644 src/events/_index.ts create mode 100644 src/events/debug.ts create mode 100644 src/events/guildCreate.ts create mode 100644 src/events/guildDelete.ts create mode 100644 src/events/messageCreate.ts create mode 100644 src/events/ready.ts diff --git a/config.example.ts b/config.example.ts index ede7343..99a6951 100644 --- a/config.example.ts +++ b/config.example.ts @@ -1,6 +1,6 @@ export const config = { 'name': 'Sweeper Bot', // Name of the bot - 'version': '0.0.0', // Version of the bot + 'version': '0.1.0', // Version of the bot 'token': 'the_bot_token', // Discord API Token for this bot 'localtoken': 'local_testing_token', // Discord API Token for a secondary OPTIONAL testing bot, THIS MUST BE DIFFERENT FROM "token" 'prefix': 's!', // Prefix for all commands diff --git a/deps.ts b/deps.ts index 7a55c1e..3832a11 100644 --- a/deps.ts +++ b/deps.ts @@ -6,7 +6,7 @@ export const botId = getBotIdFromToken(LOCALMODE ? config.localtoken : config.to export { ActivityTypes, createBot, editBotNickname, editBotStatus, Intents, sendMessage, startBot } from 'https://deno.land/x/discordeno@13.0.0/mod.ts'; -export type { Bot, CreateMessage, EventHandlers, Message } from 'https://deno.land/x/discordeno@13.0.0/mod.ts'; +export type { Bot, CreateMessage, EventHandlers, Guild, Message } from 'https://deno.land/x/discordeno@13.0.0/mod.ts'; export { Client } from 'https://deno.land/x/mysql@v2.10.2/mod.ts'; diff --git a/mod.ts b/mod.ts index 8840818..63f1df3 100644 --- a/mod.ts +++ b/mod.ts @@ -14,7 +14,7 @@ import { createBot, } from './deps.ts'; // import { dbClient, ignoreList } from './src/db.ts'; -import { events } from './src/eventHandlers.ts'; +import { events } from './src/events.ts'; // Initialize logging client with folder to use for logs, needs --allow-write set on Deno startup initLog('logs', DEBUG); diff --git a/src/eventHandlers.ts b/src/eventHandlers.ts deleted file mode 100644 index c48729f..0000000 --- a/src/eventHandlers.ts +++ /dev/null @@ -1,191 +0,0 @@ -import config from '../config.ts'; -import { DEVMODE, LOCALMODE } from '../flags.ts'; -import { - // Discordeno deps - ActivityTypes, - botId, - editBotNickname, - editBotStatus, - EventHandlers, - // Log4Deno deps - log, - LT, - // Discordeno deps - sendMessage, -} from '../deps.ts'; -// import { dbClient, ignoreList } from './src/db.ts'; -import commands from './commands/_index.ts'; -import { getRandomSweeperLine, successColor, warnColor } from './commandUtils.ts'; -import utils from './utils.ts'; - -export const events: Partial = {}; -events.ready = (bot) => { - log(LT.INFO, `${config.name} Logged in!`); - editBotStatus(bot, { - activities: [{ - name: 'Booting up . . .', - type: ActivityTypes.Game, - createdAt: new Date().getTime(), - }], - status: 'online', - }); - - // Interval to rotate the status text every 30 seconds to show off more commands - setInterval(async () => { - log(LT.LOG, 'Changing bot status'); - try { - // Wrapped in try-catch due to hard crash possible - editBotStatus(bot, { - activities: [{ - name: getRandomSweeperLine(), - type: ActivityTypes.Game, - createdAt: new Date().getTime(), - }], - status: 'online', - }); - } catch (e) { - log(LT.ERROR, `Failed to update status: ${utils.jsonStringifyBig(e)}`); - } - }, 30000); - - // setTimeout added to make sure the startup message does not error out - setTimeout(() => { - LOCALMODE && editBotNickname(bot, config.devServer, { nick: `LOCAL - ${config.name}` }); - editBotStatus(bot, { - activities: [{ - name: 'Booting Complete', - type: ActivityTypes.Game, - createdAt: new Date().getTime(), - }], - status: 'online', - }); - sendMessage(bot, config.logChannel, { - embeds: [{ - title: `${config.name} is now Online`, - color: successColor, - fields: [ - { - name: 'Version:', - value: `${config.version}`, - inline: true, - }, - ], - }], - }).catch((e: Error) => utils.commonLoggers.messageSendError('mod.ts:88', 'Startup', e)); - }, 1000); -}; - -events.guildCreate = (bot, guild) => { - log(LT.LOG, `Handling joining guild ${utils.jsonStringifyBig(guild)}`); - sendMessage(bot, config.logChannel, { - embeds: [{ - title: 'New Guild Joined!', - color: successColor, - fields: [ - { - name: 'Name:', - value: `${guild.name}`, - inline: true, - }, - { - name: 'Id:', - value: `${guild.id}`, - inline: true, - }, - { - name: 'Member Count:', - value: `${guild.memberCount}`, - inline: true, - }, - ], - }], - }).catch((e: Error) => utils.commonLoggers.messageSendError('mod.ts:95', 'Join Guild', e)); -}; - -events.guildDelete = (bot, guildId) => { - log(LT.LOG, `Handling leaving guild ${utils.jsonStringifyBig(guildId)}`); - sendMessage(bot, config.logChannel, { - embeds: [{ - title: 'Removed from Guild', - color: warnColor, - fields: [ - { - name: 'Id:', - value: `${guildId}`, - inline: true, - }, - ], - }], - }).catch((e: Error) => utils.commonLoggers.messageSendError('mod.ts:99', 'Leave Guild', e)); -}; - -if (DEVMODE) { - events.debug = (dmsg) => log(LT.LOG, `Debug Message | ${utils.jsonStringifyBig(dmsg)}`); -} - -events.messageCreate = (bot, message) => { - // Ignore all other bots - if (message.isFromBot) return; - - // Ignore all messages that are not commands - if (message.content.indexOf(config.prefix) !== 0) { - // Handle @bot messages - if (message.mentionedUserIds[0] === botId && (message.content.trim().startsWith(`<@${botId}>`) || message.content.trim().startsWith(`<@!${botId}>`))) { - commands.handleMentions(bot, message); - } - - // return as we are done handling this command - return; - } - - log(LT.LOG, `Handling ${config.prefix}command message: ${utils.jsonStringifyBig(message)}`); - - // Split into standard command + args format - const args = message.content.slice(config.prefix.length).trim().split(/[ \n]+/g); - const command = args.shift()?.toLowerCase(); - - // All commands below here - switch (command) { - case 'ping': - // s!ping - // Its a ping test, what else do you want. - commands.ping(bot, message); - break; - case 'help': - case 'h': - case '?': - // s!help or s!h or s!? - // Help command, prints from help file - commands.help(bot, message); - break; - case 'info': - case 'i': - // s!info or s!i - // Info command, prints short desc on bot and some links - commands.info(bot, message); - break; - case 'version': - case 'v': - // s!version or s!v - // Returns version of the bot - commands.version(bot, message); - break; - case 'report': - case 'r': - // s!report or s!r (command that failed) - // Manually report a failed roll - commands.report(bot, message, args); - break; - case 'sm': - // s!sm [channelId] - // Manually sends a message thru the bot - if (message.authorId === config.ownerId) { - commands.sendMessage(bot, message, args); - } - break; - default: - // Non-standard commands - console.log(`${command} WIP`); - break; - } -}; diff --git a/src/events.ts b/src/events.ts new file mode 100644 index 0000000..f96ef7c --- /dev/null +++ b/src/events.ts @@ -0,0 +1,17 @@ +import { DEVMODE } from '../flags.ts'; +import { + // Discordeno deps + EventHandlers, +} from '../deps.ts'; +import eventHandlers from './events/_index.ts'; + +export const events: Partial = {}; + +events.ready = eventHandlers.ready; +events.guildCreate = eventHandlers.guildCreate; +events.guildDelete = eventHandlers.guildDelete; +events.messageCreate = eventHandlers.messageCreate; + +if (DEVMODE) { + events.debug = eventHandlers.debug +} diff --git a/src/events/_index.ts b/src/events/_index.ts new file mode 100644 index 0000000..2bdf3db --- /dev/null +++ b/src/events/_index.ts @@ -0,0 +1,13 @@ +import { ready } from './ready.ts'; +import { guildCreate } from './guildCreate.ts'; +import { guildDelete } from './guildDelete.ts'; +import { debug } from './debug.ts'; +import { messageCreate } from './messageCreate.ts'; + +export default { + ready, + guildCreate, + guildDelete, + debug, + messageCreate, +}; diff --git a/src/events/debug.ts b/src/events/debug.ts new file mode 100644 index 0000000..0870e55 --- /dev/null +++ b/src/events/debug.ts @@ -0,0 +1,8 @@ +import { + // Log4Deno deps + log, + LT, +} from '../../deps.ts'; +import utils from '../utils.ts'; + +export const debug = (dmsg: string) => log(LT.LOG, `Debug Message | ${utils.jsonStringifyBig(dmsg)}`); \ No newline at end of file diff --git a/src/events/guildCreate.ts b/src/events/guildCreate.ts new file mode 100644 index 0000000..ea45024 --- /dev/null +++ b/src/events/guildCreate.ts @@ -0,0 +1,40 @@ +import config from '../../config.ts'; +import { + // Discordeno deps + Bot, + Guild, + // Log4Deno deps + log, + LT, + // Discordeno deps + sendMessage, +} from '../../deps.ts'; +import { successColor } from '../commandUtils.ts'; +import utils from '../utils.ts'; + +export const guildCreate = (bot: Bot, guild: Guild) => { + log(LT.LOG, `Handling joining guild ${utils.jsonStringifyBig(guild)}`); + sendMessage(bot, config.logChannel, { + embeds: [{ + title: 'New Guild Joined!', + color: successColor, + fields: [ + { + name: 'Name:', + value: `${guild.name}`, + inline: true, + }, + { + name: 'Id:', + value: `${guild.id}`, + inline: true, + }, + { + name: 'Member Count:', + value: `${guild.memberCount}`, + inline: true, + }, + ], + }], + }).catch((e: Error) => utils.commonLoggers.messageSendError('mod.ts:95', 'Join Guild', e)); +}; diff --git a/src/events/guildDelete.ts b/src/events/guildDelete.ts new file mode 100644 index 0000000..5c509f4 --- /dev/null +++ b/src/events/guildDelete.ts @@ -0,0 +1,29 @@ +import config from '../../config.ts'; +import { + // Discordeno deps + Bot, + // Log4Deno deps + log, + LT, + // Discordeno deps + sendMessage, +} from '../../deps.ts'; +import { warnColor } from '../commandUtils.ts'; +import utils from '../utils.ts'; + +export const guildDelete = (bot: Bot, guildId: bigint) => { + log(LT.LOG, `Handling leaving guild ${utils.jsonStringifyBig(guildId)}`); + sendMessage(bot, config.logChannel, { + embeds: [{ + title: 'Removed from Guild', + color: warnColor, + fields: [ + { + name: 'Id:', + value: `${guildId}`, + inline: true, + }, + ], + }], + }).catch((e: Error) => utils.commonLoggers.messageSendError('mod.ts:99', 'Leave Guild', e)); +}; diff --git a/src/events/messageCreate.ts b/src/events/messageCreate.ts new file mode 100644 index 0000000..c81cdd6 --- /dev/null +++ b/src/events/messageCreate.ts @@ -0,0 +1,79 @@ +import config from '../../config.ts'; +import { + // Discordeno deps + Bot, + Message, + botId, + // Log4Deno deps + log, + LT, +} from '../../deps.ts'; +import commands from '../commands/_index.ts'; +import utils from '../utils.ts'; + +export const messageCreate = (bot: Bot, message: Message) => { + // Ignore all other bots + if (message.isFromBot) return; + + // Ignore all messages that are not commands + if (message.content.indexOf(config.prefix) !== 0) { + // Handle @bot messages + if (message.mentionedUserIds[0] === botId && (message.content.trim().startsWith(`<@${botId}>`) || message.content.trim().startsWith(`<@!${botId}>`))) { + commands.handleMentions(bot, message); + } + + // return as we are done handling this command + return; + } + + log(LT.LOG, `Handling ${config.prefix}command message: ${utils.jsonStringifyBig(message)}`); + + // Split into standard command + args format + const args = message.content.slice(config.prefix.length).trim().split(/[ \n]+/g); + const command = args.shift()?.toLowerCase(); + + // All commands below here + switch (command) { + case 'ping': + // s!ping + // Its a ping test, what else do you want. + commands.ping(bot, message); + break; + case 'help': + case 'h': + case '?': + // s!help or s!h or s!? + // Help command, prints from help file + commands.help(bot, message); + break; + case 'info': + case 'i': + // s!info or s!i + // Info command, prints short desc on bot and some links + commands.info(bot, message); + break; + case 'version': + case 'v': + // s!version or s!v + // Returns version of the bot + commands.version(bot, message); + break; + case 'report': + case 'r': + // s!report or s!r (command that failed) + // Manually report a failed roll + commands.report(bot, message, args); + break; + case 'sm': + // s!sm [channelId] + // Manually sends a message thru the bot + if (message.authorId === config.ownerId) { + commands.sendMessage(bot, message, args); + } + break; + default: + // Non-standard commands + console.log(`${command} WIP`); + break; + } +}; diff --git a/src/events/ready.ts b/src/events/ready.ts new file mode 100644 index 0000000..c6967ca --- /dev/null +++ b/src/events/ready.ts @@ -0,0 +1,72 @@ +import config from '../../config.ts'; +import { LOCALMODE } from '../../flags.ts'; +import { + // Discordeno deps + Bot, + ActivityTypes, + editBotNickname, + editBotStatus, + // Log4Deno deps + log, + LT, + // Discordeno deps + sendMessage, +} from '../../deps.ts'; +import { getRandomSweeperLine, successColor } from '../commandUtils.ts'; +import utils from '../utils.ts'; + +export const ready = (bot: Bot) => { + log(LT.INFO, `${config.name} Logged in!`); + editBotStatus(bot, { + activities: [{ + name: 'Booting up . . .', + type: ActivityTypes.Game, + createdAt: new Date().getTime(), + }], + status: 'online', + }); + + // Interval to rotate the status text every 30 seconds to show off more commands + setInterval(async () => { + log(LT.LOG, 'Changing bot status'); + try { + // Wrapped in try-catch due to hard crash possible + editBotStatus(bot, { + activities: [{ + name: getRandomSweeperLine(), + type: ActivityTypes.Game, + createdAt: new Date().getTime(), + }], + status: 'online', + }); + } catch (e) { + log(LT.ERROR, `Failed to update status: ${utils.jsonStringifyBig(e)}`); + } + }, 30000); + + // setTimeout added to make sure the startup message does not error out + setTimeout(() => { + LOCALMODE && editBotNickname(bot, config.devServer, { nick: `LOCAL - ${config.name}` }); + editBotStatus(bot, { + activities: [{ + name: 'Booting Complete', + type: ActivityTypes.Game, + createdAt: new Date().getTime(), + }], + status: 'online', + }); + sendMessage(bot, config.logChannel, { + embeds: [{ + title: `${config.name} is now Online`, + color: successColor, + fields: [ + { + name: 'Version:', + value: `${config.version}`, + inline: true, + }, + ], + }], + }).catch((e: Error) => utils.commonLoggers.messageSendError('mod.ts:88', 'Startup', e)); + }, 1000); +};