2020-05-30 08:35:45 +00:00
|
|
|
package discord
|
|
|
|
|
|
|
|
import (
|
2020-07-19 10:16:02 +00:00
|
|
|
"context"
|
2020-05-30 08:35:45 +00:00
|
|
|
"fmt"
|
|
|
|
"strings"
|
2020-06-02 07:00:40 +00:00
|
|
|
|
2020-07-19 10:16:02 +00:00
|
|
|
"github.com/tribalwarshelp/dcbot/message"
|
|
|
|
|
2020-06-26 18:30:25 +00:00
|
|
|
"github.com/tribalwarshelp/dcbot/group"
|
2020-07-19 10:16:02 +00:00
|
|
|
"github.com/tribalwarshelp/dcbot/models"
|
2020-06-18 12:51:31 +00:00
|
|
|
"github.com/tribalwarshelp/dcbot/observation"
|
2020-06-02 07:00:40 +00:00
|
|
|
"github.com/tribalwarshelp/dcbot/server"
|
2020-06-05 15:49:51 +00:00
|
|
|
"github.com/tribalwarshelp/golang-sdk/sdk"
|
2020-05-30 08:35:45 +00:00
|
|
|
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
|
|
)
|
|
|
|
|
|
|
|
type SessionConfig struct {
|
2020-06-18 12:51:31 +00:00
|
|
|
Token string
|
|
|
|
CommandPrefix string
|
|
|
|
Status string
|
|
|
|
ServerRepository server.Repository
|
2020-06-26 18:30:25 +00:00
|
|
|
GroupRepository group.Repository
|
2020-06-18 12:51:31 +00:00
|
|
|
ObservationRepository observation.Repository
|
|
|
|
API *sdk.SDK
|
2020-05-30 08:35:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Session struct {
|
|
|
|
dg *discordgo.Session
|
|
|
|
cfg SessionConfig
|
|
|
|
}
|
|
|
|
|
|
|
|
func New(cfg SessionConfig) (*Session, error) {
|
|
|
|
var err error
|
|
|
|
s := &Session{
|
|
|
|
cfg: cfg,
|
|
|
|
}
|
|
|
|
s.dg, err = discordgo.New("Bot " + cfg.Token)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if err := s.init(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return s, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Session) init() error {
|
|
|
|
s.dg.AddHandler(s.handleNewMessage)
|
|
|
|
|
|
|
|
err := s.dg.Open()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error opening ws connection: %s", err.Error())
|
|
|
|
}
|
|
|
|
|
2020-07-15 10:03:43 +00:00
|
|
|
if err := s.UpdateStatus(s.cfg.Status); err != nil {
|
2020-05-30 08:35:45 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-06-06 12:28:45 +00:00
|
|
|
func (s *Session) Close() error {
|
|
|
|
return s.dg.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Session) SendMessage(channelID, message string) error {
|
|
|
|
_, err := s.dg.ChannelMessageSend(channelID, message)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Session) SendEmbed(channelID string, message *discordgo.MessageEmbed) error {
|
|
|
|
_, err := s.dg.ChannelMessageSendEmbed(channelID, message)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2020-07-15 10:03:43 +00:00
|
|
|
func (s *Session) UpdateStatus(status string) error {
|
|
|
|
if err := s.dg.UpdateStatus(0, status); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-05-30 08:35:45 +00:00
|
|
|
func (s *Session) handleNewMessage(_ *discordgo.Session, m *discordgo.MessageCreate) {
|
2020-07-19 10:16:02 +00:00
|
|
|
if m.Author.ID == s.dg.State.User.ID || m.Author.Bot || m.GuildID == "" {
|
2020-05-30 08:35:45 +00:00
|
|
|
return
|
|
|
|
}
|
2020-06-05 15:49:51 +00:00
|
|
|
|
2020-05-30 08:35:45 +00:00
|
|
|
splitted := strings.Split(m.Content, " ")
|
|
|
|
argsLength := len(splitted) - 1
|
|
|
|
args := splitted[1 : argsLength+1]
|
2020-07-19 10:16:02 +00:00
|
|
|
server := &models.Server{
|
|
|
|
ID: m.GuildID,
|
|
|
|
Lang: message.GetDefaultLanguage().String(),
|
|
|
|
}
|
|
|
|
if err := s.cfg.ServerRepository.Store(context.Background(), server); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx := commandCtx{
|
|
|
|
server: server,
|
|
|
|
localizer: message.NewLocalizer(server.Lang),
|
|
|
|
}
|
2020-05-30 08:35:45 +00:00
|
|
|
switch splitted[0] {
|
|
|
|
case HelpCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 10:16:02 +00:00
|
|
|
s.handleHelpCommand(ctx, m)
|
2020-06-26 07:47:33 +00:00
|
|
|
case AuthorCommand.WithPrefix(s.cfg.CommandPrefix):
|
|
|
|
s.handleAuthorCommand(m)
|
2020-06-26 18:30:25 +00:00
|
|
|
case TribeCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 11:22:59 +00:00
|
|
|
s.handleTribeCommand(ctx, m, args...)
|
2020-06-26 18:30:25 +00:00
|
|
|
|
|
|
|
case AddGroupCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 11:40:53 +00:00
|
|
|
s.handleAddGroupCommand(ctx, m)
|
2020-06-26 18:30:25 +00:00
|
|
|
case DeleteGroupCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 11:50:01 +00:00
|
|
|
s.handleDeleteGroupCommand(ctx, m, args...)
|
2020-06-26 18:30:25 +00:00
|
|
|
case GroupsCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 12:22:41 +00:00
|
|
|
s.handleGroupsCommand(ctx, m)
|
2020-06-26 18:30:25 +00:00
|
|
|
|
2020-07-15 09:51:49 +00:00
|
|
|
case ShowEnnobledBarbariansCommand.WithPrefix(s.cfg.CommandPrefix):
|
|
|
|
s.handleShowEnnobledBarbariansCommand(m, args...)
|
2020-06-18 12:51:31 +00:00
|
|
|
case ObserveCommand.WithPrefix(s.cfg.CommandPrefix):
|
|
|
|
s.handleObserveCommand(m, args...)
|
2020-06-18 13:54:31 +00:00
|
|
|
case UnObserveCommand.WithPrefix(s.cfg.CommandPrefix):
|
|
|
|
s.handleUnObserveCommand(m, args...)
|
|
|
|
case ObservationsCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-06-26 18:30:25 +00:00
|
|
|
s.handleObservationsCommand(m, args...)
|
2020-05-30 08:54:28 +00:00
|
|
|
case ConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 12:22:41 +00:00
|
|
|
s.handleConqueredVillagesCommand(ctx, m, args...)
|
2020-06-26 07:47:33 +00:00
|
|
|
case UnObserveConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 12:22:41 +00:00
|
|
|
s.handleUnObserveConqueredVillagesCommand(ctx, m, args...)
|
2020-06-26 07:47:33 +00:00
|
|
|
case LostVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 12:22:41 +00:00
|
|
|
s.handleLostVillagesCommand(ctx, m, args...)
|
2020-06-26 07:47:33 +00:00
|
|
|
case UnObserveLostVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
|
2020-07-19 12:22:41 +00:00
|
|
|
s.handleUnObserveLostVillagesCommand(ctx, m, args...)
|
2020-06-26 18:30:25 +00:00
|
|
|
|
2020-06-05 15:49:51 +00:00
|
|
|
}
|
2020-05-30 08:35:45 +00:00
|
|
|
}
|
|
|
|
|
2020-05-30 08:54:28 +00:00
|
|
|
func (s *Session) memberHasPermission(guildID string, userID string, permission int) (bool, error) {
|
2020-06-07 15:49:33 +00:00
|
|
|
member, err := s.dg.State.Member(guildID, userID)
|
2020-05-31 11:34:24 +00:00
|
|
|
if err != nil {
|
2020-06-07 15:49:33 +00:00
|
|
|
if member, err = s.dg.GuildMember(guildID, userID); err != nil {
|
2020-05-31 11:39:51 +00:00
|
|
|
return false, err
|
|
|
|
}
|
2020-05-31 11:34:24 +00:00
|
|
|
}
|
|
|
|
|
2020-06-07 15:49:33 +00:00
|
|
|
// check if a user is guild owner
|
|
|
|
guild, err := s.dg.State.Guild(guildID)
|
2020-05-30 08:35:45 +00:00
|
|
|
if err != nil {
|
2020-06-07 15:49:33 +00:00
|
|
|
if guild, err = s.dg.Guild(guildID); err != nil {
|
2020-05-30 08:35:45 +00:00
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
}
|
2020-06-07 15:49:33 +00:00
|
|
|
if guild.OwnerID == userID {
|
|
|
|
return true, nil
|
|
|
|
}
|
2020-05-30 08:35:45 +00:00
|
|
|
|
|
|
|
// Iterate through the role IDs stored in member.Roles
|
|
|
|
// to check permissions
|
|
|
|
for _, roleID := range member.Roles {
|
|
|
|
role, err := s.dg.State.Role(guildID, roleID)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
if role.Permissions&permission != 0 {
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false, nil
|
|
|
|
}
|
2020-06-05 17:58:15 +00:00
|
|
|
|
|
|
|
func (s *Session) sendUnknownCommandError(mention, channelID string, command ...string) {
|
2020-07-19 10:16:02 +00:00
|
|
|
s.SendMessage(channelID, mention+` Unknown command: `+strings.Join(command, " "))
|
2020-06-05 17:58:15 +00:00
|
|
|
}
|
2020-06-18 12:51:31 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|