This repository has been archived on 2022-10-02. You can view files and clone it, but cannot push or open issues or pull requests.
dcbot-old/cron/cron.go

175 lines
4.7 KiB
Go
Raw Normal View History

2020-05-30 10:43:11 +00:00
package cron
import (
"context"
"log"
"time"
2020-06-02 07:00:40 +00:00
shared_models "github.com/tribalwarshelp/shared/models"
2020-06-05 12:36:29 +00:00
"github.com/tribalwarshelp/golang-sdk/sdk"
2020-06-02 07:00:40 +00:00
"github.com/tribalwarshelp/dcbot/discord"
"github.com/tribalwarshelp/dcbot/server"
"github.com/tribalwarshelp/dcbot/tribe"
"github.com/tribalwarshelp/dcbot/utils"
2020-05-30 10:43:11 +00:00
"github.com/robfig/cron/v3"
)
type Config struct {
ServerRepo server.Repository
TribeRepo tribe.Repository
Discord *discord.Session
2020-06-05 12:36:29 +00:00
API *sdk.SDK
2020-05-30 10:43:11 +00:00
}
type handler struct {
since time.Time
serverRepo server.Repository
tribeRepo tribe.Repository
discord *discord.Session
2020-06-05 15:49:51 +00:00
api *sdk.SDK
2020-05-30 10:43:11 +00:00
}
2020-06-06 12:59:11 +00:00
func Attach(c *cron.Cron, cfg Config) {
2020-05-30 10:43:11 +00:00
h := &handler{
2020-06-06 12:36:24 +00:00
since: time.Now(),
2020-05-30 10:43:11 +00:00
serverRepo: cfg.ServerRepo,
tribeRepo: cfg.TribeRepo,
discord: cfg.Discord,
2020-06-05 15:49:51 +00:00
api: cfg.API,
2020-05-30 10:43:11 +00:00
}
c.AddFunc("@every 1m", h.checkEnnoblements)
2020-05-30 10:43:11 +00:00
}
2020-06-05 15:49:51 +00:00
func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
m := make(map[string]ennoblements)
for _, w := range worlds {
es, err := h.api.Ennoblements.Browse(w, &sdk.EnnoblementInclude{
NewOwner: true,
Village: true,
NewOwnerInclude: sdk.PlayerInclude{
Tribe: true,
},
OldOwner: true,
OldOwnerInclude: sdk.PlayerInclude{
Tribe: true,
},
})
if err != nil {
log.Printf("%s: %s", w, err.Error())
continue
2020-06-05 15:49:51 +00:00
}
m[w] = filterEnnoblements(es, h.since)
}
return m
}
func (h *handler) loadLangVersions(worlds []string) map[shared_models.LanguageTag]*shared_models.LangVersion {
languageTags := []shared_models.LanguageTag{}
cache := make(map[shared_models.LanguageTag]bool)
for _, world := range worlds {
languageTag := utils.LanguageCodeFromWorldName(world)
if languageTag.IsValid() && !cache[languageTag] {
cache[languageTag] = true
languageTags = append(languageTags, languageTag)
}
}
langVersions := make(map[shared_models.LanguageTag]*shared_models.LangVersion)
langVersionsList, err := h.api.LangVersions.Browse(&shared_models.LangVersionFilter{
Tag: languageTags,
})
if err == nil {
for _, langVersion := range langVersionsList.Items {
langVersions[langVersion.Tag] = langVersion
}
} else {
log.Printf("Cannot load lang versions: %s", err.Error())
}
return langVersions
}
func (h *handler) checkEnnoblements() {
2020-05-30 10:43:11 +00:00
worlds, err := h.tribeRepo.FetchWorlds(context.Background())
if err != nil {
log.Print("checkEnnoblements: " + err.Error())
2020-05-30 10:43:11 +00:00
return
}
log.Print("checkEnnoblements: worlds: ", worlds)
2020-05-30 10:43:11 +00:00
servers, total, err := h.serverRepo.Fetch(context.Background(), nil)
if err != nil {
log.Print("checkEnnoblements: " + err.Error())
2020-05-30 10:43:11 +00:00
return
}
log.Print("checkEnnoblements: total number of servers: ", total)
langVersions := h.loadLangVersions(worlds)
2020-06-05 15:49:51 +00:00
data := h.loadEnnoblements(worlds)
2020-05-30 10:43:11 +00:00
h.since = time.Now()
log.Print("checkEnnoblements: loaded ennoblements: ", len(data))
2020-05-30 10:43:11 +00:00
for _, server := range servers {
if server.ConqueredVillagesChannelID == "" && server.LostVillagesChannelID == "" {
continue
}
for _, tribe := range server.Tribes {
2020-06-05 15:49:51 +00:00
es, ok := data[tribe.World]
langVersion, ok2 := langVersions[utils.LanguageCodeFromWorldName(tribe.World)]
if ok && ok2 {
2020-05-30 10:43:11 +00:00
if server.LostVillagesChannelID != "" {
2020-06-05 15:49:51 +00:00
for _, ennoblement := range es.tribeLostVillages(tribe.TribeID) {
if !isPlayerTribeNil(ennoblement.NewOwner) &&
server.Tribes.Contains(tribe.World, ennoblement.NewOwner.Tribe.ID) {
2020-05-30 10:43:11 +00:00
continue
}
newMsgDataConfig := newMessageDataConfig{
host: langVersion.Host,
world: tribe.World,
ennoblement: ennoblement,
timezone: langVersion.Timezone,
}
msgData := newMessageData(newMsgDataConfig)
h.discord.SendEmbed(server.LostVillagesChannelID,
discord.
NewEmbed().
SetTitle("Stracona wioska").
SetTimestamp(msgData.date).
AddField(msgData.world, formatMsgAboutVillageLost(msgData)).
MessageEmbed)
2020-05-30 10:43:11 +00:00
}
}
2020-05-30 10:43:11 +00:00
if server.ConqueredVillagesChannelID != "" {
2020-06-05 15:49:51 +00:00
for _, ennoblement := range es.tribeConqueredVillages(tribe.TribeID) {
if !isPlayerTribeNil(ennoblement.OldOwner) &&
server.Tribes.Contains(tribe.World, ennoblement.OldOwner.Tribe.ID) {
2020-05-30 10:43:11 +00:00
continue
}
newMsgDataConfig := newMessageDataConfig{
host: langVersion.Host,
world: tribe.World,
ennoblement: ennoblement,
timezone: langVersion.Timezone,
}
msgData := newMessageData(newMsgDataConfig)
h.discord.SendEmbed(server.ConqueredVillagesChannelID,
discord.
NewEmbed().
SetTitle("Podbita wioska").
AddField(msgData.world, formatMsgAboutVillageConquest(msgData)).
SetTimestamp(msgData.date).
MessageEmbed)
2020-05-30 10:43:11 +00:00
}
}
}
}
}
}