From b834ed7ef5095203529f8b77aee3f25f5387fbcc Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Fri, 6 May 2022 18:06:47 -0400 Subject: fix errors reading empty JSON files --- src/SMAPI/Framework/SMultiplayer.cs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'src/SMAPI/Framework') diff --git a/src/SMAPI/Framework/SMultiplayer.cs b/src/SMAPI/Framework/SMultiplayer.cs index e41e7edc..2badcbbf 100644 --- a/src/SMAPI/Framework/SMultiplayer.cs +++ b/src/SMAPI/Framework/SMultiplayer.cs @@ -9,6 +9,7 @@ using StardewModdingAPI.Events; using StardewModdingAPI.Framework.Events; using StardewModdingAPI.Framework.Networking; using StardewModdingAPI.Framework.Reflection; +using StardewModdingAPI.Internal; using StardewModdingAPI.Toolkit.Serialization; using StardewModdingAPI.Utilities; using StardewValley; @@ -489,8 +490,8 @@ namespace StardewModdingAPI.Framework private RemoteContextModel? ReadContext(BinaryReader reader) { string data = reader.ReadString(); - RemoteContextModel model = this.JsonHelper.Deserialize(data); - return model.ApiVersion != null + RemoteContextModel? model = this.JsonHelper.Deserialize(data); + return model?.ApiVersion != null ? model : null; // no data available for vanilla players } @@ -499,13 +500,31 @@ namespace StardewModdingAPI.Framework /// The raw message to parse. private void ReceiveModMessage(IncomingMessage message) { - // parse message + // read message JSON string json = message.Reader.ReadString(); - ModMessageModel model = this.JsonHelper.Deserialize(json); - HashSet playerIDs = new HashSet(model.ToPlayerIDs ?? this.GetKnownPlayerIDs()); if (this.LogNetworkTraffic) this.Monitor.Log($"Received message: {json}."); + // deserialize model + ModMessageModel? model; + try + { + model = this.JsonHelper.Deserialize(json); + if (model is null) + { + this.Monitor.Log($"Received invalid mod message from {message.FarmerID}.\nRaw message data: {json}"); + return; + } + } + catch (Exception ex) + { + this.Monitor.Log($"Received invalid mod message from {message.FarmerID}.\nRaw message data: {json}\nError details: {ex.GetLogSummary()}"); + return; + } + + // get player IDs + HashSet playerIDs = new HashSet(model.ToPlayerIDs ?? this.GetKnownPlayerIDs()); + // notify local mods if (playerIDs.Contains(Game1.player.UniqueMultiplayerID)) this.OnModMessageReceived(model); -- cgit