124 lines
3 KiB
Go
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"`
|
|
}
|