diff --git a/server/console_params.go b/server/console_params.go new file mode 100644 index 0000000..bc43492 --- /dev/null +++ b/server/console_params.go @@ -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) + } +} diff --git a/server/event.go b/server/event.go index d84454a..5244ffa 100644 --- a/server/event.go +++ b/server/event.go @@ -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 }) } diff --git a/server/server.go b/server/server.go index 3b95420..4aedd39 100644 --- a/server/server.go +++ b/server/server.go @@ -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),