RolesService wip
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import { createLogger } from "@avocadi/bot-core/lib/logger";
|
import { createLogger } from "@avocadi/bot-core/lib/logger";
|
||||||
import type { User } from "@fluxerjs/core";
|
|
||||||
import { config } from "config";
|
import { config } from "config";
|
||||||
import { RolesService } from "entities/roles/roles.service";
|
import { RolesService } from "entities/roles/roles.service";
|
||||||
import { acceptUserService } from "features/accept-user/accept-user.service";
|
import { acceptUserService } from "features/accept-user/accept-user.service";
|
||||||
@@ -8,15 +7,6 @@ import client from "lib/client";
|
|||||||
|
|
||||||
const logger = createLogger("ReactionsListener");
|
const logger = createLogger("ReactionsListener");
|
||||||
|
|
||||||
// client.on("messageReactionRemove", async (reaction, user) => {
|
|
||||||
// reactionRolesService.handleReaction(
|
|
||||||
// reaction,
|
|
||||||
// user,
|
|
||||||
// Roles.enum.people,
|
|
||||||
// "remove",
|
|
||||||
// );
|
|
||||||
// });
|
|
||||||
|
|
||||||
client.on("messageReactionAdd", async (reaction, user) => {
|
client.on("messageReactionAdd", async (reaction, user) => {
|
||||||
const guild = reaction.message.guild;
|
const guild = reaction.message.guild;
|
||||||
if (!guild) {
|
if (!guild) {
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
console.log("Hello via Bun!");
|
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@avocadi/bot-core": "workspace:*",
|
"@avocadi/bot-core": "workspace:*",
|
||||||
"@discordjs/rest": "^2.6.0",
|
"@discordjs/rest": "^2.6.0",
|
||||||
"@fluxerjs/core": "^1.1.7",
|
"@fluxerjs/core": "^1.2.3",
|
||||||
"cron": "^4.4.0",
|
"cron": "^4.4.0",
|
||||||
"dotenv": "^17.3.1",
|
"dotenv": "^17.3.1",
|
||||||
"dotenv-expand": "^12.0.3",
|
"dotenv-expand": "^12.0.3",
|
||||||
|
|||||||
39
adapters/fluxer/src/entities/roles/roles.service.ts
Normal file
39
adapters/fluxer/src/entities/roles/roles.service.ts
Normal file
@@ -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<GuildMember> {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<User>(
|
||||||
|
messagesService,
|
||||||
|
i18nService,
|
||||||
|
"en",
|
||||||
|
);
|
||||||
60
adapters/fluxer/src/features/reactions/reactions.listener.ts
Normal file
60
adapters/fluxer/src/features/reactions/reactions.listener.ts
Normal file
@@ -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`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
@@ -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`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -13,8 +13,5 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "^2.4.2"
|
"@biomejs/biome": "^2.4.2"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@fluxerjs/core": "^1.1.7"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user