From 17fc1042005ee6a4a3e992633475bd060e2869b7 Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Wed, 2 Jan 2019 20:35:53 +0200 Subject: [PATCH 1/8] fix: ItemNotFoundException thrown if InventoryHandler.GetItemDescription tries to access an item that does not exist. --- .../UserInventory/Utilities/InventoryHandler.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs b/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs index ec8f1f2..7e3d420 100644 --- a/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs +++ b/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs @@ -1,5 +1,8 @@ -using System.Net; +using System; +using System.Net; using System.Linq; +using BackpackTfApi.Exceptions; +using BackpackTfApi.Static; namespace BackpackTfApi.SteamUser.UserInventory.Models { @@ -23,7 +26,16 @@ public static Response DownloadUserInventory(string uri) /// /// public static Description GetItemDescription(Response steamInventory, string itemName) - => steamInventory.Descriptions.Where(d => d.Name == itemName).First(); + { + try + { + return steamInventory.Descriptions.Where(d => d.Name == itemName).First(); + } + catch (InvalidOperationException) + { + throw new ItemNotFoundException($"{Messages.ItemNotFoundError} Item name - {itemName}"); + } + } /// /// Gets the Asset object of the targeted item in the user's inventory. From 6257722422f5859f9d305006961087c9fb3ee648 Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Wed, 2 Jan 2019 20:39:20 +0200 Subject: [PATCH 2/8] feat: Add more meaningful error message when GetItemFromInventory throws ItemNotFoundException --- src/BackpackTfApi/BackpackTfUser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BackpackTfApi/BackpackTfUser.cs b/src/BackpackTfApi/BackpackTfUser.cs index 10475f5..36a97e0 100644 --- a/src/BackpackTfApi/BackpackTfUser.cs +++ b/src/BackpackTfApi/BackpackTfUser.cs @@ -346,7 +346,7 @@ public InventoryItem GetItemFromInventory(string itemName) if (itemAsset == null || itemDescription == null) { - throw new ItemNotFoundException(Messages.ItemNotFoundError); + throw new ItemNotFoundException($"{Messages.ItemNotFoundError} Item name - {itemName}"); } return new InventoryItem(itemAsset, itemDescription); From 8ed76e03762ba3e5b7de81098fb0c7b236a4a801 Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Wed, 2 Jan 2019 21:21:48 +0200 Subject: [PATCH 3/8] feat: Add support for InventoryItem to distinguish item quality vs item quality index --- src/BackpackTfApi/Static/Messages.cs | 2 + .../UserInventory/Models/InventoryItem.cs | 110 +++++++++++++++++- .../Utilities/InventoryHandler.cs | 3 +- 3 files changed, 113 insertions(+), 2 deletions(-) diff --git a/src/BackpackTfApi/Static/Messages.cs b/src/BackpackTfApi/Static/Messages.cs index f997900..980b5f2 100644 --- a/src/BackpackTfApi/Static/Messages.cs +++ b/src/BackpackTfApi/Static/Messages.cs @@ -17,5 +17,7 @@ public static class Messages public const string ResponseNullError = "Cannot resolve \"response\" argument."; public const string InventoryNullError = "The user's inventory cannot be null."; + + public const string ItemQualityError = "Failed to determine item quality."; } } diff --git a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs index da9a603..16e1165 100644 --- a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs +++ b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs @@ -1,15 +1,123 @@ -namespace BackpackTfApi.SteamUser.UserInventory.Models +using System; +using System.Linq; + +using BackpackTfApi.Static; +using BackpackTfApi.Exceptions; + +namespace BackpackTfApi.SteamUser.UserInventory.Models { + /// + /// A Steam inventory item. + /// public class InventoryItem { + private const string TargetTag = "quality"; + public InventoryItem(Asset asset, Description description) { this.Asset = asset; this.Description = description; } + /// + /// The name of the item. + /// + public string Name + { + get + { + try + { + return this.Description.MarketHashName; + } + catch (InvalidOperationException) + { + throw new ItemNotFoundException(Messages.ItemNotFoundError); + } + } + } + + /// + /// The quality name of the specified item. + /// + public string QualityName + { + get + { + try + { + return this.Description + .Tags + .Where(t => t.Category.ToLower() == TargetTag) + .First() + .InternalName; + } + catch (InvalidOperationException) + { + throw new ItemNotFoundException($"{Messages.ItemNotFoundError}"); + } + } + } + + /// + /// The quality index of the specified item. + /// + public string QualityIndex => this.GetItemQualityIndex(this.Name); + + /// + /// The Steam inventory's asset object. + /// public Asset Asset { get; internal set; } + /// + /// The Steam inventory's description object. + /// public Description Description { get; internal set; } + + private string GetItemQualityIndex(string name) + { + try + { + return this.GetIndex(this.QualityName); + } + catch (ItemNotFoundException) + { + return this.GetIndex(name); + } + } + + private string GetIndex(string value) + { + var quality = value.Split().Take(1).ToArray()[0].ToLower(); + switch (quality) + { + case "normal": + return "0"; + case "genuine": + return "1"; + case "vintage": + return "3"; + case "unusual": + return "5"; + case "unique": + return "6"; + case "community": + return "7"; + case "valve": + return "8"; + case "self-made": + return "9"; + case "strange": + return "11"; + case "haunted": + return "13"; + case "collector's": + return "14"; + case "decorated": + return "15"; + default: + throw new ArgumentException(Messages.ItemQualityError); + } + } } } diff --git a/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs b/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs index 7e3d420..8cf5b8a 100644 --- a/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs +++ b/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs @@ -1,8 +1,9 @@ using System; using System.Net; using System.Linq; -using BackpackTfApi.Exceptions; + using BackpackTfApi.Static; +using BackpackTfApi.Exceptions; namespace BackpackTfApi.SteamUser.UserInventory.Models { From b5a1def4d3bfb525d033420275f217e46c7b33fb Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Wed, 2 Jan 2019 21:27:56 +0200 Subject: [PATCH 4/8] refactor: Remove redundant parameter --- .../SteamUser/UserInventory/Models/InventoryItem.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs index 16e1165..304d6f2 100644 --- a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs +++ b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs @@ -62,7 +62,7 @@ public string QualityName /// /// The quality index of the specified item. /// - public string QualityIndex => this.GetItemQualityIndex(this.Name); + public string QualityIndex => this.GetItemQualityIndex(); /// /// The Steam inventory's asset object. @@ -74,7 +74,7 @@ public string QualityName /// public Description Description { get; internal set; } - private string GetItemQualityIndex(string name) + private string GetItemQualityIndex() { try { @@ -82,7 +82,7 @@ private string GetItemQualityIndex(string name) } catch (ItemNotFoundException) { - return this.GetIndex(name); + return this.GetIndex(this.Name); } } From 61e15b647cb6c643f5941db03738ad90d5ce474f Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Wed, 2 Jan 2019 21:31:30 +0200 Subject: [PATCH 5/8] refactor: Replaced try-catch with if statement in the Name's getter --- .../SteamUser/UserInventory/Models/InventoryItem.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs index 304d6f2..784e1b5 100644 --- a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs +++ b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs @@ -26,14 +26,12 @@ public string Name { get { - try - { - return this.Description.MarketHashName; - } - catch (InvalidOperationException) + if (string.IsNullOrWhiteSpace(this.Description.MarketHashName)) { throw new ItemNotFoundException(Messages.ItemNotFoundError); } + + return this.Description.MarketHashName; } } From 46b0be6cc55a8d3dd5291cb4b3125b5d7693f25e Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Wed, 2 Jan 2019 21:56:34 +0200 Subject: [PATCH 6/8] feat: Add overrides to the BackpackTfUser model for CreateBuyListing and CreateSellListing to support InventoryItem; Change ItemCreationFailureException to ClassifiedCreationFailureException --- src/BackpackTfApi/BackpackTfUser.cs | 72 +++++++++++++++++-- .../ClassifiedCreationFailureException.cs | 10 +++ .../ItemCreationFailureException.cs | 10 --- .../UserInventory/Models/InventoryItem.cs | 2 +- 4 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 src/BackpackTfApi/Exceptions/ClassifiedCreationFailureException.cs delete mode 100644 src/BackpackTfApi/Exceptions/ItemCreationFailureException.cs diff --git a/src/BackpackTfApi/BackpackTfUser.cs b/src/BackpackTfApi/BackpackTfUser.cs index 36a97e0..59371a2 100644 --- a/src/BackpackTfApi/BackpackTfUser.cs +++ b/src/BackpackTfApi/BackpackTfUser.cs @@ -235,7 +235,7 @@ public UserToken.Classifieds.UserListings.Models.Response GetOwnClassifieds(int? /// The price for which the listing will be created. /// The text that will be typed in the message section of the listing. /// - /// + /// /// public UserToken.Classifieds.ListingsCreator.Models.Response CreateSellListing( string fullItemName, string currency, decimal price, string message) @@ -265,7 +265,38 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateSellListing( return UserListingsHandler.CreateListings(new Input(listings), uri); } - throw new ItemCreationFailureException($"Failed to create listing for item - {fullItemName}"); + throw new ClassifiedCreationFailureException($"Failed to create listing for item - {fullItemName}"); + } + + /// + /// Creates a sell listing / classified on backpack.tf. + /// + /// An item extracted from the user's inventory. + /// The currency type. + /// The price for which the listing will be created. + /// The text that will be typed in the message section of the listing. + /// + /// + public UserToken.Classifieds.ListingsCreator.Models.Response CreateSellListing( + InventoryItem item, string currency, decimal price, string message) + { + var itemAssetId = item.Asset.AssetId; + var currencies = new Dictionary + { + { currency, price } + }; + var listings = new List + { + new InputListing(1, currencies, message, itemAssetId) + }; + + if (itemAssetId != null) + { + var uri = this.BuildUri(BaseUris.ClassifiedsCreate, this.AccessToken); + return UserListingsHandler.CreateListings(new Input(listings), uri); + } + + throw new ClassifiedCreationFailureException($"Failed to create listing for item - {item.Name}"); } /// @@ -277,7 +308,7 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateSellListing( /// The currency type. /// The price for which the listing will be created. /// The text that will be typed in the message section of the listing. - /// + /// /// public UserToken.Classifieds.ListingsCreator.Models.Response CreateBuyListing( string fullItemName, string qualityIndex, string currency, decimal price, string message) @@ -287,7 +318,7 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateBuyListing( { { currency, price } }; - var listings = new List() + var listings = new List { new InputListing(0, currencies, message, null, item) }; @@ -298,7 +329,38 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateBuyListing( return UserListingsHandler.CreateListings(new Input(listings), uri); } - throw new ItemCreationFailureException($"Failed to create listing for item - {fullItemName}"); + throw new ClassifiedCreationFailureException($"Failed to create listing for item - {fullItemName}"); + } + + /// + /// Creates a buy listing / classified on backpack.tf. + /// + /// An item extracted from the user's inventory. + /// The currency type. + /// The price for which the listing will be created. + /// The text that will be typed in the message section of the listing. + /// + /// + public UserToken.Classifieds.ListingsCreator.Models.Response CreateBuyListing( + InventoryItem item, string currency, decimal price, string message) + { + var listingItem = new ListingItem(item.Name, item.QualityIndex); + var currencies = new Dictionary + { + { currency, price } + }; + var listings = new List + { + new InputListing(0, currencies, message, null, listingItem) + }; + + if (listings.Count > 0) + { + var uri = this.BuildUri(BaseUris.ClassifiedsCreate, this.AccessToken); + return UserListingsHandler.CreateListings(new Input(listings), uri); + } + + throw new ClassifiedCreationFailureException($"Failed to create listing for item - {item.Name}"); } /// diff --git a/src/BackpackTfApi/Exceptions/ClassifiedCreationFailureException.cs b/src/BackpackTfApi/Exceptions/ClassifiedCreationFailureException.cs new file mode 100644 index 0000000..6916300 --- /dev/null +++ b/src/BackpackTfApi/Exceptions/ClassifiedCreationFailureException.cs @@ -0,0 +1,10 @@ +using System; + +namespace BackpackTfApi.Exceptions +{ + public class ClassifiedCreationFailureException : Exception + { + public ClassifiedCreationFailureException(string message) + : base(message) { } + } +} diff --git a/src/BackpackTfApi/Exceptions/ItemCreationFailureException.cs b/src/BackpackTfApi/Exceptions/ItemCreationFailureException.cs deleted file mode 100644 index c3095b6..0000000 --- a/src/BackpackTfApi/Exceptions/ItemCreationFailureException.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace BackpackTfApi.Exceptions -{ - public class ItemCreationFailureException : Exception - { - public ItemCreationFailureException(string message) - : base(message) { } - } -} diff --git a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs index 784e1b5..36f0b6d 100644 --- a/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs +++ b/src/BackpackTfApi/SteamUser/UserInventory/Models/InventoryItem.cs @@ -52,7 +52,7 @@ public string QualityName } catch (InvalidOperationException) { - throw new ItemNotFoundException($"{Messages.ItemNotFoundError}"); + throw new ItemNotFoundException(Messages.ItemNotFoundError); } } } From 1992f9a7fc25729ed307834c9203bc15c4a63735 Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Wed, 2 Jan 2019 23:02:03 +0200 Subject: [PATCH 7/8] refactor: Add CreateListingsCollection and PostListing methods --- src/BackpackTfApi/BackpackTfUser.cs | 73 +++++++------------ .../Utilities/InventoryHandler.cs | 1 + 2 files changed, 29 insertions(+), 45 deletions(-) diff --git a/src/BackpackTfApi/BackpackTfUser.cs b/src/BackpackTfApi/BackpackTfUser.cs index 59371a2..157dd84 100644 --- a/src/BackpackTfApi/BackpackTfUser.cs +++ b/src/BackpackTfApi/BackpackTfUser.cs @@ -245,24 +245,15 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateSellListing( { itemAsset = InventoryHandler.GetItemAsset(this.userInventory, fullItemName); } - catch (WebException) + catch (InvalidOperationException) { throw new ItemNotFoundException(Messages.ItemNotFoundError); } - var currencies = new Dictionary - { - { currency, price } - }; - var listings = new List - { - new InputListing(1, currencies, message, itemAsset.AssetId) - }; - if (itemAsset != null) { - var uri = this.BuildUri(BaseUris.ClassifiedsCreate, this.AccessToken); - return UserListingsHandler.CreateListings(new Input(listings), uri); + var listings = this.CreateListingsCollection(1, currency, price, message, itemAsset.AssetId); + return this.PostListing(listings); } throw new ClassifiedCreationFailureException($"Failed to create listing for item - {fullItemName}"); @@ -281,19 +272,10 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateSellListing( InventoryItem item, string currency, decimal price, string message) { var itemAssetId = item.Asset.AssetId; - var currencies = new Dictionary - { - { currency, price } - }; - var listings = new List - { - new InputListing(1, currencies, message, itemAssetId) - }; - if (itemAssetId != null) { - var uri = this.BuildUri(BaseUris.ClassifiedsCreate, this.AccessToken); - return UserListingsHandler.CreateListings(new Input(listings), uri); + var listings = this.CreateListingsCollection(1, currency, price, message, itemAssetId); + return this.PostListing(listings); } throw new ClassifiedCreationFailureException($"Failed to create listing for item - {item.Name}"); @@ -314,19 +296,10 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateBuyListing( string fullItemName, string qualityIndex, string currency, decimal price, string message) { var item = new ListingItem(fullItemName, qualityIndex); - var currencies = new Dictionary - { - { currency, price } - }; - var listings = new List - { - new InputListing(0, currencies, message, null, item) - }; - + var listings = this.CreateListingsCollection(0, currency, price, message, null, item); if (listings.Count > 0) { - var uri = this.BuildUri(BaseUris.ClassifiedsCreate, this.AccessToken); - return UserListingsHandler.CreateListings(new Input(listings), uri); + return this.PostListing(listings); } throw new ClassifiedCreationFailureException($"Failed to create listing for item - {fullItemName}"); @@ -345,19 +318,10 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateBuyListing( InventoryItem item, string currency, decimal price, string message) { var listingItem = new ListingItem(item.Name, item.QualityIndex); - var currencies = new Dictionary - { - { currency, price } - }; - var listings = new List - { - new InputListing(0, currencies, message, null, listingItem) - }; - + var listings = this.CreateListingsCollection(0, currency, price, message, null, listingItem); if (listings.Count > 0) { - var uri = this.BuildUri(BaseUris.ClassifiedsCreate, this.AccessToken); - return UserListingsHandler.CreateListings(new Input(listings), uri); + return this.PostListing(listings); } throw new ClassifiedCreationFailureException($"Failed to create listing for item - {item.Name}"); @@ -425,5 +389,24 @@ private string BuildUri(string baseUri, params string[] args) return builder.ToString().TrimEnd('&'); } + + private UserToken.Classifieds.ListingsCreator.Models.Response PostListing(ICollection listings) + { + var uri = this.BuildUri(BaseUris.ClassifiedsCreate, this.AccessToken); + return UserListingsHandler.CreateListings(new Input(listings), uri); + } + + private ICollection CreateListingsCollection( + int intent, string currency, decimal price, string message, string assetId = null, ListingItem item = null) + { + var currencies = new Dictionary + { + { currency, price } + }; + return new List + { + new InputListing(intent, currencies, message, assetId, item) + }; + } } } diff --git a/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs b/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs index 8cf5b8a..cfa89da 100644 --- a/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs +++ b/src/BackpackTfApi/SteamUser/UserInventory/Utilities/InventoryHandler.cs @@ -43,6 +43,7 @@ public static Description GetItemDescription(Response steamInventory, string ite /// /// /// + /// /// public static Asset GetItemAsset(Response steamInventory, string itemName) { From e72466e6e6331a8dafe236b481e38b3d7099271d Mon Sep 17 00:00:00 2001 From: jackofdiamond5 Date: Thu, 3 Jan 2019 17:25:54 +0200 Subject: [PATCH 8/8] chore: Minor refactoring --- src/BackpackTfApi/BackpackTfUser.cs | 13 ++++--------- src/BackpackTfApi/Static/BaseUris.cs | 9 +++++++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/BackpackTfApi/BackpackTfUser.cs b/src/BackpackTfApi/BackpackTfUser.cs index 157dd84..5b5908b 100644 --- a/src/BackpackTfApi/BackpackTfUser.cs +++ b/src/BackpackTfApi/BackpackTfUser.cs @@ -174,7 +174,6 @@ public WebUsersData GetUsersByIds(ICollection ids) $"steamids={string.Join(',', ids)}"); using (var client = new WebClient()) return WebUsersData.FromJson(client.DownloadString(uri)); - } /// @@ -211,19 +210,15 @@ public UserToken.Classifieds.ClassifiedsSearch.Models.Response GetClassifieds() /// /// Fetches the currently opened user's classifieds from backpack.tf. /// - /// 0 - Buy Listings 1 - Sell Listings. Returns both if not set. + /// 0 - Buy Listings. 1 - Sell Listings. Returns both if not set. /// 0 - Include inactive listings. 1 - Skip inactive listings. /// /// /// public UserToken.Classifieds.UserListings.Models.Response GetOwnClassifieds(int? intent = null, int inactive = 1) { - var uri = this.BuildUri(BaseUris.UserListings, - this.AccessToken, - $"intent={intent}", - $"inactive={inactive}"); - using (var client = new WebClient()) - return UserListingsData.FromJson(client.DownloadString(uri)); + var uri = this.BuildUri(BaseUris.UserListings, this.AccessToken); + return UserListingsHandler.GetUserListings(uri, intent, inactive); } /// @@ -247,7 +242,7 @@ public UserToken.Classifieds.ListingsCreator.Models.Response CreateSellListing( } catch (InvalidOperationException) { - throw new ItemNotFoundException(Messages.ItemNotFoundError); + throw new ItemNotFoundException($"{Messages.ItemNotFoundError} Item - {fullItemName}"); } if (itemAsset != null) diff --git a/src/BackpackTfApi/Static/BaseUris.cs b/src/BackpackTfApi/Static/BaseUris.cs index ca4b40d..5d4f9df 100644 --- a/src/BackpackTfApi/Static/BaseUris.cs +++ b/src/BackpackTfApi/Static/BaseUris.cs @@ -3,14 +3,23 @@ public static class BaseUris { public const string AppId = "440"; + public const string GetCurrencies = "https://backpack.tf/api/IGetCurrencies/v1?key="; + public const string GetPriceHistory = "https://backpack.tf/api/IGetPriceHistory/v1?key="; + public const string GetPrices = "https://backpack.tf/api/IGetPrices/v4?key="; + public const string GetSpecialItems = "https://backpack.tf/api/IGetSpecialItems/v1?key="; + public const string GetUsers = "https://backpack.tf/api/IGetUsers/v3?key="; + public const string GetImpersonatedUsers = "https://backpack.tf/api/IGetUsers/GetImpersonatedUsers?"; + public const string ClassifiedsSearch = "https://backpack.tf/api/classifieds/search/v1?key="; + public const string UserListings = "https://backpack.tf/api/classifieds/listings/v1?token="; + public const string ClassifiedsCreate = "https://backpack.tf/api/classifieds/list/v1?token="; } }