feat: session reconnect via SSH fingerprint on disconnect

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-24 15:43:08 +09:00
parent 43a9a0d9ad
commit 604ca00e8b

View File

@@ -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()