find-stone-beer / commit
Removed some logging statements from message and start enforcing message length by adding a "more info" link to the message if there are more results that aren't shown.
main.go | 60 +++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index c9e2c40..d808959 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "math" "net/http" "os" "path/filepath" @@ -15,9 +14,16 @@ import ( "time" "github.com/jftuga/geodist" + "golang.org/x/exp/slices" "golang.org/x/net/html" ) +type relevantSeller struct { + Name string + Pos geodist.Coord + DeliveryAgeDays int +} + const ( COORDINATE_LAT_ENV_VAR = "COORDINATE_LAT" COORDINATE_LON_ENV_VAR = "COORDINATE_LON" @@ -63,8 +69,9 @@ func main() { } } - messageSB := strings.Builder{} now := time.Now() + relevantSellers := []relevantSeller{} + for _, seller := range arrogantBastardSellers { dist, _, err := geodist.VincentyDistance(coords, seller.Pos) if err != nil { @@ -74,10 +81,6 @@ func main() { continue } - shouldPrint := false - sb := strings.Builder{} - sb.WriteString(fmt.Sprintf("%s (%d miles away) - %s\n", seller.Title, int(math.Ceil(dist)), seller.Addr)) - sellerInfo, err := getSellerInfo(seller.Nid) if err != nil { panic(err) @@ -95,31 +98,58 @@ func main() { if daysSinceDelivery > maxDeliveryWindowDays { continue } - sb.WriteString(fmt.Sprintf("\t%s - Last delivered %d days ago, \n\n", brand.Name, daysSinceDelivery)) - shouldPrint = true + relevantSellers = append(relevantSellers, relevantSeller{ + Name: seller.Title, + Pos: seller.Pos, + DeliveryAgeDays: daysSinceDelivery, + }) } - if shouldPrint { - messageSB.WriteString(sb.String()) - messageSB.WriteString("\n") + } + + // sort by delivery age + slices.SortFunc(relevantSellers, func(a, b relevantSeller) int { + return a.DeliveryAgeDays - b.DeliveryAgeDays + }) + + // more info text and link + var moreInfoText = "\n\nResults truncated, see full list <a href='https://gitlab.com/PavelSafronov/find-stone-beer'>here</a>" + var message string + for _, seller := range relevantSellers { + mapsLink := getGoogleMapsLink(seller.Pos) + sellerLink := fmt.Sprintf("<a href='%s'>%s</a> - delivered %d days ago\n", mapsLink, seller.Name, seller.DeliveryAgeDays) + newMessage := message + sellerLink + if len(newMessage)+len(moreInfoText) > MaxMessageLength { + message += moreInfoText + break } + message = newMessage } - fmt.Print(messageSB.String()) + fmt.Printf("Message length: %d\n", len(message)) + fmt.Println() + fmt.Print(message) + fmt.Println() + SendPushoverMessage(message) +} +func getGoogleMapsLink(coords geodist.Coord) string { + // https://www.google.com/maps/search/?api=1&query=<lat>,<lng> + // https://www.google.com/maps/search/?api=1&query=47.665824,-122.197289 + return fmt.Sprintf("https://www.google.com/maps/search/?api=1&query=%f,%f", coords.Lat, coords.Lon) } func getEnvVarInteger(envVarName string, defaultIfNotSet int) int { envVarValue := os.Getenv(envVarName) if envVarValue == "" { - fmt.Printf("Environment variable %s not set, using default value of %d\n", envVarName, defaultIfNotSet) + // fmt.Printf("Environment variable %s not set, using default value of %d\n", envVarName, defaultIfNotSet) return defaultIfNotSet } intValue, err := strconv.Atoi(envVarValue) if err != nil { - fmt.Printf("Could not parse environment variable %s as integer: %s, using default value of %d\n", envVarName, err, defaultIfNotSet) + // fmt.Printf("Could not parse environment variable %s as integer: %s, using default value of %d\n", envVarName, err, defaultIfNotSet) return defaultIfNotSet } - fmt.Printf("Using environment variable %s value of %d\n", envVarName, intValue) + // fmt.Printf("Using environment variable %s value of %d\n", envVarName, intValue) return intValue }