Fix Athena Profile has 0 anything!

This commit is contained in:
eccentric 2023-11-01 00:05:17 +00:00
parent 4cc7032ea0
commit 6b09cd5e82
9 changed files with 164 additions and 39 deletions

13
aid/aid.go Normal file
View File

@ -0,0 +1,13 @@
package aid
import (
"os"
"os/signal"
"syscall"
)
func WaitForExit() {
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
}

21
main.go
View File

@ -1,11 +1,6 @@
package main package main
import ( import (
"fmt"
"os"
"os/signal"
"syscall"
"github.com/ectrc/snow/aid" "github.com/ectrc/snow/aid"
"github.com/ectrc/snow/config" "github.com/ectrc/snow/config"
"github.com/ectrc/snow/person" "github.com/ectrc/snow/person"
@ -71,11 +66,10 @@ func init() {
user.CommonCoreProfile.Gifts.AddGift(giftBox) user.CommonCoreProfile.Gifts.AddGift(giftBox)
currency := person.NewItem("Currency:MtxPurchased", 100) currency := person.NewItem("Currency:MtxPurchased", 100)
user.CommonCoreProfile.Items.AddItem(currency) user.AthenaProfile.Items.AddItem(currency)
user.Save() user.Save()
user.AthenaProfile.Diff(snapshot) user.AthenaProfile.Diff(snapshot)
aid.PrintJSON(user.CommonCoreProfile.Snapshot())
} }
go storage.Cache.CacheKiller() go storage.Cache.CacheKiller()
@ -84,11 +78,14 @@ func init() {
func main() { func main() {
persons := person.AllFromDatabase() persons := person.AllFromDatabase()
for _, person := range persons { for _, p := range persons {
fmt.Println(person) p.AthenaProfile.Items.RangeItems(func(id string, item *person.Item) bool {
aid.PrintJSON(item)
return true
})
aid.PrintJSON(p.Snapshot())
} }
sc := make(chan os.Signal, 1) aid.WaitForExit()
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
} }

49
person/attribute.go Normal file
View File

@ -0,0 +1,49 @@
package person
import (
"encoding/json"
"github.com/ectrc/snow/storage"
)
type Attribute struct {
Key string
Value interface{}
Type string
}
func NewAttribute(key string, value interface{}, attributeType string) *Attribute {
return &Attribute{
Key: key,
Value: value,
Type: attributeType,
}
}
func FromDatabaseAttribute(db *storage.DB_PAttribute) *Attribute {
var value interface{}
err := json.Unmarshal([]byte(db.ValueJSON), &value)
if err != nil {
return nil
}
return &Attribute{
Key: db.Key,
Value: value,
Type: db.Type,
}
}
func (a *Attribute) ToDatabase(profileId string) *storage.DB_PAttribute {
value, err := json.Marshal(a.Value)
if err != nil {
return nil
}
return &storage.DB_PAttribute{
ProfileID: profileId,
Key: a.Key,
ValueJSON: string(value),
Type: a.Type,
}
}

View File

@ -35,13 +35,13 @@ func FromDatabase(personId string) *Person {
} }
loadout := FromDatabaseLoadout(&person.Loadout) loadout := FromDatabaseLoadout(&person.Loadout)
athenaProfile := &Profile{} athenaProfile := NewProfile("athena")
commonCoreProfile := &Profile{} commonCoreProfile := NewProfile("common_core")
for _, profile := range person.Profiles { for _, profile := range person.Profiles {
if profile.Type == "athena" { if profile.Type == "athena" {
athenaProfile := FromDatabaseProfile(&profile)
athenaProfile.ID = profile.ID athenaProfile.ID = profile.ID
athenaProfile = FromDatabaseProfile(&profile)
} }
if profile.Type == "common_core" { if profile.Type == "common_core" {
@ -81,7 +81,10 @@ func (p *Person) ToDatabase() *storage.DB_Person {
Loadout: *p.Loadout.ToDatabase(), Loadout: *p.Loadout.ToDatabase(),
} }
profilesToConvert := map[string]*Profile{"athena": p.AthenaProfile, "common_core": p.CommonCoreProfile} profilesToConvert := map[string]*Profile{
"common_core": p.CommonCoreProfile,
"athena": p.AthenaProfile,
}
for profileType, profile := range profilesToConvert { for profileType, profile := range profilesToConvert {
dbProfile := storage.DB_Profile{ dbProfile := storage.DB_Profile{
@ -108,12 +111,8 @@ func (p *Person) ToDatabase() *storage.DB_Person {
return true return true
}) })
profile.Attributes.Range(func(key, value interface{}) bool { profile.Attributes.RangeAttributes(func(key string, value *Attribute) bool {
dbProfile.Attributes = append(dbProfile.Attributes, storage.DB_PAttribute{ dbProfile.Attributes = append(dbProfile.Attributes, *value.ToDatabase(p.ID))
ProfileID: profile.ID,
Key: key.(string),
Value: value.(string),
})
return true return true
}) })
@ -122,3 +121,26 @@ func (p *Person) ToDatabase() *storage.DB_Person {
return &dbPerson return &dbPerson
} }
func (p *Person) AddAttribute(value *Attribute) {
p.AthenaProfile.Attributes.AddAttribute(value)
}
func (p *Person) GetAttribute(key string) *Attribute {
attribute := p.AthenaProfile.Attributes.GetAttribute(key)
return attribute
}
func (p *Person) RemoveAttribute(key string) {
p.AthenaProfile.Attributes.DeleteAttribute(key)
}
func (p *Person) Snapshot() *PersonSnapshot {
return &PersonSnapshot{
ID: p.ID,
DisplayName: p.DisplayName,
AthenaProfile: *p.AthenaProfile.Snapshot(),
CommonCoreProfile:* p.CommonCoreProfile.Snapshot(),
Loadout: *p.Loadout,
}
}

View File

@ -1,7 +1,7 @@
package person package person
import ( import (
"sync" "fmt"
"github.com/ectrc/snow/storage" "github.com/ectrc/snow/storage"
"github.com/google/uuid" "github.com/google/uuid"
@ -13,7 +13,7 @@ type Profile struct {
Items *ItemMutex Items *ItemMutex
Gifts *GiftMutex Gifts *GiftMutex
Quests *QuestMutex Quests *QuestMutex
Attributes *sync.Map Attributes *AttributeMutex
Type string Type string
Changes []diff.Change Changes []diff.Change
} }
@ -24,7 +24,7 @@ func NewProfile(profile string) *Profile {
Items: NewItemMutex(profile), Items: NewItemMutex(profile),
Gifts: NewGiftMutex(), Gifts: NewGiftMutex(),
Quests: NewQuestMutex(), Quests: NewQuestMutex(),
Attributes: &sync.Map{}, Attributes: NewAttributeMutex(),
Type: profile, Type: profile,
} }
} }
@ -33,6 +33,7 @@ func FromDatabaseProfile(profile *storage.DB_Profile) *Profile {
items := NewItemMutex(profile.Type) items := NewItemMutex(profile.Type)
gifts := NewGiftMutex() gifts := NewGiftMutex()
quests := NewQuestMutex() quests := NewQuestMutex()
attributes := NewAttributeMutex()
for _, item := range profile.Items { for _, item := range profile.Items {
items.AddItem(FromDatabaseItem(&item, &profile.Type)) items.AddItem(FromDatabaseItem(&item, &profile.Type))
@ -46,9 +47,14 @@ func FromDatabaseProfile(profile *storage.DB_Profile) *Profile {
quests.AddQuest(FromDatabaseQuest(&quest, &profile.Type)) quests.AddQuest(FromDatabaseQuest(&quest, &profile.Type))
} }
attributes := &sync.Map{}
for _, attribute := range profile.Attributes { for _, attribute := range profile.Attributes {
attributes.Store(attribute.Key, attribute.Value) parsed := FromDatabaseAttribute(&attribute)
if parsed == nil {
fmt.Printf("error getting attribute from database")
continue
}
attributes.AddAttribute(parsed)
} }
return &Profile{ return &Profile{
@ -69,7 +75,7 @@ func (p *Profile) Snapshot() *ProfileSnapshot {
items := map[string]ItemSnapshot{} items := map[string]ItemSnapshot{}
gifts := map[string]GiftSnapshot{} gifts := map[string]GiftSnapshot{}
quests := map[string]Quest{} quests := map[string]Quest{}
attributes := map[string]string{} attributes := map[string]Attribute{}
p.Items.RangeItems(func(id string, item *Item) bool { p.Items.RangeItems(func(id string, item *Item) bool {
items[id] = item.Snapshot() items[id] = item.Snapshot()
@ -86,8 +92,8 @@ func (p *Profile) Snapshot() *ProfileSnapshot {
return true return true
}) })
p.Attributes.Range(func(key, value interface{}) bool { p.Attributes.RangeAttributes(func(key string, value *Attribute) bool {
attributes[key.(string)] = value.(string) attributes[key] = *value
return true return true
}) })
@ -96,7 +102,7 @@ func (p *Profile) Snapshot() *ProfileSnapshot {
Items: items, Items: items,
Gifts: gifts, Gifts: gifts,
Quests: quests, Quests: quests,
Attributes: attributes, Attributes: attributes,
} }
} }

View File

@ -1,11 +1,19 @@
package person package person
type PersonSnapshot struct {
ID string
DisplayName string
AthenaProfile ProfileSnapshot
CommonCoreProfile ProfileSnapshot
Loadout Loadout
}
type ProfileSnapshot struct { type ProfileSnapshot struct {
ID string ID string
Items map[string]ItemSnapshot Items map[string]ItemSnapshot
Gifts map[string]GiftSnapshot Gifts map[string]GiftSnapshot
Quests map[string]Quest Quests map[string]Quest
Attributes map[string]string Attributes map[string]Attribute
} }
type ItemSnapshot struct { type ItemSnapshot struct {

View File

@ -134,3 +134,36 @@ func (m *QuestMutex) Count() int {
}) })
return count return count
} }
type AttributeMutex struct {
sync.Map
}
func NewAttributeMutex() *AttributeMutex {
return &AttributeMutex{}
}
func (m *AttributeMutex) AddAttribute(attribute *Attribute) {
m.Store(attribute.Key, attribute)
// storage.Repo.SaveAttribute(key, value)
}
func (m *AttributeMutex) DeleteAttribute(key string) {
m.Delete(key)
// storage.Repo.DeleteAttribute(key)
}
func (m *AttributeMutex) GetAttribute(key string) *Attribute {
value, ok := m.Load(key)
if !ok {
return nil
}
return value.(*Attribute)
}
func (m *AttributeMutex) RangeAttributes(f func(key string, value *Attribute) bool) {
m.Range(func(key, value interface{}) bool {
return f(key.(string), value.(*Attribute))
})
}

View File

@ -35,8 +35,6 @@ func (s *PostgresStorage) GetPerson(personId string) *DB_Person {
Preload("Profiles.Items"). Preload("Profiles.Items").
Preload("Profiles.Gifts"). Preload("Profiles.Gifts").
Preload("Profiles.Quests"). Preload("Profiles.Quests").
Preload("Profiles.Items.Variants").
Preload("Profiles.Gifts.Loot").
Find(&dbPerson) Find(&dbPerson)
if dbPerson.ID == "" { if dbPerson.ID == "" {
@ -57,8 +55,6 @@ func (s *PostgresStorage) GetAllPersons() []*DB_Person {
Preload("Profiles.Items"). Preload("Profiles.Items").
Preload("Profiles.Gifts"). Preload("Profiles.Gifts").
Preload("Profiles.Quests"). Preload("Profiles.Quests").
Preload("Profiles.Items.Variants").
Preload("Profiles.Gifts.Loot").
Find(&dbPersons) Find(&dbPersons)
return dbPersons return dbPersons

View File

@ -54,7 +54,8 @@ func (DB_Profile) TableName() string {
type DB_PAttribute struct { type DB_PAttribute struct {
Key string `gorm:"primary_key"` Key string `gorm:"primary_key"`
ProfileID string ProfileID string
Value string ValueJSON string
Type string
} }
func (DB_PAttribute) TableName() string { func (DB_PAttribute) TableName() string {