/// <inheritdoc/> /// <remarks> /// It may seem backwards that an upload only performs a delete request, however this is not trying /// 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. /// </remarks> public void UploadPurchase(MarketBoardPurchaseHandler purchaseHandler) { var clientState = Service <ClientState.ClientState> .Get(); using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(ApiKey); var itemId = purchaseHandler.CatalogId; var worldId = clientState.LocalPlayer?.CurrentWorld.Id ?? 0; // ==================================================================================== var deleteListingObject = new UniversalisItemListingDeleteRequest { PricePerUnit = purchaseHandler.PricePerUnit, Quantity = purchaseHandler.ItemQuantity, ListingId = purchaseHandler.ListingId.ToString(), RetainerId = purchaseHandler.RetainerId.ToString(), UploaderId = clientState.LocalContentId.ToString(), }; var deletePath = $"/api/{worldId}/{itemId}/delete"; var deleteListing = JsonConvert.SerializeObject(deleteListingObject); Log.Verbose($"{deletePath}: {deleteListing}"); client.PostAsync($"{ApiBase}{deletePath}", new StringContent(deleteListing, Encoding.UTF8, "application/json")).GetAwaiter().GetResult(); // ==================================================================================== Log.Verbose("Universalis purchase upload completed."); }
/// <inheritdoc/> /// <remarks> /// It may seem backwards that an upload only performs a delete request, however this is not trying /// 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. /// </remarks> public async Task UploadPurchase(MarketBoardPurchaseHandler purchaseHandler) { var clientState = Service <ClientState.ClientState> .Get(); var itemId = purchaseHandler.CatalogId; var worldId = clientState.LocalPlayer?.CurrentWorld.Id ?? 0; // ==================================================================================== var deleteListingObject = new UniversalisItemListingDeleteRequest { PricePerUnit = purchaseHandler.PricePerUnit, Quantity = purchaseHandler.ItemQuantity, ListingId = purchaseHandler.ListingId.ToString(), RetainerId = purchaseHandler.RetainerId.ToString(), UploaderId = clientState.LocalContentId.ToString(), }; var deletePath = $"/api/{worldId}/{itemId}/delete"; var deleteListing = JsonConvert.SerializeObject(deleteListingObject); Log.Verbose($"{deletePath}: {deleteListing}"); var content = new StringContent(deleteListing, Encoding.UTF8, "application/json"); var message = new HttpRequestMessage(HttpMethod.Post, $"{ApiBase}{deletePath}"); message.Headers.Add("Authorization", ApiKey); message.Content = content; await Util.HttpClient.SendAsync(message); // ==================================================================================== Log.Verbose("Universalis purchase upload completed."); }
/// <summary> /// Reads market board purchase information from the struct at the provided pointer. /// </summary> /// <param name="dataPtr">A pointer to a struct containing market board purchase information from the client.</param> /// <returns>An object representing the data read.</returns> public static unsafe MarketBoardPurchaseHandler Read(IntPtr dataPtr) { using var stream = new UnmanagedMemoryStream((byte *)dataPtr.ToPointer(), 1544); using var reader = new BinaryReader(stream); var output = new MarketBoardPurchaseHandler(); output.RetainerId = reader.ReadUInt64(); output.ListingId = reader.ReadUInt64(); output.CatalogId = reader.ReadUInt32(); output.ItemQuantity = reader.ReadUInt32(); output.PricePerUnit = reader.ReadUInt32(); return(output); }