From c8f4827f6c53b4ca2dfd254d6930249113d41930 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 23 May 2023 14:54:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8E=A7=E5=88=B6=E5=8F=B0?= =?UTF-8?q?=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/simple-server-console/main.go | 17 ++++++++++ server/event.go | 43 ++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 examples/simple-server-console/main.go diff --git a/examples/simple-server-console/main.go b/examples/simple-server-console/main.go new file mode 100644 index 0000000..fd50711 --- /dev/null +++ b/examples/simple-server-console/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "github.com/kercylan98/minotaur/server" + "github.com/kercylan98/minotaur/utils/log" + "go.uber.org/zap" +) + +func main() { + srv := server.New(server.NetworkWebsocket) + srv.RegConsoleCommandEvent("test", func(srv *server.Server) { + log.Info("Console", zap.String("Info", "Test")) + }) + if err := srv.Run(":9999"); err != nil { + panic(err) + } +} diff --git a/server/event.go b/server/event.go index 569e085..75c6f51 100644 --- a/server/event.go +++ b/server/event.go @@ -1,10 +1,12 @@ package server import ( + "fmt" "github.com/kercylan98/minotaur/utils/log" "github.com/kercylan98/minotaur/utils/runtimes" "go.uber.org/zap" "reflect" + "sync" "time" ) @@ -17,6 +19,7 @@ type ConnectionClosedEventHandle func(srv *Server, conn *Conn) type ReceiveCrossPacketEventHandle func(srv *Server, senderServerId int64, packet []byte) 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 event struct { *Server @@ -29,6 +32,46 @@ type event struct { receiveCrossPacketEventHandles []ReceiveCrossPacketEventHandle messageErrorEventHandles []MessageErrorEventHandle messageLowExecEventHandles []MessageLowExecEventHandle + + consoleCommandEventHandles map[string][]ConsoleCommandEventHandle + + consoleCommandEventHandleInitOnce sync.Once +} + +// RegConsoleCommandEvent 控制台收到指令时将立即执行被注册的事件处理函数 +func (slf *event) RegConsoleCommandEvent(command string, handle ConsoleCommandEventHandle) { + slf.consoleCommandEventHandleInitOnce.Do(func() { + slf.consoleCommandEventHandles = map[string][]ConsoleCommandEventHandle{} + go func() { + for { + var input string + _, _ = fmt.Scanln(&input) + handles, exist := slf.consoleCommandEventHandles[input] + if !exist { + switch input { + case "exit", "quit", "close", "shutdown": + log.Info("Console", zap.String("Receive", input), zap.String("Action", "Shutdown")) + slf.Server.Shutdown(nil) + return + } + log.Error("Server", zap.String("Command", "unregistered")) + } else { + for _, handle := range handles { + handle(slf.Server) + } + } + + } + }() + }) + slf.consoleCommandEventHandles[command] = append(slf.consoleCommandEventHandles[command], handle) + log.Info("Server", zap.String("RegEvent", runtimes.CurrentRunningFuncName()), zap.String("handle", reflect.TypeOf(handle).String())) +} + +func (slf *event) OnConsoleCommandEvent(command string) { + for _, handle := range slf.consoleCommandEventHandles[command] { + handle(slf.Server) + } } // RegStartBeforeEvent 在服务器初始化完成启动前立刻执行被注册的事件处理函数