forked from Galactic/galactic-bot
case command
This commit is contained in:
parent
2fd1085d60
commit
6d443fea7b
134
src/structure/components/commands/moderation/Case.js
Normal file
134
src/structure/components/commands/moderation/Case.js
Normal file
@ -0,0 +1,134 @@
|
||||
const { Util } = require("../../../../utilities");
|
||||
const { SlashCommand } = require("../../../interfaces");
|
||||
const { inspect } = require('util');
|
||||
|
||||
class CaseCommand extends SlashCommand {
|
||||
|
||||
constructor(client) {
|
||||
super(client, {
|
||||
name: 'case',
|
||||
description: 'View case details',
|
||||
module: 'moderation',
|
||||
options: [{
|
||||
name: 'id',
|
||||
type: 'INTEGER',
|
||||
description: 'Case ID',
|
||||
minimum: 0
|
||||
}, {
|
||||
name: ['export', 'verbose', 'changes'], //
|
||||
type: 'BOOLEAN',
|
||||
description: [
|
||||
'Print out raw infraction data in JSON form',
|
||||
'Print out more detailed information about the case',
|
||||
'List changes to the case'
|
||||
],
|
||||
depeondsOn: ['id']
|
||||
}],
|
||||
guildOnly: true,
|
||||
showUsage: true
|
||||
});
|
||||
}
|
||||
|
||||
async execute(invoker, opts) {
|
||||
|
||||
const { id, verbose, export: exp, changes } = opts;
|
||||
const { guild } = invoker;
|
||||
|
||||
const infraction = await this.client.storageManager.mongodb.infractions.findOne({
|
||||
id: `${guild.id}:${id.value}`
|
||||
}, { projection: { _id: 0 } });
|
||||
|
||||
if (!infraction) return { emoji: 'failure', index: 'COMMAND_CASE_NOTFOUND', params: { caseID: id.value } };
|
||||
if (exp) return `\`\`\`js\n${inspect(infraction)}\`\`\``;
|
||||
if (changes.value) return { embed: await this._listChanges(invoker, infraction) };
|
||||
|
||||
const target = infraction.targetType === 'USER' ? await this.client.resolver.resolveUser(infraction.target) : await guild.resolveChannel(infraction.target);
|
||||
const staff = await this.client.resolver.resolveUser(infraction.executor);
|
||||
|
||||
let index = 'COMMAND_CASE_TEMPLATE',
|
||||
caseTitleIndex = 'COMMAND_CASE_TITLE',
|
||||
caseSlowmodeIndex = 'COMMAND_CASE_SLOWMODE',
|
||||
caseLengthIndex = 'COMMAND_CASE_LENGTH',
|
||||
targetUserIndex = 'COMMAND_CASE_TARGET_USER',
|
||||
targetChannelIndex = 'COMMAND_CASE_TARGET_CHANNEL';
|
||||
if (verbose?.value) {
|
||||
index += '_VERBOSE';
|
||||
caseTitleIndex += '_VERBOSE';
|
||||
caseSlowmodeIndex += '_VERBOSE';
|
||||
caseLengthIndex += '_VERBOSE';
|
||||
targetUserIndex += '_VERBOSE';
|
||||
targetChannelIndex += '_VERBOSE';
|
||||
}
|
||||
|
||||
let description = invoker.format(index, {
|
||||
uniqueID: infraction.id,
|
||||
type: infraction.type,
|
||||
date: `<t:${Math.floor(infraction.timestamp)}:f>`,
|
||||
unix: Math.floor(infraction.timestamp / 1000),
|
||||
relativeTime: `<t:${Math.floor(infraction.timestamp / 1000)}:R>`,
|
||||
relativeTimeSeconds: Math.floor((Date.now() - infraction.timestamp) / 1000),
|
||||
target: infraction.targetType === 'USER' ? invoker.format(targetUserIndex, { target: target.tag, targetID: target.id }) : invoker.format(targetChannelIndex, { target: target.name, targetID: target.id }),
|
||||
staff: staff.tag,
|
||||
staffID: staff.id,
|
||||
nrChanges: infraction.changes?.length || 0,
|
||||
changes: infraction.changes?.map((change) => change.type).join(', ') || 'N/A',
|
||||
guild: guild.id,
|
||||
channel: infraction.channel,
|
||||
message: infraction.message
|
||||
});
|
||||
|
||||
if (infraction.data.seconds) description += '\n' + invoker.format(caseSlowmodeIndex, { readable: Util.humanise(infraction.data.seconds), seconds: infraction.data.seconds });
|
||||
if (infraction.duration !== null) description += '\n' + invoker.format(caseLengthIndex, { time: Util.humanise(infraction.duration), inSeconds: infraction.duration });
|
||||
|
||||
if (guild._settings.modpoints.enabled) description += '\n' + invoker.format('COMMAND_CASE_MODPOINTS', {
|
||||
points: infraction.points,
|
||||
expires: infraction.expiration
|
||||
});
|
||||
|
||||
description += '\n\n' + invoker.format('COMMAND_CASE_REASON', { reason: infraction.reason });
|
||||
|
||||
const embed = {
|
||||
title: invoker.format(caseTitleIndex, { caseID: id.value }),
|
||||
description,
|
||||
color: 8662306
|
||||
};
|
||||
|
||||
return { embed };
|
||||
|
||||
}
|
||||
|
||||
async _listChanges(invoker, infraction) {
|
||||
|
||||
const embed = {
|
||||
title: invoker.format('COMMAND_CASE_CHANGES_TITLE', { case: infraction.case }),
|
||||
color: 8662306
|
||||
};
|
||||
|
||||
if (!infraction.changes || !infraction.changes.length) embed.description = invoker.format('COMMAND_CASE_CHANGES_NONE');
|
||||
else embed.fields = await Promise.all(infraction.changes.sort((a, b) => b.timestamp - a.timestamp).map(async (change) => {
|
||||
|
||||
const staff = await this.client.resolver.resolveUser(change.staff);
|
||||
const field = {
|
||||
name: change.type,
|
||||
value: invoker.format('COMMAND_CASE_CHANGE_BASE', {
|
||||
staff: staff.tag,
|
||||
date: new Date(change.timestamp * 1000).toUTCString(),
|
||||
timeAgo: `<t:${Math.floor(Date.now() / 1000)}:R>`
|
||||
})
|
||||
};
|
||||
|
||||
if (change.type === 'RESOLVE') field.value += '\n' + invoker.format('COMMAND_CASE_CHANGES_RESOLVE', { reason: change.reason || invoker.format('COMMAND_CASE_CHANGE_NOREASON') });
|
||||
if (change.type === 'REASON') field.value += '\n' + invoker.format('COMMAND_CASE_CHANGES_REASON', { reason: change.reason });
|
||||
if (change.type === 'DURATION') field.value += '\n' + invoker.format('COMMAND_CASE_CHANGES_DURATION', { duration: Util.humanise(change.duration) });
|
||||
|
||||
return field;
|
||||
|
||||
}));
|
||||
|
||||
return embed;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = CaseCommand;
|
Loading…
Reference in New Issue
Block a user