cron should store lastEnnobledAt individually for each server

This commit is contained in:
Dawid Wysokiński 2020-06-12 18:28:07 +02:00 committed by Kichiyaki
parent c3c2491fa8
commit cb8adc3c8a
5 changed files with 40 additions and 22 deletions

View File

@ -21,11 +21,11 @@ type Config struct {
func Attach(c *cron.Cron, cfg Config) {
h := &handler{
since: time.Now(),
serverRepo: cfg.ServerRepo,
tribeRepo: cfg.TribeRepo,
discord: cfg.Discord,
api: cfg.API,
lastEnnobledAt: make(map[string]time.Time),
serverRepo: cfg.ServerRepo,
tribeRepo: cfg.TribeRepo,
discord: cfg.Discord,
api: cfg.API,
}
c.AddFunc("@every 1m", h.checkLastEnnoblements)
}

View File

@ -1,9 +1,19 @@
package cron
import shared_models "github.com/tribalwarshelp/shared/models"
import (
shared_models "github.com/tribalwarshelp/shared/models"
)
type ennoblements []*shared_models.Ennoblement
func (e ennoblements) getLastEnnoblement() *shared_models.Ennoblement {
length := len(e)
if length <= 0 {
return nil
}
return e[length-1]
}
func (e ennoblements) tribeLostVillages(tribeID int) ennoblements {
filtered := ennoblements{}
for _, ennoblement := range e {

View File

@ -15,11 +15,11 @@ import (
)
type handler struct {
since time.Time
serverRepo server.Repository
tribeRepo tribe.Repository
discord *discord.Session
api *sdk.SDK
lastEnnobledAt map[string]time.Time
serverRepo server.Repository
tribeRepo tribe.Repository
discord *discord.Session
api *sdk.SDK
}
func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
@ -41,7 +41,19 @@ func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
log.Printf("%s: %s", w, err.Error())
continue
}
m[w] = filterEnnoblements(es, h.since)
lastEnnobledAt, ok := h.lastEnnobledAt[w]
if !ok {
lastEnnobledAt = time.Now()
}
m[w] = filterEnnoblements(es, lastEnnobledAt)
lastEnnoblement := m[w].getLastEnnoblement()
if lastEnnoblement != nil {
lastEnnobledAt = lastEnnoblement.EnnobledAt.In(time.UTC)
}
h.lastEnnobledAt[w] = lastEnnobledAt
}
return m
@ -90,16 +102,15 @@ func (h *handler) checkLastEnnoblements() {
langVersions := h.loadLangVersions(worlds)
data := h.loadEnnoblements(worlds)
h.since = time.Now()
log.Println("checkLastEnnoblements: loaded ennoblements from", len(data), "tribalwars servers")
ennoblements := h.loadEnnoblements(worlds)
log.Println("checkLastEnnoblements: loaded ennoblements from", len(ennoblements), "tribalwars servers")
for _, server := range servers {
if server.ConqueredVillagesChannelID == "" && server.LostVillagesChannelID == "" {
continue
}
for _, tribe := range server.Tribes {
es, ok := data[tribe.World]
es, ok := ennoblements[tribe.World]
langVersion, ok2 := langVersions[utils.LanguageCodeFromWorldName(tribe.World)]
if ok && ok2 {
if server.LostVillagesChannelID != "" {
@ -112,7 +123,6 @@ func (h *handler) checkLastEnnoblements() {
host: langVersion.Host,
world: tribe.World,
ennoblement: ennoblement,
timezone: langVersion.Timezone,
}
msgData := newMessageData(newMsgDataConfig)
h.discord.SendEmbed(server.LostVillagesChannelID,
@ -135,7 +145,6 @@ func (h *handler) checkLastEnnoblements() {
host: langVersion.Host,
world: tribe.World,
ennoblement: ennoblement,
timezone: langVersion.Timezone,
}
msgData := newMessageData(newMsgDataConfig)
h.discord.SendEmbed(server.ConqueredVillagesChannelID,

View File

@ -29,8 +29,8 @@ func isVillageNil(village *shared_models.Village) bool {
return village == nil
}
func formatDateOfConquest(loc *time.Location, t time.Time) string {
return t.In(loc).Format(time.RFC3339)
func formatDateOfConquest(t time.Time) string {
return t.Format(time.RFC3339)
}
func getLocation(timezone string) *time.Location {

View File

@ -32,12 +32,11 @@ type newMessageDataConfig struct {
host string
world string
ennoblement *shared_models.Ennoblement
timezone string
}
func newMessageData(cfg newMessageDataConfig) messageData {
data := messageData{
date: formatDateOfConquest(getLocation(cfg.timezone), cfg.ennoblement.EnnobledAt),
date: formatDateOfConquest(cfg.ennoblement.EnnobledAt),
world: cfg.world,
village: "-",
oldOwnerName: "-",