From 8b8d1ca74ce9addba75e65153e771111a6726b5b Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Wed, 23 Jun 2021 10:31:15 -0700 Subject: [PATCH 01/13] Implement market board purchase message reading Originally from https://github.com/Aireil/Dalamud/commit/d85146c0d9c911634228ee00bd2bf2eed9c8fb52 --- Dalamud/Game/Network/NetworkHandlers.cs | 40 +++++++++++-- .../Network/Structures/MarketBoardPurchase.cs | 40 +++++++++++++ .../Structures/MarketBoardPurchaseHandler.cs | 57 +++++++++++++++++++ 3 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 Dalamud/Game/Network/Structures/MarketBoardPurchase.cs create mode 100644 Dalamud/Game/Network/Structures/MarketBoardPurchaseHandler.cs diff --git a/Dalamud/Game/Network/NetworkHandlers.cs b/Dalamud/Game/Network/NetworkHandlers.cs index 790ed57d5..c918d8b83 100644 --- a/Dalamud/Game/Network/NetworkHandlers.cs +++ b/Dalamud/Game/Network/NetworkHandlers.cs @@ -15,7 +15,7 @@ using Serilog; namespace Dalamud.Game.Network { /// - /// This class handles network notifications and uploading Marketboard data. + /// This class handles network notifications and uploading market board data. /// public class NetworkHandlers { @@ -23,6 +23,8 @@ namespace Dalamud.Game.Network private readonly List marketBoardRequests = new(); + private MarketBoardPurchaseHandler marketBoardPurchaseHandler; + private readonly bool optOutMbUploads; private readonly IMarketBoardUploader uploader; @@ -30,7 +32,7 @@ namespace Dalamud.Game.Network /// Initializes a new instance of the class. /// /// The Dalamud instance. - /// Whether the client should opt out of marketboard uploads. + /// Whether the client should opt out of market board uploads. public NetworkHandlers(Dalamud dalamud, bool optOutMbUploads) { this.dalamud = dalamud; @@ -48,12 +50,22 @@ namespace Dalamud.Game.Network private void OnNetworkMessage(IntPtr dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, NetworkMessageDirection direction) { - if (direction != NetworkMessageDirection.ZoneDown) - return; - if (!this.dalamud.Data.IsDataReady) return; + if (direction == NetworkMessageDirection.ZoneUp) + { + if (!this.optOutMbUploads) + { + if (opCode == this.dalamud.Data.ClientOpCodes["MarketBoardPurchaseHandler"]) + { + this.marketBoardPurchaseHandler = MarketBoardPurchaseHandler.Read(dataPtr); + } + } + + return; + } + if (opCode == this.dalamud.Data.ServerOpCodes["CfNotifyPop"]) { var data = new byte[64]; @@ -256,6 +268,24 @@ namespace Dalamud.Game.Network Log.Error(ex, "Market Board data upload failed."); } } + + if (opCode == this.dalamud.Data.ServerOpCodes["MarketBoardPurchase"]) + { + if (this.marketBoardPurchaseHandler == null) + return; + + var purchase = MarketBoardPurchase.Read(dataPtr); + + // Transaction succeeded + if (purchase.ItemQuantity == this.marketBoardPurchaseHandler.ItemQuantity + && (purchase.CatalogId == this.marketBoardPurchaseHandler.CatalogId + || purchase.CatalogId == this.marketBoardPurchaseHandler.CatalogId + 1000000)) + { // HQ + Log.Information("Bought " + purchase.ItemQuantity + "x " + this.marketBoardPurchaseHandler.CatalogId + " for " + (this.marketBoardPurchaseHandler.PricePerUnit * purchase.ItemQuantity) + " gils, listing id is " + this.marketBoardPurchaseHandler.ListingId); + } + + this.marketBoardPurchaseHandler = null; + } } } } diff --git a/Dalamud/Game/Network/Structures/MarketBoardPurchase.cs b/Dalamud/Game/Network/Structures/MarketBoardPurchase.cs new file mode 100644 index 000000000..ed8051154 --- /dev/null +++ b/Dalamud/Game/Network/Structures/MarketBoardPurchase.cs @@ -0,0 +1,40 @@ +using System; +using System.IO; + +namespace Dalamud.Game.Network.Structures +{ + /// + /// Represents market board purchase information. This message is received from the + /// server when a purchase is made at a market board. + /// + internal class MarketBoardPurchase + { + /// + /// Gets the item ID of the item that was purchased. + /// + public uint CatalogId { get; private set; } + + /// + /// Gets the quantity of the item that was purchased. + /// + public uint ItemQuantity { get; private set; } + + /// + /// Reads market board purchase information from the struct at the provided pointer. + /// + /// A pointer to a struct containing market board purchase information from the server. + /// An object representing the data read. + public static unsafe MarketBoardPurchase Read(IntPtr dataPtr) + { + var output = new MarketBoardPurchase(); + + using var stream = new UnmanagedMemoryStream((byte*)dataPtr.ToPointer(), 1544); + using var reader = new BinaryReader(stream); + output.CatalogId = reader.ReadUInt32(); + stream.Position += 4; + output.ItemQuantity = reader.ReadUInt32(); + + return output; + } + } +} diff --git a/Dalamud/Game/Network/Structures/MarketBoardPurchaseHandler.cs b/Dalamud/Game/Network/Structures/MarketBoardPurchaseHandler.cs new file mode 100644 index 000000000..98d7007b0 --- /dev/null +++ b/Dalamud/Game/Network/Structures/MarketBoardPurchaseHandler.cs @@ -0,0 +1,57 @@ +using System; +using System.IO; + +namespace Dalamud.Game.Network.Structures +{ + /// + /// Represents market board purchase information. This message is sent from the + /// client when a purchase is made at a market board. + /// + internal class MarketBoardPurchaseHandler + { + /// + /// Gets the object ID of the retainer associated with the sale. + /// + public ulong RetainerId { get; private set; } + + /// + /// Gets the object ID of the item listing. + /// + public ulong ListingId { get; private set; } + + /// + /// Gets the item ID of the item that was purchased. + /// + public uint CatalogId { get; private set; } + + /// + /// Gets the quantity of the item that was purchased. + /// + public uint ItemQuantity { get; private set; } + + /// + /// Gets the unit price of the item. + /// + public uint PricePerUnit { get; private set; } + + /// + /// Reads market board purchase information from the struct at the provided pointer. + /// + /// A pointer to a struct containing market board purchase information from the client. + /// An object representing the data read. + public static unsafe MarketBoardPurchaseHandler Read(IntPtr dataPtr) + { + var output = new MarketBoardPurchaseHandler(); + + using var stream = new UnmanagedMemoryStream((byte*)dataPtr.ToPointer(), 1544); + using var reader = new BinaryReader(stream); + output.RetainerId = reader.ReadUInt64(); + output.ListingId = reader.ReadUInt64(); + output.CatalogId = reader.ReadUInt32(); + output.ItemQuantity = reader.ReadUInt32(); + output.PricePerUnit = reader.ReadUInt32(); + + return output; + } + } +} From a0e43517b532bc6b8e9b95f820a956e696e58f6f Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Fri, 25 Jun 2021 07:55:07 -0700 Subject: [PATCH 02/13] Implement partial upload process for MB purchases --- .../IMarketBoardUploader.cs | 6 ++++++ .../UniversalisMarketBoardPurchaseRequest.cs | 9 +++++++++ .../UniversalisMarketBoardUploader.cs | 18 ++++++++++++++++++ Dalamud/Game/Network/NetworkHandlers.cs | 5 +++-- 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs diff --git a/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs index c6f2f0303..a5f507a24 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs @@ -18,5 +18,11 @@ namespace Dalamud.Game.Network.MarketBoardUploaders /// /// The tax rate data being uploaded. void UploadTax(MarketTaxRates taxRates); + + /// + /// Upload information about a purchase this client has made. + /// + /// That thing with Louisiana. + void UploadPurchase(MarketBoardPurchase purchase); } } diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs new file mode 100644 index 000000000..d6f008ad9 --- /dev/null +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs @@ -0,0 +1,9 @@ +namespace Dalamud.Game.Network.MarketBoardUploaders.Universalis +{ + /// + /// Request payload for market board purchases. + /// + public class UniversalisMarketBoardPurchaseRequest + { + } +} diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index cffa73491..49ecc45ad 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -136,5 +136,23 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders Log.Verbose("Universalis tax upload completed."); } + + /// + public void UploadPurchase(MarketBoardPurchase purchase) + { + using var client = new WebClient(); + client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); + client.Headers.Add(HttpRequestHeader.Authorization, ApiKey); + + var purchaseRequest = new UniversalisMarketBoardPurchaseRequest(); + + var worldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0; + + var purchaseUpload = JsonConvert.SerializeObject(purchaseRequest); + client.UploadString(ApiBase + $"/{purchase.CatalogId}/{worldId}/delete", "POST", purchaseUpload); + Log.Verbose(purchaseUpload); + + Log.Verbose("Universalis tax upload completed."); + } } } diff --git a/Dalamud/Game/Network/NetworkHandlers.cs b/Dalamud/Game/Network/NetworkHandlers.cs index c918d8b83..945627b83 100644 --- a/Dalamud/Game/Network/NetworkHandlers.cs +++ b/Dalamud/Game/Network/NetworkHandlers.cs @@ -23,11 +23,11 @@ namespace Dalamud.Game.Network private readonly List marketBoardRequests = new(); - private MarketBoardPurchaseHandler marketBoardPurchaseHandler; - private readonly bool optOutMbUploads; private readonly IMarketBoardUploader uploader; + private MarketBoardPurchaseHandler marketBoardPurchaseHandler; + /// /// Initializes a new instance of the class. /// @@ -282,6 +282,7 @@ namespace Dalamud.Game.Network || purchase.CatalogId == this.marketBoardPurchaseHandler.CatalogId + 1000000)) { // HQ Log.Information("Bought " + purchase.ItemQuantity + "x " + this.marketBoardPurchaseHandler.CatalogId + " for " + (this.marketBoardPurchaseHandler.PricePerUnit * purchase.ItemQuantity) + " gils, listing id is " + this.marketBoardPurchaseHandler.ListingId); + Task.Run(() => this.uploader.UploadPurchase(purchase)); } this.marketBoardPurchaseHandler = null; From c9a1ca2c14fcb4853186905a9ec4fcefe187f04c Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sat, 24 Jul 2021 23:38:27 -0700 Subject: [PATCH 03/13] chore(Network): fix NetworkHandlers access modifier (again) --- Dalamud/Game/Network/NetworkHandlers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dalamud/Game/Network/NetworkHandlers.cs b/Dalamud/Game/Network/NetworkHandlers.cs index fe54249df..b2d3128f1 100644 --- a/Dalamud/Game/Network/NetworkHandlers.cs +++ b/Dalamud/Game/Network/NetworkHandlers.cs @@ -17,7 +17,7 @@ namespace Dalamud.Game.Network /// /// This class handles network notifications and uploading market board data. /// - public class NetworkHandlers + internal class NetworkHandlers { private readonly Dalamud dalamud; From 6eb9dfefe1b9efeb095d0969513c86f338aea9ed Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sat, 24 Jul 2021 23:47:25 -0700 Subject: [PATCH 04/13] chore: add "Universalis" and "Uploaders" to dictionary --- Dalamud.sln.DotSettings | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dalamud.sln.DotSettings b/Dalamud.sln.DotSettings index 822d0841c..e63e37706 100644 --- a/Dalamud.sln.DotSettings +++ b/Dalamud.sln.DotSettings @@ -52,4 +52,6 @@ True True True - True \ No newline at end of file + True + True + True \ No newline at end of file From 89314e0c0ed0c9cea8d07f46f8548aac2cb04633 Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sat, 24 Jul 2021 23:59:31 -0700 Subject: [PATCH 05/13] feat(Network): implement full listing deletion process --- .../IMarketBoardUploader.cs | 4 +- .../UniversalisItemListingDeleteRequest.cs | 46 +++++++++++++++++++ .../UniversalisMarketBoardPurchaseRequest.cs | 9 ---- .../UniversalisMarketBoardUploader.cs | 19 ++++++-- Dalamud/Game/Network/NetworkHandlers.cs | 2 +- 5 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs delete mode 100644 Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs diff --git a/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs index a5f507a24..9820ac237 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/IMarketBoardUploader.cs @@ -22,7 +22,7 @@ namespace Dalamud.Game.Network.MarketBoardUploaders /// /// Upload information about a purchase this client has made. /// - /// That thing with Louisiana. - void UploadPurchase(MarketBoardPurchase purchase); + /// The purchase handler data associated with the sale. + void UploadPurchase(MarketBoardPurchaseHandler purchaseHandler); } } diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs new file mode 100644 index 000000000..d0101b0b9 --- /dev/null +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs @@ -0,0 +1,46 @@ +using Newtonsoft.Json; + +namespace Dalamud.Game.Network.MarketBoardUploaders.Universalis +{ + /// + /// Request payload for market board purchases. + /// + public class UniversalisItemListingDeleteRequest + { + /// + /// Gets or sets the object ID of the retainer associated with the sale. + /// + [JsonProperty("retainerID")] + public ulong RetainerId { get; set; } + + /// + /// Gets or sets the object ID of the item listing. + /// + [JsonProperty("listingID")] + public ulong ListingId { get; set; } + + /// + /// Gets or sets the item ID of the item that was purchased. + /// + [JsonProperty("itemID")] + public uint ItemId { get; set; } + + /// + /// Gets or sets the quantity of the item that was purchased. + /// + [JsonProperty("quantity")] + public uint Quantity { get; set; } + + /// + /// Gets or sets the unit price of the item. + /// + [JsonProperty("pricePerUnit")] + public uint PricePerUnit { get; set; } + + /// + /// Gets or sets the uploader ID. + /// + [JsonProperty("uploaderID")] + public string UploaderId { get; set; } + } +} diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs deleted file mode 100644 index d6f008ad9..000000000 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardPurchaseRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Dalamud.Game.Network.MarketBoardUploaders.Universalis -{ - /// - /// Request payload for market board purchases. - /// - public class UniversalisMarketBoardPurchaseRequest - { - } -} diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index 49ecc45ad..469d13f8a 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -138,21 +138,30 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders } /// - public void UploadPurchase(MarketBoardPurchase purchase) + public void UploadPurchase(MarketBoardPurchaseHandler purchaseHandler) { using var client = new WebClient(); client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); client.Headers.Add(HttpRequestHeader.Authorization, ApiKey); - var purchaseRequest = new UniversalisMarketBoardPurchaseRequest(); - + var itemId = purchaseHandler.CatalogId; var worldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0; + var purchaseRequest = new UniversalisItemListingDeleteRequest + { + ItemId = itemId, + PricePerUnit = purchaseHandler.PricePerUnit, + Quantity = purchaseHandler.ItemQuantity, + ListingId = purchaseHandler.ListingId, + RetainerId = purchaseHandler.RetainerId, + UploaderId = this.dalamud.ClientState.LocalContentId.ToString(), + }; + var purchaseUpload = JsonConvert.SerializeObject(purchaseRequest); - client.UploadString(ApiBase + $"/{purchase.CatalogId}/{worldId}/delete", "POST", purchaseUpload); + client.UploadString(ApiBase + $"/{itemId}/{worldId}/delete", "POST", purchaseUpload); Log.Verbose(purchaseUpload); - Log.Verbose("Universalis tax upload completed."); + Log.Verbose("Universalis purchase upload completed."); } } } diff --git a/Dalamud/Game/Network/NetworkHandlers.cs b/Dalamud/Game/Network/NetworkHandlers.cs index b2d3128f1..1a77830e4 100644 --- a/Dalamud/Game/Network/NetworkHandlers.cs +++ b/Dalamud/Game/Network/NetworkHandlers.cs @@ -282,7 +282,7 @@ namespace Dalamud.Game.Network || purchase.CatalogId == this.marketBoardPurchaseHandler.CatalogId + 1000000)) { // HQ Log.Information("Bought " + purchase.ItemQuantity + "x " + this.marketBoardPurchaseHandler.CatalogId + " for " + (this.marketBoardPurchaseHandler.PricePerUnit * purchase.ItemQuantity) + " gils, listing id is " + this.marketBoardPurchaseHandler.ListingId); - Task.Run(() => this.uploader.UploadPurchase(purchase)); + Task.Run(() => this.uploader.UploadPurchase(this.marketBoardPurchaseHandler)); } this.marketBoardPurchaseHandler = null; From 6768a3c0fcd4e71ef44fb9eccc4b69125558a712 Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 00:18:35 -0700 Subject: [PATCH 06/13] fix(Network): correct serialized types for delete request --- .../Universalis/UniversalisItemListingDeleteRequest.cs | 4 ++-- .../Universalis/UniversalisMarketBoardUploader.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs index d0101b0b9..54859fa20 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs @@ -11,13 +11,13 @@ namespace Dalamud.Game.Network.MarketBoardUploaders.Universalis /// Gets or sets the object ID of the retainer associated with the sale. /// [JsonProperty("retainerID")] - public ulong RetainerId { get; set; } + public string RetainerId { get; set; } /// /// Gets or sets the object ID of the item listing. /// [JsonProperty("listingID")] - public ulong ListingId { get; set; } + public string ListingId { get; set; } /// /// Gets or sets the item ID of the item that was purchased. diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index 469d13f8a..2c35f618e 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -152,8 +152,8 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders ItemId = itemId, PricePerUnit = purchaseHandler.PricePerUnit, Quantity = purchaseHandler.ItemQuantity, - ListingId = purchaseHandler.ListingId, - RetainerId = purchaseHandler.RetainerId, + ListingId = purchaseHandler.ListingId.ToString(), + RetainerId = purchaseHandler.RetainerId.ToString(), UploaderId = this.dalamud.ClientState.LocalContentId.ToString(), }; From 1789058e4548039f2adc63a70f56b83f06b7f433 Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 00:27:48 -0700 Subject: [PATCH 07/13] feat(Network): remove item ID from delete request body --- .../Universalis/UniversalisItemListingDeleteRequest.cs | 6 ------ .../Universalis/UniversalisMarketBoardUploader.cs | 1 - 2 files changed, 7 deletions(-) diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs index 54859fa20..f6994e60f 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisItemListingDeleteRequest.cs @@ -19,12 +19,6 @@ namespace Dalamud.Game.Network.MarketBoardUploaders.Universalis [JsonProperty("listingID")] public string ListingId { get; set; } - /// - /// Gets or sets the item ID of the item that was purchased. - /// - [JsonProperty("itemID")] - public uint ItemId { get; set; } - /// /// Gets or sets the quantity of the item that was purchased. /// diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index 2c35f618e..7706057cf 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -149,7 +149,6 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders var purchaseRequest = new UniversalisItemListingDeleteRequest { - ItemId = itemId, PricePerUnit = purchaseHandler.PricePerUnit, Quantity = purchaseHandler.ItemQuantity, ListingId = purchaseHandler.ListingId.ToString(), From ce47ccb151bb4646e638b42d308ec19dd948d837 Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 10:34:21 -0700 Subject: [PATCH 08/13] fix(Network): swap world ID and item ID in URL --- .../Universalis/UniversalisMarketBoardUploader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index 7706057cf..c7786d5fe 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -157,7 +157,7 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders }; var purchaseUpload = JsonConvert.SerializeObject(purchaseRequest); - client.UploadString(ApiBase + $"/{itemId}/{worldId}/delete", "POST", purchaseUpload); + client.UploadString(ApiBase + $"/{worldId}/{itemId}/delete", "POST", purchaseUpload); Log.Verbose(purchaseUpload); Log.Verbose("Universalis purchase upload completed."); From c4d574732fcec73b58d9f9bbfdd8a1457ab09b8b Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 10:49:20 -0700 Subject: [PATCH 09/13] fix(Network): avoid passing null object into purchase handler --- Dalamud/Game/Network/NetworkHandlers.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dalamud/Game/Network/NetworkHandlers.cs b/Dalamud/Game/Network/NetworkHandlers.cs index 1a77830e4..0b7aa7694 100644 --- a/Dalamud/Game/Network/NetworkHandlers.cs +++ b/Dalamud/Game/Network/NetworkHandlers.cs @@ -282,7 +282,8 @@ namespace Dalamud.Game.Network || purchase.CatalogId == this.marketBoardPurchaseHandler.CatalogId + 1000000)) { // HQ Log.Information("Bought " + purchase.ItemQuantity + "x " + this.marketBoardPurchaseHandler.CatalogId + " for " + (this.marketBoardPurchaseHandler.PricePerUnit * purchase.ItemQuantity) + " gils, listing id is " + this.marketBoardPurchaseHandler.ListingId); - Task.Run(() => this.uploader.UploadPurchase(this.marketBoardPurchaseHandler)); + var handler = this.marketBoardPurchaseHandler; // Capture the object so that we don't pass in a null one when the task starts. + Task.Run(() => this.uploader.UploadPurchase(handler)); } this.marketBoardPurchaseHandler = null; From a376b3da912c7fa34fa9d8d34bec486c5ebe600f Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 10:51:24 -0700 Subject: [PATCH 10/13] fix(Network): correct delete endpoint path --- .../Universalis/UniversalisMarketBoardUploader.cs | 2 +- build/build.csproj.DotSettings | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index c7786d5fe..1dc726696 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -157,7 +157,7 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders }; var purchaseUpload = JsonConvert.SerializeObject(purchaseRequest); - client.UploadString(ApiBase + $"/{worldId}/{itemId}/delete", "POST", purchaseUpload); + client.UploadString(ApiBase + $"/api/{worldId}/{itemId}/delete", "POST", purchaseUpload); Log.Verbose(purchaseUpload); Log.Verbose("Universalis purchase upload completed."); diff --git a/build/build.csproj.DotSettings b/build/build.csproj.DotSettings index c8947fcec..7bc28484c 100644 --- a/build/build.csproj.DotSettings +++ b/build/build.csproj.DotSettings @@ -1,4 +1,4 @@ - + DO_NOT_SHOW DO_NOT_SHOW DO_NOT_SHOW @@ -20,6 +20,7 @@ True True True + True True True True From 2adc01a953b30e90cde461a86527fa42e143866d Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 11:10:10 -0700 Subject: [PATCH 11/13] chore(Network): log before upload requests --- .../Universalis/UniversalisMarketBoardUploader.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index 1dc726696..59f312196 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -78,8 +78,8 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders } var upload = JsonConvert.SerializeObject(listingsRequestObject); - client.UploadString(ApiBase + $"/upload/{ApiKey}", "POST", upload); Log.Verbose(upload); + client.UploadString(ApiBase + $"/upload/{ApiKey}", "POST", upload); var historyRequestObject = new UniversalisHistoryUploadRequest(); historyRequestObject.WorldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0; @@ -103,8 +103,8 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); var historyUpload = JsonConvert.SerializeObject(historyRequestObject); - client.UploadString(ApiBase + $"/upload/{ApiKey}", "POST", historyUpload); Log.Verbose(historyUpload); + client.UploadString(ApiBase + $"/upload/{ApiKey}", "POST", historyUpload); Log.Verbose("Universalis data upload for item#{0} completed.", request.CatalogId); } @@ -131,8 +131,8 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); var historyUpload = JsonConvert.SerializeObject(taxRatesRequest); - client.UploadString(ApiBase + $"/upload/{ApiKey}", "POST", historyUpload); Log.Verbose(historyUpload); + client.UploadString(ApiBase + $"/upload/{ApiKey}", "POST", historyUpload); Log.Verbose("Universalis tax upload completed."); } @@ -156,9 +156,11 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders UploaderId = this.dalamud.ClientState.LocalContentId.ToString(), }; + var requestPath = ApiBase + $"/api/{worldId}/{itemId}/delete"; var purchaseUpload = JsonConvert.SerializeObject(purchaseRequest); - client.UploadString(ApiBase + $"/api/{worldId}/{itemId}/delete", "POST", purchaseUpload); + Log.Verbose($"Making request to {requestPath}"); Log.Verbose(purchaseUpload); + client.UploadString(requestPath, "POST", purchaseUpload); Log.Verbose("Universalis purchase upload completed."); } From 7a1ce01cc52909964212123106cc27d42307b91a Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 11:11:17 -0700 Subject: [PATCH 12/13] chore(Network): use object initializers --- .../UniversalisMarketBoardUploader.cs | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index 59f312196..58c7810ad 100644 --- a/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -41,12 +41,14 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders Log.Verbose("Starting Universalis upload."); var uploader = this.dalamud.ClientState.LocalContentId; - var listingsRequestObject = new UniversalisItemListingsUploadRequest(); - listingsRequestObject.WorldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0; - listingsRequestObject.UploaderId = uploader.ToString(); - listingsRequestObject.ItemId = request.CatalogId; + var listingsRequestObject = new UniversalisItemListingsUploadRequest + { + WorldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0, + UploaderId = uploader.ToString(), + ItemId = request.CatalogId, + Listings = new List(), + }; - listingsRequestObject.Listings = new List(); foreach (var marketBoardItemListing in request.Listings) { var universalisListing = new UniversalisItemListingsEntry @@ -62,9 +64,9 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders PricePerUnit = marketBoardItemListing.PricePerUnit, Quantity = marketBoardItemListing.ItemQuantity, RetainerCity = marketBoardItemListing.RetainerCityId, + Materia = new List(), }; - universalisListing.Materia = new List(); foreach (var itemMateria in marketBoardItemListing.Materia) { universalisListing.Materia.Add(new UniversalisItemMateria @@ -81,12 +83,14 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders Log.Verbose(upload); client.UploadString(ApiBase + $"/upload/{ApiKey}", "POST", upload); - var historyRequestObject = new UniversalisHistoryUploadRequest(); - historyRequestObject.WorldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0; - historyRequestObject.UploaderId = uploader.ToString(); - historyRequestObject.ItemId = request.CatalogId; + var historyRequestObject = new UniversalisHistoryUploadRequest + { + WorldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0, + UploaderId = uploader.ToString(), + ItemId = request.CatalogId, + Entries = new List(), + }; - historyRequestObject.Entries = new List(); foreach (var marketBoardHistoryListing in request.History) { historyRequestObject.Entries.Add(new UniversalisHistoryEntry @@ -114,18 +118,19 @@ namespace Dalamud.Game.Network.Universalis.MarketBoardUploaders { using var client = new WebClient(); - var taxRatesRequest = new UniversalisTaxUploadRequest(); - taxRatesRequest.WorldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0; - taxRatesRequest.UploaderId = this.dalamud.ClientState.LocalContentId.ToString(); - - taxRatesRequest.TaxData = new UniversalisTaxData + var taxRatesRequest = new UniversalisTaxUploadRequest { - LimsaLominsa = taxRates.LimsaLominsaTax, - Gridania = taxRates.GridaniaTax, - Uldah = taxRates.UldahTax, - Ishgard = taxRates.IshgardTax, - Kugane = taxRates.KuganeTax, - Crystarium = taxRates.CrystariumTax, + WorldId = this.dalamud.ClientState.LocalPlayer?.CurrentWorld.Id ?? 0, + UploaderId = this.dalamud.ClientState.LocalContentId.ToString(), + TaxData = new UniversalisTaxData + { + LimsaLominsa = taxRates.LimsaLominsaTax, + Gridania = taxRates.GridaniaTax, + Uldah = taxRates.UldahTax, + Ishgard = taxRates.IshgardTax, + Kugane = taxRates.KuganeTax, + Crystarium = taxRates.CrystariumTax, + }, }; client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); From 835e6dc58e913666e2cd4827e962d44c4b4b9877 Mon Sep 17 00:00:00 2001 From: karashiiro <49822414+karashiiro@users.noreply.github.com> Date: Sun, 25 Jul 2021 11:11:37 -0700 Subject: [PATCH 13/13] chore: add "Materia" to project dictionary --- Dalamud.sln.DotSettings | 1 + 1 file changed, 1 insertion(+) diff --git a/Dalamud.sln.DotSettings b/Dalamud.sln.DotSettings index e63e37706..ba114a776 100644 --- a/Dalamud.sln.DotSettings +++ b/Dalamud.sln.DotSettings @@ -51,6 +51,7 @@ True True True + True True True True