Skip to content

Commit 8d4cfb4

Browse files
committed
feat: add !user command
1 parent 2638954 commit 8d4cfb4

File tree

4 files changed

+135
-1
lines changed

4 files changed

+135
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ that forwards commits of the FreeBSD GitHub repositories to Discord.
1717
| !role <role> | Allows users the ability to assign themselves roles |
1818
| !bug <id> | Sends a message embed detailing a problem report from Bugzilla. Additionally, messages matching the FreeBSD Bugzilla URL will trigger this event |
1919
| !review <id> | Sends a message embed detailing a Differntial revision from Phabricator. Additionally, messages matching the FreeBSD Phabricator URL will trigger this event |
20+
| !user <id> | Sends a message embed detailing a user |
2021

2122
Key events on Discord including message updates, deletions, member
2223
removals and bans are logged in a public channel to ensure transparency

config.yaml.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ bot:
1717
# Prefix that triggers bot commands (e.g, "!role").
1818
discord_prefix: "!"
1919
# List of enabled bot commands.
20-
discord_commands: ["help", "role", "bug", "review", "status"]
20+
discord_commands: ["help", "role", "bug", "review", "status", "user"]
2121
# Channel where audit events (message edits, deletes, AutoMod actions, etc)
2222
# are posted.
2323
discord_log_channel_id: ""

internal/bot/handler/command/command.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ func New(settings config.Settings) *Handler {
4646
"Display information of a Phabricator differential revision providing an ID",
4747
h.Review,
4848
},
49+
"user": {
50+
"user",
51+
"Display user information of a provided ID",
52+
h.User,
53+
},
4954
}
5055

5156
for _, name := range settings.Commands {
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
// SPDX-License-Identifier: BSD-2-Clause
2+
//
3+
// Copyright (c) Lewis Cook <[email protected]>
4+
package command
5+
6+
import (
7+
"strings"
8+
9+
"github.com/bwmarrin/discordgo"
10+
)
11+
12+
func (h *Handler) User(s *discordgo.Session, m *discordgo.MessageCreate) {
13+
if m.Author.Bot || m.Author.ID == s.State.User.ID {
14+
return
15+
}
16+
17+
if directMessage(s, m) {
18+
return
19+
}
20+
21+
if !strings.HasPrefix(m.Content, h.Settings.Prefix+"user") {
22+
return
23+
}
24+
25+
id := strings.Split(m.Content, " ")
26+
if len(id) == 1 {
27+
return
28+
}
29+
30+
user, err := s.User(id[1])
31+
if err != nil {
32+
return
33+
}
34+
35+
var fields []*discordgo.MessageEmbedField
36+
37+
fields = append(fields, &discordgo.MessageEmbedField{
38+
Name: "Username",
39+
Value: user.Username,
40+
Inline: true,
41+
})
42+
43+
fields = append(fields, &discordgo.MessageEmbedField{
44+
Name: "Global name",
45+
Value: user.GlobalName,
46+
Inline: true,
47+
})
48+
49+
fields = append(fields, &discordgo.MessageEmbedField{
50+
Name: "Account created",
51+
Value: func() string {
52+
created, _ := discordgo.SnowflakeTimestamp(user.ID)
53+
return created.String()
54+
}(),
55+
})
56+
57+
member, err := s.GuildMember(m.GuildID, user.ID)
58+
if err == nil {
59+
fields = append(fields, &discordgo.MessageEmbedField{
60+
Name: "Member joined",
61+
Value: member.JoinedAt.String(),
62+
})
63+
64+
if member.Nick != "" {
65+
fields = append(fields, &discordgo.MessageEmbedField{
66+
Name: "Member nickname",
67+
Value: member.Nick,
68+
Inline: true,
69+
})
70+
}
71+
72+
fields = append(fields, &discordgo.MessageEmbedField{
73+
Name: "Pending",
74+
Value: func() string {
75+
if member.Pending {
76+
return "true"
77+
}
78+
79+
return "false"
80+
}(),
81+
Inline: true,
82+
})
83+
84+
guildRoles, err := s.GuildRoles(m.GuildID)
85+
if err != nil {
86+
return
87+
}
88+
89+
rolesMap := make(map[string]*discordgo.Role, len(guildRoles))
90+
for _, role := range guildRoles {
91+
rolesMap[role.ID] = role
92+
}
93+
94+
var roles []string
95+
96+
for _, roleID := range member.Roles {
97+
if role, exists := rolesMap[roleID]; exists {
98+
roles = append(roles, role.Mention())
99+
}
100+
}
101+
102+
if len(roles) >= 1 {
103+
fields = append(fields, &discordgo.MessageEmbedField{
104+
Name: "Roles",
105+
Value: strings.Join(roles, " "),
106+
Inline: true,
107+
})
108+
}
109+
}
110+
111+
s.ChannelMessageSendEmbedReply(
112+
m.ChannelID,
113+
&discordgo.MessageEmbed{
114+
Fields: fields,
115+
Image: &discordgo.MessageEmbedImage{
116+
URL: user.BannerURL("512"),
117+
},
118+
Thumbnail: &discordgo.MessageEmbedThumbnail{
119+
URL: user.AvatarURL("512"),
120+
},
121+
Footer: &discordgo.MessageEmbedFooter{
122+
Text: "ID: " + user.ID,
123+
},
124+
Color: user.AccentColor,
125+
},
126+
m.Reference(),
127+
)
128+
}

0 commit comments

Comments
 (0)