aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/listeners/guild/guildMemberAdd.ts80
-rw-r--r--src/listeners/guild/guildMemberRemove.ts4
-rw-r--r--src/listeners/guild/joinRoles.ts119
3 files changed, 124 insertions, 79 deletions
diff --git a/src/listeners/guild/guildMemberAdd.ts b/src/listeners/guild/guildMemberAdd.ts
index 4c7d498..22961e9 100644
--- a/src/listeners/guild/guildMemberAdd.ts
+++ b/src/listeners/guild/guildMemberAdd.ts
@@ -1,5 +1,5 @@
-import { BushListener, StickyRole, type BushClientEvents, type BushGuildMember, type BushTextChannel } from '#lib';
-import { MessageEmbed, type Snowflake } from 'discord.js';
+import { BushListener, type BushClientEvents, type BushGuildMember, type BushTextChannel } from '#lib';
+import { MessageEmbed } from 'discord.js';
export default class GuildMemberAddListener extends BushListener {
public constructor() {
@@ -12,10 +12,9 @@ export default class GuildMemberAddListener extends BushListener {
public override async exec(...[member]: BushClientEvents['guildMemberAdd']) {
void this.sendWelcomeMessage(member);
- void this.joinAndStickyRoles(member);
}
- public async sendWelcomeMessage(member: BushGuildMember) {
+ private async sendWelcomeMessage(member: BushGuildMember) {
if (client.config.isDevelopment) return;
const welcomeChannel = await member.guild.getSetting('welcomeChannel');
if (!welcomeChannel) return;
@@ -44,77 +43,4 @@ export default class GuildMemberAddListener extends BushListener {
)
);
}
-
- public async joinAndStickyRoles(member: BushGuildMember) {
- if (client.config.isDevelopment) return;
- if (await member.guild.hasFeature('stickyRoles')) {
- const hadRoles = await StickyRole.findOne({ where: { guild: member.guild.id, user: member.id } });
- if (hadRoles?.roles?.length) {
- const rolesArray = hadRoles.roles
- .map((roleID: Snowflake) => {
- const role = member.guild.roles.cache.get(roleID);
- if (role && !member.roles.cache.has(roleID)) {
- if (role.name !== '@everyone' || !role.managed) return role.id;
- }
- })
- .filter((role) => role) as Snowflake[];
- if (hadRoles.nickname && member.manageable) {
- void member.setNickname(hadRoles.nickname).catch(() => {});
- }
- if (rolesArray?.length) {
- const addedRoles = await member.roles.add(rolesArray, "Returning member's previous roles.").catch(() =>
- member.guild.sendLogChannel('error', {
- embeds: [
- {
- title: 'Sticky Roles Error',
- description: `There was an error returning ${util.format.input(member.user.tag)}'s roles.`,
- color: util.colors.error
- }
- ]
- })
- );
- if (addedRoles) {
- void client.console.info(
- 'guildMemberAdd',
- `Assigned sticky roles to ${util.format.inputLog(member.user.tag)} in ${util.format.inputLog(member.guild.name)}.`
- );
- } else if (!addedRoles) {
- const failedRoles: string[] = [];
- for (let i = 0; i < rolesArray.length; i++) {
- await member.roles
- .add(rolesArray[i], "[Fallback] Returning member's previous roles.")
- .catch(() => failedRoles.push(rolesArray[i]));
- }
- if (failedRoles.length) {
- void client.console.warn('guildMemberAdd', `Failed assigning the following roles on Fallback: ${failedRoles}`);
- } else {
- void client.console.info(
- 'guildMemberAdd',
- `[Fallback] Assigned sticky roles to ${util.format.inputLog(member.user.tag)} in ${util.format.inputLog(
- member.guild.name
- )}.`
- );
- }
- }
- }
- } else {
- const joinRoles = await member.guild.getSetting('joinRoles');
- if (!joinRoles || !joinRoles.length) return;
- await member.roles
- .add(joinRoles, 'Join roles.')
- .then(() =>
- client.console.info(
- 'guildMemberAdd',
- `Assigned join roles to ${util.format.inputLog(member.user.tag)} in ${util.format.inputLog(member.guild.name)}.`
- )
- )
- .catch(() =>
- member.guild.error(
- 'Join Roles Error',
- `Failed to assign join roles to ${util.format.input(member.user.tag)}, in ${util.format.input(member.guild.name)}.`
- )
- );
- }
- }
- }
}
diff --git a/src/listeners/guild/guildMemberRemove.ts b/src/listeners/guild/guildMemberRemove.ts
index ae4c4df..323bd24 100644
--- a/src/listeners/guild/guildMemberRemove.ts
+++ b/src/listeners/guild/guildMemberRemove.ts
@@ -22,7 +22,7 @@ export default class GuildMemberRemoveListener extends BushListener {
void this.stickyRoles(member);
}
- public async sendWelcomeMessage(member: BushGuildMember | PartialBushGuildMember) {
+ private async sendWelcomeMessage(member: BushGuildMember | PartialBushGuildMember) {
if (client.config.isDevelopment) return;
const user = member.partial ? await client.users.fetch(member.id) : member.user;
await util.sleep(0.05); // ban usually triggers after member leave
@@ -54,7 +54,7 @@ export default class GuildMemberRemoveListener extends BushListener {
);
}
- public async stickyRoles(member: BushGuildMember | PartialBushGuildMember) {
+ private async stickyRoles(member: BushGuildMember | PartialBushGuildMember) {
if (!(await member.guild.hasFeature('stickyRoles'))) return;
if (member.partial) {
await member.guild.members.fetch(); // try to prevent in the future
diff --git a/src/listeners/guild/joinRoles.ts b/src/listeners/guild/joinRoles.ts
new file mode 100644
index 0000000..a50f7ed
--- /dev/null
+++ b/src/listeners/guild/joinRoles.ts
@@ -0,0 +1,119 @@
+import { BushListener, StickyRole, type BushClientEvents, type BushGuildMember } from '#lib';
+import { type Snowflake } from 'discord.js';
+
+export default class JoinRolesListener extends BushListener {
+ public constructor() {
+ super('joinRoles', {
+ emitter: 'client',
+ event: 'guildMemberUpdate', // listens to guildMemberUpdate so that the role's aren't given before the member accepts the welcome screen
+ category: 'guild'
+ });
+ }
+
+ public override async exec(...[oldMember, newMember]: BushClientEvents['guildMemberUpdate']) {
+ if (client.config.isDevelopment) return;
+ if (oldMember.pending === false && newMember.pending === true) {
+ const feat = {
+ stickyRoles: await newMember.guild.hasFeature('stickyRoles'),
+ joinRoles: (await newMember.guild.getSetting('joinRoles')).length > 0
+ };
+
+ if (!feat.stickyRoles && !feat.joinRoles) return;
+
+ let addJoinRoles = true;
+ if (feat.stickyRoles) {
+ const addedStickyRoles = await this.stickyRoles(newMember);
+ if (addedStickyRoles) addJoinRoles = false;
+ }
+
+ if (feat.joinRoles && addJoinRoles) {
+ void this.joinRoles(newMember);
+ }
+ }
+ }
+
+ /**
+ * Adds sticky roles to a user.
+ * @param member The member to add sticky roles to.
+ * @returns Whether or not sticky roles were added.
+ */
+ private async stickyRoles(member: BushGuildMember): Promise<boolean> {
+ const hadRoles = await StickyRole.findOne({ where: { guild: member.guild.id, user: member.id } });
+
+ if (hadRoles?.roles?.length) {
+ const rolesArray = hadRoles.roles
+ .map((roleID: Snowflake) => {
+ const role = member.guild.roles.cache.get(roleID);
+ if (role && !member.roles.cache.has(roleID)) {
+ if (role.name !== '@everyone' || !role.managed) return role.id;
+ }
+ })
+ .filter((role) => role) as Snowflake[];
+ if (hadRoles.nickname && member.manageable) {
+ void member.setNickname(hadRoles.nickname).catch(() => {});
+ }
+ if (rolesArray?.length) {
+ const addedRoles = await member.roles.add(rolesArray, "Returning member's previous roles.").catch(() => {
+ void member.guild.sendLogChannel('error', {
+ embeds: [
+ {
+ title: 'Sticky Roles Error',
+ description: `There was an error returning ${util.format.input(member.user.tag)}'s roles.`,
+ color: util.colors.error
+ }
+ ]
+ });
+ return false as const;
+ });
+ if (addedRoles) {
+ void client.console.info(
+ 'guildMemberAdd',
+ `Assigned sticky roles to ${util.format.inputLog(member.user.tag)} in ${util.format.inputLog(member.guild.name)}.`
+ );
+ } else if (!addedRoles) {
+ const failedRoles: string[] = [];
+ for (let i = 0; i < rolesArray.length; i++) {
+ await member.roles
+ .add(rolesArray[i], "[Fallback] Returning member's previous roles.")
+ .catch(() => failedRoles.push(rolesArray[i]));
+ }
+ if (failedRoles.length) {
+ void client.console.warn('guildMemberAdd', `Failed assigning the following roles on Fallback: ${failedRoles}`);
+ } else {
+ void client.console.info(
+ 'guildMemberAdd',
+ `[Fallback] Assigned sticky roles to ${util.format.inputLog(member.user.tag)} in ${util.format.inputLog(
+ member.guild.name
+ )}.`
+ );
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Add the guild's join roles to the member.
+ * @param member The member to add the join roles to.
+ */
+ private async joinRoles(member: BushGuildMember): Promise<void> {
+ const joinRoles = await member.guild.getSetting('joinRoles');
+ if (!joinRoles || !joinRoles.length) return;
+ await member.roles
+ .add(joinRoles, 'Join roles.')
+ .then(() =>
+ client.console.info(
+ 'guildMemberAdd',
+ `Assigned join roles to ${util.format.inputLog(member.user.tag)} in ${util.format.inputLog(member.guild.name)}.`
+ )
+ )
+ .catch(() =>
+ member.guild.error(
+ 'Join Roles Error',
+ `Failed to assign join roles to ${util.format.input(member.user.tag)}, in ${util.format.input(member.guild.name)}.`
+ )
+ );
+ }
+}