diff --git a/server/conn.go b/server/conn.go index 0c7d347..50dec97 100644 --- a/server/conn.go +++ b/server/conn.go @@ -65,6 +65,21 @@ func newWebsocketConn(server *Server, ws *websocket.Conn, ip string) *Conn { return c } +// NewEmptyConn 创建一个适用于测试的空连接 +func NewEmptyConn(server *Server) *Conn { + c := &Conn{ + server: server, + remoteAddr: &net.TCPAddr{}, + ip: "0.0.0.0:0", + data: map[any]any{}, + } + var wait = new(sync.WaitGroup) + wait.Add(1) + go c.writeLoop(wait) + wait.Wait() + return c +} + // Conn 服务器连接 type Conn struct { server *Server diff --git a/server/event.go b/server/event.go index 0999b24..d2d8b34 100644 --- a/server/event.go +++ b/server/event.go @@ -20,6 +20,7 @@ type ReceiveCrossPacketEventHandle func(srv *Server, senderServerId int64, packe 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 ConnectionOpenedAfterEventHandle func(srv *Server, conn *Conn) type event struct { *Server @@ -32,9 +33,9 @@ type event struct { receiveCrossPacketEventHandles []ReceiveCrossPacketEventHandle messageErrorEventHandles []MessageErrorEventHandle messageLowExecEventHandles []MessageLowExecEventHandle + connectionOpenedAfterEventHandles []ConnectionOpenedAfterEventHandle - consoleCommandEventHandles map[string][]ConsoleCommandEventHandle - + consoleCommandEventHandles map[string][]ConsoleCommandEventHandle consoleCommandEventHandleInitOnce sync.Once } @@ -211,6 +212,23 @@ func (slf *event) OnMessageLowExecEvent(message *Message, cost time.Duration) { }) } +// RegConnectionOpenedAfterEvent 在连接打开事件处理完成后将立刻执行被注册的事件处理函数 +func (slf *event) RegConnectionOpenedAfterEvent(handle ConnectionOpenedAfterEventHandle) { + if slf.network == NetworkHttp { + panic(ErrNetworkIncompatibleHttp) + } + slf.connectionOpenedAfterEventHandles = append(slf.connectionOpenedAfterEventHandles, handle) + log.Info("Server", log.String("RegEvent", runtimes.CurrentRunningFuncName()), log.String("handle", reflect.TypeOf(handle).String())) +} + +func (slf *event) OnConnectionOpenedAfterEvent(conn *Conn) { + PushSystemMessage(slf.Server, func() { + for _, handle := range slf.connectionOpenedAfterEventHandles { + handle(slf.Server, conn) + } + }) +} + func (slf *event) check() { switch slf.network { case NetworkHttp, NetworkGRPC: diff --git a/server/server.go b/server/server.go index e400f16..9713355 100644 --- a/server/server.go +++ b/server/server.go @@ -184,6 +184,7 @@ func (slf *Server) Run(addr string) error { conn := newKcpConn(slf, session) slf.OnConnectionOpenedEvent(conn) + slf.OnConnectionOpenedAfterEvent(conn) go func(conn *Conn) { defer func() {