Several Fixes/Improvements

* Fix issue with parsing AOC leaderboard JSON
* Add aoc-util for different things
* go mod
* Makefile
This commit is contained in:
2021-12-01 11:41:19 -06:00
parent 24c7c80fbb
commit 14e2827377
16 changed files with 343 additions and 614 deletions

View File

@@ -114,6 +114,21 @@ func (s *AoCState) NewAoC() error {
}
func (s *AoCState) runLoop() {
_, err := s.getChannelId()
// This plugin fails without a channel id
if err != nil {
return
}
// Don't do anything until we've done an initial update of all earlier years
for _, yr := range s.GetListOfAoCYears() {
if yr == s.GetLatestYear() {
continue
}
if !s.sessionNeedsUpdate {
fmt.Printf("Startup: Checking if board needs update (%d)\n", yr)
s.AoCSilentBoardCheckAndUpdate(yr)
}
}
for {
_, err := s.getChannelId()
// This plugin fails without a channel id
@@ -342,6 +357,29 @@ func (s *AoCState) GetAoCBoard(yr int) (*aoc.Leaderboard, error) {
return s.aoc.GetLeaderboard(yr)
}
func (s *AoCState) AoCSilentBoardCheckAndUpdate(yr int) {
if s.AoCBoardNeedsUpdate(yr) {
l, err := s.aoc.GetLeaderboard(yr)
if err != nil {
admin, adminErr := s.model.GetSlackAdminDMId()
if adminErr != nil {
s.SendAdminIdError()
return
}
if err.Error() == "Invalid Session Cookie" {
s.sessionNeedsUpdate = true
}
s.SendSlackMessage(fmt.Sprintf(":warning: AoC Error processing leaderboard (%d) - %s", yr, err.Error()), admin)
return
}
s.model.SendMessage(s.Name(), "main",
s.BuildMessage("success", fmt.Sprintf("Received leaderboard (%d)", yr), ""))
// Save the leaderboard to the db
s.saveLeaderboard(l)
}
}
func (s *AoCState) AoCBoardCheckAndUpdate(yr int) {
channelId, _ := s.getChannelId()
if s.AoCBoardNeedsUpdate(yr) {
@@ -372,10 +410,19 @@ func (s *AoCState) AoCBoardCheckAndUpdate(yr int) {
if v.Stars > 1 {
plural = "stars"
}
mbrAll := s.getMemberAllYears(v.ID)
var totalStars int
for _, v := range mbrAll {
totalStars += v.Stars
}
allYearsText := ""
if totalStars > 0 {
allYearsText = fmt.Sprintf(" (%d for all years)", totalStars)
}
if yr == s.GetLatestYear() {
s.SendSlackMessage(fmt.Sprintf(":christmas_tree: %s now has %d %s! :christmas_tree:", v.Name, v.Stars, plural), channelId)
s.SendSlackMessage(fmt.Sprintf(":christmas_tree: %s now has %d %s! :christmas_tree:%s", v.Name, v.Stars, plural, allYearsText), channelId)
} else {
s.SendSlackMessage(fmt.Sprintf(":christmas_tree: %s now has %d %s! (%d) :christmas_tree:", v.Name, v.Stars, plural, yr), channelId)
s.SendSlackMessage(fmt.Sprintf(":christmas_tree: %s now has %d %s! (%d) :christmas_tree:%s", v.Name, v.Stars, plural, yr, allYearsText), channelId)
}
}
}
@@ -404,13 +451,10 @@ func (s *AoCState) AoCBoardNeedsUpdate(yr int) bool {
func (s *AoCState) AoCBoardIsNew(yr int) bool {
l, err := s.aoc.GetCachedLeaderboard(yr)
fmt.Println("Checking if board is new")
if err != nil || l == nil {
if err.Error() == "Invalid Year" {
return false
}
fmt.Println("YUP!")
return true
}
return false
@@ -439,6 +483,17 @@ func (s *AoCState) RequestChannelId() {
s.setChannelId(strings.TrimSpace(chn))
}
// Returns true if we have all AoC years saved to the DB
func (s *AoCState) haveAllYearsCached() bool {
for _, yr := range s.GetListOfAoCYears() {
_, err := s.aoc.GetCachedLeaderboard(yr)
if err != nil {
return false
}
}
return true
}
/* DB Functions */
func (s *AoCState) setAoCBoardId(brdId string) error {
return s.model.SetString([]string{"aoc", "config", "board_id"}, brdId)
@@ -510,6 +565,18 @@ func (s *AoCState) saveMember(event string, m *aoc.Member) error {
return nil
}
func (s *AoCState) getMemberAllYears(memberId string) map[string]*aoc.Member {
ret := make(map[string]*aoc.Member)
for _, yr := range s.GetListOfAoCYears() {
stYr := strconv.Itoa(yr)
m, err := s.getMember(stYr, memberId)
if err == nil {
ret[stYr] = m
}
}
return ret
}
func (s *AoCState) getMember(event string, memberId string) (*aoc.Member, error) {
var err error
var wrk string