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.Remote,
|
||||||
neko.Service.Broadcast,
|
neko.Service.Broadcast,
|
||||||
neko.Service.WebSocket,
|
neko.Service.WebSocket,
|
||||||
|
neko.Service.SessionManager,
|
||||||
}
|
}
|
||||||
|
|
||||||
cobra.OnInitialize(func() {
|
cobra.OnInitialize(func() {
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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")
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user