Draft: big refactor
This commit is contained in:
93
server/rooms/manager.go
Normal file
93
server/rooms/manager.go
Normal file
@@ -0,0 +1,93 @@
|
||||
package rooms
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"gitea.konchin.com/ytshih/inp2025/game/server/wordle"
|
||||
"gitea.konchin.com/ytshih/inp2025/game/types"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type RoomManager struct {
|
||||
mu sync.RWMutex
|
||||
rooms map[string]*types.Room
|
||||
gameHandlers map[string]*wordle.Handlers
|
||||
}
|
||||
|
||||
func NewRoomManager() *RoomManager {
|
||||
return &RoomManager{
|
||||
rooms: make(map[string]*types.Room),
|
||||
gameHandlers: make(map[string]*wordle.Handlers),
|
||||
}
|
||||
}
|
||||
|
||||
func (rm *RoomManager) CreateRoom(creater string) (*types.Room, error) {
|
||||
room := &types.Room{
|
||||
ID: uuid.New().String(),
|
||||
Creater: creater,
|
||||
Status: types.RoomStatusWaiting,
|
||||
Players: []string{creater},
|
||||
}
|
||||
|
||||
gameHandler := wordle.NewHandlers()
|
||||
|
||||
rm.mu.Lock()
|
||||
rm.rooms[room.ID] = room
|
||||
rm.gameHandlers[room.ID] = gameHandler
|
||||
rm.mu.Unlock()
|
||||
|
||||
return room, nil
|
||||
}
|
||||
|
||||
func (rm *RoomManager) GetRooms() []*types.Room {
|
||||
rm.mu.RLock()
|
||||
defer rm.mu.RUnlock()
|
||||
|
||||
rooms := make([]*types.Room, 0, len(rm.rooms))
|
||||
for _, room := range rm.rooms {
|
||||
rooms = append(rooms, room)
|
||||
}
|
||||
return rooms
|
||||
}
|
||||
|
||||
func (rm *RoomManager) GetRoom(id string) (*types.Room, bool) {
|
||||
rm.mu.RLock()
|
||||
defer rm.mu.RUnlock()
|
||||
room, ok := rm.rooms[id]
|
||||
return room, ok
|
||||
}
|
||||
|
||||
func (rm *RoomManager) GetGameHandler(id string) (*wordle.Handlers, bool) {
|
||||
rm.mu.RLock()
|
||||
defer rm.mu.RUnlock()
|
||||
handler, ok := rm.gameHandlers[id]
|
||||
return handler, ok
|
||||
}
|
||||
|
||||
func (rm *RoomManager) JoinRoom(id, username string) (*types.Room, error) {
|
||||
rm.mu.Lock()
|
||||
defer rm.mu.Unlock()
|
||||
|
||||
room, ok := rm.rooms[id]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("room not found")
|
||||
}
|
||||
|
||||
if len(room.Players) >= 2 {
|
||||
return nil, fmt.Errorf("room is full")
|
||||
}
|
||||
|
||||
for _, player := range room.Players {
|
||||
if player == username {
|
||||
return room, nil // already in room
|
||||
}
|
||||
}
|
||||
|
||||
room.Players = append(room.Players, username)
|
||||
if len(room.Players) == 2 {
|
||||
room.Status = types.RoomStatusPlaying
|
||||
}
|
||||
|
||||
return room, nil
|
||||
}
|
||||
Reference in New Issue
Block a user