galactic-bot/structure/client/components/settings/logging/MessageLog.js

293 lines
12 KiB
JavaScript
Raw Normal View History

2020-05-24 00:11:06 +02:00
const { Setting } = require('../../../../interfaces/');
2020-05-24 10:54:33 +02:00
class MessageLogsSetting extends Setting {
2020-05-24 00:11:06 +02:00
constructor(client) {
super(client, {
2020-05-24 10:54:33 +02:00
name: 'messageLog',
2021-05-08 19:42:30 +02:00
module: 'logging',
clientPermissions: ['MANAGE_WEBHOOKS'],
2020-05-24 00:11:06 +02:00
aliases: [
'chatLog',
'chatLogs',
2020-05-24 10:54:33 +02:00
'msgLogs',
'messageLogs',
'msgLog'
2020-05-24 00:11:06 +02:00
],
2020-08-04 11:35:28 +02:00
tags: ['log', 'logs', 'logging'],
2020-05-24 23:42:17 +02:00
usage: '<method|value> [value..]',
2020-05-24 00:11:06 +02:00
resolve: 'GUILD',
examples: [
'msglog #channel',
2021-05-08 11:33:22 +02:00
'msglog bypass <add|remove|list> <role>',
'msglog ignore <add|remove|list> <role>',
'msglog attachments <on|off>',
'msglog off'
2020-05-24 00:11:06 +02:00
],
default: {
2020-05-24 10:54:33 +02:00
messageLog: {
channel: null,
ignore: [],
bypass: [],
2020-05-24 23:42:17 +02:00
attachments: false,
2020-06-18 16:07:39 +02:00
webhook: null
2020-05-24 00:11:06 +02:00
}
}
});
}
async handle(message, params) {
// eslint-disable-next-line init-declarations
let index,
langParams = {};
2020-05-24 00:11:06 +02:00
// eslint-disable-next-line prefer-const
let [method, ...args] = params;
method = method.toLowerCase();
const { guild } = message;
const setting = guild._settings[this.index];
2020-05-24 00:11:06 +02:00
2021-05-03 16:56:09 +02:00
if (['bypass', 'roles', 'role', 'ignoredrole', 'ignoredroles', 'ignorerole', 'ignoreroles'].includes(method)) {
2020-05-24 00:11:06 +02:00
langParams = await this._processRoleBypass(args, setting, guild, 'S_MESSAGELOG_BYPASS_');
if (langParams.error) return langParams;
({ index } = langParams);
// if (!args.length) return {
// msg: message.format('MISSING_ARGS'),
// error: true
// };
// const response = await this.resolveMethod(args, { existing: setting.ignoredRoles, resolver: guild.resolveRoles.bind(guild) });
2020-05-24 00:11:06 +02:00
// if (response) {
2020-05-24 00:11:06 +02:00
// if (response.method === 'add') {
2020-05-24 00:11:06 +02:00
// const roles = response.resolved;
// if (!roles.length) return { error: true, msg: message.format('ERR_ROLERESOLVE') };
// setting.ignoredRoles = [...setting.ignoredRoles, ...roles.filter((r) => !setting.ignoredRoles.includes(r.id)).map((r) => r.id)];
2020-05-24 00:11:06 +02:00
// action = 'GENERAL_ADDED';
// index = 'S_MESSAGELOG_ROLES';
// changes = roles.map((r) => `**${r.name}**`);
2020-05-24 00:11:06 +02:00
// } else if (response.method === 'remove') {
2020-05-24 00:11:06 +02:00
// const roles = response.resolved;
// if (!roles.length) return { error: true, msg: message.format('ERR_ROLERESOLVE') };
// const _roles = roles.map((r) => r.id);
// setting.ignoredRoles = setting.ignoredRoles.filter((r) => !_roles.includes(r));
// action = 'GENERAL_REMOVED';
// index = 'S_MESSAGELOG_ROLES';
// changes = roles.map((r) => `**${r.name}**`);
// } else if (response.method === 'list') {
// const roles = await guild.resolveRoles(setting.ignoredRoles);
// return {
// msg: message.format('S_MESSAGELOG_ROLES_LIST', { roles: roles.map((r) => r.name).join(', ') })
// };
// }
// } else {
// return {
// msg: message.format('ERR_INVALID_METHOD', { method }),
// error: true
// };
// }
2020-05-24 00:11:06 +02:00
2021-05-03 16:56:09 +02:00
} else if (['ignore', 'channels', 'channel', 'ignoredchannels', 'ignoredchannel', 'ignorechannel', 'ignorechannels'].includes(method)) {
2020-05-24 00:11:06 +02:00
langParams = await this._processChannelIgnore(args, setting, guild, 'S_MESSAGELOG_IGNORE_');
if (langParams.error) return langParams;
({ index } = langParams);
2020-05-24 00:11:06 +02:00
// if (!args.length) return {
// msg: message.format('MISSING_ARGS'),
// error: true
// };
// const response = await this.resolveMethod(args, { existing: setting.ignoredChannels, resolver: guild.resolveChannels.bind(guild) });
2020-05-24 00:11:06 +02:00
// if (response) {
2020-05-24 00:11:06 +02:00
// if (response.method === 'add') {
2020-05-24 00:11:06 +02:00
// const channels = response.resolved; //await guild.resolveChannels(response.rest);
// if (!channels.length) return { error: true, msg: message.format('ERR_CHRESOLVE') };
// setting.ignoredChannels = [...setting.ignoredChannels, ...channels.filter((c) => !setting.ignoredChannels.includes(c.id)).map((c) => c.id)];
2020-05-24 00:11:06 +02:00
// action = 'GENERAL_ADDED';
// index = 'S_MESSAGELOG_CHANNELS';
// langParams.changed = channels.map((c) => `<#${c.id}>`);
2020-05-24 00:11:06 +02:00
// } else if (response.method === 'remove') {
2020-05-24 00:11:06 +02:00
// const channels = response.resolved; //await guild.resolveChannels(response.rest);
// if (!channels.length) return { error: true, msg: message.format('ERR_CHRESOLVE') };
// const _channels = channels.map((c) => c.id);
// setting.ignoredChannels = setting.ignoredChannels.filter((c) => !_channels.includes(c));
2020-05-24 00:11:06 +02:00
// action = 'GENERAL_REMOVED';
// index = 'S_MESSAGELOG_CHANNELS';
// langParams.changed = channels.map((c) => `<#${c.id}>`);
// } else if (response.method === 'list') {
// return {
// msg: message.format('S_MESSAGELOG_LIST')
// };
// }
2020-05-24 00:11:06 +02:00
// } else {
// const channels = await guild.resolveChannels(setting.ignoredChannels);
// return {
// msg: message.format('S_MESSAGELOG_ROLES_LIST', { roles: channels.map((r) => r.name).join(', ') })
// };
// }
2020-05-24 00:11:06 +02:00
2020-05-24 10:54:33 +02:00
} else if (['attachments', 'images', 'attachment', 'image'].includes(method)) {
2020-05-24 00:11:06 +02:00
2020-09-30 18:23:36 +02:00
if (guild.premium < 2 && !message.author.developer) return {
2020-07-11 22:39:05 +02:00
msg: message.format('PREMIUM_REQUIRED', { required: 2, tier: guild.premium }),
2020-05-24 00:11:06 +02:00
error: true
};
2020-05-24 23:42:17 +02:00
if (!args.length) return {
msg: message.format('MISSING_ARGS'),
error: true
};
2020-05-24 00:11:06 +02:00
const [bool] = args;
const result = this.client.resolver.resolveBoolean(bool);
if (result) {
setting.attachments = true;
2020-05-24 10:54:33 +02:00
index = 'S_MESSAGELOG_ATTACHMENTS';
langParams.changed = message.format('ON_OFF_TOGGLE', { toggle: true }, true);
2020-05-24 00:11:06 +02:00
} else {
setting.attachments = false;
2020-05-24 10:54:33 +02:00
index = 'S_MESSAGELOG_ATTACHMENTS';
langParams.changed = message.format('ON_OFF_TOGGLE', { toggle: false }, true);
2020-05-24 00:11:06 +02:00
}
2020-05-24 23:42:17 +02:00
} else if (this.client.resolver.resolveBoolean(method) === false) {
index = 'S_MESSAGELOG_TOGGLE';
langParams.changed = message.format('ON_OFF_TOGGLE', { toggle: false }, true);
2020-05-24 23:42:17 +02:00
2020-06-18 16:07:39 +02:00
if (setting.webhook) { //Clean up - remove webhook since logs were disabled
const channel = await guild.resolveChannel(setting.channel);
2020-06-18 16:07:39 +02:00
if (channel) { //Channel might have been deleted
//const hooks = await channel.fetchWebhooks();
const hook = await guild.getWebhook(this.index); //hooks.filter((hook) => hook.id === setting.webhook.id).first();
2020-06-18 23:00:32 +02:00
if (hook && !channel.permissionsFor(guild.me).has('MANAGE_WEBHOOKS')) return { error: true, msg: message.format('S_MESSAGELOG_TOGGLE_PERM') }; //index = 'S_MESSAGELOG_TOGGLE_PERM'; //missing perms
2020-08-17 22:24:43 +02:00
else if (hook) {
//await hook.delete('Removing message logging hook, as message logs were disabled.').catch(this.client.logger.error);
//guild.webhooks.delete(setting.webhook);
await guild.updateWebhook(this.index);
}
2020-06-18 16:07:39 +02:00
}
}
setting.channel = null;
} else { //Set the channel & configure webhook
2020-05-24 00:11:06 +02:00
const channel = await guild.resolveChannel(method);
2020-05-24 00:11:06 +02:00
if (!channel) return {
2020-05-24 23:42:17 +02:00
msg: message.format('ERR_CHANNEL_RESOLVE', { resolveable: method }),
2020-05-24 00:11:06 +02:00
error: true
};
2020-06-19 20:29:54 +02:00
if(channel.type !== 'text') return {
error: true,
msg: message.format('ERR_CHANNEL_TYPE', { type: channel.type })
};
const perms = channel.permissionsFor(guild.me);
2021-05-05 16:46:01 +02:00
const missingPerms = perms.missing(['SEND_MESSAGES', 'VIEW_CHANNEL', 'MANAGE_WEBHOOKS', 'EMBED_LINKS']);
2020-06-19 20:29:54 +02:00
if(missingPerms.length) return {
error: true,
msg: message.format('ERR_CHANNEL_PERMS', { channel: channel.name, perms: missingPerms.join(', ') })
};
2020-05-24 00:11:06 +02:00
2020-08-17 22:24:43 +02:00
//Handle old webhook if one exists
const oldChannel = await guild.resolveChannel(setting.channel);
if (oldChannel && oldChannel.id !== channel.id) {
//const hooks = await oldChannel.fetchWebhooks();
const hook = await guild.getWebhook(this.index); //hooks.filter((hook) => hook.id === setting.webhook.id).first();
2020-08-17 22:24:43 +02:00
if (hook) {
//guild.updateWebhook(this.index);
2020-08-17 22:24:43 +02:00
//hook.delete('Removing old webhook').catch(this.client.logger.error);
await hook.edit({ channel });
}
} else if (!oldChannel) {
//Create new webhook
const hook = await channel.createWebhook('Galactic Bot message logs', { avatar: './util/GBotTest.png', reason: 'Message logs webhook.' });
await guild.updateWebhook(this.index, hook);
}
2020-06-18 23:00:32 +02:00
2020-06-18 16:07:39 +02:00
2020-05-24 23:42:17 +02:00
index = 'S_MESSAGELOG_CHANNEL';
langParams.changed = channel.name;
2020-05-24 00:11:06 +02:00
setting.channel = channel.id;
}
await message.guild._updateSettings({ [this.index]: setting });
return {
msg: message.format(index, langParams)
2020-05-24 00:11:06 +02:00
};
}
async fields(guild) {
2020-05-24 23:42:17 +02:00
const setting = guild._settings[this.index];
const roles = setting?.bypass ? await Promise.all(setting.bypass.map(async (role) => guild.resolveRole(role))) : undefined;
const channels = setting?.ignore ? await Promise.all(setting.ignore.map(async (c) => guild.resolveChannel(c))) : undefined;
2020-05-24 00:11:06 +02:00
return [
{
name: '》 Status',
value: guild.format('SETTING_STATUS', { bool: Boolean(setting?.channel) }, true),
inline: true
},
{
name: '》 Channel',
value: await guild.resolveChannel(setting?.channel) || '`N/A`',
2020-05-24 00:11:06 +02:00
inline: true
},
2020-06-20 22:28:26 +02:00
{
name: '》 Attachment Logs',
value: guild.format('SETTING_STATUS', { bool: Boolean(setting?.attachments) }, true),
2020-06-20 22:28:26 +02:00
inline: true
},
2020-05-24 00:11:06 +02:00
{
name: '》 Ignored Roles',
value: roles?.map((r) => `<@&${r.id}>`).join(' ') || '`N/A`'
2020-05-24 00:11:06 +02:00
},
{
name: '》 Ignored Channels',
value: channels?.map((c) => `<#${c.id}>`).join(' ') || '`N/A`'
2020-05-24 00:11:06 +02:00
}
];
}
2020-08-17 22:24:43 +02:00
async _handleReset(message) {
const result = await super._handleReset(message);
await message.guild.updateWebhook(this.index);
return result;
}
2020-05-24 00:11:06 +02:00
}
2020-05-24 10:54:33 +02:00
module.exports = MessageLogsSetting;