galactic-bot/structure/client/components/commands/utility/Settings.js

172 lines
6.1 KiB
JavaScript
Raw Normal View History

const { Command } = require('../../../../interfaces/');
const { stripIndents } = require('common-tags');
2020-05-05 01:35:01 +02:00
class SettingsCommand extends Command {
2020-05-05 01:35:01 +02:00
constructor(client) {
super(client, {
name: 'settings',
2020-05-05 01:35:01 +02:00
module: 'utility',
aliases: [
'setting',
2020-05-05 01:35:01 +02:00
'set'
],
usage: "[list|reset|setting-name] <value..>",
arguments: [
{
name: 'user',
type: 'BOOLEAN',
types: ['VERBAL', 'FLAG'],
default: true
},
{
name: 'all',
type: 'BOOLEAN',
types: ['VERBAL', 'FLAG'],
default: true
}
],
showUsage: true
2020-05-05 01:35:01 +02:00
});
this.client = client;
}
async execute(message, { params, args }) {
2020-05-05 01:35:01 +02:00
const type = (!message.guild || args.user) ? 'USER' : 'GUILD';
2020-05-05 01:35:01 +02:00
const target = params[0].toLowerCase(); // params[0] should never be null, see showUsage
if(target === 'list') {
this._listSettings(message, type, Boolean(args.all));
return undefined;
2020-05-05 01:35:01 +02:00
} else if(target === 'reset') {
if(message.channel.permissionsFor(message.member).missing('ADMINISTRATOR').length > 0) {
await message.respond(message.format('C_SETTINGS_ADMINISTRATORERROR', { type: type.toLowerCase() }), { emoji: 'failure' });
return undefined;
}
const prompt = await message.prompt(message.format('C_SETTINGS_RESET', { type: type.toLowerCase() }), { emoji: 'warning' });
return await this._handleReset(prompt, message, type);
2020-05-05 01:35:01 +02:00
} else if(target === 'walkthrough') {
//TODO
return undefined;
2020-05-05 01:35:01 +02:00
}
const settings = this.client.resolver.components(target, 'setting', false).sort(c=>c.resolve === type);
const [ setting ] = settings;
2020-05-05 01:35:01 +02:00
if(!setting) {
await message.respond(message.format('C_SETTINGS_NONEXISTANT'), { emoji: 'failure' });
return undefined;
}
//Setting permission handling
if(setting.clientPermissions.length > 0) {
const missing = message.channel.permissionsFor(message.guild.me).missing(setting.clientPermissions);
if(missing.length > 0) {
await message.respond(message.format('C_SETTINGS_CLIENTPERMISSIONERROR', { setting: setting.moduleResolveable, missing: missing.join(', ')}), { emoji: 'failure' });
return undefined;
}
}
if(message.channel.permissionsFor(message.member).missing('ADMINISTRATOR').length > 0 && setting.resolve === 'GUILD') {
await message.respond(message.format('C_SETTINGS_ADMINISTRATORERROR', { type: type.toLowerCase() }), { emoji: 'failure' });
return undefined;
}
const parameters = params.splice(1);
if(!parameters || parameters.length === 0) {
await this._showSetting(message, setting)
return undefined;
}
const response = await setting.handle(message, parameters);
message.respond(response.msg, { emoji: response.error ? 'failure' : 'success' });
}
_listSettings(message, type, all) {
if(!message.guild && type === 'GUILD') type = 'USER';
const prefix = message.guild?.prefix || this.client._options.bot.prefix;
let fields = [];
const sorted = this.client.registry.components
.filter(c=>c.type === 'module')
.sort((a, b) => {
const filter = c=>c.type === 'setting';
return b.components.filter(filter) - a.components.filter(filter);
});
for(const module of sorted.values()) {
let field = {
name: module.id,
value: '',
inline: true
};
for(const setting of module.components.values()) {
if(setting.type !== 'setting'
|| (setting.resolve !== type && !all)
|| (setting.restricted && !all)) continue;
field.value += `\`${setting.display}\`\n`;
}
if(field.value) fields.push(field);
2020-05-05 01:35:01 +02:00
}
const embed = {
author: {
name: `${type === 'GUILD' ? message.format('C_SETTINGS_GUILDSETTINGSTITLE') : message.format('C_SETTINGS_USERSETTINGSTITLE')}`,
icon_url: type === 'GUILD' ? message.guild.iconURL() : message.author.avatarURL()
},
description: stripIndents`${message.format('C_SETTINGS_LISTSETTINGS', { prefix })}
${type === 'USER' ? '' : message.format('C_SETTINGS_LISTSETTINGSALT', { prefix })}`,
fields
};
return message.embed(embed);
}
async _showSetting(message, setting) {
let fields = setting.fields(message.guild);
if(fields instanceof Promise) fields = await fields;
const embed = {
author: {
name: `${setting.name} (${setting.module.resolveable})`,
icon_url: this.client.user.displayAvatarURL()
},
description: message.format(`S_${setting.name.toUpperCase()}_DESCRIPTION`),
fields
}
return await message.embed(embed);
}
async _handleReset(prompt, message, type) {
if(!prompt) return;
const response = prompt.content.toLowerCase();
const bool = this.client.resolver.resolveBoolean(response);
if(bool === null) return message.respond(message.format('C_SETTINGS_RESETERROR'), { emoji: 'failure' });
if(!bool) return message.respond(message.format('C_SETTINGS_RESETABORT'), { emoji: 'success' });
type === 'USER'
? await message.author._deleteSettings()
: await message.guild._deleteSettings();
return message.respond(message.format('C_SETTINGS_RESETSUCCESS', { type: type.toLowerCase() }), { emoji: 'success' })
2020-05-05 01:35:01 +02:00
}
}
module.exports = SettingsCommand;