Files
2026-06-20 10:48:55 -06:00

274 lines
9.7 KiB
C#

using System;
using System.Collections;
using System.IO;
using System.Net.Http;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using GorillaNetworking;
using HarmonyLib;
using Photon.Pun;
using UnityEngine;
using UnityEngine.Networking;
using Application = UnityEngine.Device.Application;
namespace SelfTracker;
[BepInPlugin(Constants.PluginGuid, Constants.PluginName, Constants.PluginVersion)]
public class Plugin : BaseUnityPlugin
{
public static Plugin Instance { get; private set; }
public bool IsInRoom;
public string CurrentRoomName;
public ConfigEntry<string> PlayerName;
private ConfigEntry<string> webhookUrl;
private string messageId;
private HttpClient client = new();
private void Awake()
{
Instance = this;
ConfigFile configFile = new ConfigFile(Path.Combine(Paths.ConfigPath, "SelfTracker.cfg"), true);
webhookUrl = configFile.Bind("General", "Webhook URL", "https://discord.com/api/webhooks/", "Webhook URL to send the data to");
PlayerName = configFile.Bind("General", "Player Name", "PlayerName", "Your player name, so you can identify who started the game");
Application.quitting += OnQuit;
DontDestroyOnLoad(gameObject);
}
private void Start()
{
GorillaTagger.OnPlayerSpawned(OnGameInitialized);
Harmony harmony = new(Constants.PluginGuid);
harmony.PatchAll();
}
private void OnGameInitialized()
{
string json = $@"
{{
""embeds"": [
{{
""title"": ""{PlayerName.Value} has started Gorilla Tag"",
""color"": 7415295,
""image"": {{ ""url"": ""https://images.elliemese.win/OpenGame.gif"" }},
""footer"": {{ ""text"": ""Self Tracker by HanSolo1000Falcon, and Forked by ModdedAxo"" }}
}}
]
}}";
SendWebhook(json);
NetworkSystem.Instance.OnJoinedRoomEvent += (Action)OnJoinedRoom;
NetworkSystem.Instance.OnReturnedToSinglePlayer += (Action)OnLeftRoom;
NetworkSystem.Instance.OnPlayerJoined += (Action<NetPlayer>)OnPlayerJoined;
NetworkSystem.Instance.OnPlayerLeft += (Action<NetPlayer>)OnPlayerLeft;
}
private void OnPlayerJoined(NetPlayer fuckingWeirdo)
{
if (fuckingWeirdo.IsLocal)
return;
string map = PhotonNetworkController.Instance.currentJoinTrigger == null
? "forest"
: PhotonNetworkController.Instance.currentJoinTrigger.networkZone;
map = map.ToUpper();
string json = $@"
{{
""embeds"": [
{{
""title"": ""{PlayerName.Value} has joined code `{CurrentRoomName}`"",
""description"": ""In game name: `{PhotonNetwork.LocalPlayer.NickName}`\nPlayers in room: `{NetworkSystem.Instance.RoomPlayerCount}`\nMap: `{map}`\nPublic room: `{PhotonNetwork.CurrentRoom.IsVisible}`\nIs Modded: `{NetworkSystem.Instance.GameModeString.Contains("MODDED")}`\nGamemode: `{GetGamemodeKey(NetworkSystem.Instance.GameModeString)}`\nQueue: `{GetQueueKey(NetworkSystem.Instance.GameModeString)}`"",
""color"": 7415295,
""image"": {{ ""url"": ""https://images.elliemese.win/JoinLobby.gif"" }},
""footer"": {{ ""text"": ""Self Tracker by HanSolo1000Falcon, and Forked by ModdedAxo"" }}
}}
]
}}";
SendWebhook(json, true);
}
private void OnPlayerLeft(NetPlayer fuckingWeirdo)
{
if (fuckingWeirdo.IsLocal)
return;
string map = PhotonNetworkController.Instance.currentJoinTrigger == null
? "forest"
: PhotonNetworkController.Instance.currentJoinTrigger.networkZone;
map = map.ToUpper();
string json = $@"
{{
""embeds"": [
{{
""title"": ""{PlayerName.Value} has joined code `{CurrentRoomName}`"",
""description"": ""In game name: `{PhotonNetwork.LocalPlayer.NickName}`\nPlayers in room: `{NetworkSystem.Instance.RoomPlayerCount}`\nMap: `{map}`\nPublic room: `{PhotonNetwork.CurrentRoom.IsVisible}`\nIs Modded: `{NetworkSystem.Instance.GameModeString.Contains("MODDED")}`\nGamemode: `{GetGamemodeKey(NetworkSystem.Instance.GameModeString)}`\nQueue: `{GetQueueKey(NetworkSystem.Instance.GameModeString)}`"",
""color"": 7415295,
""image"": {{ ""url"": ""https://images.elliemese.win/JoinLobby.gif"" }},
""footer"": {{ ""text"": ""Self Tracker by HanSolo1000Falcon, and Forked by ModdedAxo"" }}
}}
]
}}";
SendWebhook(json, true);
}
private void OnJoinedRoom()
{
IsInRoom = true;
CurrentRoomName = NetworkSystem.Instance.RoomName;
string map = PhotonNetworkController.Instance.currentJoinTrigger == null
? "forest"
: PhotonNetworkController.Instance.currentJoinTrigger.networkZone;
map = map.ToUpper();
string json = $@"
{{
""embeds"": [
{{
""title"": ""{PlayerName.Value} has joined code `{CurrentRoomName}`"",
""description"": ""In game name: `{PhotonNetwork.LocalPlayer.NickName}`\nPlayers in room: `{NetworkSystem.Instance.RoomPlayerCount}`\nMap: `{map}`\nPublic room: `{PhotonNetwork.CurrentRoom.IsVisible}`\nIs Modded: `{NetworkSystem.Instance.GameModeString.Contains("MODDED")}`\nGamemode: `{GetGamemodeKey(NetworkSystem.Instance.GameModeString)}`\nQueue: `{GetQueueKey(NetworkSystem.Instance.GameModeString)}`"",
""color"": 7415295,
""image"": {{ ""url"": ""https://images.elliemese.win/JoinLobby.gif"" }},
""footer"": {{ ""text"": ""Self Tracker by HanSolo1000Falcon, and Forked by ModdedAxo"" }}
}}
]
}}";
SendWebhook(json);
}
private void OnQuit()
{
string json = $@"
{{
""embeds"": [
{{
""title"": ""{PlayerName.Value} has quit Gorilla Tag"",
""color"": 7415295,
""image"": {{ ""url"": ""https://images.elliemese.win/CloseGame.gif"" }},
""footer"": {{ ""text"": ""Self Tracker by HanSolo1000Falcon, and Forked by ModdedAxo"" }}
}}
]
}}";
SendWebhook(json);
}
private void OnLeftRoom()
{
if (!IsInRoom)
return;
IsInRoom = false;
string json = $@"
{{
""embeds"": [
{{
""title"": ""{PlayerName.Value} has left the code `{CurrentRoomName}`"",
""color"": 7415295,
""image"": {{ ""url"": ""https://images.elliemese.win/LobbyLeaveComputer.gif"" }},
""footer"": {{ ""text"": ""Self Tracker by HanSolo1000Falcon, and Forked by ModdedAxo"" }}
}}
]
}}";
SendWebhook(json);
}
public string GetGamemodeKey(string gamemodeString)
{
gamemodeString = gamemodeString.ToUpper();
if (gamemodeString.Contains("CASUAL")) return "CASUAL";
if (gamemodeString.Contains("INFECTION")) return "INFECTION";
if (gamemodeString.Contains("HUNT")) return "HUNT";
if (gamemodeString.Contains("Freeze")) return "FREEZE";
if (gamemodeString.Contains("PAINTBRAWL")) return "PAINTBRAWL";
if (gamemodeString.Contains("AMBUSH")) return "AMBUSH";
if (gamemodeString.Contains("GHOST")) return "GHOST";
if (gamemodeString.Contains("GUARDIAN")) return "GUARDIAN";
return gamemodeString;
}
public string GetQueueKey(string gamemodeString)
{
gamemodeString = gamemodeString.ToUpper();
if (gamemodeString.Contains("DEFAULT")) return "DEFAULT";
if (gamemodeString.Contains("MINIGAMES")) return "MINI GAMES";
if (gamemodeString.Contains("COMPETITIVE")) return "COMPETITIVE";
return gamemodeString;
}
public void SendWebhook(string json, bool isEditing = false)
{
StartCoroutine(SendWebhookAsync(json, isEditing));
/*try
{
var content = new StringContent(json, Encoding.UTF8, "application/json");
client.PostAsync(webhookUrl.Value, content).GetAwaiter().GetResult();
} catch { }*/
}
private IEnumerator SendWebhookAsync(string json, bool isEditing)
{
UnityWebRequest request;
if (!isEditing)
{
request = new UnityWebRequest(webhookUrl.Value + "?wait=true", "POST");
}
else
{
string editUrl = $"{webhookUrl.Value}/messages/{messageId}";
request = new UnityWebRequest(editUrl, "PATCH");
}
byte[] bodyRaw = Encoding.UTF8.GetBytes(json);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError($"Webhook {(isEditing ? "edit" : "send")} failed: {request.error}");
}
else
{
Debug.Log($"Webhook {(isEditing ? "edited" : "sent")} successfully.");
if (!isEditing)
{
var responseText = request.downloadHandler.text;
int idIndex = responseText.IndexOf("\"id\":\"", StringComparison.Ordinal);
if (idIndex >= 0)
{
int start = idIndex + 6;
int end = responseText.IndexOf('"', start);
messageId = responseText.Substring(start, end - start);
Debug.Log($"Captured messageId: {messageId}");
}
else
{
Debug.LogError("Failed to parse messageId from webhook response: " + responseText);
}
}
}
}
}