fix: resolve message sending failure when containing "\n" using webhook and custom channel (#111)
* 使用webhook和custom通道发送消息时如果内容中包含\n会推送失败的问题 * 消息查看页面增加markdown内容解析,访问链接页面增加GFM拓展解析 * 访问链接页面GFM footnote支持
This commit is contained in:
+5
-5
@@ -18,11 +18,11 @@ func SendCustomMessage(message *model.Message, user *model.User, channel_ *model
|
|||||||
return errors.New("自定义通道不能使用本服务地址")
|
return errors.New("自定义通道不能使用本服务地址")
|
||||||
}
|
}
|
||||||
template := channel_.Other
|
template := channel_.Other
|
||||||
template = strings.Replace(template, "$url", message.URL, -1)
|
template = common.Replace(template, "$url", message.URL, -1)
|
||||||
template = strings.Replace(template, "$to", message.To, -1)
|
template = common.Replace(template, "$to", message.To, -1)
|
||||||
template = strings.Replace(template, "$title", message.Title, -1)
|
template = common.Replace(template, "$title", message.Title, -1)
|
||||||
template = strings.Replace(template, "$description", message.Description, -1)
|
template = common.Replace(template, "$description", message.Description, -1)
|
||||||
template = strings.Replace(template, "$content", message.Content, -1)
|
template = common.Replace(template, "$content", message.Content, -1)
|
||||||
reqBody := []byte(template)
|
reqBody := []byte(template)
|
||||||
resp, err := http.Post(url, "application/json", bytes.NewReader(reqBody))
|
resp, err := http.Post(url, "application/json", bytes.NewReader(reqBody))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+13
-1
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/yuin/goldmark"
|
"github.com/yuin/goldmark"
|
||||||
|
"github.com/yuin/goldmark/extension"
|
||||||
"html/template"
|
"html/template"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
@@ -148,7 +149,13 @@ func Markdown2HTML(markdown string) (HTML string, err error) {
|
|||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
var buf bytes.Buffer
|
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 {
|
if err != nil {
|
||||||
return fmt.Sprintf("Markdown 渲染出错:%s", err.Error()), err
|
return fmt.Sprintf("Markdown 渲染出错:%s", err.Error()), err
|
||||||
}
|
}
|
||||||
@@ -159,3 +166,8 @@ func Markdown2HTML(markdown string) (HTML string, err error) {
|
|||||||
func GetTimestamp() int64 {
|
func GetTimestamp() int64 {
|
||||||
return time.Now().Unix()
|
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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ func TriggerWebhook(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
for key, value := range extractRule {
|
for key, value := range extractRule {
|
||||||
variableValue := gjson.Get(reqText, value).String()
|
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{}
|
constructRule := model.WebhookConstructRule{}
|
||||||
err = json.Unmarshal([]byte(webhook.ConstructRule), &constructRule)
|
err = json.Unmarshal([]byte(webhook.ConstructRule), &constructRule)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { API, openPage, showError, showSuccess, showWarning } from '../helpers';
|
|||||||
import { ITEMS_PER_PAGE } from '../constants';
|
import { ITEMS_PER_PAGE } from '../constants';
|
||||||
import { renderTimestamp } from '../helpers/render';
|
import { renderTimestamp } from '../helpers/render';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
import { marked } from 'marked';
|
||||||
|
|
||||||
function renderStatus(status) {
|
function renderStatus(status) {
|
||||||
switch (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.Content>
|
||||||
<Modal.Actions>
|
<Modal.Actions>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
Reference in New Issue
Block a user