Pushing for review

This commit is contained in:
gbrian 2022-03-29 06:15:02 +00:00
parent 01b3cac48b
commit 2f723d9ce1
7 changed files with 55 additions and 18 deletions

View File

@ -22,6 +22,7 @@ func init() {
neko.Service.Remote, neko.Service.Remote,
neko.Service.Broadcast, neko.Service.Broadcast,
neko.Service.WebSocket, neko.Service.WebSocket,
neko.Service.SessionManager,
} }
cobra.OnInitialize(func() { cobra.OnInitialize(func() {

View File

@ -10,6 +10,9 @@ import (
"m1k1o/neko/internal/types" "m1k1o/neko/internal/types"
"m1k1o/neko/internal/utils" "m1k1o/neko/internal/utils"
"github.com/spf13/cobra"
"github.com/spf13/viper"
) )
func New(remote types.RemoteManager) *SessionManager { func New(remote types.RemoteManager) *SessionManager {
@ -31,6 +34,16 @@ type SessionManager struct {
emmiter events.EventEmmiter emmiter events.EventEmmiter
// TODO: Handle locks in sessions as flags. // TODO: Handle locks in sessions as flags.
controlLocked bool controlLocked bool
implicitControl bool
}
func (manager *SessionManager) Init(cmd *cobra.Command) error {
cmd.PersistentFlags().Bool("implicit_control", "", "if enabled members can gain control implicitly. Valid values: none, free, on_click")
if err := viper.BindPFlag("implicit_control", cmd.PersistentFlags().Lookup("implicit_control")); err != nil {
return err
}
manager.implicitControl = viper.GetBool("implicit_control")
} }
func (manager *SessionManager) New(id string, admin bool, socket types.WebSocket) types.Session { func (manager *SessionManager) New(id string, admin bool, socket types.WebSocket) types.Session {
@ -111,8 +124,23 @@ func (manager *SessionManager) SetControlLocked(locked bool) {
manager.controlLocked = locked manager.controlLocked = locked
} }
func (manager *SessionManager) CanControl(id string) bool { func (manager *SessionManager) CanControl(id string, isClickEvent bool) bool {
session, ok := manager.Get(id) session, ok := manager.Get(id)
if !manager.IsHost(id) {
ok = false
}
if !ok {
switch manager.sessions.ImplicitControl {
case types.session.ControlMode.OnMove:
ok = true
case types.session.ControlMode.OnClick:
if isClickEvent: {
// Switch host
manager.
}
}
}
return ok && (!manager.controlLocked || session.Admin()) return ok && (!manager.controlLocked || session.Admin())
} }
@ -252,3 +280,7 @@ func (manager *SessionManager) OnConnected(listener func(id string, session type
listener(payload[0].(string), payload[1].(*Session)) listener(payload[0].(string), payload[1].(*Session))
}) })
} }
func (manager *SessionManager) ImplicitControl() bool {
return manager.implicitControl
}

View File

@ -22,8 +22,6 @@ type WebRTC struct {
NAT1To1IPs []string NAT1To1IPs []string
TCPMUX int TCPMUX int
UDPMUX int UDPMUX int
ImplicitControl bool
} }
func (WebRTC) Init(cmd *cobra.Command) error { func (WebRTC) Init(cmd *cobra.Command) error {
@ -67,12 +65,6 @@ func (WebRTC) Init(cmd *cobra.Command) error {
return err return err
} }
// TODO: Should be moved to session config.
cmd.PersistentFlags().Bool("implicit_control", false, "if enabled members can gain control implicitly")
if err := viper.BindPFlag("implicit_control", cmd.PersistentFlags().Lookup("implicit_control")); err != nil {
return err
}
return nil return nil
} }
@ -128,7 +120,4 @@ func (s *WebRTC) Set() {
s.EphemeralMin = min s.EphemeralMin = min
s.EphemeralMax = max s.EphemeralMax = max
} }
// TODO: Should be moved to session config.
s.ImplicitControl = viper.GetBool("implicit_control")
} }

View File

@ -1,4 +1,15 @@
package types package types
import (
"github.com/spf13/cobra"
)
type ControlMode string
const (
None ControlMode = ""
OnClick = "on_click"
OnMove = "on_click"
)
type Member struct { type Member struct {
ID string `json:"id"` ID string `json:"id"`
@ -30,6 +41,7 @@ type Session interface {
} }
type SessionManager interface { type SessionManager interface {
Init(cmd *cobra.Command) error
New(id string, admin bool, socket WebSocket) Session New(id string, admin bool, socket WebSocket) Session
HasHost() bool HasHost() bool
IsHost(id string) bool IsHost(id string) bool
@ -51,4 +63,6 @@ type SessionManager interface {
OnDestroy(listener func(id string, session Session)) OnDestroy(listener func(id string, session Session))
OnCreated(listener func(id string, session Session)) OnCreated(listener func(id string, session Session))
OnConnected(listener func(id string, session Session)) OnConnected(listener func(id string, session Session))
ImplicitControl() bool
ImplicitControlMode() ControlMode
} }

View File

@ -13,7 +13,6 @@ type WebRTCManager interface {
CreatePeer(id string, session Session) (Peer, error) CreatePeer(id string, session Session) (Peer, error)
ICELite() bool ICELite() bool
ICEServers() []webrtc.ICEServer ICEServers() []webrtc.ICEServer
ImplicitControl() bool
} }
type Peer interface { type Peer interface {

View File

@ -18,7 +18,7 @@ type Stats struct {
LastUserLeftAt *time.Time `json:"last_user_left_at"` LastUserLeftAt *time.Time `json:"last_user_left_at"`
ControlProtection bool `json:"control_protection"` ControlProtection bool `json:"control_protection"`
ImplicitControl bool `json:"implicit_control"` ImplicitControl string `json:"implicit_control"`
} }
type WebSocket interface { type WebSocket interface {

View File

@ -39,10 +39,6 @@ type PayloadKey struct {
} }
func (manager *WebRTCManager) handle(id string, msg webrtc.DataChannelMessage) error { func (manager *WebRTCManager) handle(id string, msg webrtc.DataChannelMessage) error {
if (!manager.config.ImplicitControl && !manager.sessions.IsHost(id)) || (manager.config.ImplicitControl && !manager.sessions.CanControl(id)) {
return nil
}
buffer := bytes.NewBuffer(msg.Data) buffer := bytes.NewBuffer(msg.Data)
header := &PayloadHeader{} header := &PayloadHeader{}
hbytes := make([]byte, 3) hbytes := make([]byte, 3)
@ -55,6 +51,12 @@ func (manager *WebRTCManager) handle(id string, msg webrtc.DataChannelMessage) e
return err return err
} }
isClickEvent = header.Event == OP_KEY_CLK
// Confirm we can can continue
if (!manager.sessions.CanControl(id, isClickEvent)) {
return nil
}
buffer = bytes.NewBuffer(msg.Data) buffer = bytes.NewBuffer(msg.Data)
switch header.Event { switch header.Event {