diff --git a/src/structure/components/settings/Logging/MessageLog.js b/src/structure/components/settings/Logging/MessageLog.js new file mode 100644 index 0000000..50e0563 --- /dev/null +++ b/src/structure/components/settings/Logging/MessageLog.js @@ -0,0 +1,123 @@ +const { Setting, CommandOption } = require("../../../interfaces"); + +const Util = require('../../../../Util.js'); + +class MessageLog extends Setting { + + constructor(client) { + + super(client, { + name: 'messagelog', + module: 'logging', + description: 'Configure message logging', + clientPermissions: ['MANAGE_WEBHOOKS'], + default: { + channel: null, + ignore: [], + bypass: [], + attachments: false, + webhook: null + }, + commandOptions: [ + new CommandOption({ + name: 'channel', + description: 'Channel in which to output logs', + type: 'TEXT_CHANNEL' + }), + new CommandOption({ + name: 'enabled', + description: 'Toggle logging on or off', + type: 'BOOLEAN' + }), + new CommandOption({ + name: 'attachments', + description: 'Whether to log attachments. PREMIUM TIER 1', + type: 'BOOLEAN' + }), + new CommandOption({ + name: 'list', + description: 'Select which list to modify', + type: 'STRING', + choices: [ + { name: 'bypass', value: 'bypass' }, + { name: 'ignore', value: 'ignore' }, + ] + }), + new CommandOption({ + name: 'method', + description: 'Select which modification method to use', + type: 'STRING', + choices: [ + { name: 'add', value: 'add' }, + { name: 'remove', value: 'remove' }, + { name: 'set', value: 'set' }, + { name: 'reset', value: 'reset' }, + ] + }), + ] + }); + + } + + async execute(interaction, opts, setting) { + + const method = opts.method?.value; + const list = opts.list?.value; + const { guild } = interaction; + + setting.enabled = opts.enabled?.value || false; + + if (opts.channel) { + + const channel = opts.channel.value; + const perms = channel.permissionsFor(guild.me); + const missingPerms = perms.missing(['SEND_MESSAGES', 'VIEW_CHANNEL', 'MANAGE_WEBHOOKS', 'EMBED_LINKS']); + if (missingPerms.length) return { + error: true, + index: 'ERR_CHANNEL_PERMS', + params: { channel: channel.name, perms: missingPerms.join(', ') } + }; + + let hook = await guild.getWebhook(this.name); + if (hook) await hook.edit({ channel }); + else { + hook = await channel.createWebhook('Galactic Bot message logs', + { reason: 'Message logs webhook.' }); // avatar: './util/GBotTest.png', + await guild.updateWebhook(this.name, hook); + setting.webhook = hook.id; + } + + setting.channel = channel.id; + + } + + if (method && list) { + + const time = 120; + const content = await this._prompt(interaction, { + message: guild.format(`SETTING_PROMPT_${method.toUpperCase()}`, + { method, list }) + '\n' + guild.format('TIMEOUT_IN', { time }), + time + }); + if (content.error) return content; + + const words = Util.parseQuotes(content).map(([word]) => word), + params = []; + + if (list === 'bypass') params.push(...await guild.resolveRoles(words) + .then((roles) => roles.map((role) => role.id))); + else if (list === 'ignore') params.push(...await guild.resolveChannels(words) + .then((channels) => channels.map((channel) => channel.id))); + + if (!params.length) return { error: true, index: 'RESOLVE_FAIL', params: { type: list === 'bypass' ? 'roles' : 'channels' } }; + this[method](setting[list], params); + + } + + return { error: false, index: 'SETTING_SUCCESS_ALT', params: { updated: list } }; + + } + +} + +module.exports = MessageLog; \ No newline at end of file