203 lines
6.2 KiB
C#

#if UNITY_EDITOR
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.SceneManagement;
using UnityEditor;
using System.IO;
using System.Threading.Tasks;
using System.Threading;
using ERP.Discord;
using System.Diagnostics;
using Debug = UnityEngine.Debug;
namespace ERP
{
[InitializeOnLoad]
public static class ERP
{
private const string applicationId = "509465267630374935";
private const string prefix = "<b>ERP</b>";
public static Discord.Discord discord { get; private set; }
public static string projectName { get; private set; }
public static string sceneName { get; private set; }
public static bool showSceneName = true;
public static bool showProjectName = true;
public static bool resetOnSceneChange = false;
public static bool debugMode = false;
public static bool EditorClosed = true;
public static long lastTimestamp = 0;
public static long lastSessionID = 0;
public static bool Errored = false;
public static bool Failed;
static ERP()
{
ERPSettings.GetSettings();
DelayStart();
}
public static async void DelayStart(int delay = 1000)
{
await Task.Delay(delay);
Init();
}
public static void Init()
{
if (Errored && lastSessionID == EditorAnalyticsSessionInfo.id)
{
if (debugMode)
LogWarning($"Error but in same session");
return;
}
if (!DiscordRunning())
{
LogWarning("Can't find Discord's Process");
Failed = true;
Errored = true;
ERPSettings.SaveSettings();
return;
}
try
{
discord = new Discord.Discord(long.Parse(applicationId), (long)CreateFlags.Default);
}
catch (Exception e)
{
if (debugMode)
LogWarning("Expected Error, retrying\n" + e.ToString());
if (!Failed)
DelayStart(2000);
Failed = true;
return;
}
if (!resetOnSceneChange || EditorAnalyticsSessionInfo.id != lastSessionID)
{
lastTimestamp = GetTimestamp();
ERPSettings.SaveSettings();
}
lastSessionID = EditorAnalyticsSessionInfo.id;
projectName = Application.productName;
sceneName = EditorSceneManager.GetActiveScene().name;
UpdateActivity();
EditorApplication.update += Update;
EditorSceneManager.sceneOpened += SceneOpened;
Log("Started!");
}
private static void SceneOpened(UnityEngine.SceneManagement.Scene scene, OpenSceneMode mode)
{
if (resetOnSceneChange)
lastTimestamp = GetTimestamp();
sceneName = EditorSceneManager.GetActiveScene().name;
UpdateActivity();
}
private static void Update()
{
if (discord != null)
discord.RunCallbacks();
}
public static void UpdateActivity()
{
Log("Updating Activity");
if (discord == null)
Init();
projectName = Application.productName;
sceneName = EditorSceneManager.GetActiveScene().name;
var activityManager = discord.GetActivityManager();
Activity activity = new Activity
{
State = showProjectName ? projectName : "",
Details = showSceneName ? sceneName : "",
Timestamps =
{
Start = lastTimestamp
},
Assets =
{
LargeImage = "logo",
LargeText = "Unity " + Application.unityVersion,
SmallImage = "marshmello",
SmallText = "ERP on Unity Asset Store",
},
};
activityManager.UpdateActivity(activity, result =>
{
if (result != Result.Ok)
LogError("Error from discord (" + result.ToString() + ")");
else
Log("Discord Result = " + result.ToString());
});
ERPSettings.SaveSettings();
}
public static long GetTimestamp()
{
if (!resetOnSceneChange)
{
TimeSpan timeSpan = TimeSpan.FromMilliseconds(EditorAnalyticsSessionInfo.elapsedTime);
long timestamp = DateTimeOffset.Now.Add(timeSpan).ToUnixTimeSeconds();
Log("Got time stamp: " + timestamp);
return timestamp;
}
long unixTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
Log("Got time stamp: " + unixTimestamp);
return unixTimestamp;
}
public static void Log(object message)
{
if (debugMode)
Debug.Log(prefix + ": " + message);
}
public static void LogWarning(object message)
{
if (debugMode)
Debug.LogWarning(prefix + ": " + message);
}
public static void LogError(object message)
{
Debug.LogError(prefix + ": " + message);
}
private static bool DiscordRunning()
{
Process[] processes = Process.GetProcessesByName("Discord");
if (processes.Length == 0)
{
processes = Process.GetProcessesByName("DiscordPTB");
if (processes.Length == 0)
{
processes = Process.GetProcessesByName("DiscordCanary");
}
}
if (debugMode)
{
for (int i = 0; i < processes.Length; i++)
{
Log($"({i}/{processes.Length - 1})Found Process {processes[i].ProcessName}");
}
}
return processes.Length != 0;
}
}
}
#endif