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 @@ @@ -1,7 +1,6 @@
package config
import (
"fmt"
"os"
"ssender/internal/models"
@ -23,20 +22,9 @@ func NewConfig(configPath string) (*models.Config, error) { @@ -23,20 +22,9 @@ func NewConfig(configPath string) (*models.Config, error) {
d := yaml.NewDecoder(file)
// Start YAML decoding from file
if err := d.Decode(config); err != nil {
if err := d.Decode(&config); err != nil {
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
}

48
internal/db/db.go

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

56
internal/send/send.go

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

3
main.go

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

Loading…
Cancel
Save