/* Includes inventory types as used in the trade package */ package inventory import ( "bytes" "encoding/json" "fmt" "github.com/Philipp15b/go-steam/jsont" "strconv" ) type GenericInventory map[uint32]map[uint64]*Inventory func NewGenericInventory() GenericInventory { iMap := make(map[uint32]map[uint64]*Inventory) return GenericInventory(iMap) } // Get inventory for specified AppId and ContextId func (i *GenericInventory) Get(appId uint32, contextId uint64) (*Inventory, error) { iMap := (map[uint32]map[uint64]*Inventory)(*i) iMap2, ok := iMap[appId] if !ok { return nil, fmt.Errorf("inventory for specified appId not found") } inv, ok := iMap2[contextId] if !ok { return nil, fmt.Errorf("inventory for specified contextId not found") } return inv, nil } func (i *GenericInventory) Add(appId uint32, contextId uint64, inv *Inventory) { iMap := (map[uint32]map[uint64]*Inventory)(*i) iMap2, ok := iMap[appId] if !ok { iMap2 = make(map[uint64]*Inventory) iMap[appId] = iMap2 } iMap2[contextId] = inv } type Inventory struct { Items Items `json:"rgInventory"` Currencies Currencies `json:"rgCurrency"` Descriptions Descriptions `json:"rgDescriptions"` AppInfo *AppInfo `json:"rgAppInfo"` } // Items key is an AssetId type Items map[string]*Item func (i *Items) ToMap() map[string]*Item { return (map[string]*Item)(*i) } func (i *Items) Get(assetId uint64) (*Item, error) { iMap := (map[string]*Item)(*i) if item, ok := iMap[strconv.FormatUint(assetId, 10)]; ok { return item, nil } return nil, fmt.Errorf("item not found") } func (i *Items) UnmarshalJSON(data []byte) error { if bytes.Equal(data, []byte("[]")) { return nil } return json.Unmarshal(data, (*map[string]*Item)(i)) } type Currencies map[string]*Currency func (c *Currencies) ToMap() map[string]*Currency { return (map[string]*Currency)(*c) } func (c *Currencies) UnmarshalJSON(data []byte) error { if bytes.Equal(data, []byte("[]")) { return nil } return json.Unmarshal(data, (*map[string]*Currency)(c)) } // Descriptions key format is %d_%d, first %d is ClassId, second is InstanceId type Descriptions map[string]*Description func (d *Descriptions) ToMap() map[string]*Description { return (map[string]*Description)(*d) } func (d *Descriptions) Get(classId uint64, instanceId uint64) (*Description, error) { dMap := (map[string]*Description)(*d) descId := fmt.Sprintf("%v_%v", classId, instanceId) if desc, ok := dMap[descId]; ok { return desc, nil } return nil, fmt.Errorf("description not found") } func (d *Descriptions) UnmarshalJSON(data []byte) error { if bytes.Equal(data, []byte("[]")) { return nil } return json.Unmarshal(data, (*map[string]*Description)(d)) } type Item struct { Id uint64 `json:",string"` ClassId uint64 `json:",string"` InstanceId uint64 `json:",string"` Amount uint64 `json:",string"` Pos uint32 } type Currency struct { Id uint64 `json:",string"` ClassId uint64 `json:",string"` IsCurrency bool `json:"is_currency"` Pos uint32 } type Description struct { AppId uint32 `json:",string"` ClassId uint64 `json:",string"` InstanceId uint64 `json:",string"` IconUrl string `json:"icon_url"` IconUrlLarge string `json:"icon_url_large"` IconDragUrl string `json:"icon_drag_url"` Name string MarketName string `json:"market_name"` MarketHashName string `json:"market_hash_name"` // Colors in hex, for example `B2B2B2` NameColor string `json:"name_color"` BackgroundColor string `json:"background_color"` Type string Tradable jsont.UintBool Marketable jsont.UintBool Commodity jsont.UintBool MarketTradableRestriction uint32 `json:"market_tradable_restriction,string"` Descriptions DescriptionLines Actions []*Action // Application-specific data, like "def_index" and "quality" for TF2 AppData map[string]string Tags []*Tag } type DescriptionLines []*DescriptionLine func (d *DescriptionLines) UnmarshalJSON(data []byte) error { if bytes.Equal(data, []byte(`""`)) { return nil } return json.Unmarshal(data, (*[]*DescriptionLine)(d)) } type DescriptionLine struct { Value string Type *string // Is `html` for HTML descriptions Color *string } type Action struct { Name string Link string } type AppInfo struct { AppId uint32 Name string Icon string Link string } type Tag struct { InternalName string `json:internal_name` Name string Category string CategoryName string `json:category_name` }