add /timeout command
This commit is contained in:
parent
ce08777c7a
commit
48de9db224
1 changed files with 64 additions and 0 deletions
64
bot/src/bot/commands/moderation/timeout.ts
Normal file
64
bot/src/bot/commands/moderation/timeout.ts
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
import { client } from "../../..";
|
||||||
|
import CommandCategory from "../../../struct/commands/CommandCategory";
|
||||||
|
import SimpleCommand from "../../../struct/commands/SimpleCommand";
|
||||||
|
import MessageCommandContext from "../../../struct/MessageCommandContext";
|
||||||
|
import { isModerator, NO_MANAGER_MSG, parseUser } from "../../util";
|
||||||
|
|
||||||
|
function parseTimeInput(input: string) {
|
||||||
|
if (!/([0-9]{1,3}[smhdwy])+/g.test(input)) return null;
|
||||||
|
|
||||||
|
let pieces = input.match(/([0-9]{1,3}[smhdwy])/g) ?? [];
|
||||||
|
let res = 0;
|
||||||
|
|
||||||
|
// Being able to specify the same letter multiple times
|
||||||
|
// (e.g. 1s1s) and having their values stack is a feature
|
||||||
|
for (const piece of pieces) {
|
||||||
|
let [ num, letter ] = [ Number(piece.slice(0, piece.length - 1)), piece.slice(piece.length - 1) ];
|
||||||
|
let multiplier = 0;
|
||||||
|
|
||||||
|
switch(letter) {
|
||||||
|
case 's': multiplier = 1000; break;
|
||||||
|
case 'm': multiplier = 1000 * 60; break;
|
||||||
|
case 'h': multiplier = 1000 * 60 * 60; break;
|
||||||
|
case 'd': multiplier = 1000 * 60 * 60 * 24; break;
|
||||||
|
case 'w': multiplier = 1000 * 60 * 60 * 24 * 7; break;
|
||||||
|
case 'y': multiplier = 1000 * 60 * 60 * 24 * 365; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
res += num * multiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'timeout',
|
||||||
|
aliases: [ 'mute' ],
|
||||||
|
description: 'Set a timeout on a user',
|
||||||
|
category: CommandCategory.Moderation,
|
||||||
|
run: async (message: MessageCommandContext, args: string[]) => {
|
||||||
|
try {
|
||||||
|
if (!await isModerator(message)) return await message.reply(NO_MANAGER_MSG);
|
||||||
|
|
||||||
|
const target = await parseUser(args[0] ?? '');
|
||||||
|
if (!target) return await message.reply('No user provided or provided user is not valid');
|
||||||
|
|
||||||
|
const duration = parseTimeInput(args[1] ?? '');
|
||||||
|
if (!duration) {
|
||||||
|
await client.api.patch(`/servers/${message.serverContext._id}/members/${target._id}` as '/servers/{server}/members/{target}', {
|
||||||
|
timeout: new Date(0).toISOString()
|
||||||
|
} as any);
|
||||||
|
await message.reply(`Timeout cleared on @${target.username}`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await client.api.patch(`/servers/${message.serverContext._id}/members/${target._id}` as '/servers/{server}/members/{target}', {
|
||||||
|
timeout: new Date(Date.now() + duration).toISOString()
|
||||||
|
} as any);
|
||||||
|
await message.reply(`Successfully timed out @${target.username}`);
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
console.error('' + e);
|
||||||
|
message.reply('Something went wrong: ' + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} as SimpleCommand;
|
Loading…
Reference in a new issue