diff --git a/adapters/discord/src/listeners/reactions/reactions.listener.ts b/adapters/discord/src/listeners/reactions/reactions.listener.ts index 5671771..c1f3fee 100644 --- a/adapters/discord/src/listeners/reactions/reactions.listener.ts +++ b/adapters/discord/src/listeners/reactions/reactions.listener.ts @@ -1,5 +1,4 @@ import { createLogger } from "@avocadi/bot-core/lib/logger"; -import type { User } from "@fluxerjs/core"; import { config } from "config"; import { RolesService } from "entities/roles/roles.service"; import { acceptUserService } from "features/accept-user/accept-user.service"; @@ -8,15 +7,6 @@ import client from "lib/client"; const logger = createLogger("ReactionsListener"); -// client.on("messageReactionRemove", async (reaction, user) => { -// reactionRolesService.handleReaction( -// reaction, -// user, -// Roles.enum.people, -// "remove", -// ); -// }); - client.on("messageReactionAdd", async (reaction, user) => { const guild = reaction.message.guild; if (!guild) { diff --git a/adapters/fluxer/index.ts b/adapters/fluxer/index.ts deleted file mode 100644 index f67b2c6..0000000 --- a/adapters/fluxer/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello via Bun!"); \ No newline at end of file diff --git a/adapters/fluxer/package.json b/adapters/fluxer/package.json index f28fe36..1dbb123 100644 --- a/adapters/fluxer/package.json +++ b/adapters/fluxer/package.json @@ -17,7 +17,7 @@ "dependencies": { "@avocadi/bot-core": "workspace:*", "@discordjs/rest": "^2.6.0", - "@fluxerjs/core": "^1.1.7", + "@fluxerjs/core": "^1.2.3", "cron": "^4.4.0", "dotenv": "^17.3.1", "dotenv-expand": "^12.0.3", diff --git a/adapters/fluxer/src/entities/roles/roles.service.ts b/adapters/fluxer/src/entities/roles/roles.service.ts new file mode 100644 index 0000000..187fec6 --- /dev/null +++ b/adapters/fluxer/src/entities/roles/roles.service.ts @@ -0,0 +1,39 @@ +import type { RolesServiceInterface } from "@avocadi/bot-core/entities/roles/roles.service"; +import { createLogger } from "@avocadi/bot-core/lib/logger"; +import type { GuildMember } from "@fluxerjs/core"; + +export class RolesService implements RolesServiceInterface { + private logger = createLogger("RolesService"); + + async assignRole(user: GuildMember, roleId: string) { + const roleToAssign = user.guild.roles.has(roleId); + if (!roleToAssign) { + this.logger.error( + `Role ${roleId} not found in guild ${user.guild.name}.`, + ); + return; + } + this.logger.info(`Role ${roleId} found in guild ${user.guild.name}.`); + await user.guild.addRoleToMember(user.id, roleId); + } + + async removeRole(user: GuildMember, role: string) { + const roleToRemove = user.guild.roles.has(role); + if (!roleToRemove) { + this.logger.error(`Role ${role} not found in guild ${user.guild.name}.`); + return; + } + + await user.guild.removeRoleFromMember(user.id, role); + } + + /*** get all roles of GuildMember */ + async getRoles(user: GuildMember) { + return user.roles.map((role) => role); + } + + /*** check if GuildMember has a specific role */ + async hasRole(user: GuildMember, role: string) { + return user.roles.includes(role); + } +} diff --git a/adapters/fluxer/src/features/accept-user/accept-user.service.ts b/adapters/fluxer/src/features/accept-user/accept-user.service.ts new file mode 100644 index 0000000..524e434 --- /dev/null +++ b/adapters/fluxer/src/features/accept-user/accept-user.service.ts @@ -0,0 +1,10 @@ +import { AcceptUserService } from "@avocadi/bot-core/features/accept-user/accept-user.service"; +import { i18nService } from "@avocadi/bot-core/lib/i18n"; +import type { User } from "@fluxerjs/core"; +import { messagesService } from "entities/messages/messages.service"; + +export const acceptUserService = new AcceptUserService( + messagesService, + i18nService, + "en", +); diff --git a/adapters/fluxer/src/features/reactions/reactions.listener.ts b/adapters/fluxer/src/features/reactions/reactions.listener.ts new file mode 100644 index 0000000..ce2a912 --- /dev/null +++ b/adapters/fluxer/src/features/reactions/reactions.listener.ts @@ -0,0 +1,60 @@ +import { createLogger } from "@avocadi/bot-core/lib/logger"; +import { Events, type MessageReaction, type User } from "@fluxerjs/core"; +import { config } from "config"; +import { RolesService } from "entities/roles/roles.service"; +import { acceptUserService } from "features/accept-user/accept-user.service"; +import { logChannelService } from "features/log-channel/log-channel.service"; +import client from "lib/client"; + +const logger = createLogger("ReactionsListener"); + +client.on( + Events.MessageReactionAdd, + async (reaction: MessageReaction, user: User) => { + const guild = reaction.guild; + if (!guild) { + logger.error(`Guild not found for message ${reaction.messageId}.`); + return; + } + logger.info(`Guild found for message ${reaction.messageId}.`); + + const channelIntroduction = await client.channels.fetch( + config.channelMapping.text.introduction, + ); + + const message = await reaction.fetchMessage(); + + // check if valid channel + if (message.guild?.id && message.channel?.id === channelIntroduction?.id) { + logger.info("valid channel"); + + const member = guild?.members.get(user.id); + + // check if member who reacted has role MOD + if (member?.roles.includes(config.roleMapping.mod)) { + const messageAuthor_User = message.author; + + if (messageAuthor_User) { + const roleMemberId = config.roleMapping.people; + + const messageAuthor_GuildMember = await guild?.fetchMember( + messageAuthor_User.id, + ); + if ( + !messageAuthor_GuildMember?.roles.find((r) => r === roleMemberId) + ) { + logger.info(`accepting ${messageAuthor_User?.username}...`); + + const rolesService = new RolesService(); + rolesService.assignRole(messageAuthor_GuildMember, roleMemberId); + + await acceptUserService.sendDmAcceptUser(messageAuthor_User); + await logChannelService.sendLogMessage( + `introduction of <@${messageAuthor_User.id}> (${messageAuthor_User.username}) got accepted`, + ); + } + } + } + } + }, +); diff --git a/adapters/fluxer/src/listeners/reactions/reactions.listener.ts b/adapters/fluxer/src/listeners/reactions/reactions.listener.ts new file mode 100644 index 0000000..08d5082 --- /dev/null +++ b/adapters/fluxer/src/listeners/reactions/reactions.listener.ts @@ -0,0 +1,58 @@ +import { createLogger } from "@avocadi/bot-core/lib/logger"; +import { Events } from "@fluxerjs/core"; +import { config } from "config"; +import { acceptUserService } from "features/accept-user/accept-user.service"; +import { logChannelService } from "features/log-channel/log-channel.service"; +import client from "lib/client"; + +const logger = createLogger("ReactionsListener"); + +client.on(Events.MessageReactionAdd, async (reaction, user) => { + const guild = reaction.message.guild; + if (!guild) { + logger.error(`Guild not found for message ${reaction.message.id}.`); + return; + } + logger.info(`Guild found for message ${reaction.message.id}.`); + + const channelIntroduction = await client.channels.fetch( + config.channelMapping.text.introduction, + ); + + const message = await reaction.message.fetch(); + + // check if valid channel + if (message.guild?.id && message.channel?.id === channelIntroduction?.id) { + logger.info("valid channel"); + + const member = guild?.members.cache.get(user.id); + + // check if member who reacted has role MOD + if (member?.roles.cache.get(config.roleMapping.mod)) { + const messageAuthor_User = await message.author.fetch(); + + if (messageAuthor_User) { + const roleMemberId = config.roleMapping.people; + + const messageAuthor_GuildMember = await guild?.members.fetch( + messageAuthor_User.id, + ); + if ( + !messageAuthor_GuildMember?.roles.cache.find( + (r) => r.id === roleMemberId, + ) + ) { + logger.info(`accepting ${messageAuthor_User?.username}...`); + + const rolesService = new RolesService(); + rolesService.assignRole(messageAuthor_GuildMember, roleMemberId); + + await acceptUserService.sendDmAcceptUser(messageAuthor_User); + await logChannelService.sendLogMessage( + `introduction of <@${messageAuthor_User.id}> (${messageAuthor_User.username}) got accepted`, + ); + } + } + } + } +}); diff --git a/package.json b/package.json index 85beb50..3ef82cd 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,5 @@ }, "devDependencies": { "@biomejs/biome": "^2.4.2" - }, - "dependencies": { - "@fluxerjs/core": "^1.1.7" } }