Decompiled source of LethalReport v1.2.0

BepInEx/plugins/LethalReport.dll

Decompiled a year ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using LethalReport.Patches;
using Steamworks;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("LethalReport")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("DESKTOP-")]
[assembly: AssemblyProduct("LethalReport")]
[assembly: AssemblyCopyright("Copyright © DESKTOP- 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("79560b02-a627-40a4-a633-ba1379598abc")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace LethalReport
{
	public class ApiClient
	{
		public delegate void OnReportReceived(string json, string steamId);

		public class ReportReason
		{
			public static string Toxic = "TOXIC";

			public static string Cheat = "CHEATING";

			public static string TeamKill = "TEAM_KILL";

			public static string Troll = "TROLL";

			public static string Undefined = "Undefined";
		}

		private const string protocol = "https";

		private const string url = "lethalreportapi.metasmash.fr";

		private static string GetUrl(string endpoint)
		{
			return "https://lethalreportapi.metasmash.fr" + endpoint;
		}

		public static IEnumerator HealthCheck()
		{
			UnityWebRequest webRequest = UnityWebRequest.Get(GetUrl("/healthCheck"));
			try
			{
				yield return webRequest.SendWebRequest();
				if ((int)webRequest.result != 1)
				{
					Debug.Log((object)("Error: " + webRequest.error));
				}
				else
				{
					Debug.Log((object)("Response: " + webRequest.downloadHandler.text));
				}
			}
			finally
			{
				((IDisposable)webRequest)?.Dispose();
			}
		}

		public static IEnumerator Report(string reportedSteamId, string reporterSteamId, string reportReason, Action onSuccess = null, Action<string> onFailure = null)
		{
			WWWForm val = new WWWForm();
			val.AddField("reportedSteamId", reportedSteamId);
			val.AddField("reporterSteamId", reporterSteamId);
			val.AddField("reportReason", reportReason);
			UnityWebRequest webRequest = UnityWebRequest.Post(GetUrl("/lethalreportapi/report"), val);
			try
			{
				yield return webRequest.SendWebRequest();
				if ((int)webRequest.result == 1)
				{
					Debug.Log((object)("Response: " + webRequest.downloadHandler.text));
					onSuccess?.Invoke();
				}
				else
				{
					Debug.Log((object)("Error: " + webRequest.error));
					onFailure?.Invoke(webRequest.error);
				}
			}
			finally
			{
				((IDisposable)webRequest)?.Dispose();
			}
		}

		public static IEnumerator GetReportBySteamId(string steamId, OnReportReceived onReportReceived)
		{
			UnityWebRequest webRequest = UnityWebRequest.Get(GetUrl("/lethalreportapi/report/" + steamId));
			try
			{
				yield return webRequest.SendWebRequest();
				if ((int)webRequest.result != 1)
				{
					Debug.Log((object)("Error: " + webRequest.error));
					onReportReceived?.Invoke(null, steamId);
				}
				else
				{
					string text = webRequest.downloadHandler.text;
					Debug.Log((object)("Response: " + text));
					onReportReceived?.Invoke(text, steamId);
				}
			}
			finally
			{
				((IDisposable)webRequest)?.Dispose();
			}
		}

		public static IEnumerator GetHasBeenReportedBy(string reportedSteamId, string reporterSteamId, OnReportReceived onReportReceived)
		{
			UnityWebRequest webRequest = UnityWebRequest.Get(GetUrl("/lethalreportapi/report/" + reportedSteamId + "/by/" + reporterSteamId));
			try
			{
				yield return webRequest.SendWebRequest();
				if ((int)webRequest.result != 1)
				{
					Debug.Log((object)("Error: " + webRequest.error));
					onReportReceived?.Invoke(null, reportedSteamId);
				}
				else
				{
					string text = webRequest.downloadHandler.text;
					Debug.Log((object)("Response: " + text));
					onReportReceived?.Invoke(text, reportedSteamId);
				}
			}
			finally
			{
				((IDisposable)webRequest)?.Dispose();
			}
		}

		public static IEnumerator CheckVersion(Action<string> onVersionReceived)
		{
			string text = GetUrl("/lethalreportapi/version");
			Debug.Log((object)("Checking version at: " + text));
			UnityWebRequest webRequest = UnityWebRequest.Get(text);
			try
			{
				yield return webRequest.SendWebRequest();
				if ((int)webRequest.result != 1)
				{
					Debug.LogError((object)("Version check failed: " + webRequest.error));
					yield break;
				}
				string text2 = webRequest.downloadHandler.text;
				Debug.Log((object)("Version check success: " + text2));
				onVersionReceived?.Invoke(text2);
			}
			finally
			{
				((IDisposable)webRequest)?.Dispose();
			}
		}
	}
	internal class JsonParser
	{
		public static ReportData ParseReportData(string json)
		{
			ReportData reportData = new ReportData();
			string[] array = json.Trim('{', '}').Split(new char[2] { ',', ':' }, StringSplitOptions.RemoveEmptyEntries);
			for (int i = 0; i < array.Length; i += 2)
			{
				string text = array[i].Trim('"', ' ');
				string text2 = array[i + 1].Trim('"', ' ');
				switch (text)
				{
				case "totalReports":
					reportData.TotalReports = int.Parse(text2);
					break;
				case "toxicReports":
					reportData.ToxicReports = int.Parse(text2);
					break;
				case "cheatingReports":
					reportData.CheatReports = int.Parse(text2);
					break;
				case "teamKillReports":
					reportData.TkReports = int.Parse(text2);
					break;
				case "trollReports":
					reportData.TrollReports = int.Parse(text2);
					break;
				case "undefinedReports":
					reportData.UndefinedReports = int.Parse(text2);
					break;
				case "reported":
					reportData.HasBeenReported = bool.Parse(text2);
					break;
				case "isWhiteListed":
					reportData.IsWhiteListed = bool.Parse(text2);
					break;
				}
			}
			return reportData;
		}
	}
	public static class KickBanTools
	{
		public class PlayerInfo
		{
			public string Username;

			public string SteamID;

			public bool UsingWalkie;

			public bool Connected;

			public override string ToString()
			{
				return Username + " (" + SteamID + "@steam)";
			}
		}

		public static List<PlayerInfo> GetPlayers()
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			string currentSteamId = GetLocalSteamID();
			List<PlayerInfo> list = (from playerInfo in allPlayerScripts.Select((PlayerControllerB player, int i) => new PlayerInfo
				{
					Username = player.playerUsername,
					SteamID = $"{player.playerSteamId}",
					UsingWalkie = player.speakingToWalkieTalkie,
					Connected = StartOfRound.Instance.fullyLoadedPlayers.Contains((ulong)i)
				})
				where playerInfo.SteamID != "0"
				select playerInfo).ToList();
			int num = list.FindIndex((PlayerInfo p) => p.SteamID == currentSteamId);
			if (num > -1)
			{
				PlayerInfo item = list[num];
				list.RemoveAt(num);
				list.Insert(0, item);
			}
			return list;
		}

		public static void KickPlayer(PlayerInfo playerInfo)
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			for (int i = 0; i < allPlayerScripts.Length; i++)
			{
				Debug.Log((object)$"Kicking player... ${i} ${allPlayerScripts[i].playerUsername}, ${allPlayerScripts[i].playerSteamId}");
				PlayerControllerB val = allPlayerScripts[i];
				if (!(val.playerUsername != playerInfo.Username) && !(val.playerSteamId.ToString() != playerInfo.SteamID))
				{
					StartOfRound.Instance.KickPlayer(i);
				}
			}
		}

		public static bool ShouldKickPlayer(ReportData reportData, Dictionary<string, (int threshold, bool enabled)> reportThresholds)
		{
			if (reportThresholds.TryGetValue("Minimum Amount of Report", out (int, bool) value) && value.Item2 && reportData.TotalReports >= value.Item1)
			{
				return true;
			}
			if (reportThresholds.TryGetValue("Minimum Amount of Cheating Report", out (int, bool) value2) && value2.Item2 && reportData.CheatReports >= value2.Item1)
			{
				return true;
			}
			if (reportThresholds.TryGetValue("Minimum Amount of Toxic Report", out (int, bool) value3) && value3.Item2 && reportData.ToxicReports >= value3.Item1)
			{
				return true;
			}
			if (reportThresholds.TryGetValue("Minimum Amount of Team Kill Report", out (int, bool) value4) && value4.Item2 && reportData.ToxicReports >= value4.Item1)
			{
				return true;
			}
			if (reportThresholds.TryGetValue("Minimum Amount of Troll Report", out (int, bool) value5) && value5.Item2 && reportData.ToxicReports >= value5.Item1)
			{
				return true;
			}
			return false;
		}

		public static string GetLocalSteamID()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			SteamId val;
			if (SteamClient.IsValid)
			{
				val = SteamClient.SteamId;
				return ((object)(SteamId)(ref val)).ToString();
			}
			Debug.LogError((object)"SteamClient is not valid.");
			val = default(SteamId);
			return ((object)(SteamId)(ref val)).ToString();
		}
	}
	[BepInPlugin("metasmash.LethalReport", "LethalReport", "1.2.0")]
	public class LethalReportBase : BaseUnityPlugin
	{
		private const string modGuid = "metasmash.LethalReport";

		private const string modName = "LethalReport";

		private const string modVersion = "1.2.0";

		private ConfigEntry<int> _minReportThreshold;

		private ConfigEntry<int> _minCheatingReportThreshold;

		private ConfigEntry<int> _minToxicReportThreshold;

		private ConfigEntry<int> _minTkReportThreshold;

		private ConfigEntry<int> _minTrollReportThreshold;

		private ConfigEntry<bool> _autoKickOnReport;

		private ConfigEntry<bool> _autoKickAlreadyReported;

		private ConfigEntry<bool> _enableReportThreshold;

		private ConfigEntry<bool> _enableCheatingReportThreshold;

		private ConfigEntry<bool> _enableToxicReportThreshold;

		private ConfigEntry<bool> _enableTkReportThreshold;

		private ConfigEntry<bool> _enableTrollReportThreshold;

		private readonly Harmony harmony = new Harmony("metasmash.LethalReport");

		public static LethalReportBase Instance { get; private set; }

		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null)
			{
				Object.Destroy((Object)(object)this);
				Debug.Log((object)"This is good");
				return;
			}
			_minReportThreshold = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Minimum Amount of Report", 1, "Threshold for minimum amount of reports.");
			_minCheatingReportThreshold = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Minimum Amount of Cheating Report", 1, "Threshold for minimum amount of cheating reports.");
			_minToxicReportThreshold = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Minimum Amount of Toxic Report", 1, "Threshold for minimum amount of toxic reports.");
			_minTkReportThreshold = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Minimum Amount of Team Kill Report", 1, "Threshold for minimum amount of team kill reports.");
			_minTrollReportThreshold = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Minimum Amount of Troll Report", 1, "Threshold for minimum amount of troll reports.");
			_autoKickOnReport = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Auto Kick On Report", true, "Toggle auto-kick when you report a player.");
			_autoKickAlreadyReported = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Auto Kick already Reported", true, "Toggle auto-kick when a player you already have reported join your lobby.");
			_enableReportThreshold = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Enable Minimum Amount of Report", true, "Toggle auto-kick total report threshold reached.");
			_enableCheatingReportThreshold = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Enable Minimum Amount of Cheating Report", true, "Toggle auto-kick cheat threshold reached.");
			_enableToxicReportThreshold = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Enable Minimum Amount of Toxic Report", true, "Toggle auto-kick toxic threshold reached.");
			_enableTkReportThreshold = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Enable Minimum Amount of Team Kill Report", true, "Toggle auto-kick team kill threshold reached.");
			_enableTrollReportThreshold = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Enable Minimum Amount of Troll Report", true, "Toggle auto-kick troll threshold reached.");
			Instance = this;
			Object.DontDestroyOnLoad((Object)(object)this);
			harmony.PatchAll(typeof(MenuPatch));
			((BaseUnityPlugin)this).Logger.LogInfo((object)"LethalReport mod has been awakened");
			CreateUIObject();
		}

		public void UpdateSetting(string settingName, int threshold, bool enabled)
		{
			switch (settingName)
			{
			case "Minimum Amount of Report":
				_minReportThreshold.Value = threshold;
				_enableReportThreshold.Value = enabled;
				break;
			case "Minimum Amount of Cheating Report":
				_minCheatingReportThreshold.Value = threshold;
				_enableCheatingReportThreshold.Value = enabled;
				break;
			case "Minimum Amount of Toxic Report":
				_minToxicReportThreshold.Value = threshold;
				_enableToxicReportThreshold.Value = enabled;
				break;
			case "Minimum Amount of Team Kill Report":
				_minTkReportThreshold.Value = threshold;
				_enableTkReportThreshold.Value = enabled;
				break;
			case "Minimum Amount of Troll Report":
				_minTrollReportThreshold.Value = threshold;
				_enableTrollReportThreshold.Value = enabled;
				break;
			}
			((BaseUnityPlugin)this).Config.Save();
		}

		public void UpdateAutoKickSetting(string settingName, bool value)
		{
			if (!(settingName == "Auto Kick On Report"))
			{
				if (settingName == "Auto Kick already Reported")
				{
					_autoKickAlreadyReported.Value = value;
				}
			}
			else
			{
				_autoKickOnReport.Value = value;
			}
			((BaseUnityPlugin)this).Config.Save();
		}

		public Dictionary<string, (int threshold, bool enabled)> GetSettings()
		{
			return new Dictionary<string, (int, bool)>
			{
				{
					"Minimum Amount of Report",
					(_minReportThreshold.Value, true)
				},
				{
					"Minimum Amount of Cheating Report",
					(_minCheatingReportThreshold.Value, true)
				},
				{
					"Minimum Amount of Toxic Report",
					(_minToxicReportThreshold.Value, true)
				},
				{
					"Minimum Amount of Team Kill Report",
					(_minTkReportThreshold.Value, true)
				},
				{
					"Minimum Amount of Troll Report",
					(_minTrollReportThreshold.Value, true)
				}
			};
		}

		public bool GetAutoKickSetting()
		{
			return _autoKickOnReport.Value;
		}

		public bool GetEnableReportThreshold()
		{
			return _enableReportThreshold.Value;
		}

		public bool GetEnableCheatingReportThreshold()
		{
			return _enableCheatingReportThreshold.Value;
		}

		public bool GetEnableToxicReportThreshold()
		{
			return _enableToxicReportThreshold.Value;
		}

		public bool GetEnableTkReportThreshold()
		{
			return _enableTkReportThreshold.Value;
		}

		public bool GetEnableTrollReportThreshold()
		{
			return _enableTrollReportThreshold.Value;
		}

		public bool GetEnableAutoKickReportedPlayers()
		{
			return _autoKickAlreadyReported.Value;
		}

		public string GetModVersion()
		{
			return "1.2.0";
		}

		private void CreateUIObject()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			GameObject val = new GameObject("LethalReportUIGameObject");
			val.AddComponent<UI>();
			Object.DontDestroyOnLoad((Object)val);
		}
	}
	public class ReportData
	{
		public int TotalReports { get; set; }

		public int ToxicReports { get; set; }

		public int CheatReports { get; set; }

		public int TkReports { get; set; }

		public int TrollReports { get; set; }

		public int UndefinedReports { get; set; }

		public bool HasBeenReported { get; set; }

		public bool IsWhiteListed { get; set; }

		public void IncrementCheatReport()
		{
			CheatReports++;
		}

		public void IncrementToxicReport()
		{
			ToxicReports++;
		}

		public void IncrementTkReport()
		{
			TkReports++;
		}

		public void IncrementTrollReport()
		{
			TrollReports++;
		}
	}
	public class UI : MonoBehaviour
	{
		public class PlayerInfoComparer : IEqualityComparer<KickBanTools.PlayerInfo>
		{
			public bool Equals(KickBanTools.PlayerInfo x, KickBanTools.PlayerInfo y)
			{
				return x.SteamID == y.SteamID;
			}

			public int GetHashCode(KickBanTools.PlayerInfo obj)
			{
				return obj.SteamID.GetHashCode();
			}
		}

		private enum ViewMode
		{
			Users,
			Admin,
			Settings
		}

		private static readonly List<UI> Instances = new List<UI>();

		private bool _menuOpen;

		private Rect _windowRect = new Rect(100f, 100f, 800f, 400f);

		private bool _initialized;

		private bool isVersionOutdated;

		private Vector2 _scrollPosition;

		private float _checkInterval = 0.5f;

		private float _nextCheckTime;

		private Dictionary<string, ReportData> _playerReports = new Dictionary<string, ReportData>();

		private Dictionary<string, bool> _playerButtonStates = new Dictionary<string, bool>();

		private List<KickBanTools.PlayerInfo> _lastKnownPlayers = new List<KickBanTools.PlayerInfo>();

		private ViewMode _currentViewMode;

		private Dictionary<string, (int threshold, bool enabled)> _reportThresholds = new Dictionary<string, (int, bool)>
		{
			{
				"Minimum Amount of Report",
				(1, false)
			},
			{
				"Minimum Amount of Cheating Report",
				(1, false)
			},
			{
				"Minimum Amount of Toxic Report",
				(1, false)
			},
			{
				"Minimum Amount of Team Kill Report",
				(1, false)
			},
			{
				"Minimum Amount of Troll Report",
				(1, false)
			}
		};

		private bool _autoKickOnReport = true;

		private bool _autoKickAlreadyReported = true;

		private GUIStyle buttonStyle;

		private GUIStyle labelStyle;

		private GUIStyle toggleStyle;

		private GUIStyle disabledButtonStyle;

		private void OnVersionCheckCompleted(string serverVersion)
		{
			if (string.IsNullOrEmpty(serverVersion))
			{
				Debug.LogError((object)"Failed to retrieve version from server or the version is empty.");
				return;
			}
			serverVersion = serverVersion.Replace("\"", "");
			isVersionOutdated = serverVersion != LethalReportBase.Instance.GetModVersion();
			Debug.Log((object)"Checking version...");
			Debug.Log((object)(isVersionOutdated ? "Version is outdated" : "Version is up-to-date"));
		}

		private void Update()
		{
			if (Time.time >= _nextCheckTime)
			{
				CheckForNewPlayers();
				_nextCheckTime = Time.time + _checkInterval;
			}
		}

		private void InitializeStyles()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			buttonStyle = new GUIStyle(GUI.skin.button);
			labelStyle = new GUIStyle(GUI.skin.label);
			toggleStyle = new GUIStyle(GUI.skin.toggle);
			disabledButtonStyle = new GUIStyle(GUI.skin.button);
			disabledButtonStyle.normal.textColor = Color.gray;
			buttonStyle.normal.textColor = Color.white;
			labelStyle.fontSize = 12;
			toggleStyle.margin = new RectOffset(5, 5, 5, 5);
		}

		private void Awake()
		{
			Instances.Add(this);
			LoadSettings();
			((MonoBehaviour)this).StartCoroutine(ApiClient.CheckVersion(OnVersionCheckCompleted));
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
		}

		private void LoadSettings()
		{
			Dictionary<string, (int, bool)> settings = LethalReportBase.Instance.GetSettings();
			_reportThresholds = new Dictionary<string, (int, bool)>
			{
				{
					"Minimum Amount of Report",
					(settings["Minimum Amount of Report"].Item1, LethalReportBase.Instance.GetEnableReportThreshold())
				},
				{
					"Minimum Amount of Cheating Report",
					(settings["Minimum Amount of Cheating Report"].Item1, LethalReportBase.Instance.GetEnableCheatingReportThreshold())
				},
				{
					"Minimum Amount of Toxic Report",
					(settings["Minimum Amount of Toxic Report"].Item1, LethalReportBase.Instance.GetEnableToxicReportThreshold())
				},
				{
					"Minimum Amount of Team Kill Report",
					(settings["Minimum Amount of Team Kill Report"].Item1, LethalReportBase.Instance.GetEnableTkReportThreshold())
				},
				{
					"Minimum Amount of Troll Report",
					(settings["Minimum Amount of Troll Report"].Item1, LethalReportBase.Instance.GetEnableTrollReportThreshold())
				}
			};
			_autoKickOnReport = LethalReportBase.Instance.GetAutoKickSetting();
			_autoKickAlreadyReported = LethalReportBase.Instance.GetEnableAutoKickReportedPlayers();
		}

		private void SaveSetting(string settingName, int threshold, bool enabled)
		{
			LethalReportBase.Instance.UpdateSetting(settingName, threshold, enabled);
		}

		private void OnDestroy()
		{
			Instances.Remove(this);
		}

		public static void SetMenuForAll(bool value)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			if (Instances.Count == 0 && value)
			{
				new GameObject("Lethal Report Ui").AddComponent<UI>();
			}
			foreach (UI instance in Instances)
			{
				instance.SetMenu(value);
			}
		}

		private void SetMenu(bool value)
		{
			Debug.Log((object)$"Setting menu: {value}");
			_menuOpen = value;
		}

		private void OnGUI()
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)StartOfRound.Instance).IsSpawned)
			{
				if (_initialized)
				{
					ResetStates();
				}
			}
			else if (_menuOpen)
			{
				if (!_initialized)
				{
					_initialized = true;
				}
				_windowRect = GUILayout.Window(0, _windowRect, new WindowFunction(DrawUI), "Lethal Reporter Menu", Array.Empty<GUILayoutOption>());
				if (isVersionOutdated)
				{
					Rect val = new Rect(((Rect)(ref _windowRect)).x, ((Rect)(ref _windowRect)).y - 20f, ((Rect)(ref _windowRect)).width, 20f);
					GUI.color = Color.yellow;
					GUI.Label(val, "A NEW VERSION IS AVAILABLE", new GUIStyle(GUI.skin.label)
					{
						alignment = (TextAnchor)4
					});
					GUI.color = Color.white;
				}
			}
		}

		private void DrawUI(int windowID)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Expected O, but got Unknown
			//IL_004b: Expected O, but got Unknown
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			if (buttonStyle == null)
			{
				InitializeStyles();
			}
			GUIStyle val = new GUIStyle(GUI.skin.button)
			{
				fontSize = 10,
				alignment = (TextAnchor)4,
				padding = new RectOffset(0, 0, 0, 0),
				margin = new RectOffset(0, 0, 0, 0)
			};
			float num = 18f;
			if (GUI.Button(new Rect(((Rect)(ref _windowRect)).width - num - 4f, 0f, num, num), "X", val))
			{
				SetMenu(value: false);
			}
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("Users", Array.Empty<GUILayoutOption>()))
			{
				_currentViewMode = ViewMode.Users;
			}
			if (GUILayout.Button("Admin tools", Array.Empty<GUILayoutOption>()))
			{
				_currentViewMode = ViewMode.Admin;
			}
			if (GUILayout.Button("Settings", Array.Empty<GUILayoutOption>()))
			{
				_currentViewMode = ViewMode.Settings;
			}
			GUILayout.EndHorizontal();
			switch (_currentViewMode)
			{
			case ViewMode.Users:
				DrawUsersTab();
				break;
			case ViewMode.Admin:
				DrawAdminTab();
				break;
			case ViewMode.Settings:
				DrawSettingsTab();
				break;
			default:
				DrawUsersTab();
				break;
			}
			GUILayout.BeginArea(new Rect(((Rect)(ref _windowRect)).width - 200f, ((Rect)(ref _windowRect)).height - 50f, 180f, 40f));
			if (GUILayout.Button("[FR] Join us on Discord!", Array.Empty<GUILayoutOption>()))
			{
				OpenURL("https://discord.gg/lethalcompanyfr");
			}
			GUILayout.EndArea();
			GUI.DragWindow(new Rect(0f, 0f, 10000f, 20f));
		}

		private void DrawUsersTab()
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			List<KickBanTools.PlayerInfo> players = KickBanTools.GetPlayers();
			KickBanTools.PlayerInfo playerInfo = ((players.Count > 0) ? players[0] : null);
			float num = 300f;
			GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(num) });
			_scrollPosition = GUILayout.BeginScrollView(_scrollPosition, Array.Empty<GUILayoutOption>());
			foreach (KickBanTools.PlayerInfo item in players)
			{
				ReportData value;
				bool flag = _playerReports.TryGetValue(item.SteamID, out value) && value.HasBeenReported;
				ReportData value2;
				bool flag2 = _playerReports.TryGetValue(item.SteamID, out value2) && value2.IsWhiteListed;
				labelStyle.normal.textColor = (flag2 ? Color.green : (flag ? Color.red : Color.white));
				bool isEnabled = !flag || (_playerButtonStates.ContainsKey(item.SteamID) && _playerButtonStates[item.SteamID]);
				GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) });
				GUILayout.Label($"{item}", labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(200f) });
				if (value != null && item != playerInfo && !flag2)
				{
					DrawCustomReportButton("CHEAT", value.CheatReports, item, playerInfo, ApiClient.ReportReason.Cheat, isEnabled, buttonStyle);
					DrawCustomReportButton("TOXIC", value.ToxicReports, item, playerInfo, ApiClient.ReportReason.Toxic, isEnabled, buttonStyle);
					DrawCustomReportButton("TEAM KILL", value.TkReports, item, playerInfo, ApiClient.ReportReason.TeamKill, isEnabled, buttonStyle);
					DrawCustomReportButton("TROLL", value.TrollReports, item, playerInfo, ApiClient.ReportReason.Troll, isEnabled, buttonStyle);
				}
				GUILayout.EndHorizontal();
			}
			GUILayout.EndScrollView();
			GUILayout.EndVertical();
		}

		private void DrawAdminTab()
		{
			if (GUILayout.Button("Ship Light", (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(100f),
				GUILayout.Height(100f)
			}))
			{
				StartOfRound.Instance.shipRoomLights.ToggleShipLights();
			}
		}

		private void DrawSettingsTab()
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			GUIStyle val = new GUIStyle(GUI.skin.label)
			{
				fontStyle = (FontStyle)1,
				fontSize = 14,
				alignment = (TextAnchor)1
			};
			GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) });
			GUILayout.Label("Adjust the report thresholds and auto-kick settings:", val, Array.Empty<GUILayoutOption>());
			foreach (string item in _reportThresholds.Keys.ToList())
			{
				GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) });
				(int, bool) tuple = _reportThresholds[item];
				bool flag = GUILayout.Toggle(tuple.Item2, "", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) });
				GUILayout.Label(item, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(200f) });
				int num = (int)GUILayout.HorizontalSlider((float)tuple.Item1, 1f, 100f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) });
				GUILayout.Label(num.ToString(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) });
				if (flag != tuple.Item2 || num != tuple.Item1)
				{
					_reportThresholds[item] = (num, flag);
					SaveSetting(item, num, flag);
				}
				GUILayout.EndHorizontal();
			}
			bool flag2 = GUILayout.Toggle(_autoKickOnReport, "Auto kick if reported", Array.Empty<GUILayoutOption>());
			if (flag2 != _autoKickOnReport)
			{
				_autoKickOnReport = flag2;
				LethalReportBase.Instance.UpdateAutoKickSetting("Auto Kick On Report", _autoKickOnReport);
			}
			bool flag3 = GUILayout.Toggle(_autoKickAlreadyReported, "Auto kick if a player you already reported is joining the room", Array.Empty<GUILayoutOption>());
			if (flag3 != _autoKickAlreadyReported)
			{
				_autoKickAlreadyReported = flag3;
				LethalReportBase.Instance.UpdateAutoKickSetting("Auto Kick already Reported", _autoKickAlreadyReported);
			}
			GUILayout.EndVertical();
		}

		private void DrawCustomReportButton(string label, int reportCount, KickBanTools.PlayerInfo player, KickBanTools.PlayerInfo currentPlayer, string reportType, bool isEnabled, GUIStyle buttonStyle)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) });
			GUILayout.Label(label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) });
			GUIStyle val = new GUIStyle(GUI.skin.label);
			val.fontStyle = (FontStyle)1;
			val.normal.textColor = Color.white;
			GUILayout.Label(reportCount.ToString(), val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) });
			bool flag = isEnabled && (!_playerButtonStates.ContainsKey(player.SteamID) || _playerButtonStates[player.SteamID]);
			if (GUILayout.Button("", buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(20f),
				GUILayout.Height(20f)
			}) && flag)
			{
				((MonoBehaviour)this).StartCoroutine(ApiClient.Report(player.SteamID, currentPlayer.SteamID, reportType, delegate
				{
					if (reportType == ApiClient.ReportReason.Cheat)
					{
						_playerReports[player.SteamID].IncrementCheatReport();
					}
					else if (reportType == ApiClient.ReportReason.Toxic)
					{
						_playerReports[player.SteamID].IncrementToxicReport();
					}
					else if (reportType == ApiClient.ReportReason.TeamKill)
					{
						_playerReports[player.SteamID].IncrementTkReport();
					}
					else if (reportType == ApiClient.ReportReason.Troll)
					{
						_playerReports[player.SteamID].IncrementTrollReport();
					}
					_playerButtonStates[player.SteamID] = false;
					_playerReports[player.SteamID].HasBeenReported = true;
					if (_autoKickOnReport)
					{
						KickBanTools.KickPlayer(player);
					}
				}));
			}
			GUILayout.EndHorizontal();
		}

		private void CheckForNewPlayers()
		{
			List<KickBanTools.PlayerInfo> players = KickBanTools.GetPlayers();
			List<KickBanTools.PlayerInfo> list = players.Except(_lastKnownPlayers, new PlayerInfoComparer()).ToList();
			if (list.Count <= 0)
			{
				return;
			}
			Debug.Log((object)("New players detected: " + list.Count));
			foreach (KickBanTools.PlayerInfo item in list)
			{
				((MonoBehaviour)this).StartCoroutine(ApiClient.GetReportBySteamId(item.SteamID, ProcessPlayerReport));
			}
			_lastKnownPlayers = players;
		}

		private void ProcessPlayerReport(string jsonReport, string steamId)
		{
			if (!string.IsNullOrEmpty(jsonReport))
			{
				ReportData reportData = JsonParser.ParseReportData(jsonReport);
				KickBanTools.PlayerInfo playerInfo = KickBanTools.GetPlayers().FirstOrDefault((KickBanTools.PlayerInfo p) => p.SteamID == steamId);
				_playerReports[steamId] = reportData;
				Debug.Log((object)("Report data updated for player: " + steamId));
				if (KickBanTools.ShouldKickPlayer(reportData, _reportThresholds) && playerInfo != null)
				{
					KickBanTools.KickPlayer(playerInfo);
				}
				((MonoBehaviour)this).StartCoroutine(ApiClient.GetHasBeenReportedBy(playerInfo.SteamID, KickBanTools.GetLocalSteamID(), ProcessPlayerReportBy));
			}
			else
			{
				Debug.Log((object)("No report received or an error occurred for player: " + steamId));
			}
		}

		private void ProcessPlayerReportBy(string jsonReport, string steamId)
		{
			if (!string.IsNullOrEmpty(jsonReport))
			{
				bool hasBeenReported = JsonParser.ParseReportData(jsonReport).HasBeenReported;
				_playerReports[steamId].HasBeenReported = hasBeenReported;
				Debug.Log((object)("Report data updated for player: " + steamId));
				if (_autoKickAlreadyReported && hasBeenReported)
				{
					KickBanTools.KickPlayer(KickBanTools.GetPlayers().FirstOrDefault((KickBanTools.PlayerInfo p) => p.SteamID == steamId));
				}
			}
			else
			{
				Debug.Log((object)("No report received by or an error occurred for player: " + steamId));
			}
		}

		private void ResetStates()
		{
			_playerReports.Clear();
			_playerButtonStates.Clear();
			_lastKnownPlayers.Clear();
			_menuOpen = false;
			_initialized = false;
			Debug.Log((object)"States have been reset");
		}

		private void OpenURL(string url)
		{
			Application.OpenURL(url);
		}
	}
}
namespace LethalReport.Patches
{
	[HarmonyPatch(typeof(QuickMenuManager))]
	public class MenuPatch
	{
		[HarmonyPatch("OpenQuickMenu")]
		[HarmonyPostfix]
		public static void OnOpenMenu()
		{
			UI.SetMenuForAll(value: true);
		}

		[HarmonyPatch("CloseQuickMenu")]
		[HarmonyPostfix]
		public static void OnCloseMenu()
		{
			UI.SetMenuForAll(value: false);
		}
	}
}