diff --git a/room/room.go b/room/room.go index f273725e..cd7a2fde 100644 --- a/room/room.go +++ b/room/room.go @@ -21,21 +21,20 @@ var ( ) type Room struct { - id string - password []byte - needPassword uint32 - version uint64 - current *current - rtmps *rtmps.Server - rtmpa *rtmps.App - hidden uint32 - initOnce sync.Once - users rwmap.RWMap[string, *User] - rootUser *User - lastActive int64 - createdAt int64 - mid uint64 - hub *hub + id string + settings settings + password []byte + version uint64 + current *current + rtmps *rtmps.Server + rtmpa *rtmps.App + initOnce sync.Once + users rwmap.RWMap[string, *User] + rootUser *User + lastActive int64 + createdAt int64 + mid uint64 + hub *hub *movies } @@ -195,15 +194,11 @@ func (r *Room) Close() error { } func (r *Room) SetHidden(hidden bool) { - if hidden { - atomic.StoreUint32(&r.hidden, 1) - } else { - atomic.StoreUint32(&r.hidden, 0) - } + r.settings.SetHidden(hidden) } func (r *Room) Hidden() bool { - return atomic.LoadUint32(&r.hidden) == 1 + return r.settings.Hidden() } func (r *Room) Id() string { @@ -225,9 +220,9 @@ func (r *Room) SetPassword(password string) error { return err } r.password = b - atomic.StoreUint32(&r.needPassword, 1) + r.settings.SetNeedPassword(true) } else { - atomic.StoreUint32(&r.needPassword, 0) + r.settings.SetNeedPassword(false) r.password = nil } r.updateVersion() @@ -254,7 +249,7 @@ func (r *Room) CheckPassword(password string) (ok bool) { } func (r *Room) NeedPassword() bool { - return atomic.LoadUint32(&r.needPassword) == 1 + return r.settings.NeedPassword() } func (r *Room) Version() uint64 { diff --git a/room/settings.go b/room/settings.go new file mode 100644 index 00000000..11c96332 --- /dev/null +++ b/room/settings.go @@ -0,0 +1,32 @@ +package room + +import "sync/atomic" + +type settings struct { + hidden uint32 + needPassword uint32 +} + +func (s *settings) Hidden() bool { + return atomic.LoadUint32(&s.hidden) == 1 +} + +func (s *settings) SetHidden(hidden bool) { + if hidden { + atomic.StoreUint32(&s.hidden, 1) + } else { + atomic.StoreUint32(&s.hidden, 0) + } +} + +func (s *settings) NeedPassword() bool { + return atomic.LoadUint32(&s.needPassword) == 1 +} + +func (s *settings) SetNeedPassword(needPassword bool) { + if needPassword { + atomic.StoreUint32(&s.needPassword, 1) + } else { + atomic.StoreUint32(&s.needPassword, 0) + } +} diff --git a/server/handlers/init.go b/server/handlers/init.go index 1ed538a7..a5f7e05f 100644 --- a/server/handlers/init.go +++ b/server/handlers/init.go @@ -87,6 +87,8 @@ func Init(e *gin.Engine, s *rtmps.Server, r *room.Rooms) { needAuthRoom.PUT("/admin", AddAdmin) needAuthRoom.DELETE("/admin", DelAdmin) + + needAuthRoom.GET("/settings", RoomSettings) } { diff --git a/server/handlers/room.go b/server/handlers/room.go index cb57d76b..e17c18f2 100644 --- a/server/handlers/room.go +++ b/server/handlers/room.go @@ -343,3 +343,19 @@ func DelAdmin(ctx *gin.Context) { ctx.Status(http.StatusNoContent) } + +func RoomSettings(ctx *gin.Context) { + user := ctx.Value("user").(*room.User) + + if !user.IsRoot() && !user.IsAdmin() { + ctx.AbortWithStatusJSON(http.StatusUnauthorized, model.NewApiErrorStringResp("only root or admin can get room settings")) + return + } + + room := user.Room() + + ctx.JSON(http.StatusOK, model.NewApiDataResp(gin.H{ + "hidden": room.Hidden(), + "needPassword": room.NeedPassword(), + })) +}