diff --git a/src/moderation.ts b/src/moderation.ts index 02b2540..64291c8 100644 --- a/src/moderation.ts +++ b/src/moderation.ts @@ -1,31 +1,39 @@ -import { Collection, Message } from "discord.js"; +import { Collection, InteractionResponse, Message } from "discord.js"; import { openai } from "./index"; -import { formatMessage } from "./toOpenAIMessages"; +import { formatRequestOrResponse } from "./toOpenAIMessages"; export default class Moderation { /** Represents cache of messages that have been checked aganist OpenAI moderation API. */ private static cache = new Collection(); - public static async checkMessage(message: Message): Promise { + public static async checkMessage(message: Message | InteractionResponse): Promise { if (this.cache.has(message.id)) { return this.cache.get(message.id) as boolean; } - const warningReaction = message.reactions.resolve("⚠"); - // if bot reacted to that message, we already know that it returned true for moderation API - if (warningReaction && warningReaction.me) { - this.cache.set(message.id, true); - return true; + if (message instanceof Message) { + const warningReaction = message.reactions.resolve("⚠"); + // if bot reacted to that message, we already know that it returned true for moderation API + if (warningReaction && warningReaction.me) { + this.cache.set(message.id, true); + return true; + } } - try{ + try { const answer = await openai.createModeration({ - input: formatMessage(message), + input: await formatRequestOrResponse(message), }); const flagged = answer.data.results[0].flagged; this.cache.set(message.id, flagged); - if (flagged) message.react("⚠"); + if (flagged) if (message instanceof Message) { + message.react("⚠"); + } + else { + const channelMessage = await message.fetch(); + channelMessage.react("⚠"); + } return flagged; } diff --git a/src/toOpenAIMessages.ts b/src/toOpenAIMessages.ts index 54e2ba4..f81c32f 100644 --- a/src/toOpenAIMessages.ts +++ b/src/toOpenAIMessages.ts @@ -1,9 +1,25 @@ import { ChatCompletionRequestMessage as OpenAIMessage } from "openai"; -import { Collection, Message as DiscordMessage } from "discord.js"; +import { Collection, Message as DiscordMessage, InteractionResponse } from "discord.js"; import FoldToAscii from "fold-to-ascii"; import config from "./config"; import countTokens from "./tokenCounter"; +import { request } from "./execution"; + +/** + * formats the request to use as a message contend in OpenAI api + * @param request the request to format + * @returns the formatted request + */ +export async function formatRequestOrResponse(request: request | InteractionResponse): Promise { + if (request instanceof DiscordMessage) { + return formatMessage(request); + } + if (request instanceof InteractionResponse) { + return formatMessage(await request.fetch()); + } + return formatMessage(await request.fetchReply()); +} /** * Formats the message to use as a message content in OpenAI api