diff --git a/main.go b/main.go index d1fb889..cec69b8 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( "net/url" "os" "os/signal" + "sort" "strconv" "syscall" "time" @@ -191,8 +192,9 @@ func main() { completionTime := time.Unix(part.GotStarAt, 0).In(ChicagoTimeZone).Format("3:04:05pm") rank := getCompletionRank(&leaderboard, &member, dayIdx, partNum) + 1 ordinal := getOrdinal(rank) + overallRank := getLeaderboardRank(&lastLeaderboard, &member) + 1 err := sendNotification(fmt.Sprintf( - ":tada: %s completed day %d part %d %d%s on [the leaderboard](https://adventofcode.com/%s/leaderboard/private/view/%s) at %s, and now has %d star%s on the year. :tada:", + ":tada: %s completed day %d part %d %d%s on [the leaderboard](https://adventofcode.com/%s/leaderboard/private/view/%s) at %s, and now has %d star%s on the year, good for %d%s place overall. :tada:", member.Name, dayIdx+1, partNum, @@ -203,6 +205,8 @@ func main() { completionTime, totalStars, totalStarsPlural, + overallRank, + getOrdinal(overallRank), )) if err != nil { @@ -278,6 +282,30 @@ func getCompletionRank(leaderboard *leaderboardData, inMember *memberData, dayId return numAhead } +func getLeaderboardRank(leaderboard *leaderboardData, inMember *memberData) int { + ranking := make([]memberData, 0, len(leaderboard.Members)) + ranking = append(ranking, leaderboard.Members...) + + sort.Slice(ranking, func(i, j int) bool { + if ranking[i].LocalScore > ranking[j].LocalScore { + return true + } + if ranking[i].LocalScore < ranking[j].LocalScore { + return false + } + + return ranking[i].ID < ranking[j].ID + }) + + for i := range ranking { + if ranking[i].ID == inMember.ID { + return i + } + } + + return -1 +} + func getOrdinal(n int) string { v := n % 100 if v >= 20 && len(ordinals) > (v-20)%10 {