You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/room/rooms.go

98 lines
1.8 KiB
Go

package room
import (
"errors"
"time"
"github.com/zijiren233/gencontainer/rwmap"
rtmps "github.com/zijiren233/livelib/server"
)
const (
roomMaxInactivityTime = time.Hour * 12
)
var (
ErrRoomNotFound = errors.New("room not found")
ErrUserNotFound = errors.New("user not found")
ErrRoomAlreadyExist = errors.New("room already exist")
)
type Rooms struct {
rooms rwmap.RWMap[string, *Room]
}
func NewRooms() *Rooms {
return &Rooms{}
}
func (rs *Rooms) List() (rooms []*Room) {
rooms = make([]*Room, 0, rs.rooms.Len())
rs.rooms.Range(func(id string, r *Room) bool {
rooms = append(rooms, r)
return true
})
return
}
func (rs *Rooms) ListNonHidden() (rooms []*Room) {
rooms = make([]*Room, 0, rs.rooms.Len())
rs.rooms.Range(func(id string, r *Room) bool {
if !r.Hidden() {
rooms = append(rooms, r)
}
return true
})
return
}
func (rs *Rooms) ListHidden() (rooms []*Room) {
rooms = make([]*Room, 0, rs.rooms.Len())
rs.rooms.Range(func(id string, r *Room) bool {
if r.Hidden() {
rooms = append(rooms, r)
}
return true
})
return
}
func (rs *Rooms) HasRoom(id string) bool {
_, ok := rs.rooms.Load(id)
return ok
}
func (rs *Rooms) GetRoom(id string) (*Room, error) {
if id == "" {
return nil, ErrRoomIdEmpty
}
r, ok := rs.rooms.Load(id)
if !ok {
return nil, ErrRoomNotFound
}
return r, nil
}
func (rs *Rooms) CreateRoom(id string, password string, s *rtmps.Server, conf ...RoomConf) (*Room, error) {
r, err := NewRoom(id, password, s, conf...)
if err != nil {
return nil, err
}
r, loaded := rs.rooms.LoadOrStore(r.Id(), r)
if loaded {
return nil, ErrRoomAlreadyExist
}
return r, nil
}
func (rs *Rooms) DelRoom(id string) error {
if id == "" {
return ErrRoomIdEmpty
}
r, ok := rs.rooms.LoadAndDelete(id)
if !ok {
return ErrRoomNotFound
}
return r.Close()
}