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",
});
if (body.type === 1)
return Response.json({ type: 1 });
if (body.type === 2) {
const bloodMoon = "15:23";
const acidRain = "";
const radParticles = "21:15";
const [bloodMoonHour, bloodMoonMin] = bloodMoon.split(":").map(Number);
const [acidRainHour, acidRainMin] = acidRain.split(":").map(Number);
const [radParticlesHour, radParticlesMin] = radParticles.split(":").map(
Number,
);
const localTimeOffset = new Date().getTimezoneOffset();
const localMoonHour = bloodMoonHour - Math.floor(localTimeOffset / 60);
const localMoonMinute = bloodMoonMin - Math.floor(localTimeOffset % 60);
const localAcidHour = acidRainHour - Math.floor(localTimeOffset / 60);
const localAcidMinute = acidRainMin - Math.floor(localTimeOffset % 60);
const localRadHour = radParticlesHour - Math.floor(localTimeOffset / 60);
const localRadMinute = radParticlesMin - Math.floor(localTimeOffset % 60);
const bloodMoonTime = localMoonHour + ":" + localMoonMinute;
const acidRainTime = localAcidHour + ":" + localAcidMinute;
const radiationParticleTime = localRadHour + ":" + localRadMinute;
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}`,
},
};
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 });
};