diff --git a/cron/handler.go b/cron/handler.go index 0acd76e..84e80c9 100644 --- a/cron/handler.go +++ b/cron/handler.go @@ -5,6 +5,7 @@ import ( "log" "time" + "github.com/pkg/errors" shared_models "github.com/tribalwarshelp/shared/models" "github.com/tribalwarshelp/dcbot/discord" @@ -62,7 +63,7 @@ func (h *handler) loadEnnoblements(servers []string) map[string]ennoblements { return m } -func (h *handler) loadLangVersions(servers []string) map[shared_models.LanguageTag]*shared_models.LangVersion { +func (h *handler) loadLangVersions(servers []string) ([]*shared_models.LangVersion, error) { languageTags := []shared_models.LanguageTag{} cache := make(map[shared_models.LanguageTag]bool) for _, server := range servers { @@ -73,19 +74,14 @@ func (h *handler) loadLangVersions(servers []string) map[shared_models.LanguageT } } - langVersions := make(map[shared_models.LanguageTag]*shared_models.LangVersion) - langVersionsList, err := h.api.LangVersions.Browse(&shared_models.LangVersionFilter{ + langVersionList, 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()) + if err != nil { + return nil, errors.Wrap(err, "Cannot load lang versions") } - return langVersions + return langVersionList.Items, nil } func (h *handler) checkLastEnnoblements() { @@ -105,7 +101,11 @@ func (h *handler) checkLastEnnoblements() { } log.Print("checkLastEnnoblements: number of loaded groups: ", total) - langVersions := h.loadLangVersions(servers) + langVersions, err := h.loadLangVersions(servers) + if err != nil { + log.Print(err) + return + } ennoblementsByServerKey := h.loadEnnoblements(servers) for _, group := range groups { @@ -114,9 +114,10 @@ func (h *handler) checkLastEnnoblements() { } for _, observation := range group.Observations { ennoblements, ok := ennoblementsByServerKey[observation.Server] - langVersion, ok2 := langVersions[utils.LanguageTagFromWorldName(observation.Server)] - if ok && ok2 { + langVersion := utils.FindLangVersionByTag(langVersions, utils.LanguageTagFromWorldName(observation.Server)) + if ok && langVersion != nil && langVersion.Host != "" { if group.LostVillagesChannelID != "" { + msg := &discord.EmbedMessage{} for _, ennoblement := range ennoblements.getLostVillagesByTribe(observation.TribeID) { if !isPlayerTribeNil(ennoblement.NewOwner) && group.Observations.Contains(observation.Server, ennoblement.NewOwner.Tribe.ID) { @@ -128,12 +129,22 @@ func (h *handler) checkLastEnnoblements() { ennoblement: ennoblement, t: messageTypeLost, } - msg := newMessage(newMsgDataConfig) - h.discord.SendEmbed(group.LostVillagesChannelID, msg.toEmbed()) + msg.Append(newMessage(newMsgDataConfig).String()) + } + if !msg.IsEmpty() { + h.discord.SendEmbed(group.LostVillagesChannelID, + discord. + NewEmbed(). + SetTitle("Stracone wioski"). + SetColor(colorLostVillage). + SetFields(msg.ToMessageEmbedFields()). + SetTimestamp(formatDateOfConquest(time.Now())). + MessageEmbed) } } if group.ConqueredVillagesChannelID != "" { + msg := &discord.EmbedMessage{} for _, ennoblement := range ennoblements.getConqueredVillagesByTribe(observation.TribeID) { if !isPlayerTribeNil(ennoblement.OldOwner) && group.Observations.Contains(observation.Server, ennoblement.OldOwner.Tribe.ID) { @@ -145,8 +156,17 @@ func (h *handler) checkLastEnnoblements() { ennoblement: ennoblement, t: messageTypeConquer, } - msg := newMessage(newMsgDataConfig) - h.discord.SendEmbed(group.ConqueredVillagesChannelID, msg.toEmbed()) + msg.Append(newMessage(newMsgDataConfig).String()) + } + if !msg.IsEmpty() { + h.discord.SendEmbed(group.ConqueredVillagesChannelID, + discord. + NewEmbed(). + SetTitle("Podbite wioski"). + SetColor(colorConqueredVillage). + SetFields(msg.ToMessageEmbedFields()). + SetTimestamp(formatDateOfConquest(time.Now())). + MessageEmbed) } } } diff --git a/cron/message.go b/cron/message.go index 2ddf3b3..2d44a8e 100644 --- a/cron/message.go +++ b/cron/message.go @@ -98,13 +98,20 @@ func (msg message) formatMsgAboutVillageConquest() string { 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.formatMsgAboutVillageConquest() + fieldContent := msg.String() color := colorConqueredVillage if msg.t == messageTypeLost { title = "Stracona wioska" - fieldContent = msg.formatMsgAboutVillageLost() color = colorLostVillage } diff --git a/discord/admin_commands.go b/discord/admin_commands.go index 0af833a..e3104d7 100644 --- a/discord/admin_commands.go +++ b/discord/admin_commands.go @@ -7,6 +7,7 @@ import ( "github.com/bwmarrin/discordgo" "github.com/tribalwarshelp/dcbot/models" + "github.com/tribalwarshelp/dcbot/utils" shared_models "github.com/tribalwarshelp/shared/models" ) @@ -467,32 +468,75 @@ func (s *Session) handleObservationsCommand(m *discordgo.MessageCreate, args ... m.Author.Mention())) return } - group, err := s.cfg.GroupRepository.GetByID(context.Background(), groupID) if err != nil || group.ServerID != m.GuildID { s.SendMessage(m.ChannelID, m.Author.Mention()+` Nie znaleziono grupy.`) return } - observations, _, err := s.cfg.ObservationRepository.Fetch(context.Background(), &models.ObservationFilter{ GroupID: []int{groupID}, }) if err != nil { + s.SendMessage(m.ChannelID, m.Author.Mention()+` Wystąpił błąd wewnętrzny, prosimy spróbować później.`) return } - msg := "" + tribeIDsByServer := make(map[string][]int) + observationIndexByTribeID := make(map[int]int) + langTags := []shared_models.LanguageTag{} for i, observation := range observations { - msg += fmt.Sprintf("**%d** | %d - %s - %d\n", i+1, observation.ID, observation.Server, observation.TribeID) + tribeIDsByServer[observation.Server] = append(tribeIDsByServer[observation.Server], observation.TribeID) + observationIndexByTribeID[observation.TribeID] = i + currentLangTag := utils.LanguageTagFromWorldName(observation.Server) + unique := true + for _, langTag := range langTags { + if langTag == currentLangTag { + unique = false + break + } + } + if unique { + langTags = append(langTags, currentLangTag) + } } - - if msg == "" { - msg = "Brak dodanych obserwacji do tej grupy" + for server, tribeIDs := range tribeIDsByServer { + list, err := s.cfg.API.Tribes.Browse(server, &shared_models.TribeFilter{ + ID: tribeIDs, + }) + if err != nil { + s.SendMessage(m.ChannelID, m.Author.Mention()+` Wystąpił błąd wewnętrzny, prosimy spróbować później.`) + return + } + for _, tribe := range list.Items { + observations[observationIndexByTribeID[tribe.ID]].Tribe = tribe + } } + langVersionList, err := s.cfg.API.LangVersions.Browse(&shared_models.LangVersionFilter{ + Tag: langTags, + }) + msg := &EmbedMessage{} + if len(observations) <= 0 { + msg.Append("Brak") + } + for i, observation := range observations { + tag := "Unknown" + if observation.Tribe != nil { + tag = observation.Tribe.Tag + } + lv := utils.FindLangVersionByTag(langVersionList.Items, utils.LanguageTagFromWorldName(observation.Server)) + tribeURL := "" + if lv != nil { + tribeURL = utils.FormatTribeURL(observation.Server, lv.Host, observation.TribeID) + } + msg.Append(fmt.Sprintf("**%d** | %d - %s - [``%s``](%s)\n", i+1, observation.ID, + observation.Server, + tag, + tribeURL)) + } s.SendEmbed(m.ChannelID, NewEmbed(). - SetTitle("Lista obserwowanych plemion"). - AddField("Indeks | ID - Serwer - ID plemienia", msg). + SetTitle("Lista obserwowanych plemion\nIndeks | ID - Serwer - Plemię"). + SetFields(msg.ToMessageEmbedFields()). SetFooter("Strona 1 z 1"). MessageEmbed) } diff --git a/discord/embed.go b/discord/embed.go index 8a96f8d..2c07c52 100644 --- a/discord/embed.go +++ b/discord/embed.go @@ -258,6 +258,10 @@ type EmbedMessage struct { mutex sync.Mutex } +func (msg *EmbedMessage) IsEmpty() bool { + return len(msg.Chunks) == 0 +} + func (msg *EmbedMessage) Append(m string) { msg.mutex.Lock() defer msg.mutex.Unlock() diff --git a/go.mod b/go.mod index bce9bb6..13df344 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/robfig/cron/v3 v3.0.1 github.com/segmentio/encoding v0.1.14 // indirect - github.com/tribalwarshelp/golang-sdk v0.0.0-20200629130313-0880d8996ba6 - github.com/tribalwarshelp/shared v0.0.0-20200629123803-0cd6cb6f1e87 + github.com/tribalwarshelp/golang-sdk v0.0.0-20200709112050-ba3a7ba145b1 + github.com/tribalwarshelp/shared v0.0.0-20200707075151-722e4a520a3c golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 // indirect ) diff --git a/go.sum b/go.sum index c22d618..e92a2b6 100644 --- a/go.sum +++ b/go.sum @@ -107,6 +107,8 @@ github.com/tribalwarshelp/golang-sdk v0.0.0-20200625131004-06b44e214642 h1:PD5bO github.com/tribalwarshelp/golang-sdk v0.0.0-20200625131004-06b44e214642/go.mod h1:dM2bGl7OxfsejbDu+TSFie8XS1XD1WBc1/dEqbIRLUk= github.com/tribalwarshelp/golang-sdk v0.0.0-20200629130313-0880d8996ba6 h1:+C127PqJZY5xS1gyWQAaSblxnktBxnFISzHsnEjPj0s= github.com/tribalwarshelp/golang-sdk v0.0.0-20200629130313-0880d8996ba6/go.mod h1:J1nwE1gYoP8LJkb1sbL3OGqTp7u8RJZGpsKHYjS3+0Y= +github.com/tribalwarshelp/golang-sdk v0.0.0-20200709112050-ba3a7ba145b1 h1:p+/OHcQQYXCmxjG+YTkXfeL4Oxku7t6sW0KK2Ne85V4= +github.com/tribalwarshelp/golang-sdk v0.0.0-20200709112050-ba3a7ba145b1/go.mod h1:jQWbuz96EMQTuxhanSY1imtK4zEjPrB1cM5wCKkk7l4= github.com/tribalwarshelp/shared v0.0.0-20200623144748-aa834a01dce6 h1:WZ1oxHysFtiPjHa2ADUqiGrzwcN3j0YpiVg/V2e/74o= github.com/tribalwarshelp/shared v0.0.0-20200623144748-aa834a01dce6/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y= github.com/tribalwarshelp/shared v0.0.0-20200625120510-6d18ee334662/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y= @@ -114,6 +116,8 @@ github.com/tribalwarshelp/shared v0.0.0-20200625131045-74c5a9b3b4f0 h1:k1j0Nh2OI github.com/tribalwarshelp/shared v0.0.0-20200625131045-74c5a9b3b4f0/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y= github.com/tribalwarshelp/shared v0.0.0-20200629123803-0cd6cb6f1e87 h1:TMuZUk0wW+8dXSGVJVLRFFhLONKKYJRnLBFvbb9XTrE= github.com/tribalwarshelp/shared v0.0.0-20200629123803-0cd6cb6f1e87/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y= +github.com/tribalwarshelp/shared v0.0.0-20200707075151-722e4a520a3c h1:wenSReGHPux51q5s+9Ji0TOHCt8Zx6whxsjx8Iv7aZg= +github.com/tribalwarshelp/shared v0.0.0-20200707075151-722e4a520a3c/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y= github.com/vmihailenco/bufpool v0.1.5/go.mod h1:fL9i/PRTuS7AELqAHwSU1Zf1c70xhkhGe/cD5ud9pJk= github.com/vmihailenco/bufpool v0.1.11 h1:gOq2WmBrq0i2yW5QJ16ykccQ4wH9UyEsgLm6czKAd94= github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ= diff --git a/models/observation.go b/models/observation.go index 705e65d..c7cce2d 100644 --- a/models/observation.go +++ b/models/observation.go @@ -1,16 +1,21 @@ package models -import "time" +import ( + "time" + + shared_models "github.com/tribalwarshelp/shared/models" +) type Observation struct { tableName struct{} `pg:",alias:observation"` - ID int `json:"id" gqlgen:"id"` - Server string `pg:"unique:group_1,use_zero" json:"server" gqlgen:"server"` - TribeID int `pg:"unique:group_1,use_zero" json:"tribeID" gqlgen:"tribeID"` - GroupID int `pg:"on_delete:CASCADE,unique:group_1,use_zero" json:"groupID" gqlgen:"groupID"` - Group *Group `json:"group,omitempty" gqlgen:"group"` - CreatedAt time.Time `pg:"default:now()" json:"createdAt" gqlgen:"createdAt" xml:"createdAt"` + ID int `json:"id" gqlgen:"id"` + Server string `pg:"unique:group_1,use_zero" json:"server" gqlgen:"server"` + TribeID int `pg:"unique:group_1,use_zero" json:"tribeID" gqlgen:"tribeID"` + Tribe *shared_models.Tribe `pg:"-"` + GroupID int `pg:"on_delete:CASCADE,unique:group_1,use_zero" json:"groupID" gqlgen:"groupID"` + Group *Group `json:"group,omitempty" gqlgen:"group"` + CreatedAt time.Time `pg:"default:now()" json:"createdAt" gqlgen:"createdAt" xml:"createdAt"` } type Observations []*Observation diff --git a/utils/find_lang_version_by_tag.go b/utils/find_lang_version_by_tag.go new file mode 100644 index 0000000..e7d71d4 --- /dev/null +++ b/utils/find_lang_version_by_tag.go @@ -0,0 +1,14 @@ +package utils + +import "github.com/tribalwarshelp/shared/models" + +func FindLangVersionByTag(langVersions []*models.LangVersion, tag models.LanguageTag) *models.LangVersion { + lv := &models.LangVersion{} + for _, langVersion := range langVersions { + if langVersion.Tag == tag { + lv = langVersion + break + } + } + return lv +}