diff --git a/cron/cron.go b/cron/cron.go index d2347ca..1074fc6 100644 --- a/cron/cron.go +++ b/cron/cron.go @@ -32,12 +32,12 @@ func Attach(c *cron.Cron, cfg Config) { api: cfg.API, status: cfg.Status, } - c.AddFunc("@every 1m", h.checkLastEnnoblements) - c.AddFunc("@every 30m", h.checkBotMembershipOnServers) + c.AddFunc("@every 1m", h.checkEnnoblements) + c.AddFunc("@every 30m", h.checkBotServers) c.AddFunc("@every 2h10m", h.deleteClosedTribalWarsServers) c.AddFunc("@every 6h", h.updateBotStatus) go func() { - h.checkBotMembershipOnServers() + h.checkBotServers() h.deleteClosedTribalWarsServers() h.updateBotStatus() }() diff --git a/cron/handler.go b/cron/handler.go index bf3fb98..73fc81c 100644 --- a/cron/handler.go +++ b/cron/handler.go @@ -5,6 +5,9 @@ import ( "log" "time" + "github.com/nicksnyder/go-i18n/v2/i18n" + "github.com/tribalwarshelp/dcbot/message" + "github.com/pkg/errors" shared_models "github.com/tribalwarshelp/shared/models" @@ -85,22 +88,22 @@ func (h *handler) loadLangVersions(servers []string) ([]*shared_models.LangVersi return langVersionList.Items, nil } -func (h *handler) checkLastEnnoblements() { +func (h *handler) checkEnnoblements() { start := time.Now() servers, err := h.observationRepo.FetchServers(context.Background()) if err != nil { - log.Print("checkLastEnnoblements error: " + err.Error()) + log.Print("checkEnnoblements error: " + err.Error()) return } - log.Print("checkLastEnnoblements: servers: ", servers) + log.Print("checkEnnoblements: servers: ", servers) groups, total, err := h.groupRepo.Fetch(context.Background(), nil) if err != nil { - log.Print("checkLastEnnoblements error: " + err.Error()) + log.Print("checkEnnoblements error: " + err.Error()) return } - log.Print("checkLastEnnoblements: number of loaded groups: ", total) + log.Print("checkEnnoblements: number of loaded groups: ", total) langVersions, err := h.loadLangVersions(servers) if err != nil { @@ -113,6 +116,7 @@ func (h *handler) checkLastEnnoblements() { if group.ConqueredVillagesChannelID == "" && group.LostVillagesChannelID == "" { continue } + localizer := message.NewLocalizer(group.Server.Lang) lostVillagesMsg := &discord.EmbedMessage{} conqueredVillagesMsg := &discord.EmbedMessage{} for _, observation := range group.Observations { @@ -130,6 +134,7 @@ func (h *handler) checkLastEnnoblements() { server: observation.Server, ennoblement: ennoblement, t: messageTypeLost, + localizer: localizer, } lostVillagesMsg.Append(newMessage(newMsgDataConfig).String()) } @@ -148,6 +153,7 @@ func (h *handler) checkLastEnnoblements() { server: observation.Server, ennoblement: ennoblement, t: messageTypeConquer, + localizer: localizer, } conqueredVillagesMsg.Append(newMessage(newMsgDataConfig).String()) } @@ -159,7 +165,11 @@ func (h *handler) checkLastEnnoblements() { h.discord.SendEmbed(group.ConqueredVillagesChannelID, discord. NewEmbed(). - SetTitle("Podbite wioski"). + SetTitle(localizer.MustLocalize(&i18n.LocalizeConfig{ + MessageID: "cron.conqueredVillages.title", + DefaultMessage: message.FallbackMsg("cron.conqueredVillages.title", + "Conquered villages"), + })). SetColor(colorConqueredVillage). SetFields(conqueredVillagesMsg.ToMessageEmbedFields()). SetTimestamp(formatDateOfConquest(time.Now())). @@ -169,7 +179,11 @@ func (h *handler) checkLastEnnoblements() { h.discord.SendEmbed(group.LostVillagesChannelID, discord. NewEmbed(). - SetTitle("Stracone wioski"). + SetTitle(localizer.MustLocalize(&i18n.LocalizeConfig{ + MessageID: "cron.lostVillages.title", + DefaultMessage: message.FallbackMsg("cron.lostVillages.title", + "Lost villages"), + })). SetColor(colorLostVillage). SetFields(lostVillagesMsg.ToMessageEmbedFields()). SetTimestamp(formatDateOfConquest(time.Now())). @@ -177,16 +191,16 @@ func (h *handler) checkLastEnnoblements() { } } - log.Printf("checkLastEnnoblements: finished in %s", time.Since(start).String()) + log.Printf("checkEnnoblements: finished in %s", time.Since(start).String()) } -func (h *handler) checkBotMembershipOnServers() { +func (h *handler) checkBotServers() { servers, total, err := h.serverRepo.Fetch(context.Background(), nil) if err != nil { - log.Print("checkBotMembershipOnServers error: " + err.Error()) + log.Print("checkBotServers error: " + err.Error()) return } - log.Print("checkBotMembershipOnServers: total number of loaded discord servers: ", total) + log.Print("checkBotServers: total number of loaded discord servers: ", total) idsToDelete := []string{} for _, server := range servers { @@ -200,9 +214,9 @@ func (h *handler) checkBotMembershipOnServers() { ID: idsToDelete, }) if err != nil { - log.Print("checkBotMembershipOnServers error: " + err.Error()) + log.Print("checkBotServers error: " + err.Error()) } else { - log.Printf("checkBotMembershipOnServers: total number of deleted discord servers: %d", len(deleted)) + log.Printf("checkBotServers: total number of deleted discord servers: %d", len(deleted)) } } } diff --git a/cron/message.go b/cron/message.go index 2d44a8e..23f4a3d 100644 --- a/cron/message.go +++ b/cron/message.go @@ -3,8 +3,8 @@ package cron import ( "fmt" - "github.com/bwmarrin/discordgo" - "github.com/tribalwarshelp/dcbot/discord" + "github.com/nicksnyder/go-i18n/v2/i18n" + "github.com/tribalwarshelp/dcbot/message" "github.com/tribalwarshelp/dcbot/utils" shared_models "github.com/tribalwarshelp/shared/models" ) @@ -18,7 +18,7 @@ const ( colorConqueredVillage = 0x00ff00 ) -type message struct { +type checkEnnoblementsMsg struct { t messageType server string date string @@ -32,6 +32,7 @@ type message struct { newOwnerName string newOwnerTribeURL string newOwnerTribeTag string + localizer *i18n.Localizer } type newMessageConfig struct { @@ -39,10 +40,11 @@ type newMessageConfig struct { host string server string ennoblement *shared_models.LiveEnnoblement + localizer *i18n.Localizer } -func newMessage(cfg newMessageConfig) message { - data := message{ +func newMessage(cfg newMessageConfig) checkEnnoblementsMsg { + data := checkEnnoblementsMsg{ t: cfg.t, date: formatDateOfConquest(cfg.ennoblement.EnnobledAt), server: cfg.server, @@ -51,6 +53,7 @@ func newMessage(cfg newMessageConfig) message { oldOwnerTribeTag: "-", newOwnerName: "-", newOwnerTribeTag: "-", + localizer: cfg.localizer, } if !isVillageNil(cfg.ennoblement.Village) { data.village = fmt.Sprintf("%s (%d|%d) %s", @@ -80,46 +83,17 @@ func newMessage(cfg newMessageConfig) message { return data } -func (msg message) formatMsgAboutVillageLost() string { - return fmt.Sprintf(`Wioska %s gracza %s (%s) została stracona na rzecz %s (%s)`, - formatMsgLink(msg.village, msg.villageURL), - formatMsgLink(msg.oldOwnerName, msg.oldOwnerURL), - formatMsgLink(msg.oldOwnerTribeTag, msg.oldOwnerTribeURL), - formatMsgLink(msg.newOwnerName, msg.newOwnerURL), - formatMsgLink(msg.newOwnerTribeTag, msg.newOwnerTribeURL)) -} - -func (msg message) formatMsgAboutVillageConquest() string { - return fmt.Sprintf("Gracz %s (%s) podbił wioskę %s od gracza %s (%s)", - formatMsgLink(msg.newOwnerName, msg.newOwnerURL), - formatMsgLink(msg.newOwnerTribeTag, msg.newOwnerTribeURL), - formatMsgLink(msg.village, msg.villageURL), - formatMsgLink(msg.oldOwnerName, msg.oldOwnerURL), - formatMsgLink(msg.oldOwnerTribeTag, msg.oldOwnerTribeURL)) -} - -func (msg message) String() string { - fieldContent := msg.formatMsgAboutVillageConquest() - if msg.t == messageTypeLost { - fieldContent = msg.formatMsgAboutVillageLost() - } - return fieldContent + "\n" -} - -func (msg message) toEmbed() *discordgo.MessageEmbed { - title := "Podbita wioska" - fieldContent := msg.String() - color := colorConqueredVillage - if msg.t == messageTypeLost { - title = "Stracona wioska" - color = colorLostVillage - } - - return discord. - NewEmbed(). - SetTitle(title). - AddField(msg.server, fieldContent). - SetTimestamp(msg.date). - SetColor(color). - MessageEmbed +func (msg checkEnnoblementsMsg) String() string { + return msg.localizer.MustLocalize(&i18n.LocalizeConfig{ + MessageID: "cron.checkEnnoblements.msgLine", + DefaultMessage: message.FallbackMsg("cron.checkEnnoblements.msgLine", + "{{.NewOwner}} ({{.NewOwnerTribe}}) has conquered the village {{.Village}} (Old owner: {{.OldOwner}} ({{.OldOwnerTribe}}))"), + TemplateData: map[string]interface{}{ + "NewOwner": formatMsgLink(msg.newOwnerName, msg.newOwnerURL), + "NewOwnerTribe": formatMsgLink(msg.newOwnerTribeTag, msg.newOwnerTribeURL), + "Village": formatMsgLink(msg.village, msg.villageURL), + "OldOwner": formatMsgLink(msg.oldOwnerName, msg.oldOwnerURL), + "OldOwnerTribe": formatMsgLink(msg.oldOwnerTribeTag, msg.oldOwnerTribeURL), + }, + }) + "\n" } diff --git a/discord/admin_commands.go b/discord/admin_commands.go index 9c8cddd..bc399c7 100644 --- a/discord/admin_commands.go +++ b/discord/admin_commands.go @@ -3,6 +3,7 @@ package discord import ( "context" "fmt" + "log" "strconv" "github.com/bwmarrin/discordgo" @@ -346,6 +347,7 @@ func (s *Session) handleLostVillagesCommand(ctx commandCtx, m *discordgo.Message ServerID: []string{m.GuildID}, }) if err != nil || len(groups) == 0 { + log.Print(groups) s.SendMessage(m.ChannelID, ctx.localizer.MustLocalize(&i18n.LocalizeConfig{ MessageID: "lostVillages.groupNotFound", diff --git a/group/repository/group_pg_repo.go b/group/repository/group_pg_repo.go index 39055f3..f850bc2 100644 --- a/group/repository/group_pg_repo.go +++ b/group/repository/group_pg_repo.go @@ -70,7 +70,7 @@ func (repo *pgRepo) GetByID(ctx context.Context, id int) (*models.Group, error) func (repo *pgRepo) Fetch(ctx context.Context, f *models.GroupFilter) ([]*models.Group, int, error) { var err error data := []*models.Group{} - query := repo.Model(&data).Relation("Observations").Context(ctx) + query := repo.Model(&data).Relation("Server").Relation("Observations").Context(ctx) if f != nil { query = query. diff --git a/message/translations/active.en.json b/message/translations/active.en.json index 1151041..c4174c9 100644 --- a/message/translations/active.en.json +++ b/message/translations/active.en.json @@ -81,6 +81,10 @@ "showEnnobledBarbs.success_1": "{{.Mention}} Notifications about conquered barbarian villages will no longer show up.", "showEnnobledBarbs.success_2": "{{.Mention}} Enabled notifications about conquered barbarian villages.", + "cron.lostVillages.title": "Lost villages", + "cron.conqueredVillages.title": "Conquered villages", + "cron.checkEnnoblements.msgLine": "{{.NewOwner}} ({{.NewOwnerTribe}}) has conquered the village {{.Village}} (Old owner: {{.OldOwner}} ({{.OldOwnerTribe}}))", + "api.defaultError": "{{.Mention}} There was an error fetching data from the API, please try again later.", "pagination.labelDisplayedPage": "Page: {{.Page}} from {{.MaxPage}}", diff --git a/models/group.go b/models/group.go index 657c3f7..0232701 100644 --- a/models/group.go +++ b/models/group.go @@ -4,13 +4,15 @@ type Group struct { ID int `pg:",pk" json:"id" gqlgen:"id"` ConqueredVillagesChannelID string `pg:",use_zero" json:"conqueredVillagesChannelID" gqlgen:"conqueredVillagesChannelID"` LostVillagesChannelID string `pg:",use_zero" json:"lostVillagesChannelID" gqlgen:"lostVillagesChannelID"` - ServerID string `pg:"on_delete:CASCADE,use_zero" json:"serverID" gqlgen:"serverID"` ShowEnnobledBarbarians bool `pg:",use_zero"` + ServerID string `pg:"on_delete:CASCADE,use_zero" json:"serverID" gqlgen:"serverID"` Server *Server `json:"server,omitempty" gqlgen:"server"` Observations Observations `json:"observation,omitempty" gqlgen:"observation"` } type GroupFilter struct { + tableName struct{} `urlstruct:"group"` + ID []int ServerID []string Limit int `urlstruct:",nowhere"` diff --git a/models/observation.go b/models/observation.go index c7cce2d..3c33eca 100644 --- a/models/observation.go +++ b/models/observation.go @@ -30,6 +30,8 @@ func (o Observations) Contains(server string, id int) bool { } type ObservationFilter struct { + tableName struct{} `urlstruct:"observation"` + ID []int Server []string GroupID []int diff --git a/models/server.go b/models/server.go index 7940c23..eefaa1d 100644 --- a/models/server.go +++ b/models/server.go @@ -8,6 +8,8 @@ type Server struct { Groups []*Group } type ServerFilter struct { + tableName struct{} `urlstruct:"server"` + ID []string Limit int `urlstruct:",nowhere"` Offset int `urlstruct:",nowhere"`