Files
crtr/Assets/Cryville/Crtr/DiscordController.cs
2023-11-29 13:12:19 +08:00

108 lines
2.4 KiB
C#

#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
#define COMPILE
#endif
#if COMPILE
using Discord;
using System;
#endif
using Cryville.Common.Unity;
namespace Cryville.Crtr {
internal class DiscordController : SingletonBehaviour<DiscordController> {
#if COMPILE
const long CLIENT_ID = 1059021675578007622L;
Discord.Discord dc;
ActivityManager am;
long launchTime;
void Start() {
launchTime = (long)(DateTime.UtcNow - DateTime.UnixEpoch).TotalSeconds;
try {
dc = new Discord.Discord(CLIENT_ID, (UInt64)CreateFlags.NoRequireDiscord);
Game.MainLogger.Log(1, "Discord", "Connected to Discord");
am = dc.GetActivityManager();
SetIdle();
}
catch (ResultException) {
if (dc != null) {
dc.Dispose();
dc = null;
}
Game.MainLogger.Log(3, "Discord", "Cannot connect to Discord");
}
}
void Update() {
if (dc == null) return;
try {
dc.RunCallbacks();
}
catch (ResultException ex) {
dc.Dispose();
dc = null;
Game.MainLogger.Log(4, "Discord", "An error occurred while running callbacks: {0}", ex);
}
}
void OnApplicationQuit() {
if (dc == null) return;
dc.Dispose();
}
void Callback(Result result) { }
public void SetIdle() {
if (dc == null) return;
am.UpdateActivity(new Activity {
State = "Idle",
Instance = false,
Timestamps = { Start = launchTime },
}, Callback);
}
string _detail;
double? _duration;
public void SetPlaying(string detail, double? duration) {
if (dc == null) return;
_detail = detail;
_duration = duration;
long now = (long)(DateTime.UtcNow - DateTime.UnixEpoch).TotalSeconds;
am.UpdateActivity(new Activity {
State = "Playing a chart",
Details = _detail,
Instance = true,
Timestamps = {
Start = now,
End = _duration == null ? 0 : now + (long)_duration,
},
}, Callback);
}
public void SetPaused() {
if (dc == null) return;
am.UpdateActivity(new Activity {
State = "Playing a chart (Paused)",
Details = _detail,
Instance = true,
}, Callback);
}
public void SetResume(double timestamp) {
if (dc == null) return;
long now = (long)(DateTime.UtcNow - DateTime.UnixEpoch).TotalSeconds;
am.UpdateActivity(new Activity {
State = "Playing a chart",
Details = _detail,
Instance = true,
Timestamps = {
Start = now - (long)timestamp,
End = _duration == null ? 0 : now + (long)_duration - (long)timestamp,
},
}, Callback);
}
#endif
}
}