Skip to content

规避因错误导致的大量重复消息#575

Merged
2-2-3-trimethylpentane merged 1 commit into
InkCanvasForClass:net6from
chenjei2011:feature/notification-dedup
Jul 4, 2026
Merged

规避因错误导致的大量重复消息#575
2-2-3-trimethylpentane merged 1 commit into
InkCanvasForClass:net6from
chenjei2011:feature/notification-dedup

Conversation

@chenjei2011

Copy link
Copy Markdown
Contributor

场景:教学课堂环境,插件可能因异常(如死循环、网络重连)高频推送相同通知。
策略:采用滑动窗口去重(2秒内)。若同一来源的相同标题持续出现,每次出现都刷新窗口起点,使通知彻底沉默,直到插件停止刷屏 2 秒以上。
效果:杜绝课堂被反复弹窗干扰,同时不影响正常间隔(> 2秒)的有效通知。

ps. 在代码中也留了个同样的描述方便理解,觉得不需要可以删

@doudou0720 doudou0720 requested review from CJKmkp and PrefacedCorg July 4, 2026 08:52
@2-2-3-trimethylpentane 2-2-3-trimethylpentane merged commit 0f0cc91 into InkCanvasForClass:net6 Jul 4, 2026
3 checks passed
@PrefacedCorg

PrefacedCorg commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator

感谢 PR!

注:以下内容由AI生成
思路很对,放在 NotificationCenterService 这一层做去重,能从源头压住所有插件刷屏的场景,滑动窗口的刷新逻辑也写得正确。我这边整体 LGTM,有几个小建议供参考,不影响合并:

命名

  • JudgeRepeatMessageStruct 是动词打头,结构体名一般表「是什么」。建议改成 LastMessageInfo 或 MessageDeduplicationKey 之类。
  • 字段 JudgeRepeatMessage 读起来像方法名,建议 LastMessage / _lastMessage。
  • 局部变量 TotalSeconds 首字母大写不符合 C# 惯例,建议 totalSeconds。
  • if(...) 缺空格,和项目里 if (...) 风格不一致。

魔数 TotalSeconds <= 2 里的 2 建议提常量,比如 DeduplicationWindowSeconds = 2,方便后续调参。

可变结构体 JudgeRepeatMessageStruct 用了 { get; set; } 可变属性,属于 mutable struct,在 C# 里容易因值拷贝踩坑。这里因为只有一个实例、都在 lock 内访问,问题不大,但规范起见建议改成 class,或改成只读 struct + 构造函数。

逻辑可抽方法 去重判断那段建议抽成一个 IsDuplicate(NotificationMessage),可读性更好,也方便补单测。

空标题 当前 message.Title 为空时既不去重也不更新 LastMessage,看起来是合理的(空标题消息原样入队),但建议补一行注释说明这是有意为之,免得后人疑惑。

再次感谢贡献,课堂场景下这个修复很必要 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants