mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
Pushing for review
This commit is contained in:
parent
01b3cac48b
commit
2f723d9ce1
@ -22,6 +22,7 @@ func init() {
|
||||
neko.Service.Remote,
|
||||
neko.Service.Broadcast,
|
||||
neko.Service.WebSocket,
|
||||
neko.Service.SessionManager,
|
||||
}
|
||||
|
||||
cobra.OnInitialize(func() {
|
||||
|
@ -10,6 +10,9 @@ import (
|
||||
|
||||
"m1k1o/neko/internal/types"
|
||||
"m1k1o/neko/internal/utils"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
func New(remote types.RemoteManager) *SessionManager {
|
||||
@ -31,6 +34,16 @@ type SessionManager struct {
|
||||
emmiter events.EventEmmiter
|
||||
// TODO: Handle locks in sessions as flags.
|
||||
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 {
|
||||
@ -111,8 +124,23 @@ func (manager *SessionManager) SetControlLocked(locked bool) {
|
||||
manager.controlLocked = locked
|
||||
}
|
||||
|
||||
func (manager *SessionManager) CanControl(id string) bool {
|
||||
func (manager *SessionManager) CanControl(id string, isClickEvent bool) bool {
|
||||
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())
|
||||
}
|
||||
|
||||
@ -252,3 +280,7 @@ func (manager *SessionManager) OnConnected(listener func(id string, session type
|
||||
listener(payload[0].(string), payload[1].(*Session))
|
||||
})
|
||||
}
|
||||
|
||||
func (manager *SessionManager) ImplicitControl() bool {
|
||||
return manager.implicitControl
|
||||
}
|
||||
|
@ -22,8 +22,6 @@ type WebRTC struct {
|
||||
NAT1To1IPs []string
|
||||
TCPMUX int
|
||||
UDPMUX int
|
||||
|
||||
ImplicitControl bool
|
||||
}
|
||||
|
||||
func (WebRTC) Init(cmd *cobra.Command) error {
|
||||
@ -67,12 +65,6 @@ func (WebRTC) Init(cmd *cobra.Command) error {
|
||||
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
|
||||
}
|
||||
|
||||
@ -128,7 +120,4 @@ func (s *WebRTC) Set() {
|
||||
s.EphemeralMin = min
|
||||
s.EphemeralMax = max
|
||||
}
|
||||
|
||||
// TODO: Should be moved to session config.
|
||||
s.ImplicitControl = viper.GetBool("implicit_control")
|
||||
}
|
||||
|
@ -1,4 +1,15 @@
|
||||
package types
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
type ControlMode string
|
||||
|
||||
const (
|
||||
None ControlMode = ""
|
||||
OnClick = "on_click"
|
||||
OnMove = "on_click"
|
||||
)
|
||||
|
||||
type Member struct {
|
||||
ID string `json:"id"`
|
||||
@ -30,6 +41,7 @@ type Session interface {
|
||||
}
|
||||
|
||||
type SessionManager interface {
|
||||
Init(cmd *cobra.Command) error
|
||||
New(id string, admin bool, socket WebSocket) Session
|
||||
HasHost() bool
|
||||
IsHost(id string) bool
|
||||
@ -51,4 +63,6 @@ type SessionManager interface {
|
||||
OnDestroy(listener func(id string, session Session))
|
||||
OnCreated(listener func(id string, session Session))
|
||||
OnConnected(listener func(id string, session Session))
|
||||
ImplicitControl() bool
|
||||
ImplicitControlMode() ControlMode
|
||||
}
|
||||
|
@ -13,7 +13,6 @@ type WebRTCManager interface {
|
||||
CreatePeer(id string, session Session) (Peer, error)
|
||||
ICELite() bool
|
||||
ICEServers() []webrtc.ICEServer
|
||||
ImplicitControl() bool
|
||||
}
|
||||
|
||||
type Peer interface {
|
||||
|
@ -18,7 +18,7 @@ type Stats struct {
|
||||
LastUserLeftAt *time.Time `json:"last_user_left_at"`
|
||||
|
||||
ControlProtection bool `json:"control_protection"`
|
||||
ImplicitControl bool `json:"implicit_control"`
|
||||
ImplicitControl string `json:"implicit_control"`
|
||||
}
|
||||
|
||||
type WebSocket interface {
|
||||
|
@ -39,10 +39,6 @@ type PayloadKey struct {
|
||||
}
|
||||
|
||||
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)
|
||||
header := &PayloadHeader{}
|
||||
hbytes := make([]byte, 3)
|
||||
@ -55,6 +51,12 @@ func (manager *WebRTCManager) handle(id string, msg webrtc.DataChannelMessage) e
|
||||
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)
|
||||
|
||||
switch header.Event {
|
||||
|
Loading…
Reference in New Issue
Block a user