78 lines
2.7 KiB
TypeScript
78 lines
2.7 KiB
TypeScript
import { PermissionFlagsBits } from 'discord.js';
|
|
import { t, tf } from '@nexumi/shared';
|
|
import type { SlashCommand } from '../../types.js';
|
|
import { getGuildLocale } from '../../i18n.js';
|
|
import { requirePermission } from '../../permissions.js';
|
|
import { ephemeral } from '../../interaction-reply.js';
|
|
import { starboardCommandData } from './command-definitions.js';
|
|
import { botCanPostStarboard, getStarboardConfig, updateStarboardConfig } from './service.js';
|
|
|
|
const starboardCommand: SlashCommand = {
|
|
data: starboardCommandData,
|
|
async execute(interaction, context) {
|
|
const locale = await getGuildLocale(context.prisma, interaction.guildId);
|
|
if (!interaction.inGuild()) {
|
|
await interaction.reply({ content: t(locale, 'generic.guildOnly'), ...ephemeral() });
|
|
return;
|
|
}
|
|
if (!(await requirePermission(interaction, PermissionFlagsBits.ManageGuild, locale))) {
|
|
return;
|
|
}
|
|
|
|
const guildId = interaction.guildId!;
|
|
const sub = interaction.options.getSubcommand();
|
|
|
|
if (sub === 'setup') {
|
|
const channelOption = interaction.options.getChannel('channel', true);
|
|
const threshold = interaction.options.getInteger('threshold', true);
|
|
const emoji = interaction.options.getString('emoji') ?? '⭐';
|
|
const allowSelfStar = interaction.options.getBoolean('allow_self_star') ?? false;
|
|
|
|
const channel = await interaction.guild!.channels.fetch(channelOption.id).catch(() => null);
|
|
const me = interaction.guild!.members.me;
|
|
if (!channel || !me || !botCanPostStarboard(channel, me.id)) {
|
|
await interaction.reply({
|
|
content: t(locale, 'starboard.invalidChannel'),
|
|
...ephemeral()
|
|
});
|
|
return;
|
|
}
|
|
|
|
await updateStarboardConfig(context.prisma, guildId, {
|
|
enabled: true,
|
|
channelId: channel.id,
|
|
emoji,
|
|
threshold,
|
|
allowSelfStar
|
|
});
|
|
|
|
await interaction.reply({ content: t(locale, 'starboard.setupDone'), ...ephemeral() });
|
|
return;
|
|
}
|
|
|
|
if (sub === 'status') {
|
|
const config = await getStarboardConfig(context.prisma, guildId);
|
|
if (!config.enabled || !config.channelId) {
|
|
await interaction.reply({
|
|
content: t(locale, 'starboard.notConfigured'),
|
|
...ephemeral()
|
|
});
|
|
return;
|
|
}
|
|
await interaction.reply({
|
|
content: tf(locale, 'starboard.statusLine', {
|
|
channel: `<#${config.channelId}>`,
|
|
emoji: config.emoji,
|
|
threshold: String(config.threshold),
|
|
selfStar: config.allowSelfStar
|
|
? t(locale, 'starboard.selfStarOn')
|
|
: t(locale, 'starboard.selfStarOff')
|
|
}),
|
|
...ephemeral()
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
export const starboardCommands: SlashCommand[] = [starboardCommand];
|