feat: 增强 server.RegConsoleCommandEvent 函数,支持 url 格式输入命令,并将命令解析为指令和参数
This commit is contained in:
parent
ab72920084
commit
d2654cfc95
|
@ -0,0 +1,54 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
// ConsoleParams 控制台参数
|
||||||
|
type ConsoleParams map[string][]string
|
||||||
|
|
||||||
|
// Get 获取参数值
|
||||||
|
func (slf ConsoleParams) Get(key string) string {
|
||||||
|
if v, exist := slf[key]; exist && len(v) > 0 {
|
||||||
|
return v[0]
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValues 获取参数值
|
||||||
|
func (slf ConsoleParams) GetValues(key string) []string {
|
||||||
|
if v, exist := slf[key]; exist {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValueNum 获取参数值数量
|
||||||
|
func (slf ConsoleParams) GetValueNum(key string) int {
|
||||||
|
if v, exist := slf[key]; exist {
|
||||||
|
return len(v)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Has 是否存在参数
|
||||||
|
func (slf ConsoleParams) Has(key string) bool {
|
||||||
|
_, exist := slf[key]
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add 添加参数
|
||||||
|
func (slf ConsoleParams) Add(key, value string) {
|
||||||
|
if _, exist := slf[key]; !exist {
|
||||||
|
slf[key] = []string{}
|
||||||
|
}
|
||||||
|
slf[key] = append(slf[key], value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Del 删除参数
|
||||||
|
func (slf ConsoleParams) Del(key string) {
|
||||||
|
delete(slf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear 清空参数
|
||||||
|
func (slf ConsoleParams) Clear() {
|
||||||
|
for k := range slf {
|
||||||
|
delete(slf, k)
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,9 +6,11 @@ import (
|
||||||
"github.com/kercylan98/minotaur/utils/runtimes"
|
"github.com/kercylan98/minotaur/utils/runtimes"
|
||||||
"github.com/kercylan98/minotaur/utils/slice"
|
"github.com/kercylan98/minotaur/utils/slice"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -21,7 +23,7 @@ type ConnectionOpenedEventHandle func(srv *Server, conn *Conn)
|
||||||
type ConnectionClosedEventHandle func(srv *Server, conn *Conn, err any)
|
type ConnectionClosedEventHandle func(srv *Server, conn *Conn, err any)
|
||||||
type MessageErrorEventHandle func(srv *Server, message *Message, err error)
|
type MessageErrorEventHandle func(srv *Server, message *Message, err error)
|
||||||
type MessageLowExecEventHandle func(srv *Server, message *Message, cost time.Duration)
|
type MessageLowExecEventHandle func(srv *Server, message *Message, cost time.Duration)
|
||||||
type ConsoleCommandEventHandle func(srv *Server)
|
type ConsoleCommandEventHandle func(srv *Server, command string, params ConsoleParams)
|
||||||
type ConnectionOpenedAfterEventHandle func(srv *Server, conn *Conn)
|
type ConnectionOpenedAfterEventHandle func(srv *Server, conn *Conn)
|
||||||
type ConnectionWritePacketBeforeEventHandle func(srv *Server, conn *Conn, packet []byte) []byte
|
type ConnectionWritePacketBeforeEventHandle func(srv *Server, conn *Conn, packet []byte) []byte
|
||||||
type ShuntChannelCreatedEventHandle func(srv *Server, guid int64)
|
type ShuntChannelCreatedEventHandle func(srv *Server, guid int64)
|
||||||
|
@ -102,7 +104,11 @@ func (slf *event) RegConsoleCommandEvent(command string, handle ConsoleCommandEv
|
||||||
for {
|
for {
|
||||||
var input string
|
var input string
|
||||||
_, _ = fmt.Scanln(&input)
|
_, _ = fmt.Scanln(&input)
|
||||||
slf.OnConsoleCommandEvent(input)
|
c2p := strings.SplitN(input, "?", 2)
|
||||||
|
if len(c2p) == 1 {
|
||||||
|
c2p = append(c2p, "")
|
||||||
|
}
|
||||||
|
slf.OnConsoleCommandEvent(c2p[0], c2p[1])
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
})
|
})
|
||||||
|
@ -115,7 +121,7 @@ func (slf *event) RegConsoleCommandEvent(command string, handle ConsoleCommandEv
|
||||||
log.Info("Server", log.String("RegEvent", runtimes.CurrentRunningFuncName()), log.String("handle", reflect.TypeOf(handle).String()))
|
log.Info("Server", log.String("RegEvent", runtimes.CurrentRunningFuncName()), log.String("handle", reflect.TypeOf(handle).String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *event) OnConsoleCommandEvent(command string) {
|
func (slf *event) OnConsoleCommandEvent(command string, paramsStr string) {
|
||||||
slf.PushSystemMessage(func() {
|
slf.PushSystemMessage(func() {
|
||||||
handles, exist := slf.consoleCommandEventHandles[command]
|
handles, exist := slf.consoleCommandEventHandles[command]
|
||||||
if !exist {
|
if !exist {
|
||||||
|
@ -127,8 +133,17 @@ func (slf *event) OnConsoleCommandEvent(command string) {
|
||||||
}
|
}
|
||||||
log.Warn("Server", log.String("Command", "unregistered"))
|
log.Warn("Server", log.String("Command", "unregistered"))
|
||||||
} else {
|
} else {
|
||||||
|
v, err := url.ParseQuery(paramsStr)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("ConsoleCommandEvent", log.String("command", command), log.String("params", paramsStr), log.Err(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var params = make(ConsoleParams)
|
||||||
|
for key, value := range v {
|
||||||
|
params[key] = value
|
||||||
|
}
|
||||||
handles.RangeValue(func(index int, value ConsoleCommandEventHandle) bool {
|
handles.RangeValue(func(index int, value ConsoleCommandEventHandle) bool {
|
||||||
value(slf.Server)
|
value(slf.Server, command, params)
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -444,6 +444,9 @@ func (slf *Server) Shutdown() {
|
||||||
|
|
||||||
// shutdown 停止运行服务器
|
// shutdown 停止运行服务器
|
||||||
func (slf *Server) shutdown(err error) {
|
func (slf *Server) shutdown(err error) {
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Server", log.String("state", "shutdown"), log.Err(err))
|
||||||
|
}
|
||||||
slf.isShutdown.Store(true)
|
slf.isShutdown.Store(true)
|
||||||
for slf.messageCounter.Load() > 0 {
|
for slf.messageCounter.Load() > 0 {
|
||||||
log.Info("Server", log.Any("network", slf.network), log.String("listen", slf.addr),
|
log.Info("Server", log.Any("network", slf.network), log.String("listen", slf.addr),
|
||||||
|
|
Loading…
Reference in New Issue