From c49c279807936be34de2c50fdbd1ed6dc5a26072 Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Tue, 22 Dec 2020 13:11:54 +0200 Subject: [PATCH] discord api test --- package-lock.json | 31 +++++++++++++++++--- package.json | 2 ++ pages/api/discord.ts | 69 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 pages/api/discord.ts diff --git a/package-lock.json b/package-lock.json index 855ccb59d..8e6c047be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2768,6 +2768,14 @@ "dev": true, "requires": { "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + } } }, "big.js": { @@ -4412,6 +4420,14 @@ } } }, + "discord-interactions": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/discord-interactions/-/discord-interactions-1.4.1.tgz", + "integrity": "sha512-JLB+uAWEluymJWlJkQ9GJui2cYdTMM3pGOEN5j3p2S/+7xdRjjGtqGgRGAqA5tyPVUHHchtsV/EAooVgM0cVBg==", + "requires": { + "tweetnacl": "^1.0.3" + } + }, "dom-helpers": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", @@ -9593,6 +9609,14 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + } } }, "ssri": { @@ -10229,10 +10253,9 @@ } }, "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "type": { "version": "1.2.0", diff --git a/package.json b/package.json index b0475d2dd..94d79a91b 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@prisma/client": "^2.13.1", "@sendou/react-sketch": "^0.5.2", "countries-list": "^2.5.6", + "discord-interactions": "^1.4.1", "framer-motion": "^3.1.1", "next": "^10.0.3", "next-auth": "^3.1.0", @@ -39,6 +40,7 @@ "next-images": "^1.6.2", "next-seo": "^4.17.0", "nprogress": "^0.2.0", + "raw-body": "^2.4.1", "react": "^17.0.1", "react-dom": "^17.0.1", "react-draggable": "^4.4.3", diff --git a/pages/api/discord.ts b/pages/api/discord.ts new file mode 100644 index 000000000..a64cf5d9a --- /dev/null +++ b/pages/api/discord.ts @@ -0,0 +1,69 @@ +import { verifyKey } from "discord-interactions"; +import { NextApiRequest, NextApiResponse } from "next"; +import getRawBody from "raw-body"; + +/* +{ + "type": 2, + "token": "A_UNIQUE_TOKEN", + "member": { + "user": { + "id": 53908232506183680, + "username": "Mason", + "avatar": "a_d5efa99b3eeaa7dd43acca82f5692432", + "discriminator": "1337", + "public_flags": 131141 + }, + "roles": ["539082325061836999"], + "premium_since": null, + "permissions": "2147483647", + "pending": false, + "nick": null, + "mute": false, + "joined_at": "2017-03-13T19:19:14.040000+00:00", + "is_pending": false, + "deaf": false + }, + "id": "786008729715212338", + "guild_id": "290926798626357999", + "data": { + "options": [{ + "name": "cardname", + "value": "The Gitrog Monster" + }], + "name": "cardsearch", + "id": "771825006014889984" + }, + "channel_id": "645027906669510667" +} + */ + +const discordCommandHandler = async ( + req: NextApiRequest, + res: NextApiResponse +) => { + const PUBLIC_KEY = + "90bc7521c9602f53db2c93c6a00a68d71a4dbb703f8dc91ef66eb2462ad63d93"; + + const signature = req.headers["X-Signature-Ed25519"] as string; + const timestamp = req.headers["X-Signature-Timestamp"] as string; + const body = await getRawBody(req); // rawBody is expected to be a string, not raw bytes + + const isValidRequest = verifyKey(body, signature, timestamp, PUBLIC_KEY); + if (!isValidRequest) { + return res.status(401).end("Bad request signature"); + } + + // if req.json type === 1 + res.status(200).json({ + type: 1, + }); +}; + +export default discordCommandHandler; + +export const config = { + api: { + bodyParser: false, + }, +};