/
client.go
107 lines (93 loc) · 2.46 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package discord
import (
"fmt"
"github.com/bwmarrin/discordgo"
)
type Client struct {
BotSession *discordgo.Session
Guilds map[string]Guild
}
type Guild struct {
ID string `mapstructure:"id"`
MemberRoleID string `mapstructure:"memberRole"`
WelcomeChannelID string `mapstructure:"welcomeChannel"`
}
type Member struct {
ID string
ServerNick string
Username string
GlobalName string
GuildID string
Roles []string
}
func (m Member) Nick() string {
if len(m.ServerNick) > 0 {
return m.ServerNick
}
if len(m.GlobalName) > 0 {
return m.GlobalName
}
return m.Username
}
func NewClient(token string) (*Client, error) {
discordBot, err := discordgo.New("Bot " + token)
return &Client{
BotSession: discordBot,
}, err
}
func (c *Client) GuildMembers() (map[string]map[string]Member, error) {
members := make(map[string]map[string]Member)
for name, guild := range c.Guilds {
members[name] = make(map[string]Member)
// TODO: actually paginate this if we have over 1000 members
guildMembers, err := c.BotSession.GuildMembers(guild.ID, "", 1000)
if err != nil {
return nil, fmt.Errorf("failed to get guild members for %s: %s", name, err)
}
for _, gm := range guildMembers {
members[name][gm.User.ID] = Member{
ID: gm.User.ID,
ServerNick: gm.Nick,
Username: gm.User.Username,
GlobalName: gm.User.GlobalName,
GuildID: gm.GuildID,
Roles: gm.Roles,
}
}
}
return members, nil
}
func (c *Client) AddMemberRole(userID, guildName string) error {
guild, ok := c.Guilds[guildName]
if !ok {
return fmt.Errorf("guild name %s not configured", guildName)
}
err := c.BotSession.GuildMemberRoleAdd(guild.ID, userID, guild.MemberRoleID)
if err != nil {
return fmt.Errorf("failed to add user %s to guild %s member role: %w", userID, guildName, err)
}
return nil
}
func (c *Client) RemoveMemberRole(userID, guildName string) error {
guild, ok := c.Guilds[guildName]
if !ok {
return fmt.Errorf("guild name %s not configured", guildName)
}
err := c.BotSession.GuildMemberRoleRemove(guild.ID, userID, guild.MemberRoleID)
if err != nil {
return fmt.Errorf("failed to remove user %s from guild %s member role: %w", userID, guildName, err)
}
return nil
}
func (c *Client) HasMemberRole(member Member, guildName string) bool {
guild, ok := c.Guilds[guildName]
if !ok {
return false
}
for _, r := range member.Roles {
if r == guild.MemberRoleID {
return true
}
}
return false
}