diff --git a/Discord Media Loader.Application/Classes/RPC/DiscordRpc.cs b/Discord Media Loader.Application/Classes/RPC/DiscordRpc.cs
new file mode 100644
index 0000000..cb50f76
--- /dev/null
+++ b/Discord Media Loader.Application/Classes/RPC/DiscordRpc.cs
@@ -0,0 +1,59 @@
+using System.Runtime.InteropServices;
+
+namespace DML.Application.Classes.RPC
+{
+ // https://github.com/discordapp/discord-rpc/blob/master/examples/button-clicker/Assets/DiscordRpc.cs
+ // Give that man a cookie ^.^
+
+ public class DiscordRpc
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate void ReadyCallback();
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate void DisconnectedCallback(int errorCode, string message);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate void ErrorCallback(int errorCode, string message);
+
+ public struct EventHandlers
+ {
+ public ReadyCallback readyCallback;
+ public DisconnectedCallback disconnectedCallback;
+ public ErrorCallback errorCallback;
+ }
+
+ // Values explanation and example: https://discordapp.com/developers/docs/rich-presence/how-to#updating-presence-update-presence-payload-fields
+ [System.Serializable]
+ public struct RichPresence
+ {
+ public string state; /* max 128 bytes */
+ public string details; /* max 128 bytes */
+ public long startTimestamp;
+ public long endTimestamp;
+ public string largeImageKey; /* max 32 bytes */
+ public string largeImageText; /* max 128 bytes */
+ public string smallImageKey; /* max 32 bytes */
+ public string smallImageText; /* max 128 bytes */
+ public string partyId; /* max 128 bytes */
+ public int partySize;
+ public int partyMax;
+ public string matchSecret; /* max 128 bytes */
+ public string joinSecret; /* max 128 bytes */
+ public string spectateSecret; /* max 128 bytes */
+ public bool instance;
+ }
+
+ [DllImport(RpcWrapper.Dll, EntryPoint = "Discord_Initialize", CallingConvention = CallingConvention.Cdecl)]
+ public static extern void Initialize(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId);
+
+ [DllImport(RpcWrapper.Dll, EntryPoint = "Discord_UpdatePresence", CallingConvention = CallingConvention.Cdecl)]
+ public static extern void UpdatePresence(ref RichPresence presence);
+
+ [DllImport(RpcWrapper.Dll, EntryPoint = "Discord_RunCallbacks", CallingConvention = CallingConvention.Cdecl)]
+ public static extern void RunCallbacks();
+
+ [DllImport(RpcWrapper.Dll, EntryPoint = "Discord_Shutdown", CallingConvention = CallingConvention.Cdecl)]
+ public static extern void Shutdown();
+ }
+}
diff --git a/Discord Media Loader.Application/Classes/RPC/RpcWrapper.cs b/Discord Media Loader.Application/Classes/RPC/RpcWrapper.cs
new file mode 100644
index 0000000..63f027a
--- /dev/null
+++ b/Discord Media Loader.Application/Classes/RPC/RpcWrapper.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace DML.Application.Classes.RPC
+{
+ public class RpcWrapper
+ {
+ public const string Dll = "discord-rpc-win32";
+
+ public RpcWrapper()
+ {
+ if (!File.Exists(Dll + ".dll"))
+ {
+ MessageBox.Show(
+ "Missing " + Dll + ".dll\n\n" +
+ "Grab it from the release on GitHub or from the DiscordRpcDemo/lib/ folder in the repo then put it alongside DiscordRpcDemo.exe.\n\n" +
+ "https://github.com/nostrenz/cshap-discord-rpc-demo"
+ );
+
+ System.Windows.Forms.Application.Exit();
+ }
+ }
+ }
+}
diff --git a/Discord Media Loader.Application/DML.Application.csproj b/Discord Media Loader.Application/DML.Application.csproj
index 02bf1f5..3f6bc4d 100644
--- a/Discord Media Loader.Application/DML.Application.csproj
+++ b/Discord Media Loader.Application/DML.Application.csproj
@@ -161,6 +161,8 @@
+
+
Form