mirror of https://github.com/synctv-org/synctv
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.
98 lines
1.8 KiB
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()
|
|
}
|