From d00015ee9116407d725003e55d97a3eb5dc13a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Mon, 30 Nov 2020 20:07:19 +0100 Subject: [PATCH] system init WS. --- internal/types/event/events.go | 3 +- internal/types/message/messages.go | 23 +++++---- internal/websocket/handler/session.go | 30 ++---------- internal/websocket/handler/system.go | 69 +++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 37 deletions(-) create mode 100644 internal/websocket/handler/system.go diff --git a/internal/types/event/events.go b/internal/types/event/events.go index f2f95380..dd7a275b 100644 --- a/internal/types/event/events.go +++ b/internal/types/event/events.go @@ -1,7 +1,8 @@ package event const ( - SYSTEM_CONNECT = "system/connect" // TODO: New. + SYSTEM_INIT = "system/init" + SYSTEM_ADMIN = "system/admin" SYSTEM_DISCONNECT = "system/disconnect" ) diff --git a/internal/types/message/messages.go b/internal/types/message/messages.go index 5edd4490..549c5d1b 100644 --- a/internal/types/message/messages.go +++ b/internal/types/message/messages.go @@ -6,14 +6,17 @@ type Message struct { } // System -// TODO: New. -type SystemConnect struct { - Event string `json:"event,omitempty"` - ControlHost ControlHost `json:"control_host"` - ScreenSize ScreenSize `json:"screen_size"` - Members []MemberData `json:"members"` - ScreenSizesList *[]ScreenSize `json:"screen_sizes_list,omitempty"` - BroadcastStatus BroadcastStatus `json:"members,omitempty"` +type SystemInit struct { + Event string `json:"event,omitempty"` + ControlHost ControlHost `json:"control_host"` + ScreenSize ScreenSize `json:"screen_size"` + Members []MemberData `json:"members"` +} + +type SystemAdmin struct { + Event string `json:"event,omitempty"` + ScreenSizesList []ScreenSize `json:"screen_sizes_list"` + BroadcastStatus BroadcastStatus `json:"broadcast_status"` } // TODO: New. @@ -106,9 +109,9 @@ type KeyboardLayout struct { } type BroadcastStatus struct { - Event string `json:"event"` - URL string `json:"url"` + Event string `json:"event,omitempty"` IsActive bool `json:"is_active"` + URL string `json:"url,omitempty"` } // TODO: Remove. diff --git a/internal/websocket/handler/session.go b/internal/websocket/handler/session.go index b3d761e5..c02a9089 100644 --- a/internal/websocket/handler/session.go +++ b/internal/websocket/handler/session.go @@ -7,34 +7,12 @@ import ( ) func (h *MessageHandlerCtx) SessionConnected(session types.Session) error { - // create member list - members := []*message.MembersListEntry{} - for _, session := range h.sessions.Members() { - members = append(members, &message.MembersListEntry{ - ID: session.ID(), - Name: session.Name(), - Admin: session.Admin(), - }) - } - - // send list of members to session - if err := session.Send( - message.MembersList{ - Event: event.MEMBER_LIST, - Memebers: members, - }); err != nil { + if err := h.systemInit(session); err != nil { return err } - // tell session there is a host - host := h.sessions.GetHost() - if host != nil { - if err := session.Send( - message.ControlHost{ - Event: event.CONTROL_HOST, - HasHost: true, - HostID: host.ID(), - }); err != nil { + if session.Admin() { + if err := h.systemAdmin(session); err != nil { return err } } @@ -42,7 +20,7 @@ func (h *MessageHandlerCtx) SessionConnected(session types.Session) error { // let everyone know there is a new session h.sessions.Broadcast( message.Member{ - Event: event.MEMBER_CONNECTED, + Event: event.MEMBER_CONNECTED, ID: session.ID(), Name: session.Name(), Admin: session.Admin(), diff --git a/internal/websocket/handler/system.go b/internal/websocket/handler/system.go new file mode 100644 index 00000000..83df6de6 --- /dev/null +++ b/internal/websocket/handler/system.go @@ -0,0 +1,69 @@ +package handler + +import ( + "demodesk/neko/internal/types" + "demodesk/neko/internal/types/event" + "demodesk/neko/internal/types/message" +) + +func (h *MessageHandlerCtx) systemInit(session types.Session) error { + host := h.sessions.GetHost() + + controlHost := message.ControlHost{ + HasHost: host != nil, + } + + if controlHost.HasHost { + controlHost.HostID = host.ID() + } + + size := h.desktop.GetScreenSize() + if size == nil { + h.logger.Debug().Msg("could not get screen size") + return nil + } + + members := []message.MemberData{} + for _, session := range h.sessions.Members() { + members = append(members, message.MemberData{ + ID: session.ID(), + Name: session.Name(), + IsAdmin: session.Admin(), + }) + } + + return session.Send( + message.SystemInit{ + Event: event.SYSTEM_INIT, + ControlHost: controlHost, + Members: members, + ScreenSize: message.ScreenSize{ + Width: size.Width, + Height: size.Height, + Rate: int(size.Rate), + }, + }) +} + +func (h *MessageHandlerCtx) systemAdmin(session types.Session) error { + screenSizesList := []message.ScreenSize{} + for _, size := range h.desktop.ScreenConfigurations() { + for _, fps := range size.Rates { + screenSizesList = append(screenSizesList, message.ScreenSize{ + Width: size.Width, + Height: size.Height, + Rate: int(fps), + }) + } + } + + return session.Send( + message.SystemAdmin{ + Event: event.SYSTEM_ADMIN, + ScreenSizesList: screenSizesList, + BroadcastStatus: message.BroadcastStatus{ + IsActive: h.capture.BroadcastEnabled(), + URL: h.capture.BroadcastUrl(), + }, + }) +}