Add handling for interactions in execution.ts

this in future will be used to handle interaction requests.
This commit is contained in:
Wroclaw 2023-05-08 02:40:24 +02:00
parent cb304f522b
commit 47e7c107c1

View file

@ -6,7 +6,17 @@ import config from "./config";
import toOpenAIMessages from "./toOpenAIMessages";
/** Stores the queue requests on the channels. */
const channelsRunning: DiscordApi.Collection<string, DiscordApi.Message[]> = new DiscordApi.Collection();
const channelsRunning: DiscordApi.Collection<string, (DiscordApi.Message | DiscordApi.Interaction)[]> = new DiscordApi.Collection();
/**
* Gets the user that requested the execution
* @param request The request to get the user from
* @returns the user or guild member
*/
export function getAuthor(request: DiscordApi.Message | DiscordApi.Interaction) {
if (request instanceof DiscordApi.Message) return request.member ?? request.author;
return request.user;
}
/**
* gets user remaining limit (or lack of it)
@ -42,31 +52,46 @@ async function getUserLimit(user: string | {id: string}, requestTimestamp: Date)
/**
* Check and queues up the request and runs it if there is nothing in queue.
* @param message the message to check and queue
* @param request the message to check and queue
*/
export async function queueRequest(message: DiscordApi.Message) {
export async function queueRequest(request: DiscordApi.Message | DiscordApi.Interaction) {
if (!request.channelId) {
if (!(request instanceof DiscordApi.Message) && request.isRepliable())
request.reply("request does not have channelId");
console.log("There was incoming execution without channelId set, ignoring");
console.log(request);
return;
}
const userLimit = await getUserLimit(message.author, message.createdAt);
const userLimit = await getUserLimit(getAuthor(request), request.createdAt);
if (userLimit !== false && userLimit.remaining <= 0) {
message.react("🛑");
message.author.dmChannel?.send({
if (request instanceof DiscordApi.Message) {
request.react("🛑");
request.author.dmChannel?.send({
embeds: [{
color: 0xff0000,
description: `You've used up your message limit for today, ${userLimit.limit} requrests in last 24 hours`
description: `You've used up your message limit for today, ${userLimit.limit} requests in last 24 hours`,
}]
});
}
else if (request.isRepliable()) {
request.reply({
content: `You've used up your message limit for today, ${userLimit.limit} requests in last 24 hours`,
ephemeral: true,
});
}
return;
}
const messagesForChannel = channelsRunning.ensure(
message.channelId,
request.channelId,
() => { return [] as DiscordApi.Message[]; },
);
const shouldStart = messagesForChannel.length == 0;
messagesForChannel.push(message);
messagesForChannel.push(request);
if (shouldStart)
executeFromQueue(message.channelId);
executeFromQueue(request.channelId);
}
/**