Compare commits

..

No commits in common. '0e2adaf74e9ab71701f2c28d566473bd3480fc77' and 'ef477063d29fdd3ce06384a2db629449926b1be6' have entirely different histories.

  1. 14
      internal/config/config.go
  2. 48
      internal/db/db.go
  3. 56
      internal/send/send.go
  4. 3
      main.go

14
internal/config/config.go

@ -1,7 +1,6 @@
package config package config
import ( import (
"fmt"
"os" "os"
"ssender/internal/models" "ssender/internal/models"
@ -23,20 +22,9 @@ func NewConfig(configPath string) (*models.Config, error) {
d := yaml.NewDecoder(file) d := yaml.NewDecoder(file)
// Start YAML decoding from file // Start YAML decoding from file
if err := d.Decode(config); err != nil { if err := d.Decode(&config); err != nil {
return nil, err return nil, err
} }
// Validate required fields
if config.Dbpath == "" {
return nil, fmt.Errorf("dbpath is required in config")
}
if config.Telegram.Send && (config.Telegram.Token == "" || config.Telegram.ChatId == 0) {
return nil, fmt.Errorf("telegram token and chatid are required when send is enabled")
}
if config.VK.Send && (config.VK.Token == "" || config.VK.OwnerId == 0) {
return nil, fmt.Errorf("vk token and ownerid are required when send is enabled")
}
return config, nil return config, nil
} }

48
internal/db/db.go

@ -2,20 +2,18 @@ package db
import ( import (
"encoding/json" "encoding/json"
"fmt"
"log" "log"
"os"
"ssender/internal/models" "ssender/internal/models"
"github.com/boltdb/bolt" "github.com/boltdb/bolt"
) )
func InitDb(rss models.Rss2, dbpath string) error { func InitDb(rss models.Rss2, dbpath string) error {
db, err := openDB(dbpath) log.Println("Initialize DB")
db, err := bolt.Open(dbpath, 0600, nil)
if err != nil { if err != nil {
return err log.Fatal(err)
} }
log.Println("Initialize DB")
defer db.Close() defer db.Close()
err = db.Update(func(tx *bolt.Tx) error { err = db.Update(func(tx *bolt.Tx) error {
@ -43,48 +41,42 @@ func InitDb(rss models.Rss2, dbpath string) error {
func FindItems(rss models.Rss2, dbpath string) (*models.SendItems, error) { func FindItems(rss models.Rss2, dbpath string) (*models.SendItems, error) {
var sendItems models.SendItems var sendItems models.SendItems
db, err := bolt.Open(dbpath, 0600, nil)
// Check if DB file exists
if _, err := os.Stat(dbpath); os.IsNotExist(err) {
return nil, fmt.Errorf("database file does not exist: %s", dbpath)
}
// Open database
db, err := openDB(dbpath)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer db.Close() defer db.Close()
log.Println("Finding new items in DB") for _, v := range rss.ItemList {
err = db.View(func(tx *bolt.Tx) error { err = db.View(func(tx *bolt.Tx) error {
// Assume bucket exists and has keys
b := tx.Bucket([]byte("rss")) b := tx.Bucket([]byte("rss"))
if b == nil { c := b.Cursor()
return fmt.Errorf("bucket 'rss' not found in database") flag := false
for key, _ := c.First(); key != nil; key, _ = c.Next() {
if v.Link == string(key) {
flag = true
break
} }
for _, v := range rss.ItemList {
if b.Get([]byte(v.Link)) != nil {
sendItems.ItemList = append(sendItems.ItemList, v)
} }
if flag {
sendItems.ItemList = append(sendItems.ItemList, v)
} }
return nil return nil
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
}
log.Printf("Found %d new items", len(sendItems.ItemList))
return &sendItems, nil return &sendItems, nil
} }
func UpdateDb(dbpath string, senditems *models.SendItems) error { func UpdateDb(dbpath string, senditems *models.SendItems) error {
db, err := openDB(dbpath) log.Println("Update DB")
db, err := bolt.Open(dbpath, 0600, nil)
if err != nil { if err != nil {
return err log.Fatal(err)
} }
log.Println("Update DB")
defer db.Close() defer db.Close()
err = db.Update(func(tx *bolt.Tx) error { err = db.Update(func(tx *bolt.Tx) error {
@ -106,7 +98,3 @@ func UpdateDb(dbpath string, senditems *models.SendItems) error {
} }
return nil return nil
} }
func openDB(dbpath string) (*bolt.DB, error) {
return bolt.Open(dbpath, 0600, nil)
}

56
internal/send/send.go

@ -1,7 +1,6 @@
package send package send
import ( import (
"fmt"
"log" "log"
"ssender/internal/models" "ssender/internal/models"
@ -10,69 +9,40 @@ import (
) )
func RunSend(senditems *models.SendItems, config models.Config) error { func RunSend(senditems *models.SendItems, config models.Config) error {
failedItems := make([]models.Item, 0) for _, v := range senditems.ItemList {
// Создаем бота Telegram один раз, если отправка включена
var bot *tgbotapi.BotAPI
if config.Telegram.Send { if config.Telegram.Send {
var err error log.Println("Send to telegram")
bot, err = tgbotapi.NewBotAPI(config.Telegram.Token) bot, err := tgbotapi.NewBotAPI(config.Telegram.Token)
if err != nil { if err != nil {
return err return err
} }
bot.Debug = config.Telegram.SendDebug bot.Debug = config.Telegram.SendDebug
}
// Создаем клиент VK один раз, если отправка включена
var vk *api.VK
if config.VK.Send {
vk = api.NewVK(config.VK.Token)
}
for i, v := range senditems.ItemList { // s := "<b>" + string(v.Title) + "</b>\n" + html.UnescapeString(string(v.Description)) +
itemSent := false // "\nhttps://t.me/iv?url=" + v.Link + "&rhash=da76512d0ff2a2" +
log.Printf("Processing item %d: %s", i+1, v.Title) // "\n\nСсылка на пост: " + v.Link
if config.Telegram.Send {
log.Println("Send to telegram")
msg := tgbotapi.NewMessage(config.Telegram.ChatId, v.Link) msg := tgbotapi.NewMessage(config.Telegram.ChatId, v.Link)
msg.ParseMode = "Html" msg.ParseMode = "Html"
_, err := bot.Send(msg) _, err = bot.Send(msg)
if err != nil { if err != nil {
log.Printf("Failed to send to Telegram: %v", err) return err
} else {
log.Println("Sended to telegram")
itemSent = true
} }
log.Println("Sended to telegram")
} }
if config.VK.Send { if config.VK.Send {
log.Println("Send to VK") log.Println("Send to VK")
vk := api.NewVK(config.VK.Token)
_, err := vk.WallPost(api.Params{ _, err := vk.WallPost(api.Params{
"owner_id": config.VK.OwnerId, "owner_id": config.VK.OwnerId,
"attachments": v.Link, "attachments": v.Link,
}) })
if err != nil { if err != nil {
log.Printf("Failed to send to VK: %v", err) return err
} else {
log.Println("Sended to VK")
itemSent = true
}
}
if !itemSent {
failedItems = append(failedItems, v)
log.Printf("Item %d failed to send: %s", i+1, v.Title)
} else {
log.Printf("Item %d successfully sent: %s", i+1, v.Title)
} }
log.Println("Sended to VK")
} }
if len(failedItems) > 0 {
log.Printf("Failed to send %d items out of %d", len(failedItems), len(senditems.ItemList))
return fmt.Errorf("failed to send %d items", len(failedItems))
} }
log.Printf("Successfully sent %d items", len(senditems.ItemList))
return nil return nil
} }

3
main.go

@ -1,7 +1,6 @@
package main package main
import ( import (
"fmt"
"log" "log"
"os" "os"
"ssender/internal/config" "ssender/internal/config"
@ -33,10 +32,8 @@ func main() {
if flagsErr == flags.ErrHelp { if flagsErr == flags.ErrHelp {
os.Exit(0) os.Exit(0)
} }
_, _ = fmt.Fprintf(os.Stderr, "Error parsing flags: %v\n", err)
os.Exit(1) os.Exit(1)
default: default:
_, _ = fmt.Fprintf(os.Stderr, "Unexpected error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
} }

Loading…
Cancel
Save