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/discord.go

161 lines
4.1 KiB
Go

package discord
import (
"fmt"
"strings"
"github.com/tribalwarshelp/dcbot/group"
"github.com/tribalwarshelp/dcbot/observation"
"github.com/tribalwarshelp/dcbot/server"
"github.com/tribalwarshelp/golang-sdk/sdk"
"github.com/bwmarrin/discordgo"
)
type SessionConfig struct {
Token string
CommandPrefix string
Status string
ServerRepository server.Repository
GroupRepository group.Repository
ObservationRepository observation.Repository
API *sdk.SDK
}
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())
}
if err := s.dg.UpdateStatus(0, s.cfg.Status); err != nil {
return err
}
return nil
}
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
}
func (s *Session) handleNewMessage(_ *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.ID == s.dg.State.User.ID || m.Author.Bot {
return
}
splitted := strings.Split(m.Content, " ")
argsLength := len(splitted) - 1
args := splitted[1 : argsLength+1]
switch splitted[0] {
case HelpCommand.WithPrefix(s.cfg.CommandPrefix):
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, args...)
case ConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
s.handleConqueredVillagesCommand(m, args...)
case UnObserveConqueredVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
s.handleUnObserveConqueredVillagesCommand(m, args...)
case LostVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
s.handleLostVillagesCommand(m, args...)
case UnObserveLostVillagesCommand.WithPrefix(s.cfg.CommandPrefix):
s.handleUnObserveLostVillagesCommand(m, args...)
}
}
func (s *Session) memberHasPermission(guildID string, userID string, permission int) (bool, error) {
member, err := s.dg.State.Member(guildID, userID)
if err != nil {
if member, err = s.dg.GuildMember(guildID, userID); err != nil {
return false, err
}
}
// check if a user is guild owner
guild, err := s.dg.State.Guild(guildID)
if err != nil {
if guild, err = s.dg.Guild(guildID); err != nil {
return false, err
}
}
if guild.OwnerID == userID {
return true, nil
}
// 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
}
func (s *Session) sendUnknownCommandError(mention, channelID string, command ...string) {
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
}