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.
129 lines
2.4 KiB
Go
129 lines
2.4 KiB
Go
package op
|
|
|
|
import (
|
|
"errors"
|
|
"math/rand"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"github.com/synctv-org/synctv/internal/db"
|
|
"github.com/synctv-org/synctv/internal/model"
|
|
"github.com/zijiren233/gencontainer/rwmap"
|
|
)
|
|
|
|
var roomCache rwmap.RWMap[uint, *Room]
|
|
|
|
func CreateRoom(name, password string, conf ...db.CreateRoomConfig) (*Room, error) {
|
|
r, err := db.CreateRoom(name, password, conf...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return initRoom(r)
|
|
}
|
|
|
|
type RoomConf func(r *Room)
|
|
|
|
func WithVersion(version uint32) RoomConf {
|
|
return func(r *Room) {
|
|
atomic.StoreUint32(&r.version, version)
|
|
}
|
|
}
|
|
|
|
func initRoom(room *model.Room, conf ...RoomConf) (*Room, error) {
|
|
r := &Room{
|
|
Room: *room,
|
|
lastActive: time.Now().UnixMilli(),
|
|
version: rand.Uint32(),
|
|
current: newCurrent(),
|
|
}
|
|
for _, c := range conf {
|
|
c(r)
|
|
}
|
|
r, loaded := roomCache.LoadOrStore(room.ID, r)
|
|
if loaded {
|
|
return r, errors.New("room already exists")
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
func LoadRoom(room *model.Room) (*Room, error) {
|
|
return initRoom(room)
|
|
}
|
|
|
|
func DeleteRoom(room *Room) error {
|
|
room.close()
|
|
roomCache.Delete(room.ID)
|
|
return db.DeleteRoomByID(room.ID)
|
|
}
|
|
|
|
func GetRoomByID(id uint) (*Room, error) {
|
|
r2, ok := roomCache.Load(id)
|
|
if ok {
|
|
return r2, nil
|
|
}
|
|
r, err := db.GetRoomByID(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return initRoom(r)
|
|
}
|
|
|
|
func HasRoom(roomID uint) bool {
|
|
_, ok := roomCache.Load(roomID)
|
|
if ok {
|
|
return true
|
|
}
|
|
ok, err := db.HasRoom(roomID)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return ok
|
|
}
|
|
|
|
func HasRoomByName(name string) bool {
|
|
ok, err := db.HasRoomByName(name)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return ok
|
|
}
|
|
|
|
func SetRoomPassword(roomID uint, password string) error {
|
|
r, err := GetRoomByID(roomID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return r.SetPassword(password)
|
|
}
|
|
|
|
func GetAllRooms() []*Room {
|
|
rooms := make([]*Room, roomCache.Len())
|
|
roomCache.Range(func(key uint, value *Room) bool {
|
|
rooms = append(rooms, value)
|
|
return true
|
|
})
|
|
return rooms
|
|
}
|
|
|
|
func GetAllRoomsWithNoNeedPassword() []*Room {
|
|
rooms := make([]*Room, roomCache.Len())
|
|
roomCache.Range(func(key uint, value *Room) bool {
|
|
if !value.NeedPassword() {
|
|
rooms = append(rooms, value)
|
|
}
|
|
return true
|
|
})
|
|
return rooms
|
|
}
|
|
|
|
func GetAllRoomsWithoutHidden() []*Room {
|
|
rooms := make([]*Room, 0, roomCache.Len())
|
|
roomCache.Range(func(key uint, value *Room) bool {
|
|
if !value.Setting.Hidden {
|
|
rooms = append(rooms, value)
|
|
}
|
|
return true
|
|
})
|
|
return rooms
|
|
}
|