40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
import { Client, EmbedBuilder } from "npm:discord.js";
|
|
|
|
import { fetch_feed_channel, format_devoir_title } from "./lib.ts";
|
|
import { Devoir, Feed, Storage } from "./storage.ts";
|
|
import { Channel, collect, log_from } from "./utils.ts";
|
|
|
|
const log = log_from(import.meta);
|
|
|
|
export async function update_loop(bot: Client, storage: Storage, update_display: Channel) {
|
|
log("Waiting for updates.");
|
|
while (true) {
|
|
await update_display.receive();
|
|
log("Updating board.");
|
|
const sorted_devoirs = await get_devoirs_sorted(storage);
|
|
for await (const [_, feed] of storage.feeds.list()) await update_feed(bot, feed, sorted_devoirs);
|
|
}
|
|
}
|
|
|
|
async function get_devoirs_sorted(storage: Storage) {
|
|
const devoirs = await collect(storage.devoirs.list());
|
|
const sorted_devoirs = devoirs
|
|
.map(([_, d]) => d)
|
|
.toSorted((a, b) => a.date > b.date ? 1 : -1);
|
|
return sorted_devoirs;
|
|
}
|
|
|
|
async function update_feed(bot: Client<boolean>, feed: Feed, sorted_devoirs: Devoir[]) {
|
|
const embed = new EmbedBuilder()
|
|
.setTitle("`📚` Devoirs")
|
|
.setFooter({ text: "Mise à jour " + Date.now() });
|
|
for (const devoir of sorted_devoirs) {
|
|
embed.addFields({
|
|
name: format_devoir_title(devoir),
|
|
value: devoir.description,
|
|
});
|
|
}
|
|
const feed_channel = await fetch_feed_channel(bot, feed);
|
|
const board_message = await feed_channel.messages.fetch(feed.board_message_id);
|
|
board_message.edit({ embeds: [embed], content: "" });
|
|
}
|