diff --git a/Discord Media Loader.Application/Classes/Core.cs b/Discord Media Loader.Application/Classes/Core.cs index a0c99e3..4cef719 100644 --- a/Discord Media Loader.Application/Classes/Core.cs +++ b/Discord Media Loader.Application/Classes/Core.cs @@ -175,7 +175,7 @@ namespace DML.Application.Classes if (!string.IsNullOrEmpty(Settings.LoginToken)) { Logger.Debug("Trying to login with last known token..."); - loggedIn= await DMLClient.Login(Settings.LoginToken); + loggedIn = await DMLClient.Login(Settings.LoginToken); } if (!loggedIn) @@ -230,7 +230,7 @@ namespace DML.Application.Classes splash.Close(); Logger.Info("Starting scheduler..."); - Scheduler.Start(); + Scheduler.ScanAll(); System.Windows.Forms.Application.Run(new MainForm()); diff --git a/Discord Media Loader.Application/Classes/Job.cs b/Discord Media Loader.Application/Classes/Job.cs index 34174e9..8fc31e2 100644 --- a/Discord Media Loader.Application/Classes/Job.cs +++ b/Discord Media Loader.Application/Classes/Job.cs @@ -156,7 +156,8 @@ namespace DML.AppCore.Classes ChannelId = r.Channel.Id, DownloadSource = a.Url, Filename = a.Filename, - TimeStamp = SweetUtils.DateTimeToUnixTimeStamp(r.CreatedAt.UtcDateTime) + TimeStamp = SweetUtils.DateTimeToUnixTimeStamp(r.CreatedAt.UtcDateTime), + FileSize = a.Size }; mediaData.Store(); } diff --git a/Discord Media Loader.Application/Classes/JobScheduler.cs b/Discord Media Loader.Application/Classes/JobScheduler.cs index cb49f29..e0cdc56 100644 --- a/Discord Media Loader.Application/Classes/JobScheduler.cs +++ b/Discord Media Loader.Application/Classes/JobScheduler.cs @@ -6,11 +6,11 @@ using System.Net; using System.Threading.Tasks; using Discord; using Discord.WebSocket; -using DML.Application.Classes; +using DML.AppCore.Classes; using SweetLib.Utils; using SweetLib.Utils.Logger; -namespace DML.AppCore.Classes +namespace DML.Application.Classes { public class JobScheduler { @@ -82,7 +82,7 @@ namespace DML.AppCore.Classes Run = false; } - public void StartAll() + public void ScanAll() { Logger.Info("Started JobScheduler..."); @@ -106,136 +106,5 @@ namespace DML.AppCore.Classes } } } - - private void WorkQueue(int jobId) - { - try - { - Logger.Debug("Beginning attachment 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; - serverName = Path.GetInvalidFileNameChars().Aggregate(serverName, (current, c) => current.Replace(c, ' ')); - } - - var channelName = message.Channel.Name; - channelName = Path.GetInvalidFileNameChars().Aggregate(channelName, (current, c) => current.Replace(c, ' ')); - - fileName = - fileName.Replace("%guild%", serverName) - .Replace("%channel%", channelName) - .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/MediaData.cs b/Discord Media Loader.Application/Classes/MediaData.cs index da8c160..f46e8ec 100644 --- a/Discord Media Loader.Application/Classes/MediaData.cs +++ b/Discord Media Loader.Application/Classes/MediaData.cs @@ -1,9 +1,14 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Net; using System.Text; using System.Threading.Tasks; using DML.AppCore.Classes; +using DML.Client; +using SweetLib.Utils; +using SweetLib.Utils.Logger; using static SweetLib.Utils.Logger.Logger; namespace DML.Application.Classes @@ -13,9 +18,10 @@ namespace DML.Application.Classes public ulong Id { get; set; } public string DownloadSource { get; set; } public ulong GuildId { get; set; } - public ulong ChannelId { get; set;} + public ulong ChannelId { get; set; } public double TimeStamp { get; set; } public string Filename { get; set; } + public int FileSize { get; set; } internal void Store() { @@ -44,5 +50,50 @@ namespace DML.Application.Classes Trace("Deleting value..."); db.Delete(Id); } + + internal async Task Download() + { + Trace("Beginning attachment download..."); + + Debug("Building filename..."); + var fileName = Path.Combine(Core.Settings.OperatingFolder, Core.Settings.FileNameScheme); + + Debug($"Base filename: {fileName}"); + + Trace("Determining if extension is required"); + var extensionRequired = !fileName.EndsWith("%name%"); + Trace($"Extension required: {extensionRequired}"); + + Trace("Replacing filename placeholders..."); + var guildName = DMLClient.Client.GetGuild(GuildId)?.Name ?? GuildId.ToString(); + var channelName = DMLClient.Client.GetGuild(GuildId)?.GetChannel(ChannelId)?.Name ?? ChannelId.ToString(); + + fileName = + fileName.Replace("%guild%", guildName) + .Replace("%channel%", channelName) + .Replace("%timestamp%", TimeStamp.ToString("####")) + .Replace("%name%", Filename) + .Replace("%id%", Id.ToString()); + + Trace("Adding extension if required"); + if (extensionRequired) + fileName += Path.GetExtension(Filename); + + Debug($"Final filename: {fileName}"); + + if (File.Exists(fileName) && new FileInfo(fileName).Length == FileSize) + { + Logger.Debug($"{fileName} already existing with its estimated size. Skipping..."); + return; + } + + var wc = new WebClient(); + Logger.Debug($"Starting downloading of attachment {Id}..."); + wc.DownloadFile(new Uri(DownloadSource), fileName); + Logger.Debug($"Downloaded attachment {Id}."); + + + Core.Scheduler.AttachmentsDownloaded++; + } } }