Fix : No more messages after leaving play mode
This commit is contained in:
@@ -10,25 +10,52 @@ using UnityEngine;
|
|||||||
[InitializeOnLoad]
|
[InitializeOnLoad]
|
||||||
public static class SceneNotifier
|
public static class SceneNotifier
|
||||||
{
|
{
|
||||||
// Replace with your Discord webhook URL
|
private static readonly string WebhookUrl = "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN";
|
||||||
private static readonly string WebhookUrl = "https://discord.com/api/webhooks/1486718530765328424/42mP_zYNTEwwBbc_lcuasPbpZppXoC4U14-Pde1YatdxatT5s9vml8lgQXTwAmm0PNe5";
|
|
||||||
|
|
||||||
private static readonly string UserName = Environment.UserName;
|
private static readonly string UserName = Environment.UserName;
|
||||||
private static readonly string MachineName = Environment.MachineName;
|
private static readonly string MachineName = Environment.MachineName;
|
||||||
private static readonly HttpClient Http = new HttpClient();
|
private static readonly HttpClient Http = new HttpClient();
|
||||||
|
|
||||||
// Key = full scene path, Value = opened timestamp
|
|
||||||
private static readonly Dictionary<string, DateTime> OpenScenes = new Dictionary<string, DateTime>();
|
private static readonly Dictionary<string, DateTime> OpenScenes = new Dictionary<string, DateTime>();
|
||||||
|
|
||||||
|
// Suppresses fake open/close events caused by Play Mode transitions
|
||||||
|
private static bool SuppressSceneEvents = false;
|
||||||
|
|
||||||
static SceneNotifier()
|
static SceneNotifier()
|
||||||
{
|
{
|
||||||
EditorSceneManager.sceneOpened += OnSceneOpened;
|
EditorSceneManager.sceneOpened += OnSceneOpened;
|
||||||
EditorSceneManager.sceneClosed += OnSceneClosed;
|
EditorSceneManager.sceneClosed += OnSceneClosed;
|
||||||
EditorApplication.quitting += OnEditorQuitting;
|
EditorApplication.quitting += OnEditorQuitting;
|
||||||
|
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnPlayModeStateChanged(PlayModeStateChange state)
|
||||||
|
{
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case PlayModeStateChange.ExitingEditMode:
|
||||||
|
case PlayModeStateChange.EnteredPlayMode:
|
||||||
|
case PlayModeStateChange.ExitingPlayMode:
|
||||||
|
case PlayModeStateChange.EnteredEditMode:
|
||||||
|
SuppressSceneEvents = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-enable notifications shortly after returning to edit mode
|
||||||
|
if (state == PlayModeStateChange.EnteredEditMode)
|
||||||
|
{
|
||||||
|
EditorApplication.delayCall += () =>
|
||||||
|
{
|
||||||
|
SuppressSceneEvents = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnSceneOpened(UnityEngine.SceneManagement.Scene scene, OpenSceneMode mode)
|
private static void OnSceneOpened(UnityEngine.SceneManagement.Scene scene, OpenSceneMode mode)
|
||||||
{
|
{
|
||||||
|
if (SuppressSceneEvents || EditorApplication.isPlayingOrWillChangePlaymode)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!IsTrackableScene(scene))
|
if (!IsTrackableScene(scene))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -49,6 +76,9 @@ public static class SceneNotifier
|
|||||||
|
|
||||||
private static void OnSceneClosed(UnityEngine.SceneManagement.Scene scene)
|
private static void OnSceneClosed(UnityEngine.SceneManagement.Scene scene)
|
||||||
{
|
{
|
||||||
|
if (SuppressSceneEvents || EditorApplication.isPlayingOrWillChangePlaymode)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!IsTrackableScene(scene))
|
if (!IsTrackableScene(scene))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -71,19 +101,6 @@ public static class SceneNotifier
|
|||||||
OpenScenes.Remove(scenePath);
|
OpenScenes.Remove(scenePath);
|
||||||
_ = SendDiscordMessage(message);
|
_ = SendDiscordMessage(message);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// Safety fallback in case Unity reports a close for a scene we did not track
|
|
||||||
string message =
|
|
||||||
$"🔓 **Scene Released**\n" +
|
|
||||||
$"👤 **{UserName}**\n" +
|
|
||||||
$"💻 **{MachineName}**\n" +
|
|
||||||
$"📁 `{FormatPath(scenePath)}`\n" +
|
|
||||||
$"🕒 Closed: **{FormatDateTime(closedAt)}**\n" +
|
|
||||||
$"⏱ Stayed on scene: **unknown**";
|
|
||||||
|
|
||||||
_ = SendDiscordMessage(message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnEditorQuitting()
|
private static void OnEditorQuitting()
|
||||||
@@ -91,19 +108,8 @@ public static class SceneNotifier
|
|||||||
DateTime quitAt = DateTime.Now;
|
DateTime quitAt = DateTime.Now;
|
||||||
|
|
||||||
if (OpenScenes.Count == 0)
|
if (OpenScenes.Count == 0)
|
||||||
{
|
|
||||||
string message =
|
|
||||||
$"❌ **Unity Closed**\n" +
|
|
||||||
$"👤 **{UserName}**\n" +
|
|
||||||
$"💻 **{MachineName}**\n" +
|
|
||||||
$"🕒 Closed Unity: **{FormatDateTime(quitAt)}**\n" +
|
|
||||||
$"📂 No tracked open scenes";
|
|
||||||
|
|
||||||
_ = SendDiscordMessage(message);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
// Copy first so we can safely clear afterward
|
|
||||||
var scenesToRelease = new List<KeyValuePair<string, DateTime>>(OpenScenes);
|
var scenesToRelease = new List<KeyValuePair<string, DateTime>>(OpenScenes);
|
||||||
|
|
||||||
foreach (var kvp in scenesToRelease)
|
foreach (var kvp in scenesToRelease)
|
||||||
@@ -129,7 +135,6 @@ public static class SceneNotifier
|
|||||||
|
|
||||||
private static bool IsTrackableScene(UnityEngine.SceneManagement.Scene scene)
|
private static bool IsTrackableScene(UnityEngine.SceneManagement.Scene scene)
|
||||||
{
|
{
|
||||||
// Prevent false notifications on startup / editor internals / untitled scenes
|
|
||||||
if (string.IsNullOrWhiteSpace(scene.path))
|
if (string.IsNullOrWhiteSpace(scene.path))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -170,11 +175,7 @@ public static class SceneNotifier
|
|||||||
using var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
|
using var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
|
||||||
using var response = await Http.PostAsync(WebhookUrl, httpContent);
|
using var response = await Http.PostAsync(WebhookUrl, httpContent);
|
||||||
|
|
||||||
if (response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
|
||||||
Debug.Log($"[SceneNotifier] Sent to Discord:\n{content}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
string responseBody = await response.Content.ReadAsStringAsync();
|
string responseBody = await response.Content.ReadAsStringAsync();
|
||||||
Debug.LogWarning(
|
Debug.LogWarning(
|
||||||
|
|||||||
Reference in New Issue
Block a user