feat(钉钉通知): 增强标题生成逻辑以优先使用内容首行

Changes:
* 新增 dingtalkTitle 函数,优先使用内容的第一行作为标题,若内容为空则回退到默认标题
* 更新 Send 方法以使用新的标题生成逻辑
* 添加单元测试以验证标题生成的正确性
This commit is contained in:
2026-08-28 10:30:52 +08:00
parent 219a850d93
commit 3251831118
2 changed files with 33 additions and 2 deletions
+18 -1
View File
@@ -69,7 +69,7 @@ func (s *DingTalkSender) Send(title, content string, config json.RawMessage) err
msg := dingtalkMessage{ msg := dingtalkMessage{
MsgType: "markdown", MsgType: "markdown",
Markdown: &dingtalkMD{ Markdown: &dingtalkMD{
Title: title, Title: dingtalkTitle(title, content),
Text: dingtalkMarkdownText(content), Text: dingtalkMarkdownText(content),
}, },
} }
@@ -87,6 +87,23 @@ func (s *DingTalkSender) Send(title, content string, config json.RawMessage) err
return nil return nil
} }
// dingtalkTitle is the markdown.Title shown on DingTalk PC as the card header
// and in the session-list preview. Prefer the first content line (e.g. 空单开仓)
// over the internal "source: event" title.
func dingtalkTitle(fallback, content string) string {
content = strings.ReplaceAll(content, "\r\n", "\n")
content = strings.ReplaceAll(content, "\r", "\n")
line, _, _ := strings.Cut(content, "\n")
line = strings.TrimSpace(line)
if line != "" {
return line
}
if strings.TrimSpace(fallback) != "" {
return fallback
}
return "通知"
}
// dingtalkMarkdownText turns template newlines into DingTalk markdown paragraph // dingtalkMarkdownText turns template newlines into DingTalk markdown paragraph
// breaks. A single \n is collapsed to a space by DingTalk markdown, so each // breaks. A single \n is collapsed to a space by DingTalk markdown, so each
// logical line must be separated by \n\n. // logical line must be separated by \n\n.
+14
View File
@@ -2,6 +2,20 @@ package adapter
import "testing" import "testing"
func TestDingTalkTitleUsesFirstContentLine(t *testing.T) {
got := dingtalkTitle("trade-signal: trade", "空单开仓\n交易品种: ETHUSDT")
if got != "空单开仓" {
t.Fatalf("got %q", got)
}
}
func TestDingTalkTitleFallsBackWhenContentEmpty(t *testing.T) {
got := dingtalkTitle("trade-signal: trade", " \n")
if got != "trade-signal: trade" {
t.Fatalf("got %q", got)
}
}
func TestDingTalkMarkdownTextDoublesNewlines(t *testing.T) { func TestDingTalkMarkdownTextDoublesNewlines(t *testing.T) {
in := "空单开仓\n交易品种: ETHUSDT\n开仓价格: 2542.33\n\n推送时间: 2026.08.27 16:30:12" in := "空单开仓\n交易品种: ETHUSDT\n开仓价格: 2542.33\n\n推送时间: 2026.08.27 16:30:12"
got := dingtalkMarkdownText(in) got := dingtalkMarkdownText(in)