@@ -3,8 +3,8 @@ package bot
33import (
44 "math/rand"
55 "net/http"
6+ "regexp"
67 "strconv"
7- "strings"
88 "time"
99
1010 "github.com/Mrs4s/MiraiGo/client"
@@ -25,6 +25,7 @@ type WsServer struct {
2525 * safe_ws.SafeWebSocket // 线程安全的ws
2626 * config.ServerGroup // 服务器组配置
2727 wsUrl string // 随机抽中的url
28+ regexp * regexp.Regexp
2829}
2930
3031func ConnectUniversal (cli * client.QQClient ) {
@@ -60,6 +61,14 @@ func ConnectUniversal(cli *client.QQClient) {
6061 SafeWebSocket : safeWs ,
6162 ServerGroup : & serverGroup ,
6263 wsUrl : serverUrl ,
64+ regexp : nil ,
65+ }
66+ if serverGroup .RegexFilter != "" {
67+ if regex , err := regexp .Compile (serverGroup .RegexFilter ); err != nil {
68+ log .Errorf ("failed to compile [%s], regex_filter: %s" , serverGroup .Name , serverGroup .RegexFilter )
69+ } else {
70+ WsServers [serverGroup .Name ].regexp = regex
71+ }
6372 }
6473 util .SafeGo (func () {
6574 for {
@@ -221,11 +230,6 @@ func handleApiFrame(cli *client.QQClient, req *onebot.Frame) *onebot.Frame {
221230func HandleEventFrame (cli * client.QQClient , eventFrame * onebot.Frame ) {
222231 eventFrame .Ok = true
223232 eventFrame .BotId = cli .Uin
224- eventBytes , err := eventFrame .Marshal ()
225- if err != nil {
226- log .Errorf ("event 序列化错误 %v" , err )
227- return
228- }
229233
230234 for _ , ws := range WsServers {
231235 if ws .EventFilter != nil && len (ws .EventFilter ) > 0 { // 有event filter
@@ -237,30 +241,31 @@ func HandleEventFrame(cli *client.QQClient, eventFrame *onebot.Frame) {
237241
238242 report := true // 是否上报event
239243
240- if ws .PrefixFilter != nil && len ( ws . PrefixFilter ) > 0 { // 有prefix filter
244+ if ws .regexp != nil { // 有prefix filter
241245 if e , ok := eventFrame .Data .(* onebot.Frame_PrivateMessageEvent ); ok {
242- reportMessage := false
243- for _ , prefix := range ws .PrefixFilter {
244- if strings .HasPrefix (e .PrivateMessageEvent .RawMessage , prefix ) {
245- reportMessage = true
246- break
247- }
246+ b := ws .regexp .Find ([]byte (e .PrivateMessageEvent .RawMessage ))
247+ if b == nil {
248+ report = false
249+ } else {
250+ e .PrivateMessageEvent .RawMessage = string (b )
248251 }
249- report = report && reportMessage
250252 }
251253 if e , ok := eventFrame .Data .(* onebot.Frame_GroupMessageEvent ); ok {
252- reportMessage := false
253- for _ , prefix := range ws .PrefixFilter {
254- if strings .HasPrefix (e .GroupMessageEvent .RawMessage , prefix ) {
255- reportMessage = true
256- break
257- }
254+ b := ws .regexp .Find ([]byte (e .GroupMessageEvent .RawMessage ))
255+ if b == nil {
256+ report = false
257+ } else {
258+ e .GroupMessageEvent .RawMessage = string (b )
258259 }
259- report = report && reportMessage
260260 }
261261 }
262262
263263 if report {
264+ eventBytes , err := eventFrame .Marshal ()
265+ if err != nil {
266+ log .Errorf ("event 序列化错误 %v" , err )
267+ return
268+ }
264269 log .Debugf ("上报 event 给 [%s](%s)" , ws .Name , ws .wsUrl )
265270 _ = ws .Send (websocket .BinaryMessage , eventBytes )
266271 }
0 commit comments