twitch-bot/pkg/twitch/twitchAPICache.go

58 lines
1.1 KiB
Go
Raw Normal View History

package twitch
import (
"crypto/sha256"
"fmt"
"strings"
"sync"
"time"
)
type (
// APICache is used to cache API responses in order not to ask the
// API over and over again for information seldom changing
APICache struct {
data map[string]twitchAPICacheEntry
lock sync.RWMutex
}
twitchAPICacheEntry struct {
Data interface{}
ValidUntil time.Time
}
)
func newTwitchAPICache() *APICache {
return &APICache{
data: make(map[string]twitchAPICacheEntry),
}
}
// Get returns the stored data or nil for the given cache-key
func (t *APICache) Get(key []string) interface{} {
t.lock.RLock()
defer t.lock.RUnlock()
e := t.data[t.deriveKey(key)]
if e.ValidUntil.Before(time.Now()) {
return nil
}
return e.Data
}
// Set sets the stored data for the given cache-key
func (t *APICache) Set(key []string, valid time.Duration, data interface{}) {
t.lock.Lock()
defer t.lock.Unlock()
t.data[t.deriveKey(key)] = twitchAPICacheEntry{
Data: data,
ValidUntil: time.Now().Add(valid),
}
}
func (*APICache) deriveKey(key []string) string {
return fmt.Sprintf("sha256:%x", sha256.Sum256([]byte(strings.Join(key, ":"))))
}