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()
{
}
}
}