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
PORT=3000
# c3nav Integration (optional - defaults to 38c3)
C3NAV_BASE_URL=https://38c3.c3nav.de
# c3nav Integration (optional - defaults to 39c3)
C3NAV_BASE_URL=https://39c3.c3nav.de
# WebSocket Sync Server (required for multi-user location sharing)
# For local development: ws://localhost:3001

View File

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

View File

@ -11,7 +11,7 @@ interface RouteParams {
}
// 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)
const ALLOWED_ENDPOINTS = [

View File

@ -15,7 +15,7 @@ interface RouteParams {
}
// 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) {
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';
// c3nav routing API
const C3NAV_EVENTS = ['38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
const C3NAV_EVENTS = ['39c3', '38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
interface RouteRequest {
origin: {
@ -222,7 +222,7 @@ async function getIndoorRoute(
export async function POST(request: NextRequest) {
try {
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) {
return NextResponse.json(

View File

@ -4,7 +4,7 @@ import './globals.css';
export const metadata: Metadata = {
title: 'rMaps - Find Your Friends',
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' }],
openGraph: {
title: 'rMaps - Find Your Friends',

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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