mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
Fetch market board uploader info from main thread (#2158)
This commit is contained in:
parent
0a3e88efca
commit
f98da094f4
3 changed files with 62 additions and 38 deletions
|
|
@ -13,20 +13,26 @@ internal interface IMarketBoardUploader
|
||||||
/// Upload data about an item.
|
/// Upload data about an item.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="item">The item request data being uploaded.</param>
|
/// <param name="item">The item request data being uploaded.</param>
|
||||||
|
/// <param name="uploaderId">The uploaders ContentId.</param>
|
||||||
|
/// <param name="worldId">The uploaders WorldId.</param>
|
||||||
/// <returns>An async task.</returns>
|
/// <returns>An async task.</returns>
|
||||||
Task Upload(MarketBoardItemRequest item);
|
Task Upload(MarketBoardItemRequest item, ulong uploaderId, uint worldId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Upload tax rate data.
|
/// Upload tax rate data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="taxRates">The tax rate data being uploaded.</param>
|
/// <param name="taxRates">The tax rate data being uploaded.</param>
|
||||||
|
/// <param name="uploaderId">The uploaders ContentId.</param>
|
||||||
|
/// <param name="worldId">The uploaders WorldId.</param>
|
||||||
/// <returns>An async task.</returns>
|
/// <returns>An async task.</returns>
|
||||||
Task UploadTax(MarketTaxRates taxRates);
|
Task UploadTax(MarketTaxRates taxRates, ulong uploaderId, uint worldId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Upload information about a purchase this client has made.
|
/// Upload information about a purchase this client has made.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="purchaseHandler">The purchase handler data associated with the sale.</param>
|
/// <param name="purchaseHandler">The purchase handler data associated with the sale.</param>
|
||||||
|
/// <param name="uploaderId">The uploaders ContentId.</param>
|
||||||
|
/// <param name="worldId">The uploaders WorldId.</param>
|
||||||
/// <returns>An async task.</returns>
|
/// <returns>An async task.</returns>
|
||||||
Task UploadPurchase(MarketBoardPurchaseHandler purchaseHandler);
|
Task UploadPurchase(MarketBoardPurchaseHandler purchaseHandler, ulong uploaderId, uint worldId);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
@ -33,21 +32,16 @@ internal class UniversalisMarketBoardUploader : IMarketBoardUploader
|
||||||
this.httpClient = happyHttpClient.SharedHttpClient;
|
this.httpClient = happyHttpClient.SharedHttpClient;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task Upload(MarketBoardItemRequest request)
|
public async Task Upload(MarketBoardItemRequest request, ulong uploaderId, uint worldId)
|
||||||
{
|
{
|
||||||
var clientState = Service<ClientState.ClientState>.GetNullable();
|
|
||||||
if (clientState == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Log.Verbose("Starting Universalis upload");
|
Log.Verbose("Starting Universalis upload");
|
||||||
var uploader = clientState.LocalContentId;
|
|
||||||
|
|
||||||
// ====================================================================================
|
// ====================================================================================
|
||||||
|
|
||||||
var uploadObject = new UniversalisItemUploadRequest
|
var uploadObject = new UniversalisItemUploadRequest
|
||||||
{
|
{
|
||||||
WorldId = clientState.LocalPlayer?.CurrentWorld.RowId ?? 0,
|
WorldId = worldId,
|
||||||
UploaderId = uploader.ToString(),
|
UploaderId = uploaderId.ToString(),
|
||||||
ItemId = request.CatalogId,
|
ItemId = request.CatalogId,
|
||||||
Listings = [],
|
Listings = [],
|
||||||
Sales = [],
|
Sales = [],
|
||||||
|
|
@ -117,18 +111,12 @@ internal class UniversalisMarketBoardUploader : IMarketBoardUploader
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task UploadTax(MarketTaxRates taxRates)
|
public async Task UploadTax(MarketTaxRates taxRates, ulong uploaderId, uint worldId)
|
||||||
{
|
{
|
||||||
var clientState = Service<ClientState.ClientState>.GetNullable();
|
|
||||||
if (clientState == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// ====================================================================================
|
|
||||||
|
|
||||||
var taxUploadObject = new UniversalisTaxUploadRequest
|
var taxUploadObject = new UniversalisTaxUploadRequest
|
||||||
{
|
{
|
||||||
WorldId = clientState.LocalPlayer?.CurrentWorld.RowId ?? 0,
|
WorldId = worldId,
|
||||||
UploaderId = clientState.LocalContentId.ToString(),
|
UploaderId = uploaderId.ToString(),
|
||||||
TaxData = new UniversalisTaxData
|
TaxData = new UniversalisTaxData
|
||||||
{
|
{
|
||||||
LimsaLominsa = taxRates.LimsaLominsaTax,
|
LimsaLominsa = taxRates.LimsaLominsaTax,
|
||||||
|
|
@ -159,14 +147,9 @@ internal class UniversalisMarketBoardUploader : IMarketBoardUploader
|
||||||
/// to track the available listings, that is done via the listings packet. All this does is remove
|
/// to track the available listings, that is done via the listings packet. All this does is remove
|
||||||
/// a listing, or delete it, when a purchase has been made.
|
/// a listing, or delete it, when a purchase has been made.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public async Task UploadPurchase(MarketBoardPurchaseHandler purchaseHandler)
|
public async Task UploadPurchase(MarketBoardPurchaseHandler purchaseHandler, ulong uploaderId, uint worldId)
|
||||||
{
|
{
|
||||||
var clientState = Service<ClientState.ClientState>.GetNullable();
|
|
||||||
if (clientState == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var itemId = purchaseHandler.CatalogId;
|
var itemId = purchaseHandler.CatalogId;
|
||||||
var worldId = clientState.LocalPlayer?.CurrentWorld.RowId ?? 0;
|
|
||||||
|
|
||||||
// ====================================================================================
|
// ====================================================================================
|
||||||
|
|
||||||
|
|
@ -176,7 +159,7 @@ internal class UniversalisMarketBoardUploader : IMarketBoardUploader
|
||||||
Quantity = purchaseHandler.ItemQuantity,
|
Quantity = purchaseHandler.ItemQuantity,
|
||||||
ListingId = purchaseHandler.ListingId.ToString(),
|
ListingId = purchaseHandler.ListingId.ToString(),
|
||||||
RetainerId = purchaseHandler.RetainerId.ToString(),
|
RetainerId = purchaseHandler.RetainerId.ToString(),
|
||||||
UploaderId = clientState.LocalContentId.ToString(),
|
UploaderId = uploaderId.ToString(),
|
||||||
};
|
};
|
||||||
|
|
||||||
var deletePath = $"/api/{worldId}/{itemId}/delete";
|
var deletePath = $"/api/{worldId}/{itemId}/delete";
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,11 @@ using Dalamud.Hooking;
|
||||||
using Dalamud.Networking.Http;
|
using Dalamud.Networking.Http;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
|
|
||||||
|
using FFXIVClientStructs.FFXIV.Client.Game.Control;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Game.InstanceContent;
|
using FFXIVClientStructs.FFXIV.Client.Game.InstanceContent;
|
||||||
|
using FFXIVClientStructs.FFXIV.Client.Game.UI;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Network;
|
using FFXIVClientStructs.FFXIV.Client.Network;
|
||||||
|
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI.Info;
|
using FFXIVClientStructs.FFXIV.Client.UI.Info;
|
||||||
using Lumina.Excel.Sheets;
|
using Lumina.Excel.Sheets;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
@ -264,6 +267,33 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
this.cfPopHook.Dispose();
|
this.cfPopHook.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static (ulong UploaderId, uint WorldId) GetUploaderInfo()
|
||||||
|
{
|
||||||
|
var agentLobby = AgentLobby.Instance();
|
||||||
|
|
||||||
|
var uploaderId = agentLobby->LobbyData.ContentId;
|
||||||
|
if (uploaderId == 0)
|
||||||
|
{
|
||||||
|
var playerState = PlayerState.Instance();
|
||||||
|
if (playerState->IsLoaded == 1)
|
||||||
|
{
|
||||||
|
uploaderId = playerState->ContentId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var worldId = agentLobby->LobbyData.CurrentWorldId;
|
||||||
|
if (worldId == 0)
|
||||||
|
{
|
||||||
|
var localPlayer = Control.GetLocalPlayer();
|
||||||
|
if (localPlayer != null)
|
||||||
|
{
|
||||||
|
worldId = localPlayer->CurrentWorld;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (uploaderId, worldId);
|
||||||
|
}
|
||||||
|
|
||||||
private unsafe nint CfPopDetour(PublicContentDirector.EnterContentInfoPacket* packetData)
|
private unsafe nint CfPopDetour(PublicContentDirector.EnterContentInfoPacket* packetData)
|
||||||
{
|
{
|
||||||
var result = this.cfPopHook.OriginalDisposeSafe(packetData);
|
var result = this.cfPopHook.OriginalDisposeSafe(packetData);
|
||||||
|
|
@ -424,14 +454,14 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
startObservable
|
startObservable
|
||||||
.And(this.OnMarketBoardSalesBatch(startObservable))
|
.And(this.OnMarketBoardSalesBatch(startObservable))
|
||||||
.And(this.OnMarketBoardListingsBatch(startObservable))
|
.And(this.OnMarketBoardListingsBatch(startObservable))
|
||||||
.Then((request, sales, listings) => (request, sales, listings)))
|
.Then((request, sales, listings) => (request, sales, listings, GetUploaderInfo())))
|
||||||
.Where(this.ShouldUpload)
|
.Where(this.ShouldUpload)
|
||||||
.SubscribeOn(ThreadPoolScheduler.Instance)
|
.SubscribeOn(ThreadPoolScheduler.Instance)
|
||||||
.Subscribe(
|
.Subscribe(
|
||||||
data =>
|
data =>
|
||||||
{
|
{
|
||||||
var (request, sales, listings) = data;
|
var (request, sales, listings, uploaderInfo) = data;
|
||||||
this.UploadMarketBoardData(request, sales, listings);
|
this.UploadMarketBoardData(request, sales, listings, uploaderInfo.UploaderId, uploaderInfo.WorldId);
|
||||||
},
|
},
|
||||||
ex => Log.Error(ex, "Failed to handle Market Board item request event"));
|
ex => Log.Error(ex, "Failed to handle Market Board item request event"));
|
||||||
}
|
}
|
||||||
|
|
@ -439,7 +469,9 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
private void UploadMarketBoardData(
|
private void UploadMarketBoardData(
|
||||||
MarketBoardItemRequest request,
|
MarketBoardItemRequest request,
|
||||||
(uint CatalogId, ICollection<MarketBoardHistory.MarketBoardHistoryListing> Sales) sales,
|
(uint CatalogId, ICollection<MarketBoardHistory.MarketBoardHistoryListing> Sales) sales,
|
||||||
ICollection<MarketBoardCurrentOfferings.MarketBoardItemListing> listings)
|
ICollection<MarketBoardCurrentOfferings.MarketBoardItemListing> listings,
|
||||||
|
ulong uploaderId,
|
||||||
|
uint worldId)
|
||||||
{
|
{
|
||||||
var catalogId = sales.CatalogId;
|
var catalogId = sales.CatalogId;
|
||||||
if (listings.Count != request.AmountToArrive)
|
if (listings.Count != request.AmountToArrive)
|
||||||
|
|
@ -460,7 +492,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
request.Listings.AddRange(listings);
|
request.Listings.AddRange(listings);
|
||||||
request.History.AddRange(sales.Sales);
|
request.History.AddRange(sales.Sales);
|
||||||
|
|
||||||
Task.Run(() => this.uploader.Upload(request))
|
Task.Run(() => this.uploader.Upload(request, uploaderId, worldId))
|
||||||
.ContinueWith(
|
.ContinueWith(
|
||||||
task => Log.Error(task.Exception, "Market Board offerings data upload failed"),
|
task => Log.Error(task.Exception, "Market Board offerings data upload failed"),
|
||||||
TaskContinuationOptions.OnlyOnFaulted);
|
TaskContinuationOptions.OnlyOnFaulted);
|
||||||
|
|
@ -469,11 +501,14 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
private IDisposable HandleMarketTaxRates()
|
private IDisposable HandleMarketTaxRates()
|
||||||
{
|
{
|
||||||
return this.MbTaxesObservable
|
return this.MbTaxesObservable
|
||||||
|
.Select((taxes) => (taxes, GetUploaderInfo()))
|
||||||
.Where(this.ShouldUpload)
|
.Where(this.ShouldUpload)
|
||||||
.SubscribeOn(ThreadPoolScheduler.Instance)
|
.SubscribeOn(ThreadPoolScheduler.Instance)
|
||||||
.Subscribe(
|
.Subscribe(
|
||||||
taxes =>
|
data =>
|
||||||
{
|
{
|
||||||
|
var (taxes, uploaderInfo) = data;
|
||||||
|
|
||||||
Log.Verbose(
|
Log.Verbose(
|
||||||
"MarketTaxRates: limsa#{0} grid#{1} uldah#{2} ish#{3} kugane#{4} cr#{5} sh#{6}",
|
"MarketTaxRates: limsa#{0} grid#{1} uldah#{2} ish#{3} kugane#{4} cr#{5} sh#{6}",
|
||||||
taxes.LimsaLominsaTax,
|
taxes.LimsaLominsaTax,
|
||||||
|
|
@ -484,7 +519,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
taxes.CrystariumTax,
|
taxes.CrystariumTax,
|
||||||
taxes.SharlayanTax);
|
taxes.SharlayanTax);
|
||||||
|
|
||||||
Task.Run(() => this.uploader.UploadTax(taxes))
|
Task.Run(() => this.uploader.UploadTax(taxes, uploaderInfo.UploaderId, uploaderInfo.WorldId))
|
||||||
.ContinueWith(
|
.ContinueWith(
|
||||||
task => Log.Error(task.Exception, "Market Board tax data upload failed"),
|
task => Log.Error(task.Exception, "Market Board tax data upload failed"),
|
||||||
TaskContinuationOptions.OnlyOnFaulted);
|
TaskContinuationOptions.OnlyOnFaulted);
|
||||||
|
|
@ -495,13 +530,13 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
private IDisposable HandleMarketBoardPurchaseHandler()
|
private IDisposable HandleMarketBoardPurchaseHandler()
|
||||||
{
|
{
|
||||||
return this.MbPurchaseSentObservable
|
return this.MbPurchaseSentObservable
|
||||||
.Zip(this.MbPurchaseObservable)
|
.Zip(this.MbPurchaseObservable, (handler, purchase) => (handler, purchase, GetUploaderInfo()))
|
||||||
.Where(this.ShouldUpload)
|
.Where(this.ShouldUpload)
|
||||||
.SubscribeOn(ThreadPoolScheduler.Instance)
|
.SubscribeOn(ThreadPoolScheduler.Instance)
|
||||||
.Subscribe(
|
.Subscribe(
|
||||||
data =>
|
data =>
|
||||||
{
|
{
|
||||||
var (handler, purchase) = data;
|
var (handler, purchase, uploaderInfo) = data;
|
||||||
|
|
||||||
var sameQty = purchase.ItemQuantity == handler.ItemQuantity;
|
var sameQty = purchase.ItemQuantity == handler.ItemQuantity;
|
||||||
var itemMatch = purchase.CatalogId == handler.CatalogId;
|
var itemMatch = purchase.CatalogId == handler.CatalogId;
|
||||||
|
|
@ -516,7 +551,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService
|
||||||
handler.CatalogId,
|
handler.CatalogId,
|
||||||
handler.PricePerUnit * purchase.ItemQuantity,
|
handler.PricePerUnit * purchase.ItemQuantity,
|
||||||
handler.ListingId);
|
handler.ListingId);
|
||||||
Task.Run(() => this.uploader.UploadPurchase(handler))
|
Task.Run(() => this.uploader.UploadPurchase(handler, uploaderInfo.UploaderId, uploaderInfo.WorldId))
|
||||||
.ContinueWith(
|
.ContinueWith(
|
||||||
task => Log.Error(task.Exception, "Market Board purchase data upload failed"),
|
task => Log.Error(task.Exception, "Market Board purchase data upload failed"),
|
||||||
TaskContinuationOptions.OnlyOnFaulted);
|
TaskContinuationOptions.OnlyOnFaulted);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue