twitch-bot/botUserState.go

72 lines
1.4 KiB
Go
Raw Normal View History

package main
import (
"strconv"
"strings"
"sync"
"github.com/Luzifer/twitch-bot/twitch"
"github.com/go-irc/irc"
"github.com/pkg/errors"
)
type (
twitchUserState struct {
Badges twitch.BadgeCollection
Color string
DisplayName string
EmoteSets []int64
}
twitchUserStateStore struct {
states map[string]*twitchUserState
lock sync.RWMutex
}
)
func newTwitchUserStateStore() *twitchUserStateStore {
return &twitchUserStateStore{
states: make(map[string]*twitchUserState),
}
}
func parseTwitchUserState(m *irc.Message) (*twitchUserState, error) {
var (
color, _ = m.GetTag("color")
displayName, _ = m.GetTag("display-name")
emoteSets []int64
rawSets, _ = m.GetTag("emote-sets")
)
if rawSets != "" {
for _, sid := range strings.Split(rawSets, ",") {
id, err := strconv.ParseInt(sid, 10, 64)
if err != nil {
return nil, errors.Wrap(err, "parsing emote-set id")
}
emoteSets = append(emoteSets, id)
}
}
return &twitchUserState{
Badges: twitch.ParseBadgeLevels(m),
Color: color,
DisplayName: displayName,
EmoteSets: emoteSets,
}, nil
}
func (t *twitchUserStateStore) Get(channel string) *twitchUserState {
t.lock.RLock()
defer t.lock.RUnlock()
return t.states[channel]
}
func (t *twitchUserStateStore) Set(channel string, state *twitchUserState) {
t.lock.Lock()
defer t.lock.Unlock()
t.states[channel] = state
}