Skip to content

Commit 11bbcec

Browse files
committed
prefix filter, event filter
1 parent 5c510b0 commit 11bbcec

File tree

2 files changed

+71
-9
lines changed

2 files changed

+71
-9
lines changed

config/config.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ var (
1111
SMS: false,
1212
Port: "9000",
1313
ServerGroups: []*ServerGroup{
14-
{Name: "default", Disabled: false, Urls: []string{"ws://localhost:8081/ws/cq/"}},
14+
{
15+
Name: "default",
16+
Disabled: false,
17+
Urls: []string{"ws://localhost:8081/ws/cq/"},
18+
EventFilter: []int32{},
19+
PrefixFilter: []string{},
20+
},
1521
},
1622
}
1723
)
@@ -23,9 +29,11 @@ type GmcConfig struct {
2329
}
2430

2531
type ServerGroup struct {
26-
Name string `json:"name"` // 功能名称
27-
Disabled bool `json:"disabled"` // 不填false默认启用
28-
Urls []string `json:"urls"` // 服务器列表
32+
Name string `json:"name"` // 功能名称
33+
Disabled bool `json:"disabled"` // 不填false默认启用
34+
Urls []string `json:"urls"` // 服务器列表
35+
EventFilter []int32 `json:"event_filter"` // 事件过滤
36+
PrefixFilter []string `json:"prefix_filter"` // 前缀过滤
2937
// TODO event filter, msg filter, regex filter, prefix filter, suffix filter
3038
}
3139

service/bot/remote.go

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
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

1920
var (
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+
2330
func 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

Comments
 (0)