Decompiled source of SharePermissions v1.0.2

SharePermissions.dll

Decompiled 21 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("RED")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SharePermissions")]
[assembly: AssemblyTitle("SharePermissions")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SharePermissions
{
	internal class Events : IOnEventCallback
	{
		internal bool registered = false;

		internal string clientRandomString = string.Empty;

		private static Random random = new Random();

		internal const byte EventCode = 184;

		internal static Events instance { get; private set; } = null;


		public Events()
		{
			instance = this;
			if (!registered)
			{
				PhotonNetwork.AddCallbackTarget((object)this);
				registered = true;
			}
		}

		public static void Init()
		{
			if (instance == null)
			{
				new Events();
			}
		}

		internal static void SendCommand(string command, string secret, string fromSteamId, object[] args, ReceiverGroup receiverGroup)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			SharePermissions.Logger.LogInfo((object)("Send command: " + command + "; to: " + ((object)(ReceiverGroup)(ref receiverGroup)).ToString()));
			object[] array = new object[3 + args.Length];
			array[0] = command;
			array[1] = secret;
			array[2] = fromSteamId;
			args.CopyTo(array, 3);
			PhotonNetwork.RaiseEvent((byte)184, (object)array, new RaiseEventOptions
			{
				Receivers = receiverGroup
			}, SendOptions.SendReliable);
		}

		public void OnEvent(EventData photonEvent)
		{
			if (photonEvent.Code != 184)
			{
				return;
			}
			object[] array = (object[])photonEvent.CustomData;
			if (array.Length < 3)
			{
				return;
			}
			string text = array[0].ToString();
			string text2 = array[1].ToString();
			string text3 = array[2].ToString();
			int sender = photonEvent.Sender;
			Room currentRoom = PhotonNetwork.CurrentRoom;
			Player val = ((currentRoom != null) ? currentRoom.GetPlayer(sender, false) : null);
			string nickName = val.NickName;
			if (!SemiFunc.IsMasterClient() && text == "InitModerator")
			{
				Moderators.Instance.AddModerator(text3);
				return;
			}
			if (SharePermissions.SecretCode == null || !SharePermissions.SecretCode.Value.Equals(text2))
			{
				SharePermissions.LogWrite("Secret code is not equal, from: " + nickName + "; Secret from requester: " + text2 + " (your secret: " + SharePermissions.SecretCode.Value + ")");
				SharePermissions.Logger.LogWarning((object)("Secret code is not equal, from: " + nickName + "; Secret from requester: " + text2 + " (your secret: " + SharePermissions.SecretCode.Value + ")"));
				return;
			}
			switch (text)
			{
			case "KickPlayer":
			{
				string text4 = array[3].ToString();
				string text5 = array[4].ToString();
				PlayerAvatar val2 = SemiFunc.PlayerGetFromSteamID(text4);
				PhotonView val3 = ((val2 != null) ? ((Component)val2).GetComponent<PhotonView>() : null);
				if (!((Object)(object)val3 != (Object)null) || val3.Owner == null || !val3.Owner.IsMasterClient)
				{
					SharePermissions.LogWrite("Banning request " + SemiFunc.PlayerGetName(val2) + " (" + text4 + ") from player:" + nickName + "(" + text3 + ")");
					SharePermissions.Logger.LogInfo((object)("Banning request " + SemiFunc.PlayerGetName(val2) + " (" + text4 + ") from player:" + nickName + "(" + text3 + ")"));
					if (text5 == "kick")
					{
						NetworkManager.instance.KickPlayer(val2);
					}
					else
					{
						NetworkManager.instance.BanPlayer(val2);
					}
				}
				break;
			}
			case "InitModerator":
				SharePermissions.Logger.LogInfo((object)("Network event: InitModerator command received for steamId: " + text3));
				Moderators.Instance.AddModerator(text3);
				break;
			case "StartGame":
				SharePermissions.Logger.LogInfo((object)"Network event: StartGame command received.");
				SharePermissions.LogWrite("Start game request from player:" + nickName + "(" + text3 + ")");
				SharePermissions.StartGameClick();
				break;
			case "BackToLobby":
				SharePermissions.Logger.LogInfo((object)"Network event: StartGame command received.");
				SharePermissions.LogWrite("Return to lobby request from player:" + nickName + "(" + text3 + ")");
				SharePermissions.ReturnLobbyClick();
				break;
			default:
				SharePermissions.Logger.LogInfo((object)("Network event: Unknown command(" + array.Length + "): " + text));
				break;
			}
		}
	}
	internal class Menu
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static BuilderDelegate <>9__3_0;

			public static BuilderDelegate <>9__3_1;

			public static ShouldCloseMenuDelegate <>9__11_0;

			internal void <Init>b__3_0(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val = MenuAPI.CreateREPOButton("Mod", (Action)openPlayerListMenu, parent, new Vector2(186f, 32f));
				((TMP_Text)val.labelTMP).fontSize = 28f;
			}

			internal void <Init>b__3_1(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val = MenuAPI.CreateREPOButton("Mod", (Action)openPlayerListMenu, parent, new Vector2(126f, 86f));
				((TMP_Text)val.labelTMP).fontSize = 28f;
			}

			internal bool <openPlayerListMenu>b__11_0()
			{
				return false;
			}
		}

		[CompilerGenerated]
		private sealed class <openPageInternal>d__12 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public REPOPopupPage page;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <openPageInternal>d__12(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(0.05f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					page.OpenPage(false);
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static bool menuOpened;

		private static REPOPopupPage kickPage;

		private static MenuButtonPopUp menuButtonPopup;

		public static void Init()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			object obj = <>c.<>9__3_0;
			if (obj == null)
			{
				BuilderDelegate val = delegate(Transform parent)
				{
					//IL_002c: Unknown result type (might be due to invalid IL or missing references)
					REPOButton val4 = MenuAPI.CreateREPOButton("Mod", (Action)openPlayerListMenu, parent, new Vector2(186f, 32f));
					((TMP_Text)val4.labelTMP).fontSize = 28f;
				};
				<>c.<>9__3_0 = val;
				obj = (object)val;
			}
			MenuAPI.AddElementToLobbyMenu((BuilderDelegate)obj);
			object obj2 = <>c.<>9__3_1;
			if (obj2 == null)
			{
				BuilderDelegate val2 = delegate(Transform parent)
				{
					//IL_002c: Unknown result type (might be due to invalid IL or missing references)
					REPOButton val3 = MenuAPI.CreateREPOButton("Mod", (Action)openPlayerListMenu, parent, new Vector2(126f, 86f));
					((TMP_Text)val3.labelTMP).fontSize = 28f;
				};
				<>c.<>9__3_1 = val2;
				obj2 = (object)val2;
			}
			MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj2);
			SharePermissions.Logger.LogInfo((object)"Inited!");
		}

		public static REPOPopupPage createMenu(string title)
		{
			REPOPopupPage val = MenuAPI.CreateREPOPopupPage(title, (PresetSide)0, false, true, -5f);
			addCloseButton(val);
			return val;
		}

		public static void toggleMenu()
		{
			if (!menuOpened)
			{
				openPlayerListMenu();
			}
			else
			{
				closePage(kickPage);
			}
		}

		public static void addLabel(REPOPopupPage parent, string text)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			string text2 = text;
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val = MenuAPI.CreateREPOLabel(text2, scrollView, default(Vector2));
				return ((REPOElement)val).rectTransform;
			}, 0f, 0f);
		}

		public static void addButton(REPOPopupPage parent, string text, Action action)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			string text2 = text;
			Action action2 = action;
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
			{
				//IL_0010: 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)
				REPOButton val = MenuAPI.CreateREPOButton(text2, action2, scrollView, default(Vector2));
				return ((REPOElement)val).rectTransform;
			}, 0f, 0f);
		}

		public static void addKickButton(REPOPopupPage parent, string text, string text2, Action kickAction, Action banAction)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			string text3 = text;
			Action kickAction2 = kickAction;
			Action banAction2 = banAction;
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val = MenuAPI.CreateREPOButton(text3, (Action)delegate
				{
					//IL_0015: Unknown result type (might be due to invalid IL or missing references)
					createCustomPopupMenu("Choose punishment", new Color(1f, 0.553f, 0f), "Player " + text3, kickAction2, banAction2, "Kick", "Ban");
				}, scrollView, default(Vector2));
				if (text3.Length > 24)
				{
					Vector2 labelSize = val.GetLabelSize();
					labelSize.x = 250f;
					val.overrideButtonSize = labelSize;
					REPOTextScroller val2 = ((Component)val.labelTMP).gameObject.AddComponent<REPOTextScroller>();
					val2.maxCharacters = 24;
				}
				return ((REPOElement)val).rectTransform;
			}, 0f, 0f);
		}

		public static void closePage(REPOPopupPage page)
		{
			menuOpened = false;
			page.ClosePage(true);
			MenuManager.instance.PageRemove(page.menuPage);
		}

		public static void addCloseButton(REPOPopupPage parent)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			REPOPopupPage parent2 = parent;
			parent2.AddElement((BuilderDelegate)delegate(Transform transform)
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Close", (Action)delegate
				{
					closePage(parent2);
				}, transform, new Vector2(270f, 20f));
			});
		}

		private static void openPlayerListMenu()
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Expected O, but got Unknown
			REPOPopupPage playersMenu = createMenu("Mod menu");
			PlayerAvatar instance = PlayerAvatar.instance;
			string fromSteamId = SemiFunc.PlayerGetSteamID(instance);
			string secret = SharePermissions.SecretCode.Value;
			REPOPopupPage obj = playersMenu;
			object obj2 = <>c.<>9__11_0;
			if (obj2 == null)
			{
				ShouldCloseMenuDelegate val = () => false;
				<>c.<>9__11_0 = val;
				obj2 = (object)val;
			}
			obj.onEscapePressed = (ShouldCloseMenuDelegate)obj2;
			kickPage = playersMenu;
			List<PlayerAvatar> list = SemiFunc.PlayerGetAll();
			foreach (PlayerAvatar player in list)
			{
				string playerDisplayName = Moderators.Instance.GetPlayerDisplayName(player);
				addKickButton(playersMenu, playerDisplayName, "Ban", delegate
				{
					string text2 = SemiFunc.PlayerGetSteamID(player);
					Events.SendCommand("KickPlayer", secret, fromSteamId, new object[2] { text2, "kick" }, (ReceiverGroup)2);
					closePage(playersMenu);
				}, delegate
				{
					//IL_0015: Unknown result type (might be due to invalid IL or missing references)
					MenuAPI.OpenPopup("Confirm", new Color(1f, 0.553f, 0f), "Ban " + SemiFunc.PlayerGetName(player) + " ?", (Action)delegate
					{
						string text = SemiFunc.PlayerGetSteamID(player);
						Events.SendCommand("KickPlayer", secret, fromSteamId, new object[2] { text, "ban" }, (ReceiverGroup)2);
						closePage(playersMenu);
					}, (Action)delegate
					{
						closePage(playersMenu);
					});
				});
			}
			playersMenu.AddElement((BuilderDelegate)delegate(Transform transform)
			{
				//IL_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				if (SemiFunc.RunIsLobbyMenu())
				{
					MenuAPI.CreateREPOButton("Start game", (Action)delegate
					{
						//IL_0015: Unknown result type (might be due to invalid IL or missing references)
						MenuAPI.OpenPopup("Confirm", new Color(1f, 0.553f, 0f), "Start the game or maybe 5 minutes wait?", (Action)delegate
						{
							Events.SendCommand("StartGame", secret, fromSteamId, Array.Empty<object>(), (ReceiverGroup)2);
							closePage(playersMenu);
						}, (Action)null);
					}, transform, new Vector2(150f, 20f));
				}
				else
				{
					MenuAPI.CreateREPOButton("Back to lobby", (Action)delegate
					{
						//IL_0015: Unknown result type (might be due to invalid IL or missing references)
						MenuAPI.OpenPopup("Confirm", new Color(1f, 0.553f, 0f), "Back to the lobby?", (Action)delegate
						{
							Events.SendCommand("BackToLobby", secret, fromSteamId, Array.Empty<object>(), (ReceiverGroup)2);
							closePage(playersMenu);
						}, (Action)null);
					}, transform, new Vector2(150f, 20f));
				}
			});
			openPage(playersMenu);
		}

		[IteratorStateMachine(typeof(<openPageInternal>d__12))]
		private static IEnumerator openPageInternal(REPOPopupPage page)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <openPageInternal>d__12(0)
			{
				page = page
			};
		}

		public static void openPage(REPOPopupPage page)
		{
			menuOpened = true;
			((MonoBehaviour)MenuManager.instance).StartCoroutine(openPageInternal(page));
		}

		private static void createCustomPopupMenu(string title, Color headerColor, string message, Action onLeftClicked, Action onRightClicked, string leftTitle = "Yes", string rightTitle = "No")
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)menuButtonPopup))
			{
				menuButtonPopup = ((Component)MenuManager.instance).gameObject.AddComponent<MenuButtonPopUp>();
			}
			menuButtonPopup.option1Event = new UnityEvent();
			menuButtonPopup.option2Event = new UnityEvent();
			if (onLeftClicked != null)
			{
				menuButtonPopup.option1Event.AddListener(new UnityAction(onLeftClicked.Invoke));
			}
			if (onRightClicked != null)
			{
				menuButtonPopup.option2Event.AddListener(new UnityAction(onRightClicked.Invoke));
			}
			MenuManager.instance.PagePopUpTwoOptions(menuButtonPopup, title, headerColor, message, leftTitle, rightTitle, true);
		}
	}
	internal class Moderators
	{
		private static Moderators _instance;

		private HashSet<string> moderatorSteamIds = new HashSet<string>();

		private const string ModeratorIcon = "[M]";

		private const string HostIcon = "[H]";

		internal static Moderators Instance
		{
			get
			{
				if (_instance == null)
				{
					_instance = new Moderators();
				}
				return _instance;
			}
		}

		public Moderators()
		{
			_instance = this;
		}

		public void AddModerator(string steamId)
		{
			if (!string.IsNullOrEmpty(steamId) && !moderatorSteamIds.Contains(steamId))
			{
				moderatorSteamIds.Add(steamId);
				SharePermissions.Logger.LogInfo((object)("Added moderator: " + steamId));
			}
		}

		public void RemoveModerator(string steamId)
		{
			if (moderatorSteamIds.Contains(steamId))
			{
				moderatorSteamIds.Remove(steamId);
				SharePermissions.Logger.LogInfo((object)("Removed moderator: " + steamId));
			}
		}

		public bool IsModerator(string steamId)
		{
			return !string.IsNullOrEmpty(steamId) && moderatorSteamIds.Contains(steamId);
		}

		public bool IsModerator(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return false;
			}
			string steamId = SemiFunc.PlayerGetSteamID(player);
			return IsModerator(steamId);
		}

		public bool IsHost(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return false;
			}
			PhotonView component = ((Component)player).GetComponent<PhotonView>();
			return (Object)(object)component != (Object)null && component.Owner != null && component.Owner.IsMasterClient;
		}

		public string GetPlayerDisplayName(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return "";
			}
			string text = SemiFunc.PlayerGetName(player);
			string playerIcon = GetPlayerIcon(player);
			return string.IsNullOrEmpty(playerIcon) ? text : ("<color=#FFD700>" + playerIcon + "</color> " + text);
		}

		public string GetPlayerIcon(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return "";
			}
			if (IsHost(player))
			{
				return "[H]";
			}
			if (IsModerator(player))
			{
				return "[M]";
			}
			return "";
		}

		public string GetPlayerEmoji(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return "";
			}
			if (IsHost(player))
			{
				return "[H]";
			}
			if (IsModerator(player))
			{
				return "[M]";
			}
			return "";
		}

		public List<string> GetAllModerators()
		{
			return moderatorSteamIds.ToList();
		}

		public void ClearModerators()
		{
			moderatorSteamIds.Clear();
			SharePermissions.Logger.LogInfo((object)"Cleared all moderators");
		}

		public int GetModeratorCount()
		{
			return moderatorSteamIds.Count;
		}

		public bool HasPermissions(PlayerAvatar player)
		{
			return IsHost(player) || IsModerator(player);
		}

		public bool HasPermissions(string steamId)
		{
			if (string.IsNullOrEmpty(steamId))
			{
				return false;
			}
			PlayerAvatar val = SemiFunc.PlayerGetFromSteamID(steamId);
			if ((Object)(object)val == (Object)null)
			{
				return IsModerator(steamId);
			}
			return HasPermissions(val);
		}

		public static void Init()
		{
			if (_instance == null)
			{
				new Moderators();
				SharePermissions.Logger.LogInfo((object)"Moderators system initialized");
			}
		}
	}
	[HarmonyPatch(typeof(NetworkConnect))]
	internal class NetworkConnectPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void Start_Postfix()
		{
			Events.Init();
		}

		[HarmonyPatch("OnCreatedRoom")]
		[HarmonyPostfix]
		private static void OnCreatedRoom_Postfix()
		{
			SharePermissions.Logger.LogInfo((object)"onCreateRoom");
		}

		[HarmonyPatch("OnJoinedRoom")]
		[HarmonyPostfix]
		private static void OnJoinedRoom_Postfix()
		{
			SharePermissions.Logger.LogInfo((object)"onJoinRoom");
			if (!SemiFunc.IsMasterClient())
			{
				PlayerAvatar instance = PlayerAvatar.instance;
				string fromSteamId = SemiFunc.PlayerGetSteamID(instance);
				string value = SharePermissions.SecretCode.Value;
				Events.SendCommand("InitModerator", value, fromSteamId, Array.Empty<object>(), (ReceiverGroup)1);
			}
		}

		[HarmonyPatch("OnDisconnected")]
		[HarmonyPostfix]
		private static void OnDisconnected_Postfix()
		{
			SharePermissions.Logger.LogInfo((object)"Left room - clearing all moderators");
			Moderators.Instance.ClearModerators();
		}
	}
	[HarmonyPatch(typeof(NetworkManager))]
	internal class NetworkManagerPatch
	{
		[HarmonyPatch("OnPlayerLeftRoom")]
		[HarmonyPostfix]
		private static void OnPlayerLeftRoom_Postfix(Player otherPlayer)
		{
			if (otherPlayer != null && !string.IsNullOrEmpty(otherPlayer.UserId))
			{
				string userId = otherPlayer.UserId;
				if (Moderators.Instance.IsModerator(userId))
				{
					Moderators.Instance.RemoveModerator(userId);
					SharePermissions.Logger.LogInfo((object)("Player " + otherPlayer.NickName + " (" + userId + ") left - removed moderator status"));
				}
			}
		}
	}
	[HarmonyPatch(typeof(RunManager))]
	internal class RunPatch
	{
		private static bool lastKeyState;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void Update_Postfix(RunPatch __instance)
		{
			bool key = Input.GetKey((KeyCode)32);
			if (!lastKeyState && key)
			{
				if (SemiFunc.RunIsLobbyMenu())
				{
					Menu.toggleMenu();
				}
				lastKeyState = key;
			}
			else if (lastKeyState && !key)
			{
				lastKeyState = key;
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("RestartScene")]
		[HarmonyWrapSafe]
		private static void RestartScene_Prefix(RunManager __instance)
		{
			if (SharePermissions.IsReturningToLobby && __instance.restarting && !__instance.restartingDone && (Object)(object)GameDirector.instance != (Object)null && GameDirector.instance.PlayerList.All((PlayerAvatar p) => p.outroDone))
			{
				SharePermissions.IsReturningToLobby = false;
				NetworkManager.instance.DestroyAll();
			}
		}
	}
	[BepInPlugin("RED.SharePermissions", "SharePermissions", "1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class SharePermissions : BaseUnityPlugin
	{
		private static string _logPath;

		public static bool IsReturningToLobby;

		internal static SharePermissions Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		public static ConfigEntry<string> SecretCode { get; private set; }

		private static string LogPath
		{
			get
			{
				if (!string.IsNullOrEmpty(_logPath))
				{
					return _logPath;
				}
				try
				{
					_logPath = Path.Combine(Paths.ConfigPath, "sharepermissions.log");
				}
				catch
				{
					_logPath = Path.Combine(Application.persistentDataPath, "sharepermissions.log");
				}
				return _logPath;
			}
		}

		private void Awake()
		{
			Instance = this;
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Patch();
			Menu.Init();
			Moderators.Init();
			Configuration(((BaseUnityPlugin)this).Config);
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
		}

		public static void LogWrite(string line)
		{
			try
			{
				string text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
				string text2 = "[" + text + "] " + line;
				string directoryName = Path.GetDirectoryName(LogPath);
				if (!Directory.Exists(directoryName))
				{
					Directory.CreateDirectory(directoryName);
				}
				File.AppendAllText(LogPath, text2 + Environment.NewLine);
			}
			catch (Exception arg)
			{
				Logger.LogError((object)$"[SharePermissions] Log save failed: {arg}");
			}
		}

		internal void Configuration(ConfigFile config)
		{
			SecretCode = config.Bind<string>("General", "SecretCode", "", "Code for share permission");
		}

		public static void ReturnLobbyClick()
		{
			IsReturningToLobby = true;
			RunManager instance = RunManager.instance;
			int num = ((instance.levelCurrent == instance.levelShop) ? 1 : 0);
			instance.ChangeLevel(true, SemiFunc.RunIsArena(), (ChangeLevelType)3);
			SemiFunc.StatSetSaveLevel(num);
			instance.loadLevel = num;
			StatsManager.instance.SaveFileSave();
		}

		public static void StartGameClick()
		{
			RunManager instance = RunManager.instance;
			instance.ChangeLevel(false, SemiFunc.RunIsArena(), (ChangeLevelType)0);
		}

		internal void Patch()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
		}

		internal void Unpatch()
		{
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		private void Update()
		{
		}
	}
}