feat: 增强 server.RegConsoleCommandEvent 函数,支持 url 格式输入命令,并将命令解析为指令和参数

This commit is contained in:
kercylan98 2023-11-11 19:24:58 +08:00
parent ab72920084
commit d2654cfc95
3 changed files with 76 additions and 4 deletions

54
server/console_params.go Normal file
View File

@ -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)
}
}

View File

@ -6,9 +6,11 @@ import (
"github.com/kercylan98/minotaur/utils/runtimes"
"github.com/kercylan98/minotaur/utils/slice"
"golang.org/x/crypto/ssh/terminal"
"net/url"
"os"
"reflect"
"runtime/debug"
"strings"
"sync"
"time"
)
@ -21,7 +23,7 @@ type ConnectionOpenedEventHandle func(srv *Server, conn *Conn)
type ConnectionClosedEventHandle func(srv *Server, conn *Conn, err any)
type MessageErrorEventHandle func(srv *Server, message *Message, err error)
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 ConnectionWritePacketBeforeEventHandle func(srv *Server, conn *Conn, packet []byte) []byte
type ShuntChannelCreatedEventHandle func(srv *Server, guid int64)
@ -102,7 +104,11 @@ func (slf *event) RegConsoleCommandEvent(command string, handle ConsoleCommandEv
for {
var input string
_, _ = 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()))
}
func (slf *event) OnConsoleCommandEvent(command string) {
func (slf *event) OnConsoleCommandEvent(command string, paramsStr string) {
slf.PushSystemMessage(func() {
handles, exist := slf.consoleCommandEventHandles[command]
if !exist {
@ -127,8 +133,17 @@ func (slf *event) OnConsoleCommandEvent(command string) {
}
log.Warn("Server", log.String("Command", "unregistered"))
} 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 {
value(slf.Server)
value(slf.Server, command, params)
return true
})
}

View File

@ -444,6 +444,9 @@ func (slf *Server) Shutdown() {
// shutdown 停止运行服务器
func (slf *Server) shutdown(err error) {
if err != nil {
log.Error("Server", log.String("state", "shutdown"), log.Err(err))
}
slf.isShutdown.Store(true)
for slf.messageCounter.Load() > 0 {
log.Info("Server", log.Any("network", slf.network), log.String("listen", slf.addr),