From 604ca00e8b1853203f8de7a7b2c44f0ebfad3975 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Tue, 24 Mar 2026 15:43:08 +0900 Subject: [PATCH] feat: session reconnect via SSH fingerprint on disconnect Co-Authored-By: Claude Sonnet 4.6 --- game/lobby.go | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/game/lobby.go b/game/lobby.go index ad6ef63..3a18fb0 100644 --- a/game/lobby.go +++ b/game/lobby.go @@ -35,18 +35,52 @@ type OnlinePlayer struct { } type Lobby struct { - mu sync.RWMutex - rooms map[string]*LobbyRoom - online map[string]*OnlinePlayer // fingerprint -> player + mu sync.RWMutex + rooms map[string]*LobbyRoom + online map[string]*OnlinePlayer // fingerprint -> player + activeSessions map[string]string // fingerprint -> room code (for reconnect) } func NewLobby() *Lobby { return &Lobby{ - rooms: make(map[string]*LobbyRoom), - online: make(map[string]*OnlinePlayer), + rooms: make(map[string]*LobbyRoom), + online: make(map[string]*OnlinePlayer), + activeSessions: make(map[string]string), } } +func (l *Lobby) RegisterSession(fingerprint, roomCode string) { + l.mu.Lock() + defer l.mu.Unlock() + l.activeSessions[fingerprint] = roomCode +} + +func (l *Lobby) UnregisterSession(fingerprint string) { + l.mu.Lock() + defer l.mu.Unlock() + delete(l.activeSessions, fingerprint) +} + +func (l *Lobby) GetActiveSession(fingerprint string) (string, *GameSession) { + l.mu.RLock() + defer l.mu.RUnlock() + code, ok := l.activeSessions[fingerprint] + if !ok { + return "", nil + } + room, ok := l.rooms[code] + if !ok || room.Session == nil { + return "", nil + } + // Check if this player is still in the session + for _, p := range room.Session.GetState().Players { + if p.Fingerprint == fingerprint { + return code, room.Session + } + } + return "", nil +} + func (l *Lobby) PlayerOnline(fingerprint, name string) { l.mu.Lock() defer l.mu.Unlock()