summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Ilvokhin <d@ilvokhin.com>2025-03-05 22:14:27 +0000
committerDmitry Ilvokhin <d@ilvokhin.com>2025-03-05 22:14:27 +0000
commit98da712a92bf3320e4a1045405564e76f58fb514 (patch)
treeca3eaaa8ba6be4085f23a202f1b9e132fa7a46ad
parent547a44a9fb502a308f596e6ffe1a90bd6c4607bc (diff)
downloadflatbot-98da712a92bf3320e4a1045405564e76f58fb514.tar.gz
flatbot-98da712a92bf3320e4a1045405564e76f58fb514.tar.bz2
flatbot-98da712a92bf3320e4a1045405564e76f58fb514.zip
Basic implemention of the full flow
-rw-r--r--flatbot.go24
-rw-r--r--sent.go15
-rw-r--r--sent_test.go29
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")