diff options
| author | Dmitry Ilvokhin <d@ilvokhin.com> | 2025-03-05 22:14:27 +0000 | 
|---|---|---|
| committer | Dmitry Ilvokhin <d@ilvokhin.com> | 2025-03-05 22:14:27 +0000 | 
| commit | 98da712a92bf3320e4a1045405564e76f58fb514 (patch) | |
| tree | ca3eaaa8ba6be4085f23a202f1b9e132fa7a46ad | |
| parent | 547a44a9fb502a308f596e6ffe1a90bd6c4607bc (diff) | |
| download | flatbot-98da712a92bf3320e4a1045405564e76f58fb514.tar.gz flatbot-98da712a92bf3320e4a1045405564e76f58fb514.tar.bz2 flatbot-98da712a92bf3320e4a1045405564e76f58fb514.zip | |
Basic implemention of the full flow
| -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") |