From 98da712a92bf3320e4a1045405564e76f58fb514 Mon Sep 17 00:00:00 2001 From: Dmitry Ilvokhin Date: Wed, 5 Mar 2025 22:14:27 +0000 Subject: Basic implemention of the full flow --- flatbot.go | 24 +++++++++++++++--------- sent.go | 15 +++++++++++++++ sent_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/flatbot.go b/flatbot.go index fc565f7..c04a6b0 100644 --- a/flatbot.go +++ b/flatbot.go @@ -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) { diff --git a/sent.go b/sent.go index dc16051..dd3c4c4 100644 --- a/sent.go +++ b/sent.go @@ -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") -- cgit v1.2.3-70-g09d2