87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"time"
 | |
| 
 | |
| 	"git.nefrace.ru/nefrace/nechotron"
 | |
| 	"git.nefrace.ru/nefrace/tongo"
 | |
| 	"github.com/NicoNex/echotron/v3"
 | |
| 	"github.com/mmcdole/gofeed"
 | |
| )
 | |
| 
 | |
| var text_template = `
 | |
| [*%s*](%s)
 | |
| _%s_
 | |
| 
 | |
| %s
 | |
| `
 | |
| 
 | |
| func RSSTask(api *echotron.API) {
 | |
| 	for {
 | |
| 		ParseRSS(api)
 | |
| 		time.Sleep(5 * time.Minute)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ParseRSS(api *echotron.API) {
 | |
| 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | |
| 	defer cancel()
 | |
| 	feedChats := tongo.NewStore[FeedChat](db)
 | |
| 	feeds := tongo.NewStore[Feeds](db)
 | |
| 	lastFeed, err := feeds.GetOne(ctx)
 | |
| 	if err != nil || lastFeed == nil {
 | |
| 		lastFeed = &Feeds{
 | |
| 			Item: tongo.NewID(),
 | |
| 		}
 | |
| 		feeds.ReplaceItem(ctx, *lastFeed, true)
 | |
| 	}
 | |
| 	fp := gofeed.NewParser()
 | |
| 	feed, err := fp.ParseURL("https://godotengine.org/rss.xml")
 | |
| 	if err != nil {
 | |
| 		log.Println("Can't get feed: ", err)
 | |
| 		return
 | |
| 	}
 | |
| 	item := feed.Items[0]
 | |
| 	if lastFeed.Published.Compare(*item.PublishedParsed) == -1 {
 | |
| 		chats, _ := feedChats.GetMany(ctx)
 | |
| 		if len(chats) == 0 {
 | |
| 			return
 | |
| 		}
 | |
| 		title := item.Title
 | |
| 		author := "by " + item.Author.Name
 | |
| 		desc := item.Description
 | |
| 		translator := InitTranslator()
 | |
| 		translates, err := translator.Translate("ru", item.Title, "by "+item.Author.Name, item.Description)
 | |
| 		if err == nil {
 | |
| 			title = translates[0]
 | |
| 			author = translates[1]
 | |
| 			desc = translates[2]
 | |
| 		}
 | |
| 		text := fmt.Sprintf(text_template,
 | |
| 			nechotron.EscapeMd2(title),
 | |
| 			item.Link,
 | |
| 			nechotron.EscapeMd2(author),
 | |
| 			nechotron.EscapeMd2(desc),
 | |
| 		)
 | |
| 		sent := false
 | |
| 		for _, chat := range chats {
 | |
| 			_, err := api.SendPhoto(echotron.NewInputFileURL(item.Custom["image"]), chat.ChatID, nechotron.NewOptions().MarkdownV2().Caption(text).PhotoOptions())
 | |
| 			if err != nil {
 | |
| 				log.Println("Can't send message to", chat.Title, ": ", err)
 | |
| 			} else {
 | |
| 				sent = true
 | |
| 			}
 | |
| 			time.Sleep(1 * time.Second)
 | |
| 		}
 | |
| 		if !sent {
 | |
| 			return
 | |
| 		}
 | |
| 		lastFeed.Published = *item.PublishedParsed
 | |
| 		lastFeed.Title = item.Title
 | |
| 		feeds.ReplaceItem(ctx, *lastFeed, true)
 | |
| 	}
 | |
| }
 |