-
-
Save geekysrm/1df4247baa3f74ee8b75fe1cbb8908be to your computer and use it in GitHub Desktop.
Code for routes/examples.js and helpers/commands.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const SAY_JOKE = { | |
name: "sayjoke", | |
description: "Say a programming joke and make everyone go ROFL!", | |
options: [ | |
{ | |
type: 3, | |
name: "joke", | |
description: "The programming joke.", | |
required: true, | |
}, | |
], | |
}; | |
const TOP = { | |
name: "top", | |
description: "Find out who is the top scorer with his score.", | |
}; | |
const LIST_JOKES = { | |
name: "listjokes", | |
description: "Display programming jokes said by a user.", | |
options: [ | |
{ | |
name: "user", | |
description: "The user whose jokes you want to hear.", | |
type: 6, | |
required: true, | |
}, | |
], | |
}; | |
module.exports = { | |
SAY_JOKE, | |
TOP, | |
LIST_JOKES, | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
const { | |
InteractionResponseType, | |
InteractionType, | |
verifyKey, | |
} = require("discord-interactions"); | |
const { nanoid } = require("nanoid"); | |
const { SAY_JOKE, TOP, LIST_JOKES } = require("../helpers/commands"); | |
// eslint-disable-next-line no-unused-vars,require-await | |
module.exports = async (server, { hdbCore, logger }) => { | |
server.register(require("fastify-raw-body"), { | |
field: "rawBody", | |
global: false, | |
encoding: "utf8", | |
runFirst: true, | |
}); | |
server.addHook("preHandler", async (request, response) => { | |
if (request.method === "POST") { | |
const signature = request.headers["x-signature-ed25519"]; | |
const timestamp = request.headers["x-signature-timestamp"]; | |
const isValidRequest = verifyKey( | |
request.rawBody, | |
signature, | |
timestamp, | |
<YOUR_PUBLIC_KEY>, | |
); | |
if (!isValidRequest) { | |
server.log.info("Invalid Request"); | |
return response.status(401).send({ error: "Bad request signature " }); | |
} | |
} | |
}); | |
server.route({ | |
url: "/", | |
method: "GET", | |
handler: (request) => { | |
return { status: "Server running!" }; | |
}, | |
}); | |
//discord stuff | |
server.route({ | |
url: "/", | |
method: "POST", | |
config: { | |
// add the rawBody to this route. if false, rawBody will be disabled when global is true | |
rawBody: true, | |
}, | |
handler: async (request) => { | |
const myBody = request.body; | |
if (myBody.type === InteractionType.PING) { | |
return { type: InteractionResponseType.PONG }; | |
} else if (myBody.type === InteractionType.APPLICATION_COMMAND) { | |
const user = myBody.member.user; | |
const username = `${user.username}`; // e.g. geekysrm | |
const id = user.id; //e.g. 393890098061770711 | |
switch (myBody.data.name.toLowerCase()) { | |
case SAY_JOKE.name.toLowerCase(): | |
request.body = { | |
operation: "sql", | |
sql: `SELECT * FROM dev.users WHERE id = ${id}`, | |
}; | |
const sayJokeResponse = await hdbCore.requestWithoutAuthentication(request); | |
if (sayJokeResponse.length === 0) { | |
// new user | |
request.body = { | |
operation: "sql", | |
sql: `INSERT INTO dev.users (id, name, score) VALUES ('${id}', '${username}', '1')`, | |
}; | |
await hdbCore.requestWithoutAuthentication(request); | |
} else { | |
// old user | |
request.body = { | |
operation: "sql", | |
sql: `UPDATE dev.users SET score = ${ | |
sayJokeResponse[0].score + 1 | |
} WHERE id = ${id}`, | |
}; | |
await hdbCore.requestWithoutAuthentication(request); | |
} | |
const jokeId = nanoid(); | |
const joke = myBody.data.options[0].value; | |
request.body = { | |
operation: "sql", | |
sql: `INSERT INTO dev.jokes (id, joke, person_id) VALUE ('${jokeId}', '${joke}', '${id}')`, | |
}; | |
await hdbCore.requestWithoutAuthentication(request); | |
const newScore = sayJokeResponse.length === 0 ? 1 : sayJokeResponse[0].score + 1; | |
return { | |
type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, | |
data: { | |
content: `<@${id}> says:\n*${joke}* \n<@${id}>'s score is now: **${newScore}**`, | |
embeds: [ | |
{ | |
type: "rich", | |
image: { | |
url: "https://res.cloudinary.com/geekysrm/image/upload/v1632951540/rofl.gif", | |
}, | |
}, | |
], | |
}, | |
}; | |
case TOP.name.toLowerCase(): | |
request.body = { | |
operation: "sql", | |
sql: `SELECT * FROM dev.users ORDER BY score DESC LIMIT 1`, | |
}; | |
const topResponse = await hdbCore.requestWithoutAuthentication( | |
request | |
); | |
const top = topResponse[0]; | |
return { | |
type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, | |
data: { | |
content: `**@${top.name}** is topping the list with score **${top.score}**. \nSee his programming jokes with */listjoke ${top.name}*`, | |
}, | |
}; | |
case LIST_JOKES.name.toLowerCase(): | |
const selectedUser = myBody.data.options[0].value.toString(); | |
request.body = { | |
operation: "sql", | |
sql: `SELECT joke FROM dev.jokes WHERE person_id = ${selectedUser} LIMIT 5`, | |
}; | |
const jokes = await hdbCore.requestWithoutAuthentication(request); | |
let contentString = | |
jokes.length === 0 | |
? "User has not posted any jokes 😕" | |
: "Here are the jokes posted by that user:\n"; | |
jokes.forEach(({ joke }) => { | |
contentString += `- **${joke}**\n`; | |
}); | |
return { | |
type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, | |
data: { | |
content: contentString, | |
}, | |
}; | |
default: | |
return { | |
type: 4, | |
data: { | |
content: `Invalid type. Please check the command.`, | |
}, | |
}; | |
} | |
} else { | |
return { | |
type: 4, | |
data: { | |
content: `Invalid type. Please check the command.`, | |
}, | |
}; | |
} | |
}, | |
}); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment