feat: online player tracking and count display in lobby

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-24 15:33:19 +09:00
parent 5c5070502a
commit ef9a713696
2 changed files with 52 additions and 4 deletions

View File

@@ -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
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 {

View File

@@ -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 := ""