forked from indes/flowerss-bot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
service.go
105 lines (94 loc) · 2.72 KB
/
service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package bot
import (
"fmt"
"strings"
"go.uber.org/zap"
tb "gopkg.in/telebot.v3"
"github.com/nerdneilsfield/flowerss-bot/internal/config"
"github.com/nerdneilsfield/flowerss-bot/internal/model"
)
// SendError send error user
func SendError(c *tb.Chat) {
_, _ = B.Send(c, "请输入正确的指令!")
}
// BroadcastNews send new contents message to subscriber
func BroadcastNews(source *model.Source, subs []*model.Subscribe, contents []*model.Content) {
zap.S().Infow(
"broadcast news",
"fetcher id", source.ID,
"fetcher title", source.Title,
"subscriber count", len(subs),
"new contents", len(contents),
)
for _, content := range contents {
previewText := trimDescription(content.Description, config.PreviewText)
for _, sub := range subs {
tpldata := &config.TplData{
SourceTitle: source.Title,
ContentTitle: content.Title,
RawLink: content.RawLink,
PreviewText: previewText,
TelegraphURL: content.TelegraphURL,
Tags: sub.Tag,
EnableTelegraph: sub.EnableTelegraph == 1 && content.TelegraphURL != "",
}
u := &tb.User{
ID: sub.UserID,
}
o := &tb.SendOptions{
DisableWebPagePreview: config.DisableWebPagePreview,
ParseMode: config.MessageMode,
DisableNotification: sub.EnableNotification != 1,
}
msg, err := tpldata.Render(config.MessageMode)
if err != nil {
zap.S().Errorw(
"broadcast news error, tpldata.Render err",
"error", err.Error(),
)
return
}
if _, err := B.Send(u, msg, o); err != nil {
if strings.Contains(err.Error(), "Forbidden") {
zap.S().Errorw(
"broadcast news error, bot stopped by user",
"error", err.Error(),
"user id", sub.UserID,
"source id", sub.SourceID,
"title", source.Title,
"link", source.Link,
)
sub.Unsub()
}
/*
Telegram return error if markdown message has incomplete format.
Print the msg to warn the user
api error: Bad Request: can't parse entities: Can't find end of the entity starting at byte offset 894
*/
if strings.Contains(err.Error(), "parse entities") {
zap.S().Errorw(
"broadcast news error, markdown error",
"markdown msg", msg,
"error", err.Error(),
)
}
}
}
}
}
// BroadcastSourceError send fetcher updata error message to subscribers
func BroadcastSourceError(source *model.Source) {
subs := model.GetSubscriberBySource(source)
var u tb.User
for _, sub := range subs {
message := fmt.Sprintf(
"[%s](%s) 已经累计连续%d次更新失败,暂时停止更新", source.Title, source.Link, config.ErrorThreshold,
)
u.ID = sub.UserID
_, _ = B.Send(
&u, message, &tb.SendOptions{
ParseMode: tb.ModeMarkdown,
},
)
}
}