feat: Add Discord forum post support

Add support for creating posts in Discord forum channels (type 15).

Forum channels require a message object when creating threads, unlike
regular threads that are created from existing messages.

Changes:
- Added 'message' parameter to DiscordThreadCreate type
- Updated createThreadDiscord to handle forum posts with message body
- Modified thread-create action to accept and pass message parameter
- Forum posts use direct endpoint: /channels/{channelId}/threads

Usage:
message({
  action: "thread-create",
  channelId: "<forum_channel_id>",
  threadName: "Post Title",
  message: "Post content"
})

Fixes: Forum posts previously failed with 'This field is required' error
This commit is contained in:
Abraham Doan 2026-01-29 19:07:55 -06:00
parent 4583f88626
commit 75a7c81476
4 changed files with 14 additions and 2 deletions

View File

@ -279,6 +279,7 @@ export async function handleDiscordMessagingAction(
const channelId = resolveChannelId(); const channelId = resolveChannelId();
const name = readStringParam(params, "name", { required: true }); const name = readStringParam(params, "name", { required: true });
const messageId = readStringParam(params, "messageId"); const messageId = readStringParam(params, "messageId");
const message = readStringParam(params, "message");
const autoArchiveMinutesRaw = params.autoArchiveMinutes; const autoArchiveMinutesRaw = params.autoArchiveMinutes;
const autoArchiveMinutes = const autoArchiveMinutes =
typeof autoArchiveMinutesRaw === "number" && Number.isFinite(autoArchiveMinutesRaw) typeof autoArchiveMinutesRaw === "number" && Number.isFinite(autoArchiveMinutesRaw)
@ -287,10 +288,10 @@ export async function handleDiscordMessagingAction(
const thread = accountId const thread = accountId
? await createThreadDiscord( ? await createThreadDiscord(
channelId, channelId,
{ name, messageId, autoArchiveMinutes }, { name, messageId, message, autoArchiveMinutes },
{ accountId }, { accountId },
) )
: await createThreadDiscord(channelId, { name, messageId, autoArchiveMinutes }); : await createThreadDiscord(channelId, { name, messageId, message, autoArchiveMinutes });
return jsonResult({ ok: true, thread }); return jsonResult({ ok: true, thread });
} }
case "threadList": { case "threadList": {

View File

@ -180,6 +180,7 @@ export async function handleDiscordMessageAction(
if (action === "thread-create") { if (action === "thread-create") {
const name = readStringParam(params, "threadName", { required: true }); const name = readStringParam(params, "threadName", { required: true });
const messageId = readStringParam(params, "messageId"); const messageId = readStringParam(params, "messageId");
const message = readStringParam(params, "message");
const autoArchiveMinutes = readNumberParam(params, "autoArchiveMin", { const autoArchiveMinutes = readNumberParam(params, "autoArchiveMin", {
integer: true, integer: true,
}); });
@ -190,6 +191,7 @@ export async function handleDiscordMessageAction(
channelId: resolveChannelId(), channelId: resolveChannelId(),
name, name,
messageId, messageId,
message,
autoArchiveMinutes, autoArchiveMinutes,
}, },
cfg, cfg,

View File

@ -97,6 +97,14 @@ export async function createThreadDiscord(
if (payload.autoArchiveMinutes) { if (payload.autoArchiveMinutes) {
body.auto_archive_duration = payload.autoArchiveMinutes; body.auto_archive_duration = payload.autoArchiveMinutes;
} }
// Forum channels (type 15) require a message object for thread creation
if (payload.message) {
body.message = { content: payload.message };
// For forum posts, POST directly to /channels/{channelId}/threads
const route = `/channels/${channelId}/threads`;
return await rest.post(route, { body });
}
// Regular thread from an existing message
const route = Routes.threads(channelId, payload.messageId); const route = Routes.threads(channelId, payload.messageId);
return await rest.post(route, { body }); return await rest.post(route, { body });
} }

View File

@ -68,6 +68,7 @@ export type DiscordMessageEdit = {
export type DiscordThreadCreate = { export type DiscordThreadCreate = {
messageId?: string; messageId?: string;
message?: string;
name: string; name: string;
autoArchiveMinutes?: number; autoArchiveMinutes?: number;
}; };