-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Plugin.cs
117 lines (102 loc) · 3.77 KB
/
Plugin.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using BeatSaberMarkupLanguage.Settings;
using bsrpc.UI;
using DataPuller.Data;
using DiscordCore;
using IPA;
using IPA.Config.Stores;
using System;
using UnityEngine;
using IPALogger = IPA.Logging.Logger;
namespace bsrpc
{
[Plugin(RuntimeOptions.SingleStartInit)]
public class Plugin
{
private DiscordInstance _discord;
private DateTime _lastSceneSwitchTime;
private DataMappers.Scenes _lastScene = DataMappers.Scenes.Unknown;
internal static IPALogger Log { get; private set; }
[Init]
/// <summary>
/// Called when the plugin is first loaded by IPA (either when the game starts or when the plugin is enabled if it starts disabled).
/// [Init] methods that use a Constructor or called before regular methods like InitWithConfig.
/// Only use [Init] with one Constructor.
/// </summary>
public void Init(IPALogger logger, IPA.Config.Config conf)
{
Log = logger;
PluginConfig.Instance = conf.Generated<PluginConfig>();
Log.Info("bsrpc initialized.");
}
[OnStart]
public void OnApplicationStart()
{
new GameObject("bsrpcController").AddComponent<BsrpcController>();
MapData.Instance.OnUpdate += UpdateRichPresence;
LiveData.Instance.OnUpdate += UpdateRichPresence;
CreateDiscordManager();
PluginConfig.Instance.OnReloaded += HandleConfigUpdate;
PluginConfig.Instance.OnChanged += HandleConfigUpdate;
}
[OnEnable]
public void OnEnable()
{
BSMLSettings.instance.RemoveSettingsMenu(Settings.instance);
BSMLSettings.instance.AddSettingsMenu("bsrpc", "bsrpc.UI.SettingsViewController.bsml", Settings.instance);
}
[OnDisable]
public void OnDisable()
{
BSMLSettings.instance.RemoveSettingsMenu(Settings.instance);
}
private void HandleConfigUpdate()
{
if (PluginConfig.Instance.DiscordClientId != _discord.settings.appId)
{
// Recreate Discord connection on App ID change
_discord.DestroyInstance();
CreateDiscordManager();
}
// Force update to Rich Presence
UpdateRichPresence();
}
private void CreateDiscordManager()
{
_discord = DiscordManager.instance.CreateInstance(new DiscordSettings
{
appId = PluginConfig.Instance.DiscordClientId,
handleInvites = false,
modId = nameof(bsrpc),
modName = nameof(bsrpc)
});
}
private void UpdateRichPresence(string jsonData)
{
UpdateRichPresence();
}
private void UpdateRichPresence()
{
var activity = DataMappers.GetActivityData();
var currentScene = DataMappers.GetCurrentScene();
if (_lastScene != currentScene)
{
_lastScene = currentScene;
_lastSceneSwitchTime = DateTime.Now;
}
if (PluginConfig.Instance.ShowElapsedTimes && currentScene != DataMappers.Scenes.Playing)
{
activity.Timestamps.Start = DataMappers.DateTimeToUnixTimestamp(_lastSceneSwitchTime);
}
_discord.UpdateActivity(activity);
}
[OnExit]
public void OnApplicationQuit()
{
MapData.Instance.OnUpdate -= UpdateRichPresence;
LiveData.Instance.OnUpdate -= UpdateRichPresence;
PluginConfig.Instance.OnReloaded -= HandleConfigUpdate;
PluginConfig.Instance.OnChanged -= HandleConfigUpdate;
_discord.DestroyInstance();
}
}
}