diff --git a/src/app.ts b/src/app.ts index 0c6c2ed4..2bebd77e 100644 --- a/src/app.ts +++ b/src/app.ts @@ -11,10 +11,9 @@ import cron from "croner"; import * as conf from "./utils/configHandler.js"; import log from "./utils/logger.js"; -// Handler import messageHandler from "./handler/messageHandler.js"; import messageDeleteHandler from "./handler/messageDeleteHandler.js"; -import BdayHandler from "./handler/bdayHandler.js"; +import { checkBirthdays } from "./handler/bdayHandler.js"; import * as fadingMessageHandler from "./handler/fadingMessageHandler.js"; import * as kysely from "./storage/db.js"; @@ -33,7 +32,7 @@ import { registerAllApplicationCommandsAsGuildCommands, } from "./handler/commandHandler.js"; import quoteReactionHandler from "./handler/quoteHandler.js"; -import NicknameHandler from "./handler/nicknameHandler.js"; +import { rerollNicknames } from "./handler/nicknameHandler.js"; import { connectAndPlaySaufen } from "./handler/voiceHandler.js"; import { reminderHandler } from "./commands/erinnerung.js"; import { endAprilFools, startAprilFools } from "./handler/aprilFoolsHandler.js"; @@ -43,7 +42,7 @@ import { woisVoteReactionHandler, woisVoteScheduler, } from "./commands/woisvote.js"; -import { AoCHandler } from "./commands/aoc.js"; +import { publishAocLeaderBoard } from "./commands/aoc.js"; import { rotate } from "./helper/bannerCarusel.js"; import deleteThreadMessagesHandler from "./handler/deleteThreadMessagesHandler.js"; import * as terminal from "./terminal.js"; @@ -235,14 +234,14 @@ const scheduleCronjobs = async (context: BotContext) => { ); }; - const birthday = new BdayHandler(context); - schedule("1 0 * * *", async () => await birthday.checkBdays()); + schedule("1 0 * * *", async () => await checkBirthdays(context)); - const aoc = new AoCHandler(context); - schedule("0 20 1-25 12 *", async () => await aoc.publishLeaderBoard()); + schedule( + "0 20 1-25 12 *", + async () => await publishAocLeaderBoard(context), + ); - const nicknameHandler = new NicknameHandler(context); - schedule("0 0 * * 0", async () => await nicknameHandler.rerollNicknames()); + schedule("0 0 * * 0", async () => await rerollNicknames(context)); schedule( "36 0-23 * * FRI-SUN", diff --git a/src/commands/aoc.ts b/src/commands/aoc.ts index ecdd7418..1a79b26c 100644 --- a/src/commands/aoc.ts +++ b/src/commands/aoc.ts @@ -147,29 +147,25 @@ const getLeaderBoard = async (): Promise => { return leaderBoard; }; -export class AoCHandler { - constructor(private readonly context: BotContext) {} +export async function publishAocLeaderBoard(context: BotContext) { + log.debug("Entered `AoCHandler#publishLeaderBoard`"); - async publishLeaderBoard() { - log.debug("Entered `AoCHandler#publishLeaderBoard`"); - - const targetChannel = this.context.guild.channels.cache.get( - aocConfig.targetChannelId, - ); - if (!targetChannel) { - log.error(`Target channel ${aocConfig.targetChannelId} not found`); - return; - } - - const channel = targetChannel as discord.ThreadChannel; - const leaderBoard = await getLeaderBoard(); - const embed = createEmbedFromLeaderBoard( - aocConfig.userMap, - leaderBoard, - "local_score", - ); - return channel.send({ embeds: [embed] }); + const targetChannel = context.guild.channels.cache.get( + aocConfig.targetChannelId, + ); + if (!targetChannel) { + log.error(`Target channel ${aocConfig.targetChannelId} not found`); + return; } + + const channel = targetChannel as discord.ThreadChannel; + const leaderBoard = await getLeaderBoard(); + const embed = createEmbedFromLeaderBoard( + aocConfig.userMap, + leaderBoard, + "local_score", + ); + return channel.send({ embeds: [embed] }); } export class AoCCommand implements ApplicationCommand { diff --git a/src/handler/bdayHandler.ts b/src/handler/bdayHandler.ts index 9e7edc26..f307d57a 100644 --- a/src/handler/bdayHandler.ts +++ b/src/handler/bdayHandler.ts @@ -5,66 +5,65 @@ import * as birthday from "../storage/birthday.js"; import type { BotContext } from "../context.js"; -export default class BdayHandler { - constructor(readonly context: BotContext) {} +/** + * Iterates over the list of bdays and assigns a role to people having their cake day. + */ +export async function checkBirthdays(context: BotContext): Promise { + log.debug("Entered `BdayHandler#checkBirthdays`"); - /** - * Iterates over the list of bdays and assigns a role to people having their cake day. - */ - async checkBdays(): Promise { - log.debug("Entered `BdayHandler#checkBdays`"); + const birthdayRole = context.roles.bday; + // const todaysBirthdays = await Birthday.getTodaysBirthdays(); + const todaysBirthdays = await birthday.getTodaysBirthdays(); - const birthdayRole = this.context.roles.bday; - // const todaysBirthdays = await Birthday.getTodaysBirthdays(); - const todaysBirthdays = await birthday.getTodaysBirthdays(); + const todaysBirthdaysAsMembers = todaysBirthdays + .map(b => context.guild.members.cache.get(b.userId)) + .filter( + b => + b !== undefined && + b.roles.cache.get(birthdayRole.id) === undefined, + ); - const todaysBirthdaysAsMembers = todaysBirthdays - .map(b => this.context.guild.members.cache.get(b.userId)) - .filter( - b => - b !== undefined && - b.roles.cache.get(birthdayRole.id) === undefined, - ); + const memberWithRoleThatDontHaveBirthday = context.guild.members.cache + .filter(m => m.roles.cache.get(birthdayRole.id) !== undefined) + .filter(m => !todaysBirthdays.some(b => b.userId === m.id)); - const memberWithRoleThatDontHaveBirthday = - this.context.guild.members.cache - .filter(m => m.roles.cache.get(birthdayRole.id) !== undefined) - .filter(m => !todaysBirthdays.some(b => b.userId === m.id)); + if (todaysBirthdaysAsMembers.length > 0) { + await Promise.all( + todaysBirthdaysAsMembers.map(member => + member?.roles?.add(birthdayRole), + ), + ); + await sendBirthdayMessage( + context, + todaysBirthdaysAsMembers as GuildMember[], + birthdayRole, + ); + } - if (todaysBirthdaysAsMembers.length > 0) { - await Promise.all( - todaysBirthdaysAsMembers.map(member => - member?.roles?.add(birthdayRole), - ), - ); - await this.sendBirthdayMessage( - todaysBirthdaysAsMembers as GuildMember[], - birthdayRole, - ); + for (const member of memberWithRoleThatDontHaveBirthday.values()) { + if (!member.roles.cache.find(t => t.id === birthdayRole.id)) { + continue; } - for (const member of memberWithRoleThatDontHaveBirthday.values()) { - if (!member.roles.cache.find(t => t.id === birthdayRole.id)) - continue; - - try { - await member.roles.remove(birthdayRole); - } catch (e) { - log.error( - e, - `Could not remove role "${birthdayRole}" from "${member}"`, - ); - } + try { + await member.roles.remove(birthdayRole); + } catch (e) { + log.error( + e, + `Could not remove role "${birthdayRole}" from "${member}"`, + ); } } +} - async sendBirthdayMessage( - users: GuildMember[], - birthdayRole: Role, - ): Promise { - const plural = users.length > 1; - await this.context.textChannels.hauptchat.send( - `Heute kann es regnen, +async function sendBirthdayMessage( + context: BotContext, + users: GuildMember[], + birthdayRole: Role, +): Promise { + const plural = users.length > 1; + await context.textChannels.hauptchat.send( + `Heute kann es regnen, stürmen oder schneien, denn ${plural ? "ihr" : "du"} ${plural ? "strahlt" : "strahlst"} ja selber wie der Sonnenschein. @@ -81,6 +80,5 @@ export default class BdayHandler { wir gratulieren ${plural ? "euch" : "dir"}, ${birthdayRole} ${users.map(u => u).join()}`.replaceAll(/\n\s+/g, "\n"), - ); - } + ); } diff --git a/src/handler/nicknameHandler.ts b/src/handler/nicknameHandler.ts index 8cfa0a79..6152f83b 100644 --- a/src/handler/nicknameHandler.ts +++ b/src/handler/nicknameHandler.ts @@ -2,39 +2,33 @@ import * as nickName from "../storage/nickName.js"; import log from "../utils/logger.js"; import type { BotContext } from "../context.js"; -export default class NicknameHandler { - constructor(private readonly context: BotContext) {} +export async function rerollNicknames(context: BotContext) { + log.debug("Entered `rerollNicknames`"); - async rerollNicknames() { - log.debug("Entered `rerollNicknames`"); + const allUsersAndNames = Object.entries(await nickName.allUsersAndNames()); - const allUsersAndNames = Object.entries( - await nickName.allUsersAndNames(), - ); - - const updateTasks = allUsersAndNames.map(([userId, nicknames]) => - this.updateNickname(userId, nicknames), - ); - await Promise.all(updateTasks); - } + const updateTasks = allUsersAndNames.map(([userId, nicknames]) => + updateNickname(context, userId, nicknames), + ); + await Promise.all(updateTasks); +} - async updateNickname(userId: string, storedNicknames: string[]) { - try { - const member = this.context.guild.members.cache.find( - m => m.id === userId, - ); - if (!member) return; - const nicknames = [member.user.username, ...storedNicknames]; - const pickableNicknames = nicknames.filter( - n => n !== member.nickname, - ); - const randomizedNickname = - pickableNicknames[ - Math.floor(Math.random() * pickableNicknames.length) - ]; - await member.setNickname(randomizedNickname); - } catch (err) { - log.error(err, `Couldn't update user '${userId}' nickname`); - } +async function updateNickname( + context: BotContext, + userId: string, + storedNicknames: string[], +) { + try { + const member = context.guild.members.cache.find(m => m.id === userId); + if (!member) return; + const nicknames = [member.user.username, ...storedNicknames]; + const pickableNicknames = nicknames.filter(n => n !== member.nickname); + const randomizedNickname = + pickableNicknames[ + Math.floor(Math.random() * pickableNicknames.length) + ]; + await member.setNickname(randomizedNickname); + } catch (err) { + log.error(err, `Couldn't update user '${userId}' nickname`); } }