From a79cc496d851c4f2a8900b266d6c7f0a7b305933 Mon Sep 17 00:00:00 2001 From: smyalygames Date: Sat, 11 Feb 2023 21:23:02 +0000 Subject: [PATCH] refactor(arabot): make restrictRun exported function --- src/commands/mod/restriction/restrict.ts | 415 ++++++++++++----------- 1 file changed, 215 insertions(+), 200 deletions(-) diff --git a/src/commands/mod/restriction/restrict.ts b/src/commands/mod/restriction/restrict.ts index 87dae8f..b207f7c 100644 --- a/src/commands/mod/restriction/restrict.ts +++ b/src/commands/mod/restriction/restrict.ts @@ -17,7 +17,12 @@ along with this program. If not, see . */ -import { Args, Command, RegisterBehavior } from '@sapphire/framework'; +import { + Args, + Command, + RegisterBehavior, + container, +} from '@sapphire/framework'; import { ChannelType, EmbedBuilder, @@ -35,6 +40,213 @@ import IDs from '#utils/ids'; import { addEmptyUser, updateUser, userExists } from '#utils/database/dbExistingUser'; import { restrict, checkActive } from '#utils/database/restriction'; +export async function restrictRun( + userId: Snowflake, + modId: Snowflake, + reason: string, + guild: Guild, + tolerance = false, +) { + const info = { + message: '', + success: false, + }; + + // Gets mod's GuildMember + const mod = guild.members.cache.get(modId); + + // Checks if guildMember is null + if (mod === undefined) { + info.message = 'Error fetching mod'; + return info; + } + + // Check if mod is in database + await updateUser(mod); + + if (await checkActive(userId)) { + info.message = `<@${userId}> is already restricted!`; + return info; + } + + // Gets guildMember + let member = guild.members.cache.get(userId); + + if (member === undefined) { + member = await guild.members.fetch(userId); + } + + if (member !== undefined) { + // Checks if the user is not restricted + if (member.roles.cache.hasAny( + IDs.roles.restrictions.restricted1, + IDs.roles.restrictions.restricted2, + IDs.roles.restrictions.restricted3, + IDs.roles.restrictions.restricted4, + )) { + info.message = `${member} is already restricted!`; + return info; + } + + // Check if user and mod are on the database + await updateUser(member); + + if (member.roles.cache.has(IDs.roles.vegan.vegan)) { + await member.roles.add(IDs.roles.restrictions.restricted1); + + const voiceChannel = await guild.channels.create({ + name: 'Restricted Voice Channel', + type: ChannelType.GuildVoice, + parent: IDs.categories.restricted, + permissionOverwrites: [ + { + id: guild.roles.everyone, + deny: [PermissionsBitField.Flags.ViewChannel], + }, + { + id: member.id, + allow: [PermissionsBitField.Flags.ViewChannel], + }, + { + id: IDs.roles.staff.restricted, + allow: [PermissionsBitField.Flags.SendMessages, + PermissionsBitField.Flags.ViewChannel, + PermissionsBitField.Flags.Connect, + PermissionsBitField.Flags.MuteMembers], + }, + ], + }); + + let restrictedChannel: TextChannel; + let bannedName = false; + try { + restrictedChannel = await guild.channels.create({ + name: `⛔┃${member.user.username}-restricted`, + type: ChannelType.GuildText, + topic: `Restricted channel. ${member.id} ${voiceChannel.id} (Please do not change this)`, + parent: IDs.categories.restricted, + permissionOverwrites: [ + { + id: guild.roles.everyone, + allow: [PermissionsBitField.Flags.ReadMessageHistory], + deny: [PermissionsBitField.Flags.ViewChannel], + }, + { + id: member.id, + allow: [PermissionsBitField.Flags.ViewChannel], + }, + { + id: IDs.roles.staff.restricted, + allow: [PermissionsBitField.Flags.SendMessages, + PermissionsBitField.Flags.ViewChannel], + }, + ], + }); + } catch { + restrictedChannel = await guild.channels.create({ + name: `⛔┃${member.user.id}-restricted`, + type: ChannelType.GuildText, + topic: `Restricted channel. ${member.id} ${voiceChannel.id} (Please do not change this)`, + parent: IDs.categories.restricted, + permissionOverwrites: [ + { + id: guild.roles.everyone, + allow: [PermissionsBitField.Flags.ReadMessageHistory], + deny: [PermissionsBitField.Flags.ViewChannel], + }, + { + id: member.id, + allow: [PermissionsBitField.Flags.ViewChannel], + }, + { + id: IDs.roles.staff.restricted, + allow: [PermissionsBitField.Flags.SendMessages, + PermissionsBitField.Flags.ViewChannel], + }, + ], + }); + bannedName = true; + } + + if (!bannedName) { + await voiceChannel.setName(`${member.user.username}-restricted`); + } else { + await voiceChannel.setName(`${member.user.id}-restricted`); + } + + const joinTime = time(member.joinedAt!); + const registerTime = time(member.user.createdAt); + + const embed = new EmbedBuilder() + .setColor(member.displayHexColor) + .setTitle(`Restricted channel for ${member.user.username}`) + .setDescription(`${member}`) + .setThumbnail(member.user.avatarURL()!) + .addFields( + { name: 'Joined:', value: `${joinTime}`, inline: true }, + { name: 'Created:', value: `${registerTime}`, inline: true }, + ); + + await restrictedChannel.send({ embeds: [embed] }); + } else if (tolerance) { + await member.roles.add(Math.random() > 0.5 + ? IDs.roles.restrictions.restricted3 + : IDs.roles.restrictions.restricted4); + } else { + await member.roles.add(Math.random() > 0.5 + ? IDs.roles.restrictions.restricted1 + : IDs.roles.restrictions.restricted2); + } + + await member.roles.remove([ + IDs.roles.vegan.vegan, + IDs.roles.vegan.plus, + IDs.roles.vegan.activist, + IDs.roles.trusted, + IDs.roles.nonvegan.nonvegan, + IDs.roles.nonvegan.convinced, + IDs.roles.nonvegan.vegCurious, + ]); + } else if (!await userExists(userId)) { + await addEmptyUser(userId); + } + + // Restrict the user on the database + await restrict(userId, modId, reason); + + info.success = true; + + // Log the ban + let logChannel = guild.channels.cache + .get(IDs.channels.logs.restricted) as TextChannel | undefined; + + if (logChannel === undefined) { + logChannel = await guild.channels + .fetch(IDs.channels.logs.restricted) as TextChannel | undefined; + if (logChannel === undefined) { + container.logger.error('Restrict Error: Could not fetch log channel'); + info.message = `Restricted ${member} but could not find the log channel. This has been logged to the database.`; + return info; + } + } + + const message = new EmbedBuilder() + .setColor('#FF6700') + .setAuthor({ name: `Restricted ${member.user.tag}`, iconURL: `${member.user.avatarURL()}` }) + .addFields( + { name: 'User', value: `${member}`, inline: true }, + { name: 'Moderator', value: `${mod}`, inline: true }, + { name: 'Reason', value: reason }, + ) + .setTimestamp() + .setFooter({ text: `ID: ${member.id}` }); + + await logChannel.send({ embeds: [message] }); + + info.message = `Restricted ${member}`; + return info; +} + export class RestrictCommand extends Command { public constructor(context: Command.Context, options: Command.Options) { super(context, { @@ -82,7 +294,7 @@ export class RestrictCommand extends Command { return; } - const info = await this.restrictRun(user?.id, mod.user.id, reason, guild); + const info = await restrictRun(user?.id, mod.user.id, reason, guild); await interaction.reply({ content: info.message, @@ -124,206 +336,9 @@ export class RestrictCommand extends Command { return; } - const info = await this.restrictRun(user?.id, mod.user.id, reason, guild); + const info = await restrictRun(user?.id, mod.user.id, reason, guild); await message.reply(info.message); await message.react(info.success ? '✅' : '❌'); } - - private async restrictRun(userId: Snowflake, modId: Snowflake, reason: string, guild: Guild) { - const info = { - message: '', - success: false, - }; - - // Gets mod's GuildMember - const mod = guild.members.cache.get(modId); - - // Checks if guildMember is null - if (mod === undefined) { - info.message = 'Error fetching mod'; - return info; - } - - // Check if mod is in database - await updateUser(mod); - - if (await checkActive(userId)) { - info.message = `<@${userId}> is already restricted!`; - return info; - } - - // Gets guildMember - let member = guild.members.cache.get(userId); - - if (member === undefined) { - member = await guild.members.fetch(userId); - } - - if (member !== undefined) { - // Checks if the user is not restricted - if (member.roles.cache.hasAny( - IDs.roles.restrictions.restricted1, - IDs.roles.restrictions.restricted2, - IDs.roles.restrictions.restricted3, - IDs.roles.restrictions.restricted4, - )) { - info.message = `${member} is already restricted!`; - return info; - } - - // Check if user and mod are on the database - await updateUser(member); - - if (member.roles.cache.has(IDs.roles.vegan.vegan)) { - await member.roles.add(IDs.roles.restrictions.restricted1); - - const voiceChannel = await guild.channels.create({ - name: 'Restricted Voice Channel', - type: ChannelType.GuildVoice, - parent: IDs.categories.restricted, - permissionOverwrites: [ - { - id: guild.roles.everyone, - deny: [PermissionsBitField.Flags.ViewChannel], - }, - { - id: member.id, - allow: [PermissionsBitField.Flags.ViewChannel], - }, - { - id: IDs.roles.staff.restricted, - allow: [PermissionsBitField.Flags.SendMessages, - PermissionsBitField.Flags.ViewChannel, - PermissionsBitField.Flags.Connect, - PermissionsBitField.Flags.MuteMembers], - }, - ], - }); - - let restrictedChannel: TextChannel; - let bannedName = false; - try { - restrictedChannel = await guild.channels.create({ - name: `⛔┃${member.user.username}-restricted`, - type: ChannelType.GuildText, - topic: `Restricted channel. ${member.id} ${voiceChannel.id} (Please do not change this)`, - parent: IDs.categories.restricted, - permissionOverwrites: [ - { - id: guild.roles.everyone, - allow: [PermissionsBitField.Flags.ReadMessageHistory], - deny: [PermissionsBitField.Flags.ViewChannel], - }, - { - id: member.id, - allow: [PermissionsBitField.Flags.ViewChannel], - }, - { - id: IDs.roles.staff.restricted, - allow: [PermissionsBitField.Flags.SendMessages, - PermissionsBitField.Flags.ViewChannel], - }, - ], - }); - } catch { - restrictedChannel = await guild.channels.create({ - name: `⛔┃${member.user.id}-restricted`, - type: ChannelType.GuildText, - topic: `Restricted channel. ${member.id} ${voiceChannel.id} (Please do not change this)`, - parent: IDs.categories.restricted, - permissionOverwrites: [ - { - id: guild.roles.everyone, - allow: [PermissionsBitField.Flags.ReadMessageHistory], - deny: [PermissionsBitField.Flags.ViewChannel], - }, - { - id: member.id, - allow: [PermissionsBitField.Flags.ViewChannel], - }, - { - id: IDs.roles.staff.restricted, - allow: [PermissionsBitField.Flags.SendMessages, - PermissionsBitField.Flags.ViewChannel], - }, - ], - }); - bannedName = true; - } - - if (!bannedName) { - await voiceChannel.setName(`${member.user.username}-restricted`); - } else { - await voiceChannel.setName(`${member.user.id}-restricted`); - } - - const joinTime = time(member.joinedAt!); - const registerTime = time(member.user.createdAt); - - const embed = new EmbedBuilder() - .setColor(member.displayHexColor) - .setTitle(`Restricted channel for ${member.user.username}`) - .setDescription(`${member}`) - .setThumbnail(member.user.avatarURL()!) - .addFields( - { name: 'Joined:', value: `${joinTime}`, inline: true }, - { name: 'Created:', value: `${registerTime}`, inline: true }, - ); - - await restrictedChannel.send({ embeds: [embed] }); - } else { - await member.roles.add(Math.random() > 0.5 - ? IDs.roles.restrictions.restricted1 - : IDs.roles.restrictions.restricted2); - } - - await member.roles.remove([ - IDs.roles.vegan.vegan, - IDs.roles.vegan.plus, - IDs.roles.vegan.activist, - IDs.roles.trusted, - IDs.roles.nonvegan.nonvegan, - IDs.roles.nonvegan.convinced, - IDs.roles.nonvegan.vegCurious, - ]); - } else if (!await userExists(userId)) { - await addEmptyUser(userId); - } - - // Restrict the user on the database - await restrict(userId, modId, reason); - - info.success = true; - - // Log the ban - let logChannel = guild.channels.cache - .get(IDs.channels.logs.restricted) as TextChannel | undefined; - - if (logChannel === undefined) { - logChannel = await guild.channels - .fetch(IDs.channels.logs.restricted) as TextChannel | undefined; - if (logChannel === undefined) { - this.container.logger.error('Restrict Error: Could not fetch log channel'); - info.message = `Restricted ${member} but could not find the log channel. This has been logged to the database.`; - return info; - } - } - - const message = new EmbedBuilder() - .setColor('#FF6700') - .setAuthor({ name: `Restricted ${member.user.tag}`, iconURL: `${member.user.avatarURL()}` }) - .addFields( - { name: 'User', value: `${member}`, inline: true }, - { name: 'Moderator', value: `${mod}`, inline: true }, - { name: 'Reason', value: reason }, - ) - .setTimestamp() - .setFooter({ text: `ID: ${member.id}` }); - - await logChannel.send({ embeds: [message] }); - - info.message = `Restricted ${member}`; - return info; - } }