diff --git a/src/bot.ts b/src/bot.ts index 8f6d9d6..323948d 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,105 +1,124 @@ import { - Client, - GatewayIntentBits, - OAuth2Scopes, - PermissionFlagsBits + BaseInteraction, + CacheType, + Client, + GatewayIntentBits, + Interaction, + Message, + OAuth2Scopes, + PermissionFlagsBits, + VoiceState } from 'discord.js'; import { Logger } from './utils/log'; import { config } from './utils/config'; export class Bot { - private client: Client | undefined; + private client: Client | undefined; - private readonly token: string; - private readonly clientId: string; + private readonly token: string; + private readonly clientId: string; - private readonly log: Logger; + private readonly log: Logger; - /* + /* class methods */ - private constructor() { - this.log = new Logger('Bot'); + private constructor() { + this.log = new Logger('Bot'); - this.token = config.token; - this.clientId = config.client_id; - } + this.token = config.token; + this.clientId = config.client_id; + } - public async init(): Promise { - this.log.info('Bot init'); + public async init(): Promise { + this.log.info('Bot init'); - if (this.client) - throw new Error('Client already exists, was init called twice?'); + if (this.client) + throw new Error('Client already exists, was init called twice?'); - this.log.info('Instantiating client'); - this.client = new Client({ - intents: [ - GatewayIntentBits.Guilds, - GatewayIntentBits.GuildMessages, - GatewayIntentBits.GuildVoiceStates, - GatewayIntentBits.MessageContent - ] - }); + this.log.info('Instantiating client'); + this.client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.GuildVoiceStates, + GatewayIntentBits.MessageContent + ] + }); - this.log.info('Registering callbacks'); - this.client.on('clientReady', () => this.onReady()); - this.client.on('error', (err) => this.onError(err, false)); - this.client.on('shardError', (err) => this.onError(err, true)); + this.log.info('Registering callbacks'); + this.client.on('clientReady', () => this.onReady()); + this.client.on('error', (err) => this.onError(err, false)); + this.client.on('shardError', (err) => this.onError(err, true)); + this.client.on('messageCreate', (message: Message) => this.onMessage(message)); + this.client.on('interactionCreate', (interaction: Interaction) => this.onInteraction(interaction)); + this.client.on('voiceStateUpdate', (oldState: VoiceState, newState: VoiceState) => this.onVoiceStateUpdate(oldState, newState)); - this.log.info('Logging in...'); - await this.client.login(this.token); - } + this.log.info('Logging in...'); + await this.client.login(this.token); + } - /* + /* event listeners */ - private onReady(): void { - this.log.info('Logged in'); + private onReady(): void { + this.log.info('Logged in'); - const inviteLink = this.client?.generateInvite({ - scopes: [OAuth2Scopes.ApplicationsCommands, OAuth2Scopes.Bot], - permissions: [ - PermissionFlagsBits.AddReactions, - PermissionFlagsBits.AttachFiles, - PermissionFlagsBits.ChangeNickname, - PermissionFlagsBits.Connect, - PermissionFlagsBits.Speak, - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.ReadMessageHistory, - PermissionFlagsBits.SendMessages, - PermissionFlagsBits.SendMessagesInThreads, - PermissionFlagsBits.SendVoiceMessages, - PermissionFlagsBits.EmbedLinks - ] - }); + const inviteLink = this.client?.generateInvite({ + scopes: [OAuth2Scopes.ApplicationsCommands, OAuth2Scopes.Bot], + permissions: [ + PermissionFlagsBits.AddReactions, + PermissionFlagsBits.AttachFiles, + PermissionFlagsBits.ChangeNickname, + PermissionFlagsBits.Connect, + PermissionFlagsBits.Speak, + PermissionFlagsBits.ViewChannel, + PermissionFlagsBits.ReadMessageHistory, + PermissionFlagsBits.SendMessages, + PermissionFlagsBits.SendMessagesInThreads, + PermissionFlagsBits.SendVoiceMessages, + PermissionFlagsBits.EmbedLinks + ] + }); - this.log.info('Invite link: %s', inviteLink); - } + this.log.info('Invite link: %s', inviteLink); + } - private onError(error: Error, isShardError: boolean): void { - if (isShardError) - this.log.error( - 'A shard error ocurred: %s - %s - %s', - error.name, - error.message, - error.stack - ); - else - this.log.error( - 'An error ocurred: %s - %s - %s', - error.name, - error.message, - error.stack - ); - } + private onError(error: Error, isShardError: boolean): void { + if (isShardError) + this.log.error( + 'A shard error ocurred: %s - %s - %s', + error.name, + error.message, + error.stack + ); + else + this.log.error( + 'An error ocurred: %s - %s - %s', + error.name, + error.message, + error.stack + ); + } + private async onInteraction(interaction: BaseInteraction): Promise { - /* + } + + private async onMessage(message: Message): Promise { + + } + + private async onVoiceStateUpdate(oldState: VoiceState, newState: VoiceState): Promise { + + } + + /* singleton logic */ - static #instance: Bot | null = null; + static #instance: Bot | null = null; - public static get get(): Bot { - if (!Bot.#instance) Bot.#instance = new Bot(); - return Bot.#instance; - } + public static get get(): Bot { + if (!Bot.#instance) Bot.#instance = new Bot(); + return Bot.#instance; + } }