forked from engineering/cloudservices
Added error handler
parent
17760f41c4
commit
371b3328de
|
@ -1,6 +1,7 @@
|
||||||
import { promisify } from 'util';
|
import { promisify } from 'util';
|
||||||
import childProcess from 'child_process';
|
import childProcess from 'child_process';
|
||||||
import nodemailer from 'nodemailer';
|
import nodemailer from 'nodemailer';
|
||||||
|
import { Message } from 'eris';
|
||||||
import Client from './Client';
|
import Client from './Client';
|
||||||
import Command from './class/Command';
|
import Command from './class/Command';
|
||||||
|
|
||||||
|
@ -39,4 +40,11 @@ export default class Util {
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async handleError(error: Error, message?: Message, command?: Command): Promise<Message> {
|
||||||
|
const stack = await this.client.createMessage('595788220764127272', `\`\`\`js\n${error.stack}\n\`\`\``);
|
||||||
|
if (command) this.client.commands.get(command.name).enabled = false;
|
||||||
|
if (message) message.channel.createMessage(`***${this.client.stores.emojis.error} An unexpected error has occured - please contact a member of the Engineering Team.${command ? ' This command has been disabled.' : ''}***`);
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,11 @@ import fs from 'fs-extra';
|
||||||
import { Message } from 'eris';
|
import { Message } from 'eris';
|
||||||
import Client from '../Client';
|
import Client from '../Client';
|
||||||
import Command from '../class/Command';
|
import Command from '../class/Command';
|
||||||
|
import Util from '../Util';
|
||||||
|
|
||||||
export default class Lock extends Command {
|
export default class Lock extends Command {
|
||||||
|
util: Util = new Util(this.client)
|
||||||
|
|
||||||
constructor(client: Client) {
|
constructor(client: Client) {
|
||||||
super(client);
|
super(client);
|
||||||
this.name = 'lock';
|
this.name = 'lock';
|
||||||
|
@ -13,9 +16,12 @@ export default class Lock extends Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async run(message: Message, args: string[]) { // eslint-disable-line
|
public async run(message: Message, args: string[]) { // eslint-disable-line
|
||||||
let account = await this.client.db.Account.findOne({ account: args[0] });
|
try {
|
||||||
if (!account) account = await this.client.db.Account.findOne({ userID: args[0].replace(/[<@!>]/gi, '') });
|
const account = await this.client.db.Account.findOne({ $or: [{ account: args[0] }, { userID: args[0].replace(/[<@!>]/gi, '') }] });
|
||||||
if (!account) return message.channel.createMessage(`***${this.client.stores.emojis.error} Cannot find user.***`);
|
if (!account) return message.channel.createMessage(`***${this.client.stores.emojis.error} Cannot find user.***`);
|
||||||
const edit = await message.channel.createMessage(`***${this.client.stores.emojis.loading} Locking account...***`);
|
const edit = await message.channel.createMessage(`***${this.client.stores.emojis.loading} Locking account...***`);
|
||||||
|
} catch (error) {
|
||||||
|
return this.util.handleError(error, message, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,11 @@ import { createPaginationEmbed } from 'eris-pagination';
|
||||||
import Client from '../Client';
|
import Client from '../Client';
|
||||||
import Command from '../class/Command';
|
import Command from '../class/Command';
|
||||||
import RichEmbed from '../class/RichEmbed';
|
import RichEmbed from '../class/RichEmbed';
|
||||||
|
import Util from '../Util';
|
||||||
|
|
||||||
export default class Modlogs extends Command {
|
export default class Modlogs extends Command {
|
||||||
|
util: Util = new Util(this.client)
|
||||||
|
|
||||||
constructor(client: Client) {
|
constructor(client: Client) {
|
||||||
super(client);
|
super(client);
|
||||||
this.name = 'modlogs';
|
this.name = 'modlogs';
|
||||||
|
@ -15,38 +18,42 @@ export default class Modlogs extends Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async run(message: Message, args: string[]) {
|
public async run(message: Message, args: string[]) {
|
||||||
const msg: Message = await message.channel.createMessage(`***${this.client.stores.emojis.loading} Locating modlogs...***`);
|
try {
|
||||||
const query = await this.client.db.Moderation.find({ $or: [{ account: args.join(' ') }, { userID: args.filter((a) => a)[0].replace(/[<@!>]/g, '') }] });
|
const msg: Message = await message.channel.createMessage(`***${this.client.stores.emojis.loading} Locating modlogs...***`);
|
||||||
if (!query.length) return msg.edit(`***${this.client.stores.emojis.error} Cannot locate modlogs for ${args.join(' ')}***`);
|
const query = await this.client.db.Moderation.find({ $or: [{ account: args.join(' ') }, { userID: args.filter((a) => a)[0].replace(/[<@!>]/g, '') }] });
|
||||||
|
if (!query.length) return msg.edit(`***${this.client.stores.emojis.error} Cannot locate modlogs for ${args.join(' ')}***`);
|
||||||
|
|
||||||
let index = 0; const logs: {name: string, value: string, inline: boolean}[][] = [[]];
|
let index = 0; const logs: {name: string, value: string, inline: boolean}[][] = [[]];
|
||||||
const formatted = query.map((log) => {
|
const formatted = query.map((log) => {
|
||||||
const { account, moderatorID, reason, type, date } = log;
|
const { account, moderatorID, reason, type, date } = log;
|
||||||
const name = type;
|
const name = type;
|
||||||
const value = `**Account name:** ${account}\n**Moderator:** <@${moderatorID}>\n**Reason:** ${reason}\n**Date:** ${date.toLocaleString('en-us')} EST`;
|
const value = `**Account name:** ${account}\n**Moderator:** <@${moderatorID}>\n**Reason:** ${reason}\n**Date:** ${date.toLocaleString('en-us')} EST`;
|
||||||
const inline = true;
|
const inline = true;
|
||||||
return { name, value, inline };
|
return { name, value, inline };
|
||||||
});
|
});
|
||||||
const users = [...new Set(query.map((log) => log.userID))].map((u) => `<@${u}>`);
|
const users = [...new Set(query.map((log) => log.userID))].map((u) => `<@${u}>`);
|
||||||
|
|
||||||
while (query.length) {
|
while (query.length) {
|
||||||
if (logs[index].length >= 25) { index += 1; logs[index] = []; }
|
if (logs[index].length >= 25) { index += 1; logs[index] = []; }
|
||||||
logs[index].push(formatted[0]); formatted.shift();
|
logs[index].push(formatted[0]); formatted.shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
const embeds = logs.map((l) => {
|
||||||
|
const embed = new RichEmbed();
|
||||||
|
embed.setDescription(`List of Cloud moderation logs for ${users.join(', ')}`);
|
||||||
|
embed.setAuthor('Library of Code | Cloud Services', this.client.user.avatarURL, 'https://libraryofcode.us');
|
||||||
|
embed.setTitle('Cloud Modlogs/Infractions');
|
||||||
|
embed.setFooter(`Requested by ${message.author.username}#${message.author.discriminator}`, message.author.avatarURL);
|
||||||
|
l.forEach((f) => embed.addField(f.name, f.value, f.inline));
|
||||||
|
embed.setTimestamp();
|
||||||
|
embed.setColor(3447003);
|
||||||
|
return embed;
|
||||||
|
});
|
||||||
|
|
||||||
|
createPaginationEmbed(message, this.client, embeds, {}, msg);
|
||||||
|
return msg;
|
||||||
|
} catch (error) {
|
||||||
|
return this.util.handleError(error, message, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
const embeds = logs.map((l) => {
|
|
||||||
const embed = new RichEmbed();
|
|
||||||
embed.setDescription(`List of Cloud moderation logs for ${users.join(', ')}`);
|
|
||||||
embed.setAuthor('Library of Code | Cloud Services', this.client.user.avatarURL, 'https://libraryofcode.us');
|
|
||||||
embed.setTitle('Cloud Modlogs/Infractions');
|
|
||||||
embed.setFooter(`Requested by ${message.author.username}#${message.author.discriminator}`, message.author.avatarURL);
|
|
||||||
l.forEach((f) => embed.addField(f.name, f.value, f.inline));
|
|
||||||
embed.setTimestamp();
|
|
||||||
embed.setColor(3447003);
|
|
||||||
return embed;
|
|
||||||
});
|
|
||||||
|
|
||||||
createPaginationEmbed(message, this.client, embeds, {}, msg);
|
|
||||||
return msg;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
import { Message } from 'eris';
|
import { Message } from 'eris';
|
||||||
import Client from '../Client';
|
import Client from '../Client';
|
||||||
import Command from '../class/Command';
|
import Command from '../class/Command';
|
||||||
|
import Util from '../Util';
|
||||||
|
|
||||||
export default class Ping extends Command {
|
export default class Ping extends Command {
|
||||||
|
util: Util = new Util(this.client)
|
||||||
|
|
||||||
constructor(client: Client) {
|
constructor(client: Client) {
|
||||||
super(client);
|
super(client);
|
||||||
this.name = 'ping';
|
this.name = 'ping';
|
||||||
|
@ -11,8 +14,12 @@ export default class Ping extends Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async run(message: Message) {
|
public async run(message: Message) {
|
||||||
const clientStart: number = Date.now();
|
try {
|
||||||
const msg: Message = await message.channel.createMessage('🏓 Pong!');
|
const clientStart: number = Date.now();
|
||||||
msg.edit(`🏓 Pong!\nClient: \`${Date.now() - clientStart}ms\`\nResponse: \`${msg.createdAt - message.createdAt}ms\``);
|
const msg: Message = await message.channel.createMessage('🏓 Pong!');
|
||||||
|
msg.edit(`🏓 Pong!\nClient: \`${Date.now() - clientStart}ms\`\nResponse: \`${msg.createdAt - message.createdAt}ms\``);
|
||||||
|
} catch (error) {
|
||||||
|
this.util.handleError(error, message, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,21 +14,25 @@ export default class {
|
||||||
util: Util = new Util(this.client)
|
util: Util = new Util(this.client)
|
||||||
|
|
||||||
async run(message: Message) {
|
async run(message: Message) {
|
||||||
const noPrefix: string[] = message.content.slice(prefix.length).trim().split(/ +/g);
|
try {
|
||||||
const command: string = noPrefix[0].toLowerCase();
|
const noPrefix: string[] = message.content.slice(prefix.length).trim().split(/ +/g);
|
||||||
const resolved: Command = this.util.resolveCommand(command);
|
const command: string = noPrefix[0].toLowerCase();
|
||||||
if (!resolved) return;
|
const resolved: Command = this.util.resolveCommand(command);
|
||||||
if (resolved.guildOnly && !(message.channel instanceof TextChannel)) return;
|
if (!resolved) return;
|
||||||
const hasUserPerms: boolean = resolved.permissions.users.includes(message.author.id);
|
if (resolved.guildOnly && !(message.channel instanceof TextChannel)) return;
|
||||||
let hasRolePerms: boolean = false;
|
const hasUserPerms: boolean = resolved.permissions.users.includes(message.author.id);
|
||||||
for (const role of resolved.permissions.roles) {
|
let hasRolePerms: boolean = false;
|
||||||
if (message.member && message.member.roles.includes(role)) {
|
for (const role of resolved.permissions.roles) {
|
||||||
hasRolePerms = true; break;
|
if (message.member && message.member.roles.includes(role)) {
|
||||||
|
hasRolePerms = true; break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (!hasRolePerms && !hasUserPerms) return;
|
||||||
|
if (!resolved.enabled) { message.channel.createMessage(`***${this.client.stores.emojis.error} This command has been disabled***`); return; }
|
||||||
|
const args: string[] = noPrefix.slice(1);
|
||||||
|
resolved.run(message, args);
|
||||||
|
} catch (error) {
|
||||||
|
this.util.handleError(error, message);
|
||||||
}
|
}
|
||||||
if (!hasRolePerms && !hasUserPerms) return;
|
|
||||||
if (!resolved.enabled) { message.channel.createMessage(`***${this.client.stores.emojis.error} This command has been disabled***`); return; }
|
|
||||||
const args: string[] = noPrefix.slice(1);
|
|
||||||
resolved.run(message, args);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue