-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRichPresence.cs
142 lines (120 loc) · 4.7 KB
/
RichPresence.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using BepInEx;
using Oc;
using System;
using UnityEngine.SceneManagement;
using UniRx;
using Oc.Dungeon;
namespace CraftopiaDiscord
{
[BepInPlugin("dev.lone.craftopia.discordrichpresence", "Craftopia DiscordRichPresence", "1.0.1")]
[BepInProcess("Craftopia.exe")]
public class RichPresence : BaseUnityPlugin
{
long CLIENT_ID = 759792773087363094;
Discord.Discord discord;
long startTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
void Awake()
{
DontDestroyOnLoad(this.gameObject);
discord = new Discord.Discord(CLIENT_ID, (UInt64)Discord.CreateFlags.NoRequireDiscord);
RefreshAndSendActivity();
SceneManager.activeSceneChanged += SceneManager_activeSceneChanged;
}
void Update()
{
discord.RunCallbacks();
}
private void SceneManager_activeSceneChanged(Scene oldScene, Scene newScene)
{
UnityEngine.Debug.Log("--- Changed scene: " + newScene.name);
RefreshAndSendActivity();
if (NetWrapper.LocalPlayer.IsValid)
{
NetWrapper.LocalPlayer.Stats.RegisterAddExpCallback((long exp) => {
UnityEngine.Debug.Log($"AddExpEvent +{exp}");
RefreshAndSendActivity();
});
UnityEngine.Debug.Log("------ Registered AddExpEvent");
NetWrapper.LocalPlayer.RegisterEnterExitDungeonCallback((int dungeonIndex) => {
if(NetWrapper.LocalPlayer.GetDungeonData(dungeonIndex) == null)
UnityEngine.Debug.Log($"ExitDungeon");
else
UnityEngine.Debug.Log($"EnterDungeon: {NetWrapper.LocalPlayer.GetDungeonData(dungeonIndex).DungeonName}");
RefreshAndSendActivity();
});
UnityEngine.Debug.Log("------ Registered EnterDungeon");
}
}
private Discord.Activity BuildActivity()
{
var activity = new Discord.Activity
{
Details = GetGameDetails(), //top
State = GetGameState(), //bottom
Assets = new Discord.ActivityAssets
{
LargeImage = GetLargeImage()
},
Timestamps = new Discord.ActivityTimestamps
{
Start = startTime
}
};
if(NetWrapper.LocalPlayer.IsInsideADungeon)
{
activity.Assets.SmallImage = "main";
activity.Assets.SmallText = NetWrapper.LocalPlayer.CurrentDungeon.DungeonName;
}
else
{
activity.Assets.SmallImage = null;
activity.Assets.SmallText = null;
}
return activity;
}
private void RefreshAndSendActivity()
{
discord.GetActivityManager().UpdateActivity(BuildActivity(), (res) => {
if (res != Discord.Result.Ok)
UnityEngine.Debug.LogError("Error setting Discord Presence: " + res.ToString());
});
}
private string GetLargeImage()
{
if(NetWrapper.LocalPlayer.IsInsideADungeon)
{
return "dungeon";
}
return "main";
}
private string GetGameDetails()
{
string scene = SceneManager.GetActiveScene().name;
switch (scene)
{
case "OcScene_Home":
return "Main menu";
case "OcScene_Setting":
return "Loading...";
//case "OcScene_DevTest_yohei_Tutorial_0728_MS": //first island scene
// return null;
default:
return $"Level {NetWrapper.LocalPlayer.Stats.Level} ({NetWrapper.LocalPlayer.Stats.PlayerExp}/{NetWrapper.LocalPlayer.Stats.PlayerNextLevelExp}xp)";
}
}
private string GetGameState()
{
string scene = SceneManager.GetActiveScene().name;
switch (scene)
{
case "OcScene_Home":
case "OcScene_Setting":
return "";
//case "OcScene_DevTest_yohei_Tutorial_0728_MS": //first island scene
default:
string currentActivity = (NetWrapper.LocalPlayer.IsInsideADungeon ? "In a Dungeon" : (NetWrapper.IsMultiplayer ? "Multiplayer" : "Singleplayer"));
return $"{currentActivity} {(NetWrapper.IsMultiplayer ? $"({NetWrapper.ConnectedPlayersCount} of {NetWrapper.MaxPlayers})" : "")}";
}
}
}
}