refactor: 更新 RSS 订阅功能,调整 TestRss 函数以异步检查新 RSS,修改 SubscribeToFeed 函数返回值以包含订阅标题,增强代码可读性和功能性

This commit is contained in:
lixiangwuxian 2025-07-17 14:33:46 +08:00
parent aa52fb16d1
commit 791f411596

View File

@ -22,24 +22,12 @@ func init() {
handler.RegisterAtHandler("我的订阅", MySubscribed, constants.LEVEL_USER) handler.RegisterAtHandler("我的订阅", MySubscribed, constants.LEVEL_USER)
handler.RegisterAtHandler("退订", Unsubscribe, constants.LEVEL_USER) handler.RegisterAtHandler("退订", Unsubscribe, constants.LEVEL_USER)
//test //test
handler.RegisterHandler("test_rss", TestRss, constants.LEVEL_USER) handler.RegisterHandler("test_rss", TestRss, constants.LEVEL_ADMIN)
} }
func TestRss(msg model.Message) (reply *model.Reply) { func TestRss(msg model.Message) (reply *model.Reply) {
rssUrl := util.SplitN(msg.StructuredMsg[0].(*qq_message.TextMessage).Data.Text, 2)[1] go CheckNewRss()
title, items, err := ParseFeed(rssUrl) return nil
if err != nil {
return &model.Reply{
ReplyMsg: "解析RSS源失败: " + err.Error(),
ReferOriginMsg: true,
FromMsg: msg,
}
}
return &model.Reply{
ReplyMsg: fmt.Sprintf("解析RSS源成功: %s\n%d 个条目\n%v", title, len(items), items[0]),
ReferOriginMsg: true,
FromMsg: msg,
}
} }
func Subscribe(msg model.Message) (reply *model.Reply) { func Subscribe(msg model.Message) (reply *model.Reply) {
@ -51,8 +39,8 @@ func Subscribe(msg model.Message) (reply *model.Reply) {
urls := regexp.MustCompile(`(?i)(?:https?://)?(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(?:/[^\s]*)?\.xml\b`).FindAllString(data.(*qq_message.TextMessage).Data.Text, -1) urls := regexp.MustCompile(`(?i)(?:https?://)?(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(?:/[^\s]*)?\.xml\b`).FindAllString(data.(*qq_message.TextMessage).Data.Text, -1)
if len(urls) > 0 { if len(urls) > 0 {
for _, url := range urls { for _, url := range urls {
if err := SubscribeToFeed(url, msg.UserId, msg.GroupInfo.GroupId); err == nil { if title, err := SubscribeToFeed(url, msg.UserId, msg.GroupInfo.GroupId); err == nil {
subscribedFeeds = append(subscribedFeeds, url) subscribedFeeds = append(subscribedFeeds, title)
} }
} }
} }
@ -61,7 +49,7 @@ func Subscribe(msg model.Message) (reply *model.Reply) {
if len(subscribedFeeds) > 0 { if len(subscribedFeeds) > 0 {
return &model.Reply{ return &model.Reply{
ReplyMsg: fmt.Sprintf("成功订阅 %d 个RSS源", len(subscribedFeeds)), ReplyMsg: fmt.Sprintf("成功订阅 %d 个RSS源:%s", len(subscribedFeeds), strings.Join(subscribedFeeds, "\n")),
ReferOriginMsg: true, ReferOriginMsg: true,
FromMsg: msg, FromMsg: msg,
} }
@ -75,7 +63,7 @@ func Subscribe(msg model.Message) (reply *model.Reply) {
} }
// SubscribeToFeed 订阅RSS源 // SubscribeToFeed 订阅RSS源
func SubscribeToFeed(feedURL string, userID int64, groupID int64) error { func SubscribeToFeed(feedURL string, userID int64, groupID int64) (string, error) {
db := sqlite3.GetGormDB().Begin() db := sqlite3.GetGormDB().Begin()
defer db.Rollback() defer db.Rollback()
@ -87,7 +75,7 @@ func SubscribeToFeed(feedURL string, userID int64, groupID int64) error {
//检测rss源是否有效 //检测rss源是否有效
if err := CheckRssFeed(feedURL); err != nil { if err := CheckRssFeed(feedURL); err != nil {
return fmt.Errorf("RSS源无效: %v", err) return "", fmt.Errorf("RSS源无效: %v", err)
} }
// 检查RSS源是否已存在 // 检查RSS源是否已存在
@ -103,7 +91,7 @@ func SubscribeToFeed(feedURL string, userID int64, groupID int64) error {
LastUpdate: time.Now(), LastUpdate: time.Now(),
} }
if err := db.Create(&newFeed).Error; err != nil { if err := db.Create(&newFeed).Error; err != nil {
return fmt.Errorf("创建RSS源失败: %v", err) return "", fmt.Errorf("创建RSS源失败: %v", err)
} }
feedID = newFeed.ID feedID = newFeed.ID
} else { } else {
@ -114,13 +102,13 @@ func SubscribeToFeed(feedURL string, userID int64, groupID int64) error {
var existingSubscribe RssSubscribe var existingSubscribe RssSubscribe
result = db.Where("feed_id = ? AND group_id = ?", feedID, groupID).First(&existingSubscribe) result = db.Where("feed_id = ? AND group_id = ?", feedID, groupID).First(&existingSubscribe)
if result.Error == nil { if result.Error == nil {
return fmt.Errorf("该群已订阅过此RSS源") return "", fmt.Errorf("该群已订阅过此RSS源")
} }
//获取最新文章hash //获取最新文章hash
_, items, err := ParseFeed(feedURL) title, items, err := ParseFeed(feedURL)
if err != nil { if err != nil {
return err return "", err
} }
// 创建订阅关系 // 创建订阅关系
@ -130,9 +118,9 @@ func SubscribeToFeed(feedURL string, userID int64, groupID int64) error {
LastItemHash: items[0].Hash, LastItemHash: items[0].Hash,
} }
if err := db.Create(&newSubscribe).Error; err != nil { if err := db.Create(&newSubscribe).Error; err != nil {
return fmt.Errorf("创建订阅关系失败: %v", err) return "", fmt.Errorf("创建订阅关系失败: %v", err)
} }
return db.Commit().Error return title, db.Commit().Error
} }
func MySubscribed(msg model.Message) (reply *model.Reply) { func MySubscribed(msg model.Message) (reply *model.Reply) {