2023-05-06 07:14:37 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
2023-08-29 19:03:43 +00:00
|
|
|
"os"
|
2023-05-06 07:14:37 +00:00
|
|
|
"path/filepath"
|
2023-08-29 19:03:43 +00:00
|
|
|
"strings"
|
2023-05-06 07:14:37 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"git.wntrmute.dev/kyle/nlink/nomad"
|
|
|
|
|
2023-05-06 09:12:15 +00:00
|
|
|
"git.sr.ht/~thrrgilag/woodstock"
|
2023-05-06 07:14:37 +00:00
|
|
|
"git.wntrmute.dev/kyle/goutils/config"
|
|
|
|
"git.wntrmute.dev/kyle/goutils/die"
|
2023-08-29 19:03:43 +00:00
|
|
|
"git.wntrmute.dev/kyle/goutils/log"
|
2023-05-06 07:14:37 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var defaultRSS = "https://nomad.wntrmute.net/u/kyle.rss"
|
|
|
|
|
|
|
|
func defaultPath(file string) string {
|
2023-05-06 07:32:00 +00:00
|
|
|
return filepath.Join("/etc", "nlink", file)
|
2023-05-06 07:14:37 +00:00
|
|
|
}
|
|
|
|
|
2023-08-29 19:03:43 +00:00
|
|
|
func fetchItems(db *nomad.DB, feed string, markOnly bool) error {
|
|
|
|
rssFeed := nomad.NewURLSource(feed)
|
2023-05-06 07:14:37 +00:00
|
|
|
items, err := nomad.FetchRSS(rssFeed)
|
|
|
|
if err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
items, err = db.Filter(nil, items)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if items == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if markOnly {
|
|
|
|
tx, err := db.Begin()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, item := range items {
|
2023-08-29 19:03:43 +00:00
|
|
|
log.Debugf("marking item: %s", item.Title)
|
2023-05-06 07:14:37 +00:00
|
|
|
if err = db.Mark(tx, item); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
tx.Commit()
|
2023-05-06 07:32:00 +00:00
|
|
|
|
2023-08-29 19:03:43 +00:00
|
|
|
if err := saveDatabase(config.Get("local_database")); err != nil {
|
2023-05-06 07:32:00 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2023-05-06 07:14:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
client := woodstock.NewClient(config.Get("pnut_id"), config.Get("pnut_secret"))
|
2023-05-06 20:42:58 +00:00
|
|
|
client.SetAccessToken(config.Get("pnut_auth_token"))
|
2023-05-06 07:14:37 +00:00
|
|
|
|
|
|
|
for _, item := range items {
|
|
|
|
p := nomad.NewPost(item)
|
2023-05-06 08:52:30 +00:00
|
|
|
if err = p.Fetch(); err != nil {
|
|
|
|
log.Err(err)
|
|
|
|
continue
|
|
|
|
}
|
2023-05-06 07:14:37 +00:00
|
|
|
|
2023-05-06 08:52:30 +00:00
|
|
|
if err = p.Post(client); err != nil {
|
|
|
|
log.Err(err)
|
|
|
|
continue
|
|
|
|
}
|
2023-05-06 07:14:37 +00:00
|
|
|
|
2023-05-06 08:52:30 +00:00
|
|
|
if err = db.Mark(nil, item); err != nil {
|
|
|
|
log.Err(err)
|
|
|
|
continue
|
|
|
|
}
|
2023-05-06 07:14:37 +00:00
|
|
|
}
|
|
|
|
|
2023-05-06 08:52:30 +00:00
|
|
|
if err := saveDatabase(config.Get("local_database")); err != nil {
|
2023-05-06 07:32:00 +00:00
|
|
|
log.Err(err)
|
|
|
|
}
|
|
|
|
|
2023-05-06 07:14:37 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-05-06 08:52:30 +00:00
|
|
|
const defaultInterval = 5 * time.Minute
|
2023-05-06 07:14:37 +00:00
|
|
|
|
2023-08-29 19:03:43 +00:00
|
|
|
func splitFeeds() []string {
|
|
|
|
feeds := strings.Split(config.Get("local_rss_feed_url"), " ")
|
|
|
|
for i := range feeds {
|
|
|
|
feeds[i] = strings.TrimSpace(feeds[i])
|
|
|
|
log.Debugf("feed: %s", feeds[i])
|
|
|
|
}
|
|
|
|
|
|
|
|
return feeds
|
|
|
|
}
|
|
|
|
|
2023-05-06 07:14:37 +00:00
|
|
|
func main() {
|
|
|
|
var (
|
|
|
|
configFile string
|
|
|
|
interval time.Duration
|
|
|
|
initDB bool
|
|
|
|
level string
|
|
|
|
markOnly bool
|
|
|
|
)
|
|
|
|
|
|
|
|
flag.StringVar(&configFile, "f", defaultPath("nlink.conf"), "`path` to config file")
|
|
|
|
flag.BoolVar(&initDB, "i", false, "initialize a new DB")
|
2023-05-06 08:27:50 +00:00
|
|
|
flag.StringVar(&level, "l", "DEBUG", "log level")
|
2023-05-06 07:14:37 +00:00
|
|
|
flag.BoolVar(&markOnly, "m", false, "only mark posts as having been posted")
|
2023-05-06 08:52:30 +00:00
|
|
|
flag.DurationVar(&interval, "t", defaultInterval, "interval between fetching posts")
|
2023-05-06 07:14:37 +00:00
|
|
|
flag.Parse()
|
|
|
|
|
2023-08-29 19:03:43 +00:00
|
|
|
logOpts := log.DefaultOptions("nlink", false)
|
|
|
|
logOpts.Level = level
|
2023-05-06 07:14:37 +00:00
|
|
|
|
|
|
|
if err := log.Setup(logOpts); err != nil {
|
|
|
|
die.If(err)
|
|
|
|
}
|
|
|
|
|
2023-05-06 08:27:50 +00:00
|
|
|
log.Debugln("config keys")
|
|
|
|
for _, k := range config.ListKeys() {
|
|
|
|
log.Debugf("key: %s", k)
|
|
|
|
}
|
|
|
|
|
2023-05-06 08:52:30 +00:00
|
|
|
log.Debugf("loading config file %s\n", configFile)
|
|
|
|
if err := config.LoadFile(configFile); err != nil {
|
2023-05-06 07:32:00 +00:00
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2023-05-06 08:52:30 +00:00
|
|
|
log.Infof("minio_bucket: %s", config.Get("minio_bucket"))
|
|
|
|
if err := restoreDatabase(config.Get("local_database")); err != nil {
|
2023-05-06 07:14:37 +00:00
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if initDB {
|
|
|
|
db := nomad.NewDB(config.Get("local_database"))
|
2023-05-06 08:52:30 +00:00
|
|
|
if err := db.Create(); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2023-05-06 07:14:37 +00:00
|
|
|
db.Close()
|
|
|
|
}
|
2023-05-06 08:52:30 +00:00
|
|
|
|
2023-08-29 19:03:43 +00:00
|
|
|
log.Debugf("connecting to db %s", config.Get("local_database"))
|
2023-05-06 07:14:37 +00:00
|
|
|
db := nomad.NewDB(config.Get("local_database"))
|
2023-05-06 08:52:30 +00:00
|
|
|
if err := db.Connect(); err != nil {
|
|
|
|
log.Emerg(err)
|
|
|
|
}
|
|
|
|
|
2023-05-06 07:14:37 +00:00
|
|
|
defer db.Close()
|
|
|
|
|
2023-08-29 19:03:43 +00:00
|
|
|
feeds := splitFeeds()
|
2023-05-06 07:14:37 +00:00
|
|
|
if markOnly {
|
2023-05-06 08:52:30 +00:00
|
|
|
log.Info("marking database")
|
2023-08-29 19:03:43 +00:00
|
|
|
for _, feed := range feeds {
|
|
|
|
log.Debugf("marking feed %s", feed)
|
|
|
|
if err := fetchItems(db, feed, markOnly); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2023-05-06 07:14:37 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-08-29 19:03:43 +00:00
|
|
|
os.Exit(1)
|
2023-05-06 08:52:30 +00:00
|
|
|
log.Debugf("will look for new items every %s\n", interval)
|
2023-05-06 07:14:37 +00:00
|
|
|
for {
|
2023-08-29 19:03:43 +00:00
|
|
|
for _, feed := range feeds {
|
|
|
|
log.Infoln("fetching items")
|
|
|
|
if err := fetchItems(db, feed, markOnly); err != nil {
|
|
|
|
log.Info(err)
|
|
|
|
}
|
2023-05-06 08:52:30 +00:00
|
|
|
}
|
2023-05-06 07:14:37 +00:00
|
|
|
time.Sleep(interval)
|
|
|
|
}
|
|
|
|
}
|