scheduler initial impl
This commit is contained in:
48
app/app.go
48
app/app.go
@ -1,20 +1,38 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"go.balki.me/tss/config"
|
||||
)
|
||||
|
||||
func Run(configPath string) {
|
||||
cfg, err := config.Parse(configPath)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
/*
|
||||
cfg, err := ParseConfig(configPath)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
for _, feed := range c.Feeds {
|
||||
log.Println("Processing feed", feed.Name)
|
||||
}
|
||||
fmt.Println(configPath)
|
||||
for _, feed := range cfg.Feeds {
|
||||
log.Println("Processing feed", feed.Name)
|
||||
data, err := Download(feed.Url, feed.Proxy)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
for _, feed := range c.Feeds {
|
||||
log.Println("Processing feed", feed.Name)
|
||||
|
||||
links, err := parseFeed(data)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
for _, link := range links {
|
||||
if alreadySent(link) {
|
||||
continue
|
||||
}
|
||||
err := sendTelegram(link, feed.Channel, feed.Rhash)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(configPath)
|
||||
*/
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package config
|
||||
package app
|
||||
|
||||
import (
|
||||
"os"
|
||||
@ -17,8 +17,8 @@ type Config struct {
|
||||
} `yaml:"feeds"`
|
||||
}
|
||||
|
||||
func Parse(configPath string) (*Config, error) {
|
||||
cfg, err := os.ReadFile("tss.yaml")
|
||||
func ParseConfig(configPath string) (*Config, error) {
|
||||
cfg, err := os.ReadFile(configPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
5
app/download.go
Normal file
5
app/download.go
Normal file
@ -0,0 +1,5 @@
|
||||
package app
|
||||
|
||||
func Download(url string, proxy string) ([]byte, error) {
|
||||
return nil, nil
|
||||
}
|
52
app/schedule.go
Normal file
52
app/schedule.go
Normal file
@ -0,0 +1,52 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/robfig/cron/v3"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
type Scheduler struct {
|
||||
filePath string
|
||||
lastSuccessTime map[string]time.Time
|
||||
}
|
||||
|
||||
func NewScheduler(filePath string) (*Scheduler, error) {
|
||||
s := Scheduler{filePath: filePath}
|
||||
data, err := os.ReadFile(filePath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = yaml.Unmarshal(data, &s.lastSuccessTime)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &s, nil
|
||||
}
|
||||
|
||||
func (s *Scheduler) Save() error {
|
||||
data, err := yaml.Marshal(&s.lastSuccessTime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(s.filePath, data, 0644)
|
||||
}
|
||||
|
||||
func (s *Scheduler) Good(name string) {
|
||||
s.lastSuccessTime[name] = time.Now()
|
||||
}
|
||||
|
||||
func (s *Scheduler) ShouldDownload(name string, scheduleSpec string) (bool, error) {
|
||||
lastSuccess, ok := s.lastSuccessTime[name]
|
||||
if !ok {
|
||||
return true, nil
|
||||
}
|
||||
cron, err := cron.ParseStandard(scheduleSpec)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
n := cron.Next(lastSuccess)
|
||||
return n.Before(time.Now()), nil
|
||||
}
|
28
app/schedule_test.go
Normal file
28
app/schedule_test.go
Normal file
@ -0,0 +1,28 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
func TestYamlMap(t *testing.T) {
|
||||
yesterday := time.Now().Add(-24 * time.Hour)
|
||||
m := map[string]time.Time{
|
||||
"Bala": time.Now(),
|
||||
"Linus": yesterday,
|
||||
}
|
||||
out, err := yaml.Marshal(&m)
|
||||
if err != nil {
|
||||
t.Fatalf("got err: %v", err)
|
||||
}
|
||||
// assert.Equal(t, nil, fmt.Sprintf("%s", out))
|
||||
var m2 map[string]time.Time
|
||||
err = yaml.Unmarshal(out, &m2)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "foobar", fmt.Sprint(m2["Bala"]))
|
||||
}
|
Reference in New Issue
Block a user