refactor(arabot): make restrictRun exported function

This commit is contained in:
smyalygames 2023-02-11 21:23:02 +00:00
parent 733a6609a8
commit a79cc496d8

View File

@ -17,7 +17,12 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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;
}
}