add more listeners

add activity service
add log channel service
This commit is contained in:
2026-02-17 23:07:17 +01:00
parent 071fe2f891
commit aa88d30244
14 changed files with 159 additions and 37 deletions

View File

@@ -0,0 +1,7 @@
import { logChannelService } from "features/log-channel/log-channel.service";
import { logger } from "lib/common-logger";
export const handleShutdown = async () => {
logger.info("Bot is shutting down...");
await logChannelService.sendLogMessage("Bot is shutting down...");
};

View File

@@ -12,25 +12,6 @@ export default class DiscordController extends EventEmitter {
super(); super();
let channelListeners = new Map(); let channelListeners = new Map();
// log when running
client.once("ready", async () => {
const channels = client.channels;
const logChannel = channels.cache.get(config.discord.channelIdLog);
if (logChannel?.isTextBased() && logChannel?.isSendable()) {
try {
console.log("bot is online");
await logChannel.send("wieder online!!!");
} catch (error) {
console.error("failed to send online message:", error);
}
} else {
console.error("log channel is not valid or sendable.");
}
await this.setActivity(100);
console.log("ready");
});
process.on("exit", async () => { process.on("exit", async () => {
const channels = client.channels; const channels = client.channels;
const logChannel = channels.cache.get(config.discord.channelIdLog); const logChannel = channels.cache.get(config.discord.channelIdLog);
@@ -144,24 +125,6 @@ export default class DiscordController extends EventEmitter {
} }
} }
async handleShutdown(logChannel: Channel | undefined) {
if (logChannel?.isTextBased() && logChannel?.isSendable()) {
try {
await logChannel.send("bot is going offline...");
} catch (error) {
console.error("failed to send offline message:", error);
}
} else {
console.error("log channel is not valid or sendable.");
}
await this.setActivity(0);
console.log("bot is offline.");
}
async init() {
await this.discordService.init();
}
async handleInteraction(interaction: Interaction<CacheType>) { async handleInteraction(interaction: Interaction<CacheType>) {
if (interaction.isModalSubmit()) { if (interaction.isModalSubmit()) {
await this.handleModalSubmit(interaction); await this.handleModalSubmit(interaction);

View File

@@ -0,0 +1,19 @@
import z from "zod";
export const Activities = z.enum([
"playing",
"streaming",
"listening",
"watching",
"competing",
"invisible",
]);
export const ActivityLocales: Record<z.infer<typeof Activities>, string> = {
playing: "spielt sudoku",
streaming: "streamt sudoku",
listening: "hört sudoku",
watching: "schaut sudoku",
competing: "wettstreitet sudoku",
invisible: "versteckt sudoku",
};

View File

@@ -0,0 +1,27 @@
import client from "lib/client";
import type z from "zod";
import { type Activities, ActivityLocales } from "./activity.schema";
/**
* Set the activity of the bot. This can be used to show that the bot is playing a game, listening to music, etc.
*/
export class ActivityService {
async set(activity: z.output<typeof Activities>) {
if (activity === "invisible") {
client.user?.setPresence({
status: "invisible",
});
client.user?.setActivity(" ", { type: 0 });
return;
}
client.user?.setActivity(ActivityLocales[activity], {
type: 0,
});
client.user?.setPresence({
status: "online",
});
}
}
export const activityService = new ActivityService();

View File

@@ -0,0 +1,26 @@
import { config } from "config";
import client from "lib/client";
import { logger } from "lib/common-logger";
export class LogChannelService {
private logChannelId = config.channelMapping.text.bot;
async getLogChannel() {
const logChannel = await client.channels.fetch(this.logChannelId);
if (logChannel?.isTextBased() && logChannel.isSendable()) {
return logChannel;
} else {
logger.fatal("Log channel not found or is not text-based.");
throw new Error("Log channel not found or is not text-based");
}
}
async sendLogMessage(message: string) {
const logChannel = await this.getLogChannel();
await logChannel.send(message);
}
}
export const logChannelService = new LogChannelService();

View File

@@ -0,0 +1,3 @@
import { createLogger } from "@avocadi/bot-core/lib/logger";
export const logger = createLogger("DiscordAdapter");

View File

@@ -0,0 +1,5 @@
import "./ready.listener";
import "./guild-member-add.listener";
import "./voice-state/voice-state.listener";
import "./message-reaction-add.listener";
import "./message-reaction-remove.listener";

View File

@@ -0,0 +1,5 @@
import type { ButtonInteraction } from "discord.js";
export const handleButtonInteraction = async (
interaction: ButtonInteraction,
) => {};

View File

@@ -0,0 +1,5 @@
import type { ChatInputCommandInteraction } from "discord.js";
export const handleChatInputCommandInteraction = async (
interaction: ChatInputCommandInteraction,
) => {};

View File

@@ -0,0 +1,5 @@
import type { ModalSubmitInteraction } from "discord.js";
export const handleModalSubmitInteraction = async (
interaction: ModalSubmitInteraction,
) => {};

View File

@@ -0,0 +1,20 @@
import client from "lib/client";
import { handleButtonInteraction } from "./handle-button";
import { handleChatInputCommandInteraction } from "./handle-chat-input-command";
import { handleModalSubmitInteraction } from "./handle-modal-submit";
client.on("interactionCreate", async (interaction) => {
if (interaction.isModalSubmit()) {
await handleModalSubmitInteraction(interaction);
return;
}
if (interaction.isChatInputCommand()) {
await handleChatInputCommandInteraction(interaction);
return;
}
if (interaction.isButton()) {
await handleButtonInteraction(interaction);
return;
}
});

View File

@@ -0,0 +1,22 @@
import { config } from "config";
import { activityService } from "features/activity/activity.service";
import client from "lib/client";
import { logger } from "lib/common-logger";
client.once("ready", async () => {
const channels = client.channels;
const logChannel = channels.cache.get(config.channelMapping.text.bot);
if (logChannel?.isTextBased() && logChannel?.isSendable()) {
try {
logger.info("bot is online");
await logChannel.send("wieder online!!!");
} catch (error) {
logger.error("failed to send online message:", error);
}
} else {
logger.error("log channel is not valid or sendable.");
}
await activityService.set("playing");
logger.info("ready");
});

View File

@@ -0,0 +1,15 @@
import { handleShutdown } from "actions/shutdown";
process.on("exit", async () => {
await handleShutdown();
});
process.on("SIGINT", async () => {
await handleShutdown();
process.exit(0);
});
process.on("SIGTERM", async () => {
await handleShutdown();
process.exit(0);
});