-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
Discord.hx
145 lines (120 loc) · 4.44 KB
/
Discord.hx
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
143
144
145
package backend;
import Sys.sleep;
import lime.app.Application;
import hxdiscord_rpc.Discord;
import hxdiscord_rpc.Types;
class DiscordClient
{
public static var isInitialized:Bool = false;
private static final _defaultID:String = "863222024192262205";
public static var clientID(default, set):String = _defaultID;
private static var presence:DiscordRichPresence = DiscordRichPresence.create();
public static function check()
{
if(ClientPrefs.data.discordRPC) initialize();
else if(isInitialized) shutdown();
}
public static function prepare()
{
if (!isInitialized && ClientPrefs.data.discordRPC)
initialize();
Application.current.window.onClose.add(function() {
if(isInitialized) shutdown();
});
}
public dynamic static function shutdown() {
Discord.Shutdown();
isInitialized = false;
}
private static function onReady(request:cpp.RawConstPointer<DiscordUser>):Void {
var requestPtr:cpp.Star<DiscordUser> = cpp.ConstPointer.fromRaw(request).ptr;
if (Std.parseInt(cast(requestPtr.discriminator, String)) != 0) //New Discord IDs/Discriminator system
trace('(Discord) Connected to User (${cast(requestPtr.username, String)}#${cast(requestPtr.discriminator, String)})');
else //Old discriminators
trace('(Discord) Connected to User (${cast(requestPtr.username, String)})');
changePresence();
}
private static function onError(errorCode:Int, message:cpp.ConstCharStar):Void {
trace('Discord: Error ($errorCode: ${cast(message, String)})');
}
private static function onDisconnected(errorCode:Int, message:cpp.ConstCharStar):Void {
trace('Discord: Disconnected ($errorCode: ${cast(message, String)})');
}
public static function initialize()
{
var discordHandlers:DiscordEventHandlers = DiscordEventHandlers.create();
discordHandlers.ready = cpp.Function.fromStaticFunction(onReady);
discordHandlers.disconnected = cpp.Function.fromStaticFunction(onDisconnected);
discordHandlers.errored = cpp.Function.fromStaticFunction(onError);
Discord.Initialize(clientID, cpp.RawPointer.addressOf(discordHandlers), 1, null);
if(!isInitialized) trace("Discord Client initialized");
sys.thread.Thread.create(() ->
{
var localID:String = clientID;
while (localID == clientID)
{
#if DISCORD_DISABLE_IO_THREAD
Discord.UpdateConnection();
#end
Discord.RunCallbacks();
// Wait 0.5 seconds until the next loop...
Sys.sleep(0.5);
}
});
isInitialized = true;
}
public static function changePresence(?details:String = 'In the Menus', ?state:Null<String>, ?smallImageKey : String, ?hasStartTimestamp : Bool, ?endTimestamp: Float)
{
var startTimestamp:Float = 0;
if (hasStartTimestamp) startTimestamp = Date.now().getTime();
if (endTimestamp > 0) endTimestamp = startTimestamp + endTimestamp;
presence.details = details;
presence.state = state;
presence.largeImageKey = 'icon';
presence.largeImageText = "Engine Version: " + states.MainMenuState.psychEngineVersion;
presence.smallImageKey = smallImageKey;
// Obtained times are in milliseconds so they are divided so Discord can use it
presence.startTimestamp = Std.int(startTimestamp / 1000);
presence.endTimestamp = Std.int(endTimestamp / 1000);
updatePresence();
//trace('Discord RPC Updated. Arguments: $details, $state, $smallImageKey, $hasStartTimestamp, $endTimestamp');
}
public static function updatePresence()
Discord.UpdatePresence(cpp.RawConstPointer.addressOf(presence));
public static function resetClientID()
clientID = _defaultID;
private static function set_clientID(newID:String)
{
var change:Bool = (clientID != newID);
clientID = newID;
if(change && isInitialized)
{
shutdown();
initialize();
updatePresence();
}
return newID;
}
#if MODS_ALLOWED
public static function loadModRPC()
{
var pack:Dynamic = Mods.getPack();
if(pack != null && pack.discordRPC != null && pack.discordRPC != clientID)
{
clientID = pack.discordRPC;
//trace('Changing clientID! $clientID, $_defaultID');
}
}
#end
#if LUA_ALLOWED
public static function addLuaCallbacks(lua:State) {
Lua_helper.add_callback(lua, "changeDiscordPresence", function(details:String, state:Null<String>, ?smallImageKey:String, ?hasStartTimestamp:Bool, ?endTimestamp:Float) {
changePresence(details, state, smallImageKey, hasStartTimestamp, endTimestamp);
});
Lua_helper.add_callback(lua, "changeDiscordClientID", function(?newID:String = null) {
if(newID == null) newID = _defaultID;
clientID = newID;
});
}
#end
}