Add code to make the stuff work
This commit is contained in:
parent
a18b73fe52
commit
3d9feabe88
15 changed files with 517 additions and 0 deletions
29
src/endpoints/discord/auth/callback.ts
Normal file
29
src/endpoints/discord/auth/callback.ts
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
import { Request, ResponseToolkit } from "@hapi/hapi";
|
||||
import { config, db } from "@/main";
|
||||
import axios from "axios";
|
||||
|
||||
export default {
|
||||
method: `GET`, path: `/discord/auth/callback`,
|
||||
async handler(request: Request, h: ResponseToolkit) {
|
||||
console.log(`Authentication finishing!`)
|
||||
let code = request.query.code;
|
||||
|
||||
let data = new URLSearchParams();
|
||||
data.set(`client_id`, config.discord.client_id);
|
||||
data.set(`client_secret`, config.discord.secret);
|
||||
data.set(`grant_type`, `authorization_code`);
|
||||
data.set(`code`, code);
|
||||
data.set(`redirect_uri`, config.discord.auth_redirect);
|
||||
|
||||
let r = await axios.post(`https://discord.com/api/v8/oauth2/token`, data, {
|
||||
headers: {
|
||||
'Content-Type': `application/x-www-form-urlencoded`
|
||||
}
|
||||
});
|
||||
|
||||
db.webhook.token = r.data.webhook.token;
|
||||
db.webhook.id = r.data.webhook.id;
|
||||
|
||||
return r.data;
|
||||
},
|
||||
}
|
||||
11
src/endpoints/discord/auth/redirect.ts
Normal file
11
src/endpoints/discord/auth/redirect.ts
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
import { Request, ResponseToolkit } from "@hapi/hapi";
|
||||
import { config } from "@/main";
|
||||
|
||||
export default {
|
||||
method: `GET`, path: `/discord/auth`,
|
||||
async handler(request: Request, h: ResponseToolkit) {
|
||||
return h.redirect(
|
||||
`https://discord.com/api/oauth2/authorize?client_id=${config.discord.client_id}&redirect_uri=${encodeURIComponent(config.discord.auth_redirect)}&response_type=code&scope=webhook.incoming`
|
||||
);
|
||||
},
|
||||
}
|
||||
75
src/endpoints/discord/webhook.ts
Normal file
75
src/endpoints/discord/webhook.ts
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
import { selectQuote } from "@/utils/components/dropdowns/select_quote";
|
||||
import { deleteVote } from "@/utils/components/buttons/delete_vote";
|
||||
import { countVotes } from "@/utils/components/buttons/count_votes";
|
||||
import { showUserVote } from "@/utils/components/buttons/my_vote";
|
||||
import { Request, ResponseToolkit } from "@hapi/hapi";
|
||||
import { config } from "@/main";
|
||||
import boom from "@hapi/boom";
|
||||
import nacl from "tweetnacl";
|
||||
|
||||
import { viewDB } from "@/utils/components/buttons/view_db";
|
||||
|
||||
|
||||
async function handleButton(data: any): Promise<object> {
|
||||
switch (data.data.custom_id) {
|
||||
case "deleteVote":
|
||||
return await deleteVote(data);
|
||||
case "showCount":
|
||||
return await countVotes(data);
|
||||
case "viewDB":
|
||||
return await viewDB(data);
|
||||
case "showMyVote":
|
||||
return await showUserVote(data);
|
||||
};
|
||||
return {
|
||||
type: 4,
|
||||
data: {
|
||||
content: `Unknown button, how did you trigger this response? 0\_o`,
|
||||
flags: 1 << 6,
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
export default {
|
||||
method: `POST`, path: `/discord/webhook`,
|
||||
async handler(request: Request, h: ResponseToolkit) {
|
||||
let sig = request.headers[`x-signature-ed25519`];
|
||||
let timestamp = request.headers[`x-signature-timestamp`];
|
||||
let body: any = request.payload;
|
||||
|
||||
|
||||
// Verify the body against Discord's stuff
|
||||
let verified = nacl.sign.detached.verify(
|
||||
Buffer.from(timestamp + JSON.stringify(body)),
|
||||
Buffer.from(sig, `hex`),
|
||||
Buffer.from(config.discord.public_key, `hex`)
|
||||
);
|
||||
|
||||
if (!verified) {
|
||||
return boom.unauthorized(`invalid request signature`);
|
||||
};
|
||||
|
||||
switch (body.type) {
|
||||
case 1:
|
||||
return { type: 1 };
|
||||
case 3:
|
||||
|
||||
// Parse the data properly
|
||||
if (body.data.component_type === 3) {
|
||||
return await selectQuote(body)
|
||||
} else if (body.data.component_type === 2) {
|
||||
return await handleButton(body)
|
||||
};
|
||||
|
||||
return {
|
||||
type: 4,
|
||||
data: {
|
||||
content: `Unknown component type.`,
|
||||
flags: 1 << 6,
|
||||
},
|
||||
};
|
||||
default:
|
||||
return boom.badRequest()
|
||||
};
|
||||
},
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue