mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-18 20:50:12 +08:00
101 lines
2.9 KiB
Go
101 lines
2.9 KiB
Go
package rsshub
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
|
||
"github.com/FloatTech/floatbox/binary"
|
||
"github.com/FloatTech/zbputils/img/text"
|
||
"github.com/sirupsen/logrus"
|
||
zero "github.com/wdvxdr1123/ZeroBot"
|
||
"github.com/wdvxdr1123/ZeroBot/message"
|
||
|
||
"github.com/FloatTech/ZeroBot-Plugin/plugin/rsshub/domain"
|
||
)
|
||
|
||
const (
|
||
rssHubPushErrMsg = "RssHub推送错误"
|
||
)
|
||
|
||
// formatRssViewToMessagesSlice 格式化RssClientView为消息切片
|
||
func formatRssViewToMessagesSlice(view *domain.RssClientView) ([]message.Message, error) {
|
||
// 取前20条
|
||
cts := view.Contents
|
||
if len(cts) > 20 {
|
||
cts = cts[:20]
|
||
}
|
||
// 2n+1条消息
|
||
fv := make([]message.Message, len(cts)*2+1)
|
||
// 订阅源头图
|
||
toastPic, err := text.RenderToBase64(fmt.Sprintf("%s\n\n\n%s\n\n\n更新时间:%v\n\n\n",
|
||
view.Source.Title, view.Source.Link, view.Source.UpdatedParsed.Local().Format(time.DateTime)),
|
||
text.SakuraFontFile, 1200, 40)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
fv[0] = message.Message{message.Image("base64://" + binary.BytesToString(toastPic))}
|
||
// 元素信息
|
||
for idx, item := range cts {
|
||
contentStr := fmt.Sprintf("%s\n\n\n", item.Title)
|
||
// Date为空时不显示
|
||
if !item.Date.IsZero() {
|
||
contentStr += fmt.Sprintf("更新时间:\n%v\n", item.Date.Local().Format(time.DateTime))
|
||
}
|
||
var content []byte
|
||
content, err = text.RenderToBase64(contentStr, text.SakuraFontFile, 1200, 40)
|
||
if err != nil {
|
||
logrus.WithError(err).Error("RssHub订阅姬渲染图片失败")
|
||
continue
|
||
}
|
||
itemMessagePic := message.Message{message.Image("base64://" + binary.BytesToString(content))}
|
||
fv[2*idx+1] = itemMessagePic
|
||
fv[2*idx+2] = message.Message{message.Text(item.Link)}
|
||
}
|
||
return fv, nil
|
||
}
|
||
|
||
// newRssSourcesMsg Rss订阅源列表
|
||
func newRssSourcesMsg(ctx *zero.Ctx, view []*domain.RssClientView) (message.Message, error) {
|
||
var msgSlice []message.Message
|
||
// 生成消息
|
||
for _, v := range view {
|
||
if v == nil {
|
||
continue
|
||
}
|
||
item, err := formatRssViewToMessagesSlice(v)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
msgSlice = append(msgSlice, item...)
|
||
}
|
||
// 伪造一个发送者为RssHub订阅姬的消息节点
|
||
msg := make(message.Message, len(msgSlice))
|
||
for i, item := range msgSlice {
|
||
msg[i] = fakeSenderForwardNode(ctx.Event.SelfID, item...)
|
||
}
|
||
return msg, nil
|
||
}
|
||
|
||
// newRssDetailsMsg Rss订阅源详情(包含文章信息列表)
|
||
func newRssDetailsMsg(ctx *zero.Ctx, view *domain.RssClientView) (message.Message, error) {
|
||
// 生成消息
|
||
msgSlice, err := formatRssViewToMessagesSlice(view)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
// 伪造一个发送者为RssHub订阅姬的消息节点
|
||
msg := make(message.Message, len(msgSlice))
|
||
for i, item := range msgSlice {
|
||
msg[i] = fakeSenderForwardNode(ctx.Event.SelfID, item...)
|
||
}
|
||
return msg, nil
|
||
}
|
||
|
||
// fakeSenderForwardNode 伪造一个发送者为RssHub订阅姬的消息节点
|
||
func fakeSenderForwardNode(userID int64, msgs ...message.Segment) message.Segment {
|
||
return message.CustomNode(
|
||
"RssHub订阅姬",
|
||
userID,
|
||
msgs)
|
||
}
|