258 lines
5.8 KiB
Go
258 lines
5.8 KiB
Go
|
package fortnite
|
||
|
|
||
|
import (
|
||
|
"github.com/ectrc/snow/aid"
|
||
|
"github.com/ectrc/snow/person"
|
||
|
)
|
||
|
|
||
|
type Catalog struct {
|
||
|
RefreshIntervalHrs int `json:"refreshIntervalHrs"`
|
||
|
DailyPurchaseHrs int `json:"dailyPurchaseHrs"`
|
||
|
Expiration string `json:"expiration"`
|
||
|
Storefronts []Storefront `json:"storefronts"`
|
||
|
}
|
||
|
|
||
|
func NewCatalog() *Catalog {
|
||
|
return &Catalog{
|
||
|
RefreshIntervalHrs: 24,
|
||
|
DailyPurchaseHrs: 24,
|
||
|
Expiration: aid.TimeEndOfDay(),
|
||
|
Storefronts: []Storefront{},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *Catalog) Add(storefront *Storefront) {
|
||
|
c.Storefronts = append(c.Storefronts, *storefront)
|
||
|
}
|
||
|
|
||
|
func (c *Catalog) GenerateFortniteCatalog(p *person.Person) aid.JSON {
|
||
|
json := aid.JSON{
|
||
|
"refreshIntervalHrs": c.RefreshIntervalHrs,
|
||
|
"dailyPurchaseHrs": c.DailyPurchaseHrs,
|
||
|
"expiration": c.Expiration,
|
||
|
"storefronts": []aid.JSON{},
|
||
|
}
|
||
|
|
||
|
for _, storefront := range c.Storefronts {
|
||
|
json["storefronts"] = append(json["storefronts"].([]aid.JSON), storefront.GenerateResponse(p))
|
||
|
}
|
||
|
|
||
|
return json
|
||
|
|
||
|
}
|
||
|
|
||
|
type Storefront struct {
|
||
|
Name string `json:"name"`
|
||
|
CatalogEntries []Entry `json:"catalogEntries"`
|
||
|
}
|
||
|
|
||
|
func NewStorefront(name string) *Storefront {
|
||
|
return &Storefront{
|
||
|
Name: name,
|
||
|
CatalogEntries: []Entry{},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *Storefront) Add(entry Entry) {
|
||
|
s.CatalogEntries = append(s.CatalogEntries, entry)
|
||
|
}
|
||
|
|
||
|
func (s *Storefront) GenerateResponse(p *person.Person) aid.JSON {
|
||
|
json := aid.JSON{
|
||
|
"name": s.Name,
|
||
|
"catalogEntries": []aid.JSON{},
|
||
|
}
|
||
|
|
||
|
for _, entry := range s.CatalogEntries {
|
||
|
json["catalogEntries"] = append(json["catalogEntries"].([]aid.JSON), entry.GenerateResponse(p))
|
||
|
}
|
||
|
|
||
|
return json
|
||
|
}
|
||
|
|
||
|
type Entry struct {
|
||
|
Price int
|
||
|
ID string
|
||
|
Name string
|
||
|
Title string
|
||
|
Description string
|
||
|
Type string
|
||
|
Meta []aid.JSON
|
||
|
Panel string
|
||
|
Priority int
|
||
|
Asset string
|
||
|
Grants []string
|
||
|
IsBundle bool
|
||
|
BundleMeta BundleMeta
|
||
|
}
|
||
|
|
||
|
func NewItemEntry(id string, name string, price int) *Entry {
|
||
|
return &Entry{
|
||
|
Price: price,
|
||
|
ID: id,
|
||
|
Name: name,
|
||
|
Type: "StaticPrice",
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func NewBundleEntry(id string, name string, price int) *Entry {
|
||
|
return &Entry{
|
||
|
Price: price,
|
||
|
ID: id,
|
||
|
Name: name,
|
||
|
Type: "DynamicBundle",
|
||
|
IsBundle: true,
|
||
|
BundleMeta: BundleMeta{
|
||
|
FloorPrice: price,
|
||
|
RegularBasePrice: price,
|
||
|
DiscountedBasePrice: price,
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type BundleMeta struct {
|
||
|
FloorPrice int
|
||
|
RegularBasePrice int
|
||
|
DiscountedBasePrice int
|
||
|
DisplayType string // "AmountOff" or "PercentOff"
|
||
|
BundleItems []BundleItem
|
||
|
}
|
||
|
|
||
|
type BundleItem struct {
|
||
|
TemplateID string
|
||
|
RegularPrice int
|
||
|
DiscountedPrice int
|
||
|
AlreadyOwnedPriceReduction int
|
||
|
}
|
||
|
|
||
|
func NewBundleItem(templateId string, regularPrice int, discountedPrice int, alreadyOwnedPriceReduction int) *BundleItem {
|
||
|
return &BundleItem{
|
||
|
TemplateID: templateId,
|
||
|
RegularPrice: regularPrice,
|
||
|
DiscountedPrice: discountedPrice,
|
||
|
AlreadyOwnedPriceReduction: alreadyOwnedPriceReduction,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (e *Entry) AddGrant(templateId string) *Entry {
|
||
|
e.Grants = append(e.Grants, templateId)
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
func (e *Entry) AddBundleGrant(B BundleItem) *Entry {
|
||
|
e.BundleMeta.BundleItems = append(e.BundleMeta.BundleItems, B)
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
func (e *Entry) AddMeta(key string, value interface{}) *Entry {
|
||
|
e.Meta = append(e.Meta, aid.JSON{
|
||
|
"Key": key,
|
||
|
"Value": value,
|
||
|
})
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
func (e *Entry) GenerateResponse(p *person.Person) aid.JSON {
|
||
|
json := aid.JSON{
|
||
|
"offerId": e.ID,
|
||
|
"devName": e.Name,
|
||
|
"offerType": e.Type,
|
||
|
"prices": []aid.JSON{
|
||
|
{
|
||
|
"currencyType": "MtxCurrency",
|
||
|
"currencySubType": "Currency",
|
||
|
"regularPrice": e.Price,
|
||
|
"dynamicRegularPrice": e.Price,
|
||
|
"finalPrice": e.Price,
|
||
|
"basePrice": e.Price,
|
||
|
"saleExpiration": aid.TimeEndOfDay(),
|
||
|
},
|
||
|
},
|
||
|
"categories": []string{},
|
||
|
"catalogGroupPriority": e.Priority,
|
||
|
"dailyLimit": -1,
|
||
|
"weeklyLimit": -1,
|
||
|
"monthlyLimit": -1,
|
||
|
"fufillmentIds": []string{},
|
||
|
"filterWeight": 0,
|
||
|
"appStoreId": []string{},
|
||
|
"refundable": false,
|
||
|
"itemGrants": []aid.JSON{},
|
||
|
"metaInfo": e.Meta,
|
||
|
"meta": aid.JSON{},
|
||
|
"displayAssetPath": e.Asset,
|
||
|
}
|
||
|
|
||
|
grants := []aid.JSON{}
|
||
|
requirements := []aid.JSON{}
|
||
|
meta := []aid.JSON{}
|
||
|
|
||
|
for _, templateId := range e.Grants {
|
||
|
grants = append(grants, aid.JSON{
|
||
|
"templateId": templateId,
|
||
|
"quantity": 1,
|
||
|
})
|
||
|
|
||
|
if item := p.AthenaProfile.Items.GetItemByTemplateID(templateId); item != nil {
|
||
|
requirements = append(requirements, aid.JSON{
|
||
|
"requirementType": "DenyOnItemOwnership",
|
||
|
"requiredId": item.ID,
|
||
|
"minQuantity": 1,
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for _, m := range e.Meta {
|
||
|
meta = append(meta, m)
|
||
|
json["meta"].(aid.JSON)[m["Key"].(string)] = m["Value"]
|
||
|
}
|
||
|
|
||
|
if e.Panel != "" {
|
||
|
json["categories"] = []string{e.Panel}
|
||
|
}
|
||
|
|
||
|
if e.IsBundle {
|
||
|
json["dynamicBundleInfo"] = aid.JSON{
|
||
|
"discountedBasePrice": e.BundleMeta.DiscountedBasePrice,
|
||
|
"regularBasePrice": e.BundleMeta.RegularBasePrice,
|
||
|
"floorPrice": e.BundleMeta.FloorPrice,
|
||
|
"currencyType": "MtxCurrency",
|
||
|
"currencySubType": "Currency",
|
||
|
"displayType": "AmountOff",
|
||
|
"bundleItems": []aid.JSON{},
|
||
|
}
|
||
|
|
||
|
for _, bundleItem := range e.BundleMeta.BundleItems {
|
||
|
json["prices"] = []aid.JSON{}
|
||
|
|
||
|
json["dynamicBundleInfo"].(aid.JSON)["bundleItems"] = append(json["dynamicBundleInfo"].(aid.JSON)["bundleItems"].([]aid.JSON), aid.JSON{
|
||
|
"regularPrice": bundleItem.RegularPrice,
|
||
|
"discountedPrice": bundleItem.DiscountedPrice,
|
||
|
"alreadyOwnedPriceReduction": bundleItem.AlreadyOwnedPriceReduction,
|
||
|
"item": aid.JSON{
|
||
|
"templateId": bundleItem.TemplateID,
|
||
|
"quantity": 1,
|
||
|
},
|
||
|
})
|
||
|
|
||
|
grants = append(grants, aid.JSON{
|
||
|
"templateId": bundleItem.TemplateID,
|
||
|
"quantity": 1,
|
||
|
})
|
||
|
|
||
|
if item := p.AthenaProfile.Items.GetItemByTemplateID(bundleItem.TemplateID); item != nil {
|
||
|
requirements = append(requirements, aid.JSON{
|
||
|
"requirementType": "DenyOnItemOwnership",
|
||
|
"requiredId": item.ID,
|
||
|
"minQuantity": 1,
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
json["itemGrants"] = grants
|
||
|
json["requirements"] = requirements
|
||
|
json["metaInfo"] = meta
|
||
|
|
||
|
return json
|
||
|
}
|