commit
ec2b884236
|
@ -1,4 +1,5 @@
|
|||
.env.development
|
||||
.env.production
|
||||
.env
|
||||
.netrc
|
||||
.netrc
|
||||
todo.sql
|
|
@ -6,6 +6,7 @@ import (
|
|||
"github.com/tribalwarshelp/golang-sdk/sdk"
|
||||
|
||||
"github.com/tribalwarshelp/dcbot/discord"
|
||||
"github.com/tribalwarshelp/dcbot/group"
|
||||
"github.com/tribalwarshelp/dcbot/observation"
|
||||
"github.com/tribalwarshelp/dcbot/server"
|
||||
|
||||
|
@ -16,6 +17,7 @@ type Config struct {
|
|||
ServerRepo server.Repository
|
||||
ObservationRepo observation.Repository
|
||||
Discord *discord.Session
|
||||
GroupRepo group.Repository
|
||||
API *sdk.SDK
|
||||
}
|
||||
|
||||
|
@ -24,12 +26,13 @@ func Attach(c *cron.Cron, cfg Config) {
|
|||
lastEnnoblementAt: make(map[string]time.Time),
|
||||
serverRepo: cfg.ServerRepo,
|
||||
observationRepo: cfg.ObservationRepo,
|
||||
groupRepo: cfg.GroupRepo,
|
||||
discord: cfg.Discord,
|
||||
api: cfg.API,
|
||||
}
|
||||
c.AddFunc("@every 1m", h.checkLastEnnoblements)
|
||||
c.AddFunc("@every 30m", h.checkBotMembershipOnServers)
|
||||
c.AddFunc("@every 2h", h.deleteClosedTribalWarsServers)
|
||||
c.AddFunc("@every 2h10m", h.deleteClosedTribalWarsServers)
|
||||
go func() {
|
||||
h.checkBotMembershipOnServers()
|
||||
h.deleteClosedTribalWarsServers()
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
shared_models "github.com/tribalwarshelp/shared/models"
|
||||
|
||||
"github.com/tribalwarshelp/dcbot/discord"
|
||||
"github.com/tribalwarshelp/dcbot/group"
|
||||
"github.com/tribalwarshelp/dcbot/models"
|
||||
"github.com/tribalwarshelp/dcbot/observation"
|
||||
"github.com/tribalwarshelp/dcbot/server"
|
||||
|
@ -19,14 +20,15 @@ type handler struct {
|
|||
lastEnnoblementAt map[string]time.Time
|
||||
serverRepo server.Repository
|
||||
observationRepo observation.Repository
|
||||
groupRepo group.Repository
|
||||
discord *discord.Session
|
||||
api *sdk.SDK
|
||||
}
|
||||
|
||||
func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
|
||||
func (h *handler) loadEnnoblements(servers []string) map[string]ennoblements {
|
||||
m := make(map[string]ennoblements)
|
||||
|
||||
for _, w := range worlds {
|
||||
for _, w := range servers {
|
||||
es, err := h.api.LiveEnnoblements.Browse(w, &sdk.LiveEnnoblementInclude{
|
||||
NewOwner: true,
|
||||
Village: true,
|
||||
|
@ -60,11 +62,11 @@ func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
|
|||
return m
|
||||
}
|
||||
|
||||
func (h *handler) loadLangVersions(worlds []string) map[shared_models.LanguageTag]*shared_models.LangVersion {
|
||||
func (h *handler) loadLangVersions(servers []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.LanguageTagFromWorldName(world)
|
||||
for _, server := range servers {
|
||||
languageTag := utils.LanguageTagFromWorldName(server)
|
||||
if languageTag.IsValid() && !cache[languageTag] {
|
||||
cache[languageTag] = true
|
||||
languageTags = append(languageTags, languageTag)
|
||||
|
@ -87,77 +89,71 @@ func (h *handler) loadLangVersions(worlds []string) map[shared_models.LanguageTa
|
|||
}
|
||||
|
||||
func (h *handler) checkLastEnnoblements() {
|
||||
worlds, err := h.observationRepo.FetchWorlds(context.Background())
|
||||
start := time.Now()
|
||||
|
||||
servers, err := h.observationRepo.FetchServers(context.Background())
|
||||
if err != nil {
|
||||
log.Print("checkLastEnnoblements error: " + err.Error())
|
||||
return
|
||||
}
|
||||
log.Print("checkLastEnnoblements: worlds: ", worlds)
|
||||
log.Print("checkLastEnnoblements: servers: ", servers)
|
||||
|
||||
servers, total, err := h.serverRepo.Fetch(context.Background(), nil)
|
||||
groups, total, err := h.groupRepo.Fetch(context.Background(), nil)
|
||||
if err != nil {
|
||||
log.Print("checkLastEnnoblements error: " + err.Error())
|
||||
return
|
||||
}
|
||||
log.Print("checkLastEnnoblements: number of loaded discord servers: ", total)
|
||||
log.Print("checkLastEnnoblements: number of loaded groups: ", total)
|
||||
|
||||
langVersions := h.loadLangVersions(worlds)
|
||||
ennoblementsByServerKey := h.loadEnnoblements(worlds)
|
||||
langVersions := h.loadLangVersions(servers)
|
||||
ennoblementsByServerKey := h.loadEnnoblements(servers)
|
||||
|
||||
for _, server := range servers {
|
||||
if server.ConqueredVillagesChannelID == "" && server.LostVillagesChannelID == "" {
|
||||
for _, group := range groups {
|
||||
if group.ConqueredVillagesChannelID == "" && group.LostVillagesChannelID == "" {
|
||||
continue
|
||||
}
|
||||
for _, tribe := range server.Observations {
|
||||
ennoblements, ok := ennoblementsByServerKey[tribe.World]
|
||||
langVersion, ok2 := langVersions[utils.LanguageTagFromWorldName(tribe.World)]
|
||||
for _, observation := range group.Observations {
|
||||
ennoblements, ok := ennoblementsByServerKey[observation.Server]
|
||||
langVersion, ok2 := langVersions[utils.LanguageTagFromWorldName(observation.Server)]
|
||||
if ok && ok2 {
|
||||
if server.LostVillagesChannelID != "" {
|
||||
for _, ennoblement := range ennoblements.getLostVillagesByTribe(tribe.TribeID) {
|
||||
if group.LostVillagesChannelID != "" {
|
||||
for _, ennoblement := range ennoblements.getLostVillagesByTribe(observation.TribeID) {
|
||||
if !isPlayerTribeNil(ennoblement.NewOwner) &&
|
||||
server.Observations.Contains(tribe.World, ennoblement.NewOwner.Tribe.ID) {
|
||||
group.Observations.Contains(observation.Server, ennoblement.NewOwner.Tribe.ID) {
|
||||
continue
|
||||
}
|
||||
newMsgDataConfig := newMessageDataConfig{
|
||||
newMsgDataConfig := newMessageConfig{
|
||||
host: langVersion.Host,
|
||||
world: tribe.World,
|
||||
server: observation.Server,
|
||||
ennoblement: ennoblement,
|
||||
t: messageTypeLost,
|
||||
}
|
||||
msgData := newMessageData(newMsgDataConfig)
|
||||
h.discord.SendEmbed(server.LostVillagesChannelID,
|
||||
discord.
|
||||
NewEmbed().
|
||||
SetTitle("Stracona wioska").
|
||||
AddField(msgData.world, formatMsgAboutVillageLost(msgData)).
|
||||
SetTimestamp(msgData.date).
|
||||
MessageEmbed)
|
||||
msg := newMessage(newMsgDataConfig)
|
||||
h.discord.SendEmbed(group.LostVillagesChannelID, msg.toEmbed())
|
||||
}
|
||||
}
|
||||
|
||||
if server.ConqueredVillagesChannelID != "" {
|
||||
for _, ennoblement := range ennoblements.getConqueredVillagesByTribe(tribe.TribeID) {
|
||||
if group.ConqueredVillagesChannelID != "" {
|
||||
for _, ennoblement := range ennoblements.getConqueredVillagesByTribe(observation.TribeID) {
|
||||
if !isPlayerTribeNil(ennoblement.OldOwner) &&
|
||||
server.Observations.Contains(tribe.World, ennoblement.OldOwner.Tribe.ID) {
|
||||
group.Observations.Contains(observation.Server, ennoblement.OldOwner.Tribe.ID) {
|
||||
continue
|
||||
}
|
||||
newMsgDataConfig := newMessageDataConfig{
|
||||
newMsgDataConfig := newMessageConfig{
|
||||
host: langVersion.Host,
|
||||
world: tribe.World,
|
||||
server: observation.Server,
|
||||
ennoblement: ennoblement,
|
||||
t: messageTypeConquer,
|
||||
}
|
||||
msgData := newMessageData(newMsgDataConfig)
|
||||
h.discord.SendEmbed(server.ConqueredVillagesChannelID,
|
||||
discord.
|
||||
NewEmbed().
|
||||
SetTitle("Podbita wioska").
|
||||
AddField(msgData.world, formatMsgAboutVillageConquest(msgData)).
|
||||
SetTimestamp(msgData.date).
|
||||
MessageEmbed)
|
||||
msg := newMessage(newMsgDataConfig)
|
||||
h.discord.SendEmbed(group.ConqueredVillagesChannelID, msg.toEmbed())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("checkLastEnnoblements: finished in %s", time.Since(start).String())
|
||||
}
|
||||
|
||||
func (h *handler) checkBotMembershipOnServers() {
|
||||
|
@ -188,7 +184,7 @@ func (h *handler) checkBotMembershipOnServers() {
|
|||
}
|
||||
|
||||
func (h *handler) deleteClosedTribalWarsServers() {
|
||||
servers, err := h.observationRepo.FetchWorlds(context.Background())
|
||||
servers, err := h.observationRepo.FetchServers(context.Background())
|
||||
if err != nil {
|
||||
log.Print("deleteClosedTribalWarsServers: " + err.Error())
|
||||
return
|
||||
|
@ -214,7 +210,7 @@ func (h *handler) deleteClosedTribalWarsServers() {
|
|||
|
||||
if len(keys) > 0 {
|
||||
deleted, err := h.observationRepo.Delete(context.Background(), &models.ObservationFilter{
|
||||
World: keys,
|
||||
Server: keys,
|
||||
})
|
||||
if err != nil {
|
||||
log.Print("deleteClosedTribalWarsServers error: " + err.Error())
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package cron
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
shared_models "github.com/tribalwarshelp/shared/models"
|
||||
|
@ -33,10 +34,9 @@ func formatDateOfConquest(t time.Time) string {
|
|||
return t.Format(time.RFC3339)
|
||||
}
|
||||
|
||||
func getLocation(timezone string) *time.Location {
|
||||
loc, err := time.LoadLocation(timezone)
|
||||
if err != nil {
|
||||
return time.UTC
|
||||
func formatMsgLink(text string, url string) string {
|
||||
if url == "" {
|
||||
return text
|
||||
}
|
||||
return loc
|
||||
return fmt.Sprintf("[``%s``](%s)", text, url)
|
||||
}
|
||||
|
|
|
@ -3,18 +3,24 @@ package cron
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"github.com/tribalwarshelp/dcbot/discord"
|
||||
"github.com/tribalwarshelp/dcbot/utils"
|
||||
shared_models "github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type messageType string
|
||||
|
||||
const (
|
||||
endpointTribeProfile = "/game.php?screen=info_ally&id=%d"
|
||||
endpointPlayerProfile = "/game.php?screen=info_player&id=%d"
|
||||
endpointVillageProfile = "/game.php?screen=info_village&id=%d"
|
||||
messageTypeConquer messageType = "conquer"
|
||||
messageTypeLost messageType = "lost"
|
||||
colorLostVillage = 0xff0000
|
||||
colorConqueredVillage = 0x00ff00
|
||||
)
|
||||
|
||||
type messageData struct {
|
||||
world string
|
||||
type message struct {
|
||||
t messageType
|
||||
server string
|
||||
date string
|
||||
village string
|
||||
villageURL string
|
||||
|
@ -28,16 +34,18 @@ type messageData struct {
|
|||
newOwnerTribeTag string
|
||||
}
|
||||
|
||||
type newMessageDataConfig struct {
|
||||
type newMessageConfig struct {
|
||||
t messageType
|
||||
host string
|
||||
world string
|
||||
server string
|
||||
ennoblement *shared_models.LiveEnnoblement
|
||||
}
|
||||
|
||||
func newMessageData(cfg newMessageDataConfig) messageData {
|
||||
data := messageData{
|
||||
func newMessage(cfg newMessageConfig) message {
|
||||
data := message{
|
||||
t: cfg.t,
|
||||
date: formatDateOfConquest(cfg.ennoblement.EnnobledAt),
|
||||
world: cfg.world,
|
||||
server: cfg.server,
|
||||
village: "-",
|
||||
oldOwnerName: "-",
|
||||
oldOwnerTribeTag: "-",
|
||||
|
@ -50,48 +58,61 @@ func newMessageData(cfg newMessageDataConfig) messageData {
|
|||
cfg.ennoblement.Village.X,
|
||||
cfg.ennoblement.Village.Y,
|
||||
cfg.ennoblement.Village.Continent())
|
||||
data.villageURL = utils.FormatVillageURL(cfg.world, cfg.host, cfg.ennoblement.Village.ID)
|
||||
data.villageURL = utils.FormatVillageURL(cfg.server, cfg.host, cfg.ennoblement.Village.ID)
|
||||
}
|
||||
if !isPlayerNil(cfg.ennoblement.OldOwner) {
|
||||
data.oldOwnerName = cfg.ennoblement.OldOwner.Name
|
||||
data.oldOwnerURL = utils.FormatPlayerURL(cfg.world, cfg.host, cfg.ennoblement.OldOwner.ID)
|
||||
data.oldOwnerURL = utils.FormatPlayerURL(cfg.server, cfg.host, cfg.ennoblement.OldOwner.ID)
|
||||
}
|
||||
if !isPlayerTribeNil(cfg.ennoblement.OldOwner) {
|
||||
data.oldOwnerTribeTag = cfg.ennoblement.OldOwner.Tribe.Tag
|
||||
data.oldOwnerTribeURL = utils.FormatTribeURL(cfg.world, cfg.host, cfg.ennoblement.OldOwner.Tribe.ID)
|
||||
data.oldOwnerTribeURL = utils.FormatTribeURL(cfg.server, cfg.host, cfg.ennoblement.OldOwner.Tribe.ID)
|
||||
}
|
||||
if !isPlayerNil(cfg.ennoblement.NewOwner) {
|
||||
data.newOwnerName = cfg.ennoblement.NewOwner.Name
|
||||
data.newOwnerURL = utils.FormatPlayerURL(cfg.world, cfg.host, cfg.ennoblement.NewOwner.ID)
|
||||
data.newOwnerURL = utils.FormatPlayerURL(cfg.server, cfg.host, cfg.ennoblement.NewOwner.ID)
|
||||
}
|
||||
if !isPlayerTribeNil(cfg.ennoblement.NewOwner) {
|
||||
data.newOwnerTribeTag = cfg.ennoblement.NewOwner.Tribe.Tag
|
||||
data.newOwnerTribeURL = utils.FormatTribeURL(cfg.world, cfg.host, cfg.ennoblement.NewOwner.Tribe.ID)
|
||||
data.newOwnerTribeURL = utils.FormatTribeURL(cfg.server, cfg.host, cfg.ennoblement.NewOwner.Tribe.ID)
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
func formatMsgLink(text string, url string) string {
|
||||
if url == "" {
|
||||
return text
|
||||
}
|
||||
return fmt.Sprintf("[``%s``](%s)", text, url)
|
||||
}
|
||||
|
||||
func formatMsgAboutVillageLost(msgData messageData) string {
|
||||
func (msg message) formatMsgAboutVillageLost() string {
|
||||
return fmt.Sprintf(`Wioska %s gracza %s (%s) została stracona na rzecz %s (%s)`,
|
||||
formatMsgLink(msgData.village, msgData.villageURL),
|
||||
formatMsgLink(msgData.oldOwnerName, msgData.oldOwnerURL),
|
||||
formatMsgLink(msgData.oldOwnerTribeTag, msgData.oldOwnerTribeURL),
|
||||
formatMsgLink(msgData.newOwnerName, msgData.newOwnerURL),
|
||||
formatMsgLink(msgData.newOwnerTribeTag, msgData.newOwnerTribeURL))
|
||||
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 formatMsgAboutVillageConquest(msgData messageData) string {
|
||||
func (msg message) formatMsgAboutVillageConquest() string {
|
||||
return fmt.Sprintf("Gracz %s (%s) podbił wioskę %s od gracza %s (%s)",
|
||||
formatMsgLink(msgData.newOwnerName, msgData.newOwnerURL),
|
||||
formatMsgLink(msgData.newOwnerTribeTag, msgData.newOwnerTribeURL),
|
||||
formatMsgLink(msgData.village, msgData.villageURL),
|
||||
formatMsgLink(msgData.oldOwnerName, msgData.oldOwnerURL),
|
||||
formatMsgLink(msgData.oldOwnerTribeTag, msgData.oldOwnerTribeURL))
|
||||
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) toEmbed() *discordgo.MessageEmbed {
|
||||
title := "Podbita wioska"
|
||||
fieldContent := msg.formatMsgAboutVillageConquest()
|
||||
color := colorConqueredVillage
|
||||
if msg.t == messageTypeLost {
|
||||
title = "Stracona wioska"
|
||||
fieldContent = msg.formatMsgAboutVillageLost()
|
||||
color = colorLostVillage
|
||||
}
|
||||
|
||||
return discord.
|
||||
NewEmbed().
|
||||
SetTitle(title).
|
||||
AddField(msg.server, fieldContent).
|
||||
SetTimestamp(msg.date).
|
||||
SetColor(color).
|
||||
MessageEmbed
|
||||
}
|
||||
|
|
|
@ -0,0 +1,498 @@
|
|||
package discord
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"github.com/tribalwarshelp/dcbot/models"
|
||||
shared_models "github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
const (
|
||||
ObservationsPerGroup = 10
|
||||
GroupsPerServer = 5
|
||||
)
|
||||
|
||||
const (
|
||||
AddGroupCommand Command = "addgroup"
|
||||
DeleteGroupCommand Command = "deletegroup"
|
||||
GroupsCommand Command = "groups"
|
||||
ObserveCommand Command = "observe"
|
||||
ObservationsCommand Command = "observations"
|
||||
UnObserveCommand Command = "unobserve"
|
||||
LostVillagesCommand Command = "lostvillages"
|
||||
UnObserveLostVillagesCommand Command = "unobservelostvillages"
|
||||
ConqueredVillagesCommand Command = "conqueredvillages"
|
||||
UnObserveConqueredVillagesCommand Command = "unobserveconqueredvillages"
|
||||
)
|
||||
|
||||
func (s *Session) handleAddGroupCommand(m *discordgo.MessageCreate) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
server := &models.Server{
|
||||
ID: m.GuildID,
|
||||
}
|
||||
if err := s.cfg.ServerRepository.Store(context.Background(), server); err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Nie udało się dodać grupy", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
if len(server.Groups) >= GroupsPerServer {
|
||||
s.SendMessage(m.ChannelID,
|
||||
m.Author.Mention()+fmt.Sprintf(` Osiągnięto limit grup na serwerze (%d/%d).`, GroupsPerServer, GroupsPerServer))
|
||||
return
|
||||
}
|
||||
|
||||
group := &models.Group{
|
||||
ServerID: m.GuildID,
|
||||
}
|
||||
if err := s.cfg.GroupRepository.Store(context.Background(), group); err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Nie udało się dodać grupy", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Utworzono nową grupę o ID %d.", m.Author.Mention(), group.ID))
|
||||
}
|
||||
func (s *Session) handleDeleteGroupCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 1 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[1:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 1 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [id grupy]",
|
||||
m.Author.Mention(),
|
||||
DeleteGroupCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Niepoprawne ID grupy (powinna to być liczba całkowita większa od 1).", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
go s.cfg.GroupRepository.Delete(context.Background(), &models.GroupFilter{
|
||||
ID: []int{groupID},
|
||||
ServerID: []string{m.GuildID},
|
||||
})
|
||||
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Usunięto grupę.", m.Author.Mention()))
|
||||
}
|
||||
|
||||
func (s *Session) handleGroupsCommand(m *discordgo.MessageCreate) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
groups, _, err := s.cfg.GroupRepository.Fetch(context.Background(), &models.GroupFilter{
|
||||
ServerID: []string{m.GuildID},
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
msg := ""
|
||||
for i, groups := range groups {
|
||||
msg += fmt.Sprintf("**%d** | %d\n", i+1, groups.ID)
|
||||
}
|
||||
|
||||
if msg == "" {
|
||||
msg = "Brak dodanych grup"
|
||||
}
|
||||
|
||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||
SetTitle("Lista grup").
|
||||
AddField("Indeks | ID", msg).
|
||||
SetFooter("Strona 1 z 1").
|
||||
MessageEmbed)
|
||||
}
|
||||
|
||||
func (s *Session) handleConqueredVillagesCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 1 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[1:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 1 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [id grupy]",
|
||||
m.Author.Mention(),
|
||||
ConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Niepoprawne ID grupy (powinna to być liczba całkowita większa od 1).", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
groups, _, err := s.cfg.GroupRepository.Fetch(context.Background(), &models.GroupFilter{
|
||||
ID: []int{groupID},
|
||||
ServerID: []string{m.GuildID},
|
||||
})
|
||||
if err != nil || len(groups) == 0 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s nie znaleziono grupy.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
groups[0].ConqueredVillagesChannelID = m.ChannelID
|
||||
go s.cfg.GroupRepository.Update(context.Background(), groups[0])
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Pomyślnie zmieniono kanał na którym będą się wyświetlać informacje o podbitych wioskach (Grupa: %d).",
|
||||
m.Author.Mention(), groupID))
|
||||
}
|
||||
|
||||
func (s *Session) handleUnObserveConqueredVillagesCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 1 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[1:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 1 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [id grupy]",
|
||||
m.Author.Mention(),
|
||||
UnObserveConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Niepoprawne ID grupy (powinna to być liczba całkowita większa od 1).", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
groups, _, err := s.cfg.GroupRepository.Fetch(context.Background(), &models.GroupFilter{
|
||||
ID: []int{groupID},
|
||||
ServerID: []string{m.GuildID},
|
||||
})
|
||||
if err != nil || len(groups) == 0 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s nie znaleziono grupy.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
if groups[0].ConqueredVillagesChannelID != "" {
|
||||
groups[0].ConqueredVillagesChannelID = ""
|
||||
go s.cfg.GroupRepository.Update(context.Background(), groups[0])
|
||||
}
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Informacje o podbitych wioskach grupy %d nie będą się już pojawiały.", m.Author.Mention(), groupID))
|
||||
}
|
||||
|
||||
func (s *Session) handleLostVillagesCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 1 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[1:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 1 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [id grupy]",
|
||||
m.Author.Mention(),
|
||||
LostVillagesCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Niepoprawne ID grupy", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
groups, _, err := s.cfg.GroupRepository.Fetch(context.Background(), &models.GroupFilter{
|
||||
ID: []int{groupID},
|
||||
ServerID: []string{m.GuildID},
|
||||
})
|
||||
if err != nil || len(groups) == 0 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Nie znaleziono grupy.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
groups[0].LostVillagesChannelID = m.ChannelID
|
||||
go s.cfg.GroupRepository.Update(context.Background(), groups[0])
|
||||
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Pomyślnie zmieniono kanał na którym będą się wyświetlać informacje o straconych wioskach (Grupa: %d).",
|
||||
m.Author.Mention(),
|
||||
groupID))
|
||||
}
|
||||
|
||||
func (s *Session) handleUnObserveLostVillagesCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 1 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[1:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 1 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [id grupy]",
|
||||
m.Author.Mention(),
|
||||
UnObserveLostVillagesCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Niepoprawne ID grupy", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
groups, _, err := s.cfg.GroupRepository.Fetch(context.Background(), &models.GroupFilter{
|
||||
ID: []int{groupID},
|
||||
ServerID: []string{m.GuildID},
|
||||
})
|
||||
if err != nil || len(groups) == 0 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Nie znaleziono grupy.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
if groups[0].LostVillagesChannelID != "" {
|
||||
groups[0].LostVillagesChannelID = ""
|
||||
go s.cfg.GroupRepository.Update(context.Background(), groups[0])
|
||||
}
|
||||
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Informacje o straconych wioskach grupy %d nie będą się już pojawiały.",
|
||||
m.Author.Mention(),
|
||||
groupID))
|
||||
}
|
||||
|
||||
func (s *Session) handleObserveCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 3 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[3:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 3 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [id grupy] [świat] [id plemienia]",
|
||||
m.Author.Mention(),
|
||||
ObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s ID grupy powinno być liczbą całkowitą większą od 0.",
|
||||
m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
serverKey := args[1]
|
||||
tribeID, err := strconv.Atoi(args[2])
|
||||
if err != nil || tribeID <= 0 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s ID plemienia powinno być liczbą całkowitą większą od 0.",
|
||||
m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
server, err := s.cfg.API.Servers.Read(serverKey, nil)
|
||||
if err != nil || server == nil {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` świat %s jest nieobsługiwany.`, serverKey))
|
||||
return
|
||||
}
|
||||
if server.Status == shared_models.ServerStatusClosed {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` świat %s jest zamknięty.`, serverKey))
|
||||
return
|
||||
}
|
||||
|
||||
tribe, err := s.cfg.API.Tribes.Read(server.Key, tribeID)
|
||||
if err != nil || tribe == nil {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` Plemię o ID: %d nie istnieje na świecie %s.`, tribeID, server.Key))
|
||||
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
|
||||
}
|
||||
|
||||
if len(group.Observations) >= ObservationsPerGroup {
|
||||
s.SendMessage(m.ChannelID,
|
||||
m.Author.Mention()+fmt.Sprintf(` Osiągnięto limit plemion w grupie (%d/%d).`, ObservationsPerGroup, ObservationsPerGroup))
|
||||
return
|
||||
}
|
||||
|
||||
err = s.cfg.ObservationRepository.Store(context.Background(), &models.Observation{
|
||||
Server: server.Key,
|
||||
TribeID: tribeID,
|
||||
GroupID: groupID,
|
||||
})
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+` Nie udało się dodać plemienia do obserwowanych.`)
|
||||
return
|
||||
}
|
||||
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+` Dodano.`)
|
||||
}
|
||||
|
||||
func (s *Session) handleUnObserveCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 2 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[2:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 2 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf(`%s %s [id grupy] [id obserwacji]`,
|
||||
m.Author.Mention(),
|
||||
UnObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf(`%s ID grupy powinno być liczbą całkowitą większą od 0.`,
|
||||
m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
observationID, err := strconv.Atoi(args[1])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf(`%s ID obserwacji powinno być liczbą całkowitą większą od 0.`,
|
||||
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
|
||||
}
|
||||
|
||||
go s.cfg.ObservationRepository.Delete(context.Background(), &models.ObservationFilter{
|
||||
GroupID: []int{groupID},
|
||||
ID: []int{observationID},
|
||||
})
|
||||
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+` Usunięto.`)
|
||||
}
|
||||
|
||||
func (s *Session) handleObservationsCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 1 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[1:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 1 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf(`%s %s [id grupy]`,
|
||||
m.Author.Mention(),
|
||||
ObservationsCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
groupID, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf(`%s ID grupy powinno być liczbą całkowitą większą od 0.`,
|
||||
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 {
|
||||
return
|
||||
}
|
||||
|
||||
msg := ""
|
||||
for i, observation := range observations {
|
||||
msg += fmt.Sprintf("**%d** | %d - %s - %d\n", i+1, observation.ID, observation.Server, observation.TribeID)
|
||||
}
|
||||
|
||||
if msg == "" {
|
||||
msg = "Brak dodanych obserwacji do tej grupy"
|
||||
}
|
||||
|
||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||
SetTitle("Lista obserwowanych plemion").
|
||||
AddField("Indeks | ID - Serwer - ID plemienia", msg).
|
||||
SetFooter("Strona 1 z 1").
|
||||
MessageEmbed)
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package discord
|
||||
|
||||
type Command string
|
||||
|
||||
func (cmd Command) String() string {
|
||||
return string(cmd)
|
||||
}
|
||||
|
||||
func (cmd Command) WithPrefix(prefix string) string {
|
||||
return prefix + cmd.String()
|
||||
}
|
|
@ -1,471 +0,0 @@
|
|||
package discord
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"strconv"
|
||||
|
||||
shared_models "github.com/tribalwarshelp/shared/models"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"github.com/tribalwarshelp/dcbot/models"
|
||||
"github.com/tribalwarshelp/dcbot/utils"
|
||||
"github.com/tribalwarshelp/golang-sdk/sdk"
|
||||
)
|
||||
|
||||
const (
|
||||
ObservationsPerServer = 10
|
||||
)
|
||||
|
||||
type Command string
|
||||
|
||||
const (
|
||||
HelpCommand Command = "help"
|
||||
ObserveCommand Command = "observe"
|
||||
ObservationsCommand Command = "observations"
|
||||
UnObserveCommand Command = "unobserve"
|
||||
LostVillagesCommand Command = "lostvillages"
|
||||
UnObserveLostVillagesCommand Command = "unobservelostvillages"
|
||||
ConqueredVillagesCommand Command = "conqueredvillages"
|
||||
UnObserveConqueredVillagesCommand Command = "unobserveconqueredvillages"
|
||||
TribeCommand Command = "tribe"
|
||||
TopAttCommand Command = "topatt"
|
||||
TopDefCommand Command = "topdef"
|
||||
TopSuppCommand Command = "topsupp"
|
||||
TopTotalCommand Command = "toptotal"
|
||||
TopPointsCommand Command = "toppoints"
|
||||
AuthorCommand Command = "author"
|
||||
)
|
||||
|
||||
func (cmd Command) String() string {
|
||||
return string(cmd)
|
||||
}
|
||||
|
||||
func (cmd Command) WithPrefix(prefix string) string {
|
||||
return prefix + cmd.String()
|
||||
}
|
||||
|
||||
func (s *Session) handleHelpCommand(m *discordgo.MessageCreate) {
|
||||
tribeCMDWithPrefix := TribeCommand.WithPrefix(s.cfg.CommandPrefix)
|
||||
commandsForAll := fmt.Sprintf(`
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największym RA z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największym RO z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największym RW z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największej liczbie pokonanych z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największej liczbie punktów z plemion o podanych id
|
||||
- **%s** - kontakt z autorem bota
|
||||
`,
|
||||
tribeCMDWithPrefix,
|
||||
TopAttCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopDefCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopSuppCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopTotalCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopPointsCommand.String(),
|
||||
AuthorCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
)
|
||||
|
||||
commandsForGuildAdmins := fmt.Sprintf(`
|
||||
- **%s** [świat] [id] - dodaje plemię z danego świata do obserwowanych
|
||||
- **%s** - wyświetla wszystkie obserwowane plemiona
|
||||
- **%s** [id z %s] - usuwa plemię z obserwowanych
|
||||
- **%s** - ustawia kanał na którym będą wyświetlać się informacje o podbitych wioskach
|
||||
- **%s** - informacje o podbitych wioskach na wybranym kanale nie będą się już pojawiały
|
||||
- **%s** - ustawia kanał na którym będą wyświetlać się informacje o straconych wioskach
|
||||
- **%s** - informacje o straconych wioskach na wybranym kanale nie będą się już pojawiały
|
||||
`,
|
||||
ObserveCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
ObservationsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
UnObserveCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
ObservationsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
ConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
UnObserveConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
LostVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
UnObserveLostVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
)
|
||||
|
||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||
SetTitle("Pomoc").
|
||||
SetDescription("Komendy oferowane przez bota").
|
||||
AddField("Dla wszystkich", commandsForAll).
|
||||
AddField("Dla adminów", commandsForGuildAdmins).
|
||||
MessageEmbed)
|
||||
}
|
||||
|
||||
func (s *Session) handleAuthorCommand(m *discordgo.MessageCreate) {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Discord: Kichiyaki#2064.", m.Author.Mention()))
|
||||
}
|
||||
|
||||
func (s *Session) handleTribeCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
argsLength := len(args)
|
||||
if argsLength < 4 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Niepoprawna komenda (sprawdź %s)",
|
||||
m.Author.Mention(),
|
||||
HelpCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
command := Command(args[0])
|
||||
world := args[1]
|
||||
page, err := strconv.Atoi(args[2])
|
||||
if err != nil || page <= 0 {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s 3 argument musi być liczbą większą od 0.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
ids := []int{}
|
||||
for _, arg := range args[3:argsLength] {
|
||||
id, err := strconv.Atoi(arg)
|
||||
if err != nil || id <= 0 {
|
||||
continue
|
||||
}
|
||||
ids = append(ids, id)
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Nie wprowadziłeś ID plemion.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
exists := true
|
||||
limit := 10
|
||||
offset := (page - 1) * limit
|
||||
filter := &shared_models.PlayerFilter{
|
||||
Exists: &exists,
|
||||
TribeID: ids,
|
||||
Limit: limit,
|
||||
Offset: offset,
|
||||
}
|
||||
title := ""
|
||||
switch command {
|
||||
case TopAttCommand:
|
||||
filter.RankAttGTE = 1
|
||||
filter.Sort = "rankAtt ASC"
|
||||
title = "Top pokonani w ataku"
|
||||
case TopDefCommand:
|
||||
filter.RankDefGTE = 1
|
||||
filter.Sort = "rankDef ASC"
|
||||
title = "Top pokonani w obronie"
|
||||
case TopSuppCommand:
|
||||
filter.RankSupGTE = 1
|
||||
filter.Sort = "rankSup ASC"
|
||||
title = "Top pokonani jako wspierający"
|
||||
case TopTotalCommand:
|
||||
filter.RankTotalGTE = 1
|
||||
filter.Sort = "rankTotal ASC"
|
||||
title = "Top pokonani ogólnie"
|
||||
case TopPointsCommand:
|
||||
filter.Sort = "rank ASC"
|
||||
title = "Najwięcej punktów"
|
||||
default:
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Nieznana komenda %s (sprawdź %s)",
|
||||
m.Author.Mention(),
|
||||
command.String(),
|
||||
HelpCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
playersList, err := s.cfg.API.Players.Browse(world, filter, &sdk.PlayerInclude{
|
||||
Tribe: true,
|
||||
})
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Wystąpił błąd podczas pobierania danych z API, prosimy spróbować później.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
if playersList == nil || playersList.Total == 0 {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Nie znaleziono graczy należących do plemion o podanych ID.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
totalPages := int(math.Ceil(float64(playersList.Total) / float64(limit)))
|
||||
if page > totalPages {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Przekroczyłeś limit stron (%d/%d).", m.Author.Mention(), page, totalPages))
|
||||
return
|
||||
}
|
||||
|
||||
langTag := utils.LanguageTagFromWorldName(world)
|
||||
langVersion, err := s.cfg.API.LangVersions.Read(langTag)
|
||||
if err != nil || langVersion == nil {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Nie znaleziono wersji językowej: %s.", m.Author.Mention(), langTag))
|
||||
return
|
||||
}
|
||||
|
||||
msg := &EmbedMessage{}
|
||||
for i, player := range playersList.Items {
|
||||
if player == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
rank := 0
|
||||
score := 0
|
||||
switch command {
|
||||
case TopAttCommand:
|
||||
rank = player.RankAtt
|
||||
score = player.ScoreAtt
|
||||
case TopDefCommand:
|
||||
rank = player.RankDef
|
||||
score = player.ScoreDef
|
||||
case TopSuppCommand:
|
||||
rank = player.RankSup
|
||||
score = player.ScoreSup
|
||||
case TopTotalCommand:
|
||||
rank = player.RankTotal
|
||||
score = player.ScoreTotal
|
||||
case TopPointsCommand:
|
||||
rank = player.Rank
|
||||
score = player.Points
|
||||
}
|
||||
|
||||
tribeTag := "-"
|
||||
tribeURL := "-"
|
||||
if player.Tribe != nil {
|
||||
tribeTag = player.Tribe.Tag
|
||||
tribeURL = utils.FormatTribeURL(world, langVersion.Host, player.Tribe.ID)
|
||||
}
|
||||
|
||||
msg.Append(fmt.Sprintf("**%d**. [``%s``](%s) (Plemię: [``%s``](%s) | Ranking ogólny: **%d** | Wynik: **%d**)\n",
|
||||
offset+i+1,
|
||||
player.Name,
|
||||
utils.FormatPlayerURL(world, langVersion.Host, player.ID),
|
||||
tribeTag,
|
||||
tribeURL,
|
||||
rank,
|
||||
score))
|
||||
}
|
||||
|
||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||
SetTitle(title).
|
||||
SetDescription("A oto lista!").
|
||||
SetFields(msg.ToMessageEmbedFields()).
|
||||
SetFooter(fmt.Sprintf("Strona %d z %d", page, totalPages)).
|
||||
MessageEmbed)
|
||||
}
|
||||
|
||||
func (s *Session) handleConqueredVillagesCommand(m *discordgo.MessageCreate) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
server := &models.Server{
|
||||
ID: m.GuildID,
|
||||
}
|
||||
err := s.cfg.ServerRepository.Store(context.Background(), server)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
server.ConqueredVillagesChannelID = m.ChannelID
|
||||
go s.cfg.ServerRepository.Update(context.Background(), server)
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Pomyślnie zmieniono kanał na którym będą się wyświetlać informacje o podbitych wioskach.", m.Author.Mention()))
|
||||
}
|
||||
|
||||
func (s *Session) handleUnObserveConqueredVillagesCommand(m *discordgo.MessageCreate) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
server := &models.Server{
|
||||
ID: m.GuildID,
|
||||
}
|
||||
err := s.cfg.ServerRepository.Store(context.Background(), server)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if server.ConqueredVillagesChannelID != "" {
|
||||
server.ConqueredVillagesChannelID = ""
|
||||
go s.cfg.ServerRepository.Update(context.Background(), server)
|
||||
}
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Informacje o podbitych wioskach nie będą się już pojawiały.", m.Author.Mention()))
|
||||
}
|
||||
|
||||
func (s *Session) handleLostVillagesCommand(m *discordgo.MessageCreate) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
server := &models.Server{
|
||||
ID: m.GuildID,
|
||||
}
|
||||
err := s.cfg.ServerRepository.Store(context.Background(), server)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
server.LostVillagesChannelID = m.ChannelID
|
||||
go s.cfg.ServerRepository.Update(context.Background(), server)
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Pomyślnie zmieniono kanał na którym będą się wyświetlać informacje o straconych wioskach.", m.Author.Mention()))
|
||||
}
|
||||
|
||||
func (s *Session) handleUnObserveLostVillagesCommand(m *discordgo.MessageCreate) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
server := &models.Server{
|
||||
ID: m.GuildID,
|
||||
}
|
||||
err := s.cfg.ServerRepository.Store(context.Background(), server)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if server.LostVillagesChannelID != "" {
|
||||
server.LostVillagesChannelID = ""
|
||||
go s.cfg.ServerRepository.Update(context.Background(), server)
|
||||
}
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Informacje o straconych wioskach nie będą się już pojawiały.", m.Author.Mention()))
|
||||
}
|
||||
|
||||
func (s *Session) handleObserveCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 2 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[2:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 2 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [świat] [id plemienia]",
|
||||
m.Author.Mention(),
|
||||
ObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
world := args[0]
|
||||
id, err := strconv.Atoi(args[1])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s %s [świat] [id plemienia]",
|
||||
m.Author.Mention(),
|
||||
ObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
server, err := s.cfg.API.Servers.Read(world, nil)
|
||||
if err != nil || server == nil {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` świat %s jest nieobsługiwany.`, world))
|
||||
return
|
||||
}
|
||||
if server.Status == shared_models.ServerStatusClosed {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` świat %s jest zamknięty.`, world))
|
||||
return
|
||||
}
|
||||
|
||||
tribe, err := s.cfg.API.Tribes.Read(world, id)
|
||||
if err != nil || tribe == nil {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` Plemię o ID: %d nie istnieje na świecie %s.`, id, world))
|
||||
return
|
||||
}
|
||||
|
||||
dcServer := &models.Server{
|
||||
ID: m.GuildID,
|
||||
}
|
||||
err = s.cfg.ServerRepository.Store(context.Background(), dcServer)
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+` Nie udało się dodać plemienia do obserwowanych.`)
|
||||
return
|
||||
}
|
||||
|
||||
if len(dcServer.Observations) >= ObservationsPerServer {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` Osiągnięto limit plemion (%d/%d).`, ObservationsPerServer, ObservationsPerServer))
|
||||
return
|
||||
}
|
||||
|
||||
err = s.cfg.ObservationRepository.Store(context.Background(), &models.Observation{
|
||||
World: world,
|
||||
TribeID: id,
|
||||
ServerID: dcServer.ID,
|
||||
})
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+` Nie udało się dodać plemienia do obserwowanych.`)
|
||||
return
|
||||
}
|
||||
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+` Dodano.`)
|
||||
}
|
||||
|
||||
func (s *Session) handleUnObserveCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
argsLength := len(args)
|
||||
if argsLength > 1 {
|
||||
s.sendUnknownCommandError(m.Author.Mention(), m.ChannelID, args[1:argsLength]...)
|
||||
return
|
||||
} else if argsLength < 1 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf(`%s %s [id z tw!list]`,
|
||||
m.Author.Mention(),
|
||||
UnObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
id, err := strconv.Atoi(args[0])
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf(`%s %s [id z tw!list]`,
|
||||
m.Author.Mention(),
|
||||
UnObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
go s.cfg.ObservationRepository.Delete(context.Background(), &models.ObservationFilter{
|
||||
ServerID: []string{m.GuildID},
|
||||
ID: []int{id},
|
||||
})
|
||||
|
||||
s.SendMessage(m.ChannelID, m.Author.Mention()+` Usunięto.`)
|
||||
}
|
||||
|
||||
func (s *Session) handleObservationsCommand(m *discordgo.MessageCreate) {
|
||||
if m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
if has, err := s.memberHasPermission(m.GuildID, m.Author.ID, discordgo.PermissionAdministrator); err != nil || !has {
|
||||
return
|
||||
}
|
||||
|
||||
observations, _, err := s.cfg.ObservationRepository.Fetch(context.Background(), &models.ObservationFilter{
|
||||
ServerID: []string{m.GuildID},
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
msg := ""
|
||||
for i, observation := range observations {
|
||||
msg += fmt.Sprintf("**%d**. %d - %s - %d\n", i+1, observation.ID, observation.World, observation.TribeID)
|
||||
}
|
||||
|
||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||
SetTitle("Lista obserwowanych plemion").
|
||||
AddField("Indeks. ID - świat - ID plemienia", msg).
|
||||
SetFooter("Strona 1 z 1").
|
||||
MessageEmbed)
|
||||
}
|
|
@ -4,6 +4,7 @@ import (
|
|||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/tribalwarshelp/dcbot/group"
|
||||
"github.com/tribalwarshelp/dcbot/observation"
|
||||
"github.com/tribalwarshelp/dcbot/server"
|
||||
"github.com/tribalwarshelp/golang-sdk/sdk"
|
||||
|
@ -16,6 +17,7 @@ type SessionConfig struct {
|
|||
CommandPrefix string
|
||||
Status string
|
||||
ServerRepository server.Repository
|
||||
GroupRepository group.Repository
|
||||
ObservationRepository observation.Repository
|
||||
API *sdk.SDK
|
||||
}
|
||||
|
@ -81,22 +83,31 @@ func (s *Session) handleNewMessage(_ *discordgo.Session, m *discordgo.MessageCre
|
|||
s.handleHelpCommand(m)
|
||||
case AuthorCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleAuthorCommand(m)
|
||||
case TribeCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleTribeCommand(m, args...)
|
||||
|
||||
case AddGroupCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleAddGroupCommand(m)
|
||||
case DeleteGroupCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleDeleteGroupCommand(m, args...)
|
||||
case GroupsCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleGroupsCommand(m)
|
||||
|
||||
case ObserveCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleObserveCommand(m, args...)
|
||||
case UnObserveCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleUnObserveCommand(m, args...)
|
||||
case ObservationsCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleObservationsCommand(m)
|
||||
s.handleObservationsCommand(m, args...)
|
||||
case ConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleConqueredVillagesCommand(m)
|
||||
s.handleConqueredVillagesCommand(m, args...)
|
||||
case UnObserveConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleUnObserveConqueredVillagesCommand(m)
|
||||
s.handleUnObserveConqueredVillagesCommand(m, args...)
|
||||
case LostVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleLostVillagesCommand(m)
|
||||
s.handleLostVillagesCommand(m, args...)
|
||||
case UnObserveLostVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleUnObserveLostVillagesCommand(m)
|
||||
case TribeCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||
s.handleTribeCommand(m, args...)
|
||||
s.handleUnObserveLostVillagesCommand(m, args...)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,237 @@
|
|||
package discord
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strconv"
|
||||
|
||||
shared_models "github.com/tribalwarshelp/shared/models"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"github.com/tribalwarshelp/dcbot/utils"
|
||||
"github.com/tribalwarshelp/golang-sdk/sdk"
|
||||
)
|
||||
|
||||
const (
|
||||
HelpCommand Command = "help"
|
||||
TribeCommand Command = "tribe"
|
||||
TopAttCommand Command = "topatt"
|
||||
TopDefCommand Command = "topdef"
|
||||
TopSuppCommand Command = "topsupp"
|
||||
TopTotalCommand Command = "toptotal"
|
||||
TopPointsCommand Command = "toppoints"
|
||||
AuthorCommand Command = "author"
|
||||
)
|
||||
|
||||
func (s *Session) handleHelpCommand(m *discordgo.MessageCreate) {
|
||||
tribeCMDWithPrefix := TribeCommand.WithPrefix(s.cfg.CommandPrefix)
|
||||
commandsForAll := fmt.Sprintf(`
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największym RA z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największym RO z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największym RW z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największej liczbie pokonanych z plemion o podanych id
|
||||
- **%s %s** [serwer] [strona] [id1] [id2] [id3] [n id] - wyświetla graczy o największej liczbie punktów z plemion o podanych id
|
||||
- **%s** - kontakt z autorem bota
|
||||
`,
|
||||
tribeCMDWithPrefix,
|
||||
TopAttCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopDefCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopSuppCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopTotalCommand.String(),
|
||||
tribeCMDWithPrefix,
|
||||
TopPointsCommand.String(),
|
||||
AuthorCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
)
|
||||
|
||||
commandsForGuildAdmins := fmt.Sprintf(`
|
||||
- **%s** - tworzy nową grupę
|
||||
- **%s** - lista grup
|
||||
- **%s** [id grupy z %s] - usuwa grupę
|
||||
- **%s** [id grupy z %s] [świat] [id plemienia] - dodaje plemię z danego świata do obserwowanych
|
||||
- **%s** [id grupy z %s] - wyświetla wszystkie obserwowane plemiona
|
||||
- **%s** [id grupy z %s] [id z %s] - usuwa plemię z obserwowanych
|
||||
- **%s** [id grupy z %s] - ustawia kanał na którym będą wyświetlać się informacje o podbitych wioskach
|
||||
- **%s** [id grupy z %s] - informacje o podbitych wioskach na wybranym kanale nie będą się już pojawiały
|
||||
- **%s** [id grupy z %s] - ustawia kanał na którym będą wyświetlać się informacje o straconych wioskach
|
||||
- **%s** [id grupy z %s] - informacje o straconych wioskach na wybranym kanale nie będą się już pojawiały
|
||||
`,
|
||||
AddGroupCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
DeleteGroupCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
ObserveCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
ObservationsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
UnObserveCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
ObservationsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
ConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
UnObserveConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
LostVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
UnObserveLostVillagesCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
GroupsCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||
)
|
||||
|
||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||
SetTitle("Pomoc").
|
||||
SetDescription("Komendy oferowane przez bota").
|
||||
AddField("Dla wszystkich", commandsForAll).
|
||||
AddField("Dla adminów", commandsForGuildAdmins).
|
||||
MessageEmbed)
|
||||
}
|
||||
|
||||
func (s *Session) handleAuthorCommand(m *discordgo.MessageCreate) {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Discord: Kichiyaki#2064.", m.Author.Mention()))
|
||||
}
|
||||
|
||||
func (s *Session) handleTribeCommand(m *discordgo.MessageCreate, args ...string) {
|
||||
argsLength := len(args)
|
||||
if argsLength < 4 {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Niepoprawna komenda (sprawdź %s)",
|
||||
m.Author.Mention(),
|
||||
HelpCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
command := Command(args[0])
|
||||
world := args[1]
|
||||
page, err := strconv.Atoi(args[2])
|
||||
if err != nil || page <= 0 {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s 3 argument musi być liczbą większą od 0.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
ids := []int{}
|
||||
for _, arg := range args[3:argsLength] {
|
||||
id, err := strconv.Atoi(arg)
|
||||
if err != nil || id <= 0 {
|
||||
continue
|
||||
}
|
||||
ids = append(ids, id)
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Nie wprowadziłeś ID plemion.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
|
||||
exists := true
|
||||
limit := 10
|
||||
offset := (page - 1) * limit
|
||||
filter := &shared_models.PlayerFilter{
|
||||
Exists: &exists,
|
||||
TribeID: ids,
|
||||
Limit: limit,
|
||||
Offset: offset,
|
||||
}
|
||||
title := ""
|
||||
switch command {
|
||||
case TopAttCommand:
|
||||
filter.RankAttGTE = 1
|
||||
filter.Sort = "rankAtt ASC"
|
||||
title = "Top pokonani w ataku"
|
||||
case TopDefCommand:
|
||||
filter.RankDefGTE = 1
|
||||
filter.Sort = "rankDef ASC"
|
||||
title = "Top pokonani w obronie"
|
||||
case TopSuppCommand:
|
||||
filter.RankSupGTE = 1
|
||||
filter.Sort = "rankSup ASC"
|
||||
title = "Top pokonani jako wspierający"
|
||||
case TopTotalCommand:
|
||||
filter.RankTotalGTE = 1
|
||||
filter.Sort = "rankTotal ASC"
|
||||
title = "Top pokonani ogólnie"
|
||||
case TopPointsCommand:
|
||||
filter.Sort = "rank ASC"
|
||||
title = "Najwięcej punktów"
|
||||
default:
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Nieznana komenda %s (sprawdź %s)",
|
||||
m.Author.Mention(),
|
||||
command.String(),
|
||||
HelpCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||
return
|
||||
}
|
||||
|
||||
playersList, err := s.cfg.API.Players.Browse(world, filter, &sdk.PlayerInclude{
|
||||
Tribe: true,
|
||||
})
|
||||
if err != nil {
|
||||
s.SendMessage(m.ChannelID,
|
||||
fmt.Sprintf("%s Wystąpił błąd podczas pobierania danych z API, prosimy spróbować później.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
if playersList == nil || playersList.Total == 0 {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Nie znaleziono graczy należących do plemion o podanych ID.", m.Author.Mention()))
|
||||
return
|
||||
}
|
||||
totalPages := int(math.Ceil(float64(playersList.Total) / float64(limit)))
|
||||
if page > totalPages {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Przekroczyłeś limit stron (%d/%d).", m.Author.Mention(), page, totalPages))
|
||||
return
|
||||
}
|
||||
|
||||
langTag := utils.LanguageTagFromWorldName(world)
|
||||
langVersion, err := s.cfg.API.LangVersions.Read(langTag)
|
||||
if err != nil || langVersion == nil {
|
||||
s.SendMessage(m.ChannelID, fmt.Sprintf("%s Nie znaleziono wersji językowej: %s.", m.Author.Mention(), langTag))
|
||||
return
|
||||
}
|
||||
|
||||
msg := &EmbedMessage{}
|
||||
for i, player := range playersList.Items {
|
||||
if player == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
rank := 0
|
||||
score := 0
|
||||
switch command {
|
||||
case TopAttCommand:
|
||||
rank = player.RankAtt
|
||||
score = player.ScoreAtt
|
||||
case TopDefCommand:
|
||||
rank = player.RankDef
|
||||
score = player.ScoreDef
|
||||
case TopSuppCommand:
|
||||
rank = player.RankSup
|
||||
score = player.ScoreSup
|
||||
case TopTotalCommand:
|
||||
rank = player.RankTotal
|
||||
score = player.ScoreTotal
|
||||
case TopPointsCommand:
|
||||
rank = player.Rank
|
||||
score = player.Points
|
||||
}
|
||||
|
||||
tribeTag := "-"
|
||||
tribeURL := "-"
|
||||
if player.Tribe != nil {
|
||||
tribeTag = player.Tribe.Tag
|
||||
tribeURL = utils.FormatTribeURL(world, langVersion.Host, player.Tribe.ID)
|
||||
}
|
||||
|
||||
msg.Append(fmt.Sprintf("**%d**. [``%s``](%s) (Plemię: [``%s``](%s) | Ranking ogólny: **%d** | Wynik: **%d**)\n",
|
||||
offset+i+1,
|
||||
player.Name,
|
||||
utils.FormatPlayerURL(world, langVersion.Host, player.ID),
|
||||
tribeTag,
|
||||
tribeURL,
|
||||
rank,
|
||||
score))
|
||||
}
|
||||
|
||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||
SetTitle(title).
|
||||
SetDescription("A oto lista!").
|
||||
SetFields(msg.ToMessageEmbedFields()).
|
||||
SetFooter(fmt.Sprintf("Strona %d z %d", page, totalPages)).
|
||||
MessageEmbed)
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package group
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/dcbot/models"
|
||||
)
|
||||
|
||||
type Repository interface {
|
||||
Store(ctx context.Context, group *models.Group) error
|
||||
StoreMany(ctx context.Context, groups []*models.Group) error
|
||||
Update(ctx context.Context, group *models.Group) error
|
||||
Delete(ctx context.Context, filter *models.GroupFilter) ([]*models.Group, error)
|
||||
GetByID(ctx context.Context, id int) (*models.Group, error)
|
||||
Fetch(ctx context.Context, filter *models.GroupFilter) ([]*models.Group, int, error)
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/dcbot/group"
|
||||
"github.com/tribalwarshelp/dcbot/models"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/go-pg/pg/v10/orm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type pgRepo struct {
|
||||
*pg.DB
|
||||
}
|
||||
|
||||
func NewPgRepo(db *pg.DB) (group.Repository, error) {
|
||||
if err := db.CreateTable((*models.Group)(nil), &orm.CreateTableOptions{
|
||||
IfNotExists: true,
|
||||
FKConstraints: true,
|
||||
}); err != nil {
|
||||
return nil, errors.Wrap(err, "Cannot create 'groups' table")
|
||||
}
|
||||
return &pgRepo{db}, nil
|
||||
}
|
||||
|
||||
func (repo *pgRepo) Store(ctx context.Context, group *models.Group) error {
|
||||
if _, err := repo.Model(group).Returning("*").Context(ctx).Insert(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (repo *pgRepo) StoreMany(ctx context.Context, groups []*models.Group) error {
|
||||
if _, err := repo.Model(&groups).Returning("*").Context(ctx).Insert(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (repo *pgRepo) Update(ctx context.Context, group *models.Group) error {
|
||||
if _, err := repo.
|
||||
Model(group).
|
||||
WherePK().
|
||||
Returning("*").
|
||||
Context(ctx).
|
||||
Update(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (repo *pgRepo) GetByID(ctx context.Context, id int) (*models.Group, error) {
|
||||
group := &models.Group{
|
||||
ID: id,
|
||||
}
|
||||
if err := repo.
|
||||
Model(group).
|
||||
WherePK().
|
||||
Returning("*").
|
||||
Relation("Observations").
|
||||
Context(ctx).
|
||||
Select(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return group, nil
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
if f != nil {
|
||||
query = query.
|
||||
WhereStruct(f).
|
||||
Limit(f.Limit).
|
||||
Offset(f.Offset)
|
||||
|
||||
if len(f.Order) > 0 {
|
||||
query = query.Order(f.Order...)
|
||||
}
|
||||
}
|
||||
|
||||
total, err := query.SelectAndCount()
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return data, total, nil
|
||||
}
|
||||
|
||||
func (repo *pgRepo) Delete(ctx context.Context, f *models.GroupFilter) ([]*models.Group, error) {
|
||||
data := []*models.Group{}
|
||||
query := repo.Model(&data).Context(ctx)
|
||||
|
||||
if f != nil {
|
||||
query = query.WhereStruct(f)
|
||||
}
|
||||
|
||||
_, err := query.
|
||||
Returning("*").
|
||||
Delete()
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
return nil, err
|
||||
}
|
||||
return data, nil
|
||||
}
|
17
main.go
17
main.go
|
@ -10,6 +10,7 @@ import (
|
|||
|
||||
_cron "github.com/tribalwarshelp/dcbot/cron"
|
||||
"github.com/tribalwarshelp/dcbot/discord"
|
||||
group_repository "github.com/tribalwarshelp/dcbot/group/repository"
|
||||
observation_repository "github.com/tribalwarshelp/dcbot/observation/repository"
|
||||
server_repository "github.com/tribalwarshelp/dcbot/server/repository"
|
||||
|
||||
|
@ -29,8 +30,6 @@ func init() {
|
|||
}
|
||||
|
||||
func main() {
|
||||
api := sdk.New(os.Getenv("API_URL"))
|
||||
//postgres
|
||||
db := pg.Connect(&pg.Options{
|
||||
User: os.Getenv("DB_USER"),
|
||||
Password: os.Getenv("DB_PASSWORD"),
|
||||
|
@ -42,20 +41,29 @@ func main() {
|
|||
log.Fatal(err)
|
||||
}
|
||||
}()
|
||||
|
||||
serverRepo, err := server_repository.NewPgRepo(db)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
groupRepo, err := group_repository.NewPgRepo(db)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
observationRepo, err := observation_repository.NewPgRepo(db)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
api := sdk.New(os.Getenv("API_URL"))
|
||||
|
||||
sess, err := discord.New(discord.SessionConfig{
|
||||
Token: os.Getenv("BOT_TOKEN"),
|
||||
CommandPrefix: "tw!",
|
||||
Status: "Tribal Wars | tw!help",
|
||||
ObservationRepository: observationRepo,
|
||||
ServerRepository: serverRepo,
|
||||
GroupRepository: groupRepo,
|
||||
API: api,
|
||||
})
|
||||
if err != nil {
|
||||
|
@ -70,11 +78,10 @@ func main() {
|
|||
ServerRepo: serverRepo,
|
||||
ObservationRepo: observationRepo,
|
||||
Discord: sess,
|
||||
GroupRepo: groupRepo,
|
||||
API: api,
|
||||
})
|
||||
go func() {
|
||||
c.Run()
|
||||
}()
|
||||
c.Start()
|
||||
defer c.Stop()
|
||||
|
||||
log.Print("Bot is waiting for your actions!")
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package models
|
||||
|
||||
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"`
|
||||
Server *Server `json:"server,omitempty" gqlgen:"server"`
|
||||
Observations Observations `json:"observation,omitempty" gqlgen:"observation"`
|
||||
}
|
||||
|
||||
type GroupFilter struct {
|
||||
ID []int
|
||||
ServerID []string
|
||||
Limit int `urlstruct:",nowhere"`
|
||||
Offset int `urlstruct:",nowhere"`
|
||||
Order []string `urlstruct:",nowhere"`
|
||||
}
|
|
@ -1,20 +1,23 @@
|
|||
package models
|
||||
|
||||
import "time"
|
||||
|
||||
type Observation struct {
|
||||
tableName struct{} `pg:",alias:observation"`
|
||||
|
||||
ID int `json:"id" gqlgen:"id"`
|
||||
World string `pg:"unique:group_1,use_zero" json:"world" gqlgen:"world"`
|
||||
TribeID int `pg:"unique:group_1,use_zero" json:"tribeID" gqlgen:"tribeID"`
|
||||
ServerID string `pg:"on_delete:CASCADE,unique:group_1,use_zero" json:"serverID" gqlgen:"serverID"`
|
||||
Server *Server `json:"server,omitempty" gqlgen:"server"`
|
||||
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"`
|
||||
}
|
||||
|
||||
type Observations []*Observation
|
||||
|
||||
func (o Observations) Contains(world string, id int) bool {
|
||||
func (o Observations) Contains(server string, id int) bool {
|
||||
for _, observation := range o {
|
||||
if observation.TribeID == id && observation.World == world {
|
||||
if observation.TribeID == id && observation.Server == server {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
@ -22,10 +25,10 @@ func (o Observations) Contains(world string, id int) bool {
|
|||
}
|
||||
|
||||
type ObservationFilter struct {
|
||||
ID []int
|
||||
World []string
|
||||
ServerID []string
|
||||
Limit int `urlstruct:",nowhere"`
|
||||
Offset int `urlstruct:",nowhere"`
|
||||
Order []string `urlstruct:",nowhere"`
|
||||
ID []int
|
||||
Server []string
|
||||
GroupID []int
|
||||
Limit int `urlstruct:",nowhere"`
|
||||
Offset int `urlstruct:",nowhere"`
|
||||
Order []string `urlstruct:",nowhere"`
|
||||
}
|
||||
|
|
|
@ -3,10 +3,8 @@ package models
|
|||
type Server struct {
|
||||
tableName struct{} `pg:",alias:server"`
|
||||
|
||||
ID string `pg:",pk" json:"id" gqlgen:"id"`
|
||||
ConqueredVillagesChannelID string `pg:",use_zero" json:"conqueredVillagesChannelID" gqlgen:"conqueredVillagesChannelID"`
|
||||
LostVillagesChannelID string `pg:",use_zero" json:"lostVillagesChannelID" gqlgen:"lostVillagesChannelID"`
|
||||
Observations Observations `json:"observation,omitempty" gqlgen:"observation"`
|
||||
ID string `pg:",pk" json:"id" gqlgen:"id"`
|
||||
Groups []*Group
|
||||
}
|
||||
|
||||
type ServerFilter struct {
|
||||
|
|
|
@ -12,5 +12,5 @@ type Repository interface {
|
|||
Update(ctx context.Context, observation *models.Observation) error
|
||||
Delete(ctx context.Context, filter *models.ObservationFilter) ([]*models.Observation, error)
|
||||
Fetch(ctx context.Context, filter *models.ObservationFilter) ([]*models.Observation, int, error)
|
||||
FetchWorlds(ctx context.Context) ([]string, error)
|
||||
FetchServers(ctx context.Context) ([]string, error)
|
||||
}
|
||||
|
|
|
@ -75,15 +75,15 @@ func (repo *pgRepo) Fetch(ctx context.Context, f *models.ObservationFilter) ([]*
|
|||
return data, total, nil
|
||||
}
|
||||
|
||||
func (repo *pgRepo) FetchWorlds(ctx context.Context) ([]string, error) {
|
||||
func (repo *pgRepo) FetchServers(ctx context.Context) ([]string, error) {
|
||||
data := []*models.Observation{}
|
||||
res := []string{}
|
||||
err := repo.
|
||||
Model(&data).
|
||||
Column("world").
|
||||
Column("server").
|
||||
Context(ctx).
|
||||
Group("world").
|
||||
Order("world ASC").
|
||||
Group("server").
|
||||
Order("server ASC").
|
||||
Select(&res)
|
||||
return res, err
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ func (repo *pgRepo) Store(ctx context.Context, server *models.Server) error {
|
|||
Where("id = ?id").
|
||||
Returning("*").
|
||||
Context(ctx).
|
||||
Relation("Observations").
|
||||
Relation("Groups").
|
||||
SelectOrInsert(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ func (repo *pgRepo) Update(ctx context.Context, server *models.Server) error {
|
|||
func (repo *pgRepo) Fetch(ctx context.Context, f *models.ServerFilter) ([]*models.Server, int, error) {
|
||||
var err error
|
||||
data := []*models.Server{}
|
||||
query := repo.Model(&data).Context(ctx).Relation("Observations")
|
||||
query := repo.Model(&data).Context(ctx).Relation("Groups")
|
||||
|
||||
if f != nil {
|
||||
query = query.
|
||||
|
|
Reference in New Issue