diff --git a/internal/api/room/control.go b/internal/api/room/control.go index ed90cd41..133af610 100644 --- a/internal/api/room/control.go +++ b/internal/api/room/control.go @@ -6,6 +6,8 @@ import ( "github.com/go-chi/chi" "github.com/demodesk/neko/pkg/auth" + "github.com/demodesk/neko/pkg/types/event" + "github.com/demodesk/neko/pkg/types/message" "github.com/demodesk/neko/pkg/utils" ) @@ -33,12 +35,21 @@ func (h *RoomHandler) controlStatus(w http.ResponseWriter, r *http.Request) erro } func (h *RoomHandler) controlRequest(w http.ResponseWriter, r *http.Request) error { - _, hasHost := h.sessions.GetHost() + session, _ := auth.GetSession(r) + host, hasHost := h.sessions.GetHost() if hasHost { - return utils.HttpUnprocessableEntity("there is already a host") + // TODO: Some throttling mechanism to prevent spamming. + + // let host know that someone wants to take control + host.Send( + event.CONTROL_REQUEST, + message.SessionID{ + ID: session.ID(), + }) + + return utils.HttpError(http.StatusAccepted, "control request sent") } - session, _ := auth.GetSession(r) if h.sessions.Settings().LockedControls && !session.Profile().IsAdmin { return utils.HttpForbidden("controls are locked") } diff --git a/internal/websocket/handler/control.go b/internal/websocket/handler/control.go index 2eb8f989..80e90c66 100644 --- a/internal/websocket/handler/control.go +++ b/internal/websocket/handler/control.go @@ -44,23 +44,29 @@ func (h *MessageHandlerCtx) controlRequest(session types.Session) error { return ErrIsNotAllowedToHost } - if !h.sessions.Settings().ImplicitHosting { - // tell session if there is a host - if host, hasHost := h.sessions.GetHost(); hasHost { - session.Send( - event.CONTROL_HOST, - message.ControlHost{ - HasHost: true, - HostID: host.ID(), - }) - - return ErrIsAlreadyHosted - } + // if implicit hosting is enabled, set session as host without asking + if h.sessions.Settings().ImplicitHosting { + session.SetAsHost() + return nil } - session.SetAsHost() + // if there is no host, set session as host + host, hasHost := h.sessions.GetHost() + if !hasHost { + session.SetAsHost() + return nil + } - return nil + // TODO: Some throttling mechanism to prevent spamming. + + // let host know that someone wants to take control + host.Send( + event.CONTROL_REQUEST, + message.SessionID{ + ID: session.ID(), + }) + + return ErrIsAlreadyHosted } func (h *MessageHandlerCtx) controlMove(session types.Session, payload *message.ControlPos) error {