- Revised README to include database migration steps and a new section for database management. - Enhanced moderation command responses to utilize localized messages for unknown commands. - Refactored moderation commands to use centralized command data definitions, improving maintainability and consistency. - Added localization support for command descriptions and options in both German and English. - Versioned Prisma migrations for better tracking of database changes.
214 lines
8.2 KiB
TypeScript
214 lines
8.2 KiB
TypeScript
import {
|
|
SlashCommandBuilder,
|
|
type SlashCommandStringOption,
|
|
type SlashCommandUserOption
|
|
} from 'discord.js';
|
|
import {
|
|
applyCommandDescription,
|
|
applyOptionDescription,
|
|
localizedChoice,
|
|
type CommandLocaleKey
|
|
} from '@nexumi/shared';
|
|
|
|
function userOpt(
|
|
o: SlashCommandUserOption,
|
|
key: CommandLocaleKey = 'moderation.common.options.user'
|
|
) {
|
|
return applyOptionDescription(o.setName('user').setRequired(true), key);
|
|
}
|
|
|
|
function reasonOpt(o: SlashCommandStringOption, required = false) {
|
|
const option = o.setName('reason');
|
|
if (required) {
|
|
option.setRequired(true);
|
|
}
|
|
return applyOptionDescription(option, 'moderation.common.options.reason');
|
|
}
|
|
|
|
export const banCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('ban'),
|
|
'moderation.ban.description'
|
|
)
|
|
.addUserOption((o) => userOpt(o, 'moderation.ban.options.user'))
|
|
.addStringOption((o) => reasonOpt(o))
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('duration'), 'moderation.ban.options.duration')
|
|
);
|
|
|
|
export const unbanCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('unban'),
|
|
'moderation.unban.description'
|
|
)
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('user_id').setRequired(true), 'moderation.unban.options.user_id')
|
|
)
|
|
.addStringOption((o) => reasonOpt(o));
|
|
|
|
export const kickCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('kick'),
|
|
'moderation.kick.description'
|
|
)
|
|
.addUserOption((o) => userOpt(o, 'moderation.ban.options.user'))
|
|
.addStringOption((o) => reasonOpt(o));
|
|
|
|
export const timeoutCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('timeout'),
|
|
'moderation.timeout.description'
|
|
)
|
|
.addUserOption((o) => userOpt(o, 'moderation.ban.options.user'))
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('duration').setRequired(true), 'moderation.timeout.options.duration')
|
|
)
|
|
.addStringOption((o) => reasonOpt(o));
|
|
|
|
export const untimeoutCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('untimeout'),
|
|
'moderation.untimeout.description'
|
|
)
|
|
.addUserOption((o) => userOpt(o, 'moderation.ban.options.user'))
|
|
.addStringOption((o) => reasonOpt(o));
|
|
|
|
export const warnCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('warn'),
|
|
'moderation.warn.description'
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('add'), 'moderation.warn.add.description')
|
|
.addUserOption((o) => userOpt(o, 'moderation.common.options.target'))
|
|
.addStringOption((o) => reasonOpt(o, true))
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('list'), 'moderation.warn.list.description').addUserOption((o) =>
|
|
userOpt(o, 'moderation.common.options.target')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('remove'), 'moderation.warn.remove.description').addStringOption(
|
|
(o) =>
|
|
applyOptionDescription(o.setName('warning_id').setRequired(true), 'moderation.warn.options.warning_id')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('clear'), 'moderation.warn.clear.description').addUserOption((o) =>
|
|
userOpt(o, 'moderation.common.options.target')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('escalation-set'), 'moderation.warn.escalation_set.description')
|
|
.addIntegerOption((o) =>
|
|
applyOptionDescription(o.setName('count').setRequired(true).setMinValue(1).setMaxValue(50), 'moderation.warn.options.count')
|
|
)
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('action').setRequired(true), 'moderation.warn.options.action').addChoices(
|
|
localizedChoice('moderation.choice.timeout', 'TIMEOUT'),
|
|
localizedChoice('moderation.choice.kick', 'KICK'),
|
|
localizedChoice('moderation.choice.ban', 'BAN')
|
|
)
|
|
)
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('duration'), 'moderation.warn.options.escalation_duration')
|
|
)
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('reason'), 'moderation.warn.options.escalation_reason')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('escalation-list'), 'moderation.warn.escalation_list.description')
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('escalation-remove'), 'moderation.warn.escalation_remove.description').addIntegerOption(
|
|
(o) =>
|
|
applyOptionDescription(o.setName('count').setRequired(true).setMinValue(1).setMaxValue(50), 'moderation.warn.options.count')
|
|
)
|
|
);
|
|
|
|
export const purgeCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('purge'),
|
|
'moderation.purge.description'
|
|
)
|
|
.addIntegerOption((o) =>
|
|
applyOptionDescription(o.setName('amount').setRequired(true).setMinValue(2).setMaxValue(100), 'moderation.purge.options.amount')
|
|
)
|
|
.addUserOption((o) => applyOptionDescription(o.setName('user'), 'moderation.purge.options.user'))
|
|
.addBooleanOption((o) => applyOptionDescription(o.setName('bots'), 'moderation.purge.options.bots'))
|
|
.addBooleanOption((o) => applyOptionDescription(o.setName('links'), 'moderation.purge.options.links'))
|
|
.addBooleanOption((o) =>
|
|
applyOptionDescription(o.setName('attachments'), 'moderation.purge.options.attachments')
|
|
)
|
|
.addStringOption((o) => applyOptionDescription(o.setName('regex'), 'moderation.purge.options.regex'));
|
|
|
|
export const slowmodeCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('slowmode'),
|
|
'moderation.slowmode.description'
|
|
).addIntegerOption((o) =>
|
|
applyOptionDescription(o.setName('seconds').setRequired(true).setMinValue(0).setMaxValue(21600), 'moderation.slowmode.options.seconds')
|
|
);
|
|
|
|
export const lockCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('lock'),
|
|
'moderation.lock.description'
|
|
);
|
|
|
|
export const unlockCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('unlock'),
|
|
'moderation.unlock.description'
|
|
);
|
|
|
|
export const nickCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('nick'),
|
|
'moderation.nick.description'
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('set'), 'moderation.nick.set.description')
|
|
.addUserOption((o) => userOpt(o, 'moderation.common.options.target'))
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('nickname').setRequired(true), 'moderation.nick.options.nickname')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('reset'), 'moderation.nick.reset.description').addUserOption((o) =>
|
|
userOpt(o, 'moderation.common.options.target')
|
|
)
|
|
);
|
|
|
|
export const caseCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('case'),
|
|
'moderation.case.description'
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('view'), 'moderation.case.view.description').addIntegerOption((o) =>
|
|
applyOptionDescription(o.setName('id').setRequired(true), 'moderation.case.options.id')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('edit'), 'moderation.case.edit.description')
|
|
.addIntegerOption((o) =>
|
|
applyOptionDescription(o.setName('id').setRequired(true), 'moderation.case.options.id')
|
|
)
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('reason').setRequired(true), 'moderation.case.options.reason')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('delete'), 'moderation.case.delete.description').addIntegerOption((o) =>
|
|
applyOptionDescription(o.setName('id').setRequired(true), 'moderation.case.options.id')
|
|
)
|
|
);
|
|
|
|
export const modNoteCommandData = applyCommandDescription(
|
|
new SlashCommandBuilder().setName('modnote'),
|
|
'moderation.modnote.description'
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('add'), 'moderation.modnote.add.description')
|
|
.addUserOption((o) => userOpt(o, 'moderation.common.options.target'))
|
|
.addStringOption((o) =>
|
|
applyOptionDescription(o.setName('note').setRequired(true), 'moderation.modnote.options.note')
|
|
)
|
|
)
|
|
.addSubcommand((s) =>
|
|
applyCommandDescription(s.setName('list'), 'moderation.modnote.list.description').addUserOption((o) =>
|
|
userOpt(o, 'moderation.common.options.target')
|
|
)
|
|
);
|