feat(channels): 陌生人私聊正常聊天(跳概率门)+ 强制流控 6条/分与回合槽位 + 安静时段不再硬静默 + 受限车道边界行前置
- 陌生人私聊:不再走「值不值得回」的概率门,唯一闸门 = 每发送者 6 条/分滑窗 + 同会话 1 个在跑回合 - 被限流只登记不回,且留带 source 的可见告警(不静默) - 安静时段在回复侧只作信号(规则层不再静默),群聊取消夜间静默 - 锁定流控常量:FlowDirectDefault 加字面量钉桩测试(放大它 = 静默关流控,且会让额度循环跑百万轮)
This commit is contained in:
1 parent
c6f5c3fea0
commit
7ae4298871
10 files changed
+654
-118
No files matched your search
@@ -19,6 +19,11 @@ import (
|
||||
// (adapter.ConversationKey:platform+channelID+groupID/peerID),因此两个群绝不会
|
||||
// 相互挤占(design/12 §6 策略三/四,裁决 06.4.3)。
|
||||
func (b *Bridge) gateFor(a adapter.PlatformAdapter) *adapter.FlowGate {
|
||||
if a == nil {
|
||||
// 便捷路径(process 用平台名找适配器)在平台上未注册任何账号时给出 nil:
|
||||
// 没有账号就没有闸门,调用方按 nil 跳过(生产路径的 a 恒非 nil)。
|
||||
return nil
|
||||
}
|
||||
name := a.Name()
|
||||
b.gateMu.Lock()
|
||||
defer b.gateMu.Unlock()
|
||||
@@ -31,15 +36,21 @@ func (b *Bridge) gateFor(a adapter.PlatformAdapter) *adapter.FlowGate {
|
||||
}
|
||||
|
||||
// gateOptions 把适配器 Config 快照中的按账号流控限制解析进
|
||||
// FlowGate。键缺失(单账号环境变量适配器)时限制关闭,
|
||||
// FlowGate。群聊/总量/上限键缺失(单账号环境变量适配器)时限制关闭,
|
||||
// 既有渠道行为不变;键存在且值为 0 时采用保护性默认值
|
||||
// (每群每分钟 6 条、上限 50),负值则关闭限制——
|
||||
// 这是对 CHANNELS_JSON 账号的向后兼容约定(design/12 §6 实现要点)。
|
||||
//
|
||||
// **私聊(陌生人)限流例外:它不依赖任何配置键**(主人 2026-10-05 裁决③),
|
||||
// 恒定取保护性默认 FlowDirectDefault —— 原本没有任何配置的账号(如 qq-obv11)
|
||||
// 对陌生人私聊是完全敞口,而裁决要求「陌生人必须有流控」,所以这里不能
|
||||
// 因为「没配」而静默关掉。主人私聊在 onMessage 就被绕过本闸门,不受影响。
|
||||
func (b *Bridge) gateOptions(a adapter.PlatformAdapter) adapter.FlowGateOptions {
|
||||
opts := adapter.FlowGateOptions{
|
||||
Review: b.review,
|
||||
OnPruned: b.onRejected,
|
||||
Now: b.now,
|
||||
Review: b.review,
|
||||
OnPruned: b.onRejected,
|
||||
Now: b.now,
|
||||
DirectMsgPerMin: adapter.FlowDirectDefault,
|
||||
}
|
||||
cfg := a.Config()
|
||||
if grp, ok := cfgInt(cfg, "groupMsgPerMin"); ok {
|
||||
|
||||
Reference in new issue
Block a user