44 "math/rand"
55 "net/http"
66 "strconv"
7+ "strings"
78 "time"
89
910 "github.com/Mrs4s/MiraiGo/client"
@@ -17,9 +18,15 @@ import (
1718)
1819
1920var (
20- WsServers = make (map [string ]* safe_ws. SafeWebSocket ) // TODO 线程安全?改用sync.map
21+ WsServers = make (map [string ]* WsServer ) // TODO 线程安全?改用sync.map
2122)
2223
24+ type WsServer struct {
25+ * safe_ws.SafeWebSocket // 线程安全的ws
26+ * config.ServerGroup // 服务器组配置
27+ wsUrl string // 随机抽中的url
28+ }
29+
2330func ConnectUniversal (cli * client.QQClient ) {
2431 header := http.Header {
2532 "X-Client-Role" : []string {"Universal" },
@@ -49,7 +56,11 @@ func ConnectUniversal(cli *client.QQClient) {
4956 }()
5057 closeChan <- 1
5158 })
52- WsServers [serverGroup .Name ] = safeWs
59+ WsServers [serverGroup .Name ] = & WsServer {
60+ SafeWebSocket : safeWs ,
61+ ServerGroup : & serverGroup ,
62+ wsUrl : serverUrl ,
63+ }
5364 util .SafeGo (func () {
5465 for {
5566 if err := safeWs .Send (websocket .PingMessage , []byte ("ping" )); err != nil {
@@ -216,8 +227,51 @@ func HandleEventFrame(cli *client.QQClient, eventFrame *onebot.Frame) {
216227 return
217228 }
218229
219- for name , ws := range WsServers {
220- log .Debugf ("上报 event 给 [%s]" , name )
221- _ = ws .Send (websocket .BinaryMessage , eventBytes )
230+ for _ , ws := range WsServers {
231+ if ws .EventFilter != nil && len (ws .EventFilter ) > 0 { // 有event filter
232+ if ! int32SliceContains (ws .EventFilter , int32 (eventFrame .FrameType )) {
233+ log .Debugf ("EventFilter 跳过 [%s](%s)" , ws .Name , ws .wsUrl )
234+ continue
235+ }
236+ }
237+
238+ report := true // 是否上报event
239+
240+ if ws .PrefixFilter != nil && len (ws .PrefixFilter ) > 0 { // 有prefix filter
241+ 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+ }
248+ }
249+ report = report && reportMessage
250+ }
251+ 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+ }
258+ }
259+ report = report && reportMessage
260+ }
261+ }
262+
263+ if report {
264+ log .Debugf ("上报 event 给 [%s](%s)" , ws .Name , ws .wsUrl )
265+ _ = ws .Send (websocket .BinaryMessage , eventBytes )
266+ }
267+ }
268+ }
269+
270+ func int32SliceContains (numbers []int32 , num int32 ) bool {
271+ for _ , number := range numbers {
272+ if number == num {
273+ return true
274+ }
222275 }
276+ return false
223277}
0 commit comments