discord/user.go
2025-06-02 13:18:10 -04:00

124 lines
3 KiB
Go

package discord
import "time"
type CacheStatus int
const (
CacheStatusNotFound CacheStatus = iota
CacheStatusFound
CacheStatusRefresh
CacheStatusRemove
)
type cacheUser struct {
lastUpdated time.Time
user *User
remove bool // if true, references to this should be removed
}
type UserCache struct {
guildID string
lastUpdated time.Time
frequency time.Duration
users map[string]*cacheUser
}
func NewUserCache(guildID string, updateFrequency time.Duration) *UserCache {
return &UserCache{
guildID: guildID,
lastUpdated: time.Unix(0, 0),
frequency: updateFrequency,
users: make(map[string]*cacheUser),
}
}
func (u *UserCache) Insert(user *User) {
cu, ok := u.users[user.ID]
if ok {
cu.user = user
cu.lastUpdated = time.Now()
cu.remove = false
}
u.users[user.ID] = &cacheUser{
user: user,
lastUpdated: time.Now(),
remove: false,
}
}
func (u *UserCache) Find(userID string) (*User, CacheStatus) {
cu, ok := u.users[userID]
if !ok {
return nil, CacheStatusNotFound
}
if cu.remove {
return nil, CacheStatusRemove
}
if time.Since(cu.lastUpdated) > u.frequency {
return cu.user, CacheStatusRefresh
}
return cu.user, CacheStatusFound
}
type UserFlags int
const (
UserFlagsStaff UserFlags = 1 << 1
UserFlagsPartner UserFlags = 1 << 2
UserFlagsHypesquad UserFlags = 1 << 3
UserFlagsBugHunterLevel1 UserFlags = 1 << 4
UserFlagsHypesquadOnlineHouse1 UserFlags = 1 << 6
UserFlagsHypesquadOnlineHouse2 UserFlags = 1 << 7
UserFlagsHypesquadOnlineHouse3 UserFlags = 1 << 8
UserFlagsPremiumEarlySupporter UserFlags = 1 << 9
UserFlagsTeamPseudoUser UserFlags = 1 << 10
UserFlagsBugHunterLevel2 UserFlags = 1 << 14
UserFlagsVerifiedBot UserFlags = 1 << 16
UserFlagsVerifiedDeveloper UserFlags = 1 << 17
UserFlagsCertifiedModerator UserFlags = 1 << 18
UserFlagsBotHTTPInteractions UserFlags = 1 << 19
UserFlagsActiveDeveloper UserFlags = 1 << 22
)
type PremiumType int
const (
PremiumTypeNone PremiumType = iota
PremiumTypeNitroClassic
PremiumTypeNitro
PremiumTypeNitroBasic
)
// TODO: more fields
type User struct {
ID string `json:"id"`
Username string `json:"username"`
GlobalName string `json:"global_name"`
Avatar string `json:"avatar"`
Bot bool `json:"bot"`
System bool `json:"system"`
MFAEnabled bool `json:"mfa_enabled"`
Banner string `json:"banner"`
AccentColor int `json:"accent_color"`
Locale string `json:"locale"`
Verified bool `json:"verified"`
Email string `json:"email"`
Flags UserFlags `json:"flags"`
PublicFlags UserFlags `json:"public_flags"`
PremiumType PremiumType `json:"premium_type"`
AvatarDecorationData AvatarDecorationData `json:"avatar_decoration_data"`
}
func (u *User) BucketID() string {
return u.ID
}
type AvatarDecorationData struct {
Asset string `json:"asset"`
SkuID string `json:"sku_id"`
}