TravBot-v3/src/commands/system/admin.ts

215 lines
9.1 KiB
TypeScript
Raw Normal View History

2021-03-31 03:22:25 +00:00
import Command, {handler} from "../../core/command";
import {clean} from "../../core/lib";
import {botHasPermission} from "../../core/libd";
import {Config, Storage} from "../../core/structures";
import {getPermissionLevel, getPermissionName} from "../../core/permissions";
2020-12-15 01:44:28 +00:00
import {Permissions} from "discord.js";
2021-03-31 03:22:25 +00:00
import {logs} from "../../globals";
2020-12-15 01:44:28 +00:00
function getLogBuffer(type: string) {
return {
files: [
{
attachment: Buffer.alloc(logs[type].length, logs[type]),
name: `${Date.now()}.${type}.log`
}
]
};
}
const activities = ["playing", "listening", "streaming", "watching"];
const statuses = ["online", "idle", "dnd", "invisible"];
export default new Command({
description:
"An all-in-one command to do admin stuff. You need to be either an admin of the server or one of the bot's mechanics to use this command.",
async run($) {
if (!$.member) {
$.channel.send("Couldn't find a member object for you! Did you make sure you used this in a server?");
return;
}
2020-12-15 01:44:28 +00:00
const permLevel = getPermissionLevel($.member);
$.channel.send(
2021-03-30 10:54:52 +00:00
`${$.author.toString()}, your permission level is \`${getPermissionName(permLevel)}\` (${permLevel}).`
2020-12-15 01:44:28 +00:00
);
},
subcommands: {
set: new Command({
description: "Set different per-guild settings for the bot.",
run: "You have to specify the option you want to set.",
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.ADMIN,
2020-12-15 01:44:28 +00:00
subcommands: {
prefix: new Command({
2020-12-15 07:56:09 +00:00
description: "Set a custom prefix for your guild. Removes your custom prefix if none is provided.",
2020-12-15 01:44:28 +00:00
usage: "(<prefix>)",
async run($) {
2020-12-15 01:44:28 +00:00
Storage.getGuild($.guild?.id || "N/A").prefix = null;
Storage.save();
$.channel.send(
`The custom prefix for this guild has been removed. My prefix is now back to \`${Config.prefix}\`.`
);
},
any: new Command({
async run($) {
2020-12-15 07:56:09 +00:00
Storage.getGuild($.guild?.id || "N/A").prefix = $.args[0];
2020-12-15 01:44:28 +00:00
Storage.save();
2020-12-15 07:56:09 +00:00
$.channel.send(`The custom prefix for this guild is now \`${$.args[0]}\`.`);
2020-12-15 01:44:28 +00:00
}
})
})
}
}),
diag: new Command({
2020-12-15 07:56:09 +00:00
description: 'Requests a debug log with the "info" verbosity level.',
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.BOT_SUPPORT,
async run($) {
2020-12-15 01:44:28 +00:00
$.channel.send(getLogBuffer("info"));
},
any: new Command({
2020-12-15 07:56:09 +00:00
description: `Select a verbosity to listen to. Available levels: \`[${Object.keys(logs).join(", ")}]\``,
async run($) {
2020-12-15 01:44:28 +00:00
const type = $.args[0];
if (type in logs) $.channel.send(getLogBuffer(type));
else
$.channel.send(
`Couldn't find a verbosity level named \`${type}\`! The available types are \`[${Object.keys(
logs
).join(", ")}]\`.`
);
}
})
}),
status: new Command({
description: "Changes the bot's status.",
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.BOT_SUPPORT,
async run($) {
2020-12-15 01:44:28 +00:00
$.channel.send("Setting status to `online`...");
},
any: new Command({
2020-12-15 07:56:09 +00:00
description: `Select a status to set to. Available statuses: \`[${statuses.join(", ")}]\`.`,
async run($) {
if (!statuses.includes($.args[0])) {
$.channel.send("That status doesn't exist!");
return;
} else {
2020-12-15 01:44:28 +00:00
$.client.user?.setStatus($.args[0]);
$.channel.send(`Setting status to \`${$.args[0]}\`...`);
}
}
})
}),
purge: new Command({
2021-03-30 23:14:15 +00:00
description: "Purges the bot's own messages.",
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.BOT_SUPPORT,
async run($) {
2021-03-30 23:14:15 +00:00
// It's probably better to go through the bot's own messages instead of calling bulkDelete which requires MANAGE_MESSAGES.
if (botHasPermission($.guild, Permissions.FLAGS.MANAGE_MESSAGES) && $.channel.type !== "dm") {
$.message.delete();
const msgs = await $.channel.messages.fetch({
limit: 100
});
const travMessages = msgs.filter((m) => m.author.id === $.client.user?.id);
2020-12-15 01:44:28 +00:00
2021-03-30 23:14:15 +00:00
await $.channel.send(`Found ${travMessages.size} messages to delete.`).then((m) =>
m.delete({
timeout: 5000
})
);
await $.channel.bulkDelete(travMessages);
} else {
$.channel.send(
"This command must be executed in a guild where I have the `MANAGE_MESSAGES` permission."
);
}
2020-12-15 01:44:28 +00:00
}
}),
clear: new Command({
description: "Clears a given amount of messages.",
usage: "<amount>",
run: "A number was not provided.",
number: new Command({
description: "Amount of messages to delete.",
async run($) {
2021-01-29 17:15:18 +00:00
if ($.channel.type === "dm") {
await $.channel.send("Can't clear messages in the DMs!");
return;
}
2020-12-15 01:44:28 +00:00
$.message.delete();
const fetched = await $.channel.messages.fetch({
limit: $.args[0]
});
2021-01-29 17:15:18 +00:00
await $.channel.bulkDelete(fetched);
2020-12-15 01:44:28 +00:00
}
})
}),
eval: new Command({
description: "Evaluate code.",
usage: "<code>",
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.BOT_OWNER,
// You have to bring everything into scope to use them. AFAIK, there isn't a more maintainable way to do this, but at least TS will let you know if anything gets removed.
async run({args, author, channel, client, guild, member, message}) {
2020-12-15 01:44:28 +00:00
try {
const code = args.join(" ");
2020-12-15 01:44:28 +00:00
let evaled = eval(code);
2020-12-15 07:56:09 +00:00
if (typeof evaled !== "string") evaled = require("util").inspect(evaled);
channel.send(clean(evaled), {code: "js", split: true});
2020-12-15 01:44:28 +00:00
} catch (err) {
channel.send(clean(err), {code: "js", split: true});
2020-12-15 01:44:28 +00:00
}
}
}),
nick: new Command({
description: "Change the bot's nickname.",
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.BOT_SUPPORT,
async run($) {
2020-12-15 01:44:28 +00:00
const nickName = $.args.join(" ");
2021-01-29 19:12:53 +00:00
await $.guild?.me?.setNickname(nickName);
2020-12-15 07:56:09 +00:00
if (botHasPermission($.guild, Permissions.FLAGS.MANAGE_MESSAGES))
$.message.delete({timeout: 5000}).catch(handler.bind($));
2020-12-15 07:56:09 +00:00
$.channel.send(`Nickname set to \`${nickName}\``).then((m) => m.delete({timeout: 5000}));
2020-12-15 01:44:28 +00:00
}
}),
guilds: new Command({
description: "Shows a list of all guilds the bot is a member of.",
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.BOT_SUPPORT,
async run($) {
2020-12-15 07:56:09 +00:00
const guildList = $.client.guilds.cache.array().map((e) => e.name);
2021-03-30 23:14:15 +00:00
$.channel.send(guildList, {split: true});
2020-12-15 01:44:28 +00:00
}
}),
activity: new Command({
description: "Set the activity of the bot.",
2021-03-30 10:54:52 +00:00
permission: PERMISSIONS.BOT_SUPPORT,
2020-12-15 01:44:28 +00:00
usage: "<type> <string>",
async run($) {
2020-12-15 01:44:28 +00:00
$.client.user?.setActivity(".help", {
type: "LISTENING"
});
$.channel.send("Activity set to default.");
},
any: new Command({
2020-12-15 07:56:09 +00:00
description: `Select an activity type to set. Available levels: \`[${activities.join(", ")}]\``,
async run($) {
2020-12-15 01:44:28 +00:00
const type = $.args[0];
if (activities.includes(type)) {
$.client.user?.setActivity($.args.slice(1).join(" "), {
type: $.args[0].toUpperCase()
});
$.channel.send(
2020-12-15 07:56:09 +00:00
`Set activity to \`${$.args[0].toUpperCase()}\` \`${$.args.slice(1).join(" ")}\`.`
2020-12-15 01:44:28 +00:00
);
} else
$.channel.send(
`Couldn't find an activity type named \`${type}\`! The available types are \`[${activities.join(
", "
)}]\`.`
);
}
})
})
}
});