diff options
-rw-r--r-- | flatbot.go | 24 | ||||
-rw-r--r-- | sent.go | 15 | ||||
-rw-r--r-- | sent_test.go | 29 |
3 files changed, 59 insertions, 9 deletions
@@ -6,6 +6,7 @@ import ( "log" "net/http" "os" + "slices" ) func main() { @@ -14,7 +15,7 @@ func main() { if err != nil { log.Fatal(err) } - flats, err := parse(body) + allFlats, err := parse(body) if err != nil { log.Fatal(err) } @@ -22,21 +23,26 @@ func main() { if err != nil { log.Fatal(err) } - flats = removeAlreadySent(flats, sent) + newFlats := removeAlreadySent(allFlats, sent) m := messenger{ Token: os.Getenv("FLATBOT_TELEGRAM_BOT_API_TOKEN"), ChatID: os.Getenv("FLATBOT_TELEGRAM_CHANNEL_ID"), } - for _, f := range flats { - err = m.Send(f) - if err != nil { - // TODO: what to do with it? - log.Print(err) + for _, f := range newFlats { + if false { + err = m.Send(f) + if err != nil { + // TODO: what to do with it? + log.Print(err) + } } sent = append(sent, f) } - fmt.Println(flats) - writeSent(flats, "/tmp/sent.json") + // Remove flats from sent that are no longer in the search response to + // prevent indefinite grow. + slices.SortFunc(allFlats, compareID) + sent = removeDelisted(sent, allFlats) + writeSent(sent, "/tmp/sent.json") } func fetch(url string) ([]byte, error) { @@ -43,6 +43,21 @@ func removeAlreadySent(fetched []flat, sent []flat) []flat { return recent } +func removeDelisted(sent []flat, allFlats []flat) []flat { + if !slices.IsSortedFunc(allFlats, compareID) { + panic("allFlats expected to be sorted") + } + recent := make([]flat, 0) + for _, f := range sent { + _, found := slices.BinarySearchFunc(allFlats, f, compareID) + if !found { + continue + } + recent = append(recent, f) + } + return recent +} + func writeSent(sent []flat, filename string) error { jsonData, err := json.Marshal(sent) if err != nil { diff --git a/sent_test.go b/sent_test.go index 64b13d6..5232832 100644 --- a/sent_test.go +++ b/sent_test.go @@ -63,6 +63,35 @@ func TestRemoveAlreadySent(t *testing.T) { } +func TestRemoveDelisted(t *testing.T) { + flats := []flat{ + flat{ + ID: 156522206, + Price: "£2,500", + }, + flat{ + ID: 158462822, + Price: "£3,000", + }} + sent := []flat{ + flat{ + ID: 156522206, + Price: "£2,500", + }, + flat{ + ID: 157948184, + Price: "£2,400", + }, + } + + got := removeDelisted(sent, flats) + want := []flat{flat{ID: 156522206, Price: "£2,500"}} + if !reflect.DeepEqual(got, want) { + t.Errorf("removeDelisted failed: got: %v, want: %v", + got, want) + } +} + func TestWriteSentNew(t *testing.T) { tmp := t.TempDir() filename := filepath.Join(tmp, "sent.json") |