(rewrite): Updated more events.

This commit is contained in:
2026-08-11 11:16:21 +08:00
parent 32b06a384b
commit efd5df89ca
8 changed files with 136 additions and 60 deletions
+2
View File
@@ -4,6 +4,8 @@ import { CommandClient, Event, Guild } from 'athena-prime';
// Internal Imports
import { Database } from '../shared/Database';
// ---------------
class GuildCreateEvent extends Event<CommandClient> {
event: string = 'guildCreate' as const;
-11
View File
@@ -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);
}
}
-46
View File
@@ -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<GuildTextBasedChannel | undefined> {
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;
}
+6 -3
View File
@@ -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];
import voiceChannelJoin from './voiceChannelJoin';
import voiceChannelLeft from './voiceChannelLeft';
import voiceChannelSwitch from './voiceChannelSwitch';
export default [guildBanRemove, guildCreate, guildMemberAdd, threadCreate, voiceChannelJoin, voiceChannelLeft, voiceChannelSwitch];
+14
View File
@@ -0,0 +1,14 @@
// External Imports
import { CommandClient, Event, ThreadChannel } from 'athena-prime';
// ---------------
class ThreadCreateEvent extends Event<CommandClient> {
event: string = 'threadCreate' as const;
async handle(context: CommandClient<any, any>, channel: ThreadChannel) {
await context.joinThread(channel.id);
}
}
export default new ThreadCreateEvent('threadCreate');
+38
View File
@@ -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<CommandClient> {
event: string = 'voiceChannelJoin' as const;
async handle(context: CommandClient<any, any>, 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: `<t:${new Date().toISOString()}>`, inline: true },
],
title: 'Joined Voice Channel'
}
});
}
}
export default new VoiceChannelJoinEvent('voiceChannelJoin');
+38
View File
@@ -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<CommandClient> {
event: string = 'voiceChannelLeft' as const;
async handle(context: CommandClient<any, any>, 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: `<t:${new Date().toISOString()}>`, inline: true },
],
title: 'Left Voice Channel'
}
});
}
}
export default new VoiceChannelLeftEvent('voiceChannelLeft');
+38
View File
@@ -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<CommandClient> {
event: string = 'voiceChannelSwitch' as const;
async handle(context: CommandClient<any, any>, 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: `<t:${new Date().toISOString()}>`, inline: true },
],
title: 'Moved Voice Channel'
}
});
}
}
export default new VoiceChannelSwitchEvent('voiceChannelSwitch');