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"` }