From 4e22d7fcd1e675086d03d90cc7b80e029c3c29b6 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Fri, 10 Jun 2016 20:51:10 +0200 Subject: [PATCH] Disgusting fix for broken Mono --- ArchiSteamFarm/ArchiSteamFarm.csproj | 1 + ArchiSteamFarm/GlobalConfig.cs | 5 +++ ArchiSteamFarm/Mono.cs | 51 ++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 ArchiSteamFarm/Mono.cs diff --git a/ArchiSteamFarm/ArchiSteamFarm.csproj b/ArchiSteamFarm/ArchiSteamFarm.csproj index b9380d515..ded832197 100644 --- a/ArchiSteamFarm/ArchiSteamFarm.csproj +++ b/ArchiSteamFarm/ArchiSteamFarm.csproj @@ -109,6 +109,7 @@ + diff --git a/ArchiSteamFarm/GlobalConfig.cs b/ArchiSteamFarm/GlobalConfig.cs index 5a25a5650..170bbbbb9 100644 --- a/ArchiSteamFarm/GlobalConfig.cs +++ b/ArchiSteamFarm/GlobalConfig.cs @@ -159,6 +159,11 @@ namespace ArchiSteamFarm { globalConfig.FarmingDelay = DefaultFarmingDelay; } + if ((globalConfig.FarmingDelay > 5) && Mono.RequiresWorkaroundForBug41701()) { + Logging.LogGenericWarning("Your Mono runtime is affected by bug 41701, FarmingDelay of " + globalConfig.FarmingDelay + " is not possible - value of 5 will be used instead"); + globalConfig.FarmingDelay = 5; + } + if (globalConfig.HttpTimeout == 0) { Logging.LogGenericWarning("Configured HttpTimeout is invalid: " + globalConfig.HttpTimeout + ". Value of " + DefaultHttpTimeout + " will be used instead"); globalConfig.HttpTimeout = DefaultHttpTimeout; diff --git a/ArchiSteamFarm/Mono.cs b/ArchiSteamFarm/Mono.cs new file mode 100644 index 000000000..9e638c71a --- /dev/null +++ b/ArchiSteamFarm/Mono.cs @@ -0,0 +1,51 @@ +using System; +using System.Reflection; + +namespace ArchiSteamFarm { + internal static class Mono { + internal static bool RequiresWorkaroundForBug41701() { + // https://bugzilla.xamarin.com/show_bug.cgi?id=41701 + Version version = GetMonoVersion(); + if (version == null) { + return false; + } + + return version >= new Version(4, 4); + } + + private static Version GetMonoVersion() { + Type type = Type.GetType("Mono.Runtime"); + if (type == null) { + return null; // OK, not Mono + } + + MethodInfo displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static); + if (displayName == null) { + Logging.LogNullError(nameof(displayName)); + return null; + } + + string versionString = (string) displayName.Invoke(null, null); + if (string.IsNullOrEmpty(versionString)) { + Logging.LogNullError(nameof(versionString)); + return null; + } + + int index = versionString.IndexOf(' '); + if (index <= 0) { + Logging.LogNullError(nameof(index)); + return null; + } + + versionString = versionString.Substring(0, index); + + Version version; + if (Version.TryParse(versionString, out version)) { + return version; + } + + Logging.LogNullError(nameof(version)); + return null; + } + } +}