Enhance component message handling and introduce new features
- Added `ComponentMessageBinding` model to manage message components in the database. - Updated `WelcomeConfig`, `Tag`, and `ScheduledMessage` models to support new component fields. - Integrated component handling in various modules, including Scheduler and Tags, to improve message customization. - Enhanced user experience by implementing new commands for creating and managing component messages in the utility module. - Updated localization files to reflect new component-related features and improve user guidance.
This commit is contained in:
@@ -4,10 +4,11 @@ import {
|
||||
type MessageCreateOptions,
|
||||
type TextChannel
|
||||
} from 'discord.js';
|
||||
import { WelcomeEmbedSchema, expandBracketChannelMentions, t, tf } from '@nexumi/shared';
|
||||
import { WelcomeEmbedSchema, expandBracketChannelMentions, parseMessageComponentsV2, t, tf } from '@nexumi/shared';
|
||||
import type { ScheduledMessage } from '@prisma/client';
|
||||
import { ensureGuild } from '../../guild.js';
|
||||
import { buildEmbedFromPayload } from '../../lib/embed-payload.js';
|
||||
import { buildComponentsV2Payload } from '../../lib/components-v2-payload.js';
|
||||
import { logger } from '../../logger.js';
|
||||
import { scheduleQueue } from '../../queues.js';
|
||||
import type { BotContext } from '../../types.js';
|
||||
@@ -91,8 +92,25 @@ function parseStoredEmbed(raw: unknown) {
|
||||
export function buildAnnouncementPayload(schedule: {
|
||||
content: string | null;
|
||||
embed: unknown;
|
||||
components?: unknown;
|
||||
rolePingId: string | null;
|
||||
id?: string;
|
||||
}): MessageCreateOptions {
|
||||
const componentsData = parseMessageComponentsV2(schedule.components);
|
||||
if (componentsData && schedule.id) {
|
||||
const componentsPayload = buildComponentsV2Payload(componentsData, {
|
||||
source: 's',
|
||||
ref: schedule.id,
|
||||
renderText: expandBracketChannelMentions
|
||||
});
|
||||
if (componentsPayload) {
|
||||
if (schedule.rolePingId) {
|
||||
// Components V2 cannot mix classic content; role ping is skipped.
|
||||
}
|
||||
return componentsPayload;
|
||||
}
|
||||
}
|
||||
|
||||
const embedData = parseStoredEmbed(schedule.embed);
|
||||
const embed = buildEmbedFromPayload(embedData, {
|
||||
renderText: expandBracketChannelMentions
|
||||
@@ -255,7 +273,11 @@ export async function listScheduledMessages(
|
||||
.map((schedule) => {
|
||||
const preview =
|
||||
schedule.content?.slice(0, 60) ??
|
||||
(schedule.embed ? t(locale, 'scheduler.list.embedPreview') : '—');
|
||||
(schedule.components
|
||||
? t(locale, 'scheduler.list.componentsPreview')
|
||||
: schedule.embed
|
||||
? t(locale, 'scheduler.list.embedPreview')
|
||||
: '—');
|
||||
const timing = schedule.cron
|
||||
? tf(locale, 'scheduler.list.cron', { cron: schedule.cron })
|
||||
: schedule.runAt
|
||||
@@ -313,7 +335,7 @@ export async function sendScheduledMessage(context: BotContext, scheduleId: stri
|
||||
try {
|
||||
const channel = await assertSendableChannel(context, schedule.channelId);
|
||||
const payload = buildAnnouncementPayload(schedule);
|
||||
if (!payload.content && !payload.embeds?.length) {
|
||||
if (!payload.content && !payload.embeds?.length && !payload.components?.length) {
|
||||
throw new SchedulerError('content_required');
|
||||
}
|
||||
await (channel as TextChannel).send(payload);
|
||||
|
||||
Reference in New Issue
Block a user