snow/person/cache.go
2023-11-05 02:43:21 +00:00

93 lines
1.5 KiB
Go

package person
import (
"sync"
"time"
)
var (
cache *PersonsCache
)
type CacheEntry struct {
Entry *Person
LastAccessed time.Time
}
type PersonsCache struct {
sync.Map
}
func NewPersonsCacheMutex() *PersonsCache {
return &PersonsCache{}
}
func (m *PersonsCache) CacheKiller() {
for {
if m.Count() == 0 {
continue
}
m.Range(func(key, value interface{}) bool {
cacheEntry := value.(*CacheEntry)
if time.Since(cacheEntry.LastAccessed) >= 30 * time.Minute {
m.Delete(key)
}
return true
})
time.Sleep(5000 * time.Minute)
}
}
func (m *PersonsCache) GetPerson(id string) *Person {
if p, ok := m.Load(id); ok {
cacheEntry := p.(*CacheEntry)
return cacheEntry.Entry
}
return nil
}
func (m *PersonsCache) GetPersonByDisplay(displayName string) *Person {
var person *Person
m.RangeEntry(func(key string, value *CacheEntry) bool {
if value.Entry.DisplayName == displayName {
person = value.Entry
return false
}
return true
})
return person
}
func (m *PersonsCache) SavePerson(p *Person) {
m.Store(p.ID, &CacheEntry{
Entry: p,
LastAccessed: time.Now(),
})
}
func (m *PersonsCache) DeletePerson(id string) {
m.Delete(id)
}
func (m *PersonsCache) RangeEntry(f func(key string, value *CacheEntry) bool) {
m.Range(func(key, value interface{}) bool {
return f(key.(string), value.(*CacheEntry))
})
}
func (m *PersonsCache) Count() int {
count := 0
m.Range(func(key, value interface{}) bool {
count++
return true
})
return count
}