ソースを参照

fix: resolve message sending failure when containing "\n" using webhook and custom channel (#111)

* 使用webhook和custom通道发送消息时如果内容中包含\n会推送失败的问题

* 消息查看页面增加markdown内容解析,访问链接页面增加GFM拓展解析

* 访问链接页面GFM footnote支持
fghwett 11 ヶ月 前
コミット
ef7c2d0a9d
4 ファイル変更21 行追加8 行削除
  1. 5 5
      channel/custom.go
  2. 13 1
      common/utils.go
  3. 1 1
      controller/webhook.go
  4. 2 1
      web/src/components/MessagesTable.js

+ 5 - 5
channel/custom.go

@@ -18,11 +18,11 @@ func SendCustomMessage(message *model.Message, user *model.User, channel_ *model
 		return errors.New("自定义通道不能使用本服务地址")
 	}
 	template := channel_.Other
-	template = strings.Replace(template, "$url", message.URL, -1)
-	template = strings.Replace(template, "$to", message.To, -1)
-	template = strings.Replace(template, "$title", message.Title, -1)
-	template = strings.Replace(template, "$description", message.Description, -1)
-	template = strings.Replace(template, "$content", message.Content, -1)
+	template = common.Replace(template, "$url", message.URL, -1)
+	template = common.Replace(template, "$to", message.To, -1)
+	template = common.Replace(template, "$title", message.Title, -1)
+	template = common.Replace(template, "$description", message.Description, -1)
+	template = common.Replace(template, "$content", message.Content, -1)
 	reqBody := []byte(template)
 	resp, err := http.Post(url, "application/json", bytes.NewReader(reqBody))
 	if err != nil {

+ 13 - 1
common/utils.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"github.com/google/uuid"
 	"github.com/yuin/goldmark"
+	"github.com/yuin/goldmark/extension"
 	"html/template"
 	"log"
 	"net"
@@ -148,7 +149,13 @@ func Markdown2HTML(markdown string) (HTML string, err error) {
 		return "", nil
 	}
 	var buf bytes.Buffer
-	err = goldmark.Convert([]byte(markdown), &buf)
+	goldMarkEntity := goldmark.New(
+		goldmark.WithExtensions(
+			extension.GFM,
+			extension.Footnote,
+		),
+	)
+	err = goldMarkEntity.Convert([]byte(markdown), &buf)
 	if err != nil {
 		return fmt.Sprintf("Markdown 渲染出错:%s", err.Error()), err
 	}
@@ -159,3 +166,8 @@ func Markdown2HTML(markdown string) (HTML string, err error) {
 func GetTimestamp() int64 {
 	return time.Now().Unix()
 }
+
+func Replace(s, old, new string, n int) string {
+	new = strings.TrimPrefix(strings.TrimSuffix(fmt.Sprintf("%q", new), "\""), "\"")
+	return strings.Replace(s, old, new, n)
+}

+ 1 - 1
controller/webhook.go

@@ -240,7 +240,7 @@ func TriggerWebhook(c *gin.Context) {
 	}
 	for key, value := range extractRule {
 		variableValue := gjson.Get(reqText, value).String()
-		webhook.ConstructRule = strings.Replace(webhook.ConstructRule, "$"+key, variableValue, -1)
+		webhook.ConstructRule = common.Replace(webhook.ConstructRule, "$"+key, variableValue, -1)
 	}
 	constructRule := model.WebhookConstructRule{}
 	err = json.Unmarshal([]byte(webhook.ConstructRule), &constructRule)

+ 2 - 1
web/src/components/MessagesTable.js

@@ -5,6 +5,7 @@ import { API, openPage, showError, showSuccess, showWarning } from '../helpers';
 import { ITEMS_PER_PAGE } from '../constants';
 import { renderTimestamp } from '../helpers/render';
 import { Link } from 'react-router-dom';
+import { marked } from 'marked';
 
 function renderStatus(status) {
   switch (status) {
@@ -416,7 +417,7 @@ const MessagesTable = () => {
           ) : (
             ''
           )}
-          {message.content ? <p>{message.content}</p> : ''}
+          {message.content ? <div dangerouslySetInnerHTML={{ __html: marked.parse(message.content) }}></div> : ''}
         </Modal.Content>
         <Modal.Actions>
           <Button