package store import ( "context" "encoding/json" "github.com/eko/gocache/lib/v4/cache" "github.com/eko/gocache/lib/v4/store" "log" ) type StoreModel struct { Ctx context.Context Store *cache.Cache[string] } type PlayerInfo struct { IsOnline bool `json:"online"` BoundUser string `json:"bound_user"` PairCode string `json:"pair_code"` Name string `json:"name"` } type UserInfo struct { DisplayName string `json:"display_name"` BoundPlayer []string `json:"bound_player"` } func NewStoreModel() *StoreModel { storeModel := &StoreModel{ Ctx: context.Background(), Store: NewManager[string](), } return storeModel } func (m *StoreModel) GetPlayerInfo(token string) *PlayerInfo { dataStr, err := m.Store.Get(m.Ctx, MakeKey("player", token)) if err != nil && err.Error() != store.NOT_FOUND_ERR && err.Error() != "Entry not found" { log.Panicln("Cannot get player info for token ["+token+"]: ", err) } if dataStr == "" { return nil } data := &PlayerInfo{} err = json.Unmarshal([]byte(dataStr), data) if err != nil { return nil } return data } func (m *StoreModel) SetPlayerInfo(token string, data *PlayerInfo) { dataStr, err := json.Marshal(data) if err != nil { log.Panicln("Cannot convert player info to json: ", err) } err = m.Store.Set(m.Ctx, MakeKey("player", token), string(dataStr), store.WithExpiration(PersistTTL)) if err != nil { log.Panicln("Cannot set player info for token ["+token+"]: ", err) } } func (m *StoreModel) GetUserInfo(userName string) *UserInfo { dataStr, err := m.Store.Get(m.Ctx, MakeKey("user", userName)) if err != nil && err.Error() != store.NOT_FOUND_ERR && err.Error() != "Entry not found" { log.Panicln("Cannot get user info from userName ["+userName+"]: ", err) } if dataStr == "" { return nil } data := &UserInfo{} err = json.Unmarshal([]byte(dataStr), data) if err != nil { return nil } return data } func (m *StoreModel) SetUserInfo(userName string, data *UserInfo) { dataStr, err := json.Marshal(data) if err != nil { log.Panicln("Cannot convert info to json: ", err) } err = m.Store.Set(m.Ctx, MakeKey("user", userName), string(dataStr), store.WithExpiration(PersistTTL)) if err != nil { log.Panicln("Cannot set player info for userName ["+userName+"]: ", err) } } func (m *StoreModel) RemovePlayerInfo(token string) { m.Store.Delete(m.Ctx, "player:"+token) } func (m *StoreModel) GetCodeInfo(code string) string { token, err := m.Store.Get(m.Ctx, MakeKey("code", code)) if err != nil && err.Error() != store.NOT_FOUND_ERR && err.Error() != "Entry not found" { log.Panicln("Cannot get code info from code ["+code+"]: ", err) } return token } func (m *StoreModel) SetCodeInfo(code string, token string) { err := m.Store.Set(m.Ctx, MakeKey("code", code), token, store.WithExpiration(CacheTTL)) if err != nil { log.Panicln("Cannot set code info: ", err) } } func (m *StoreModel) RemoveCodeInfo(code string) { m.Store.Delete(m.Ctx, MakeKey("code", code)) }