From ef9a71369642f501cf9dd065b3841b65255a4ab6 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Tue, 24 Mar 2026 15:33:19 +0900 Subject: [PATCH] feat: online player tracking and count display in lobby Co-Authored-By: Claude Sonnet 4.6 --- game/lobby.go | 53 +++++++++++++++++++++++++++++++++++++++++++++--- ui/lobby_view.go | 3 ++- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/game/lobby.go b/game/lobby.go index 558c4ac..ad6ef63 100644 --- a/game/lobby.go +++ b/game/lobby.go @@ -28,13 +28,60 @@ type LobbyRoom struct { Session *GameSession } +type OnlinePlayer struct { + Name string + Fingerprint string + InRoom string // room code, empty if in lobby +} + type Lobby struct { - mu sync.RWMutex - rooms map[string]*LobbyRoom + mu sync.RWMutex + rooms map[string]*LobbyRoom + online map[string]*OnlinePlayer // fingerprint -> player } func NewLobby() *Lobby { - return &Lobby{rooms: make(map[string]*LobbyRoom)} + return &Lobby{ + rooms: make(map[string]*LobbyRoom), + online: make(map[string]*OnlinePlayer), + } +} + +func (l *Lobby) PlayerOnline(fingerprint, name string) { + l.mu.Lock() + defer l.mu.Unlock() + l.online[fingerprint] = &OnlinePlayer{Name: name, Fingerprint: fingerprint} +} + +func (l *Lobby) PlayerOffline(fingerprint string) { + l.mu.Lock() + defer l.mu.Unlock() + delete(l.online, fingerprint) +} + +func (l *Lobby) ListOnline() []*OnlinePlayer { + l.mu.RLock() + defer l.mu.RUnlock() + result := make([]*OnlinePlayer, 0, len(l.online)) + for _, p := range l.online { + result = append(result, p) + } + return result +} + +func (l *Lobby) InvitePlayer(roomCode, fingerprint string) error { + l.mu.Lock() + defer l.mu.Unlock() + p, ok := l.online[fingerprint] + if !ok { + return fmt.Errorf("player not online") + } + if p.InRoom != "" { + return fmt.Errorf("player already in a room") + } + // Store the invite as a pending field + p.InRoom = "invited:" + roomCode + return nil } func (l *Lobby) CreateRoom(name string) string { diff --git a/ui/lobby_view.go b/ui/lobby_view.go index 76e8d12..4ce095c 100644 --- a/ui/lobby_view.go +++ b/ui/lobby_view.go @@ -15,6 +15,7 @@ type lobbyState struct { roomName string joining bool codeInput string + online int } type roomInfo struct { @@ -39,7 +40,7 @@ func renderLobby(state lobbyState, width, height int) string { Border(lipgloss.RoundedBorder()). Padding(0, 1) - header := headerStyle.Render("── Lobby ──") + header := headerStyle.Render(fmt.Sprintf("── Lobby ── %d online ──", state.online)) menu := "[C] Create Room [J] Join by Code [Up/Down] Select [Enter] Join [Q] Back" roomList := ""