From 7b0d45d17e2a9227a2bf6b3f4b532ad7a2c646a0 Mon Sep 17 00:00:00 2001 From: DaInfLoop Date: Sun, 16 Feb 2025 13:03:40 +0000 Subject: [PATCH 1/4] idk what changed, i just need to commit so i can start proper commits --- bun.lockb | Bin 98401 -> 100630 bytes index.ts | 158 ++++++++++++++++++++++++++++++++++++++++++--------- package.json | 2 + 3 files changed, 134 insertions(+), 26 deletions(-) diff --git a/bun.lockb b/bun.lockb index 8645e16810d0129f42544bef74a516dee14212c2..0b0866a4b08201dc26c41bf32eb82627cd3563f7 100755 GIT binary patch delta 20064 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 delta 18868 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 CXLL9K diff --git a/index.ts b/index.ts index e771046..bf691f3 100644 --- a/index.ts +++ b/index.ts @@ -6,6 +6,7 @@ import "dotenv/config"; import bcrypt from "bcrypt"; import type { StaticSelectAction } from "@slack/bolt"; import { inspect } from "node:util"; +import { scheduleJob } from "node-schedule"; const sql = postgres({ host: '/var/run/postgresql', @@ -162,22 +163,30 @@ async function getTemporaryToken(): Promise { return data.access_token; } -async function getAccessToken(slack_id: string): Promise { +async function getAccessToken(slack_id: string): Promise { const user = await sql`SELECT * FROM links WHERE slack_id = ${slack_id}`; if (!user.length) return null - const data = await fetch("https://osu.ppy.sh/oauth/token", { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded" - }, - body: `client_id=33126&client_secret=${encodeURIComponent(process.env.CLIENT_SECRET!)}&grant_type=refresh_token&refresh_token=${user[0].refresh_token}&scope=public` - }).then(res => res.json()); - await sql`UPDATE links SET refresh_token = ${data.refresh_token} WHERE slack_id = ${slack_id}`; + try { + const data = await fetch("https://osu.ppy.sh/oauth/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded" + }, + body: `client_id=33126&client_secret=${encodeURIComponent(process.env.CLIENT_SECRET!)}&grant_type=refresh_token&refresh_token=${user[0].refresh_token}&scope=public` + }).then(res => res.json()); - return data.access_token; + console.log(data) + + await sql`UPDATE links SET refresh_token = ${data.refresh_token} WHERE slack_id = ${slack_id}`; + + return data.access_token; + } catch (err) { + console.error(err) + return null + } } async function sendGET(path: string, token?: string): Promise { @@ -480,17 +489,22 @@ app.command('/osu-profile', async (ctx) => { app.command('/osu-leaderboard', async (ctx) => { await ctx.ack(); - const cached = splitArray(cache, 10)[0].sort((a, b) => { + const cached = splitArray(cache.sort((a, b) => { return b.score.osu - a.score.osu - }); + }), 10); const users = []; for (let i in cached) { - const cachedU = cached[i]; - const slackProfile = (await ctx.client.users.info({ user: cachedU.slackId })).user!; + try { + const cachedU = cached[i]; + const slackProfile = (await ctx.client.users.info({ user: cachedU.slackId })).user!; - users.push(`${parseInt(i) + 1}. / - ${cachedU.score.osu.toLocaleString()}`) + users.push(`${users.length + 1}. / - ${cachedU.score.osu.toLocaleString()}`) + } catch (e) { + console.error(e) + continue; + } } ctx.respond({ @@ -590,17 +604,22 @@ app.action(/change-leaderboard\|.+/, async (ctx) => { const selected = action.selected_option.value; - const cached = splitArray(cache, 10)[0].sort((a, b) => { + const cached = splitArray(cache.sort((a, b) => { return b.score[selected] - a.score[selected] - }); + }), 10)[0]; const users = []; for (let i in cached) { - const cachedU = cached[i]; - const slackProfile = (await ctx.client.users.info({ user: cachedU.slackId })).user!; + try { + const cachedU = cached[i]; + const slackProfile = (await ctx.client.users.info({ user: cachedU.slackId })).user!; - users.push(`${parseInt(i) + 1}. / - ${cachedU.score[selected].toLocaleString()}`) + users.push(`${users.length + 1}. / - ${cachedU.score[selected].toLocaleString()}`) + } catch (e) { + console.error(e) + continue; + } } ctx.respond({ @@ -1090,12 +1109,99 @@ receiver.router.get('*', (req, res) => { res.redirect(`https://osu.ppy.sh${req.path}`) }) - ; (async () => { - await app.start(41691); +enum Mods { + EZ = "Easy", + NF = "No Fail", + HT = "Half Time", + HR = "Hard Rock", + SD = "Sudden Death", + PF = "Perfect", + DT = "Double Time", + NC = "Nightcore", + HD = "Hidden", + FI = "Fade In", + FL = "Flashlight", + RL = "Relax", + AP = "Autopilot", + SO = "Spun Out", + "1K" = "One Key", + "2K" = "Two Keys", + "3K" = "Three Keys", + "4K" = "Four Keys", + "5K" = "Five Keys", + "6K" = "Six Keys", + "7K" = "Seven Keys", + "8K" = "Eight Keys", + "9K" = "Nine Keys", + "10K" = "Ten Keys" +} - console.log('⚡️ Bolt app is running!'); +async function debugDailyChallenge() { + // Daily Challenge!! - cacheStuff(); + const tohken = await getAccessToken("U06TBP41C3E"); - setInterval(cacheStuff, 60 * 1000) // Cache every minute. Ratelimit is 1200 req/m anyways. - })(); + const rooms: any[] = await fetch(`https://osu.ppy.sh/api/v2/rooms`, { + headers: { + 'Authorization': `Bearer ${tohken}`, + 'X-Api-Version': '20240529' + } + }).then(res => res.json()); + + const dailyChallenge = rooms.find(room => room.host.id == 3 && room.active && room.category == "daily_challenge"); + + const currentSong = dailyChallenge.current_playlist_item + + const ruleset = [":osu-standard: osu!standard", ":osu-taiko: osu!taiko", ":osu-catch: osu!catch", ":osu-mania: osu!mania"][currentSong.ruleset_id] + + return app.client.chat.postMessage({ + channel: "C165V7XT9", + text: "A new daily challenge has started!", + "blocks": [ + { + "type": "header", + text: { + text: ruleset.split(' ').shift() + " A new daily challenge has started!", + emoji: true, + type: "plain_text" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ` + +*Ruleset:* ${ruleset} +*Required mods:* ${currentSong.required_mods.length === 0 ? "None" : currentSong.required_mods.map((mod: any) => + // @ts-ignore I HATE THIS + Mods[mod.acronym] || mod.acronym + ).join(', ')}` + }, + "accessory": { + "type": "image", + "image_url": dailyChallenge.host.avatar_url, + "alt_text": `${dailyChallenge.host.username}'s osu profile picture` + } + } + ], + unfurl_links: true + }) +} + +; (async () => { + await app.start(41691); + + console.log('⚡️ Bolt app is running!'); + + cacheStuff(); + + setInterval(cacheStuff, 60 * 1000) // Cache every minute. Ratelimit is 1200 req/m anyways. + + scheduleJob('30 5 0 * * *', debugDailyChallenge) +})(); diff --git a/package.json b/package.json index 768b291..ceec3e2 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,10 @@ "dependencies": { "@slack/bolt": "^3.19.0", "@types/bcrypt": "^5.0.2", + "@types/node-schedule": "^2.1.7", "bcrypt": "^5.1.1", "dotenv": "^16.4.5", + "node-schedule": "^2.1.1", "postgres": "^3.4.4" } } \ No newline at end of file From 365b6bd38156be1ae45ce66c34601d4cc76d2aea Mon Sep 17 00:00:00 2001 From: DaInfLoop Date: Mon, 17 Feb 2025 21:20:02 +0000 Subject: [PATCH 2/4] AAAAAAAAAAAAAAAAAAAAAAAAAAAA REPLAYS --- .gitignore | 2 + bun.lockb | Bin 100630 -> 105667 bytes index.ts | 294 ++++++++++++++++++++++++++++++++++++++++++++++----- package.json | 5 +- 4 files changed, 273 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 9b1ee42..168cbee 100644 --- a/.gitignore +++ b/.gitignore @@ -173,3 +173,5 @@ dist # Finder (MacOS) folder config .DS_Store + +replay-*.osr \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 0b0866a4b08201dc26c41bf32eb82627cd3563f7..3565769780558b1cb98d78429f8ced7097a8ee16 100755 GIT binary patch delta 22476 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 diff --git a/index.ts b/index.ts index bf691f3..d4b95d8 100644 --- a/index.ts +++ b/index.ts @@ -8,6 +8,13 @@ import type { StaticSelectAction } from "@slack/bolt"; import { inspect } from "node:util"; import { scheduleJob } from "node-schedule"; +// @ts-expect-error No typings :))))))))))) +import osr from "node-osr"; +import { Client, Events } from "ordr.js"; + +import io from "socket.io-client"; +import fs from "fs"; + const sql = postgres({ host: '/var/run/postgresql', database: 'haroon_osu', @@ -25,6 +32,8 @@ const app = new App({ } }); +const ordr = new Client(process.env.ORDR_TOKEN!); + const states = new Map(); app.command("/osu-link", async (ctx) => { @@ -168,7 +177,6 @@ async function getAccessToken(slack_id: string): Promise { if (!user.length) return null - try { const data = await fetch("https://osu.ppy.sh/oauth/token", { method: "POST", @@ -178,8 +186,6 @@ async function getAccessToken(slack_id: string): Promise { body: `client_id=33126&client_secret=${encodeURIComponent(process.env.CLIENT_SECRET!)}&grant_type=refresh_token&refresh_token=${user[0].refresh_token}&scope=public` }).then(res => res.json()); - console.log(data) - await sql`UPDATE links SET refresh_token = ${data.refresh_token} WHERE slack_id = ${slack_id}`; return data.access_token; @@ -211,20 +217,26 @@ function splitArray(arr: T[], maxElements: number): T[][] { } /// GENERATED /// -const cache: { - username: string, - id: number, - slackId: string, +type CacheUser = { + username: string; + id: number; + slackId: string; score: { - osu: number, - taiko: number - fruits: number, - mania: number - } -}[] = [] + osu: number; + taiko: number; + fruits: number; + mania: number; + }; +} + +const cache: CacheUser[] = [] const multiplayerRoundCache: any[] = []; +const sentWarningDM = { + ref: false +} + async function cacheStuff(): Promise { const token = await getTemporaryToken(); @@ -273,7 +285,49 @@ async function cacheStuff(): Promise { const tohken = await getAccessToken("U06TBP41C3E") as string; - if (!tohken) return; + if (!tohken) { + const verifCode = `OSULEADERBOARD-U06TBP41C3E-${Date.now()}`; + + states.set('U06TBP41C3E', verifCode); + + const encodedCode = await bcrypt.hash(verifCode, 10); + + await app.client.chat.postMessage({ + channel: "U06TBP41C3E", + text: "uh oh, your token seems to have expired!! multiplayer round fetching + daily challenges are disabled.", + blocks: [ + { + type: 'section', + text: { + type: "mrkdwn", + text: `uh oh, your token seems to have expired!! multiplayer round fetching + daily challenges are disabled.` + } + }, + { + type: 'section', + text: { + type: "mrkdwn", + text: `Please re-authenticate to generate it by clicking the Reauthenticate button.` + }, + "accessory": { + "type": "button", + "text": { + "type": "plain_text", + "text": "Reauthenticate", + "emoji": true + }, + "value": "link", + "url": `https://osu.ppy.sh/oauth/authorize?client_id=33126&redirect_uri=https://osu.haroon.hackclub.app/osu/callback&response_type=code&state=${encodeURIComponent("U06TBP41C3E:" + encodedCode)}&scope=public`, + "action_id": "link" + } + }, + ] + }) + + sentWarningDM.ref = true; + + return + }; const rooms = await fetch(`https://osu.ppy.sh/api/v2/rooms?category=realtime`, { headers: { @@ -489,16 +543,17 @@ app.command('/osu-profile', async (ctx) => { app.command('/osu-leaderboard', async (ctx) => { await ctx.ack(); - const cached = splitArray(cache.sort((a, b) => { + const cached = splitArray(cache.sort((a, b) => { return b.score.osu - a.score.osu }), 10); const users = []; - for (let i in cached) { + for (let i in cached[0]) { try { - const cachedU = cached[i]; - const slackProfile = (await ctx.client.users.info({ user: cachedU.slackId })).user!; + const cachedU = cached[0][i]; + const slackInfo = await ctx.client.users.info({ user: cachedU.slackId }) + const slackProfile = slackInfo.user!; users.push(`${users.length + 1}. / - ${cachedU.score.osu.toLocaleString()}`) } catch (e) { @@ -602,7 +657,7 @@ app.action(/change-leaderboard\|.+/, async (ctx) => { return ctx.respond({ replace_original: false, response_type: "ephemeral", text: `This leaderboard was initialised by <@${userId}>. Only they can manage it.` }) } - const selected = action.selected_option.value; + const selected = action.selected_option.value as "osu" | "taiko" | "fruits" | "mania"; const cached = splitArray(cache.sort((a, b) => { return b.score[selected] - a.score[selected] @@ -878,6 +933,41 @@ app.command('/osu-search', async (ctx) => { }); } + const accessToken = await getAccessToken(ctx.context.userId!); + + if (!accessToken) { + const verifCode = `OSULEADERBOARD-${ctx.context.userId}-${Date.now()}`; + + states.set(ctx.context.userId, verifCode); + + const encodedCode = await bcrypt.hash(verifCode, 10); + + return ctx.respond({ + response_type: 'ephemeral', + text: `Hey <@${ctx.context.userId}>, your token has expired. Please re-authenticate to generate it by clicking the Reauthenticate button.`, + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `Hey <@${ctx.context.userId}>, your token has expired. Please re-authenticate to generate it by clicking the \`Reauthenticate\` button.` + }, + "accessory": { + "type": "button", + "text": { + "type": "plain_text", + "text": "Reauthenticate", + "emoji": true + }, + "value": "link", + "url": `https://osu.ppy.sh/oauth/authorize?client_id=33126&redirect_uri=https://osu.haroon.hackclub.app/osu/callback&response_type=code&state=${encodeURIComponent(ctx.context.userId + ":" + encodedCode)}&scope=public`, + "action_id": "link" + } + }, + ] + }); + } + ctx.client.views.open({ trigger_id: ctx.payload.trigger_id, view: { @@ -1076,7 +1166,7 @@ app.view("search", async (ctx) => { const set = data.beatmapsets[0]; - return ctx.client.chat.postMessage({ + ctx.client.chat.postMessage({ channel: ctx.view.private_metadata, "blocks": [ { @@ -1194,14 +1284,164 @@ async function debugDailyChallenge() { }) } -; (async () => { - await app.start(41691); +type QueueJob = { + md5: string, + playerName: string, + ts: string, + userId: string +} - console.log('⚡️ Bolt app is running!'); +const queue: QueueJob[] = [] +// key is renderID +const waiting = new Map() - cacheStuff(); +const processQueue = async () => { + if (queue.length > 0) { + const job = queue.shift()!; - setInterval(cacheStuff, 60 * 1000) // Cache every minute. Ratelimit is 1200 req/m anyways. + setTimeout(processQueue, 5000) - scheduleJob('30 5 0 * * *', debugDailyChallenge) -})(); + app.client.reactions.add({ + channel: "C165V7XT9", + name: "thinkspin", + timestamp: job.ts + }) + + const render = await ordr.sendRender({ + replay: `replay-${job.md5}.osr`, + skin: 'default', + username: job.playerName, + showDanserLogo: false, + resolution: '1280x720' + }) + + console.log(render) + + // @ts-ignore Error code 0 DOES exist: https://ordr.issou.best/docs/#section/Error-codes + if (render.errorCode !== 0) { + app.client.chat.postEphemeral({ + channel: "C165V7XT9", + user: job.userId, + text: `Hey: it looks like you posted a replay! Unfortunately, I couldn't generate a video of it: "${render.message}"` + }) + return + } + + waiting.set(render.renderID!, job); + } +}; + +const socket = io('https://apis.issou.best', { + path: '/ordr/ws', + autoConnect: false +}) + +socket.on('connect', () => { + console.log('Connected to ordr websocket!') +}) + +socket.on('disconnect', reason => { + if (reason == "io server disconnect") { + socket.connect() + } +}) + +socket.on('render_done_json', async (render) => { + const job = waiting.get(render.renderID!); + + if (!job) return; + + app.client.chat.postMessage({ + channel: 'C165V7XT9', + thread_ts: job.ts, + reply_broadcast: true, + text: `<${render.videoUrl}|replay-${job.md5}.mp4>`, + unfurl_media: true + }) + + app.client.reactions.remove({ + channel: "C165V7XT9", + name: "thinkspin", + timestamp: job.ts + }) + + waiting.delete(render.renderID!); +}) + +const addToQueue = (job: QueueJob) => { + queue.push(job); + if (queue.length === 1) { + processQueue(); + } +}; + +app.event("message", async (ctx) => { + if (ctx.event.channel != "C165V7XT9") return; + if (ctx.event.subtype != "file_share") return; + const ts = ctx.event.ts; + + const history = await ctx.client.conversations.history({ + channel: "C165V7XT9", + latest: ts, + limit: 1, + inclusive: true + }) + + if (!(history.messages && history.messages.length > 0)) { + return; + } + + const message = history.messages[0]; + + if (!message.files) return; + if (message.files.length === 0) return; + + const replay = message.files.find(file => file.name?.endsWith(".osr")); + + if (!replay) return; + + const replayData = await fetch(replay.url_private_download!, { + headers: { + 'Authorization': `Bearer ${process.env.SLACK_BOT_TOKEN}` + } + }).then(res => res.arrayBuffer()); + + const replayBuffer = Buffer.from(replayData); + + const _replay = await osr.read(replayBuffer); + + if (_replay.gameMode !== 0) { + ctx.client.chat.postEphemeral({ + channel: "C165V7XT9", + user: ctx.context.userId!, + text: "Hey: it looks like you posted a replay! Unfortunately, it's not an :osu-standard: osu!standard replay, and so I can't generate a video of it. Sorry!" + }) + return; + } + + const replayFile = fs.createWriteStream(`replay-${_replay.replayMD5}.osr`); + + replayFile.write(replayBuffer); + replayFile.end(); + + addToQueue({ + md5: _replay.replayMD5, + playerName: _replay.playerName, + ts: ts, + userId: ctx.context.userId! + }) +}) + + ; (async () => { + await app.start(41691); + + console.log('⚡️ Bolt app is running!'); + + socket.connect(); + + cacheStuff(); + + setInterval(cacheStuff, 60 * 1000) // Cache every minute. Ratelimit is 1200 req/m anyways. + + scheduleJob('30 5 0 * * *', debugDailyChallenge) + })(); diff --git a/package.json b/package.json index ceec3e2..908df1e 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,10 @@ "@types/node-schedule": "^2.1.7", "bcrypt": "^5.1.1", "dotenv": "^16.4.5", + "node-osr": "^1.2.1", "node-schedule": "^2.1.1", - "postgres": "^3.4.4" + "ordr.js": "^4.0.0", + "postgres": "^3.4.4", + "socket.io-client": "^4.8.1" } } \ No newline at end of file From 81491e7fba63fd0a5492ca5c8916e5998a70256b Mon Sep 17 00:00:00 2001 From: DaInfLoop Date: Sun, 9 Mar 2025 14:45:04 +0000 Subject: [PATCH 3/4] Change leaderboard to use PP instead of score credits to @srizan10 for idea --- index.ts | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/index.ts b/index.ts index d4b95d8..18363b4 100644 --- a/index.ts +++ b/index.ts @@ -267,10 +267,10 @@ async function cacheStuff(): Promise { id: user.id, slackId: osuUsers.find(v => v[0] == user.id)![1], score: { - osu: user.statistics_rulesets.osu?.total_score || 0, - taiko: user.statistics_rulesets.taiko?.total_score || 0, - fruits: user.statistics_rulesets.fruits?.total_score || 0, - mania: user.statistics_rulesets.mania?.total_score || 0, + osu: Math.floor(user.statistics_rulesets.osu?.pp) || 0, + taiko: Math.floor(user.statistics_rulesets.taiko?.pp) || 0, + fruits: Math.floor(user.statistics_rulesets.fruits?.pp) || 0, + mania: Math.floor(user.statistics_rulesets.mania?.pp) || 0, } }))) } @@ -1312,7 +1312,10 @@ const processQueue = async () => { skin: 'default', username: job.playerName, showDanserLogo: false, - resolution: '1280x720' + resolution: '1280x720', + introBGDim: 100, + inGameBGDim: 100, + breakBGDim: 100 }) console.log(render) @@ -1424,12 +1427,15 @@ app.event("message", async (ctx) => { replayFile.write(replayBuffer); replayFile.end(); - addToQueue({ - md5: _replay.replayMD5, - playerName: _replay.playerName, - ts: ts, - userId: ctx.context.userId! - }) + + replayFile.on('finish', () => { + addToQueue({ + md5: _replay.replayMD5, + playerName: _replay.playerName, + ts: ts, + userId: ctx.context.userId! + }) + }); }) ; (async () => { From 0eebc48ba98926e881fe328e89fe80e0bf108926 Mon Sep 17 00:00:00 2001 From: Renovate Date: Wed, 25 Jun 2025 10:10:46 +0000 Subject: [PATCH 4/4] Update dependency @slack/bolt to v4 --- bun.lockb | Bin 105667 -> 75682 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 3565769780558b1cb98d78429f8ced7097a8ee16..a8f06bf50c6c3bd1efaccecd6acab67f66822574 100755 GIT binary patch delta 16316 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
Zpc?U%2Ootj3*kvz$}x0PdR zEk3^;9khIL#~{&9H8YO(Rex3=XSy-NpeA>Z^ZU~6UQ1bH+*cYqJH2@sJ|aM~u5j?N zn(B2~Mdd477INgQ%ayn8&n3?j2*U@-=TG?BnJ%u-8L8ENJ}Tb5QMqeNP|?xP12TRo z_}G8RJne+B6JrmzDY;v&QS;oo{=$UdPg+|ZzTN%%6;f|4Y&dcR#4_?oPB3|GEmv~6 z_3S+MT%%fpqC?NJvbLI55=T25Umr8cE4b7a_F|WH&lQoU&95y^Jrw*{cZbuw#wBhV z7DfkNn;GW}9b!6mi<_LSdGfZ3h8N`SeBeKYwamuSFYCI={KOAE<{a-FtZ{HsYM<8sbg+0z_%)L=&ZmSLwG#2F$67Z&EQ}pVE?UQv>~<(ua@JBRcQbyi zYVhbu+dfAXlak%%y4M&x&sNFV#NJ+EP?G7W@Mppo>ZanYjwP;F-3(6k?wOUfu;Om} zokq0sje+(}Rr!Ip^arWFHA{_8*lP(VPPNiKLl3Gae|q<%G%TiI^M*lglepWA*WV#mQas5Y=58PM zxjiX%G9TEgls~*y%}xE;m>9*Z;l1B~DCo}C5w;|0XN~MqsM{4@GGDl0fo+**(OQ$h zKay;R1#H<|wo1-AQra2-9Yff4zg&e4uRk{8|vHjRGvb2aNdHLwspNeX^Z908VJ*?X>ZiZ+62eUveO7!An z<=VCxPTO52&SAdEeLY{!N&M)&cZI`Aoy7XzqQ5Tq@-TAh>E;F->*J8(A?kUOx%$$PE&$e)*iOs z)LvryZJ(AEre`S3_bq*E92V%JS`^5=LK%D@j#W!1~$ReS&Ew;PxG?9A~G9bn-lUYhpAdH0R_G*cz(0c*FGzpH9f zu2ttczbf-MnB*|8dH;!J$|g=@jDn7n+e_eg%2okUP71dMlhGTvWNC$fs30F#1e3f{ zF6p;PKva@No8Z?5aG!zOLN-Ck`DI++W5c@ET^@64$$+O5p4U3R512%33bq(moVw}e zth0mo)XE^vrZ7E&6V3%Y!b{xC)H@FHkLlze3wYq77+rh!SxvQ^ud2w3O8C)I≪S z3Wyr=BXHM%3*9Ur>d2bS!Q|47T#~y*Kx`)`ZwV%yD!9JcQwA9uK75+`=##)wH!Lnq zagAAW&nn}0kJjWa=^RQ);tyXuR2n{{YRbH(8>{Dxl634&399dXfAP7&wP`+0oxSCn z-$^dp7)*9ma7oKDf!}U<50`r>mF(tv>54)dRmbktw%!@G(`jgWQtQOKIqUlQn*>f6 zrsJTw%XHL1Gpbw1^ydEZ>~n9DYyaew`9H~eI+F4yS8n2wZgm2`dU>s`dgU(JzqG8n zIIV2`+N~~%5B*Y(+}iwR_slcT`x`Vb@1Ux7`cCrL-NS)zYP>Kes57{H#+$xl+>&#b z7ri?^Gu41}s|2k_1b+MEwelAT4Bu~vD!W-5_HLkUTj9JGm76`^7pRMp6Mv^(JXSn8 zk!Q8=wdR|gg3ZeH*XO={I=x_XScoV-G;$F){-n(*@;PXIUMC?o6jgD_eZUOn zh*6_bwFats9vPT%cc(V*?)zOe$(tJ%R3^=!%x^4jQAV{U=qI;mjUp>9%CMUZ^cEQz}<8^CII*cq)Grj zXf5Wc0M-NWLCY}@KddwFv*VCP_py04&!Nz=i}GdP&6#FkkZ3fP+5((a(AKAIrUz`Pk+Zi>gy2j40n; zgoP!3-W7usKV!@S;1`2f0RA?Q2cXXr0doLJ)V^MXiv+&}<4??a0Q@7(T!230;ZO_) z^atnyQ~)>>y#QPQ4nZG)8UR1ge+A&%4~L-|unDjZuoZwydpTe=0KLB!un|zjVtKGO zK%xSW55PARF4(I8n*lg1I1F0=#ehP<8bCH62awC6u5bxwNhYMz01E)=0Q~Na-_(r& z#sEC;H3VP^z@IYcLVWjV06qX)16T%F4#15iZr|`@a1+2AfS*O*0dPb<0dNGD0wMv^ zq2J^C5Vi*Rrz|T_r~tsf7~oJ{0Q?O21#po%*@y7x>kdi$UXNR+>yW-l8K@Cj5)Vke z1l$310`39s1AYZO06YZz2Ji%U0lEMf-WH$+BM|>q(GEQRSqTFT18WBWSG;fl{&56l z3>+Zs2nfTl#Xk&rpO;3G5=K@#tKo_oQASAi0D~&(0lNV>oH#-lT^MCE0N?>u5MVN3 z8ej@wqKx+k8Vr~O2mv6^^x>%mFh2A^^HP1Ay^r1;CKT z5W=Cy*ewBI7-1|*0BHcMmkLM*tOYCv%m-j&I29HFaP$%Z@c^7IIBjO5hM|za%2)xF zVT0HhlZS?2!>9}!!1;$tQ5iOz1V{m3KGu^r2z6pv>^T~Na>fIgpMgC<7bC?2=>Tjb z6R--f1b|VH4afrET&_0d;_F0H{nW!hpr}UI6M)k@46F%8ttT2B7-^hXIEG zIER{90pHgF6gC2I90vhf02mub0Ijk#@@)WYumgaNVtW30_z#}pFIdz~9%0l2($rTT zFFff`nh;2yBDH(1%yRz3B^ zo*Q@62vw$`QY}i?li;zpYEkDr2%aNz;I`2`IkVSJ{TXb+Osbv59N9G=wQ8-d!0{ER zcd)YMTiM%7b=a}}c$7cr(q#_y&c5;HTHfcV)!%hI;ZfP1gfCN)U9C+$^CaxpK01`X z7hy*o9YN@@KkHC;Mi4wL<_z!2o$d!BgIx951a!vAp6VkY^t70Ry&t)Q_Vx4J_>xUz z_JgKA*}A&a0&h@jrc3ScCd`zlJ6hqGP!*$zpT>hzz?HDZ#7Bs*YbSOMFDjfb zRHfa8BgbOS@;aXFa<1CZ^_iB?&S#FEGROKrLV5WR+DhOGY#_{s(2&rv0cx1@s?1qH zC~RZJ$EKN+t<0%Gkl0y4M8UEgAw2`joG+v$7`-g!e6M)MpL+S-OTA zz|qnJ@9^@GofoE^24VT1##(;dVAwd{#*L0-1)Nya!7;=@TiMxp=Ik-;_Mtd;f7B}F zuS00)OK0gnX3RIw(#-_X^Y=eam>-YXkK&kW9f9rJ!y0b)5D9hk5`o|eo7gz(8#8M}U4?L-d_ zJuQC_ETE0Kq=4tY)$joL_ey;XDSZ=yCtS#b6=AgMu0%OBmS71(p%Or{*l9|HZXGpaUA^HX48U%Xq&H7KPe%$sC zTKH!J!~SCf%smU{4Ey&kR2xzGrbItQ=%>tNUFNa|a}b^`Y>NxxNh9hd_?O3A>tK$| z%hcIYHWq}I9=$>`H$j+F_A(_lRG|f-tIOOUVb10=(r-=ZGB-q+)Avjhu>Uin7MsH^ zgfaIAef!=aO3jSur%YSLjEbxyjz6di?qzPeFt-Tk_Tf$U%}tI!9!}pJHuRg0HbhA z3?u(Hd*#gKTT#>92%ax<4~Mxv0d-;2@nLT8q-EWWF)vtm86>bRmP({|eVF?f=mgBC zwz(6!>;YEPdg!?0zgUH10wtL{LDhHPJbKmm(iZC5O9Layn)(9Hq9%9|I{)f1y8R#h zPOwFf@qDoib6beHar%*g&# z6_3h4@HIe!u7e?C?ltXuv+L#BX3f`F2X-|u1(=&p(TabRJ3daK1jC7*j?A^FI&NNO z?!90pGN2je;?x4|-#qL&x>M*T=&k4pJ8H#n2<>;a)Jt$Q`<5NmI-E$?Wv)!k^;omO z{iDAEo4~y*^bRgnQPV~czG_^E91bq|vimfYl^0>CyI7XX+^WHP@DFy%VYbv>U&78L z|Ao{c7i3h`RV<2|D@wBRnGe_8;)St+$w@KsQIw${VM6))5jHwUK_@yj+iB<-Vt(&0 z%&A{hlZIkHLPslx{?TET9JRnx94m~NZ5^8s6(vfNF$uzyXjzM9Zb zq<RCp|5 zNG%}=WBBpdIgJ=hotLK5BMAelbSdsmsh-vFK2z%iA9Z&%JC#@r# zs1k~9(pFmgCPjEslM4x*?^YBR66%Vu(u#Z z!Y7dNgV<7(l$4MpP6(eRib%GMi5DjV6~{!1EF+?Y@$sTq%h(w4Uo+x_iGL|DPb8cT zd6dC4LRTPPQzifl{;j+v+F*w!MF?YK;f`%ed}I`aQcOHXt2ictRyasrA++*$W!P{* zEPO%tj)DIS0tkI-Sqz~ck3sTHbxeGur7$ruHq|m(6q_i5>#kzUNYTugc#&mdQUYWo zr$Ua*2g2lpIPuJs_=x0~gm}wvsEbxXx#R@6z-lQ@jSEkR6~|#ne>WAQSpTni==s0q zP-;^NW9nWEv4+x^3Zan`ONRi4gVDD(pw_oE?IK(3MX!Jejb4&u>lpo( z7tIyLCyU}@l3~HM2g5|Mpgbudp7P6p!8(u)E5Q70qCb@rN$66Y5rk61+ib#?psF$n zO_=nsIv7*2nS=}V>k?uBwKE;OWs^y0F^dJ=`X3pD8l{*AtJEzCq0<+qx&wAeX2(2w zDWza3Rp!pa;F~A5bh3gakJ>#0W(BRnCXeV%FRu0tBk~9vg38Y$lpD6LAU?6xVJ~F` hUiz*u?z_UCadb3`VPIqn5H>@Fln}wxuO&q1{{h6QqIduR delta 35185 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 SqpHA=>sDkGntn))@c{rk`w-9o diff --git a/package.json b/package.json index 908df1e..43328d4 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "typescript": "^5.0.0" }, "dependencies": { - "@slack/bolt": "^3.19.0", + "@slack/bolt": "^4.0.0", "@types/bcrypt": "^5.0.2", "@types/node-schedule": "^2.1.7", "bcrypt": "^5.1.1",