feat: Update c3nav event from 38c3 to 39c3

- Add 39c3 to all valid event lists
- Change default event ID from 38c3 to 39c3
- Update examples and placeholders throughout codebase
- Maintain backwards compatibility with 38c3 and older events

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2025-12-29 01:03:37 +01:00
parent 003d3b0187
commit 8eed0deadf
12 changed files with 18 additions and 17 deletions

View File

@ -4,8 +4,8 @@
NODE_ENV=development NODE_ENV=development
PORT=3000 PORT=3000
# c3nav Integration (optional - defaults to 38c3) # c3nav Integration (optional - defaults to 39c3)
C3NAV_BASE_URL=https://38c3.c3nav.de C3NAV_BASE_URL=https://39c3.c3nav.de
# WebSocket Sync Server (required for multi-user location sharing) # WebSocket Sync Server (required for multi-user location sharing)
# For local development: ws://localhost:3001 # For local development: ws://localhost:3001

View File

@ -268,7 +268,7 @@ export default function RoomPage() {
waypoints={waypoints} waypoints={waypoints}
currentUserId={currentParticipantId || undefined} currentUserId={currentParticipantId || undefined}
currentLocation={currentLocation} currentLocation={currentLocation}
eventId="38c3" eventId="39c3"
isSharing={isSharing} isSharing={isSharing}
onToggleSharing={handleToggleSharing} onToggleSharing={handleToggleSharing}
onParticipantClick={(p) => { onParticipantClick={(p) => {

View File

@ -11,7 +11,7 @@ interface RouteParams {
} }
// Valid c3nav events // Valid c3nav events
const VALID_EVENTS = ['38c3', '37c3', 'eh22', 'eh2025', 'camp2023']; const VALID_EVENTS = ['39c3', '38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
// Allowed API endpoints (whitelist for security) // Allowed API endpoints (whitelist for security)
const ALLOWED_ENDPOINTS = [ const ALLOWED_ENDPOINTS = [

View File

@ -15,7 +15,7 @@ interface RouteParams {
} }
// Valid c3nav events // Valid c3nav events
const VALID_EVENTS = ['38c3', '37c3', 'eh22', 'eh2025', 'camp2023']; const VALID_EVENTS = ['39c3', '38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
export async function GET(request: NextRequest, { params }: RouteParams) { export async function GET(request: NextRequest, { params }: RouteParams) {
const { event, level, z, x, y } = params; const { event, level, z, x, y } = params;

View File

@ -5,7 +5,7 @@ import type { RouteSegment, C3NavRouteRequest } from '@/types';
const OSRM_API = 'https://router.project-osrm.org'; const OSRM_API = 'https://router.project-osrm.org';
// c3nav routing API // c3nav routing API
const C3NAV_EVENTS = ['38c3', '37c3', 'eh22', 'eh2025', 'camp2023']; const C3NAV_EVENTS = ['39c3', '38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
interface RouteRequest { interface RouteRequest {
origin: { origin: {
@ -222,7 +222,7 @@ async function getIndoorRoute(
export async function POST(request: NextRequest) { export async function POST(request: NextRequest) {
try { try {
const body: RouteRequest = await request.json(); const body: RouteRequest = await request.json();
const { origin, destination, mode = 'walking', eventId = '38c3', options } = body; const { origin, destination, mode = 'walking', eventId = '39c3', options } = body;
if (!origin || !destination) { if (!origin || !destination) {
return NextResponse.json( return NextResponse.json(

View File

@ -4,7 +4,7 @@ import './globals.css';
export const metadata: Metadata = { export const metadata: Metadata = {
title: 'rMaps - Find Your Friends', title: 'rMaps - Find Your Friends',
description: 'Collaborative real-time friend-finding navigation for events', description: 'Collaborative real-time friend-finding navigation for events',
keywords: ['maps', 'navigation', 'friends', 'realtime', 'CCC', '38c3'], keywords: ['maps', 'navigation', 'friends', 'realtime', 'CCC', '39c3'],
authors: [{ name: 'Jeff Emmett' }], authors: [{ name: 'Jeff Emmett' }],
openGraph: { openGraph: {
title: 'rMaps - Find Your Friends', title: 'rMaps - Find Your Friends',

View File

@ -161,7 +161,7 @@ export default function HomePage() {
type="text" type="text"
value={roomName} value={roomName}
onChange={(e) => setRoomName(e.target.value)} onChange={(e) => setRoomName(e.target.value)}
placeholder="e.g., 38c3-crew" placeholder="e.g., 39c3-crew"
className="input flex-1" className="input flex-1"
maxLength={20} maxLength={20}
/> />

View File

@ -4,7 +4,7 @@ import { useState, useEffect, useRef } from 'react';
import type { Participant } from '@/types'; import type { Participant } from '@/types';
interface C3NavEmbedProps { interface C3NavEmbedProps {
/** Event identifier (e.g., '38c3', 'eh2025') */ /** Event identifier (e.g., '39c3', 'eh2025') */
eventId?: string; eventId?: string;
/** Initial location to show */ /** Initial location to show */
initialLocation?: string; initialLocation?: string;
@ -22,6 +22,7 @@ interface C3NavEmbedProps {
// c3nav event URLs // c3nav event URLs
const C3NAV_EVENTS: Record<string, string> = { const C3NAV_EVENTS: Record<string, string> = {
'39c3': 'https://39c3.c3nav.de',
'38c3': 'https://38c3.c3nav.de', '38c3': 'https://38c3.c3nav.de',
'37c3': 'https://37c3.c3nav.de', '37c3': 'https://37c3.c3nav.de',
'eh2025': 'https://eh2025.c3nav.de', 'eh2025': 'https://eh2025.c3nav.de',
@ -30,7 +31,7 @@ const C3NAV_EVENTS: Record<string, string> = {
}; };
export default function C3NavEmbed({ export default function C3NavEmbed({
eventId = '38c3', eventId = '39c3',
initialLocation, initialLocation,
participants = [], participants = [],
currentUserId, currentUserId,
@ -43,7 +44,7 @@ export default function C3NavEmbed({
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
// Get the c3nav base URL for the event // Get the c3nav base URL for the event
const baseUrl = C3NAV_EVENTS[eventId] || C3NAV_EVENTS['38c3']; const baseUrl = C3NAV_EVENTS[eventId] || C3NAV_EVENTS['39c3'];
// Build the embed URL // Build the embed URL
const embedUrl = new URL(baseUrl); const embedUrl = new URL(baseUrl);

View File

@ -57,7 +57,7 @@ export default function DualMapView({
waypoints = [], waypoints = [],
currentUserId, currentUserId,
currentLocation, currentLocation,
eventId = '38c3', eventId = '39c3',
initialMode = 'auto', initialMode = 'auto',
onParticipantClick, onParticipantClick,
onWaypointClick, onWaypointClick,

View File

@ -9,8 +9,8 @@ import type {
C3NavRouteResponse, C3NavRouteResponse,
} from '@/types'; } from '@/types';
// Default to 38c3, can be overridden per-room // Default to 39c3, can be overridden per-room
const DEFAULT_C3NAV_BASE = 'https://38c3.c3nav.de'; const DEFAULT_C3NAV_BASE = 'https://39c3.c3nav.de';
export class C3NavClient { export class C3NavClient {
private baseUrl: string; private baseUrl: string;

View File

@ -283,7 +283,7 @@ export const useRoomStore = create<RoomState>((set, get) => ({
}, },
destination: destLocation, destination: destLocation,
mode: 'walking', mode: 'walking',
eventId: room?.settings.eventId || '38c3', eventId: room?.settings.eventId || '39c3',
}), }),
}); });

View File

@ -25,7 +25,7 @@ export interface RoomSettings {
defaultPrecision: PrecisionLevel; defaultPrecision: PrecisionLevel;
allowGuestJoin: boolean; allowGuestJoin: boolean;
showC3NavIndoor: boolean; // enable c3nav integration showC3NavIndoor: boolean; // enable c3nav integration
eventId?: string; // e.g., '38c3', 'eh2025' eventId?: string; // e.g., '39c3', 'eh2025'
} }
// ============================================================================ // ============================================================================