74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
import {
|
|
APIApplicationCommandOption
|
|
, ApplicationCommandOptionType
|
|
, ApplicationCommandType
|
|
, ChatInputCommandInteraction
|
|
} from "discord.js";
|
|
import { ChatCompletionMessageParam } from "openai/resources";
|
|
|
|
import
|
|
Command
|
|
,{ApplicationIntegrationType
|
|
, InteractionContextTypes
|
|
} from "../command";
|
|
import { config } from "../index";
|
|
import { executeChatCompletion, replyInMultiMessage } from "../execution";
|
|
import { formatName } from "../toOpenAIMessages";
|
|
|
|
export default class Ask extends Command implements Command {
|
|
name = "ask";
|
|
description = "Promts the bot to reply to a single message without any history context";
|
|
type = ApplicationCommandType.ChatInput;
|
|
options: APIApplicationCommandOption[] = [
|
|
{
|
|
name: "content",
|
|
description: "The content of the prompt",
|
|
type: ApplicationCommandOptionType.String,
|
|
required: true,
|
|
},
|
|
{
|
|
name: "ephemeral",
|
|
description: "if true, only you can see the response (default true)",
|
|
type: ApplicationCommandOptionType.Boolean,
|
|
required: false,
|
|
}
|
|
];
|
|
integration_types = [
|
|
ApplicationIntegrationType.Guild_Install,
|
|
ApplicationIntegrationType.User_Install,
|
|
];
|
|
contexts = [
|
|
InteractionContextTypes.Guild,
|
|
InteractionContextTypes.BotDM,
|
|
InteractionContextTypes.PrivateChannel,
|
|
];
|
|
|
|
async execute(interaction: ChatInputCommandInteraction) {
|
|
const content = interaction.options.getString("content", true);
|
|
const ephemeral = interaction.options.getBoolean("ephemeral", false) ?? true;
|
|
|
|
if (!interaction.channel && !interaction.channelId) {
|
|
console.error("No channel found in interaction");
|
|
console.error(interaction);
|
|
await interaction.reply({
|
|
content: "No channel found in interaction???",
|
|
ephemeral: true
|
|
});
|
|
return;
|
|
}
|
|
|
|
// TODO: check content in moderation API
|
|
|
|
const messages: ChatCompletionMessageParam[] = [
|
|
...config.systemPrompt(interaction),
|
|
{ role: "user", name: formatName(interaction.user.displayName), content }
|
|
];
|
|
|
|
const [answer] = await Promise.all([
|
|
executeChatCompletion(messages, interaction),
|
|
interaction.deferReply({ ephemeral }),
|
|
]);
|
|
|
|
await replyInMultiMessage(answer.choices[0].message.content, interaction);
|
|
}
|
|
}
|