fix: blocklist提前到消息处理最前端 — 拦截消息不浪费任何资源
- 移到 logging/enrichment/routing 之前 - 被拦截消息只记一条 [blocked] 日志,不调ai-core - 时间戳/群名/昵称等富化处理不再对blocked消息执行 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -71,7 +71,32 @@ func main() {
|
||||
|
||||
// Set message handler with logging.
|
||||
router.SetMessageHandler(func(msg *bridge.UnifiedMessage) (*bridge.UnifiedResponse, error) {
|
||||
// Log incoming.
|
||||
// Routing decisions.
|
||||
isAdmin := mapper.IsAdmin(msg.Platform, msg.OriginalSenderUID)
|
||||
|
||||
// Blocklist check — MUST run first, before logging/enrichment,
|
||||
// to avoid wasting resources on blocked users/groups.
|
||||
if blocked := blocklistStore.IsBlocked(msg.ChannelType, msg.ChannelID, msg.OriginalSenderUID, isAdmin); blocked {
|
||||
msgLogger.Log(logging.LogEntry{
|
||||
Timestamp: time.Now(),
|
||||
Direction: "incoming",
|
||||
Platform: msg.Platform,
|
||||
ChannelID: msg.ChannelID,
|
||||
SenderID: msg.OriginalSenderUID,
|
||||
SenderName: msg.OriginalSenderName,
|
||||
GroupName: msg.GroupName,
|
||||
Content: "[blocked]",
|
||||
Success: true,
|
||||
})
|
||||
return &bridge.UnifiedResponse{
|
||||
Messages: []bridge.ResponseMessage{
|
||||
{DisplayType: "silent", Content: "", FormatMode: "plain"},
|
||||
},
|
||||
Platform: msg.Platform,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Log incoming (only non-blocked messages).
|
||||
msgLogger.Log(logging.LogEntry{
|
||||
Timestamp: time.Now(),
|
||||
Direction: "incoming",
|
||||
@@ -85,9 +110,6 @@ func main() {
|
||||
MessageID: msg.MessageID,
|
||||
Success: true,
|
||||
})
|
||||
|
||||
// Routing decisions.
|
||||
isAdmin := mapper.IsAdmin(msg.Platform, msg.OriginalSenderUID)
|
||||
adminNick := cfg.AdminNickname
|
||||
if isAdmin {
|
||||
if id := mapper.ResolveOrNil(msg.Platform, msg.OriginalSenderUID); id != nil && id.Nickname != "" {
|
||||
@@ -138,25 +160,6 @@ func main() {
|
||||
msg.Content = fmt.Sprintf("【私聊 %s】%s/%s (%s):\n%s", msg.Platform, adminNick, msg.OriginalSenderName, msg.OriginalSenderUID, msg.Content)
|
||||
}
|
||||
|
||||
// Blocklist/whitelist check (admin always bypasses).
|
||||
if blocked := blocklistStore.IsBlocked(msg.ChannelType, msg.ChannelID, msg.OriginalSenderUID, isAdmin); blocked {
|
||||
msgLogger.Log(logging.LogEntry{
|
||||
Timestamp: time.Now(),
|
||||
Direction: "outgoing",
|
||||
Platform: msg.Platform,
|
||||
ChannelID: msg.ChannelID,
|
||||
SenderID: msg.OriginalSenderUID,
|
||||
SenderName: "Cyrene",
|
||||
Content: "[blocked]",
|
||||
Success: true,
|
||||
})
|
||||
return &bridge.UnifiedResponse{
|
||||
Messages: []bridge.ResponseMessage{
|
||||
{DisplayType: "silent", Content: "", FormatMode: "plain"},
|
||||
},
|
||||
Platform: msg.Platform,
|
||||
}, nil
|
||||
}
|
||||
|
||||
var response *bridge.UnifiedResponse
|
||||
var routeErr error
|
||||
|
||||
Reference in New Issue
Block a user