package op import ( "errors" "hash/crc32" "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) } func InitRoom(room *model.Room) (*Room, error) { r := &Room{ Room: *room, version: crc32.ChecksumIEEE(room.HashedPassword), current: newCurrent(), movies: movies{ roomID: room.ID, }, } r, loaded := roomCache.LoadOrStore(room.ID, r) if loaded { return r, errors.New("room already init") } return r, nil } func LoadOrInitRoom(room *model.Room) (*Room, bool) { return roomCache.LoadOrStore(room.ID, &Room{ Room: *room, version: crc32.ChecksumIEEE(room.HashedPassword), current: newCurrent(), movies: movies{ roomID: room.ID, }, }) } func DeleteRoom(roomID uint) error { err := db.DeleteRoomByID(roomID) if err != nil { return err } return CloseRoom(roomID) } func CloseRoom(roomID uint) error { r, loaded := roomCache.LoadAndDelete(roomID) if loaded { r.close() } return nil } func LoadRoomByID(id uint) (*Room, error) { r2, ok := roomCache.Load(id) if ok { return r2, nil } return nil, errors.New("room not found") } func LoadOrInitRoomByID(id uint) (*Room, error) { r, ok := roomCache.Load(id) if ok { return r, nil } room, err := db.GetRoomByID(id) if err != nil { return nil, err } r, _ = LoadOrInitRoom(room) return r, nil } func ClientNum(roomID uint) int64 { r, ok := roomCache.Load(roomID) if ok { return r.ClientNum() } return 0 } 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 := LoadOrInitRoomByID(roomID) if err != nil { return err } return r.SetPassword(password) } func GetAllRoomsInCache() []*Room { rooms := make([]*Room, roomCache.Len()) roomCache.Range(func(key uint, value *Room) bool { rooms = append(rooms, value) return true }) return rooms } func GetAllRoomsInCacheWithNoNeedPassword() []*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 GetAllRoomsInCacheWithoutHidden() []*Room { rooms := make([]*Room, 0, roomCache.Len()) roomCache.Range(func(key uint, value *Room) bool { if !value.Settings.Hidden { rooms = append(rooms, value) } return true }) return rooms }