the cron messages are fully translatable

This commit is contained in:
Dawid Wysokiński 2020-07-19 16:21:32 +02:00
parent 7a6f66892c
commit d46d24f9b3
9 changed files with 65 additions and 65 deletions

View File

@ -32,12 +32,12 @@ func Attach(c *cron.Cron, cfg Config) {
api: cfg.API, api: cfg.API,
status: cfg.Status, status: cfg.Status,
} }
c.AddFunc("@every 1m", h.checkLastEnnoblements) c.AddFunc("@every 1m", h.checkEnnoblements)
c.AddFunc("@every 30m", h.checkBotMembershipOnServers) c.AddFunc("@every 30m", h.checkBotServers)
c.AddFunc("@every 2h10m", h.deleteClosedTribalWarsServers) c.AddFunc("@every 2h10m", h.deleteClosedTribalWarsServers)
c.AddFunc("@every 6h", h.updateBotStatus) c.AddFunc("@every 6h", h.updateBotStatus)
go func() { go func() {
h.checkBotMembershipOnServers() h.checkBotServers()
h.deleteClosedTribalWarsServers() h.deleteClosedTribalWarsServers()
h.updateBotStatus() h.updateBotStatus()
}() }()

View File

@ -5,6 +5,9 @@ import (
"log" "log"
"time" "time"
"github.com/nicksnyder/go-i18n/v2/i18n"
"github.com/tribalwarshelp/dcbot/message"
"github.com/pkg/errors" "github.com/pkg/errors"
shared_models "github.com/tribalwarshelp/shared/models" shared_models "github.com/tribalwarshelp/shared/models"
@ -85,22 +88,22 @@ func (h *handler) loadLangVersions(servers []string) ([]*shared_models.LangVersi
return langVersionList.Items, nil return langVersionList.Items, nil
} }
func (h *handler) checkLastEnnoblements() { func (h *handler) checkEnnoblements() {
start := time.Now() start := time.Now()
servers, err := h.observationRepo.FetchServers(context.Background()) servers, err := h.observationRepo.FetchServers(context.Background())
if err != nil { if err != nil {
log.Print("checkLastEnnoblements error: " + err.Error()) log.Print("checkEnnoblements error: " + err.Error())
return return
} }
log.Print("checkLastEnnoblements: servers: ", servers) log.Print("checkEnnoblements: servers: ", servers)
groups, total, err := h.groupRepo.Fetch(context.Background(), nil) groups, total, err := h.groupRepo.Fetch(context.Background(), nil)
if err != nil { if err != nil {
log.Print("checkLastEnnoblements error: " + err.Error()) log.Print("checkEnnoblements error: " + err.Error())
return return
} }
log.Print("checkLastEnnoblements: number of loaded groups: ", total) log.Print("checkEnnoblements: number of loaded groups: ", total)
langVersions, err := h.loadLangVersions(servers) langVersions, err := h.loadLangVersions(servers)
if err != nil { if err != nil {
@ -113,6 +116,7 @@ func (h *handler) checkLastEnnoblements() {
if group.ConqueredVillagesChannelID == "" && group.LostVillagesChannelID == "" { if group.ConqueredVillagesChannelID == "" && group.LostVillagesChannelID == "" {
continue continue
} }
localizer := message.NewLocalizer(group.Server.Lang)
lostVillagesMsg := &discord.EmbedMessage{} lostVillagesMsg := &discord.EmbedMessage{}
conqueredVillagesMsg := &discord.EmbedMessage{} conqueredVillagesMsg := &discord.EmbedMessage{}
for _, observation := range group.Observations { for _, observation := range group.Observations {
@ -130,6 +134,7 @@ func (h *handler) checkLastEnnoblements() {
server: observation.Server, server: observation.Server,
ennoblement: ennoblement, ennoblement: ennoblement,
t: messageTypeLost, t: messageTypeLost,
localizer: localizer,
} }
lostVillagesMsg.Append(newMessage(newMsgDataConfig).String()) lostVillagesMsg.Append(newMessage(newMsgDataConfig).String())
} }
@ -148,6 +153,7 @@ func (h *handler) checkLastEnnoblements() {
server: observation.Server, server: observation.Server,
ennoblement: ennoblement, ennoblement: ennoblement,
t: messageTypeConquer, t: messageTypeConquer,
localizer: localizer,
} }
conqueredVillagesMsg.Append(newMessage(newMsgDataConfig).String()) conqueredVillagesMsg.Append(newMessage(newMsgDataConfig).String())
} }
@ -159,7 +165,11 @@ func (h *handler) checkLastEnnoblements() {
h.discord.SendEmbed(group.ConqueredVillagesChannelID, h.discord.SendEmbed(group.ConqueredVillagesChannelID,
discord. discord.
NewEmbed(). NewEmbed().
SetTitle("Podbite wioski"). SetTitle(localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "cron.conqueredVillages.title",
DefaultMessage: message.FallbackMsg("cron.conqueredVillages.title",
"Conquered villages"),
})).
SetColor(colorConqueredVillage). SetColor(colorConqueredVillage).
SetFields(conqueredVillagesMsg.ToMessageEmbedFields()). SetFields(conqueredVillagesMsg.ToMessageEmbedFields()).
SetTimestamp(formatDateOfConquest(time.Now())). SetTimestamp(formatDateOfConquest(time.Now())).
@ -169,7 +179,11 @@ func (h *handler) checkLastEnnoblements() {
h.discord.SendEmbed(group.LostVillagesChannelID, h.discord.SendEmbed(group.LostVillagesChannelID,
discord. discord.
NewEmbed(). NewEmbed().
SetTitle("Stracone wioski"). SetTitle(localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "cron.lostVillages.title",
DefaultMessage: message.FallbackMsg("cron.lostVillages.title",
"Lost villages"),
})).
SetColor(colorLostVillage). SetColor(colorLostVillage).
SetFields(lostVillagesMsg.ToMessageEmbedFields()). SetFields(lostVillagesMsg.ToMessageEmbedFields()).
SetTimestamp(formatDateOfConquest(time.Now())). 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) servers, total, err := h.serverRepo.Fetch(context.Background(), nil)
if err != nil { if err != nil {
log.Print("checkBotMembershipOnServers error: " + err.Error()) log.Print("checkBotServers error: " + err.Error())
return return
} }
log.Print("checkBotMembershipOnServers: total number of loaded discord servers: ", total) log.Print("checkBotServers: total number of loaded discord servers: ", total)
idsToDelete := []string{} idsToDelete := []string{}
for _, server := range servers { for _, server := range servers {
@ -200,9 +214,9 @@ func (h *handler) checkBotMembershipOnServers() {
ID: idsToDelete, ID: idsToDelete,
}) })
if err != nil { if err != nil {
log.Print("checkBotMembershipOnServers error: " + err.Error()) log.Print("checkBotServers error: " + err.Error())
} else { } 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))
} }
} }
} }

View File

@ -3,8 +3,8 @@ package cron
import ( import (
"fmt" "fmt"
"github.com/bwmarrin/discordgo" "github.com/nicksnyder/go-i18n/v2/i18n"
"github.com/tribalwarshelp/dcbot/discord" "github.com/tribalwarshelp/dcbot/message"
"github.com/tribalwarshelp/dcbot/utils" "github.com/tribalwarshelp/dcbot/utils"
shared_models "github.com/tribalwarshelp/shared/models" shared_models "github.com/tribalwarshelp/shared/models"
) )
@ -18,7 +18,7 @@ const (
colorConqueredVillage = 0x00ff00 colorConqueredVillage = 0x00ff00
) )
type message struct { type checkEnnoblementsMsg struct {
t messageType t messageType
server string server string
date string date string
@ -32,6 +32,7 @@ type message struct {
newOwnerName string newOwnerName string
newOwnerTribeURL string newOwnerTribeURL string
newOwnerTribeTag string newOwnerTribeTag string
localizer *i18n.Localizer
} }
type newMessageConfig struct { type newMessageConfig struct {
@ -39,10 +40,11 @@ type newMessageConfig struct {
host string host string
server string server string
ennoblement *shared_models.LiveEnnoblement ennoblement *shared_models.LiveEnnoblement
localizer *i18n.Localizer
} }
func newMessage(cfg newMessageConfig) message { func newMessage(cfg newMessageConfig) checkEnnoblementsMsg {
data := message{ data := checkEnnoblementsMsg{
t: cfg.t, t: cfg.t,
date: formatDateOfConquest(cfg.ennoblement.EnnobledAt), date: formatDateOfConquest(cfg.ennoblement.EnnobledAt),
server: cfg.server, server: cfg.server,
@ -51,6 +53,7 @@ func newMessage(cfg newMessageConfig) message {
oldOwnerTribeTag: "-", oldOwnerTribeTag: "-",
newOwnerName: "-", newOwnerName: "-",
newOwnerTribeTag: "-", newOwnerTribeTag: "-",
localizer: cfg.localizer,
} }
if !isVillageNil(cfg.ennoblement.Village) { if !isVillageNil(cfg.ennoblement.Village) {
data.village = fmt.Sprintf("%s (%d|%d) %s", data.village = fmt.Sprintf("%s (%d|%d) %s",
@ -80,46 +83,17 @@ func newMessage(cfg newMessageConfig) message {
return data return data
} }
func (msg message) formatMsgAboutVillageLost() string { func (msg checkEnnoblementsMsg) String() string {
return fmt.Sprintf(`Wioska %s gracza %s (%s) została stracona na rzecz %s (%s)`, return msg.localizer.MustLocalize(&i18n.LocalizeConfig{
formatMsgLink(msg.village, msg.villageURL), MessageID: "cron.checkEnnoblements.msgLine",
formatMsgLink(msg.oldOwnerName, msg.oldOwnerURL), DefaultMessage: message.FallbackMsg("cron.checkEnnoblements.msgLine",
formatMsgLink(msg.oldOwnerTribeTag, msg.oldOwnerTribeURL), "{{.NewOwner}} ({{.NewOwnerTribe}}) has conquered the village {{.Village}} (Old owner: {{.OldOwner}} ({{.OldOwnerTribe}}))"),
formatMsgLink(msg.newOwnerName, msg.newOwnerURL), TemplateData: map[string]interface{}{
formatMsgLink(msg.newOwnerTribeTag, msg.newOwnerTribeURL)) "NewOwner": formatMsgLink(msg.newOwnerName, msg.newOwnerURL),
} "NewOwnerTribe": formatMsgLink(msg.newOwnerTribeTag, msg.newOwnerTribeURL),
"Village": formatMsgLink(msg.village, msg.villageURL),
func (msg message) formatMsgAboutVillageConquest() string { "OldOwner": formatMsgLink(msg.oldOwnerName, msg.oldOwnerURL),
return fmt.Sprintf("Gracz %s (%s) podbił wioskę %s od gracza %s (%s)", "OldOwnerTribe": formatMsgLink(msg.oldOwnerTribeTag, msg.oldOwnerTribeURL),
formatMsgLink(msg.newOwnerName, msg.newOwnerURL), },
formatMsgLink(msg.newOwnerTribeTag, msg.newOwnerTribeURL), }) + "\n"
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
} }

View File

@ -3,6 +3,7 @@ package discord
import ( import (
"context" "context"
"fmt" "fmt"
"log"
"strconv" "strconv"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
@ -346,6 +347,7 @@ func (s *Session) handleLostVillagesCommand(ctx commandCtx, m *discordgo.Message
ServerID: []string{m.GuildID}, ServerID: []string{m.GuildID},
}) })
if err != nil || len(groups) == 0 { if err != nil || len(groups) == 0 {
log.Print(groups)
s.SendMessage(m.ChannelID, s.SendMessage(m.ChannelID,
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{ ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "lostVillages.groupNotFound", MessageID: "lostVillages.groupNotFound",

View File

@ -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) { func (repo *pgRepo) Fetch(ctx context.Context, f *models.GroupFilter) ([]*models.Group, int, error) {
var err error var err error
data := []*models.Group{} data := []*models.Group{}
query := repo.Model(&data).Relation("Observations").Context(ctx) query := repo.Model(&data).Relation("Server").Relation("Observations").Context(ctx)
if f != nil { if f != nil {
query = query. query = query.

View File

@ -81,6 +81,10 @@
"showEnnobledBarbs.success_1": "{{.Mention}} Notifications about conquered barbarian villages will no longer show up.", "showEnnobledBarbs.success_1": "{{.Mention}} Notifications about conquered barbarian villages will no longer show up.",
"showEnnobledBarbs.success_2": "{{.Mention}} Enabled notifications about conquered barbarian villages.", "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.", "api.defaultError": "{{.Mention}} There was an error fetching data from the API, please try again later.",
"pagination.labelDisplayedPage": "Page: {{.Page}} from {{.MaxPage}}", "pagination.labelDisplayedPage": "Page: {{.Page}} from {{.MaxPage}}",

View File

@ -4,13 +4,15 @@ type Group struct {
ID int `pg:",pk" json:"id" gqlgen:"id"` ID int `pg:",pk" json:"id" gqlgen:"id"`
ConqueredVillagesChannelID string `pg:",use_zero" json:"conqueredVillagesChannelID" gqlgen:"conqueredVillagesChannelID"` ConqueredVillagesChannelID string `pg:",use_zero" json:"conqueredVillagesChannelID" gqlgen:"conqueredVillagesChannelID"`
LostVillagesChannelID string `pg:",use_zero" json:"lostVillagesChannelID" gqlgen:"lostVillagesChannelID"` 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"` ShowEnnobledBarbarians bool `pg:",use_zero"`
ServerID string `pg:"on_delete:CASCADE,use_zero" json:"serverID" gqlgen:"serverID"`
Server *Server `json:"server,omitempty" gqlgen:"server"` Server *Server `json:"server,omitempty" gqlgen:"server"`
Observations Observations `json:"observation,omitempty" gqlgen:"observation"` Observations Observations `json:"observation,omitempty" gqlgen:"observation"`
} }
type GroupFilter struct { type GroupFilter struct {
tableName struct{} `urlstruct:"group"`
ID []int ID []int
ServerID []string ServerID []string
Limit int `urlstruct:",nowhere"` Limit int `urlstruct:",nowhere"`

View File

@ -30,6 +30,8 @@ func (o Observations) Contains(server string, id int) bool {
} }
type ObservationFilter struct { type ObservationFilter struct {
tableName struct{} `urlstruct:"observation"`
ID []int ID []int
Server []string Server []string
GroupID []int GroupID []int

View File

@ -8,6 +8,8 @@ type Server struct {
Groups []*Group Groups []*Group
} }
type ServerFilter struct { type ServerFilter struct {
tableName struct{} `urlstruct:"server"`
ID []string ID []string
Limit int `urlstruct:",nowhere"` Limit int `urlstruct:",nowhere"`
Offset int `urlstruct:",nowhere"` Offset int `urlstruct:",nowhere"`