From 5e87f1659d5bf2ab451ad57506365e7be1c6f357 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 22 Jun 2019 14:32:46 -0600 Subject: [PATCH] ready to pass from server to monitor but monitor still needs save to disk and reload Former-commit-id: 1cebef822fdc157f0622b4e0fb9f93db48e0e70d --- monitor/item.go | 33 ++++++-------------- rss/feed.go | 21 ++----------- rss/feed_test.go | 26 ---------------- rss/serialize.go | 52 +++++++++++++++++++++++++++++++ rss/serialize_test.go | 71 ++++++++++++++++++++++++++++++++++++++++++ server/.routes.go.swp | Bin 0 -> 12288 bytes server/routes.go | 58 +++++++++++++++++++++++++++++++++- 7 files changed, 192 insertions(+), 69 deletions(-) create mode 100644 rss/serialize.go create mode 100644 rss/serialize_test.go create mode 100644 server/.routes.go.swp diff --git a/monitor/item.go b/monitor/item.go index b34ff31..ee0024d 100644 --- a/monitor/item.go +++ b/monitor/item.go @@ -1,8 +1,6 @@ package monitor import ( - "bytes" - "encoding/gob" "local/rssmon3/config" "log" "time" @@ -65,19 +63,16 @@ func (i *Item) getInterval() (time.Duration, error) { if err != nil { return forever, err } - buff := bytes.NewBuffer(b) - dec := gob.NewDecoder(buff) - err = dec.Decode(&t) + err = config.Decode(b, &t) return t, err } func (i *Item) setInterval(t time.Duration) error { - buff := bytes.NewBuffer(nil) - enc := gob.NewEncoder(buff) - if err := enc.Encode(t); err != nil { + b, err := config.Encode(t) + if err != nil { return err } - if err := config.Values().DB.Set(i.Key, buff.Bytes(), nsInterval); err != nil { + if err := config.Values().DB.Set(i.Key, b, nsInterval); err != nil { return err } return nil @@ -98,29 +93,21 @@ func (i *Item) Mark() { } func (i *Item) setLast(t time.Time) error { - buff := bytes.NewBuffer(nil) - enc := gob.NewEncoder(buff) - if err := enc.Encode(t); err != nil { + b, err := config.Encode(t) + if err != nil { return err } - if err := config.Values().DB.Set(i.Key, buff.Bytes(), nsLast); err != nil { - return err - } - return nil + return config.Values().DB.Set(i.Key, b, nsLast) } func (i *Item) getLast() (time.Time, error) { - t := time.Now() + t := never b, err := config.Values().DB.Get(i.Key, nsLast) if err != nil { return never, err } - buff := bytes.NewBuffer(b) - dec := gob.NewDecoder(buff) - if err := dec.Decode(&t); err != nil { - return never, err - } - return t, nil + err = config.Decode(b, &t) + return t, err } func (i *Item) Encode() ([]byte, error) { diff --git a/rss/feed.go b/rss/feed.go index b063610..e934dbd 100644 --- a/rss/feed.go +++ b/rss/feed.go @@ -23,25 +23,8 @@ type Feed struct { Tags []string } -func TaggedFeeds(tag string) ([]*Feed, error) { - db := config.Values().DB - feedNames, err := db.List([]string{nsFeeds}) - if err != nil { - return nil, err - } - results := []*Feed{} - for _, feedName := range feedNames { - f := newFeed(feedName) - if err := f.Load(); err != nil { - return nil, err - } - for i := range f.Tags { - if f.Tags[i] == tag { - results = append(results, f) - } - } - } - return results, nil +func SubmitFeed(f *Feed) error { + return f.save() } func newFeed(key string) *Feed { diff --git a/rss/feed_test.go b/rss/feed_test.go index 90544c5..ae0c6ec 100644 --- a/rss/feed_test.go +++ b/rss/feed_test.go @@ -177,29 +177,3 @@ func TestRSSFeedPull(t *testing.T) { t.Fatal(i) } } - -func TestRSSTaggedFeeds(t *testing.T) { - initRSSFeed() - - for _, k := range []string{"a", "b"} { - f := newFeed(k) - f.Tags = []string{"TAG"} - if err := f.save(); err != nil { - t.Fatal(err) - } - } - - if feeds, err := TaggedFeeds("NOTTAG"); err != nil { - t.Fatal(err) - } else if len(feeds) != 0 { - t.Fatal(len(feeds)) - } - - if feeds, err := TaggedFeeds("TAG"); err != nil { - t.Fatal(err) - } else if len(feeds) != 2 { - t.Fatal(len(feeds)) - } else { - t.Logf("%v", feeds) - } -} diff --git a/rss/serialize.go b/rss/serialize.go new file mode 100644 index 0000000..fe0323c --- /dev/null +++ b/rss/serialize.go @@ -0,0 +1,52 @@ +package rss + +import ( + "io" + "local/rssmon3/config" + + "github.com/gorilla/feeds" +) + +func TaggedFeeds(tag string) ([]*Feed, error) { + db := config.Values().DB + feedNames, err := db.List([]string{nsFeeds}) + if err != nil { + return nil, err + } + results := []*Feed{} + for _, feedName := range feedNames { + f := newFeed(feedName) + if err := f.Load(); err != nil { + return nil, err + } + for i := range f.Tags { + if f.Tags[i] == tag { + results = append(results, f) + } + } + } + return results, nil +} + +func WriteFeed(w io.Writer, tag string, items []*Item) error { + feed := &feeds.Feed{ + Title: tag, + Link: &feeds.Link{}, + Description: tag, + Items: make([]*feeds.Item, len(items)), + } + for i, item := range items { + feed.Items[i] = &feeds.Item{ + Title: item.Title, + Link: &feeds.Link{Href: item.Link}, + Description: item.Content, + Created: item.TS, + } + } + s, err := feed.ToRss() + if err != nil { + return err + } + w.Write([]byte(s)) + return nil +} diff --git a/rss/serialize_test.go b/rss/serialize_test.go new file mode 100644 index 0000000..43e7085 --- /dev/null +++ b/rss/serialize_test.go @@ -0,0 +1,71 @@ +package rss + +import ( + "bytes" + "log" + "os" + "testing" +) + +func initRSSSerialize() { + initRSSFeed() +} + +func TestRSSTaggedFeeds(t *testing.T) { + initRSSFeed() + + for _, k := range []string{"a", "b"} { + f := newFeed(k) + f.Tags = []string{"TAG"} + if err := f.save(); err != nil { + t.Fatal(err) + } + } + + if feeds, err := TaggedFeeds("NOTTAG"); err != nil { + t.Fatal(err) + } else if len(feeds) != 0 { + t.Fatal(len(feeds)) + } + + if feeds, err := TaggedFeeds("TAG"); err != nil { + t.Fatal(err) + } else if len(feeds) != 2 { + t.Fatal(len(feeds)) + } else { + t.Logf("%v", feeds) + } +} + +func TestRSSWriteFeed(t *testing.T) { + initRSSFeed() + s := mockRSS() + defer s.Close() + + f := newFeed("key") + f.TitleFilter = "5[0-9]{2}" + f.ContentFilter = "b" + f.Tags = []string{"c"} + f.URL = s.URL + + log.SetOutput(bytes.NewBuffer(nil)) + defer log.SetOutput(os.Stderr) + if err := f.pull(); err != nil { + t.Fatal(err) + } + log.SetOutput(os.Stderr) + + items, err := f.Items(5) + if err != nil { + t.Fatal(err) + } + if len(items) != 5 { + t.Fatal(len(items)) + } + + buff := bytes.NewBuffer(nil) + if err := WriteFeed(buff, "c", items); err != nil { + t.Fatal(err) + } + t.Logf("%s", buff.Bytes()) +} diff --git a/server/.routes.go.swp b/server/.routes.go.swp new file mode 100644 index 0000000000000000000000000000000000000000..eea76184e10680921ae448f4f228beb505d81dee GIT binary patch literal 12288 zcmeI2UuYaf9LJ|B)l{2W|Dg|s>1yjRfQBED50l=`4Z5%v3<-Md`wQqqVo#X0zN zZ|Bc%e)FB*Z{|X0YU}=yQQq%tW%%66*b}ez9-d#fX4U%}7@HCyl`i{9;$%ylF58Sf z3xn?N*iB{C4dbd8x-v~0akSk{g`5%6m2sv->eS=qZJ8EE0i(bQ6v$LdhqkvJsC}0%0))i36D)t;Eaa}Qy=3o4)iudO8 zTA!!!-zZ=dFbWt2i~>dhqkvJsC}0#Y3K#{90{>?PJfE?TZeZ+{)ldQd|KI%k|JQYl zT>=-uH{c8K2{;eVf)~N_K!Iam3LFJTzyR0`?gW>68T%c)3!VY9U=pkc*Mq;;GWI99 z1bzWOgLB|@a01E2(K@YBtVeFZ)Q=fQg*1be{4 zzykMxyTD&-82bTy0Nw#_fY-orFb%eW4d4#29;^es;L9GyE`Ybe8So}}0qh6&gUdHD z_BnV9oCQyULC_B#0{4N{;Kv&o`xu-7bKnFR1^vJUW$*{q=OXwTdqA4(;ShC%c$NFW9Uc?2O&JDv>aMg zOzrjsDiqCDyw$F)m|9JaKi)Q0s}+i=7E``*ZH;8wOj9C7AYO;u8Sd}xTD)uvlB4Uf zG>%B#ouV51LfX<9iv5!%Cx5p$7ZbmtMlFT-!NaM-ve)yHqhz>ZDd=S#?G%i+x8%HN zTg^4q&D#Wmy(OCm2#DNvGYs;PRnQR5&P;kLh@+-$DQZ%r)7my5M0v zi$U$Os-p1hP#D2K9A}ZQ^CH()I-^2O$3DfhH8#1=LbqBLRk@w=z6pJyvczjxFMF0x zE0s9oB2D5b6$d0{h2)aFuPA>y6R9epKf|ycBX^|ZqIIQ+(AFp{$Th4)nQP6KTuWWU z2e_9c0&~%?W$oh#>FhWT%xedh%;D}N?xFeVzO8Jg5=R%=+qS}7EtdR9J_tpz^rE`Z zL#BEcpmC}E;Nd=+4RxGbfd~ux35}b!ydYah=Bep2w=7ucSfJ%XWB0D5Lj%sNFfwNI z#oi-4O5#*`Dof!{YcH7dl(IJ#E_r|E;&p6HJS=cX7&hrS`(QU)69;Me;G|6wD)u zqNzAK>4d^taa3ZlQb*s&md>E>+tXg;hr&s8AQmtALv|&5k#u?WLfYl;I`L@OIkHvZ zwT5yg5<1KgK(3brF6EL{D)Yj81&&bBJRMY5?1XrBH>C)@!si1)=vO`IFSdhLWM&>) zY)@f6mv4`ro*c#wiYoGq_V4^qU`5knr)cfcU28I~FRz` zMMAl>$n+iQlRw%o#AE;HE-Zeiv{le>lHQ>qJ#_5ro+83gi-XdoBhq5{;S@{7ZN?I> OdfdYnh$9