AutoMod/src/bot/commands/whitelist.ts
2022-01-13 22:53:34 +01:00

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;