From e9667983e95f8e191dc5dba71b23f9d77ea3ddfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Sun, 1 Feb 2026 12:27:18 +0500 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 154 +++++++++++++------------------------------------------- 1 file changed, 35 insertions(+), 119 deletions(-) diff --git a/main.go b/main.go index d1b6998..9d91ceb 100644 --- a/main.go +++ b/main.go @@ -1,14 +1,13 @@ package main import ( - "encoding/json" - "encoding/xml" "log" "os" "ssender/internal/config" - "ssender/internal/models" + "ssender/internal/db" + "ssender/internal/rss" + "ssender/internal/send" - "github.com/boltdb/bolt" "github.com/jessevdk/go-flags" ) @@ -18,108 +17,9 @@ type Options struct { InitDB bool `short:"i" long:"initdb" description:"Run initialize from current file"` } -var ConfigPath = "/etc/ssender/config.yml" - -func NewRSS(rssPath string) (*models.Rss2, error) { - rss := &models.Rss2{} - - // Open rss2 file - file, err := os.Open(rssPath) - if err != nil { - return nil, err - } - defer file.Close() - - d := xml.NewDecoder(file) - - // Start RSS decoding from file - if err := d.Decode(&rss); err != nil { - return nil, err - } - - return rss, nil -} - -var senditems models.SendItems - -func FindItems(rss models.Rss2, dbpath string) { - db, err := bolt.Open(dbpath, 0600, nil) - if err != nil { - log.Fatal(err) - } - defer db.Close() - - for _, v := range rss.ItemList { - db.View(func(tx *bolt.Tx) error { - // Assume bucket exists and has keys - b := tx.Bucket([]byte("rss")) - c := b.Cursor() - flag := false - for key, _ := c.First(); key != nil; key, _ = c.Next() { - if v.Link == string(key) { - flag = true - break - } - } - if flag { - senditems.ItemList = append(senditems.ItemList, v) - } - return nil - }) - } -} - -func InitDb(rss models.Rss2, dbpath string) { - log.Println("Initialize DB") - db, err := bolt.Open(dbpath, 0600, nil) - if err != nil { - log.Fatal(err) - } - defer db.Close() - - db.Update(func(tx *bolt.Tx) error { - b, err := tx.CreateBucketIfNotExists([]byte("rss")) - if err != nil { - return err - } - for _, v := range rss.ItemList { - encoded, err := json.Marshal(v) - if err != nil { - return err - } - err = b.Put([]byte(v.Link), encoded) - if err != nil { - return err - } - } - return nil - }) -} - -func UpdateDb(dbpath string) { - log.Println("Update DB") - db, err := bolt.Open(dbpath, 0600, nil) - if err != nil { - log.Fatal(err) - } - defer db.Close() - - db.Update(func(tx *bolt.Tx) error { - b := tx.Bucket([]byte("rss")) - for _, v := range senditems.ItemList { - encoded, err := json.Marshal(v) - if err != nil { - return err - } - err = b.Put([]byte(v.Link), encoded) - if err != nil { - return err - } - } - return nil - }) - -} +var ( + ConfigPath = "/etc/ssender/config.yml" +) func main() { log.Println("Run processing") @@ -139,10 +39,11 @@ func main() { } log.Println("Flags processed") - if options.ConfigPath != "" { - log.Printf("Config from: %s\n", options.ConfigPath) - ConfigPath = options.ConfigPath + if options.ConfigPath == "" { + log.Fatalf("Config path not found in options!") } + log.Printf("Config from: %s\n", options.ConfigPath) + ConfigPath = options.ConfigPath // Get config cfg, err := config.NewConfig(ConfigPath) @@ -153,22 +54,37 @@ func main() { // Parse rss file log.Printf("Parse file %s \n", options.FileParse) - rss, err := NewRSS(options.FileParse) + rss, err := rss.NewRSS(options.FileParse) if err != nil { log.Fatal(err) } + if options.InitDB { - InitDb(*rss, cfg.Dbpath) - } else { - //Find new items - FindItems(*rss, cfg.Dbpath) + err := db.InitDb(*rss, cfg.Dbpath) + if err != nil { + log.Fatal(err) + } + } - if len(senditems.ItemList) > 0 { - // Run send data depended on configuration options - log.Println("Run send process") - cfg.RunSend(senditems) - UpdateDb(cfg.Dbpath) + //Find new items + sendItems, err := db.FindItems(*rss, cfg.Dbpath) + if err != nil { + log.Fatal(err) + } + + if len(sendItems.ItemList) > 0 { + // Run send data depended on configuration options + log.Println("Run send process") + err := send.RunSend(sendItems, *cfg) + if err != nil { + log.Fatal(err) + } + // Run update db + err = db.UpdateDb(cfg.Dbpath, sendItems) + if err != nil { + log.Fatal(err) } } + log.Println("End processing") }