Public
Express
rayman-mgsrbotendpoint.express.val.run
February 9, 2024
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { verify_discord_signature } from "https://esm.town/v/mattx/verify_discord_signature";
import { formatInput } from "https://esm.town/v/rayman/formatInput";
import { fetch } from "https://esm.town/v/std/fetch";
import { example1 } from "https://esm.town/v/stevekrouse/example1?v=3";
import process from "node:process";
export let mgsrBotEndpoint = async (
req: express.Request,
res: express.Response,
) => {
console.log(req.get("X-Signature-Timestamp"));
console.log(req.get("X-Signature-Ed25519"));
if (!req.get("X-Signature-Timestamp") || !req.get("X-Signature-Ed25519")) {
res.status(400);
res.end("Signature headers missing!");
}
const verified = await verify_discord_signature(
process.env.discord_pubkey,
JSON.stringify(req.body),
req.get("X-Signature-Ed25519"),
req.get("X-Signature-Timestamp"),
);
if (!verified) {
res.status(401);
res.end("signature invalid");
return;
}
res.set("Content-type", "application/json");
switch (req.body.type) {
case 1: // PING interaction
res.json({ type: 1 }); // PONG
break;
case 2: // APPLICATION_COMMAND interactions
// TODO: Probably don't use a nested switch here
switch (req.body.data.name) {
case "ping":
res.json({
type: 4,
data: {
content: `Hello World! example1 is: ${example1}`,
},
});
break;
case "eval":
res.end(JSON.stringify({
type: 4,
data: {
content: `${
JSON.stringify(
await (await fetch(
"https://api.val.town/v1/eval/"
+ encodeURIComponent(req.body.data.options[0].value),
{
"headers": { "Content-Type": "application/json" },
},
)).text(),
)
}`,
},
}));
break;
// Helper function to show the user an ephemeral message how to undo a recorded game.
case "Undo Help":
res.json({
type: 4,
data: {
content: `\`/undo-record leaderboard:mgsr2 versus:1\``,
flags: 64, // 1 << 6, EPHEMERAL
},
});
break;
case "Result Formatter":
console.log(req.body.data.name);
let messagekey = req.body.data.target_id;
let content = req.body.data.resolved.messages[messagekey].content;
let resultString = formatInput(content);
console.log(resultString);
res.json({
type: 4,
data: {
content: `/game record leaderboard: mgsr2 result: ${resultString}`,
flags: 64, // 1 << 6, EPHEMERAL
},
});
break;
case "Result Formatter (PC Compatible)":
console.log(req.body.data.name);
let messagekeyPC = req.body.data.target_id;
let contentPC = req.body.data.resolved.messages[messagekeyPC].content;
let resultStringPC = formatInput(contentPC);
console.log(resultStringPC);
res.json({
type: 4,
data: {
content: `\`/game record leaderboard: mgsr2 result: ${resultStringPC}\``,
flags: 64, // 1 << 6, EPHEMERAL
},
});
break;
}
Val Town is a social website to write and deploy JavaScript.
Build APIs and schedule functions from your browser.
Comments
Nobody has commented on this val yet: be the first!
February 9, 2024