From 221b2bdff99d043e1cccd334037d1431b4af6708 Mon Sep 17 00:00:00 2001 From: Serraniel Date: Mon, 25 Sep 2017 19:50:59 +0200 Subject: [PATCH 1/8] Semi upgraded to new Discord.Net --- .../Classes/Job.cs | 27 +-- .../Classes/JobScheduler.cs | 33 ++- Discord Media Loader.Application/Core.cs | 70 +++--- .../DML.Application.csproj | 96 +++++++- .../Dialogs/LoginDialog.Designer.cs | 209 ++++-------------- .../Dialogs/LoginDialog.cs | 10 - Discord Media Loader.Application/MainForm.cs | 15 +- Discord Media Loader.Application/app.config | 19 ++ .../packages.config | 61 ++++- Discord Media Loader/App.config | 20 +- Discord Media Loader/FrmSplash.cs | 4 +- 11 files changed, 315 insertions(+), 249 deletions(-) create mode 100644 Discord Media Loader.Application/app.config diff --git a/Discord Media Loader.Application/Classes/Job.cs b/Discord Media Loader.Application/Classes/Job.cs index 78ed1c8..7132cee 100644 --- a/Discord Media Loader.Application/Classes/Job.cs +++ b/Discord Media Loader.Application/Classes/Job.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Discord; +using Discord.WebSocket; using SweetLib.Utils; using static SweetLib.Utils.Logger.Logger; @@ -47,22 +48,22 @@ namespace DML.Application.Classes jobDb.Delete(Id); } - private Server FindServerById(ulong id) + private SocketGuild FindServerById(ulong id) { Trace($"Trying to find server by Id: {id}"); - return (from s in Core.Client.Servers where s.Id == id select s).FirstOrDefault(); + return (from s in Core.Client.Guilds where s.Id == id select s).FirstOrDefault(); } - private Channel FindChannelById(Server server, ulong id) + private SocketTextChannel FindChannelById(SocketGuild server, ulong id) { Trace($"Trying to find channel in {server} by id: {id}"); return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault(); } - internal async Task> Scan() + internal async Task> Scan() { Debug($"Starting scan of guild {GuildId} channel {ChannelId}..."); - var result = new List(); + var result = new List(); var limit = 100; var lastId = ulong.MaxValue; @@ -79,16 +80,16 @@ namespace DML.Application.Classes while (!finished) { Trace("Entering scanning loop..."); - Message[] messages; + SocketMessage[] messages; Trace($"Downloading next {limit} messages..."); if (isFirst) { - messages = await channel.DownloadMessages(limit, null); + messages = await channel.GetMessagesAsync(limit).ToArray() as SocketMessage[]; } else { - messages = await channel.DownloadMessages(limit, lastId); + messages = await channel.GetMessagesAsync(lastId, Direction.Before, limit).ToArray() as SocketMessage[]; } Trace($"Downloaded {messages.Length} messages."); @@ -106,15 +107,15 @@ namespace DML.Application.Classes lastId = m.Id; } - if (SweetUtils.DateTimeToUnixTimeStamp(m.Timestamp) <= StopTimestamp) + if (SweetUtils.DateTimeToUnixTimeStamp(m.CreatedAt.UtcDateTime) <= StopTimestamp) { Debug("Found a message with a known timestamp...Stopping scan."); finished = true; continue; } - Trace($"Message {m.Id} has {m.Attachments.Length} attachments."); - if (m.Attachments.Length > 0) + Trace($"Message {m.Id} has {m.Attachments.Count} attachments."); + if (m.Attachments.Count > 0) { result.Add(m); Core.Scheduler.TotalAttachments++; @@ -130,12 +131,12 @@ namespace DML.Application.Classes Trace($"Downloaded all messages for guild {GuildId} channel {ChannelId}."); Trace("Sorting messages..."); - result.Sort((a, b) => DateTime.Compare(a.Timestamp, b.Timestamp)); + result.Sort((a, b) => DateTime.Compare(a.CreatedAt.UtcDateTime, b.CreatedAt.UtcDateTime)); if (result.Count > 0) { Trace("Updating StopTimestamp for next scan..."); - StopTimestamp = SweetUtils.DateTimeToUnixTimeStamp(result[result.Count - 1].Timestamp); + StopTimestamp = SweetUtils.DateTimeToUnixTimeStamp(result[result.Count - 1].CreatedAt.UtcDateTime); } Debug($"Fisnished scan of guild {GuildId} channel {ChannelId}."); diff --git a/Discord Media Loader.Application/Classes/JobScheduler.cs b/Discord Media Loader.Application/Classes/JobScheduler.cs index f5eefcf..3340089 100644 --- a/Discord Media Loader.Application/Classes/JobScheduler.cs +++ b/Discord Media Loader.Application/Classes/JobScheduler.cs @@ -8,6 +8,8 @@ using System.Net; using System.Text; using System.Threading.Tasks; using Discord; +using Discord.Rpc; +using Discord.WebSocket; using SweetLib.Utils; using static SweetLib.Utils.Logger.Logger; @@ -21,7 +23,7 @@ namespace DML.Application.Classes private bool Run { get; set; } = false; internal List JobList { get; set; } = new List(); - internal Dictionary> RunningJobs = new Dictionary>(); + internal Dictionary> RunningJobs = new Dictionary>(); internal int RunningThreads { get; set; } = 0; internal ulong MessagesScanned @@ -96,7 +98,7 @@ namespace DML.Application.Classes { Debug("Entering job list handler loop..."); //foreach (var job in JobList) - for(var i = JobList.Count-1;i>=0;i--) + for (var i = JobList.Count - 1; i >= 0; i--) { var job = JobList[i]; Debug($"Checking job {job}"); @@ -113,7 +115,7 @@ namespace DML.Application.Classes if (!hasJob) { Debug("Job is not performed yet...Performing job..."); - var queue = new Queue(); + var queue = new Queue(); Trace("Locking scheduler..."); lock (this) @@ -126,7 +128,7 @@ namespace DML.Application.Classes Trace("Issuing job message scan..."); var messages = await job.Scan(); - if(messages==null) + if (messages == null) continue; Trace($"Adding {messages.Count} messages to queue..."); @@ -180,7 +182,7 @@ namespace DML.Application.Classes } Trace("Found job."); - Queue queue; + Queue queue; Trace("Locking scheduler..."); lock (this) { @@ -213,7 +215,7 @@ namespace DML.Application.Classes Trace("Dequeueing message..."); var message = queue.Dequeue(); - Debug($"Attachments for message {message.Id}: {message.Attachments.Length}"); + Debug($"Attachments for message {message.Id}: {message.Attachments.Count}"); foreach (var a in message.Attachments) { try @@ -224,18 +226,27 @@ namespace DML.Application.Classes var extensionRequired = !fileName.EndsWith("%name%"); + var serverName = "unknown"; + + var socketTextChannel = message.Channel as SocketTextChannel; + if (socketTextChannel != null) + { + serverName = socketTextChannel.Guild.Name.Replace(":", "").Replace("/", "") + .Replace("\\", ""); + } + fileName = - fileName.Replace("%guild%", message.Server.Name.Replace(":","").Replace("/","").Replace("\\","")) + fileName.Replace("%guild%", serverName) .Replace("%channel%", message.Channel.Name) - .Replace("%timestamp%", SweetUtils.DateTimeToUnixTimeStamp(message.Timestamp).ToString()) + .Replace("%timestamp%", SweetUtils.DateTimeToUnixTimeStamp(message.CreatedAt.UtcDateTime).ToString()) .Replace("%name%", a.Filename) - .Replace("%id%", a.Id); + .Replace("%id%", a.Id.ToString()); if (extensionRequired) fileName += Path.GetExtension(a.Filename); Trace($"Detemined file name: {fileName}."); - + if (File.Exists(fileName) && new FileInfo(fileName).Length == a.Size) { @@ -260,7 +271,7 @@ namespace DML.Application.Classes Debug($"Downloaded attachment {a.Id}."); Trace("Updating known timestamp for job..."); - job.KnownTimestamp = SweetUtils.DateTimeToUnixTimeStamp(message.Timestamp); + job.KnownTimestamp = SweetUtils.DateTimeToUnixTimeStamp(message.CreatedAt.UtcDateTime); job.Store(); } finally diff --git a/Discord Media Loader.Application/Core.cs b/Discord Media Loader.Application/Core.cs index a30ea9d..0317fa3 100644 --- a/Discord Media Loader.Application/Core.cs +++ b/Discord Media Loader.Application/Core.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using Discord; using Discord.Net; +using Discord.WebSocket; using DML.Application.Classes; using DML.Application.Dialogs; using LiteDB; @@ -20,7 +21,7 @@ namespace DML.Application { public static class Core { - internal static DiscordClient Client { get; set; } + internal static DiscordSocketClient Client { get; set; } internal static LiteDatabase Database { get; set; } internal static Settings Settings { get; set; } internal static JobScheduler Scheduler { get; } = new JobScheduler(); @@ -127,11 +128,12 @@ namespace DML.Application } Debug("Creating discord client..."); - Client = new DiscordClient(); - Client.Log.Message += (sender, message) => + + Client = new DiscordSocketClient(); + Client.Log += (arg) => { - var logMessage = $"DiscordClient: {message.Message}"; - switch (message.Severity) + var logMessage = $"DiscordClient: {arg.Message}"; + switch (arg.Severity) { case LogSeverity.Verbose: Trace(logMessage); @@ -149,40 +151,42 @@ namespace DML.Application Error(logMessage); break; } + + return Task.CompletedTask; }; Info("Trying to log into discord..."); var abort = false; - while (Client.State != ConnectionState.Connected && !abort) - { - Trace("Entering login loop."); + Client.Connected += Client_Connected; + while (Client.LoginState != LoginState.LoggedIn && !abort) + { + Debug(Client.ConnectionState.ToString()); + Debug(Client.LoginState.ToString()); + + Trace("Entering login loop."); + try { + if (Client.ConnectionState == ConnectionState.Connecting) + continue; + if (!string.IsNullOrEmpty(Settings.LoginToken)) { Debug("Trying to login with last known token..."); - await Client.Connect(Settings.LoginToken, TokenType.User); + await Client.LoginAsync(TokenType.User, Settings.LoginToken); + await Task.Delay(1000); } - if (Client.State != ConnectionState.Connected && Settings.UseUserData && - !string.IsNullOrEmpty(Settings.Email) && - !string.IsNullOrEmpty(Settings.Password)) - { - Settings.LoginToken = string.Empty; - - Debug("Trying to login with email and password..."); - await Client.Connect(Settings.Email, Settings.Password); - } } - catch (HttpException) + catch (HttpException ex) { - Warn("Login seems to have failed or gone wrong."); + Warn($"Login seems to have failed or gone wrong: {ex.GetType().Name} - {ex.Message}"); } - if (Client.State != ConnectionState.Connected) + if (Client.LoginState == LoginState.LoggedOut) { Settings.Password = string.Empty; Debug("Showing dialog for username and password..."); @@ -193,6 +197,14 @@ namespace DML.Application } Debug("Start checking for invalid jobs..."); + + //Client + + while (Client.Guilds.Count==0) + { + // wait until guilds are loaded + } + for (var i = Scheduler.JobList.Count - 1; i >= 0; i--) { var job = Scheduler.JobList[i]; @@ -235,14 +247,20 @@ namespace DML.Application } } - //TODO: this is thrid time we implement this.....this has to be fixed!!! - private static Server FindServerById(ulong id) + private static Task Client_Connected() { - Trace($"Trying to find server by Id: {id}"); - return (from s in Core.Client.Servers where s.Id == id select s).FirstOrDefault(); + Debug("Connected"); + return Task.CompletedTask; } - private static Channel FindChannelById(Server server, ulong id) + //TODO: this is thrid time we implement this.....this has to be fixed!!! + private static SocketGuild FindServerById(ulong id) + { + Trace($"Trying to find server by Id: {id}"); + return (from s in Core.Client.Guilds where s.Id == id select s).FirstOrDefault(); + } + + private static SocketTextChannel FindChannelById(SocketGuild server, ulong id) { Trace($"Trying to find channel in {server} by id: {id}"); return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault(); diff --git a/Discord Media Loader.Application/DML.Application.csproj b/Discord Media Loader.Application/DML.Application.csproj index 84faa2b..1279c18 100644 --- a/Discord Media Loader.Application/DML.Application.csproj +++ b/Discord Media Loader.Application/DML.Application.csproj @@ -30,17 +30,39 @@ 4 - - ..\packages\Discord.Net.0.9.6\lib\net45\Discord.Net.dll - True + + ..\packages\Discord.Net.Commands.1.0.2\lib\netstandard1.1\Discord.Net.Commands.dll + + + ..\packages\Discord.Net.Core.1.0.2\lib\net45\Discord.Net.Core.dll + + + ..\packages\Discord.Net.Rest.1.0.2\lib\net45\Discord.Net.Rest.dll + + + ..\packages\Discord.Net.Rpc.1.0.2\lib\net45\Discord.Net.Rpc.dll + + + ..\packages\Discord.Net.Webhook.1.0.2\lib\netstandard1.1\Discord.Net.Webhook.dll + + + ..\packages\Discord.Net.WebSocket.1.0.2\lib\net45\Discord.Net.WebSocket.dll ..\packages\LiteDB.3.1.0\lib\net35\LiteDB.dll True - - ..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll - True + + ..\packages\Microsoft.Extensions.DependencyInjection.1.1.1\lib\netstandard1.1\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.1.1.1\lib\netstandard1.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll + + + ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll ..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll @@ -59,15 +81,74 @@ True + + ..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll + + + ..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + True + + + + ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll + + + ..\packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll + + + ..\packages\System.Interactive.Async.3.1.1\lib\net46\System.Interactive.Async.dll + + + ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll + True + + + + ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll + + + ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll + + + ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll + + + ..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll + + + ..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll + + + + ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll + True + + + ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + - + + ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll + ..\packages\WebSocket4Net.0.14.1\lib\net45\WebSocket4Net.dll True @@ -119,6 +200,7 @@ + diff --git a/Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs b/Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs index fd09c4b..0a48921 100644 --- a/Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs +++ b/Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs @@ -30,25 +30,12 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginDialog)); this.pnlButtons = new System.Windows.Forms.Panel(); - this.tbcLoginMethods = new System.Windows.Forms.TabControl(); - this.tpgToken = new System.Windows.Forms.TabPage(); - this.tpgUserdata = new System.Windows.Forms.TabPage(); - this.lbToken = new System.Windows.Forms.Label(); - this.edToken = new System.Windows.Forms.TextBox(); - this.lbHowToToken = new System.Windows.Forms.Label(); - this.edEmail = new System.Windows.Forms.TextBox(); - this.edPassword = new System.Windows.Forms.TextBox(); - this.lbEmail = new System.Windows.Forms.Label(); - this.lbPassword = new System.Windows.Forms.Label(); - this.cbUseUserdata = new System.Windows.Forms.CheckBox(); - this.cbSavePassword = new System.Windows.Forms.CheckBox(); - this.lbUserdataHints = new System.Windows.Forms.Label(); - this.btnOk = new System.Windows.Forms.Button(); this.btnAbort = new System.Windows.Forms.Button(); + this.btnOk = new System.Windows.Forms.Button(); + this.lbHowToToken = new System.Windows.Forms.Label(); + this.edToken = new System.Windows.Forms.TextBox(); + this.lbToken = new System.Windows.Forms.Label(); this.pnlButtons.SuspendLayout(); - this.tbcLoginMethods.SuspendLayout(); - this.tpgToken.SuspendLayout(); - this.tpgUserdata.SuspendLayout(); this.SuspendLayout(); // // pnlButtons @@ -62,133 +49,15 @@ this.pnlButtons.Size = new System.Drawing.Size(426, 51); this.pnlButtons.TabIndex = 0; // - // tbcLoginMethods + // btnAbort // - this.tbcLoginMethods.Controls.Add(this.tpgToken); - this.tbcLoginMethods.Controls.Add(this.tpgUserdata); - this.tbcLoginMethods.Dock = System.Windows.Forms.DockStyle.Fill; - this.tbcLoginMethods.Location = new System.Drawing.Point(0, 0); - this.tbcLoginMethods.Name = "tbcLoginMethods"; - this.tbcLoginMethods.SelectedIndex = 0; - this.tbcLoginMethods.Size = new System.Drawing.Size(426, 168); - this.tbcLoginMethods.TabIndex = 1; - // - // tpgToken - // - this.tpgToken.Controls.Add(this.lbHowToToken); - this.tpgToken.Controls.Add(this.edToken); - this.tpgToken.Controls.Add(this.lbToken); - this.tpgToken.Location = new System.Drawing.Point(4, 22); - this.tpgToken.Name = "tpgToken"; - this.tpgToken.Padding = new System.Windows.Forms.Padding(3); - this.tpgToken.Size = new System.Drawing.Size(418, 142); - this.tpgToken.TabIndex = 0; - this.tpgToken.Text = "Token"; - this.tpgToken.UseVisualStyleBackColor = true; - // - // tpgUserdata - // - this.tpgUserdata.Controls.Add(this.lbUserdataHints); - this.tpgUserdata.Controls.Add(this.cbSavePassword); - this.tpgUserdata.Controls.Add(this.cbUseUserdata); - this.tpgUserdata.Controls.Add(this.lbPassword); - this.tpgUserdata.Controls.Add(this.lbEmail); - this.tpgUserdata.Controls.Add(this.edPassword); - this.tpgUserdata.Controls.Add(this.edEmail); - this.tpgUserdata.Location = new System.Drawing.Point(4, 22); - this.tpgUserdata.Name = "tpgUserdata"; - this.tpgUserdata.Padding = new System.Windows.Forms.Padding(3); - this.tpgUserdata.Size = new System.Drawing.Size(418, 142); - this.tpgUserdata.TabIndex = 1; - this.tpgUserdata.Text = "Userdata"; - this.tpgUserdata.UseVisualStyleBackColor = true; - // - // lbToken - // - this.lbToken.AutoSize = true; - this.lbToken.Location = new System.Drawing.Point(3, 9); - this.lbToken.Name = "lbToken"; - this.lbToken.Size = new System.Drawing.Size(66, 13); - this.lbToken.TabIndex = 0; - this.lbToken.Text = "Login token:"; - // - // edToken - // - this.edToken.Location = new System.Drawing.Point(75, 6); - this.edToken.Name = "edToken"; - this.edToken.Size = new System.Drawing.Size(335, 20); - this.edToken.TabIndex = 1; - // - // lbHowToToken - // - this.lbHowToToken.Location = new System.Drawing.Point(3, 52); - this.lbHowToToken.Name = "lbHowToToken"; - this.lbHowToToken.Size = new System.Drawing.Size(412, 87); - this.lbHowToToken.TabIndex = 2; - this.lbHowToToken.Text = resources.GetString("lbHowToToken.Text"); - // - // edEmail - // - this.edEmail.Location = new System.Drawing.Point(47, 6); - this.edEmail.Name = "edEmail"; - this.edEmail.Size = new System.Drawing.Size(133, 20); - this.edEmail.TabIndex = 0; - // - // edPassword - // - this.edPassword.Location = new System.Drawing.Point(279, 6); - this.edPassword.Name = "edPassword"; - this.edPassword.PasswordChar = '•'; - this.edPassword.Size = new System.Drawing.Size(133, 20); - this.edPassword.TabIndex = 1; - // - // lbEmail - // - this.lbEmail.AutoSize = true; - this.lbEmail.Location = new System.Drawing.Point(6, 9); - this.lbEmail.Name = "lbEmail"; - this.lbEmail.Size = new System.Drawing.Size(35, 13); - this.lbEmail.TabIndex = 2; - this.lbEmail.Text = "Email:"; - // - // lbPassword - // - this.lbPassword.AutoSize = true; - this.lbPassword.Location = new System.Drawing.Point(217, 9); - this.lbPassword.Name = "lbPassword"; - this.lbPassword.Size = new System.Drawing.Size(56, 13); - this.lbPassword.TabIndex = 3; - this.lbPassword.Text = "Password:"; - // - // cbUseUserdata - // - this.cbUseUserdata.AutoSize = true; - this.cbUseUserdata.Location = new System.Drawing.Point(6, 32); - this.cbUseUserdata.Name = "cbUseUserdata"; - this.cbUseUserdata.Size = new System.Drawing.Size(139, 17); - this.cbUseUserdata.TabIndex = 4; - this.cbUseUserdata.Text = "Use login with user data"; - this.cbUseUserdata.UseVisualStyleBackColor = true; - // - // cbSavePassword - // - this.cbSavePassword.AutoSize = true; - this.cbSavePassword.Location = new System.Drawing.Point(313, 32); - this.cbSavePassword.Name = "cbSavePassword"; - this.cbSavePassword.Size = new System.Drawing.Size(99, 17); - this.cbSavePassword.TabIndex = 5; - this.cbSavePassword.Text = "Save password"; - this.cbSavePassword.UseVisualStyleBackColor = true; - // - // lbUserdataHints - // - this.lbUserdataHints.Location = new System.Drawing.Point(3, 52); - this.lbUserdataHints.Name = "lbUserdataHints"; - this.lbUserdataHints.Size = new System.Drawing.Size(412, 87); - this.lbUserdataHints.TabIndex = 6; - this.lbUserdataHints.Text = "Login with email and password is not recommended. If you use two factor authentic" + - "ation this can cause a ban of your discord account.\r\n\r\nFor safety reasons we rec" + - "ommend to login with login token."; + this.btnAbort.Location = new System.Drawing.Point(348, 16); + this.btnAbort.Name = "btnAbort"; + this.btnAbort.Size = new System.Drawing.Size(75, 23); + this.btnAbort.TabIndex = 1; + this.btnAbort.Text = "&Abort"; + this.btnAbort.UseVisualStyleBackColor = true; + this.btnAbort.Click += new System.EventHandler(this.btnAbort_Click); // // btnOk // @@ -200,22 +69,38 @@ this.btnOk.UseVisualStyleBackColor = true; this.btnOk.Click += new System.EventHandler(this.btnOk_Click); // - // btnAbort + // lbHowToToken // - this.btnAbort.Location = new System.Drawing.Point(348, 16); - this.btnAbort.Name = "btnAbort"; - this.btnAbort.Size = new System.Drawing.Size(75, 23); - this.btnAbort.TabIndex = 1; - this.btnAbort.Text = "&Abort"; - this.btnAbort.UseVisualStyleBackColor = true; - this.btnAbort.Click += new System.EventHandler(this.btnAbort_Click); + this.lbHowToToken.Location = new System.Drawing.Point(7, 58); + this.lbHowToToken.Name = "lbHowToToken"; + this.lbHowToToken.Size = new System.Drawing.Size(412, 87); + this.lbHowToToken.TabIndex = 5; + this.lbHowToToken.Text = resources.GetString("lbHowToToken.Text"); + // + // edToken + // + this.edToken.Location = new System.Drawing.Point(79, 12); + this.edToken.Name = "edToken"; + this.edToken.Size = new System.Drawing.Size(335, 20); + this.edToken.TabIndex = 4; + // + // lbToken + // + this.lbToken.AutoSize = true; + this.lbToken.Location = new System.Drawing.Point(7, 15); + this.lbToken.Name = "lbToken"; + this.lbToken.Size = new System.Drawing.Size(66, 13); + this.lbToken.TabIndex = 3; + this.lbToken.Text = "Login token:"; // // LoginDialog // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(426, 219); - this.Controls.Add(this.tbcLoginMethods); + this.Controls.Add(this.lbHowToToken); + this.Controls.Add(this.edToken); + this.Controls.Add(this.lbToken); this.Controls.Add(this.pnlButtons); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); @@ -227,32 +112,18 @@ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDialog_FormClosing); this.Shown += new System.EventHandler(this.LoginDialog_Shown); this.pnlButtons.ResumeLayout(false); - this.tbcLoginMethods.ResumeLayout(false); - this.tpgToken.ResumeLayout(false); - this.tpgToken.PerformLayout(); - this.tpgUserdata.ResumeLayout(false); - this.tpgUserdata.PerformLayout(); this.ResumeLayout(false); + this.PerformLayout(); } #endregion private System.Windows.Forms.Panel pnlButtons; - private System.Windows.Forms.TabControl tbcLoginMethods; - private System.Windows.Forms.TabPage tpgToken; + private System.Windows.Forms.Button btnAbort; + private System.Windows.Forms.Button btnOk; private System.Windows.Forms.Label lbHowToToken; private System.Windows.Forms.TextBox edToken; private System.Windows.Forms.Label lbToken; - private System.Windows.Forms.TabPage tpgUserdata; - private System.Windows.Forms.Button btnAbort; - private System.Windows.Forms.Button btnOk; - private System.Windows.Forms.Label lbUserdataHints; - private System.Windows.Forms.CheckBox cbSavePassword; - private System.Windows.Forms.CheckBox cbUseUserdata; - private System.Windows.Forms.Label lbPassword; - private System.Windows.Forms.Label lbEmail; - private System.Windows.Forms.TextBox edPassword; - private System.Windows.Forms.TextBox edEmail; } } \ No newline at end of file diff --git a/Discord Media Loader.Application/Dialogs/LoginDialog.cs b/Discord Media Loader.Application/Dialogs/LoginDialog.cs index 6163db7..6bc566a 100644 --- a/Discord Media Loader.Application/Dialogs/LoginDialog.cs +++ b/Discord Media Loader.Application/Dialogs/LoginDialog.cs @@ -22,12 +22,6 @@ namespace DML.Application.Dialogs { Trace("Login dialog shown."); edToken.Text = Core.Settings.LoginToken; - edEmail.Text = Core.Settings.Email; - edPassword.Text = Core.Settings.Password; - cbUseUserdata.Checked = Core.Settings.UseUserData; - cbSavePassword.Checked = Core.Settings.SavePassword; - - tbcLoginMethods.SelectedTab = Core.Settings.UseUserData ? tpgUserdata : tpgToken; } private void LoginDialog_FormClosing(object sender, FormClosingEventArgs e) @@ -38,10 +32,6 @@ namespace DML.Application.Dialogs Debug("Adjusting login settings..."); Core.Settings.LoginToken = edToken.Text; - Core.Settings.Email = edEmail.Text; - Core.Settings.Password = edPassword.Text; - Core.Settings.UseUserData = cbUseUserdata.Checked; - Core.Settings.SavePassword = cbSavePassword.Checked; Core.Settings.Store(); } diff --git a/Discord Media Loader.Application/MainForm.cs b/Discord Media Loader.Application/MainForm.cs index d630aef..72adc27 100644 --- a/Discord Media Loader.Application/MainForm.cs +++ b/Discord Media Loader.Application/MainForm.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Reflection; using System.Windows.Forms; using Discord; +using Discord.WebSocket; using DML.Application.Classes; using static SweetLib.Utils.Logger.Logger; @@ -46,7 +47,7 @@ namespace DML.Application if (cbGuild.Items.Count == 0) { Trace("Adding guilds to component..."); - cbGuild.Items.AddRange(Core.Client.Servers.OrderBy(g => g.Name).Select(g => g.Name).ToArray()); + cbGuild.Items.AddRange(Core.Client.Guilds.OrderBy(g => g.Name).Select(g => g.Name).ToArray()); cbGuild.SelectedIndex = 0; Trace("Guild component initialized."); } @@ -108,25 +109,25 @@ namespace DML.Application } } - private Server FindServerByName(string name) + private SocketGuild FindServerByName(string name) { Trace($"Trying to find server by name: {name}"); - return (from s in Core.Client.Servers where s.Name == name select s).FirstOrDefault(); + return (from s in Core.Client.Guilds where s.Name == name select s).FirstOrDefault(); } - private Channel FindChannelByName(Server server, string name) + private SocketTextChannel FindChannelByName(SocketGuild server, string name) { Trace($"Trying to find channel in {server} by name: {name}"); return (from c in server.TextChannels where c.Name == name select c).FirstOrDefault(); } - private Server FindServerById(ulong id) + private SocketGuild FindServerById(ulong id) { Trace($"Trying to find server by Id: {id}"); - return (from s in Core.Client.Servers where s.Id == id select s).FirstOrDefault(); + return (from s in Core.Client.Guilds where s.Id == id select s).FirstOrDefault(); } - private Channel FindChannelById(Server server, ulong id) + private SocketTextChannel FindChannelById(SocketGuild server, ulong id) { Trace($"Trying to find channel in {server} by id: {id}"); return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault(); diff --git a/Discord Media Loader.Application/app.config b/Discord Media Loader.Application/app.config new file mode 100644 index 0000000..5b184e5 --- /dev/null +++ b/Discord Media Loader.Application/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Discord Media Loader.Application/packages.config b/Discord Media Loader.Application/packages.config index f45fb55..1b50a5f 100644 --- a/Discord Media Loader.Application/packages.config +++ b/Discord Media Loader.Application/packages.config @@ -1,9 +1,66 @@  - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Discord Media Loader/App.config b/Discord Media Loader/App.config index bae5d6d..3bddcc4 100644 --- a/Discord Media Loader/App.config +++ b/Discord Media Loader/App.config @@ -1,6 +1,22 @@ - + - + + + + + + + + + + + + + + + + + diff --git a/Discord Media Loader/FrmSplash.cs b/Discord Media Loader/FrmSplash.cs index 8d0957b..33558d1 100644 --- a/Discord Media Loader/FrmSplash.cs +++ b/Discord Media Loader/FrmSplash.cs @@ -25,7 +25,7 @@ namespace Discord_Media_Loader UseWaitCursor = true; try { - var releaseVersion = await VersionHelper.GetReleaseVersion(); + /*var releaseVersion = await VersionHelper.GetReleaseVersion(); if (releaseVersion > VersionHelper.CurrentVersion) { var tmpFile = Path.GetTempFileName(); @@ -52,7 +52,7 @@ namespace Discord_Media_Loader } File.Delete(tmpFile); - } + }*/ } finally { From eca0e337c52d0fc8ab42ca104fe06ef8372f5f79 Mon Sep 17 00:00:00 2001 From: Serraniel Date: Wed, 4 Oct 2017 11:27:01 +0200 Subject: [PATCH 2/8] First changes for new api --- .../Classes/Job.cs | 18 ++-- .../Classes/JobScheduler.cs | 16 +--- .../Classes/Settings.cs | 13 +-- .../Core.cs | 13 +-- DML.Core/DML.Core.csproj | 15 ++++ .../DML.Application.csproj | 4 - Discord Media Loader.sln | 11 ++- .../Discord Media Loader.csproj | 90 ++++++++++++++++++- Discord Media Loader/packages.config | 59 ++++++++++++ 9 files changed, 189 insertions(+), 50 deletions(-) rename {Discord Media Loader.Application => DML.Core}/Classes/Job.cs (89%) rename {Discord Media Loader.Application => DML.Core}/Classes/JobScheduler.cs (95%) rename {Discord Media Loader.Application => DML.Core}/Classes/Settings.cs (78%) rename {Discord Media Loader.Application => DML.Core}/Core.cs (96%) create mode 100644 DML.Core/DML.Core.csproj diff --git a/Discord Media Loader.Application/Classes/Job.cs b/DML.Core/Classes/Job.cs similarity index 89% rename from Discord Media Loader.Application/Classes/Job.cs rename to DML.Core/Classes/Job.cs index 7132cee..2f283e2 100644 --- a/Discord Media Loader.Application/Classes/Job.cs +++ b/DML.Core/Classes/Job.cs @@ -1,15 +1,11 @@ using System; using System.Collections.Generic; -using System.Diagnostics.Eventing.Reader; using System.Linq; -using System.Text; using System.Threading.Tasks; using Discord; using Discord.WebSocket; -using SweetLib.Utils; -using static SweetLib.Utils.Logger.Logger; -namespace DML.Application.Classes +namespace DML.Core.Classes { public class Job { @@ -24,7 +20,7 @@ namespace DML.Application.Classes { Debug("Storing job to database..."); Trace("Getting jobs collection..."); - var jobDb = Core.Database.GetCollection("jobs"); + var jobDb = DML.Core.Core.Database.GetCollection("jobs"); Trace("Adding new value..."); @@ -42,7 +38,7 @@ namespace DML.Application.Classes { Debug("Deleting job from database..."); Trace("Getting jobs collection..."); - var jobDb = Core.Database.GetCollection("jobs"); + var jobDb = DML.Core.Core.Database.GetCollection("jobs"); Trace("Deleting value..."); jobDb.Delete(Id); @@ -51,7 +47,7 @@ namespace DML.Application.Classes private SocketGuild FindServerById(ulong id) { Trace($"Trying to find server by Id: {id}"); - return (from s in Core.Client.Guilds where s.Id == id select s).FirstOrDefault(); + return (from s in DML.Core.Core.Client.Guilds where s.Id == id select s).FirstOrDefault(); } private SocketTextChannel FindChannelById(SocketGuild server, ulong id) @@ -118,12 +114,12 @@ namespace DML.Application.Classes if (m.Attachments.Count > 0) { result.Add(m); - Core.Scheduler.TotalAttachments++; + DML.Core.Core.Scheduler.TotalAttachments++; Trace($"Added message {m.Id}"); } Debug($"Finished message {m.Id}"); - Core.Scheduler.MessagesScanned++; + DML.Core.Core.Scheduler.MessagesScanned++; } finished = finished || messages.Length < limit; @@ -153,7 +149,7 @@ namespace DML.Application.Classes { Debug("Restoring jobs..."); Trace("Getting jobs collection..."); - var jobDb = Core.Database.GetCollection("jobs"); + var jobDb = DML.Core.Core.Database.GetCollection("jobs"); Trace("Creating new empty job list"); return jobDb.FindAll(); diff --git a/Discord Media Loader.Application/Classes/JobScheduler.cs b/DML.Core/Classes/JobScheduler.cs similarity index 95% rename from Discord Media Loader.Application/Classes/JobScheduler.cs rename to DML.Core/Classes/JobScheduler.cs index 3340089..21d3305 100644 --- a/Discord Media Loader.Application/Classes/JobScheduler.cs +++ b/DML.Core/Classes/JobScheduler.cs @@ -1,19 +1,11 @@ using System; -using System.Collections; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net; -using System.Text; using System.Threading.Tasks; -using Discord; -using Discord.Rpc; using Discord.WebSocket; -using SweetLib.Utils; -using static SweetLib.Utils.Logger.Logger; -namespace DML.Application.Classes +namespace DML.Core.Classes { internal class JobScheduler { @@ -149,8 +141,8 @@ namespace DML.Application.Classes Trace("Locking scheduler..."); lock (this) { - Trace($"Checking thread limit. Running: {RunningThreads}, Max: {Core.Settings.ThreadLimit}"); - if (RunningThreads >= Core.Settings.ThreadLimit) + Trace($"Checking thread limit. Running: {RunningThreads}, Max: {DML.Core.Core.Settings.ThreadLimit}"); + if (RunningThreads >= DML.Core.Core.Settings.ThreadLimit) continue; RunningThreads++; @@ -220,7 +212,7 @@ namespace DML.Application.Classes { try { - var fileName = Path.Combine(Core.Settings.OperatingFolder, Core.Settings.FileNameScheme); + var fileName = Path.Combine(DML.Core.Core.Settings.OperatingFolder, DML.Core.Core.Settings.FileNameScheme); Trace("Replacing filename placeholders..."); diff --git a/Discord Media Loader.Application/Classes/Settings.cs b/DML.Core/Classes/Settings.cs similarity index 78% rename from Discord Media Loader.Application/Classes/Settings.cs rename to DML.Core/Classes/Settings.cs index 9984ca8..0466c97 100644 --- a/Discord Media Loader.Application/Classes/Settings.cs +++ b/DML.Core/Classes/Settings.cs @@ -1,13 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using SweetLib.Utils.Logger; -using static SweetLib.Utils.Logger.Logger; +using System.Diagnostics; -namespace DML.Application.Classes +namespace DML.Core.Classes { internal class Settings { @@ -26,7 +19,7 @@ namespace DML.Application.Classes internal void Store() { Trace("Getting settings collection..."); - var settingsDB = Core.Database.GetCollection("settings"); + var settingsDB = DML.Core.Core.Database.GetCollection("settings"); Debug("Storing settings to database..."); diff --git a/Discord Media Loader.Application/Core.cs b/DML.Core/Core.cs similarity index 96% rename from Discord Media Loader.Application/Core.cs rename to DML.Core/Core.cs index 0317fa3..ffd7e14 100644 --- a/Discord Media Loader.Application/Core.cs +++ b/DML.Core/Core.cs @@ -2,22 +2,13 @@ using System.Globalization; using System.IO; using System.Linq; -using System.Runtime; -using System.Runtime.Remoting.Channels; using System.Threading.Tasks; -using System.Windows.Forms; using Discord; using Discord.Net; using Discord.WebSocket; -using DML.Application.Classes; -using DML.Application.Dialogs; -using LiteDB; -using SweetLib.Utils; -using SweetLib.Utils.Logger; -using SweetLib.Utils.Logger.Memory; -using static SweetLib.Utils.Logger.Logger; +using DML.Core.Classes; -namespace DML.Application +namespace DML.Core { public static class Core { diff --git a/DML.Core/DML.Core.csproj b/DML.Core/DML.Core.csproj new file mode 100644 index 0000000..438b9a8 --- /dev/null +++ b/DML.Core/DML.Core.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp1.1 + + + + + + + + + + + diff --git a/Discord Media Loader.Application/DML.Application.csproj b/Discord Media Loader.Application/DML.Application.csproj index 1279c18..f2e385b 100644 --- a/Discord Media Loader.Application/DML.Application.csproj +++ b/Discord Media Loader.Application/DML.Application.csproj @@ -155,10 +155,6 @@ - - - - Form diff --git a/Discord Media Loader.sln b/Discord Media Loader.sln index c56a43c..33d02e8 100644 --- a/Discord Media Loader.sln +++ b/Discord Media Loader.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26403.7 +VisualStudioVersion = 15.0.26730.10 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord Media Loader", "Discord Media Loader\Discord Media Loader.csproj", "{EDC92554-DBC1-4F9C-9317-379A8BF441E8}" EndProject @@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.Application", "Discord EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SweetLib", "..\SweetLib\SweetLib\SweetLib.csproj", "{02C1F8EF-32F2-4E77-A36D-79129402AF37}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.Core", "DML.Core\DML.Core.csproj", "{BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,8 +29,15 @@ Global {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Debug|Any CPU.Build.0 = Debug|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.ActiveCfg = Release|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.Build.0 = Release|Any CPU + {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0B742DE0-D6AF-4033-9605-863C32A7FFD8} + EndGlobalSection EndGlobal diff --git a/Discord Media Loader/Discord Media Loader.csproj b/Discord Media Loader/Discord Media Loader.csproj index 79fc96c..0977fa7 100644 --- a/Discord Media Loader/Discord Media Loader.csproj +++ b/Discord Media Loader/Discord Media Loader.csproj @@ -40,6 +40,36 @@ + + ..\packages\Discord.Net.Commands.1.0.2\lib\netstandard1.1\Discord.Net.Commands.dll + + + ..\packages\Discord.Net.Core.1.0.2\lib\net45\Discord.Net.Core.dll + + + ..\packages\Discord.Net.Rest.1.0.2\lib\net45\Discord.Net.Rest.dll + + + ..\packages\Discord.Net.Rpc.1.0.2\lib\net45\Discord.Net.Rpc.dll + + + ..\packages\Discord.Net.Webhook.1.0.2\lib\netstandard1.1\Discord.Net.Webhook.dll + + + ..\packages\Discord.Net.WebSocket.1.0.2\lib\net45\Discord.Net.WebSocket.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.1.1.1\lib\netstandard1.1\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.1.1.1\lib\netstandard1.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll + + + ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll + ..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll True @@ -57,17 +87,75 @@ True + + ..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll + + + ..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + True + + + + ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll + + + ..\packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll + + + ..\packages\System.Interactive.Async.3.1.1\lib\net46\System.Interactive.Async.dll + + + ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll + True + + + ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll + + + ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll + + + ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll + + + ..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll + + + ..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll + + + + ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll + True + + + ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + - + + ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll + diff --git a/Discord Media Loader/packages.config b/Discord Media Loader/packages.config index 4832885..eff2573 100644 --- a/Discord Media Loader/packages.config +++ b/Discord Media Loader/packages.config @@ -1,5 +1,64 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From df0980c86eae5006d12460f8ed9ac1e9bdb0b309 Mon Sep 17 00:00:00 2001 From: Serraniel Date: Wed, 4 Oct 2017 13:14:44 +0200 Subject: [PATCH 3/8] =?UTF-8?q?Helload=20of=20shit=20i=20have=20done=20and?= =?UTF-8?q?=20reversed=20=F0=9F=91=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DML.AppCore/DML.AppCore.csproj | 17 + .../{DML.Core.csproj => DML.Core.Old.csproj} | 0 .../Classes/Core.cs | 268 ++++++++++++++++ .../Classes/Job.cs | 161 ++++++++++ .../Classes/JobScheduler.cs | 295 ++++++++++++++++++ .../Classes/Settings.cs | 39 +++ .../DML.Application.csproj | 8 + .../Dialogs/LoginDialog.cs | 1 + Discord Media Loader.Application/MainForm.cs | 2 + .../packages.config | 1 - Discord Media Loader.sln | 12 +- .../Discord Media Loader.csproj | 4 + Discord Media Loader/Program.cs | 1 + 13 files changed, 802 insertions(+), 7 deletions(-) create mode 100644 DML.AppCore/DML.AppCore.csproj rename DML.Core/{DML.Core.csproj => DML.Core.Old.csproj} (100%) create mode 100644 Discord Media Loader.Application/Classes/Core.cs create mode 100644 Discord Media Loader.Application/Classes/Job.cs create mode 100644 Discord Media Loader.Application/Classes/JobScheduler.cs create mode 100644 Discord Media Loader.Application/Classes/Settings.cs diff --git a/DML.AppCore/DML.AppCore.csproj b/DML.AppCore/DML.AppCore.csproj new file mode 100644 index 0000000..6d9fa23 --- /dev/null +++ b/DML.AppCore/DML.AppCore.csproj @@ -0,0 +1,17 @@ + + + + netstandard1.4 + + + + + + + + + + + + + diff --git a/DML.Core/DML.Core.csproj b/DML.Core/DML.Core.Old.csproj similarity index 100% rename from DML.Core/DML.Core.csproj rename to DML.Core/DML.Core.Old.csproj diff --git a/Discord Media Loader.Application/Classes/Core.cs b/Discord Media Loader.Application/Classes/Core.cs new file mode 100644 index 0000000..f96a1d2 --- /dev/null +++ b/Discord Media Loader.Application/Classes/Core.cs @@ -0,0 +1,268 @@ +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime; +using System.Threading.Tasks; +using System.Windows.Forms; +using Discord; +using Discord.Net; +using Discord.WebSocket; +using DML.AppCore.Classes; +using DML.Application.Dialogs; +using LiteDB; +using SweetLib.Utils; +using SweetLib.Utils.Logger; +using SweetLib.Utils.Logger.Memory; +using Logger = SweetLib.Utils.Logger.Logger; + +namespace DML.Application.Classes +{ + public static class Core + { + internal static DiscordSocketClient Client { get; set; } + internal static LiteDatabase Database { get; set; } + internal static Settings Settings { get; set; } + internal static JobScheduler Scheduler { get; } = new JobScheduler(); + + internal static string DataDirectory + => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Serraniel\Discord Media Loader"); + + public static async Task Run(string[] paramStrings) + { + try + { + var splash = new FrmInternalSplash(); + splash.Show(); + System.Windows.Forms.Application.DoEvents(); + + Logger.Info("Starting up Discord Media Loader application..."); + var useTrace = false; +#if DEBUG + //temporary add debug log level if debugging... + Logger.GlobalLogLevel |= LogLevel.Debug; + Logger.Debug("Running in debug configuartion. Added log level debug."); +#endif + + Logger.Debug($"Parameters: {string.Join(", ", paramStrings)}"); + if (paramStrings.Contains("--trace") || paramStrings.Contains("-t")) + { + useTrace = true; + Logger.GlobalLogLevel |= LogLevel.Trace; + Logger.Trace("Trace parameter found. Added log level trace."); + } + + Logger.Debug($"Application data folder: {DataDirectory}"); + + Logger.Trace("Checking application data folder..."); + if (!Directory.Exists(DataDirectory)) + { + Logger.Debug("Creating application data folder..."); + Directory.CreateDirectory(DataDirectory); + Logger.Trace("Creating application data folder."); + } + + Logger.Trace("Initializing profile optimizations..."); + ProfileOptimization.SetProfileRoot(System.Windows.Forms.Application.UserAppDataPath); + ProfileOptimization.StartProfile("profile.opt"); + Logger.Trace("Finished initializing profile optimizations."); + + Logger.Trace("Trying to identify log memory..."); + var logMemory = Logger.DefaultLogMemory as ArchivableConsoleLogMemory; + if (logMemory != null) + { + var logFolder = Path.Combine(DataDirectory, "logs"); + if (!Directory.Exists(logFolder)) + { + Logger.Debug("Creating log folder..."); + Directory.CreateDirectory(logFolder); + Logger.Trace("Created log folder."); + } + + + var logFile = Path.Combine(logFolder, + SweetUtils.LegalizeFilename($"{DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.SortableDateTimePattern)}.log.zip")); + + Logger.Trace($"Setting log file: {logFile}"); + logMemory.AutoArchiveOnDispose = true; + logMemory.ArchiveFile = logFile; + } + + Logger.Debug("Loading database..."); + Database = new LiteDatabase(Path.Combine(DataDirectory, "config.db")); + Database.Log.Logging += (message) => Logger.Trace($"LiteDB: {message}"); + + Logger.Debug("Loading settings collection out of database..."); + var settingsDB = Database.GetCollection("settings"); + if (settingsDB.Count() > 1) + { + Logger.Warn("Found more than one setting. Loading first one..."); + } + Settings = settingsDB.FindAll().FirstOrDefault(); + if (Settings == null) + { + Logger.Warn("Settings not found. Creating new one. This is normal on first start up..."); + Settings = new Settings(); + Settings.Store(); + } + + Logger.Debug("Loading jobs collection out of database..."); + Scheduler.JobList = Job.RestoreJobs().ToList(); + + Logger.Info("Loaded settings."); + Logger.Debug( + $"Settings: Email: {Settings.Email}, password: {(string.IsNullOrEmpty(Settings.Password) ? "not set" : "is set")}, use username: {Settings.UseUserData}, loginToken: {Settings.LoginToken}"); + + Logger.Trace("Updating log level..."); + Logger.GlobalLogLevel = Settings.ApplicactionLogLevel; +#if DEBUG + //temporary add debug log level if debugging... + Logger.GlobalLogLevel |= LogLevel.Debug; + Logger.Debug("Running in debug configuartion. Added log level debug."); +#endif + if (useTrace) + { + Logger.GlobalLogLevel |= LogLevel.Trace; + Logger.Trace("Creating application data folder."); + } + + Logger.Debug("Creating discord client..."); + + Client = new DiscordSocketClient(); + Client.Log += (arg) => + { + var logMessage = $"DiscordClient: {arg.Message}"; + switch (arg.Severity) + { + case LogSeverity.Verbose: + Logger.Trace(logMessage); + break; + case LogSeverity.Debug: + Logger.Trace(logMessage); + break; + case LogSeverity.Info: + Logger.Info(logMessage); + break; + case LogSeverity.Warning: + Logger.Warn(logMessage); + break; + case LogSeverity.Error: + Logger.Error(logMessage); + break; + } + + return Task.CompletedTask; + }; + + + Logger.Info("Trying to log into discord..."); + var abort = false; + + Client.Connected += Client_Connected; + + while (Client.LoginState != LoginState.LoggedIn && !abort) + { + Logger.Debug(Client.ConnectionState.ToString()); + Logger.Debug(Client.LoginState.ToString()); + + Logger.Trace("Entering login loop."); + + try + { + if (Client.ConnectionState == ConnectionState.Connecting) + continue; + + if (!string.IsNullOrEmpty(Settings.LoginToken)) + { + Logger.Debug("Trying to login with last known token..."); + await Client.LoginAsync(TokenType.User, Settings.LoginToken); + await Task.Delay(1000); + } + + } + catch (HttpException ex) + { + Logger.Warn($"Login seems to have failed or gone wrong: {ex.GetType().Name} - {ex.Message}"); + } + + if (Client.LoginState == LoginState.LoggedOut) + { + Settings.Password = string.Empty; + Logger.Debug("Showing dialog for username and password..."); + var loginDlg = new LoginDialog(); + loginDlg.ShowDialog(); + Logger.Trace("Dialog closed."); + } + } + + Logger.Debug("Start checking for invalid jobs..."); + + //Client + + while (Client.Guilds.Count == 0) + { + // wait until guilds are loaded + } + + for (var i = Scheduler.JobList.Count - 1; i >= 0; i--) + { + var job = Scheduler.JobList[i]; + var isError = false; + var guild = FindServerById(job.GuildId); + if (guild == null) + isError = true; + else + { + var channel = FindChannelById(guild, job.ChannelId); + if (channel == null) + isError = true; + } + + if (isError) + { + MessageBox.Show($"Invalid job for guild {job.GuildId}, channel {job.ChannelId} found. Guild or channel may not exist any more. This job will be deleted...", "Invalid job", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + + Scheduler.JobList.Remove(job); + Scheduler.RunningJobs.Remove(job.Id); + job.Stop(); + job.Delete(); + } + } + + splash.Close(); + + Logger.Info("Starting scheduler..."); + Scheduler.Start(); + + System.Windows.Forms.Application.Run(new MainForm()); + + Logger.Info("Stopping scheduler..."); + Scheduler.Stop(); + } + catch (Exception ex) + { + Logger.Error($"{ex.Message} occured at: {ex.StackTrace}"); + } + } + + private static Task Client_Connected() + { + Logger.Debug("Connected"); + return Task.CompletedTask; + } + + //TODO: this is thrid time we implement this.....this has to be fixed!!! + private static SocketGuild FindServerById(ulong id) + { + Logger.Trace($"Trying to find server by Id: {id}"); + return (from s in Core.Client.Guilds where s.Id == id select s).FirstOrDefault(); + } + + private static SocketTextChannel FindChannelById(SocketGuild server, ulong id) + { + Logger.Trace($"Trying to find channel in {server} by id: {id}"); + return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault(); + } + } +} diff --git a/Discord Media Loader.Application/Classes/Job.cs b/Discord Media Loader.Application/Classes/Job.cs new file mode 100644 index 0000000..5a60bae --- /dev/null +++ b/Discord Media Loader.Application/Classes/Job.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Discord; +using Discord.WebSocket; +using DML.Application.Classes; +using SweetLib.Utils; +using static SweetLib.Utils.Logger.Logger; + +namespace DML.AppCore.Classes +{ + public class Job + { + public int Id { get; set; } + public ulong GuildId { get; set; } + public ulong ChannelId { get; set; } + public double KnownTimestamp { get; set; } = 0; + private double StopTimestamp { get; set; } = 0; + private bool IsValid { get; set; } = true; + + internal void Store() + { + Debug("Storing job to database..."); + Trace("Getting jobs collection..."); + var jobDb = Core.Database.GetCollection("jobs"); + + Trace("Adding new value..."); + + if (jobDb.Find(x => x.ChannelId == ChannelId && x.GuildId == GuildId).Any()) + { + jobDb.Update(this); + } + else + { + jobDb.Insert(this); + } + } + + public void Delete() + { + Debug("Deleting job from database..."); + Trace("Getting jobs collection..."); + var jobDb = Core.Database.GetCollection("jobs"); + + Trace("Deleting value..."); + jobDb.Delete(Id); + } + + private SocketGuild FindServerById(ulong id) + { + Trace($"Trying to find server by Id: {id}"); + return (from s in Core.Client.Guilds where s.Id == id select s).FirstOrDefault(); + } + + private SocketTextChannel FindChannelById(SocketGuild server, ulong id) + { + Trace($"Trying to find channel in {server} by id: {id}"); + return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault(); + } + + internal async Task> Scan() + { + Debug($"Starting scan of guild {GuildId} channel {ChannelId}..."); + var result = new List(); + + var limit = 100; + var lastId = ulong.MaxValue; + var isFirst = true; + var finished = false; + + var guild = FindServerById(GuildId); + var channel = FindChannelById(guild, ChannelId); + + if (Math.Abs(StopTimestamp) < 0.4) + StopTimestamp = KnownTimestamp; + Trace("Initialized scanning parameters."); + + while (!finished) + { + Trace("Entering scanning loop..."); + SocketMessage[] messages; + + Trace($"Downloading next {limit} messages..."); + if (isFirst) + { + messages = await channel.GetMessagesAsync(limit).ToArray() as SocketMessage[]; + } + else + { + messages = await channel.GetMessagesAsync(lastId, Direction.Before, limit).ToArray() as SocketMessage[]; + } + Trace($"Downloaded {messages.Length} messages."); + + isFirst = false; + + foreach (var m in messages) + { + if (!IsValid) + return null; + + Debug($"Processing message {m.Id}"); + if (m.Id < lastId) + { + Trace($"Updating lastId ({lastId}) to {m.Id}"); + lastId = m.Id; + } + + if (SweetUtils.DateTimeToUnixTimeStamp(m.CreatedAt.UtcDateTime) <= StopTimestamp) + { + Debug("Found a message with a known timestamp...Stopping scan."); + finished = true; + continue; + } + + Trace($"Message {m.Id} has {m.Attachments.Count} attachments."); + if (m.Attachments.Count > 0) + { + result.Add(m); + Core.Scheduler.TotalAttachments++; + Trace($"Added message {m.Id}"); + } + Debug($"Finished message {m.Id}"); + + Core.Scheduler.MessagesScanned++; + } + + finished = finished || messages.Length < limit; + } + Trace($"Downloaded all messages for guild {GuildId} channel {ChannelId}."); + + Trace("Sorting messages..."); + result.Sort((a, b) => DateTime.Compare(a.CreatedAt.UtcDateTime, b.CreatedAt.UtcDateTime)); + + if (result.Count > 0) + { + Trace("Updating StopTimestamp for next scan..."); + StopTimestamp = SweetUtils.DateTimeToUnixTimeStamp(result[result.Count - 1].CreatedAt.UtcDateTime); + } + + Debug($"Fisnished scan of guild {GuildId} channel {ChannelId}."); + + return result; + } + + public void Stop() + { + IsValid = false; + } + + public static IEnumerable RestoreJobs() + { + Debug("Restoring jobs..."); + Trace("Getting jobs collection..."); + var jobDb = Core.Database.GetCollection("jobs"); + + Trace("Creating new empty job list"); + return jobDb.FindAll(); + } + } +} diff --git a/Discord Media Loader.Application/Classes/JobScheduler.cs b/Discord Media Loader.Application/Classes/JobScheduler.cs new file mode 100644 index 0000000..b81ea96 --- /dev/null +++ b/Discord Media Loader.Application/Classes/JobScheduler.cs @@ -0,0 +1,295 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using Discord.WebSocket; +using DML.Application.Classes; +using SweetLib.Utils; +using SweetLib.Utils.Logger; + +namespace DML.AppCore.Classes +{ + public class JobScheduler + { + private ulong messageScanned = 0; + private ulong totalAttachments = 0; + private ulong attachmentsDownloaded = 0; + + private bool Run { get; set; } = false; + public List JobList { get; set; } = new List(); + public Dictionary> RunningJobs = new Dictionary>(); + internal int RunningThreads { get; set; } = 0; + + internal ulong MessagesScanned + { + get + { + lock (this) + { + return messageScanned; + } + } + set + { + lock (this) + { + messageScanned = value; + } + } + } + + internal ulong TotalAttachments + { + get + { + lock (this) + { + return totalAttachments; + } + } + set + { + lock (this) + { + totalAttachments = value; + } + } + } + + internal ulong AttachmentsDownloaded + { + get + { + lock (this) + { + return attachmentsDownloaded; + } + } + set + { + lock (this) + { + attachmentsDownloaded = value; + } + } + } + + internal ulong AttachmentsToDownload => TotalAttachments - AttachmentsDownloaded; + + public void Stop() + { + Run = false; + } + + public void Start() + { + Run = true; + + Task.Run(async () => + { + Logger.Info("Started JobScheduler..."); + while (Run) + { + Logger.Debug("Entering job list handler loop..."); + //foreach (var job in JobList) + for (var i = JobList.Count - 1; i >= 0; i--) + { + var job = JobList[i]; + Logger.Debug($"Checking job {job}"); + var hasJob = false; + + Logger.Trace("Locking scheduler..."); + lock (this) + { + Logger.Trace("Checking if job is already performed..."); + hasJob = RunningJobs.ContainsKey(job.Id); + } + Logger.Trace("Unlocked scheduler."); + + if (!hasJob) + { + Logger.Debug("Job is not performed yet...Performing job..."); + var queue = new Queue(); + + Logger.Trace("Locking scheduler..."); + lock (this) + { + Logger.Trace("Adding job to running jobs."); + RunningJobs.Add(job.Id, queue); + } + Logger.Trace("Unlocked scheduler."); + + Logger.Trace("Issuing job message scan..."); + var messages = await job.Scan(); + + if (messages == null) + continue; + + Logger.Trace($"Adding {messages.Count} messages to queue..."); + foreach (var msg in messages) + { + queue.Enqueue(msg); + } + Logger.Trace($"Added {queue.Count} messages to queue."); + + if (messages.Count != queue.Count) + Logger.Warn("Not all messages have been added into the queue."); + + var startedDownload = false; + + while (!startedDownload) + { + Logger.Debug("Entering loop to check thread availability"); + Logger.Trace("Locking scheduler..."); + lock (this) + { + Logger.Trace($"Checking thread limit. Running: {RunningThreads}, Max: {Core.Settings.ThreadLimit}"); + if (RunningThreads >= Core.Settings.ThreadLimit) + continue; + + RunningThreads++; + startedDownload = true; + } + Logger.Trace("Unlocked scheduler."); + } + + Logger.Trace("Start downloading job async."); + Task.Run(() => WorkQueue(job.Id)); // do not await to work parallel + } + } + } + }); + } + + private void WorkQueue(int jobId) + { + try + { + Logger.Debug("Beginning job download..."); + Logger.Trace("Finding job..."); + var job = (from j in JobList where j.Id == jobId select j).FirstOrDefault(); + + if (job == null) + { + Logger.Warn($"Associating job not found! JobId: {jobId}"); + return; + } + Logger.Trace("Found job."); + + Queue queue; + Logger.Trace("Locking scheduler..."); + lock (this) + { + Logger.Trace("Finiding queue..."); + if (!RunningJobs.TryGetValue(jobId, out queue)) + { + Logger.Warn($"Queue for job {jobId} not found!"); + return; + } + Logger.Trace("Queue found."); + } + Logger.Trace("Unlocked scheduler."); + + Logger.Debug($"Messages to process for job {jobId}: {queue.Count}"); + while (queue.Count > 0) + { + Logger.Trace("Locking scheduler..."); + lock (this) + { + Logger.Trace("Checking if still a job..."); + if (!RunningJobs.ContainsKey(jobId)) + { + Logger.Warn($"Queue for job {jobId} not found!"); + return; + } + Logger.Trace("Continue working..."); + } + Logger.Trace("Unlocked scheduler."); + + Logger.Trace("Dequeueing message..."); + var message = queue.Dequeue(); + + Logger.Debug($"Attachments for message {message.Id}: {message.Attachments.Count}"); + foreach (var a in message.Attachments) + { + try + { + var fileName = Path.Combine(Core.Settings.OperatingFolder, Core.Settings.FileNameScheme); + + Logger.Trace("Replacing filename placeholders..."); + + var extensionRequired = !fileName.EndsWith("%name%"); + + var serverName = "unknown"; + + var socketTextChannel = message.Channel as SocketTextChannel; + if (socketTextChannel != null) + { + serverName = socketTextChannel.Guild.Name.Replace(":", "").Replace("/", "") + .Replace("\\", ""); + } + + fileName = + fileName.Replace("%guild%", serverName) + .Replace("%channel%", message.Channel.Name) + .Replace("%timestamp%", SweetUtils.DateTimeToUnixTimeStamp(message.CreatedAt.UtcDateTime).ToString()) + .Replace("%name%", a.Filename) + .Replace("%id%", a.Id.ToString()); + + if (extensionRequired) + fileName += Path.GetExtension(a.Filename); + + Logger.Trace($"Detemined file name: {fileName}."); + + + if (File.Exists(fileName) && new FileInfo(fileName).Length == a.Size) + { + Logger.Debug($"{fileName} already existing with its estimated size. Skipping..."); + continue; + } + + Logger.Trace("Determining directory..."); + var fileDirectory = Path.GetDirectoryName(fileName); + + if (!Directory.Exists(fileDirectory)) + { + Logger.Info($"Directory {fileDirectory} does not exist. Creating directory..."); + Directory.CreateDirectory(fileDirectory); + Logger.Debug("Created directory."); + } + + var wc = new WebClient(); + Logger.Debug($"Starting downloading of attachment {a.Id}..."); + + wc.DownloadFile(new Uri(a.Url), fileName); + Logger.Debug($"Downloaded attachment {a.Id}."); + + Logger.Trace("Updating known timestamp for job..."); + job.KnownTimestamp = SweetUtils.DateTimeToUnixTimeStamp(message.CreatedAt.UtcDateTime); + job.Store(); + } + finally + { + AttachmentsDownloaded++; + } + } + } + } + finally + { + Logger.Trace("Locking scheduler..."); + lock (this) + { + Logger.Trace($"Removing {jobId} from running jobs..."); + RunningJobs.Remove(jobId); + Logger.Trace("Decreasing thread count..."); + RunningThreads--; + } + Logger.Trace("Unlocked scheduler."); + } + } + } +} diff --git a/Discord Media Loader.Application/Classes/Settings.cs b/Discord Media Loader.Application/Classes/Settings.cs new file mode 100644 index 0000000..4cc9067 --- /dev/null +++ b/Discord Media Loader.Application/Classes/Settings.cs @@ -0,0 +1,39 @@ +using System.Diagnostics; +using SweetLib.Utils.Logger; + +namespace DML.Application.Classes +{ + public class Settings + { + public int Id { get; } = 1; // using always unique ID + public string Email { get; set; } + public string Password { get; set; } + public string LoginToken { get; set; } + public bool UseUserData { get; set; } = false; + public bool SavePassword { get; set; } = false; + public LogLevel ApplicactionLogLevel { get; set; } = LogLevel.Info | LogLevel.Warn | LogLevel.Error; + public string OperatingFolder { get; set; } + public string FileNameScheme { get; set; } = @"%guild%\%channel%\%id%"; + public bool SkipExistingFiles { get; set; } = true; + public int ThreadLimit { get; set; } = 50; + + public void Store() + { + Logger.Trace("Getting settings collection..."); + var settingsDB = Core.Database.GetCollection("settings"); + + Logger.Debug("Storing settings to database..."); + + if (settingsDB.Exists(_setting => _setting.Id == Id)) + { + Logger.Trace("Updating existing value..."); + settingsDB.Update(this); + } + else + { + Logger.Trace("Adding new value..."); + settingsDB.Insert(this); + } + } + } +} diff --git a/Discord Media Loader.Application/DML.Application.csproj b/Discord Media Loader.Application/DML.Application.csproj index f2e385b..1662b67 100644 --- a/Discord Media Loader.Application/DML.Application.csproj +++ b/Discord Media Loader.Application/DML.Application.csproj @@ -155,6 +155,9 @@ + + + Form @@ -179,6 +182,7 @@ True Resources.resx + @@ -204,6 +208,10 @@ {02c1f8ef-32f2-4e77-a36d-79129402af37} SweetLib + + {4db264a7-2352-4057-b3de-61fcfec01ae5} + DML.AppCore + diff --git a/Discord Media Loader.Application/Dialogs/LoginDialog.cs b/Discord Media Loader.Application/Dialogs/LoginDialog.cs index 6bc566a..16ca42f 100644 --- a/Discord Media Loader.Application/Dialogs/LoginDialog.cs +++ b/Discord Media Loader.Application/Dialogs/LoginDialog.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using DML.Application.Classes; using static SweetLib.Utils.Logger.Logger; namespace DML.Application.Dialogs diff --git a/Discord Media Loader.Application/MainForm.cs b/Discord Media Loader.Application/MainForm.cs index 72adc27..362e675 100644 --- a/Discord Media Loader.Application/MainForm.cs +++ b/Discord Media Loader.Application/MainForm.cs @@ -5,6 +5,8 @@ using System.Reflection; using System.Windows.Forms; using Discord; using Discord.WebSocket; +using DML.AppCore; +using DML.AppCore.Classes; using DML.Application.Classes; using static SweetLib.Utils.Logger.Logger; diff --git a/Discord Media Loader.Application/packages.config b/Discord Media Loader.Application/packages.config index 1b50a5f..d3b12fc 100644 --- a/Discord Media Loader.Application/packages.config +++ b/Discord Media Loader.Application/packages.config @@ -1,6 +1,5 @@  - diff --git a/Discord Media Loader.sln b/Discord Media Loader.sln index 33d02e8..f3279eb 100644 --- a/Discord Media Loader.sln +++ b/Discord Media Loader.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.10 +VisualStudioVersion = 15.0.26730.16 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord Media Loader", "Discord Media Loader\Discord Media Loader.csproj", "{EDC92554-DBC1-4F9C-9317-379A8BF441E8}" EndProject @@ -9,7 +9,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.Application", "Discord EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SweetLib", "..\SweetLib\SweetLib\SweetLib.csproj", "{02C1F8EF-32F2-4E77-A36D-79129402AF37}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.Core", "DML.Core\DML.Core.csproj", "{BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.AppCore", "DML.AppCore\DML.AppCore.csproj", "{4DB264A7-2352-4057-B3DE-61FCFEC01AE5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -29,10 +29,10 @@ Global {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Debug|Any CPU.Build.0 = Debug|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.ActiveCfg = Release|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.Build.0 = Release|Any CPU - {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BADDA2C1-BF8E-40DC-A2B2-80B5D609C4ED}.Release|Any CPU.Build.0 = Release|Any CPU + {4DB264A7-2352-4057-B3DE-61FCFEC01AE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DB264A7-2352-4057-B3DE-61FCFEC01AE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DB264A7-2352-4057-B3DE-61FCFEC01AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DB264A7-2352-4057-B3DE-61FCFEC01AE5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Discord Media Loader/Discord Media Loader.csproj b/Discord Media Loader/Discord Media Loader.csproj index 0977fa7..336e17d 100644 --- a/Discord Media Loader/Discord Media Loader.csproj +++ b/Discord Media Loader/Discord Media Loader.csproj @@ -214,6 +214,10 @@ {c130de6a-3237-42b5-be9f-783d1cd104c6} DML.Application + + {4db264a7-2352-4057-b3de-61fcfec01ae5} + DML.AppCore +