forked from pinks/eris
1
0
Fork 0
eris/bot/queueCommand.ts

70 lines
2.7 KiB
TypeScript
Raw Permalink Normal View History

2023-09-24 13:08:35 +00:00
import { CommandContext } from "grammy";
import { bold, fmt } from "grammy_parse_mode";
import { activeGenerationWorkers, generationQueue } from "../app/generationQueue.ts";
2023-10-19 21:37:03 +00:00
import { workerInstanceStore } from "../app/workerInstanceStore.ts";
2023-09-24 13:08:35 +00:00
import { getFlagEmoji } from "../utils/getFlagEmoji.ts";
2023-10-19 21:37:03 +00:00
import { omitUndef } from "../utils/omitUndef.ts";
2023-09-24 13:08:35 +00:00
import { ErisContext } from "./mod.ts";
2023-09-10 18:56:17 +00:00
2023-09-24 13:08:35 +00:00
export async function queueCommand(ctx: CommandContext<ErisContext>) {
2023-09-10 18:56:17 +00:00
let formattedMessage = await getMessageText();
2023-10-19 21:37:03 +00:00
const queueMessage = await ctx.replyFmt(
formattedMessage,
omitUndef({
disable_notification: true,
reply_to_message_id: ctx.message?.message_id,
}),
);
handleFutureUpdates().catch(() => undefined);
2023-09-10 18:56:17 +00:00
async function getMessageText() {
2023-09-22 02:59:22 +00:00
const allJobs = await generationQueue.getAllJobs();
2023-10-13 11:47:57 +00:00
const workerInstances = await workerInstanceStore.getAll();
2023-09-22 02:59:22 +00:00
const processingJobs = allJobs
.filter((job) => job.lockUntil > new Date()).map((job) => ({ ...job, index: 0 }));
const waitingJobs = allJobs
.filter((job) => job.lockUntil <= new Date())
.map((job, index) => ({ ...job, index: index + 1 }));
2023-09-10 18:56:17 +00:00
const jobs = [...processingJobs, ...waitingJobs];
2023-09-10 18:56:17 +00:00
return fmt([
"Current queue:\n",
...jobs.length > 0
? jobs.flatMap((job) => [
2023-09-22 02:59:22 +00:00
`${job.index}. `,
fmt`${bold(job.state.from.first_name)} `,
job.state.from.last_name ? fmt`${bold(job.state.from.last_name)} ` : "",
getFlagEmoji(job.state.from.language_code) ?? "",
2023-10-13 11:47:57 +00:00
job.index === 0 && job.state.progress && job.state.workerInstanceKey
? `(${(job.state.progress * 100).toFixed(0)}% using ${job.state.workerInstanceKey}) `
2023-09-10 18:56:17 +00:00
: "",
"\n",
])
: ["Queue is empty.\n"],
"\nActive workers:\n",
2023-10-13 11:47:57 +00:00
...workerInstances.flatMap((workerInstace) => [
activeGenerationWorkers.get(workerInstace.id)?.isProcessing ? "✅ " : "☠️ ",
fmt`${bold(workerInstace.value.name || workerInstace.value.key)} `,
2023-09-10 18:56:17 +00:00
"\n",
]),
]);
}
async function handleFutureUpdates() {
for (let idx = 0; idx < 30; idx++) {
2023-09-13 00:38:09 +00:00
await ctx.api.sendChatAction(ctx.chat.id, "typing", { maxAttempts: 1 } as never);
await new Promise((resolve) => setTimeout(resolve, 4000));
2023-09-10 18:56:17 +00:00
const nextFormattedMessage = await getMessageText();
if (nextFormattedMessage.text !== formattedMessage.text) {
await ctx.api.editMessageText(
ctx.chat.id,
queueMessage.message_id,
nextFormattedMessage.text,
{ entities: nextFormattedMessage.entities },
);
formattedMessage = nextFormattedMessage;
}
}
}
}