diff --git a/Discord Media Loader.Application/Classes/Core.cs b/Discord Media Loader.Application/Classes/Core.cs
index 99ffc7c..a43a954 100644
--- a/Discord Media Loader.Application/Classes/Core.cs
+++ b/Discord Media Loader.Application/Classes/Core.cs
@@ -8,6 +8,7 @@ using System.Windows.Forms;
using Discord;
using Discord.WebSocket;
using DML.AppCore.Classes;
+using DML.Application.Classes.RPC;
using DML.Application.Dialogs;
using DML.Client;
using LiteDB;
@@ -26,11 +27,14 @@ namespace DML.Application.Classes
internal static LiteDatabase Database { get; set; }
internal static Settings Settings { get; set; }
internal static JobScheduler Scheduler { get; } = new JobScheduler();
- internal static RavenClient Raven = new RavenClient("https://0de964231669473e9098b9f6cc1d6278:79d9f2eb24034de199b2a37cc058e0f2@sentry.io/257114");
-
+ internal static RavenClient Raven { get; } = new RavenClient("https://0de964231669473e9098b9f6cc1d6278:79d9f2eb24034de199b2a37cc058e0f2@sentry.io/257114");
+ internal static bool ShuttingDown { get; private set; } = false;
internal static string DataDirectory
=> Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Serraniel\Discord Media Loader");
+ internal static DiscordRpc.RichPresence RpcPresence;
+ internal static DiscordRpc.EventHandlers RpcHandlers = new DiscordRpc.EventHandlers();
+
public static async Task Run(string[] paramStrings)
{
try
@@ -233,9 +237,33 @@ namespace DML.Application.Classes
}
}
+
Settings.RescanRequired = false;
Settings.Store();
+ if (Settings.UseRPC)
+ {
+ Logger.Info("Initializing RPC client");
+ Logger.Trace("Registering RPC handlers");
+ RpcHandlers.readyCallback += RpcReadyCallback;
+ RpcHandlers.disconnectedCallback += RpcDisconnectedCallback;
+ RpcHandlers.errorCallback += RpcErrorCallback;
+ RpcPresence.startTimestamp = DiscordRpcHelper.DateTimeToTimestamp(DateTime.UtcNow);
+
+ Logger.Debug("Calling RPC initialize");
+ DiscordRpc.Initialize("430025401851707393", ref RpcHandlers, true, null);
+
+ // Do not await ;)
+ Task.Run(async () =>
+ {
+ while (!ShuttingDown)
+ {
+ Logger.Trace("Running RPC callbacks");
+ await Task.Delay(5000);
+ }
+ });
+ }
+
splash.Close();
Logger.Info("Starting scheduler...");
@@ -243,8 +271,14 @@ namespace DML.Application.Classes
System.Windows.Forms.Application.Run(new MainForm());
+ // shutting down
+ ShuttingDown = true;
+
Logger.Info("Stopping scheduler...");
Scheduler.Stop();
+
+ Logger.Info("Shutting down RPC client");
+ DiscordRpc.Shutdown();
}
catch (Exception ex)
{
@@ -272,5 +306,26 @@ namespace DML.Application.Classes
Logger.Trace($"Trying to find channel in {server} by id: {id}");
return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault();
}
+
+ internal static void RpcUpdatePresence()
+ {
+ Logger.Debug("Updating RPC presence");
+ DiscordRpc.UpdatePresence(ref RpcPresence);
+ }
+
+ private static void RpcReadyCallback()
+ {
+ Logger.Debug("RpcReady");
+ }
+
+ private static void RpcDisconnectedCallback(int errorCode, string message)
+ {
+ Logger.Warn($"RPC disconnect received: {errorCode} - {message}");
+ }
+
+ private static void RpcErrorCallback(int errorCode, string message)
+ {
+ Logger.Error($"RPC error received: {errorCode} - {message}");
+ }
}
}
diff --git a/Discord Media Loader.Application/Classes/Job.cs b/Discord Media Loader.Application/Classes/Job.cs
index af7de1e..cd6dbdb 100644
--- a/Discord Media Loader.Application/Classes/Job.cs
+++ b/Discord Media Loader.Application/Classes/Job.cs
@@ -7,6 +7,7 @@ using Discord.WebSocket;
using DML.Application.Classes;
using DML.Client;
using SweetLib.Utils;
+using SweetLib.Utils.Extensions;
using static SweetLib.Utils.Logger.Logger;
namespace DML.AppCore.Classes
@@ -119,8 +120,8 @@ namespace DML.AppCore.Classes
Trace($"Updating lastId ({lastId}) to {m.Id}");
lastId = m.Id;
}
-
- if (SweetUtils.DateTimeToUnixTimeStamp(m.CreatedAt.UtcDateTime) <= StopTimestamp)
+
+ if (m.CreatedAt.UtcDateTime.ToUnixTimeStamp() <= StopTimestamp)
{
Debug("Found a message with a known timestamp...Stopping scan.");
finished = true;
@@ -156,7 +157,7 @@ namespace DML.AppCore.Classes
ChannelId = r.Channel.Id,
DownloadSource = a.Url,
Filename = a.Filename,
- TimeStamp = SweetUtils.DateTimeToUnixTimeStamp(r.CreatedAt.UtcDateTime),
+ TimeStamp = r.CreatedAt.UtcDateTime.ToUnixTimeStamp(),
FileSize = a.Size
};
mediaData.Store();
@@ -166,7 +167,7 @@ namespace DML.AppCore.Classes
if (result.Count > 0)
{
Trace("Updating StopTimestamp for next scan...");
- StopTimestamp = SweetUtils.DateTimeToUnixTimeStamp(result[result.Count - 1].CreatedAt.UtcDateTime);
+ StopTimestamp = result[result.Count - 1].CreatedAt.UtcDateTime.ToUnixTimeStamp();
KnownTimestamp = StopTimestamp;
Store();
}
diff --git a/Discord Media Loader.Application/Classes/JobScheduler.cs b/Discord Media Loader.Application/Classes/JobScheduler.cs
index 48b81b5..21af39c 100644
--- a/Discord Media Loader.Application/Classes/JobScheduler.cs
+++ b/Discord Media Loader.Application/Classes/JobScheduler.cs
@@ -3,6 +3,16 @@ using System.Collections.Generic;
using System.Threading.Tasks;
using Discord;
using DML.AppCore.Classes;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Threading.Tasks;
+using Discord;
+using Discord.WebSocket;
+using DML.Application.Classes;
+using SweetLib.Utils;
+using SweetLib.Utils.Extensions;
using SweetLib.Utils.Logger;
namespace DML.Application.Classes
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/DiscordRpcHelper.cs b/Discord Media Loader.Application/Classes/RPC/DiscordRpcHelper.cs
new file mode 100644
index 0000000..de80a83
--- /dev/null
+++ b/Discord Media Loader.Application/Classes/RPC/DiscordRpcHelper.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DML.Application.Classes.RPC
+{
+ public static class DiscordRpcHelper
+ {
+ public static long DateTimeToTimestamp(DateTime dt)
+ {
+ return (dt.Ticks - 621355968000000000) / 10000000;
+ }
+ }
+}
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/Classes/Settings.cs b/Discord Media Loader.Application/Classes/Settings.cs
index 2a82c60..f6065f1 100644
--- a/Discord Media Loader.Application/Classes/Settings.cs
+++ b/Discord Media Loader.Application/Classes/Settings.cs
@@ -16,6 +16,7 @@ namespace DML.Application.Classes
public bool SkipExistingFiles { get; set; } = true;
public int ThreadLimit { get; set; } = 50;
public bool RescanRequired { get; set; } = true;
+ public bool UseRPC { get; set; } = false;
public void Store()
{
diff --git a/Discord Media Loader.Application/DML.Application.csproj b/Discord Media Loader.Application/DML.Application.csproj
index 443fe3e..a490d32 100644
--- a/Discord Media Loader.Application/DML.Application.csproj
+++ b/Discord Media Loader.Application/DML.Application.csproj
@@ -161,7 +161,10 @@
-
+
+
+
+
Form
diff --git a/Discord Media Loader.Application/MainForm.Designer.cs b/Discord Media Loader.Application/MainForm.Designer.cs
index 4b17af7..d3ea045 100644
--- a/Discord Media Loader.Application/MainForm.Designer.cs
+++ b/Discord Media Loader.Application/MainForm.Designer.cs
@@ -57,6 +57,12 @@
this.btnDelete = new System.Windows.Forms.Button();
this.lbxJobs = new System.Windows.Forms.ListBox();
this.tmrRefreshProgress = new System.Windows.Forms.Timer(this.components);
+ this.lbStatus = new System.Windows.Forms.ToolStripDropDownButton();
+ this.onlineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.doNotDenyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.doNotDisturbToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.invisibleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.tmrTriggerRefresh = new System.Windows.Forms.Timer(this.components);
this.pnlSettings.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.edThreadLimit)).BeginInit();
this.groupBox1.SuspendLayout();
@@ -77,7 +83,7 @@
this.pnlSettings.Dock = System.Windows.Forms.DockStyle.Top;
this.pnlSettings.Location = new System.Drawing.Point(0, 0);
this.pnlSettings.Name = "pnlSettings";
- this.pnlSettings.Size = new System.Drawing.Size(553, 93);
+ this.pnlSettings.Size = new System.Drawing.Size(690, 93);
this.pnlSettings.TabIndex = 0;
this.pnlSettings.TabStop = false;
this.pnlSettings.Text = "Settings";
@@ -113,7 +119,7 @@
//
this.cbSkipExisting.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cbSkipExisting.AutoSize = true;
- this.cbSkipExisting.Location = new System.Drawing.Point(447, 42);
+ this.cbSkipExisting.Location = new System.Drawing.Point(584, 42);
this.cbSkipExisting.Name = "cbSkipExisting";
this.cbSkipExisting.Size = new System.Drawing.Size(106, 17);
this.cbSkipExisting.TabIndex = 5;
@@ -127,7 +133,7 @@
| System.Windows.Forms.AnchorStyles.Right)));
this.edNameScheme.Location = new System.Drawing.Point(113, 39);
this.edNameScheme.Name = "edNameScheme";
- this.edNameScheme.Size = new System.Drawing.Size(328, 20);
+ this.edNameScheme.Size = new System.Drawing.Size(465, 20);
this.edNameScheme.TabIndex = 4;
this.edNameScheme.TextChanged += new System.EventHandler(this.DoSomethingChanged);
//
@@ -143,7 +149,7 @@
// btnSearchFolders
//
this.btnSearchFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.btnSearchFolders.Location = new System.Drawing.Point(522, 11);
+ this.btnSearchFolders.Location = new System.Drawing.Point(659, 11);
this.btnSearchFolders.Name = "btnSearchFolders";
this.btnSearchFolders.Size = new System.Drawing.Size(25, 23);
this.btnSearchFolders.TabIndex = 2;
@@ -157,7 +163,7 @@
| System.Windows.Forms.AnchorStyles.Right)));
this.edOperatingFolder.Location = new System.Drawing.Point(113, 13);
this.edOperatingFolder.Name = "edOperatingFolder";
- this.edOperatingFolder.Size = new System.Drawing.Size(403, 20);
+ this.edOperatingFolder.Size = new System.Drawing.Size(540, 20);
this.edOperatingFolder.TabIndex = 1;
this.edOperatingFolder.TextChanged += new System.EventHandler(this.DoSomethingChanged);
//
@@ -180,7 +186,7 @@
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
this.groupBox1.Location = new System.Drawing.Point(0, 93);
this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(553, 57);
+ this.groupBox1.Size = new System.Drawing.Size(690, 57);
this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Add a job";
@@ -188,7 +194,7 @@
// btnAddJob
//
this.btnAddJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.btnAddJob.Location = new System.Drawing.Point(481, 19);
+ this.btnAddJob.Location = new System.Drawing.Point(618, 19);
this.btnAddJob.Name = "btnAddJob";
this.btnAddJob.Size = new System.Drawing.Size(66, 23);
this.btnAddJob.TabIndex = 4;
@@ -203,7 +209,7 @@
this.cbChannel.FormattingEnabled = true;
this.cbChannel.Location = new System.Drawing.Point(294, 19);
this.cbChannel.Name = "cbChannel";
- this.cbChannel.Size = new System.Drawing.Size(181, 21);
+ this.cbChannel.Size = new System.Drawing.Size(318, 21);
this.cbChannel.TabIndex = 3;
//
// lbChannel
@@ -236,14 +242,15 @@
// statusStrip
//
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.lbStatus,
this.pgbProgress,
this.lbProgress,
this.lblVersionPlaceholder,
this.lbVersion,
this.btnDropDown});
- this.statusStrip.Location = new System.Drawing.Point(0, 311);
+ this.statusStrip.Location = new System.Drawing.Point(0, 393);
this.statusStrip.Name = "statusStrip";
- this.statusStrip.Size = new System.Drawing.Size(553, 22);
+ this.statusStrip.Size = new System.Drawing.Size(690, 22);
this.statusStrip.TabIndex = 2;
this.statusStrip.Text = "statusStrip1";
//
@@ -260,7 +267,7 @@
// lblVersionPlaceholder
//
this.lblVersionPlaceholder.Name = "lblVersionPlaceholder";
- this.lblVersionPlaceholder.Size = new System.Drawing.Size(302, 17);
+ this.lblVersionPlaceholder.Size = new System.Drawing.Size(426, 17);
this.lblVersionPlaceholder.Spring = true;
//
// lbVersion
@@ -301,7 +308,7 @@
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox2.Location = new System.Drawing.Point(0, 150);
this.groupBox2.Name = "groupBox2";
- this.groupBox2.Size = new System.Drawing.Size(553, 161);
+ this.groupBox2.Size = new System.Drawing.Size(690, 243);
this.groupBox2.TabIndex = 3;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Jobs";
@@ -309,9 +316,9 @@
// btnDelete
//
this.btnDelete.Dock = System.Windows.Forms.DockStyle.Bottom;
- this.btnDelete.Location = new System.Drawing.Point(3, 135);
+ this.btnDelete.Location = new System.Drawing.Point(3, 217);
this.btnDelete.Name = "btnDelete";
- this.btnDelete.Size = new System.Drawing.Size(547, 23);
+ this.btnDelete.Size = new System.Drawing.Size(684, 23);
this.btnDelete.TabIndex = 1;
this.btnDelete.Text = "Delete selected";
this.btnDelete.UseVisualStyleBackColor = true;
@@ -325,7 +332,7 @@
this.lbxJobs.FormattingEnabled = true;
this.lbxJobs.Location = new System.Drawing.Point(6, 19);
this.lbxJobs.Name = "lbxJobs";
- this.lbxJobs.Size = new System.Drawing.Size(541, 108);
+ this.lbxJobs.Size = new System.Drawing.Size(678, 186);
this.lbxJobs.TabIndex = 0;
//
// tmrRefreshProgress
@@ -334,11 +341,55 @@
this.tmrRefreshProgress.Interval = 500;
this.tmrRefreshProgress.Tick += new System.EventHandler(this.tmrRefreshProgress_Tick);
//
+ // lbStatus
+ //
+ this.lbStatus.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.invisibleToolStripMenuItem,
+ this.doNotDisturbToolStripMenuItem,
+ this.doNotDenyToolStripMenuItem,
+ this.onlineToolStripMenuItem});
+ this.lbStatus.Name = "lbStatus";
+ this.lbStatus.Size = new System.Drawing.Size(13, 20);
+ this.lbStatus.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.toolStripDropDownButton1_DropDownItemClicked);
+ //
+ // onlineToolStripMenuItem
+ //
+ this.onlineToolStripMenuItem.Name = "onlineToolStripMenuItem";
+ this.onlineToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.onlineToolStripMenuItem.Tag = "0";
+ this.onlineToolStripMenuItem.Text = "Online";
+ //
+ // doNotDenyToolStripMenuItem
+ //
+ this.doNotDenyToolStripMenuItem.Name = "doNotDenyToolStripMenuItem";
+ this.doNotDenyToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.doNotDenyToolStripMenuItem.Tag = "1";
+ this.doNotDenyToolStripMenuItem.Text = "Idle";
+ //
+ // doNotDisturbToolStripMenuItem
+ //
+ this.doNotDisturbToolStripMenuItem.Name = "doNotDisturbToolStripMenuItem";
+ this.doNotDisturbToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.doNotDisturbToolStripMenuItem.Tag = "2";
+ this.doNotDisturbToolStripMenuItem.Text = "Do not disturb";
+ //
+ // invisibleToolStripMenuItem
+ //
+ this.invisibleToolStripMenuItem.Name = "invisibleToolStripMenuItem";
+ this.invisibleToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.invisibleToolStripMenuItem.Tag = "3";
+ this.invisibleToolStripMenuItem.Text = "Invisible";
+ //
+ // tmrTriggerRefresh
+ //
+ this.tmrTriggerRefresh.Interval = 5000;
+ this.tmrTriggerRefresh.Tick += new System.EventHandler(this.tmrTriggerRefresh_Tick);
+ //
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(553, 333);
+ this.ClientSize = new System.Drawing.Size(690, 415);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.statusStrip);
this.Controls.Add(this.groupBox1);
@@ -391,5 +442,11 @@
private System.Windows.Forms.ToolStripSplitButton btnDropDown;
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem visitGithubToolStripMenuItem;
+ private System.Windows.Forms.ToolStripDropDownButton lbStatus;
+ private System.Windows.Forms.ToolStripMenuItem invisibleToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem doNotDisturbToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem doNotDenyToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem onlineToolStripMenuItem;
+ private System.Windows.Forms.Timer tmrTriggerRefresh;
}
}
\ No newline at end of file
diff --git a/Discord Media Loader.Application/MainForm.cs b/Discord Media Loader.Application/MainForm.cs
index 20b91ba..87aa8e9 100644
--- a/Discord Media Loader.Application/MainForm.cs
+++ b/Discord Media Loader.Application/MainForm.cs
@@ -2,18 +2,30 @@
using System.Diagnostics;
using System.Linq;
using System.Reflection;
+using System.Threading.Tasks;
using System.Windows.Forms;
+using Discord;
using Discord.WebSocket;
using DML.AppCore.Classes;
using DML.Application.Classes;
+using DML.Application.Classes.RPC;
using DML.Client;
using static SweetLib.Utils.Logger.Logger;
namespace DML.Application
{
+ enum OnlineState
+ {
+ Online,
+ Idle,
+ DoNotDisturb,
+ Invisible
+ }
public partial class MainForm : Form
{
private bool IsInitialized { get; set; } = false;
+ private DiscordRpc.RichPresence Presence { get; }
+
public MainForm()
{
InitializeComponent();
@@ -31,7 +43,7 @@ namespace DML.Application
{
Debug("Refreshing components...");
- lbVersion.Text = $"v{Assembly.GetExecutingAssembly().GetName().Version} Copyright © by Serraniel";
+ lbVersion.Text = $"v{Assembly.GetExecutingAssembly().GetName().Version} Copyright © by Serraniel";
Trace("Refreshing operating folder component...");
edOperatingFolder.Text = Core.Settings.OperatingFolder;
@@ -62,6 +74,8 @@ namespace DML.Application
$"{FindServerById(job.GuildId)?.Name}:{FindChannelById(FindServerById(job.GuildId), job.ChannelId)?.Name}");
}
lbxJobs.SelectedIndex = oldIndex;
+
+ lbStatus.Text = DMLClient.Client.CurrentUser.Status.ToString();
}
private void DoSomethingChanged(object sender, System.EventArgs e)
@@ -237,6 +251,18 @@ namespace DML.Application
pgbProgress.Value = progress;
lbProgress.Text = $"Scanned: {scanned} Downloaded: {done} Open: {totalAttachments - done}";
+
+ if (Core.Settings.UseRPC)
+ {
+ Core.RpcPresence.details = "Downloading media files";
+ Core.RpcPresence.state = $"{done} / {totalAttachments} ({pgbProgress.Value}%)";
+ Core.RpcPresence.largeImageKey = "main";
+ Core.RpcPresence.largeImageText = "Visit discordmedialoader.net";
+ Core.RpcPresence.smallImageKey = "author";
+ Core.RpcPresence.smallImageText = "Made by Serraniel";
+
+ Core.RpcUpdatePresence();
+ }
}
private void aboutToolStripMenuItem_Click(object sender, System.EventArgs e)
@@ -248,5 +274,35 @@ namespace DML.Application
{
Process.Start("https://github.com/Serraniel/DiscordMediaLoader/");
}
+
+ private async void toolStripDropDownButton1_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
+ {
+ OnlineState state = (OnlineState)Convert.ToInt32(e.ClickedItem.Tag);
+
+ lbStatus.Text = state.ToString();
+ tmrTriggerRefresh.Start();
+
+ switch (state)
+ {
+ case OnlineState.Online:
+ await DMLClient.Client.SetStatusAsync(UserStatus.Online);
+ break;
+ case OnlineState.Idle:
+ await DMLClient.Client.SetStatusAsync(UserStatus.Idle);
+ break;
+ case OnlineState.DoNotDisturb:
+ await DMLClient.Client.SetStatusAsync(UserStatus.DoNotDisturb);
+ break;
+ case OnlineState.Invisible:
+ await DMLClient.Client.SetStatusAsync(UserStatus.Invisible);
+ break;
+ }
+ }
+
+ private void tmrTriggerRefresh_Tick(object sender, EventArgs e)
+ {
+ lbStatus.Text = DMLClient.Client.CurrentUser.Status.ToString();
+ tmrTriggerRefresh.Stop();
+ }
}
}
diff --git a/Discord Media Loader.Application/MainForm.resx b/Discord Media Loader.Application/MainForm.resx
index 7c9ffe0..ef73655 100644
--- a/Discord Media Loader.Application/MainForm.resx
+++ b/Discord Media Loader.Application/MainForm.resx
@@ -123,6 +123,9 @@
126, 17
+
+ 284, 17
+
diff --git a/Discord Media Loader.Application/Properties/AssemblyInfo.cs b/Discord Media Loader.Application/Properties/AssemblyInfo.cs
index 3d45ed6..c65716e 100644
--- a/Discord Media Loader.Application/Properties/AssemblyInfo.cs
+++ b/Discord Media Loader.Application/Properties/AssemblyInfo.cs
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.2.0")]
-[assembly: AssemblyFileVersion("1.0.2.0")]
+[assembly: AssemblyVersion("1.1.0.0")]
+[assembly: AssemblyFileVersion("1.1.0.0")]
diff --git a/Discord Media Loader/FrmSplash.cs b/Discord Media Loader/FrmSplash.cs
index adb2043..59f4ccf 100644
--- a/Discord Media Loader/FrmSplash.cs
+++ b/Discord Media Loader/FrmSplash.cs
@@ -15,6 +15,7 @@ namespace Discord_Media_Loader
private async void FrmSplash_Shown(object sender, EventArgs e)
{
+#if !DEBUG
UseWaitCursor = true;
try
{
@@ -52,6 +53,7 @@ namespace Discord_Media_Loader
{
UseWaitCursor = false;
}
+#endif
DialogResult = DialogResult.OK;
}
diff --git a/Discord Media Loader/bin/Debug/discord-rpc-win32.dll b/Discord Media Loader/bin/Debug/discord-rpc-win32.dll
new file mode 100644
index 0000000..c77f6d5
Binary files /dev/null and b/Discord Media Loader/bin/Debug/discord-rpc-win32.dll differ