summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/SMAPI.Toolkit/Serialization/JsonHelper.cs5
-rw-r--r--src/SMAPI/Framework/SMultiplayer.cs29
2 files changed, 26 insertions, 8 deletions
diff --git a/src/SMAPI.Toolkit/Serialization/JsonHelper.cs b/src/SMAPI.Toolkit/Serialization/JsonHelper.cs
index 3c9308f2..1a003c51 100644
--- a/src/SMAPI.Toolkit/Serialization/JsonHelper.cs
+++ b/src/SMAPI.Toolkit/Serialization/JsonHelper.cs
@@ -108,12 +108,11 @@ namespace StardewModdingAPI.Toolkit.Serialization
/// <summary>Deserialize JSON text if possible.</summary>
/// <typeparam name="TModel">The model type.</typeparam>
/// <param name="json">The raw JSON text.</param>
- public TModel Deserialize<TModel>(string json)
+ public TModel? Deserialize<TModel>(string json)
{
try
{
- return JsonConvert.DeserializeObject<TModel>(json, this.JsonSettings)
- ?? throw new InvalidOperationException($"Couldn't deserialize model type '{typeof(TModel)}' from empty or null JSON.");
+ return JsonConvert.DeserializeObject<TModel>(json, this.JsonSettings);
}
catch (JsonReaderException)
{
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<RemoteContextModel>(data);
- return model.ApiVersion != null
+ RemoteContextModel? model = this.JsonHelper.Deserialize<RemoteContextModel>(data);
+ return model?.ApiVersion != null
? model
: null; // no data available for vanilla players
}
@@ -499,13 +500,31 @@ namespace StardewModdingAPI.Framework
/// <param name="message">The raw message to parse.</param>
private void ReceiveModMessage(IncomingMessage message)
{
- // parse message
+ // read message JSON
string json = message.Reader.ReadString();
- ModMessageModel model = this.JsonHelper.Deserialize<ModMessageModel>(json);
- HashSet<long> playerIDs = new HashSet<long>(model.ToPlayerIDs ?? this.GetKnownPlayerIDs());
if (this.LogNetworkTraffic)
this.Monitor.Log($"Received message: {json}.");
+ // deserialize model
+ ModMessageModel? model;
+ try
+ {
+ model = this.JsonHelper.Deserialize<ModMessageModel>(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<long> playerIDs = new HashSet<long>(model.ToPlayerIDs ?? this.GetKnownPlayerIDs());
+
// notify local mods
if (playerIDs.Contains(Game1.player.UniqueMultiplayerID))
this.OnModMessageReceived(model);