1
0
Fork 0
mirror of https://github.com/diamondburned/arikawa.git synced 2024-11-30 18:53:30 +00:00
arikawa/discord/user.go
PlavorSeol 78e456d49e
discord: Fix calculation of default avatar URL (#398)
* Fix the calculation of a default user avatar index

* run go fmt
2023-07-17 23:01:50 -07:00

269 lines
6.4 KiB
Go

package discord
import (
"strconv"
"time"
)
type User struct {
ID UserID `json:"id"`
Username string `json:"username"`
Discriminator string `json:"discriminator"` // This is "0" if the user has migrated to the new username system.
Avatar Hash `json:"avatar"`
DisplayName string `json:"global_name"`
// These fields may be omitted
Bot bool `json:"bot,omitempty"`
MFA bool `json:"mfa_enabled,omitempty"`
Nitro UserNitro `json:"premium_type,omitempty"`
Flags UserFlags `json:"flags,omitempty"`
PublicFlags UserFlags `json:"public_flags,omitempty"`
DiscordSystem bool `json:"system,omitempty"`
EmailVerified bool `json:"verified,omitempty"`
Locale string `json:"locale,omitempty"`
Email string `json:"email,omitempty"`
Banner Hash `json:"banner,omitempty"`
Accent Color `json:"accent_color,omitempty"`
}
// CreatedAt returns a time object representing when the user was created.
func (u User) CreatedAt() time.Time {
return u.ID.Time()
}
// Mention returns a mention of the user.
func (u User) Mention() string {
return u.ID.Mention()
}
// Tag returns a tag of the user.
func (u User) Tag() string {
if u.Discriminator == "0" || u.Discriminator == "0000" {
return u.Username
}
return u.Username + "#" + u.Discriminator
}
// DisplayOrUsername returns the DisplayName if it is set, otherwise the
// Username.
func (u User) DisplayOrUsername() string {
if u.DisplayName != "" {
return u.DisplayName
}
return u.Username
}
// DisplayOrTag returns the DisplayName if it is set, otherwise the Tag.
func (u User) DisplayOrTag() string {
if u.DisplayName != "" {
return u.DisplayName
}
return u.Tag()
}
// AvatarURL returns the URL of the Avatar Image. It automatically detects a
// suitable type.
func (u User) AvatarURL() string {
return u.AvatarURLWithType(AutoImage)
}
// AvatarURLWithType returns the URL of the Avatar Image using the passed type.
// If the user has no Avatar, his default avatar will be returned. This
// requires ImageType Auto or PNG
//
// Supported Image Types: PNG, JPEG, WebP, GIF (read above for caveat)
func (u User) AvatarURLWithType(t ImageType) string {
if u.Avatar == "" {
if t != PNGImage && t != AutoImage {
return ""
}
var picNo string
if u.Discriminator != "0" {
disc, err := strconv.Atoi(u.Discriminator)
if err != nil { // this should never happen
return ""
}
picNo = strconv.Itoa(disc % 5)
} else {
picNo = strconv.FormatUint(uint64(u.ID>>22)%6, 10)
}
return "https://cdn.discordapp.com/embed/avatars/" + picNo + ".png"
}
return "https://cdn.discordapp.com/avatars/" + u.ID.String() + "/" + t.format(u.Avatar)
}
// BannerURL returns the URL of the Banner Image. It automatically detects a
// suitable type.
func (u User) BannerURL() string {
return u.BannerURLWithType(AutoImage)
}
// BannerURLWithType returns the URL of the Banner Image using the passed type.
// If the user has no Banner, an empty string will be returned.
func (u User) BannerURLWithType(t ImageType) string {
if u.Banner == "" {
return ""
}
return "https://cdn.discordapp.com/banners/" + u.ID.String() + "/" + t.format(u.Banner)
}
type UserFlags uint32
const NoFlag UserFlags = 0
const (
Employee UserFlags = 1 << iota
Partner
HypeSquadEvents
BugHunterLvl1
_
_
HouseBravery
HouseBrilliance
HouseBalance
EarlySupporter
TeamUser
_
System
_
BugHunterLvl2
_
VerifiedBot
VerifiedBotDeveloper
CertifiedModerator
LikelySpammer // undocumented
)
type UserNitro uint8
const (
NoUserNitro UserNitro = iota
NitroClassic
NitroFull
NitroBasic
)
type Connection struct {
ID string `json:"id"`
Name string `json:"name"`
Type Service `json:"type"`
Revoked bool `json:"revoked"`
Verified bool `json:"verified"`
FriendSync bool `json:"friend_sync"`
ShowActivity bool `json:"show_activity"`
Visibility ConnectionVisibility `json:"visibility"`
// Only partial
Integrations []Integration `json:"integrations"`
}
type ConnectionVisibility uint8
const (
ConnectionNotVisible ConnectionVisibility = iota
ConnectionVisibleEveryone
)
type Activity struct {
Name string `json:"name"`
URL URL `json:"url,omitempty"`
Type ActivityType `json:"type"`
// User only
Instance bool `json:"instance,omitempty"`
Flags ActivityFlags `json:"flags,omitempty"`
CreatedAt UnixTimestamp `json:"created_at,omitempty"`
Timestamps *ActivityTimestamps `json:"timestamps,omitempty"`
AppID AppID `json:"application_id,omitempty"`
Details string `json:"details,omitempty"`
State string `json:"state,omitempty"` // party status
Emoji *Emoji `json:"emoji,omitempty"`
Party *ActivityParty `json:"party,omitempty"`
Assets *ActivityAssets `json:"assets,omitempty"`
Secrets *ActivitySecrets `json:"secrets,omitempty"`
// Undocumented fields
SyncID string `json:"sync_id,omitempty"`
SessionID string `json:"session_id,omitempty"`
}
type ActivityType uint8
const (
GameActivity ActivityType = iota // Playing $name
StreamingActivity // Streaming $details
ListeningActivity // Listening to $name
WatchingActivity // Watching $name
CustomActivity // $emoji $state
CompetingActivity // Competing in $name
)
type ActivityFlags uint32
const (
InstanceActivity ActivityFlags = 1 << iota
JoinActivity
SpectateActivity
JoinRequestActivity
SyncActivity
PlayActivity
)
type ActivityTimestamps struct {
Start UnixMsTimestamp `json:"start,omitempty"`
End UnixMsTimestamp `json:"end,omitempty"`
}
type ActivityParty struct {
ID string `json:"id,omitempty"`
Size [2]int `json:"size,omitempty"` // [ current, max ]
}
type ActivityAssets struct {
LargeImage string `json:"large_image,omitempty"` // id
LargeText string `json:"large_text,omitempty"`
SmallImage string `json:"small_image,omitempty"` // id
SmallText string `json:"small_text,omitempty"`
}
type ActivitySecrets struct {
Join string `json:"join,omitempty"`
Spectate string `json:"spectate,omitempty"`
Match string `json:"match,omitempty"`
}
// A Relationship between the logged in user and the user in the struct. This
// struct is undocumented.
type Relationship struct {
UserID UserID `json:"id"`
User User `json:"user"`
Type RelationshipType `json:"type"`
}
// RelationshipType is an enum for a relationship.
type RelationshipType uint8
const (
_ RelationshipType = iota
FriendRelationship
BlockedRelationship
IncomingFriendRequest
SentFriendRequest
)