diff --git a/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts b/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts index cad3509a..23b637cc 100644 --- a/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts +++ b/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts @@ -130,7 +130,24 @@ function getErrorCode(error: unknown): number | string | undefined { function isAlreadyDeletedError(error: unknown): boolean { const code = getErrorCode(error); - return code === 10008 || code === 404 || code === "10008" || code === "404"; + // Discord REST error codes for "message not found": + // 10008 = Unknown Message, 10003 = Unknown Channel, + // 50001 = Missing Access (channel deleted/hidden), 404 = HTTP + if ( + code === 10008 || + code === 10003 || + code === 50001 || + code === 404 || + code === "10008" || + code === "10003" || + code === "50001" || + code === "404" + ) + return true; + // Fallback: check the message text for the Discord "Unknown Message" string + const msg = + error instanceof Error ? error.message : typeof error === "string" ? error : ""; + return msg.includes("Unknown Message") || msg.includes("Unknown Channel"); } function hasChannelMessagesApi(channel: unknown): channel is { diff --git a/services/discord-gateway/src/modules/ai-moderation/batchProcessor.ts b/services/discord-gateway/src/modules/ai-moderation/batchProcessor.ts index 145f750d..7e10ed37 100644 --- a/services/discord-gateway/src/modules/ai-moderation/batchProcessor.ts +++ b/services/discord-gateway/src/modules/ai-moderation/batchProcessor.ts @@ -233,6 +233,10 @@ export async function processBatch( // conversation cooldown instead of an immediate individual retry. apiFailedMessages.push(msg); break; + case "completed": + // Successfully analyzed — already broadcast + auto-delete scheduled + // above. Do NOT re-enqueue for individual fallback. + break; default: // incomplete / parse_failed / unexplained drops stay retryable via // the individual fallback queue (same semantics as before).