ryan
3251831118
feat(钉钉通知): 增强标题生成逻辑以优先使用内容首行
...
Changes:
* 新增 dingtalkTitle 函数,优先使用内容的第一行作为标题,若内容为空则回退到默认标题
* 更新 Send 方法以使用新的标题生成逻辑
* 添加单元测试以验证标题生成的正确性
2026-08-28 10:30:52 +08:00
ryan
219a850d93
fix(钉钉通知): 修复 Markdown 消息换行被折叠导致排版错乱的问题
...
Motivation:
钉钉 Markdown 渲染时会将单个换行符折叠为空格,导致推送的通知内容被压缩成一行,严重影响消息可读性。
Changes:
* 发送前将消息正文中的单个换行统一转换为段落分隔(\n\n),确保模板换行在钉钉中正确渲染
* 归一化 \r\n 与 \r 换行,并合并已有连续换行,避免产生多余空行
* 新增换行转换逻辑的单元测试
2026-08-27 16:58:41 +08:00
ryan
c7e154d7cc
feat(钉钉通道): 支持仅使用 access_token 配置钉钉机器人
...
Motivation:
钉钉机器人的 webhook 前缀固定不变,要求用户填写完整 URL 冗余且容易出错。简化通道配置项,降低接入配置成本,同时保证存量配置不受影响。
Changes:
* 钉钉通道配置改用 access_token,webhook 前缀由内部固定拼接
* 保留对旧 webhook_url 配置的兼容,access_token 存在时优先生效
* 新增 webhook 地址解析逻辑的单元测试,覆盖优先级与回退场景
* 同步更新 README、HTTP 请求示例及设计文档中的配置示例
* E2E 测试改用 E2E_DINGTALK_ACCESS_TOKEN 环境变量并按新格式创建通道
2026-08-19 15:14:38 +08:00
ryan
14504af950
feat(通知): SafeW 只发正文并注入推送时间
...
去掉渠道标题前缀,模板可用 pushedAt 显示本地推送时间。
2026-08-16 01:18:27 +08:00
ryan
a9b6234208
feat(通知模板): 支持 case 取值映射与事件名匹配渲染
...
Motivation:
让通知模板能够将 action、event 等原始枚举值映射为可读中文文案,并支持按事件名后缀匹配;同时简化 SafeW 消息发送格式,避免 Markdown 转义引入的显示问题。
Changes:
* 新增 `case` 模板函数,按值匹配 key/文案并支持末尾奇数参数作为默认值
* `case` 匹配兼容事件名后缀(如 trade.close 匹配 .close)
* `line` 前缀自动去除末尾冒号,避免重复冒号
* 模板渲染前自动注入 event 字段,便于模板按事件名取值
* SafeW 消息改为纯文本发送,移除 MarkdownV2 转义
2026-08-16 00:45:27 +08:00
ryan
0210b70bda
perf(日志): 空轮询时不输出 Info 日志以减少噪音
...
Motivation:
轮询安全网关更新时,绝大多数周期没有新消息,持续输出 Info 日志会产生大量噪音并带来不必要的开销。仅在确有更新时才记录日志,便于聚焦真实事件。
Changes:
* 仅在存在更新时输出 getUpdates 日志
* 仅在拉取到群聊数据时输出 poll 日志
2026-08-15 18:19:41 +08:00
ryan
a07963e150
feat: enhance Safew chat handling and testing
...
- Updated `GroupsFromUpdates` function to return the number of updates processed, improving the polling mechanism.
- Added a new test `TestGroupsFromUpdatesCallbackAndJoinRequest` to validate handling of callback queries and join requests.
- Introduced `safewAllowedUpdates` to specify allowed update types in the polling request, enhancing chat management.
- Implemented `ensureWebhookCleared` method to manage webhook state before polling, improving reliability.
2026-08-15 01:56:12 +08:00
ryan
e369f398d8
feat: enhance Safew error handling and polling mechanism
...
- Added error_msg field to safewAPIResponse for better error descriptions.
- Updated safewErrorDescription function to include error_msg in the output.
- Introduced a new test to verify that error messages are included in Safew error descriptions.
- Improved the polling mechanism in the Watcher to handle conflicts and ensure no overlapping polls occur.
2026-08-15 01:07:01 +08:00
ryan
bd8a9ff96d
feat: 增加 SafeW 已监控群列表接口
...
通过 getUpdates 将群写入 Redis,供创建/编辑渠道时选择 chat_id,避免前端重复传递 token。
2026-08-15 00:40:40 +08:00
ryan
0d0cd0c510
feat: 新增 SafeW 出站通知渠道
...
通过 Bot API sendMessage 投递渲染后的通知,MarkdownV2 自动转义标题与正文。
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-14 00:58:44 +08:00
ryan
39f3774940
feat: 配置列表分页与钉钉机器人分钟级排队限流
...
统一 sources/templates/channels/rules 列表为分页响应,避免配置增多时全量返回;按钉钉 access_token 限制每分钟发送并在超限时等待下一分钟,降低触发官方封禁风险。
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-10 00:34:26 +08:00
ryan
cecf8e72f5
fix(邮件发送): 适配 MailerSend SMTP 并迁移基础设施至 1Panel
...
Motivation:
将通知服务部署到 1Panel 生产环境,集成 MailerSend 邮件服务,修复 SMTP 协议中 MAIL FROM 命令因携带显示名而导致的发送失败问题。
Changes:
* 修复 SMTP MAIL FROM 命令传入带显示名的完整地址导致发送失败的问题,新增 extractEmailAddr 提取裸地址
* 更新 SMTP 配置为 MailerSend 真实凭证,From 地址适配其域名验证要求
* 移除 docker-compose 中内置的 MySQL/Redis 服务,改为依赖外部 1Panel 基础设施
* 更新环境变量为生产环境实际凭据
2026-07-31 17:28:35 +08:00
ryan
49b2384cf7
feat: email adapter with SMTP TLS support
2026-06-27 13:17:32 +08:00
ryan
414c8c7cbf
feat: channel adapters — dingtalk, wecom, bark
2026-06-27 13:15:57 +08:00