snow/person/item.go

320 lines
6.3 KiB
Go
Raw Normal View History

2023-10-31 22:40:14 +00:00
package person
import (
"strings"
2023-11-01 01:24:42 +00:00
"github.com/ectrc/snow/aid"
2023-10-31 22:40:14 +00:00
"github.com/ectrc/snow/storage"
"github.com/google/uuid"
)
type Item struct {
ID string
ProfileID string
TemplateID string
Quantity int
Favorite bool
HasSeen bool
Variants []*VariantChannel
2023-10-31 22:40:14 +00:00
ProfileType string
}
func NewItem(templateID string, quantity int) *Item {
return &Item{
ID: uuid.New().String(),
2023-10-31 22:40:14 +00:00
TemplateID: templateID,
Quantity: quantity,
Favorite: false,
HasSeen: false,
Variants: []*VariantChannel{},
2023-10-31 22:40:14 +00:00
}
}
func NewItemWithType(templateID string, quantity int, profile string) *Item {
return &Item{
ID: uuid.New().String(),
TemplateID: templateID,
Quantity: quantity,
Favorite: false,
HasSeen: false,
Variants: []*VariantChannel{},
ProfileType: profile,
}
}
func FromDatabaseItem(item *storage.DB_Item) *Item {
2023-10-31 22:40:14 +00:00
variants := []*VariantChannel{}
for _, variant := range item.Variants {
2024-02-04 01:25:44 +00:00
2023-10-31 22:40:14 +00:00
variants = append(variants, FromDatabaseVariant(&variant))
}
return &Item{
ID: item.ID,
TemplateID: item.TemplateID,
Quantity: item.Quantity,
Favorite: item.Favorite,
HasSeen: item.HasSeen,
Variants: variants,
2023-10-31 22:40:14 +00:00
}
}
2024-02-04 15:21:16 +00:00
func FromDatabaseGiftLoot(item *storage.DB_GiftLoot) *Item {
return &Item{
ID: item.ID,
TemplateID: item.TemplateID,
Quantity: item.Quantity,
Favorite: false,
HasSeen: false,
Variants: []*VariantChannel{},
ProfileType: item.ProfileType,
}
}
func FromDatabasePurchaseLoot(item *storage.DB_PurchaseLoot) *Item {
2023-10-31 22:40:14 +00:00
return &Item{
ID: item.ID,
TemplateID: item.TemplateID,
Quantity: item.Quantity,
Favorite: false,
HasSeen: false,
Variants: []*VariantChannel{},
ProfileType: item.ProfileType,
}
}
func FromDatabaseReceiptLoot(item *storage.DB_ReceiptLoot) *Item {
return &Item{
ID: item.ID,
TemplateID: item.TemplateID,
Quantity: item.Quantity,
Favorite: false,
HasSeen: false,
Variants: []*VariantChannel{},
ProfileType: item.ProfileType,
}
}
func (i *Item) GenerateFortniteItemEntry() aid.JSON {
attributes := aid.JSON{}
2023-11-01 01:24:42 +00:00
switch strings.Split(i.TemplateID, ":")[0] {
case "Currency":
attributes["platform"] = "Shared"
default:
attributes = aid.JSON{
"variants": i.GenerateFortniteItemVariantChannels(),
"favorite": i.Favorite,
"item_seen": i.HasSeen,
}
}
2023-11-01 01:24:42 +00:00
return aid.JSON{
"templateId": i.TemplateID,
"attributes": attributes,
2023-11-01 01:24:42 +00:00
"quantity": i.Quantity,
}
}
func (i *Item) GenerateFortniteItemVariantChannels() []aid.JSON {
variants := []aid.JSON{}
for _, variant := range i.Variants {
variants = append(variants, aid.JSON{
"channel": variant.Channel,
"owned": variant.Owned,
"active": variant.Active,
})
}
return variants
}
2023-11-01 01:24:42 +00:00
func (i *Item) GetAttribute(attribute string) interface{} {
switch attribute {
case "Favorite":
return i.Favorite
case "HasSeen":
return i.HasSeen
case "Variants":
return i.Variants
}
return nil
}
2023-10-31 22:40:14 +00:00
func (i *Item) Delete() {
storage.Repo.DeleteItem(i.ID)
}
func (i *Item) DeleteLoot() {
storage.Repo.DeleteLoot(i.ID)
2023-10-31 22:40:14 +00:00
}
func (i *Item) DeleteReceiptLoot() {
storage.Repo.DeleteReceiptLoot(i.ID)
}
2023-10-31 22:40:14 +00:00
func (i *Item) NewChannel(channel string, owned []string, active string) *VariantChannel {
return &VariantChannel{
2024-02-04 01:25:44 +00:00
ID: uuid.New().String(),
ItemID: i.ID,
2023-10-31 22:40:14 +00:00
Channel: channel,
Owned: owned,
Active: active,
2023-10-31 22:40:14 +00:00
}
}
func (i *Item) AddChannel(channel *VariantChannel) {
i.Variants = append(i.Variants, channel)
}
func (i *Item) RemoveChannel(channel *VariantChannel) {
2024-02-04 01:25:44 +00:00
var vId string
2023-10-31 22:40:14 +00:00
for index, c := range i.Variants {
if c.Channel == channel.Channel {
2024-02-04 01:25:44 +00:00
vId = c.ID
2023-10-31 22:40:14 +00:00
i.Variants = append(i.Variants[:index], i.Variants[index+1:]...)
}
}
2024-02-04 01:25:44 +00:00
storage.Repo.DeleteVariant(vId)
2023-10-31 22:40:14 +00:00
}
func (i *Item) GetChannel(channel string) *VariantChannel {
for _, c := range i.Variants {
if c.Channel == channel {
return c
}
}
return nil
}
func (i *Item) FillChannels(channels []*VariantChannel) {
i.Variants = []*VariantChannel{}
for _, channel := range channels {
i.AddChannel(channel)
}
}
2024-02-04 01:25:44 +00:00
func (i *Item) EquipChannel(channel string, variant string) {
for _, c := range i.Variants {
if c.Channel == channel {
c.Active = variant
}
}
}
2023-10-31 22:40:14 +00:00
func (i *Item) ToDatabase(profileId string) *storage.DB_Item {
variants := []storage.DB_VariantChannel{}
for _, variant := range i.Variants {
variants = append(variants, *variant.ToDatabase())
}
return &storage.DB_Item{
ID: i.ID,
ProfileID: profileId,
2023-10-31 22:40:14 +00:00
TemplateID: i.TemplateID,
Quantity: i.Quantity,
Favorite: i.Favorite,
HasSeen: i.HasSeen,
Variants: variants,
2023-10-31 22:40:14 +00:00
}
}
func (i *Item) Save() {
if i.ProfileID == "" {
return
}
for _, variant := range i.Variants {
variant.Save()
}
storage.Repo.SaveItem(i.ToDatabase(i.ProfileID))
2023-10-31 22:40:14 +00:00
}
2024-02-04 15:21:16 +00:00
func (i *Item) ToGiftLootDatabase(giftId string) *storage.DB_GiftLoot {
2024-02-04 02:05:31 +00:00
return &storage.DB_GiftLoot{
GiftID: giftId,
2023-10-31 22:40:14 +00:00
ProfileType: i.ProfileType,
ID: i.ID,
TemplateID: i.TemplateID,
Quantity: i.Quantity,
2023-10-31 22:40:14 +00:00
}
}
2024-02-04 15:21:16 +00:00
func (i *Item) ToPurchaseLootDatabase(purchaseId string) *storage.DB_PurchaseLoot {
return &storage.DB_PurchaseLoot{
ID: i.ID,
PurchaseID: purchaseId,
ProfileType: i.ProfileType,
TemplateID: i.TemplateID,
Quantity: i.Quantity,
}
}
func (i *Item) ToReceiptLootDatabase(receiptId string) *storage.DB_ReceiptLoot {
return &storage.DB_ReceiptLoot{
ID: i.ID,
ReceiptID: receiptId,
ProfileType: i.ProfileType,
TemplateID: i.TemplateID,
Quantity: i.Quantity,
}
}
2023-10-31 22:40:14 +00:00
func (i *Item) SaveLoot(giftId string) {
}
func (i *Item) Snapshot() ItemSnapshot {
variants := []VariantChannel{}
for _, variant := range i.Variants {
variants = append(variants, *variant)
}
return ItemSnapshot{
ID: i.ID,
TemplateID: i.TemplateID,
Quantity: i.Quantity,
Favorite: i.Favorite,
HasSeen: i.HasSeen,
Variants: variants,
2023-10-31 22:40:14 +00:00
ProfileType: i.ProfileType,
}
}
type VariantChannel struct {
ID string
2023-10-31 22:40:14 +00:00
ItemID string
Channel string
Owned []string
Active string
}
func FromDatabaseVariant(variant *storage.DB_VariantChannel) *VariantChannel {
return &VariantChannel{
ID: variant.ID,
ItemID: variant.ItemID,
2023-10-31 22:40:14 +00:00
Channel: variant.Channel,
Owned: variant.Owned,
Active: variant.Active,
2023-10-31 22:40:14 +00:00
}
}
func (v *VariantChannel) ToDatabase() *storage.DB_VariantChannel {
return &storage.DB_VariantChannel{
ID: v.ID,
ItemID: v.ItemID,
2023-10-31 22:40:14 +00:00
Channel: v.Channel,
Owned: v.Owned,
Active: v.Active,
2023-10-31 22:40:14 +00:00
}
}
func (v *VariantChannel) Save() {
2024-02-04 01:25:44 +00:00
storage.Repo.SaveVariant(v.ToDatabase())
2023-10-31 22:40:14 +00:00
}