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
import process from "node:process";
import { verify_discord_signature } from "https://esm.town/v/mattx/verify_discord_signature?v=8";
export const handleDiscordInteraction = async (req: Request) => {
const body = await req.json();
const verified = await verify_discord_signature(
process.env.discordPublicKey,
JSON.stringify(body),
req.headers.get("X-Signature-Ed25519"),
req.headers.get("X-Signature-Timestamp"),
);
if (!verified)
return new Response("signature invalid", {
status: 401,
statusText: "signature invalid",
});
// PING
if (body.type === 1)
return Response.json({ type: 1 }); // PONG
// APPLICATION_COMMAND interactions
if (body.type === 2) {
const bloodMoon = "15:23";
const acidRain = "";
const radParticles = "21:15";
//Parse hours and minutes from gmt+3
const [bloodMoonHour, bloodMoonMin] = bloodMoon.split(":").map(Number);
const [acidRainHour, acidRainMin] = acidRain.split(":").map(Number);
const [radParticlesHour, radParticlesMin] = radParticles.split(":").map(
Number,
);
//Get local time
const localTimeOffset = new Date().getTimezoneOffset();
//Calculate blood moon local time
const localMoonHour = bloodMoonHour - Math.floor(localTimeOffset / 60);
const localMoonMinute = bloodMoonMin - Math.floor(localTimeOffset % 60);
//calculate acid rain local time
const localAcidHour = acidRainHour - Math.floor(localTimeOffset / 60);
const localAcidMinute = acidRainMin - Math.floor(localTimeOffset % 60);
//Calculate radiation particle time
const localRadHour = radParticlesHour - Math.floor(localTimeOffset / 60);
const localRadMinute = radParticlesMin - Math.floor(localTimeOffset % 60);
//Add the time in a single variable
const bloodMoonTime = localMoonHour + ":" + localMoonMinute;
const acidRainTime = localAcidHour + ":" + localAcidMinute;
const radiationParticleTime = localRadHour + ":" + localRadMinute;
//Make json return
const weather = {
type: 4,
data: {
content:
`Blood moon in redwood forest today at ${bloodMoonTime} \nRadiation particles in redwood forest today at ${radiationParticleTime} \nAcid rain in redwood forest today at ${acidRainTime}`,
},
};
//Print time in Discord after being called by command
if (body.data?.name === "weather")
return Response.json(weather);
else {
return new Response("Bad request", {
status: 400,
statusText: "Bad request",
});
}
}
return new Response("Not handled", { status: 422 });
};
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!
October 23, 2023