Fetch vrc.tl events via Cloudflare Worker relay

vrc.tl returns 403 for the VPS IP range. Route lookups through a relay
Worker (relay/), configured via vrctl.relayUrl/relaySecret in config.json.
Also handle events without eventSlots/performers instead of crashing.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MrxnVXujrZqNrENxJZfVkU
This commit is contained in:
2026-09-30 23:45:38 +02:00
parent 0ecbf00ca2
commit bf5d61ffca
5 changed files with 45 additions and 5 deletions

View File

@@ -1,5 +1,6 @@
const { Events } = require('discord.js');
const axios = require('axios').default;
const { vrctl } = require(process.env.CONFIG_FILE ? `../${process.env.CONFIG_FILE}` : '../config.json');
const SWARM_EVENTS_CHANNEL_ID = '1536067515115905155';
const VRC_CROSSPOST_CHANNEL_ID = '1438261670916133055';
@@ -19,15 +20,17 @@ module.exports = {
for (const eventId of eventIds) {
try {
const { data } = await axios.get(`https://vrc.tl/api/v1/events/${eventId}`);
const { data } = await axios.get(`${vrctl.relayUrl}/events/${eventId}`, {
headers: { 'x-relay-secret': vrctl.relaySecret },
});
const event = data.events?.[0];
if (!event) continue;
const performersById = new Map(data.performers.map(performer => [performer.id, performer.name]));
const performersById = new Map((data.performers ?? []).map(performer => [performer.id, performer.name]));
const lineup = [...event.eventSlots]
const lineup = [...(event.eventSlots ?? [])]
.sort((a, b) => a.start - b.start)
.flatMap(slot => [...slot.performers]
.flatMap(slot => [...(slot.performers ?? [])]
.sort((a, b) => a.order - b.order)
.map(slotPerformer => performersById.get(slotPerformer.performerId)))
.filter(Boolean);