- Add PlayerState model to database schema for storing game states - Create player identifier system (UUID-based) for cross-domain sync - Implement API endpoints for loading/saving player states - Refactor gameState hook to use backend storage with localStorage fallback - Support synchronization between hoerdle.de and hördle.de - Migration automatically runs on Docker container start
57 lines
1.5 KiB
TypeScript
57 lines
1.5 KiB
TypeScript
/**
|
|
* Player Identifier Management
|
|
*
|
|
* Generates and manages a unique player identifier (UUID) that is stored
|
|
* in localStorage. This identifier is used to sync game states across
|
|
* different domains (hoerdle.de and hördle.de).
|
|
*/
|
|
|
|
const STORAGE_KEY = 'hoerdle_player_id';
|
|
|
|
/**
|
|
* Generate a UUID v4
|
|
*/
|
|
function generatePlayerId(): string {
|
|
// UUID v4 format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
|
const r = Math.random() * 16 | 0;
|
|
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
return v.toString(16);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get or create a player identifier
|
|
*
|
|
* If no identifier exists in localStorage, a new UUID is generated and stored.
|
|
* The same identifier is used across all domains (hoerdle.de and hördle.de).
|
|
*
|
|
* @returns Player identifier (UUID v4)
|
|
*/
|
|
export function getOrCreatePlayerId(): string {
|
|
if (typeof window === 'undefined') {
|
|
// Server-side: return empty string (not used on server)
|
|
return '';
|
|
}
|
|
|
|
let playerId = localStorage.getItem(STORAGE_KEY);
|
|
if (!playerId) {
|
|
playerId = generatePlayerId();
|
|
localStorage.setItem(STORAGE_KEY, playerId);
|
|
}
|
|
return playerId;
|
|
}
|
|
|
|
/**
|
|
* Get the current player identifier without creating a new one
|
|
*
|
|
* @returns Player identifier or null if not set
|
|
*/
|
|
export function getPlayerId(): string | null {
|
|
if (typeof window === 'undefined') {
|
|
return null;
|
|
}
|
|
return localStorage.getItem(STORAGE_KEY);
|
|
}
|
|
|