From 4d7cf07e9a5e9c15c55c9ae66e47fffa9a7d4c7f Mon Sep 17 00:00:00 2001 From: Popax21 Date: Fri, 6 Oct 2023 17:27:15 +0200 Subject: [PATCH] Only log MonoMod crimes once --- .../Mod/Helpers/LegacyMonoMod/Misc.cs | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/Celeste.Mod.mm/Mod/Helpers/LegacyMonoMod/Misc.cs b/Celeste.Mod.mm/Mod/Helpers/LegacyMonoMod/Misc.cs index 6306f183c..0e2fb212b 100644 --- a/Celeste.Mod.mm/Mod/Helpers/LegacyMonoMod/Misc.cs +++ b/Celeste.Mod.mm/Mod/Helpers/LegacyMonoMod/Misc.cs @@ -4,6 +4,7 @@ using MonoMod.Cil; using MonoMod.Utils; using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; @@ -74,6 +75,8 @@ public sealed class MonoModCrimeException : Exception { public MonoModCrimeException(string descr) : base($"MONOMOD CRIME DETECTED - THIS IS A BUG: {descr}") {} } + private static HashSet<(string descr, Assembly perpetrator, string backtrace)> loggedCrimes = new(); + public static void ReportMonoModCrime(string descr, MethodBase perpetrator) { Module perpetratorMod = null; try { @@ -92,18 +95,20 @@ public static void ReportMonoModCrime(string descr, Assembly perpetrator) { // This means that a mod did something objectively wrong (=a bug in the mod) // But because it "used to worked":tm:, we can't give them the crash they deserve - // So we at least yell at them loudly in the log file ._. - Logger.Log(LogLevel.Error, "legacy-monomod", "##################################################################################"); - Logger.Log(LogLevel.Error, "legacy-monomod", " MONOMOD CRIME DETECTED "); - Logger.Log(LogLevel.Error, "legacy-monomod", "##################################################################################"); - Logger.Log(LogLevel.Error, "legacy-monomod", " !!! This means one of your mods has a bug !!! "); - Logger.Log(LogLevel.Error, "legacy-monomod", " However, for the sake of backwards compatibility, a crash has been prevented "); - Logger.Log(LogLevel.Error, "legacy-monomod", " Please report this to the mod author so that they can fix their mod! "); - Logger.Log(LogLevel.Error, "legacy-monomod", ""); - if (perpetratorMeta != null) - Logger.Log(LogLevel.Error, "legacy-monomod", $"Suspected perpetrator: {perpetratorMeta.Name} version {perpetratorMeta.VersionString} [{perpetratorMeta.Version}]"); - Logger.Log(LogLevel.Error, "legacy-monomod", $"Details of infraction: {descr}"); - Logger.LogDetailed(LogLevel.Error, "legacy-monomod", $"Stacktrace:"); + // So we at least yell at them loudly in the log file (once) ._. + if (!string.IsNullOrWhiteSpace(perpetratorMeta?.PathDirectory) || loggedCrimes.Add((descr, perpetrator, Environment.StackTrace))) { + Logger.Log(LogLevel.Error, "legacy-monomod", "##################################################################################"); + Logger.Log(LogLevel.Error, "legacy-monomod", " MONOMOD CRIME DETECTED "); + Logger.Log(LogLevel.Error, "legacy-monomod", "##################################################################################"); + Logger.Log(LogLevel.Error, "legacy-monomod", " !!! This means one of your mods has a bug !!! "); + Logger.Log(LogLevel.Error, "legacy-monomod", " However, for the sake of backwards compatibility, a crash has been prevented "); + Logger.Log(LogLevel.Error, "legacy-monomod", " Please report this to the mod author so that they can fix their mod! "); + Logger.Log(LogLevel.Error, "legacy-monomod", ""); + if (perpetratorMeta != null) + Logger.Log(LogLevel.Error, "legacy-monomod", $"Suspected perpetrator: {perpetratorMeta.Name} version {perpetratorMeta.VersionString} [{perpetratorMeta.Version}]"); + Logger.Log(LogLevel.Error, "legacy-monomod", $"Details of infraction: {descr}"); + Logger.LogDetailed(LogLevel.Error, "legacy-monomod", $"Stacktrace:"); + } // If we know that the offender is a directory mod (which implies that this is a mod dev), still crash >:) if (!string.IsNullOrEmpty(perpetratorMeta?.PathDirectory))