From 91900b943def6ae9e7dab58ee4453e3874a21841 Mon Sep 17 00:00:00 2001 From: "Alex Pooley (@zuedev)" Date: Sat, 18 Jul 2026 11:53:19 +0100 Subject: add oncall-check command --- 174bg/discord-bot/.env.example | 4 ++- 174bg/discord-bot/commands/_index.js | 5 +-- 174bg/discord-bot/commands/oncall-check.js | 50 ++++++++++++++++++++++++++++++ 174bg/discord-bot/package-lock.json | 23 ++++++++++++++ 174bg/discord-bot/package.json | 2 ++ 5 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 174bg/discord-bot/commands/oncall-check.js diff --git a/174bg/discord-bot/.env.example b/174bg/discord-bot/.env.example index c262567..0b2a30f 100644 --- a/174bg/discord-bot/.env.example +++ b/174bg/discord-bot/.env.example @@ -1,3 +1,5 @@ DISCORD_CLIENT_ID= DISCORD_BOT_TOKEN= -DISCORD_GUILD_ID= \ No newline at end of file +DISCORD_GUILD_ID= +POCKETBASE_URL= +POCKETBASE_AUTH_TOKEN= \ No newline at end of file diff --git a/174bg/discord-bot/commands/_index.js b/174bg/discord-bot/commands/_index.js index d1a50c6..2421b4d 100644 --- a/174bg/discord-bot/commands/_index.js +++ b/174bg/discord-bot/commands/_index.js @@ -1,6 +1,7 @@ import requisition from "./requisition.js"; import closeTicket from "./close-ticket.js"; +import oncallCheck from "./oncall-check.js"; -export { requisition, closeTicket }; +export { requisition, closeTicket, oncallCheck }; -export default [requisition, closeTicket]; +export default [requisition, closeTicket, oncallCheck]; diff --git a/174bg/discord-bot/commands/oncall-check.js b/174bg/discord-bot/commands/oncall-check.js new file mode 100644 index 0000000..7af986a --- /dev/null +++ b/174bg/discord-bot/commands/oncall-check.js @@ -0,0 +1,50 @@ +import { SlashCommandBuilder, PermissionFlagsBits } from "discord.js"; +import PocketBase from "pocketbase"; + +export default { + data: new SlashCommandBuilder() + .setName("oncall-check") + .setDescription("Returns a list of members who are currently on call.") + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator), + execute: async (interaction) => { + const date = new Date(); + const dateUTCHours = date.getUTCHours(); + const dateUTCMinutes = date.getUTCMinutes(); + const dateUTCDay = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][date.getUTCDay()]; + + const pb = new PocketBase(process.env.POCKETBASE_URL); + pb.authStore.save(process.env.POCKETBASE_AUTH_TOKEN, null); + + const members = await pb.collection("members").getFullList(); + + let membersOnCall = []; + + for (const member of members) { + try { + if (member.onCallSchedule) { + const available = member.onCallSchedule[dateUTCDay]?.available || false; + + if (available) { + const start = member.onCallSchedule[dateUTCDay].start; + const startHours = start.split(":")[0]; + const startMinutes = start.split(":")[1]; + const end = member.onCallSchedule[dateUTCDay].end; + const endHours = end.split(":")[0]; + const endMinutes = end.split(":")[1]; + + if ((dateUTCHours > startHours || (dateUTCHours === startHours && dateUTCMinutes >= startMinutes)) && (dateUTCHours < endHours || (dateUTCHours === endHours && dateUTCMinutes <= endMinutes))) { + membersOnCall.push(member); + } + } + } + } catch (error) { + console.error(`Error checking on-call schedule for member ${member.name}:`, error); + } + } + + await interaction.reply({ + content: `${membersOnCall.map((member) => `- <@${member.discordId}>`).join("\n") || "No members are currently on call."}`, + ephemeral: true, + }); + }, +}; diff --git a/174bg/discord-bot/package-lock.json b/174bg/discord-bot/package-lock.json index c2053fb..8cfe310 100644 --- a/174bg/discord-bot/package-lock.json +++ b/174bg/discord-bot/package-lock.json @@ -8,6 +8,8 @@ "@discordjs/voice": "^0.19.2", "bufferutil": "^4.1.0", "discord.js": "^14.26.4", + "pocketbase": "^0.27.0", + "prettier": "^3.9.5", "zlib-sync": "^0.1.10" } }, @@ -648,6 +650,27 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/pocketbase": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.27.0.tgz", + "integrity": "sha512-K5N6d93UP/BNMbMnlZ6BUfy9VPCIvLyqhJFOsNI8OsZwzvKWEAfyD36boi5K4ECIOl5HMlo0TzuaeGdKpMwizQ==", + "license": "MIT" + }, + "node_modules/prettier": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", + "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prism-media": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.5.tgz", diff --git a/174bg/discord-bot/package.json b/174bg/discord-bot/package.json index d3e8dac..911e71c 100644 --- a/174bg/discord-bot/package.json +++ b/174bg/discord-bot/package.json @@ -8,6 +8,8 @@ "@discordjs/voice": "^0.19.2", "bufferutil": "^4.1.0", "discord.js": "^14.26.4", + "pocketbase": "^0.27.0", + "prettier": "^3.9.5", "zlib-sync": "^0.1.10" }, "type": "module" -- cgit v1.2.3