diff --git a/src/events/guildCreate.ts b/src/events/guildCreate.ts index df1e16c..62f4ddc 100644 --- a/src/events/guildCreate.ts +++ b/src/events/guildCreate.ts @@ -4,6 +4,8 @@ import { CommandClient, Event, Guild } from 'athena-prime'; // Internal Imports import { Database } from '../shared/Database'; +// --------------- + class GuildCreateEvent extends Event { event: string = 'guildCreate' as const; diff --git a/src/events/handle-thread-create.ts b/src/events/handle-thread-create.ts deleted file mode 100644 index a3729da..0000000 --- a/src/events/handle-thread-create.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AnyThreadChannel } from 'discord.js'; - -export async function handleThreadCreate(thread: AnyThreadChannel, newlyCreated: boolean) { - try { - await thread.join(); - } catch (e) { - console.error('Failed to join thread:'); - console.error(e); - } - -} \ No newline at end of file diff --git a/src/events/handle-voice-state-update.ts b/src/events/handle-voice-state-update.ts deleted file mode 100644 index 61d6f2c..0000000 --- a/src/events/handle-voice-state-update.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Guild, GuildMember, GuildTextBasedChannel, time, VoiceBasedChannel, VoiceState } from 'discord.js'; -import { Database } from '../shared/Database'; - -export async function handleVoiceStateUpdate(oldState: VoiceState, newState: VoiceState) { - // The logChannel declaration being inside is purposeful, as this event is fired a lot for users talking. - if (newState.channelId != null && oldState.channelId != null && newState.channelId != oldState.channelId) { - const logChannel = await getVoiceLogsChannel(newState.guild); - if (!logChannel) return; - - await sendMovedMessage(logChannel, newState.member!, oldState.channel!, newState.channel!); - } else if (oldState.channelId == null && newState.channelId != null) { - const logChannel = await getVoiceLogsChannel(newState.guild); - if (!logChannel) return; - - await sendJoinMessage(logChannel, newState.member!, newState.channel!); - } else if (newState.channelId == null && oldState.channelId != null) { - const logChannel = await getVoiceLogsChannel(newState.guild); - if (!logChannel) return; - - await sendLeftMessage(logChannel, newState.member!, oldState.channel!); - } -} - -async function sendJoinMessage(channel: GuildTextBasedChannel, member: GuildMember, voiceChannel: VoiceBasedChannel) { - await channel.send(`${member} joined ${voiceChannel} at ${time()}`); -} - -async function sendLeftMessage(channel: GuildTextBasedChannel, member: GuildMember, voiceChannel: VoiceBasedChannel) { - await channel.send(`${member} left ${voiceChannel} at ${time()}`); -} - -async function sendMovedMessage(channel: GuildTextBasedChannel, member: GuildMember, oldVoiceChannel: VoiceBasedChannel, newVoiceChannel: VoiceBasedChannel) { - await channel.send(`${member} moved from ${oldVoiceChannel} to ${newVoiceChannel} at ${time()}`); -} - -async function getVoiceLogsChannel(guild: Guild): Promise { - const settings = await Database.getGuildSettings(guild.id); - - if (!settings || !settings.voice_logs_channel_id) return; - - const channel = await guild.channels.fetch(settings.voice_logs_channel_id); - - if (!channel || !channel.isSendable()) return; - - return channel as GuildTextBasedChannel; -} \ No newline at end of file diff --git a/src/events/index.ts b/src/events/index.ts index 72d583f..62133c6 100644 --- a/src/events/index.ts +++ b/src/events/index.ts @@ -3,7 +3,10 @@ import guildBanRemove from './guildBanRemove'; import guildCreate from './guildCreate'; import guildMemberAdd from './guildMemberAdd'; export * from './handle-message'; -export * from './handle-thread-create'; -export * from './handle-voice-state-update'; +import threadCreate from './threadCreate'; -export default [guildBanRemove, guildCreate, guildMemberAdd]; \ No newline at end of file +import voiceChannelJoin from './voiceChannelJoin'; +import voiceChannelLeft from './voiceChannelLeft'; +import voiceChannelSwitch from './voiceChannelSwitch'; + +export default [guildBanRemove, guildCreate, guildMemberAdd, threadCreate, voiceChannelJoin, voiceChannelLeft, voiceChannelSwitch]; \ No newline at end of file diff --git a/src/events/threadCreate.ts b/src/events/threadCreate.ts new file mode 100644 index 0000000..9c89488 --- /dev/null +++ b/src/events/threadCreate.ts @@ -0,0 +1,14 @@ +// External Imports +import { CommandClient, Event, ThreadChannel } from 'athena-prime'; + +// --------------- + +class ThreadCreateEvent extends Event { + event: string = 'threadCreate' as const; + + async handle(context: CommandClient, channel: ThreadChannel) { + await context.joinThread(channel.id); + } +} + +export default new ThreadCreateEvent('threadCreate'); \ No newline at end of file diff --git a/src/events/voiceChannelJoin.ts b/src/events/voiceChannelJoin.ts new file mode 100644 index 0000000..1df33d4 --- /dev/null +++ b/src/events/voiceChannelJoin.ts @@ -0,0 +1,38 @@ +// External Imports +import { CommandClient, Event, Member, GuildVoiceChannel } from "athena-prime"; + +// Internal Imports +import { Database } from "../shared/Database"; +import { SetSeverity } from "../utils"; + +// --------------- + +class VoiceChannelJoinEvent extends Event { + event: string = 'voiceChannelJoin' as const; + + async handle(context: CommandClient, member: Member, channel: GuildVoiceChannel) { + const settings = await Database.GetOrCreateSettings(channel.guild.id); + if (!settings.voice_logs_channel_id) return; + + await context.createMessage(settings.voice_logs_channel_id, { + embed: { + ...SetSeverity('success'), + + author: { + name: member.username, + icon_url: member.avatarURL + }, + + fields: [ + { name: 'Member', value: `${member.username} (${member.mention})`, inline: true }, + { name: 'Channel', value: `${channel.mention}`, inline: true }, + { name: 'Time', value: ``, inline: true }, + ], + + title: 'Joined Voice Channel' + } + }); + } +} + +export default new VoiceChannelJoinEvent('voiceChannelJoin'); \ No newline at end of file diff --git a/src/events/voiceChannelLeft.ts b/src/events/voiceChannelLeft.ts new file mode 100644 index 0000000..2aa13a2 --- /dev/null +++ b/src/events/voiceChannelLeft.ts @@ -0,0 +1,38 @@ +// External Imports +import { CommandClient, Event, Member, GuildVoiceChannel } from "athena-prime"; + +// Internal Imports +import { Database } from "../shared/Database"; +import { SetSeverity } from "../utils"; + +// --------------- + +class VoiceChannelLeftEvent extends Event { + event: string = 'voiceChannelLeft' as const; + + async handle(context: CommandClient, member: Member, channel: GuildVoiceChannel) { + const settings = await Database.GetOrCreateSettings(channel.guild.id); + if (!settings.voice_logs_channel_id) return; + + await context.createMessage(settings.voice_logs_channel_id, { + embed: { + author: { + name: member.username, + icon_url: member.avatarURL + }, + + ...SetSeverity('error'), + + fields: [ + { name: 'Member', value: `${member.username} (${member.mention})`, inline: true }, + { name: 'Channel', value: `${channel.mention}`, inline: true }, + { name: 'Time', value: ``, inline: true }, + ], + + title: 'Left Voice Channel' + } + }); + } +} + +export default new VoiceChannelLeftEvent('voiceChannelLeft'); \ No newline at end of file diff --git a/src/events/voiceChannelSwitch.ts b/src/events/voiceChannelSwitch.ts new file mode 100644 index 0000000..1e3168b --- /dev/null +++ b/src/events/voiceChannelSwitch.ts @@ -0,0 +1,38 @@ +// External Imports +import { CommandClient, Event, Member, GuildVoiceChannel } from "athena-prime"; + +// Internal Imports +import { Database } from "../shared/Database"; +import { SetSeverity } from "../utils"; + +// --------------- + +class VoiceChannelSwitchEvent extends Event { + event: string = 'voiceChannelSwitch' as const; + + async handle(context: CommandClient, member: Member, channel: GuildVoiceChannel, old: GuildVoiceChannel) { + const settings = await Database.GetOrCreateSettings(channel.guild.id); + if (!settings.voice_logs_channel_id) return; + + await context.createMessage(settings.voice_logs_channel_id, { + embed: { + ...SetSeverity('warning'), + + author: { + name: member.username, + icon_url: member.avatarURL + }, + + fields: [ + { name: 'Member', value: `${member.username} (${member.mention})`, inline: true }, + { name: 'Channel', value: `${old.mention} -> ${channel.mention}`, inline: true }, + { name: 'Time', value: ``, inline: true }, + ], + + title: 'Moved Voice Channel' + } + }); + } +} + +export default new VoiceChannelSwitchEvent('voiceChannelSwitch'); \ No newline at end of file