AutoMod/src/bot/commands/prefix.ts
2022-01-05 20:20:55 +01:00

75 lines
3.1 KiB
TypeScript

import Command from "../../struct/Command";
import { Message } from "revolt.js/dist/maps/Messages";
import { client } from "../..";
import ServerConfig from "../../struct/ServerConfig";
import { DEFAULT_PREFIX } from "../modules/command_handler";
import { hasPerm, isBotManager, NO_MANAGER_MSG } from "../util";
const SYNTAX = '/prefix set [new prefix]; /prefix get; prefix clear';
const MENTION_TEXT = 'You can also @mention me instead of using the prefix.';
export default {
name: 'prefix',
aliases: null,
description: 'Configure AutoMod\'s prefix',
syntax: SYNTAX,
category: 'configuration',
run: async (message: Message, args: string[]) => {
let config: ServerConfig = (await client.db.get('servers').findOne({ id: message.channel?.server_id })) ?? {};
switch(args[0]?.toLowerCase()) {
case 'set':
if (!await isBotManager(message.member!, message.channel?.server!)) return message.reply(NO_MANAGER_MSG);
args.shift();
if (args.length == 0) return message.reply('You need to specify a prefix.');
let newPrefix = args.join(' ').trim();
let oldPrefix = config.prefix ?? DEFAULT_PREFIX;
let val = validatePrefix(newPrefix);
if (typeof val != 'boolean') {
return message.reply(val);
}
await client.db.get('servers').update({ 'id': message.channel?.server_id }, { $set: { 'prefix': newPrefix } });
message.reply(`✅ Prefix has been changed from \`${oldPrefix}\` to \`${newPrefix}\`.\n${MENTION_TEXT}`);
break;
case 'get':
case undefined:
if (config.prefix) message.reply(`This server's prefix is \`${config.prefix}\`.\n${MENTION_TEXT}`);
else message.reply(`This server uses the default prefix \`${DEFAULT_PREFIX}\`.\n${MENTION_TEXT}`);
break;
case 'clear':
case 'reset':
if (!await isBotManager(message.member!, message.channel?.server!)) return message.reply(NO_MANAGER_MSG);
if (config.prefix != null) {
await client.db.get('servers').update({ 'id': message.channel?.server_id }, { $set: { 'prefix': null } });
}
message.reply(`✅ Prefix has been reset to the default: \`${DEFAULT_PREFIX}\`.`);
break;
default:
message.reply(`Unknown action. Correct syntax: \`${SYNTAX}\``);
}
}
} as Command;
function validatePrefix(prefix: string): string|true {
// Check length
if (prefix.length > 32) return 'Prefix may not be longer than 32 characters';
// Check for forbidden characters
let matched = [];
for (const char of ['`', '\n', '#']) {
if (prefix.indexOf(char) > -1) matched.push(char);
}
if (matched.length > 0) return `Prefix may not contain the following characters: `
+ `${matched.map(char => char).join(', ')
.replace(new RegExp('\n', 'g'), '\\n')}`;
return true;
}