1 using UnityEngine;
2 
3 [System.Serializable]
4 public class DiscordJoinEvent : UnityEngine.Events.UnityEvent<string> { }
5 
6 [System.Serializable]
7 public class DiscordSpectateEvent : UnityEngine.Events.UnityEvent<string> { }
8 
9 [System.Serializable]
10 public class DiscordJoinRequestEvent : UnityEngine.Events.UnityEvent<DiscordRpc.DiscordUser> { }
11 
12 public class DiscordController : MonoBehaviour
13 {
14     public DiscordRpc.RichPresence presence = new DiscordRpc.RichPresence();
15     public string applicationId;
16     public string optionalSteamId;
17     public int clickCounter;
18     public DiscordRpc.DiscordUser joinRequest;
19     public UnityEngine.Events.UnityEvent onConnect;
20     public UnityEngine.Events.UnityEvent onDisconnect;
21     public UnityEngine.Events.UnityEvent hasResponded;
22     public DiscordJoinEvent onJoin;
23     public DiscordJoinEvent onSpectate;
24     public DiscordJoinRequestEvent onJoinRequest;
25 
26     DiscordRpc.EventHandlers handlers;
27 
OnClick()28     public void OnClick()
29     {
30         Debug.Log("Discord: on click!");
31         clickCounter++;
32 
33         presence.details = string.Format("Button clicked {0} times", clickCounter);
34 
35         DiscordRpc.UpdatePresence(presence);
36     }
37 
RequestRespondYes()38     public void RequestRespondYes()
39     {
40         Debug.Log("Discord: responding yes to Ask to Join request");
41         DiscordRpc.Respond(joinRequest.userId, DiscordRpc.Reply.Yes);
42         hasResponded.Invoke();
43     }
44 
RequestRespondNo()45     public void RequestRespondNo()
46     {
47         Debug.Log("Discord: responding no to Ask to Join request");
48         DiscordRpc.Respond(joinRequest.userId, DiscordRpc.Reply.No);
49         hasResponded.Invoke();
50     }
51 
ReadyCallback(ref DiscordRpc.DiscordUser connectedUser)52     public void ReadyCallback(ref DiscordRpc.DiscordUser connectedUser)
53     {
54         Debug.Log(string.Format("Discord: connected to {0}#{1}: {2}", connectedUser.username, connectedUser.discriminator, connectedUser.userId));
55         onConnect.Invoke();
56     }
57 
DisconnectedCallback(int errorCode, string message)58     public void DisconnectedCallback(int errorCode, string message)
59     {
60         Debug.Log(string.Format("Discord: disconnect {0}: {1}", errorCode, message));
61         onDisconnect.Invoke();
62     }
63 
ErrorCallback(int errorCode, string message)64     public void ErrorCallback(int errorCode, string message)
65     {
66         Debug.Log(string.Format("Discord: error {0}: {1}", errorCode, message));
67     }
68 
JoinCallback(string secret)69     public void JoinCallback(string secret)
70     {
71         Debug.Log(string.Format("Discord: join ({0})", secret));
72         onJoin.Invoke(secret);
73     }
74 
SpectateCallback(string secret)75     public void SpectateCallback(string secret)
76     {
77         Debug.Log(string.Format("Discord: spectate ({0})", secret));
78         onSpectate.Invoke(secret);
79     }
80 
RequestCallback(ref DiscordRpc.DiscordUser request)81     public void RequestCallback(ref DiscordRpc.DiscordUser request)
82     {
83         Debug.Log(string.Format("Discord: join request {0}#{1}: {2}", request.username, request.discriminator, request.userId));
84         joinRequest = request;
85         onJoinRequest.Invoke(request);
86     }
87 
Start()88     void Start()
89     {
90     }
91 
Update()92     void Update()
93     {
94         DiscordRpc.RunCallbacks();
95     }
96 
OnEnable()97     void OnEnable()
98     {
99         Debug.Log("Discord: init");
100         handlers = new DiscordRpc.EventHandlers();
101         handlers.readyCallback += ReadyCallback;
102         handlers.disconnectedCallback += DisconnectedCallback;
103         handlers.errorCallback += ErrorCallback;
104         handlers.joinCallback += JoinCallback;
105         handlers.spectateCallback += SpectateCallback;
106         handlers.requestCallback += RequestCallback;
107         DiscordRpc.Initialize(applicationId, ref handlers, true, optionalSteamId);
108     }
109 
OnDisable()110     void OnDisable()
111     {
112         Debug.Log("Discord: shutdown");
113         DiscordRpc.Shutdown();
114     }
115 
OnDestroy()116     void OnDestroy()
117     {
118 
119     }
120 }
121