forked from epita/ruche-manager
add README
This commit is contained in:
parent
5a40f83a74
commit
da121d6e09
2 changed files with 45 additions and 11 deletions
31
README.md
Normal file
31
README.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# Ruche manager
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Mange la ruche.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Bot gestionnaire de devoirs, spécialisé pour la majeure SSIE.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Dépendance
|
||||||
|
|
||||||
|
- deno
|
||||||
|
installer via votre package manager :
|
||||||
|
- windows : `winget install deno`
|
||||||
|
- archlinux : `sudo pacman -S deno`
|
||||||
|
- debian : `sudo apt install deno`
|
||||||
|
- autre : téléchargeable ici : https://deno.land/
|
||||||
|
|
||||||
|
### Exécution
|
||||||
|
|
||||||
|
1. Token
|
||||||
|
- Récupérer un token pour Bot discord, d'une application ayant les permissions d'exécuter des interractions et écrire des messages.
|
||||||
|
- Écrire le token dans un fichier `./token`
|
||||||
|
|
||||||
|
2. Lancer
|
||||||
|
- `./src/bot.ts ./token`
|
25
src/bot.ts
25
src/bot.ts
|
@ -1,5 +1,8 @@
|
||||||
#!/bin/env -S deno run -A --unstable-kv
|
#!/bin/env -S deno run -A --unstable-kv
|
||||||
|
|
||||||
|
import { assertExists } from "https://deno.land/std@0.223.0/assert/assert_exists.ts";
|
||||||
|
import { assert } from "https://deno.land/std@0.223.0/assert/assert.ts";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AutocompleteInteraction,
|
AutocompleteInteraction,
|
||||||
ChatInputCommandInteraction,
|
ChatInputCommandInteraction,
|
||||||
|
@ -25,14 +28,14 @@ const subjects = new Set([
|
||||||
"Sûreté",
|
"Sûreté",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const feed_channel_id = "871779571064778784";
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
const [token] = Deno.args;
|
const [token_file] = Deno.args;
|
||||||
|
const token = (await Deno.readTextFile(token_file)).trim();
|
||||||
|
|
||||||
const storage = await Storage.open("./local/db");
|
const storage = await Storage.open("./local/db");
|
||||||
const bot = new Client({ intents: ["GuildMessages", "Guilds"] });
|
const bot = new Client({ intents: ["GuildMessages", "Guilds"] });
|
||||||
const feed_channel = await bot.channels.fetch("871779571064778784");
|
|
||||||
assertExists(feed_channel);
|
|
||||||
assert(feed_channel instanceof TextChannel);
|
|
||||||
const update_display = channel();
|
const update_display = channel();
|
||||||
|
|
||||||
bot.on("interactionCreate", async (interaction) => {
|
bot.on("interactionCreate", async (interaction) => {
|
||||||
|
@ -43,6 +46,11 @@ async function main() {
|
||||||
log("Logging in ...");
|
log("Logging in ...");
|
||||||
await bot.login(token);
|
await bot.login(token);
|
||||||
log("Logged in as", bot.user?.username);
|
log("Logged in as", bot.user?.username);
|
||||||
|
|
||||||
|
const feed_channel = await bot.channels.fetch(feed_channel_id);
|
||||||
|
assertExists(feed_channel);
|
||||||
|
assert(feed_channel instanceof TextChannel);
|
||||||
|
|
||||||
const commands = build_api_commands(subjects);
|
const commands = build_api_commands(subjects);
|
||||||
await bot.application?.commands.set([]);
|
await bot.application?.commands.set([]);
|
||||||
await bot.application?.commands.set(commands, "871777993922588712");
|
await bot.application?.commands.set(commands, "871777993922588712");
|
||||||
|
@ -197,9 +205,6 @@ async function handle_autocomplete(interaction: AutocompleteInteraction, storage
|
||||||
log("Unknown command", interaction.commandName);
|
log("Unknown command", interaction.commandName);
|
||||||
}
|
}
|
||||||
|
|
||||||
import { assertExists } from "https://deno.land/std@0.223.0/assert/assert_exists.ts";
|
|
||||||
import { assert } from "https://deno.land/std@0.223.0/assert/assert.ts";
|
|
||||||
|
|
||||||
async function update_loop(bot: Client, storage: Storage, update_display: Channel, feed_channel: TextChannel) {
|
async function update_loop(bot: Client, storage: Storage, update_display: Channel, feed_channel: TextChannel) {
|
||||||
log("Waiting for updates.");
|
log("Waiting for updates.");
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -220,20 +225,18 @@ async function update_loop(bot: Client, storage: Storage, update_display: Channe
|
||||||
|
|
||||||
const _1min = 60 * 1000;
|
const _1min = 60 * 1000;
|
||||||
const _24h = 24 * 60 * _1min;
|
const _24h = 24 * 60 * _1min;
|
||||||
|
const _3d = 3 * _24h;
|
||||||
|
|
||||||
async function notification_loop(bot: Client, storage: Storage, feed_channel: TextChannel) {
|
async function notification_loop(bot: Client, storage: Storage, feed_channel: TextChannel) {
|
||||||
while (true) {
|
while (true) {
|
||||||
const devoirs_to_notify = new Set();
|
const devoirs_to_notify = new Set();
|
||||||
const notification_threshold = _24h;
|
const notification_threshold = _3d;
|
||||||
for await (const [devoir_id, devoir] of storage.devoirs.list()) {
|
for await (const [devoir_id, devoir] of storage.devoirs.list()) {
|
||||||
if (Date.now() - devoir.date < notification_threshold) devoirs_to_notify.add(devoir_id);
|
if (Date.now() - devoir.date < notification_threshold) devoirs_to_notify.add(devoir_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
for await (const [notification_id, notification] of storage.notifications.list()) {
|
for await (const [notification_id, notification] of storage.notifications.list()) {
|
||||||
if (!devoirs_to_notify.has(notification.devoir_id)) {
|
if (!devoirs_to_notify.has(notification.devoir_id)) {
|
||||||
const channel = await bot.channels.fetch("e");
|
|
||||||
assert(channel !== null);
|
|
||||||
assert(channel.isTextBased());
|
|
||||||
try {
|
try {
|
||||||
const message = await feed_channel.messages.fetch(notification.message_id);
|
const message = await feed_channel.messages.fetch(notification.message_id);
|
||||||
await message.delete();
|
await message.delete();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue