scheduler initial impl
This commit is contained in:
parent
a2085625aa
commit
275f71c4d6
48
app/app.go
48
app/app.go
@ -1,20 +1,38 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"go.balki.me/tss/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Run(configPath string) {
|
func Run(configPath string) {
|
||||||
cfg, err := config.Parse(configPath)
|
/*
|
||||||
if err != nil {
|
cfg, err := ParseConfig(configPath)
|
||||||
log.Fatal(err)
|
if err != nil {
|
||||||
}
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
for _, feed := range c.Feeds {
|
for _, feed := range cfg.Feeds {
|
||||||
log.Println("Processing feed", feed.Name)
|
log.Println("Processing feed", feed.Name)
|
||||||
}
|
data, err := Download(feed.Url, feed.Proxy)
|
||||||
fmt.Println(configPath)
|
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 (
|
import (
|
||||||
"os"
|
"os"
|
||||||
@ -17,8 +17,8 @@ type Config struct {
|
|||||||
} `yaml:"feeds"`
|
} `yaml:"feeds"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Parse(configPath string) (*Config, error) {
|
func ParseConfig(configPath string) (*Config, error) {
|
||||||
cfg, err := os.ReadFile("tss.yaml")
|
cfg, err := os.ReadFile(configPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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"]))
|
||||||
|
}
|
6
go.mod
6
go.mod
@ -4,5 +4,11 @@ go 1.17
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
|
github.com/stretchr/testify v1.7.1
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||||
)
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.0 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
)
|
||||||
|
8
go.sum
8
go.sum
@ -1,6 +1,14 @@
|
|||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
22
main.go
22
main.go
@ -9,28 +9,6 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
for _, feed := range c.Feeds {
|
|
||||||
log.Println("Processing feed", feed.Name)
|
|
||||||
data, err := download(feed.Url)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func download(url string) ([]byte, error) {
|
func download(url string) ([]byte, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user