Decompiled source of REPOLobbyListMod v1.0.0

REPOLobbyListMod.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Logging;
using MenuLib;
using MenuLib.MonoBehaviors;
using Steamworks;
using Steamworks.Data;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("REPOLobbyListMod")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3f571bba74fe0fa269fe60f2369d185e90583a55")]
[assembly: AssemblyProduct("REPOLobbyListMod")]
[assembly: AssemblyTitle("REPOLobbyListMod")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace REPOLobbyListMod;

internal enum LobbyFilterEnum
{
	Close,
	Far,
	WorldWide
}
[BepInPlugin("com.github.kronik.REPOLobbyListMod", "REPOLobbyListMod", "1.0.0")]
[BepInDependency("nickklmao.menulib", "2.4.1")]
internal class REPOLobbyListMod : BaseUnityPlugin
{
	private LobbyFilterEnum lobbyFilter;

	private REPOButton xButton;

	private bool serverListPopulating;

	private bool shouldPopulate;

	private const string BUTTONTEXT = "                                                              ?";

	private readonly SortedDictionary<ulong, REPOElement> lobbyCache = new SortedDictionary<ulong, REPOElement>();

	internal static REPOLobbyListMod Instance { get; private set; }

	internal REPOPopupPage ServerListPage { get; private set; }

	private bool IsPopulated
	{
		get
		{
			if (!serverListPopulating)
			{
				return shouldPopulate;
			}
			return false;
		}
	}

	private void Awake()
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Expected O, but got Unknown
		Instance = this;
		PreventDestroy();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded plugin");
		MenuAPI.AddElementToMainMenu(new BuilderDelegate(CreateMenu));
	}

	private void PreventDestroy()
	{
		((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
	}

	private void CreateMenu(Transform parent)
	{
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: 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_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: Unknown result type (might be due to invalid IL or missing references)
		MenuAPI.CreateREPOButton("Server List", (Action)OnOpenServerListPressed, parent, Vector2.op_Implicit(new Vector3(150f, 218.4f)));
		ServerListPage = MenuAPI.CreateREPOPopupPage("Server List", (PresetSide)1, true, false, 0f);
		Transform transform = ((Component)ServerListPage.menuScrollBox).transform;
		transform.position += new Vector3(0f, -40f);
		Transform transform2 = ((Component)ServerListPage).transform;
		xButton = MenuAPI.CreateREPOButton("<color=#ff0000ff>X</color>", (Action)OnPressCloseServerListPage, transform2, Vector2.op_Implicit(new Vector3(383f, 310f, 0f)));
		MenuAPI.CreateREPOButton("Join Random", (Action)OnJoinRandomPressed, transform2, Vector2.op_Implicit(new Vector3(520f, 260f)));
		MenuAPI.CreateREPOButton("Refresh", (Action)OnRefreshPressed, transform2, Vector2.op_Implicit(new Vector3(390f, 260f)));
	}

	private void OnSortTogglePressed(bool val)
	{
		PopulateServerList();
	}

	private void OnOpenServerListPressed()
	{
		ServerListPage.OpenPage(false);
		shouldPopulate = true;
	}

	private void OnPressCloseServerListPage()
	{
		ServerListPage.ClosePage(false);
		shouldPopulate = false;
	}

	private void OnJoinRandomPressed()
	{
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		if (!IsPopulated || lobbyCache.Count == 0)
		{
			return;
		}
		int num = Random.Range(0, lobbyCache.Count - 1);
		int num2 = 0;
		foreach (KeyValuePair<ulong, REPOElement> item in lobbyCache)
		{
			if (num2++ == num)
			{
				JoinLobby(SteamId.op_Implicit(item.Key));
				break;
			}
		}
	}

	private void OnRefreshPressed()
	{
		PopulateServerList();
	}

	private async void PopulateServerList()
	{
		if (serverListPopulating || !shouldPopulate)
		{
			return;
		}
		serverListPopulating = true;
		ClearServerList();
		Lobby[] lobbies = await GetLobbies(lobbyFilter);
		for (int i = 0; i < lobbies.Length; i++)
		{
			Lobby lobby = lobbies[i];
			if (((Lobby)(ref lobby)).GetData("BuildName").ToString() == BuildManager.instance.version.title && shouldPopulate && (int)(await ((Lobby)(ref lobby)).Join()) == 1)
			{
				REPOElement value = await AddLobbyToList(lobby);
				((Lobby)(ref lobby)).Leave();
				lobbyCache.Add(SteamId.op_Implicit(((Lobby)(ref lobby)).Id), value);
			}
			if (!shouldPopulate)
			{
				ClearServerList();
				break;
			}
		}
		serverListPopulating = false;
	}

	private void ClearServerList()
	{
		foreach (KeyValuePair<ulong, REPOElement> item in lobbyCache)
		{
			if ((Object)(object)item.Value != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)item.Value).gameObject);
			}
		}
		lobbyCache.Clear();
	}

	private REPOButton BuildSteamLobbyButton(Image? img, Lobby lobby, Transform parent, Action onPressed)
	{
		//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)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: 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_004d: 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)
		REPOButton val = MenuAPI.CreateREPOButton("                                                              ?", onPressed, parent, default(Vector2));
		((REPOElement)val).rectTransform.sizeDelta = new Vector2(260f, ((REPOElement)val).rectTransform.sizeDelta.y);
		if (img.HasValue)
		{
			Image valueOrDefault = img.GetValueOrDefault();
			if (valueOrDefault.Data != null)
			{
				AddSteamAvatarToButton(valueOrDefault, ((Component)val).transform);
			}
		}
		Friend owner = ((Lobby)(ref lobby)).Owner;
		AddSteamPlayerNameToButton(((Friend)(ref owner)).Name, ((Component)val).transform);
		AddLobbyStatsToButton(lobby, ((Component)val).transform);
		return val;
	}

	private void AddSteamAvatarToButton(Image image, Transform parent)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: 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_0015: Expected O, but got Unknown
		//IL_0016: 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_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: 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_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		Texture2D val = new Texture2D((int)image.Width, (int)image.Height, (TextureFormat)4, false, true);
		val.LoadRawTextureData(image.Data);
		val.Apply();
		GameObject val2 = new GameObject("steampfp");
		val2.transform.SetParent(parent);
		val2.transform.localScale = Vector3.one * 0.35f;
		val2.transform.SetLocalPositionAndRotation(Vector3.right * 110f, Quaternion.identity);
		RawImage val3 = val2.AddComponent<RawImage>();
		val3.texture = (Texture)(object)val;
		Rect uvRect = val3.uvRect;
		float num = ((Rect)(ref uvRect)).width * -1f;
		uvRect = val3.uvRect;
		val3.uvRect = new Rect(1f, 0f, num, ((Rect)(ref uvRect)).height);
		((Transform)((Component)val3).GetComponent<RectTransform>()).Rotate(new Vector3(0f, 0f, 180f), (Space)1);
	}

	private void AddSteamPlayerNameToButton(string name, Transform parent)
	{
		//IL_0004: 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: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: 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_0044: Unknown result type (might be due to invalid IL or missing references)
		REPOLabel obj = MenuAPI.CreateREPOLabel(name, parent, default(Vector2));
		((Component)obj).transform.localScale = Vector3.one * 0.55f;
		Transform transform = ((Component)obj).transform;
		transform.localPosition += Vector3.up * 20f;
	}

	private void AddLobbyStatsToButton(Lobby lobby, Transform parent)
	{
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//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)
		((Component)MenuAPI.CreateREPOLabel($"{((Lobby)(ref lobby)).MemberCount}/{((Lobby)(ref lobby)).MaxMembers}", parent, default(Vector2))).transform.localScale = Vector3.one * 0.45f;
	}

	private async Task<REPOElement> AddLobbyToList(Lobby lobby)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		ManualLogSource logger = ((BaseUnityPlugin)this).Logger;
		Friend owner = ((Lobby)(ref lobby)).Owner;
		logger.LogInfo((object)("Added lobby: " + ((Friend)(ref owner)).Name + " to list"));
		SteamId steamId = ((Lobby)(ref lobby)).Id;
		owner = ((Lobby)(ref lobby)).Owner;
		REPOButton val = BuildSteamLobbyButton(await ((Friend)(ref owner)).GetMediumAvatarAsync(), lobby, null, delegate
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			JoinLobby(steamId);
		});
		ServerListPage.AddElementToScrollView(((REPOElement)val).rectTransform, default(Vector2), 0f, 10f);
		((REPOElement)val).rectTransform.sizeDelta = new Vector2(260f, ((REPOElement)val).rectTransform.sizeDelta.y);
		return (REPOElement)(object)val;
	}

	private async void JoinLobby(SteamId lobbyId)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		ServerListPage.ClosePage(true);
		await SteamMatchmaking.JoinLobbyAsync(lobbyId);
		Reflection.joinLobbyField.SetValue(SteamManager.instance, true);
	}

	private static async Task<Lobby[]> GetLobbies(LobbyFilterEnum lobbyFilter)
	{
		LobbyQuery lobbyList = SteamMatchmaking.LobbyList;
		LobbyQuery val = (LobbyQuery)(lobbyFilter switch
		{
			LobbyFilterEnum.Close => ((LobbyQuery)(ref lobbyList)).FilterDistanceClose(), 
			LobbyFilterEnum.Far => ((LobbyQuery)(ref lobbyList)).FilterDistanceFar(), 
			LobbyFilterEnum.WorldWide => ((LobbyQuery)(ref lobbyList)).FilterDistanceWorldwide(), 
			_ => ((LobbyQuery)(ref lobbyList)).FilterDistanceClose(), 
		});
		return await ((LobbyQuery)(ref val)).RequestAsync();
	}
}
public static class PluginInfo
{
	public const string GUID = "com.github.kronik.REPOLobbyListMod";

	public const string Name = "REPOLobbyListMod";

	public const string Version = "1.0.0";
}
internal static class Reflection
{
	public static readonly FieldInfo joinLobbyField = typeof(SteamManager).GetField("joinLobby", BindingFlags.Instance | BindingFlags.NonPublic);
}