From 5cc9588fbf3be7ed00100b5d790b75ad1ec0f5a2 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 29 Oct 2024 03:07:16 +0800 Subject: [PATCH 1/4] fix: fix querying market items in non-inject mode Change the time when we query for universalis and delay the dto fire time to fix item id not handle issue --- Cafe.Matcha/Network/NetworkMonitor.cs | 30 +++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/Cafe.Matcha/Network/NetworkMonitor.cs b/Cafe.Matcha/Network/NetworkMonitor.cs index 541ded5..9897e30 100644 --- a/Cafe.Matcha/Network/NetworkMonitor.cs +++ b/Cafe.Matcha/Network/NetworkMonitor.cs @@ -22,6 +22,7 @@ internal interface INetworkMonitor internal class NetworkMonitor : INetworkMonitor { private uint marketQueryItemId = 0; + private MarketBoardItemListingCountDTO pendingMarketBoardItemListingCountDTO = null; public void HandleMessageReceived(string connection, long epoch, byte[] message) { @@ -535,18 +536,27 @@ private bool HandleMessageByOpcode(Packet packet) if (status == 0 && itemId != 0) // OK { - ThreadPool.QueueUserWorkItem(o => Universalis.Client.QueryItem(State.Instance.WorldId, itemId, FireEvent)); - FireEvent(new MarketBoardItemListingCountDTO() + var dto = new MarketBoardItemListingCountDTO() { Item = (int)itemId, Count = (int)count, World = State.Instance.WorldId - }); + }; + if (itemId == 0) + { + pendingMarketBoardItemListingCountDTO = dto; + } + else + { + FireEvent(dto); + marketQueryItemId = 0; + } } - marketQueryItemId = 0; return true; } + //TODO: This packet not sent from client, so in only recived where in injected games + //We should found the another workaround here else if (opcode == MatchaOpcode.MarketBoardRequestItemListingInfo) { if (packet.DataLength != 8) @@ -587,6 +597,18 @@ private bool HandleMessageByOpcode(Packet packet) if (itemId != 0) { + if (pendingMarketBoardItemListingCountDTO != null) + { + FireEvent(new MarketBoardItemListingCountDTO + { + Item = (int)itemId, + Count = pendingMarketBoardItemListingCountDTO.Count, + World = State.Instance.WorldId + }); + pendingMarketBoardItemListingCountDTO = null; + } + + ThreadPool.QueueUserWorkItem(o => Universalis.Client.QueryItem(State.Instance.WorldId, itemId, FireEvent)); FireEvent(new MarketBoardItemListingDTO() { Item = (int)itemId, From de015fafa5557edb2815b24e0331171e567d0405 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 29 Oct 2024 03:09:31 +0800 Subject: [PATCH 2/4] chore: check the item id when uploading data to universalis now it mainly blocking market history uploading (since we still does not fix the item id issue when uploading history) --- Cafe.Matcha/Network/Universalis/PacketProcessor.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Cafe.Matcha/Network/Universalis/PacketProcessor.cs b/Cafe.Matcha/Network/Universalis/PacketProcessor.cs index 47b5868..2d74d3f 100644 --- a/Cafe.Matcha/Network/Universalis/PacketProcessor.cs +++ b/Cafe.Matcha/Network/Universalis/PacketProcessor.cs @@ -208,7 +208,7 @@ void LogStartObserved(MarketBoardItemRequest request) .And(OnMarketBoardSalesBatch(startObservable)) .And(OnMarketBoardListingsBatch(startObservable)) .Then((request, sales, listings) => (request, sales, listings))) - .Where(ShouldUpload) + .Where(ShouldUpload) .SubscribeOn(ThreadPoolScheduler.Instance) .Subscribe( data => @@ -225,6 +225,12 @@ private void UploadMarketBoardData( ICollection listings) { var catalogId = listings.FirstOrDefault()?.CatalogId ?? 0; + if (catalogId == 0) + { + Log?.Invoke(this, $"Wrong catalogId of Market Board listings received for request: item#{catalogId}"); + return; + } + if (listings.Count != request.AmountToArrive) { Log?.Invoke(this, $"Wrong number of Market Board listings received for request: {listings.Count} != {request.AmountToArrive} item#{catalogId}"); From 496b21aafb1b774f261485ebef84b05632b45105 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 29 Oct 2024 03:15:43 +0800 Subject: [PATCH 3/4] fix: fix wording and format for MarketBoardRequestItemListingInfo comment --- Cafe.Matcha/Network/NetworkMonitor.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Cafe.Matcha/Network/NetworkMonitor.cs b/Cafe.Matcha/Network/NetworkMonitor.cs index 9897e30..96a7a00 100644 --- a/Cafe.Matcha/Network/NetworkMonitor.cs +++ b/Cafe.Matcha/Network/NetworkMonitor.cs @@ -555,8 +555,9 @@ private bool HandleMessageByOpcode(Packet packet) return true; } - //TODO: This packet not sent from client, so in only recived where in injected games - //We should found the another workaround here + + // TODO: This packet is sent from client, so it only appear in injected games + // We should found the another workaround here for handling item id else if (opcode == MatchaOpcode.MarketBoardRequestItemListingInfo) { if (packet.DataLength != 8) From 92f52e6a12244e306a79c839dc001a7dbda6767d Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 29 Oct 2024 03:40:41 +0800 Subject: [PATCH 4/4] feat: refactor MarketBoardItemListingCountDTO event firing Remove the MarketBoardRequestItemListingInfo and MarketBoardItemListingCount handling, seems MarketBoardItemListingCount not longer work for just sending all zero values --- Cafe.Matcha/Network/NetworkMonitor.cs | 61 +++------------------------ 1 file changed, 6 insertions(+), 55 deletions(-) diff --git a/Cafe.Matcha/Network/NetworkMonitor.cs b/Cafe.Matcha/Network/NetworkMonitor.cs index 96a7a00..7a73db1 100644 --- a/Cafe.Matcha/Network/NetworkMonitor.cs +++ b/Cafe.Matcha/Network/NetworkMonitor.cs @@ -21,8 +21,6 @@ internal interface INetworkMonitor internal class NetworkMonitor : INetworkMonitor { - private uint marketQueryItemId = 0; - private MarketBoardItemListingCountDTO pendingMarketBoardItemListingCountDTO = null; public void HandleMessageReceived(string connection, long epoch, byte[] message) { @@ -525,52 +523,10 @@ private bool HandleMessageByOpcode(Packet packet) } else if (opcode == MatchaOpcode.MarketBoardItemListingCount) { - if (packet.DataLength != 8) - { - return false; - } - - var status = BitConverter.ToUInt32(data, 0); - var count = BitConverter.ToUInt32(data, 4); - var itemId = marketQueryItemId; - - if (status == 0 && itemId != 0) // OK - { - var dto = new MarketBoardItemListingCountDTO() - { - Item = (int)itemId, - Count = (int)count, - World = State.Instance.WorldId - }; - if (itemId == 0) - { - pendingMarketBoardItemListingCountDTO = dto; - } - else - { - FireEvent(dto); - marketQueryItemId = 0; - } - } - return true; } - - // TODO: This packet is sent from client, so it only appear in injected games - // We should found the another workaround here for handling item id else if (opcode == MatchaOpcode.MarketBoardRequestItemListingInfo) { - if (packet.DataLength != 8) - { - return false; - } - - var itemId = BitConverter.ToUInt32(data, 0); - if (itemId != 0) - { - marketQueryItemId = itemId; - } - return true; } else if (opcode == MatchaOpcode.MarketBoardItemListing) @@ -598,18 +554,13 @@ private bool HandleMessageByOpcode(Packet packet) if (itemId != 0) { - if (pendingMarketBoardItemListingCountDTO != null) - { - FireEvent(new MarketBoardItemListingCountDTO - { - Item = (int)itemId, - Count = pendingMarketBoardItemListingCountDTO.Count, - World = State.Instance.WorldId - }); - pendingMarketBoardItemListingCountDTO = null; - } - ThreadPool.QueueUserWorkItem(o => Universalis.Client.QueryItem(State.Instance.WorldId, itemId, FireEvent)); + FireEvent(new MarketBoardItemListingCountDTO + { + Item = (int)itemId, + Count = items.Count, + World = State.Instance.WorldId + }); FireEvent(new MarketBoardItemListingDTO() { Item = (int)itemId,