116 lines
5.6 KiB
TypeScript
116 lines
5.6 KiB
TypeScript
import { Message } from "revolt.js/dist/maps/Messages";
|
|
import { User } from "revolt.js/dist/maps/Users";
|
|
import { client } from "../..";
|
|
import Command from "../../struct/Command";
|
|
import MessageCommandContext from "../../struct/MessageCommandContext";
|
|
import ServerConfig from "../../struct/ServerConfig";
|
|
import { isBotManager, NO_MANAGER_MSG, parseUser } from "../util";
|
|
|
|
const SYNTAX = '/whitelist add @user; /whitelist remove @user; /whitelist list';
|
|
|
|
export default {
|
|
name: 'whitelist',
|
|
aliases: [],
|
|
description: 'Allow users or roles to bypass moderation rules',
|
|
syntax: SYNTAX,
|
|
category: 'configuration',
|
|
run: async (message: MessageCommandContext, args: string[]) => {
|
|
let config: ServerConfig = await client.db.get('servers').findOne({ id: message.serverContext._id }) || {}
|
|
if (!config.whitelist) config.whitelist = { users: [], roles: [], managers: true }
|
|
|
|
if (!isBotManager(message)) return message.reply(NO_MANAGER_MSG);
|
|
|
|
let user: User|null, role: string|undefined;
|
|
switch(args[0]?.toLowerCase()) {
|
|
case 'add':
|
|
case 'set':
|
|
if (!args[1]) return message.reply('You need to spefify a user or role name.');
|
|
|
|
role = Object.entries(message.serverContext.roles ?? {})
|
|
.find((r) => r[1].name?.toLowerCase() == args[1].toLowerCase()
|
|
|| r[0] == args[1].toUpperCase())
|
|
?.[0];
|
|
|
|
if (role) {
|
|
if (config.whitelist!.roles?.includes(role))
|
|
return message.reply('That role is already whitelisted.');
|
|
|
|
config.whitelist!.roles = [role, ...(config.whitelist!.roles ?? [])];
|
|
await client.db.get('servers').update({ id: message.serverContext._id }, { $set: { whitelist: config.whitelist } });
|
|
return message.reply(`Added role to whitelist!`);
|
|
}
|
|
|
|
user = await parseUser(args[1])
|
|
if (user == null) return message.reply('I can\'t find that user or role.');
|
|
if (user.bot != null) return message.reply('Bots cannot be whitelisted.');
|
|
if (config.whitelist!.users?.includes(user._id))
|
|
return message.reply('That user is already whitelisted.');
|
|
|
|
config.whitelist!.users = [user._id, ...(config.whitelist!.users ?? [])];
|
|
await client.db.get('servers').update({ id: message.serverContext._id }, { $set: { whitelist: config.whitelist } });
|
|
return message.reply('Added user to whitelist!');
|
|
break;
|
|
case 'rm':
|
|
case 'del':
|
|
case 'remove':
|
|
case 'delete':
|
|
if (!args[1]) return message.reply('You need to spefify a user or role name.');
|
|
|
|
role = Object.entries(message.serverContext.roles ?? {})
|
|
.find((r) => r[1].name?.toLowerCase() == args[1].toLowerCase()
|
|
|| r[0] == args[1].toUpperCase())
|
|
?.[0];
|
|
|
|
if (role) {
|
|
if (!config.whitelist!.roles?.includes(role))
|
|
return message.reply('That role is not whitelisted.');
|
|
|
|
config.whitelist!.roles = config.whitelist!.roles.filter(r => r != role);
|
|
await client.db.get('servers').update({ id: message.serverContext._id }, { $set: { whitelist: config.whitelist } });
|
|
return message.reply(`Removed role from whitelist!`);
|
|
}
|
|
|
|
user = await parseUser(args[1])
|
|
if (user == null) return message.reply('I can\'t find that user or role.');
|
|
if (!config.whitelist!.users?.includes(user._id))
|
|
return message.reply('That user is not whitelisted.');
|
|
|
|
config.whitelist!.users = config.whitelist!.users.filter(u => u != user?._id);
|
|
await client.db.get('servers').update({ id: message.serverContext._id }, { $set: { whitelist: config.whitelist } });
|
|
return message.reply('Removed user from whitelist!');
|
|
break;
|
|
case 'l':
|
|
case 'ls':
|
|
case 'list':
|
|
case 'show':
|
|
let str = `## Whitelisted users\n`
|
|
+ `### Users\n`;
|
|
|
|
if (config.whitelist.users?.length) {
|
|
config.whitelist.users?.forEach((u, index) => {
|
|
if (index < 15) str += `* [@${client.users.get(u)?.username || u}](/@${u})\n`;
|
|
if (index == 15) str += `**${index - 15} more user${config.whitelist?.users?.length == 16 ? '' : 's'}**\n`;
|
|
});
|
|
} else str += `**No whitelisted users**\n`;
|
|
|
|
str += `### Roles\n`;
|
|
|
|
if (config.whitelist.roles?.length) {
|
|
config.whitelist.roles
|
|
?.map(r => message.serverContext.roles?.[r]?.name || `Unknown role (${r})`)
|
|
.forEach((r, index) => {
|
|
if (index < 15) str += `* ${r}\n`;
|
|
if (index == 15) str += `**${config.whitelist!.roles!.length - 15} more role${config.whitelist?.roles?.length == 16 ? '' : 's'}**\n`;
|
|
});
|
|
} else str += `**No whitelisted roles**\n`;
|
|
|
|
str += `\nAdmins and bot managers: **${config.whitelist.managers === false ? 'No' : 'Yes'}**`;
|
|
|
|
message.reply(str)
|
|
?.catch(e => message.reply(String(e)));
|
|
break;
|
|
default:
|
|
message.reply(`Command syntax: ${SYNTAX}`);
|
|
}
|
|
}
|
|
} as Command;
|