From 5e26467deef2e2dcf6d0b04c918e59193942d432 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 27 Jul 2023 14:44:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20server.Server=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=AF=B9=E8=BF=9E=E6=8E=A5=E5=86=99=E5=85=A5=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=89=8D=E7=9A=84=E5=A4=84=E7=90=86=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/conn.go | 9 ++++++++- server/event.go | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index 50dec97..72c863f 100644 --- a/server/conn.go +++ b/server/conn.go @@ -94,6 +94,11 @@ type Conn struct { packets []*connPacket } +// IsEmpty 是否是空连接 +func (slf *Conn) IsEmpty() bool { + return slf.ws == nil && slf.gn == nil && slf.kcp == nil +} + // Reuse 重用连接 // - 重用连接时,会将当前连接的数据复制到新连接中 // - 通常在于连接断开后,重新连接时使用 @@ -174,6 +179,7 @@ func (slf *Conn) IsWebsocket() bool { // Write 向连接中写入数据 // - messageType: websocket模式中指定消息类型 func (slf *Conn) Write(packet Packet) { + packet = slf.server.OnConnectionWritePacketBeforeEvent(slf, packet) if slf.packetPool == nil { return } @@ -187,7 +193,8 @@ func (slf *Conn) Write(packet Packet) { // WriteWithCallback 与 Write 相同,但是会在写入完成后调用 callback // - 当 callback 为 nil 时,与 Write 相同 -func (slf *Conn) WriteWithCallback(packet Packet, callback func(err error), messageType ...int) { +func (slf *Conn) WriteWithCallback(packet Packet, callback func(err error)) { + packet = slf.server.OnConnectionWritePacketBeforeEvent(slf, packet) if slf.packetPool == nil { return } diff --git a/server/event.go b/server/event.go index 6fcc514..a492e87 100644 --- a/server/event.go +++ b/server/event.go @@ -21,6 +21,7 @@ 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 ConnectionWritePacketBeforeEventHandle func(srv *Server, conn *Conn, packet Packet) Packet type event struct { *Server @@ -34,6 +35,7 @@ type event struct { messageErrorEventHandles []MessageErrorEventHandle messageLowExecEventHandles []MessageLowExecEventHandle connectionOpenedAfterEventHandles []ConnectionOpenedAfterEventHandle + connectionWritePacketBeforeHandles []ConnectionWritePacketBeforeEventHandle consoleCommandEventHandles map[string][]ConsoleCommandEventHandle consoleCommandEventHandleInitOnce sync.Once @@ -229,6 +231,26 @@ func (slf *event) OnConnectionOpenedAfterEvent(conn *Conn) { }, "ConnectionOpenedAfterEvent") } +// RegConnectionWritePacketBeforeEvent 在发送数据包前将立刻执行被注册的事件处理函数 +func (slf *event) RegConnectionWritePacketBeforeEvent(handle ConnectionWritePacketBeforeEventHandle) { + if slf.network == NetworkHttp { + panic(ErrNetworkIncompatibleHttp) + } + slf.connectionWritePacketBeforeHandles = append(slf.connectionWritePacketBeforeHandles, handle) + log.Info("Server", log.String("RegEvent", runtimes.CurrentRunningFuncName()), log.String("handle", reflect.TypeOf(handle).String())) +} + +func (slf *event) OnConnectionWritePacketBeforeEvent(conn *Conn, packet Packet) (newPacket Packet) { + if len(slf.connectionWritePacketBeforeHandles) == 0 { + return packet + } + newPacket = packet + for _, handle := range slf.connectionWritePacketBeforeHandles { + newPacket = handle(slf.Server, conn, packet) + } + return newPacket +} + func (slf *event) check() { switch slf.network { case NetworkHttp, NetworkGRPC: