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

471 lines
13 KiB
Go

package discord
import (
"fmt"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/shared/tw/twurlbuilder"
"math"
"strconv"
"strings"
"github.com/tribalwarshelp/dcbot/message"
"github.com/nicksnyder/go-i18n/v2/i18n"
"github.com/bwmarrin/discordgo"
"github.com/dustin/go-humanize"
"github.com/tribalwarshelp/golang-sdk/sdk"
)
const (
cmdHelp command = "help"
cmdTribe command = "tribe"
cmdTopODA command = "topoda"
cmdTopODD command = "topodd"
cmdTopODS command = "topods"
cmdTopOD command = "topod"
cmdTopPoints command = "toppoints"
cmdAuthor command = "author"
)
type hndlrHelp struct {
*Session
}
var _ commandHandler = &hndlrHelp{}
func (hndlr *hndlrHelp) cmd() command {
return cmdHelp
}
func (hndlr *hndlrHelp) requireAdmPermissions() bool {
return false
}
func (hndlr *hndlrHelp) execute(ctx *commandCtx, m *discordgo.MessageCreate, args ...string) {
commandsForAll := fmt.Sprintf(`
- %s
- %s
- %s
- %s
- %s
- %s
`,
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpTribeTopODA,
TemplateData: map[string]interface{}{
"Command": cmdTribe.WithPrefix(hndlr.cfg.CommandPrefix) + " " + cmdTopODA.String(),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpTribeTopODD,
TemplateData: map[string]interface{}{
"Command": cmdTribe.WithPrefix(hndlr.cfg.CommandPrefix) + " " + cmdTopODD.String(),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpTribeTopODS,
TemplateData: map[string]interface{}{
"Command": cmdTribe.WithPrefix(hndlr.cfg.CommandPrefix) + " " + cmdTopODS.String(),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpTribeTopOD,
TemplateData: map[string]interface{}{
"Command": cmdTribe.WithPrefix(hndlr.cfg.CommandPrefix) + " " + cmdTopOD.String(),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpTribeTopPoints,
TemplateData: map[string]interface{}{
"Command": cmdTribe.WithPrefix(hndlr.cfg.CommandPrefix) + " " + cmdTopPoints.String(),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpAuthor,
TemplateData: map[string]interface{}{
"Command": cmdAuthor.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
)
commandsForGuildAdmins := fmt.Sprintf(`
- %s
- %s
- %s
- %s
- %s
- %s
- %s
- %s
- %s
`,
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpAddGroup,
TemplateData: map[string]interface{}{
"Command": cmdAddGroup.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpGroups,
TemplateData: map[string]interface{}{
"Command": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpDeleteGroup,
TemplateData: map[string]interface{}{
"Command": cmdDeleteGroup.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpShowEnnobledBarbs,
TemplateData: map[string]interface{}{
"Command": cmdShowEnnobledBarbarians.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpObserve,
TemplateData: map[string]interface{}{
"Command": cmdObserve.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpGroups,
TemplateData: map[string]interface{}{
"Command": cmdObservations.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpDeleteObservation,
TemplateData: map[string]interface{}{
"Command": cmdDeleteObservation.WithPrefix(hndlr.cfg.CommandPrefix),
"ObservationsCommand": cmdObservations.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpConqueredVillages,
TemplateData: map[string]interface{}{
"Command": cmdConqueredVillages.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpDisableConqueredVillages,
TemplateData: map[string]interface{}{
"Command": cmdDisableConqueredVillages.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
)
commandsForGuildAdmins2 := fmt.Sprintf(`
- %s
- %s
- %s
- %s
- %s
- %s
`,
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpLostVillages,
TemplateData: map[string]interface{}{
"Command": cmdLostVillages.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpDisableLostVillages,
TemplateData: map[string]interface{}{
"Command": cmdDisableLostVillages.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpShowInternals,
TemplateData: map[string]interface{}{
"Command": cmdShowInternals.WithPrefix(hndlr.cfg.CommandPrefix),
"GroupsCommand": cmdGroups.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpChangageLanguage,
TemplateData: map[string]interface{}{
"Command": cmdChangeLanguage.WithPrefix(hndlr.cfg.CommandPrefix),
"Languages": getAvailableLanguages(),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpCoordsTranslation,
TemplateData: map[string]interface{}{
"Command": cmdCoordsTranslation.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpDisableCoordsTranslation,
TemplateData: map[string]interface{}{
"Command": cmdDisableCoordsTranslation.WithPrefix(hndlr.cfg.CommandPrefix),
},
}),
)
forAdmins := ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpForAdmins,
})
hndlr.SendEmbed(m.ChannelID, NewEmbed().
SetTitle(ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpTitle,
})).
SetURL("https://dcbot.tribalwarshelp.com/").
SetDescription(ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpDescription,
})).
AddField(ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.HelpForAllUsers,
}), commandsForAll).
AddField(forAdmins, commandsForGuildAdmins).
AddField(forAdmins+" 2", commandsForGuildAdmins2))
}
type hndlrAuthor struct {
*Session
}
var _ commandHandler = &hndlrAuthor{}
func (hndlr *hndlrAuthor) cmd() command {
return cmdAuthor
}
func (hndlr *hndlrAuthor) requireAdmPermissions() bool {
return false
}
func (hndlr *hndlrAuthor) execute(ctx *commandCtx, m *discordgo.MessageCreate, args ...string) {
hndlr.SendMessage(m.ChannelID,
fmt.Sprintf("%s Discord: Kichiyaki#2064 | https://dwysokinski.me/#contact.",
m.Author.Mention()))
}
type hndlrTribe struct {
*Session
}
var _ commandHandler = &hndlrTribe{}
func (hndlr *hndlrTribe) cmd() command {
return cmdTribe
}
func (hndlr *hndlrTribe) requireAdmPermissions() bool {
return false
}
func (hndlr *hndlrTribe) execute(ctx *commandCtx, m *discordgo.MessageCreate, args ...string) {
argsLength := len(args)
if argsLength < 3 {
return
}
command := command(args[0])
server := args[1]
page, err := strconv.Atoi(args[2])
if err != nil || page <= 0 {
hndlr.SendMessage(m.ChannelID, ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeInvalidPage,
TemplateData: map[string]interface{}{
"Mention": m.Author.Mention(),
},
}))
return
}
var ids []int
var tags []string
for _, arg := range args[3:argsLength] {
trimmed := strings.TrimSpace(arg)
if trimmed == "" {
continue
}
id, err := strconv.Atoi(trimmed)
if err != nil || id <= 0 {
tags = append(tags, trimmed)
} else {
ids = append(ids, id)
}
}
if len(ids) == 0 && len(tags) == 0 {
hndlr.SendMessage(m.ChannelID, ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeNoTribeID,
TemplateData: map[string]interface{}{
"Mention": m.Author.Mention(),
},
}))
return
}
exists := true
limit := 10
offset := (page - 1) * limit
filter := &twmodel.PlayerFilter{
Exists: &exists,
TribeFilter: &twmodel.TribeFilter{
Or: &twmodel.TribeFilterOr{
ID: ids,
Tag: tags,
},
},
}
title := ""
sort := ""
switch command {
case cmdTopODA:
filter.RankAttGTE = 1
sort = "rankAtt ASC"
title = ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeTitleOrderedByODA,
})
case cmdTopODD:
filter.RankDefGTE = 1
sort = "rankDef ASC"
title = ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeTitleOrderedByODD,
})
case cmdTopODS:
filter.RankSupGTE = 1
sort = "rankSup ASC"
title = ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeTitleOrderedByODS,
})
case cmdTopOD:
filter.RankTotalGTE = 1
sort = "rankTotal ASC"
title = ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeTitleOrderedByOD,
})
case cmdTopPoints:
sort = "rank ASC"
title = ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeTitleOrderedByPoints,
})
default:
return
}
playerList, err := hndlr.cfg.API.Player.Browse(server,
limit,
offset,
[]string{sort},
filter,
&sdk.PlayerInclude{
Tribe: true,
})
if err != nil {
hndlr.SendMessage(m.ChannelID,
ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.ApiDefaultError,
TemplateData: map[string]interface{}{
"Mention": m.Author.Mention(),
},
}))
return
}
if playerList == nil || playerList.Total == 0 {
hndlr.SendMessage(m.ChannelID, ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeTribesNotFound,
TemplateData: map[string]interface{}{
"Mention": m.Author.Mention(),
},
}))
return
}
totalPages := int(math.Ceil(float64(playerList.Total) / float64(limit)))
if page > totalPages {
hndlr.SendMessage(m.ChannelID, ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeExceededMaximumNumberOfPages,
TemplateData: map[string]interface{}{
"Mention": m.Author.Mention(),
"Page": page,
"MaxPage": totalPages,
},
}))
return
}
code := twmodel.VersionCodeFromServerKey(server)
version, err := hndlr.cfg.API.Version.Read(code)
if err != nil || version == nil {
hndlr.SendMessage(m.ChannelID, ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.InternalServerError,
TemplateData: map[string]interface{}{
"Mention": m.Author.Mention(),
},
}))
return
}
bldr := &MessageEmbedFieldBuilder{}
bldr.SetName(title)
for i, player := range playerList.Items {
if player == nil {
continue
}
rank := 0
score := 0
switch command {
case cmdTopODA:
rank = player.RankAtt
score = player.ScoreAtt
case cmdTopODD:
rank = player.RankDef
score = player.ScoreDef
case cmdTopODS:
rank = player.RankSup
score = player.ScoreSup
case cmdTopOD:
rank = player.RankTotal
score = player.ScoreTotal
case cmdTopPoints:
rank = player.Rank
score = player.Points
}
tribeTag := "-"
tribeURL := "-"
if player.Tribe != nil {
tribeTag = player.Tribe.Tag
tribeURL = twurlbuilder.BuildTribeURL(server, version.Host, player.Tribe.ID)
}
bldr.Append(ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.TribeMessageLine,
TemplateData: map[string]interface{}{
"Index": offset + i + 1,
"PlayerName": player.Name,
"PlayerURL": twurlbuilder.BuildPlayerURL(server, version.Host, player.ID),
"TribeTag": tribeTag,
"TribeURL": tribeURL,
"Rank": rank,
"Score": humanize.Comma(int64(score)),
},
}))
}
hndlr.SendEmbed(m.ChannelID, NewEmbed().
SetTitle(title).
SetFields(bldr.ToMessageEmbedFields()).
SetFooter(ctx.localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: message.PaginationLabelDisplayedPage,
TemplateData: map[string]interface{}{
"Page": page,
"MaxPage": totalPages,
},
})))
}