/
user.go
132 lines (113 loc) · 3.08 KB
/
user.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package discord
import (
"strconv"
"time"
"github.com/disgoorg/disgo/json"
"github.com/disgoorg/snowflake/v2"
)
// UserFlags defines certain flags/badges a user can have (https://discord.com/developers/docs/resources/user#user-object-user-flags)
type UserFlags int
// All UserFlags
const (
UserFlagDiscordEmployee UserFlags = 1 << iota
UserFlagPartneredServerOwner
UserFlagHypeSquadEvents
UserFlagBugHunterLevel1
_
_
UserFlagHouseBravery
UserFlagHouseBrilliance
UserFlagHouseBalance
UserFlagEarlySupporter
UserFlagTeamUser
_
_
_
UserFlagBugHunterLevel2
_
UserFlagVerifiedBot
UserFlagEarlyVerifiedBotDeveloper
UserFlagDiscordCertifiedModerator
UserFlagBotHTTPInteractions
UserFlagsNone UserFlags = 0
)
var _ Mentionable = (*User)(nil)
// User is a struct for interacting with discord's users
type User struct {
ID snowflake.ID `json:"id"`
Username string `json:"username"`
Discriminator string `json:"discriminator"`
Avatar *string `json:"avatar"`
Banner *string `json:"banner"`
AccentColor *int `json:"accent_color"`
Bot bool `json:"bot"`
System bool `json:"system"`
PublicFlags UserFlags `json:"public_flags"`
}
func (u User) String() string {
return UserMention(u.ID)
}
func (u User) Mention() string {
return u.String()
}
func (u User) Tag() string {
return UserTag(u.Username, u.Discriminator)
}
func (u User) EffectiveAvatarURL(opts ...CDNOpt) string {
if u.Avatar == nil {
return u.DefaultAvatarURL(opts...)
}
if avatar := u.AvatarURL(opts...); avatar != nil {
return *avatar
}
return ""
}
func (u User) AvatarURL(opts ...CDNOpt) *string {
if u.Avatar == nil {
return nil
}
url := formatAssetURL(UserAvatar, opts, u.ID, *u.Avatar)
return &url
}
func (u User) DefaultAvatarURL(opts ...CDNOpt) string {
discriminator, err := strconv.Atoi(u.Discriminator)
if err != nil {
return ""
}
return formatAssetURL(DefaultUserAvatar, opts, discriminator%5)
}
func (u User) BannerURL(opts ...CDNOpt) *string {
if u.Banner == nil {
return nil
}
url := formatAssetURL(UserBanner, opts, u.ID, *u.Banner)
return &url
}
func (u User) CreatedAt() time.Time {
return u.ID.Time()
}
// OAuth2User represents a full User returned by the oauth2 endpoints
type OAuth2User struct {
User
// Requires OAuth2ScopeIdentify
MfaEnabled bool `json:"mfa_enabled"`
Locale string `json:"locale"`
Flags UserFlags `json:"flags"`
PremiumType PremiumType `json:"premium_type"`
// Requires OAuth2ScopeEmail
Verified bool `json:"verified"`
Email string `json:"email"`
}
// PremiumType defines the different discord nitro tiers a user can have (https://discord.com/developers/docs/resources/user#user-object-premium-types)
type PremiumType int
// All PremiumType(s)
const (
PremiumTypeNone PremiumType = iota
PremiumTypeNitroClassic
PremiumTypeNitro
)
// SelfUserUpdate is the payload used to update the OAuth2User
type SelfUserUpdate struct {
Username string `json:"username,omitempty"`
Avatar *json.Nullable[Icon] `json:"avatar,omitempty"`
}