支持控制台命令

This commit is contained in:
kercylan98 2023-05-23 14:54:43 +08:00
parent aeade860be
commit c8f4827f6c
2 changed files with 60 additions and 0 deletions

View File

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

View File

@ -1,10 +1,12 @@
package server package server
import ( import (
"fmt"
"github.com/kercylan98/minotaur/utils/log" "github.com/kercylan98/minotaur/utils/log"
"github.com/kercylan98/minotaur/utils/runtimes" "github.com/kercylan98/minotaur/utils/runtimes"
"go.uber.org/zap" "go.uber.org/zap"
"reflect" "reflect"
"sync"
"time" "time"
) )
@ -17,6 +19,7 @@ type ConnectionClosedEventHandle func(srv *Server, conn *Conn)
type ReceiveCrossPacketEventHandle func(srv *Server, senderServerId int64, packet []byte) type ReceiveCrossPacketEventHandle func(srv *Server, senderServerId int64, packet []byte)
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 event struct { type event struct {
*Server *Server
@ -29,6 +32,46 @@ type event struct {
receiveCrossPacketEventHandles []ReceiveCrossPacketEventHandle receiveCrossPacketEventHandles []ReceiveCrossPacketEventHandle
messageErrorEventHandles []MessageErrorEventHandle messageErrorEventHandles []MessageErrorEventHandle
messageLowExecEventHandles []MessageLowExecEventHandle 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 在服务器初始化完成启动前立刻执行被注册的事件处理函数 // RegStartBeforeEvent 在服务器初始化完成启动前立刻执行被注册的事件处理函数