From 610522b16dba1b0c696b9df973e1b78101d2e322 Mon Sep 17 00:00:00 2001 From: DaInfLoop Date: Sun, 30 Jun 2024 11:28:18 +0100 Subject: [PATCH] linking works now (hooray) --- bun.lockb | Bin 3139 -> 98401 bytes index.ts | 160 ++++++++++++++++++++++++++++++++++++++++----------- package.json | 7 +++ 3 files changed, 135 insertions(+), 32 deletions(-) diff --git a/bun.lockb b/bun.lockb index 4eb5e313898445438890039ba95dd32cc1c72995..8645e16810d0129f42544bef74a516dee14212c2 100755 GIT binary patch literal 98401 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 Yq}WA8NL&AcPj37k8FstT|A+tlA5Qv9G5`Po delta 660 zcmaFZz;;+-f}SRWzu$Tz3rTZ_m>B!@$q}tC`&7*)wk_Yf`rbYn^GQ;BH*+(90sF*o z`K)Yq2nRy)GcYtr0-0PuIs!;@0_mkd8mOb;6_Dlu(sQ8VK(%0XFFDfB$uI=ZImM>A z*V~}+OZA)dvmHXOl_u&(^{Q>PwdBmVIrb`W*6zsy0uijrKuxBTbq%eV5*a4H^0i~y zz%Y50ydBdwAWz!E{}2E)kpbkG4^U|ij>*4% zs7+S+DZ*vJ0g_~32muSJgH(YW0P_aOODsSPqC22U?Kl~xKW1T61&K{(XJs@sgT)3c zbeR|p^?=ZvfdLjDi%-v}oS$_mlZmm;LeEss(12kn!}Ncqj1n@in1jUxP=%?Uk(r(e zNQHnpqXc&cFrq==1khe~f?~YI!t@Md1>e6PP*tnB8K$2$WAvDQ nF^5rU`nNj9a88Gk%7WBl{qo}JRql-IrVFGpvQ5vgXZ!>JVCJ9e diff --git a/index.ts b/index.ts index 9f900ec..f8ddb2a 100644 --- a/index.ts +++ b/index.ts @@ -1,36 +1,132 @@ -Bun.serve({ - port: 41691, - async fetch(req: Request) { - if (req.method == "OPTIONS") { - return new Response(null) - } - const url = new URL(req.url, "https://loc.al/"); +const { App, ExpressReceiver } = (await import("@slack/bolt")); +import postgres from "postgres"; +import "dotenv/config"; +import bcrypt from "bcrypt"; - if (url.pathname == "/callback") { - const code = url.searchParams.get("code"); +const sql = postgres({ + host: '/var/run/postgresql', + database: 'haroon_osu', + username: 'haroon' +}) - 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(Bun.env.CLIENT_SECRET!)}&code=${code}&grant_type=authorization_code&redirect_uri=${encodeURIComponent("https://osu.haroon.hackclub.app/callback")}` - }).then(res => res.json()); +const receiver = new ExpressReceiver({ signingSecret: process.env.SLACK_SIGNING_SECRET! }) - if (data.error) { - console.log(data) - return new Response(`Something went wrong: \n\n${data.message} (${data.error})\n\nThis has been reported.`) - } else { - const user = await fetch("https://osu.ppy.sh/api/v2/me", { - headers: { - "Authorization": `Bearer ${data.access_token}` - } - }).then(res => res.json()); - - return new Response(`Hello, ${user.username}!`) - } - } - - return new Response(null, { status: 404 }); +const app = new App({ + token: process.env.SLACK_BOT_TOKEN, + signingSecret: process.env.SLACK_SIGNING_SECRET, + receiver, + installerOptions: { + port: 41691 } -}) \ No newline at end of file +}); + +const states = new Map(); + +app.command("/osu-link", async (ctx) => { + await ctx.ack(); + + const [ exists = null ] = await sql`SELECT osu_id FROM links WHERE slack_id = ${ctx.context.userId}`; + + if (exists) { + return ctx.respond({ + text: "This slack account is already linked to an osu! account.", + unfurl_links: true, + blocks: [ + { + type: 'section', + text: { + type: "mrkdwn", + text: `This slack account is already linked to an .` + } + } + ] + + }) + + return; + } + + const verifCode = `OSULEADERBOARD-${ctx.context.userId}-${Date.now()}`; + + states.set(ctx.context.userId, verifCode); + + const encodedCode = await bcrypt.hash(verifCode, 10); + + ctx.respond({ + replace_original: true, + text: "View this message in your client to verify!", + blocks: [ + { + type: 'section', + text: { + type: "mrkdwn", + text: `Hey <@${ctx.context.userId}>! To link your osu! account to your Slack account, click this button:` + }, + "accessory": { + "type": "button", + "text": { + "type": "plain_text", + "text": "Link account", + "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)}`, + "action_id": "link" + } + } + ] + }) +}) + +receiver.router.get("/osu/callback", async (req, res) => { + res.contentType("text/html") + + const code = req.query.code as string; + const state = req.query.state as string; + + const [userId, hash] = state.split(':'); + + try { + const isValid = await bcrypt.compare(states.get(userId), hash); + + if (!isValid) { + throw new Error(); + } + } catch (err) { + return res.send(`Something went wrong:

Your state was invalid. Please re-authenticate. (invalid_state)

This has been reported.`) + } + + states.delete(userId); + + 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!)}&code=${code}&grant_type=authorization_code&redirect_uri=${encodeURIComponent("https://osu.haroon.hackclub.app/osu/callback")}` + }).then(res => res.json()); + + if (data.error) { + console.log(data) + return res.send(`Something went wrong:

${data.message} (${data.error})

This has been reported.`) + } else { + const user = await fetch("https://osu.ppy.sh/api/v2/me", { + headers: { + "Authorization": `Bearer ${data.access_token}` + } + }).then(res => res.json()); + + // {user.id} - osu! user ID + // userId - slack user ID + + sql`INSERT INTO links VALUES (${user.id}, ${userId})` + + return res.send(`Your osu! account (${user.id}) has been successfully linked to your Slack account (${userId})!`) + } +}) + +;(async () => { + await app.start(41691); + + console.log('⚡️ Bolt app is running!'); +})(); \ No newline at end of file diff --git a/package.json b/package.json index d092803..b37c796 100644 --- a/package.json +++ b/package.json @@ -7,5 +7,12 @@ }, "peerDependencies": { "typescript": "^5.0.0" + }, + "dependencies": { + "@slack/bolt": "^3.19.0", + "@types/bcrypt": "^5.0.2", + "bcrypt": "^5.1.1", + "dotenv": "^16.4.5", + "postgres": "^3.4.4" } } \ No newline at end of file