rename tribe model -> observation, cron is checking now bot membership on servers and is detecting closed tribalwars worlds
This commit is contained in:
parent
cb8adc3c8a
commit
f16e93469a
24
cron/cron.go
24
cron/cron.go
|
@ -6,26 +6,30 @@ import (
|
||||||
"github.com/tribalwarshelp/golang-sdk/sdk"
|
"github.com/tribalwarshelp/golang-sdk/sdk"
|
||||||
|
|
||||||
"github.com/tribalwarshelp/dcbot/discord"
|
"github.com/tribalwarshelp/dcbot/discord"
|
||||||
|
"github.com/tribalwarshelp/dcbot/observation"
|
||||||
"github.com/tribalwarshelp/dcbot/server"
|
"github.com/tribalwarshelp/dcbot/server"
|
||||||
"github.com/tribalwarshelp/dcbot/tribe"
|
|
||||||
|
|
||||||
"github.com/robfig/cron/v3"
|
"github.com/robfig/cron/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
ServerRepo server.Repository
|
ServerRepo server.Repository
|
||||||
TribeRepo tribe.Repository
|
ObservationRepo observation.Repository
|
||||||
Discord *discord.Session
|
Discord *discord.Session
|
||||||
API *sdk.SDK
|
API *sdk.SDK
|
||||||
}
|
}
|
||||||
|
|
||||||
func Attach(c *cron.Cron, cfg Config) {
|
func Attach(c *cron.Cron, cfg Config) {
|
||||||
h := &handler{
|
h := &handler{
|
||||||
lastEnnobledAt: make(map[string]time.Time),
|
lastEnnobledAt: make(map[string]time.Time),
|
||||||
serverRepo: cfg.ServerRepo,
|
serverRepo: cfg.ServerRepo,
|
||||||
tribeRepo: cfg.TribeRepo,
|
observationRepo: cfg.ObservationRepo,
|
||||||
discord: cfg.Discord,
|
discord: cfg.Discord,
|
||||||
api: cfg.API,
|
api: cfg.API,
|
||||||
}
|
}
|
||||||
c.AddFunc("@every 1m", h.checkLastEnnoblements)
|
c.AddFunc("@every 1m", h.checkLastEnnoblements)
|
||||||
|
go h.checkBotMembershipOnServers()
|
||||||
|
c.AddFunc("@every 30m", h.checkBotMembershipOnServers)
|
||||||
|
go h.deleteClosedTribalwarsWorlds()
|
||||||
|
c.AddFunc("@every 2h", h.deleteClosedTribalwarsWorlds)
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ func (e ennoblements) getLastEnnoblement() *shared_models.Ennoblement {
|
||||||
return e[length-1]
|
return e[length-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e ennoblements) tribeLostVillages(tribeID int) ennoblements {
|
func (e ennoblements) getLostVillagesByTribe(tribeID int) ennoblements {
|
||||||
filtered := ennoblements{}
|
filtered := ennoblements{}
|
||||||
for _, ennoblement := range e {
|
for _, ennoblement := range e {
|
||||||
if (!isPlayerTribeNil(ennoblement.NewOwner) && ennoblement.NewOwner.Tribe.ID == tribeID) ||
|
if (!isPlayerTribeNil(ennoblement.NewOwner) && ennoblement.NewOwner.Tribe.ID == tribeID) ||
|
||||||
|
@ -27,7 +27,7 @@ func (e ennoblements) tribeLostVillages(tribeID int) ennoblements {
|
||||||
return filtered
|
return filtered
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e ennoblements) tribeConqueredVillages(tribeID int) ennoblements {
|
func (e ennoblements) getConqueredVillagesByTribe(tribeID int) ennoblements {
|
||||||
filtered := ennoblements{}
|
filtered := ennoblements{}
|
||||||
for _, ennoblement := range e {
|
for _, ennoblement := range e {
|
||||||
if isPlayerTribeNil(ennoblement.NewOwner) ||
|
if isPlayerTribeNil(ennoblement.NewOwner) ||
|
||||||
|
|
|
@ -8,18 +8,19 @@ import (
|
||||||
shared_models "github.com/tribalwarshelp/shared/models"
|
shared_models "github.com/tribalwarshelp/shared/models"
|
||||||
|
|
||||||
"github.com/tribalwarshelp/dcbot/discord"
|
"github.com/tribalwarshelp/dcbot/discord"
|
||||||
|
"github.com/tribalwarshelp/dcbot/models"
|
||||||
|
"github.com/tribalwarshelp/dcbot/observation"
|
||||||
"github.com/tribalwarshelp/dcbot/server"
|
"github.com/tribalwarshelp/dcbot/server"
|
||||||
"github.com/tribalwarshelp/dcbot/tribe"
|
|
||||||
"github.com/tribalwarshelp/dcbot/utils"
|
"github.com/tribalwarshelp/dcbot/utils"
|
||||||
"github.com/tribalwarshelp/golang-sdk/sdk"
|
"github.com/tribalwarshelp/golang-sdk/sdk"
|
||||||
)
|
)
|
||||||
|
|
||||||
type handler struct {
|
type handler struct {
|
||||||
lastEnnobledAt map[string]time.Time
|
lastEnnobledAt map[string]time.Time
|
||||||
serverRepo server.Repository
|
serverRepo server.Repository
|
||||||
tribeRepo tribe.Repository
|
observationRepo observation.Repository
|
||||||
discord *discord.Session
|
discord *discord.Session
|
||||||
api *sdk.SDK
|
api *sdk.SDK
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
|
func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
|
||||||
|
@ -44,7 +45,7 @@ func (h *handler) loadEnnoblements(worlds []string) map[string]ennoblements {
|
||||||
|
|
||||||
lastEnnobledAt, ok := h.lastEnnobledAt[w]
|
lastEnnobledAt, ok := h.lastEnnobledAt[w]
|
||||||
if !ok {
|
if !ok {
|
||||||
lastEnnobledAt = time.Now()
|
lastEnnobledAt = time.Now().Add(-1 * time.Minute)
|
||||||
}
|
}
|
||||||
|
|
||||||
m[w] = filterEnnoblements(es, lastEnnobledAt)
|
m[w] = filterEnnoblements(es, lastEnnobledAt)
|
||||||
|
@ -86,7 +87,7 @@ func (h *handler) loadLangVersions(worlds []string) map[shared_models.LanguageTa
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) checkLastEnnoblements() {
|
func (h *handler) checkLastEnnoblements() {
|
||||||
worlds, err := h.tribeRepo.FetchWorlds(context.Background())
|
worlds, err := h.observationRepo.FetchWorlds(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("checkLastEnnoblements: " + err.Error())
|
log.Print("checkLastEnnoblements: " + err.Error())
|
||||||
return
|
return
|
||||||
|
@ -95,10 +96,10 @@ func (h *handler) checkLastEnnoblements() {
|
||||||
|
|
||||||
servers, total, err := h.serverRepo.Fetch(context.Background(), nil)
|
servers, total, err := h.serverRepo.Fetch(context.Background(), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("checkLastEnnoblements: " + err.Error())
|
log.Print("checkLastEnnoblements error: " + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Print("checkLastEnnoblements: total number of discord servers: ", total)
|
log.Print("checkLastEnnoblements: total number of loaded discord servers: ", total)
|
||||||
|
|
||||||
langVersions := h.loadLangVersions(worlds)
|
langVersions := h.loadLangVersions(worlds)
|
||||||
|
|
||||||
|
@ -109,14 +110,14 @@ func (h *handler) checkLastEnnoblements() {
|
||||||
if server.ConqueredVillagesChannelID == "" && server.LostVillagesChannelID == "" {
|
if server.ConqueredVillagesChannelID == "" && server.LostVillagesChannelID == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, tribe := range server.Tribes {
|
for _, tribe := range server.Observations {
|
||||||
es, ok := ennoblements[tribe.World]
|
es, ok := ennoblements[tribe.World]
|
||||||
langVersion, ok2 := langVersions[utils.LanguageCodeFromWorldName(tribe.World)]
|
langVersion, ok2 := langVersions[utils.LanguageCodeFromWorldName(tribe.World)]
|
||||||
if ok && ok2 {
|
if ok && ok2 {
|
||||||
if server.LostVillagesChannelID != "" {
|
if server.LostVillagesChannelID != "" {
|
||||||
for _, ennoblement := range es.tribeLostVillages(tribe.TribeID) {
|
for _, ennoblement := range es.getLostVillagesByTribe(tribe.TribeID) {
|
||||||
if !isPlayerTribeNil(ennoblement.NewOwner) &&
|
if !isPlayerTribeNil(ennoblement.NewOwner) &&
|
||||||
server.Tribes.Contains(tribe.World, ennoblement.NewOwner.Tribe.ID) {
|
server.Observations.Contains(tribe.World, ennoblement.NewOwner.Tribe.ID) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
newMsgDataConfig := newMessageDataConfig{
|
newMsgDataConfig := newMessageDataConfig{
|
||||||
|
@ -136,9 +137,9 @@ func (h *handler) checkLastEnnoblements() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if server.ConqueredVillagesChannelID != "" {
|
if server.ConqueredVillagesChannelID != "" {
|
||||||
for _, ennoblement := range es.tribeConqueredVillages(tribe.TribeID) {
|
for _, ennoblement := range es.getConqueredVillagesByTribe(tribe.TribeID) {
|
||||||
if !isPlayerTribeNil(ennoblement.OldOwner) &&
|
if !isPlayerTribeNil(ennoblement.OldOwner) &&
|
||||||
server.Tribes.Contains(tribe.World, ennoblement.OldOwner.Tribe.ID) {
|
server.Observations.Contains(tribe.World, ennoblement.OldOwner.Tribe.ID) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
newMsgDataConfig := newMessageDataConfig{
|
newMsgDataConfig := newMessageDataConfig{
|
||||||
|
@ -160,3 +161,64 @@ func (h *handler) checkLastEnnoblements() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *handler) checkBotMembershipOnServers() {
|
||||||
|
servers, total, err := h.serverRepo.Fetch(context.Background(), nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Print("checkBotMembershipOnServers error: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Print("checkBotMembershipOnServers: total number of loaded discord servers: ", total)
|
||||||
|
|
||||||
|
idsToDelete := []string{}
|
||||||
|
for _, server := range servers {
|
||||||
|
if isGuildMember, _ := h.discord.IsGuildMember(server.ID); !isGuildMember {
|
||||||
|
idsToDelete = append(idsToDelete, server.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(idsToDelete) > 0 {
|
||||||
|
deleted, err := h.serverRepo.Delete(context.Background(), &models.ServerFilter{
|
||||||
|
ID: idsToDelete,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Print("checkBotMembershipOnServers error: " + err.Error())
|
||||||
|
} else {
|
||||||
|
log.Printf("checkBotMembershipOnServers: total number of deleted discord servers: %d", len(deleted))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handler) deleteClosedTribalwarsWorlds() {
|
||||||
|
worlds, err := h.observationRepo.FetchWorlds(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
log.Print("deleteClosedTribalwarsWorlds: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Print("deleteClosedTribalwarsWorlds: worlds: ", worlds)
|
||||||
|
|
||||||
|
list, err := h.api.Servers.Browse(&shared_models.ServerFilter{
|
||||||
|
Key: worlds,
|
||||||
|
Status: []shared_models.ServerStatus{shared_models.ServerStatusClosed},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Print("deleteClosedTribalwarsWorlds: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
keys := []string{}
|
||||||
|
for _, server := range list.Items {
|
||||||
|
keys = append(keys, server.Key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(keys) > 0 {
|
||||||
|
deleted, err := h.observationRepo.Delete(context.Background(), &models.ObservationFilter{
|
||||||
|
World: keys,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Print("deleteClosedTribalwarsWorlds error: " + err.Error())
|
||||||
|
} else {
|
||||||
|
log.Printf("deleteClosedTribalwarsWorlds: total number of deleted observations: %d", len(deleted))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,7 +9,8 @@ import (
|
||||||
func filterEnnoblements(ennoblements []*shared_models.Ennoblement, t time.Time) []*shared_models.Ennoblement {
|
func filterEnnoblements(ennoblements []*shared_models.Ennoblement, t time.Time) []*shared_models.Ennoblement {
|
||||||
filtered := []*shared_models.Ennoblement{}
|
filtered := []*shared_models.Ennoblement{}
|
||||||
for _, ennoblement := range ennoblements {
|
for _, ennoblement := range ennoblements {
|
||||||
if ennoblement.EnnobledAt.In(time.UTC).Before(t) {
|
utc := ennoblement.EnnobledAt.In(time.UTC)
|
||||||
|
if utc.Before(t) || utc.Equal(t) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
filtered = append(filtered, ennoblement)
|
filtered = append(filtered, ennoblement)
|
||||||
|
|
|
@ -15,14 +15,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TribesPerServer = 10
|
ObservationsPerServer = 10
|
||||||
)
|
)
|
||||||
|
|
||||||
type Command string
|
type Command string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
HelpCommand Command = "help"
|
HelpCommand Command = "help"
|
||||||
AddCommand Command = "add"
|
ObserveCommand Command = "observe"
|
||||||
ListCommand Command = "list"
|
ListCommand Command = "list"
|
||||||
DeleteCommand Command = "delete"
|
DeleteCommand Command = "delete"
|
||||||
LostVillagesCommand Command = "lostvillages"
|
LostVillagesCommand Command = "lostvillages"
|
||||||
|
@ -70,7 +70,7 @@ func (s *Session) handleHelpCommand(m *discordgo.MessageCreate) {
|
||||||
- %s - ustawia kanał na którym będą wyświetlać się informacje o straconych wioskach
|
- %s - ustawia kanał na którym będą wyświetlać się informacje o straconych wioskach
|
||||||
- %s - ustawia kanał na którym będą wyświetlać się informacje o podbitych wioskach
|
- %s - ustawia kanał na którym będą wyświetlać się informacje o podbitych wioskach
|
||||||
`,
|
`,
|
||||||
AddCommand.WithPrefix(s.cfg.CommandPrefix),
|
ObserveCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||||
ListCommand.WithPrefix(s.cfg.CommandPrefix),
|
ListCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||||
DeleteCommand.WithPrefix(s.cfg.CommandPrefix),
|
DeleteCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||||
ListCommand.WithPrefix(s.cfg.CommandPrefix),
|
ListCommand.WithPrefix(s.cfg.CommandPrefix),
|
||||||
|
@ -255,7 +255,7 @@ func (s *Session) handleConqueredVillagesCommand(m *discordgo.MessageCreate) {
|
||||||
fmt.Sprintf("%s Pomyślnie zmieniono kanał na którym będą się wyświetlać informacje o podbitych wioskach.", m.Author.Mention()))
|
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) handleAddCommand(m *discordgo.MessageCreate, args ...string) {
|
func (s *Session) handleObserveCommand(m *discordgo.MessageCreate, args ...string) {
|
||||||
if m.GuildID == "" {
|
if m.GuildID == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -271,7 +271,7 @@ func (s *Session) handleAddCommand(m *discordgo.MessageCreate, args ...string) {
|
||||||
s.SendMessage(m.ChannelID,
|
s.SendMessage(m.ChannelID,
|
||||||
fmt.Sprintf("%s %s [świat] [id plemienia]",
|
fmt.Sprintf("%s %s [świat] [id plemienia]",
|
||||||
m.Author.Mention(),
|
m.Author.Mention(),
|
||||||
AddCommand.WithPrefix(s.cfg.CommandPrefix)))
|
ObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,7 +281,7 @@ func (s *Session) handleAddCommand(m *discordgo.MessageCreate, args ...string) {
|
||||||
s.SendMessage(m.ChannelID,
|
s.SendMessage(m.ChannelID,
|
||||||
fmt.Sprintf("%s %s [świat] [id plemienia]",
|
fmt.Sprintf("%s %s [świat] [id plemienia]",
|
||||||
m.Author.Mention(),
|
m.Author.Mention(),
|
||||||
AddCommand.WithPrefix(s.cfg.CommandPrefix)))
|
ObserveCommand.WithPrefix(s.cfg.CommandPrefix)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,12 +310,12 @@ func (s *Session) handleAddCommand(m *discordgo.MessageCreate, args ...string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(dcServer.Tribes) >= TribesPerServer {
|
if len(dcServer.Observations) >= ObservationsPerServer {
|
||||||
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` Osiągnięto limit plemion (%d/%d).`, TribesPerServer, TribesPerServer))
|
s.SendMessage(m.ChannelID, m.Author.Mention()+fmt.Sprintf(` Osiągnięto limit plemion (%d/%d).`, ObservationsPerServer, ObservationsPerServer))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = s.cfg.TribeRepository.Store(context.Background(), &models.Tribe{
|
err = s.cfg.ObservationRepository.Store(context.Background(), &models.Observation{
|
||||||
World: world,
|
World: world,
|
||||||
TribeID: id,
|
TribeID: id,
|
||||||
ServerID: dcServer.ID,
|
ServerID: dcServer.ID,
|
||||||
|
@ -357,7 +357,7 @@ func (s *Session) handleDeleteCommand(m *discordgo.MessageCreate, args ...string
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
go s.cfg.TribeRepository.Delete(context.Background(), &models.TribeFilter{
|
go s.cfg.ObservationRepository.Delete(context.Background(), &models.ObservationFilter{
|
||||||
ServerID: []string{m.GuildID},
|
ServerID: []string{m.GuildID},
|
||||||
ID: []int{id},
|
ID: []int{id},
|
||||||
})
|
})
|
||||||
|
@ -373,7 +373,7 @@ func (s *Session) handleListCommand(m *discordgo.MessageCreate) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tribes, _, err := s.cfg.TribeRepository.Fetch(context.Background(), &models.TribeFilter{
|
observations, _, err := s.cfg.ObservationRepository.Fetch(context.Background(), &models.ObservationFilter{
|
||||||
ServerID: []string{m.GuildID},
|
ServerID: []string{m.GuildID},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -381,8 +381,8 @@ func (s *Session) handleListCommand(m *discordgo.MessageCreate) {
|
||||||
}
|
}
|
||||||
|
|
||||||
msg := ""
|
msg := ""
|
||||||
for i, tribe := range tribes {
|
for i, observation := range observations {
|
||||||
msg += fmt.Sprintf("**%d**. %d - %s - %d\n", i+1, tribe.ID, tribe.World, tribe.TribeID)
|
msg += fmt.Sprintf("**%d**. %d - %s - %d\n", i+1, observation.ID, observation.World, observation.TribeID)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.SendEmbed(m.ChannelID, NewEmbed().
|
s.SendEmbed(m.ChannelID, NewEmbed().
|
||||||
|
|
|
@ -4,20 +4,20 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/tribalwarshelp/dcbot/observation"
|
||||||
"github.com/tribalwarshelp/dcbot/server"
|
"github.com/tribalwarshelp/dcbot/server"
|
||||||
"github.com/tribalwarshelp/dcbot/tribe"
|
|
||||||
"github.com/tribalwarshelp/golang-sdk/sdk"
|
"github.com/tribalwarshelp/golang-sdk/sdk"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SessionConfig struct {
|
type SessionConfig struct {
|
||||||
Token string
|
Token string
|
||||||
CommandPrefix string
|
CommandPrefix string
|
||||||
Status string
|
Status string
|
||||||
ServerRepository server.Repository
|
ServerRepository server.Repository
|
||||||
TribeRepository tribe.Repository
|
ObservationRepository observation.Repository
|
||||||
API *sdk.SDK
|
API *sdk.SDK
|
||||||
}
|
}
|
||||||
|
|
||||||
type Session struct {
|
type Session struct {
|
||||||
|
@ -79,8 +79,8 @@ func (s *Session) handleNewMessage(_ *discordgo.Session, m *discordgo.MessageCre
|
||||||
switch splitted[0] {
|
switch splitted[0] {
|
||||||
case HelpCommand.WithPrefix(s.cfg.CommandPrefix):
|
case HelpCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||||
s.handleHelpCommand(m)
|
s.handleHelpCommand(m)
|
||||||
case AddCommand.WithPrefix(s.cfg.CommandPrefix):
|
case ObserveCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||||
s.handleAddCommand(m, args...)
|
s.handleObserveCommand(m, args...)
|
||||||
case DeleteCommand.WithPrefix(s.cfg.CommandPrefix):
|
case DeleteCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||||
s.handleDeleteCommand(m, args...)
|
s.handleDeleteCommand(m, args...)
|
||||||
case ListCommand.WithPrefix(s.cfg.CommandPrefix):
|
case ListCommand.WithPrefix(s.cfg.CommandPrefix):
|
||||||
|
@ -131,3 +131,13 @@ func (s *Session) memberHasPermission(guildID string, userID string, permission
|
||||||
func (s *Session) sendUnknownCommandError(mention, channelID string, command ...string) {
|
func (s *Session) sendUnknownCommandError(mention, channelID string, command ...string) {
|
||||||
s.SendMessage(channelID, mention+` Nieznana komenda: `+strings.Join(command, " "))
|
s.SendMessage(channelID, mention+` Nieznana komenda: `+strings.Join(command, " "))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Session) IsGuildMember(guildID string) (bool, error) {
|
||||||
|
_, err := s.dg.State.Guild(guildID)
|
||||||
|
if err != nil {
|
||||||
|
if _, err = s.dg.Guild(guildID); err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -99,14 +99,10 @@ github.com/stretchr/testify v1.6.0 h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgh
|
||||||
github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo=
|
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo=
|
||||||
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs=
|
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs=
|
||||||
github.com/tribalwarshelp/golang-sdk v0.0.0-20200604163817-64920bab73bb h1:3arC78RszJkHTskhfPg/X4TXzlxHJFpF8FvDdFaavL8=
|
|
||||||
github.com/tribalwarshelp/golang-sdk v0.0.0-20200604163817-64920bab73bb/go.mod h1:8ALIvjiYLt0RVXz8TwDTJ3X5KAHv3M7+iYF/SvcA+1A=
|
|
||||||
github.com/tribalwarshelp/golang-sdk v0.0.0-20200607150457-971c5e02b4df h1:nki0kQ7MyZnChZ7QDKyCc441rPEHBIZC8D3WWY0L+LM=
|
github.com/tribalwarshelp/golang-sdk v0.0.0-20200607150457-971c5e02b4df h1:nki0kQ7MyZnChZ7QDKyCc441rPEHBIZC8D3WWY0L+LM=
|
||||||
github.com/tribalwarshelp/golang-sdk v0.0.0-20200607150457-971c5e02b4df/go.mod h1:8ALIvjiYLt0RVXz8TwDTJ3X5KAHv3M7+iYF/SvcA+1A=
|
github.com/tribalwarshelp/golang-sdk v0.0.0-20200607150457-971c5e02b4df/go.mod h1:8ALIvjiYLt0RVXz8TwDTJ3X5KAHv3M7+iYF/SvcA+1A=
|
||||||
github.com/tribalwarshelp/shared v0.0.0-20200604161459-deeeccf99815 h1:c+BTJgJyif/HDt8bRxqNaK7zQReI59ho9yWdk7a/gNo=
|
github.com/tribalwarshelp/shared v0.0.0-20200604161459-deeeccf99815 h1:c+BTJgJyif/HDt8bRxqNaK7zQReI59ho9yWdk7a/gNo=
|
||||||
github.com/tribalwarshelp/shared v0.0.0-20200604161459-deeeccf99815/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y=
|
github.com/tribalwarshelp/shared v0.0.0-20200604161459-deeeccf99815/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y=
|
||||||
github.com/tribalwarshelp/shared v0.0.0-20200607152720-fcd5cd5455a3 h1:mMarqvZbHGPTg63QxB9BTgKgYfnBx6nePywslMJ1M4s=
|
|
||||||
github.com/tribalwarshelp/shared v0.0.0-20200607152720-fcd5cd5455a3/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y=
|
|
||||||
github.com/tribalwarshelp/shared v0.0.0-20200607152914-8ab83c6d1364 h1:Pi3n/0FkrHrBO0oW9Lp6kRAEc4qKe7p8lohrEv4GOXE=
|
github.com/tribalwarshelp/shared v0.0.0-20200607152914-8ab83c6d1364 h1:Pi3n/0FkrHrBO0oW9Lp6kRAEc4qKe7p8lohrEv4GOXE=
|
||||||
github.com/tribalwarshelp/shared v0.0.0-20200607152914-8ab83c6d1364/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y=
|
github.com/tribalwarshelp/shared v0.0.0-20200607152914-8ab83c6d1364/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y=
|
||||||
github.com/vmihailenco/bufpool v0.1.5/go.mod h1:fL9i/PRTuS7AELqAHwSU1Zf1c70xhkhGe/cD5ud9pJk=
|
github.com/vmihailenco/bufpool v0.1.5/go.mod h1:fL9i/PRTuS7AELqAHwSU1Zf1c70xhkhGe/cD5ud9pJk=
|
||||||
|
|
24
main.go
24
main.go
|
@ -10,8 +10,8 @@ import (
|
||||||
|
|
||||||
_cron "github.com/tribalwarshelp/dcbot/cron"
|
_cron "github.com/tribalwarshelp/dcbot/cron"
|
||||||
"github.com/tribalwarshelp/dcbot/discord"
|
"github.com/tribalwarshelp/dcbot/discord"
|
||||||
|
observation_repository "github.com/tribalwarshelp/dcbot/observation/repository"
|
||||||
server_repository "github.com/tribalwarshelp/dcbot/server/repository"
|
server_repository "github.com/tribalwarshelp/dcbot/server/repository"
|
||||||
tribe_repository "github.com/tribalwarshelp/dcbot/tribe/repository"
|
|
||||||
|
|
||||||
"github.com/tribalwarshelp/shared/mode"
|
"github.com/tribalwarshelp/shared/mode"
|
||||||
|
|
||||||
|
@ -46,17 +46,17 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
tribeRepo, err := tribe_repository.NewPgRepo(db)
|
observationRepo, err := observation_repository.NewPgRepo(db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
sess, err := discord.New(discord.SessionConfig{
|
sess, err := discord.New(discord.SessionConfig{
|
||||||
Token: os.Getenv("BOT_TOKEN"),
|
Token: os.Getenv("BOT_TOKEN"),
|
||||||
CommandPrefix: "tw!",
|
CommandPrefix: "tw!",
|
||||||
Status: "Tribalwars | tw!help",
|
Status: "Tribalwars | tw!help",
|
||||||
TribeRepository: tribeRepo,
|
ObservationRepository: observationRepo,
|
||||||
ServerRepository: serverRepo,
|
ServerRepository: serverRepo,
|
||||||
API: api,
|
API: api,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
@ -67,10 +67,10 @@ func main() {
|
||||||
cron.SkipIfStillRunning(cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))),
|
cron.SkipIfStillRunning(cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))),
|
||||||
))
|
))
|
||||||
_cron.Attach(c, _cron.Config{
|
_cron.Attach(c, _cron.Config{
|
||||||
ServerRepo: serverRepo,
|
ServerRepo: serverRepo,
|
||||||
TribeRepo: tribeRepo,
|
ObservationRepo: observationRepo,
|
||||||
Discord: sess,
|
Discord: sess,
|
||||||
API: api,
|
API: api,
|
||||||
})
|
})
|
||||||
go func() {
|
go func() {
|
||||||
c.Run()
|
c.Run()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
type Tribe struct {
|
type Observation struct {
|
||||||
ID int `json:"id" gqlgen:"id"`
|
ID int `json:"id" gqlgen:"id"`
|
||||||
World string `pg:"unique:group_1" json:"world" gqlgen:"world"`
|
World string `pg:"unique:group_1" json:"world" gqlgen:"world"`
|
||||||
TribeID int `pg:"unique:group_1" json:"TribeID" gqlgen:"TribeID"`
|
TribeID int `pg:"unique:group_1" json:"TribeID" gqlgen:"TribeID"`
|
||||||
|
@ -8,19 +8,20 @@ type Tribe struct {
|
||||||
Server *Server `json:"server,omitempty" gqlgen:"server"`
|
Server *Server `json:"server,omitempty" gqlgen:"server"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Tribes []*Tribe
|
type Observations []*Observation
|
||||||
|
|
||||||
func (t Tribes) Contains(world string, id int) bool {
|
func (o Observations) Contains(world string, id int) bool {
|
||||||
for _, tribe := range t {
|
for _, observation := range o {
|
||||||
if tribe.TribeID == id && tribe.World == world {
|
if observation.TribeID == id && observation.World == world {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
type TribeFilter struct {
|
type ObservationFilter struct {
|
||||||
ID []int
|
ID []int
|
||||||
|
World []string
|
||||||
ServerID []string
|
ServerID []string
|
||||||
Limit int `urlstruct:",nowhere"`
|
Limit int `urlstruct:",nowhere"`
|
||||||
Offset int `urlstruct:",nowhere"`
|
Offset int `urlstruct:",nowhere"`
|
|
@ -1,10 +1,10 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
ID string `pg:",pk" json:"id" gqlgen:"id"`
|
ID string `pg:",pk" json:"id" gqlgen:"id"`
|
||||||
ConqueredVillagesChannelID string `json:"conqueredVillagesChannelID" gqlgen:"conqueredVillagesChannelID"`
|
ConqueredVillagesChannelID string `json:"conqueredVillagesChannelID" gqlgen:"conqueredVillagesChannelID"`
|
||||||
LostVillagesChannelID string `json:"lostVillagesChannelID" gqlgen:"lostVillagesChannelID"`
|
LostVillagesChannelID string `json:"lostVillagesChannelID" gqlgen:"lostVillagesChannelID"`
|
||||||
Tribes Tribes `json:"tribes,omitempty" gqlgen:"tribes"`
|
Observations Observations `json:"observation,omitempty" gqlgen:"observation"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ServerFilter struct {
|
type ServerFilter struct {
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package observation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/tribalwarshelp/dcbot/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Repository interface {
|
||||||
|
Store(ctx context.Context, observation *models.Observation) error
|
||||||
|
StoreMany(ctx context.Context, observations []*models.Observation) error
|
||||||
|
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)
|
||||||
|
}
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/tribalwarshelp/dcbot/models"
|
"github.com/tribalwarshelp/dcbot/models"
|
||||||
"github.com/tribalwarshelp/dcbot/tribe"
|
"github.com/tribalwarshelp/dcbot/observation"
|
||||||
|
|
||||||
"github.com/go-pg/pg/v10"
|
"github.com/go-pg/pg/v10"
|
||||||
"github.com/go-pg/pg/v10/orm"
|
"github.com/go-pg/pg/v10/orm"
|
||||||
|
@ -15,33 +15,33 @@ type pgRepo struct {
|
||||||
*pg.DB
|
*pg.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPgRepo(db *pg.DB) (tribe.Repository, error) {
|
func NewPgRepo(db *pg.DB) (observation.Repository, error) {
|
||||||
if err := db.CreateTable((*models.Tribe)(nil), &orm.CreateTableOptions{
|
if err := db.CreateTable((*models.Observation)(nil), &orm.CreateTableOptions{
|
||||||
IfNotExists: true,
|
IfNotExists: true,
|
||||||
FKConstraints: true,
|
FKConstraints: true,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return nil, errors.Wrap(err, "Cannot create 'tribes' table")
|
return nil, errors.Wrap(err, "Cannot create 'observations' table")
|
||||||
}
|
}
|
||||||
return &pgRepo{db}, nil
|
return &pgRepo{db}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *pgRepo) Store(ctx context.Context, tribe *models.Tribe) error {
|
func (repo *pgRepo) Store(ctx context.Context, observation *models.Observation) error {
|
||||||
if _, err := repo.Model(tribe).Returning("*").Context(ctx).Insert(); err != nil {
|
if _, err := repo.Model(observation).Returning("*").Context(ctx).Insert(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *pgRepo) StoreMany(ctx context.Context, tribes []*models.Tribe) error {
|
func (repo *pgRepo) StoreMany(ctx context.Context, observations []*models.Observation) error {
|
||||||
if _, err := repo.Model(&tribes).Returning("*").Context(ctx).Insert(); err != nil {
|
if _, err := repo.Model(&observations).Returning("*").Context(ctx).Insert(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *pgRepo) Update(ctx context.Context, tribe *models.Tribe) error {
|
func (repo *pgRepo) Update(ctx context.Context, observation *models.Observation) error {
|
||||||
if _, err := repo.
|
if _, err := repo.
|
||||||
Model(tribe).
|
Model(observation).
|
||||||
WherePK().
|
WherePK().
|
||||||
Returning("*").
|
Returning("*").
|
||||||
Context(ctx).
|
Context(ctx).
|
||||||
|
@ -51,9 +51,9 @@ func (repo *pgRepo) Update(ctx context.Context, tribe *models.Tribe) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *pgRepo) Fetch(ctx context.Context, f *models.TribeFilter) ([]*models.Tribe, int, error) {
|
func (repo *pgRepo) Fetch(ctx context.Context, f *models.ObservationFilter) ([]*models.Observation, int, error) {
|
||||||
var err error
|
var err error
|
||||||
data := []*models.Tribe{}
|
data := []*models.Observation{}
|
||||||
query := repo.Model(&data).Context(ctx)
|
query := repo.Model(&data).Context(ctx)
|
||||||
|
|
||||||
if f != nil {
|
if f != nil {
|
||||||
|
@ -76,7 +76,7 @@ func (repo *pgRepo) Fetch(ctx context.Context, f *models.TribeFilter) ([]*models
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *pgRepo) FetchWorlds(ctx context.Context) ([]string, error) {
|
func (repo *pgRepo) FetchWorlds(ctx context.Context) ([]string, error) {
|
||||||
data := []*models.Tribe{}
|
data := []*models.Observation{}
|
||||||
res := []string{}
|
res := []string{}
|
||||||
err := repo.
|
err := repo.
|
||||||
Model(&data).
|
Model(&data).
|
||||||
|
@ -88,8 +88,8 @@ func (repo *pgRepo) FetchWorlds(ctx context.Context) ([]string, error) {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *pgRepo) Delete(ctx context.Context, f *models.TribeFilter) ([]*models.Tribe, error) {
|
func (repo *pgRepo) Delete(ctx context.Context, f *models.ObservationFilter) ([]*models.Observation, error) {
|
||||||
data := []*models.Tribe{}
|
data := []*models.Observation{}
|
||||||
query := repo.Model(&data).Context(ctx)
|
query := repo.Model(&data).Context(ctx)
|
||||||
|
|
||||||
if f != nil {
|
if f != nil {
|
|
@ -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) {
|
func (repo *pgRepo) Fetch(ctx context.Context, f *models.ServerFilter) ([]*models.Server, int, error) {
|
||||||
var err error
|
var err error
|
||||||
data := []*models.Server{}
|
data := []*models.Server{}
|
||||||
query := repo.Model(&data).Context(ctx).Relation("Tribes")
|
query := repo.Model(&data).Context(ctx).Relation("Observations")
|
||||||
|
|
||||||
if f != nil {
|
if f != nil {
|
||||||
query = query.
|
query = query.
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
package tribe
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/tribalwarshelp/dcbot/models"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Repository interface {
|
|
||||||
Store(ctx context.Context, tribe *models.Tribe) error
|
|
||||||
StoreMany(ctx context.Context, tribes []*models.Tribe) error
|
|
||||||
Update(ctx context.Context, tribe *models.Tribe) error
|
|
||||||
Delete(ctx context.Context, filter *models.TribeFilter) ([]*models.Tribe, error)
|
|
||||||
Fetch(ctx context.Context, filter *models.TribeFilter) ([]*models.Tribe, int, error)
|
|
||||||
FetchWorlds(ctx context.Context) ([]string, error)
|
|
||||||
}
|
|
Reference in New Issue