Compare commits

..

No commits in common. "master" and "v0.99.148.0" have entirely different histories.

48 changed files with 598 additions and 2508 deletions

View file

@ -1,8 +0,0 @@
version: 2
updates:
- package-ecosystem: nuget
directory: "/"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 10

View file

@ -1,14 +0,0 @@
name: auto-merge
on:
pull_request:
jobs:
auto-merge:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.3.3
- uses: ahmadnassri/action-dependabot-auto-merge@v2.1.2
with:
target: minor
github-token: ${{ secrets.PR_AUTO_MERGE }}

View file

@ -1,70 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '43 14 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

1
.gitignore vendored
View file

@ -250,4 +250,3 @@ paket-files/
# JetBrains Rider # JetBrains Rider
.idea/ .idea/
*.sln.iml *.sln.iml
install/Discord_Media_Loader_Setup.exe

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "libs/Discord.Net"]
path = libs/Discord.Net
url = https://github.com/Serraniel/Discord.Net.git

View file

@ -1,17 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Discord.Net" Version="1.0.2" />
<PackageReference Include="Discord.Net.Commands" Version="1.0.2" />
<PackageReference Include="LiteDB" Version="3.1.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\SweetLib\SweetLib\SweetLib.csproj" />
</ItemGroup>
</Project>

View file

@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyVersion>1.1.0.0</AssemblyVersion>
<FileVersion>1.1.0.0</FileVersion>
<Version>1.1.0</Version>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\libs\Discord.Net\src\Discord.Net.Core\Discord.Net.Core.csproj" />
<ProjectReference Include="..\libs\Discord.Net\src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" />
</ItemGroup>
</Project>

View file

@ -1,25 +0,0 @@
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;
namespace DML.Client
{
public static class DMLClient
{
public static DiscordSocketClient Client { get; set; } = new DiscordSocketClient(new DiscordSocketConfig() { DefaultRetryMode = RetryMode.RetryRatelimit | RetryMode.RetryTimeouts });
public static async Task<bool> Login(string token)
{
await Client.LoginAsync(TokenType.User, token);
await Client.StartAsync();
await Task.Delay(1000);
while (Client.LoginState == LoginState.LoggingIn || Client.ConnectionState == ConnectionState.Connecting)
{
// wait
}
return Client.LoginState == LoginState.LoggedIn && Client.ConnectionState == ConnectionState.Connected;
}
}
}

View file

@ -1,158 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;
namespace DML.Core.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 = DML.Core.Core.Database.GetCollection<Job>("jobs");
Trace("Adding new value...");
if (jobDb.Find(x => x.ChannelId == ChannelId && x.GuildId == GuildId).Any())
{
jobDb.Update(this);
}
else
{
jobDb.Insert(this);
}
}
internal void Delete()
{
Debug("Deleting job from database...");
Trace("Getting jobs collection...");
var jobDb = DML.Core.Core.Database.GetCollection<Job>("jobs");
Trace("Deleting value...");
jobDb.Delete(Id);
}
private SocketGuild FindServerById(ulong id)
{
Trace($"Trying to find server by Id: {id}");
return (from s in DML.Core.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<List<SocketMessage>> Scan()
{
Debug($"Starting scan of guild {GuildId} channel {ChannelId}...");
var result = new List<SocketMessage>();
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);
DML.Core.Core.Scheduler.TotalAttachments++;
Trace($"Added message {m.Id}");
}
Debug($"Finished message {m.Id}");
DML.Core.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;
}
internal void Stop()
{
IsValid = false;
}
internal static IEnumerable<Job> RestoreJobs()
{
Debug("Restoring jobs...");
Trace("Getting jobs collection...");
var jobDb = DML.Core.Core.Database.GetCollection<Job>("jobs");
Trace("Creating new empty job list");
return jobDb.FindAll();
}
}
}

View file

@ -1,290 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Discord.WebSocket;
namespace DML.Core.Classes
{
internal class JobScheduler
{
private ulong messageScanned = 0;
private ulong totalAttachments = 0;
private ulong attachmentsDownloaded = 0;
private bool Run { get; set; } = false;
internal List<Job> JobList { get; set; } = new List<Job>();
internal Dictionary<int, Queue<SocketMessage>> RunningJobs = new Dictionary<int, Queue<SocketMessage>>();
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;
internal void Stop()
{
Run = false;
}
internal void Start()
{
Run = true;
Task.Run(async () =>
{
Info("Started JobScheduler...");
while (Run)
{
Debug("Entering job list handler loop...");
//foreach (var job in JobList)
for (var i = JobList.Count - 1; i >= 0; i--)
{
var job = JobList[i];
Debug($"Checking job {job}");
var hasJob = false;
Trace("Locking scheduler...");
lock (this)
{
Trace("Checking if job is already performed...");
hasJob = RunningJobs.ContainsKey(job.Id);
}
Trace("Unlocked scheduler.");
if (!hasJob)
{
Debug("Job is not performed yet...Performing job...");
var queue = new Queue<SocketMessage>();
Trace("Locking scheduler...");
lock (this)
{
Trace("Adding job to running jobs.");
RunningJobs.Add(job.Id, queue);
}
Trace("Unlocked scheduler.");
Trace("Issuing job message scan...");
var messages = await job.Scan();
if (messages == null)
continue;
Trace($"Adding {messages.Count} messages to queue...");
foreach (var msg in messages)
{
queue.Enqueue(msg);
}
Trace($"Added {queue.Count} messages to queue.");
if (messages.Count != queue.Count)
Warn("Not all messages have been added into the queue.");
var startedDownload = false;
while (!startedDownload)
{
Debug("Entering loop to check thread availability");
Trace("Locking scheduler...");
lock (this)
{
Trace($"Checking thread limit. Running: {RunningThreads}, Max: {DML.Core.Core.Settings.ThreadLimit}");
if (RunningThreads >= DML.Core.Core.Settings.ThreadLimit)
continue;
RunningThreads++;
startedDownload = true;
}
Trace("Unlocked scheduler.");
}
Trace("Start downloading job async.");
Task.Run(() => WorkQueue(job.Id)); // do not await to work parallel
}
}
}
});
}
private void WorkQueue(int jobId)
{
try
{
Debug("Beginning job download...");
Trace("Finding job...");
var job = (from j in JobList where j.Id == jobId select j).FirstOrDefault();
if (job == null)
{
Warn($"Associating job not found! JobId: {jobId}");
return;
}
Trace("Found job.");
Queue<SocketMessage> queue;
Trace("Locking scheduler...");
lock (this)
{
Trace("Finiding queue...");
if (!RunningJobs.TryGetValue(jobId, out queue))
{
Warn($"Queue for job {jobId} not found!");
return;
}
Trace("Queue found.");
}
Trace("Unlocked scheduler.");
Debug($"Messages to process for job {jobId}: {queue.Count}");
while (queue.Count > 0)
{
Trace("Locking scheduler...");
lock (this)
{
Trace("Checking if still a job...");
if (!RunningJobs.ContainsKey(jobId))
{
Warn($"Queue for job {jobId} not found!");
return;
}
Trace("Continue working...");
}
Trace("Unlocked scheduler.");
Trace("Dequeueing message...");
var message = queue.Dequeue();
Debug($"Attachments for message {message.Id}: {message.Attachments.Count}");
foreach (var a in message.Attachments)
{
try
{
var fileName = Path.Combine(DML.Core.Core.Settings.OperatingFolder, DML.Core.Core.Settings.FileNameScheme);
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);
Trace($"Detemined file name: {fileName}.");
if (File.Exists(fileName) && new FileInfo(fileName).Length == a.Size)
{
Debug($"{fileName} already existing with its estimated size. Skipping...");
continue;
}
Trace("Determining directory...");
var fileDirectory = Path.GetDirectoryName(fileName);
if (!Directory.Exists(fileDirectory))
{
Info($"Directory {fileDirectory} does not exist. Creating directory...");
Directory.CreateDirectory(fileDirectory);
Debug("Created directory.");
}
var wc = new WebClient();
Debug($"Starting downloading of attachment {a.Id}...");
wc.DownloadFile(new Uri(a.Url), fileName);
Debug($"Downloaded attachment {a.Id}.");
Trace("Updating known timestamp for job...");
job.KnownTimestamp = SweetUtils.DateTimeToUnixTimeStamp(message.CreatedAt.UtcDateTime);
job.Store();
}
finally
{
AttachmentsDownloaded++;
}
}
}
}
finally
{
Trace("Locking scheduler...");
lock (this)
{
Trace($"Removing {jobId} from running jobs...");
RunningJobs.Remove(jobId);
Trace("Decreasing thread count...");
RunningThreads--;
}
Trace("Unlocked scheduler.");
}
}
}
}

View file

@ -1,38 +0,0 @@
using System.Diagnostics;
namespace DML.Core.Classes
{
internal 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;
internal void Store()
{
Trace("Getting settings collection...");
var settingsDB = DML.Core.Core.Database.GetCollection<Settings>("settings");
Debug("Storing settings to database...");
if (settingsDB.Exists(_setting => _setting.Id == Id))
{
Trace("Updating existing value...");
settingsDB.Update(this);
}
else
{
Trace("Adding new value...");
settingsDB.Insert(this);
}
}
}
}

View file

@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Discord.Net" Version="1.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\SweetLib\SweetLib\SweetLib.csproj" />
</ItemGroup>
</Project>

View file

@ -1,289 +0,0 @@
using Discord;
using Discord.Net;
using Discord.WebSocket;
using DML.AppCore.Classes;
using DML.Application.Dialogs;
using DML.Client;
using LiteDB;
using SharpRaven;
using SharpRaven.Data;
using SweetLib.Utils;
using SweetLib.Utils.Logger;
using SweetLib.Utils.Logger.Memory;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime;
using System.Threading.Tasks;
using System.Windows.Forms;
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 RavenClient Raven = new RavenClient("https://0de964231669473e9098b9f6cc1d6278:79d9f2eb24034de199b2a37cc058e0f2@sentry.io/257114");
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>("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();
}
if (Settings.ShowStartUpHints)
{
if (MessageBox.Show(splash, "This tool is considered as a selfbot which may violate the Discord TOS. By using this tool you take the risk to get your account banned. Although this never happened yet (as far as I know) you have to confirm to this.\n\r\n\rDo you wish to continue?", "HOLD UP!!", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
splash.Close();
return;
}
Settings.ShowStartUpHints = false;
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...");
var config = new DiscordSocketConfig()
{
DefaultRetryMode = RetryMode.AlwaysRetry,
};
//Client = new DiscordSocketClient(config);
DMLClient.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...");
DMLClient.Client.Connected += Client_Connected;
var loggedIn = false;
while (!loggedIn)
{
try
{
if (!string.IsNullOrEmpty(Settings.LoginToken))
{
Logger.Debug("Trying to login with last known token...");
loggedIn = await DMLClient.Login(Settings.LoginToken);
}
}
catch (HttpException)
{
Logger.Warn("HTTPException occured during login. Probably from login token.");
}
if (!loggedIn)
{
Logger.Debug("Showing dialog for username and password...");
var loginDlg = new LoginDialog();
if (loginDlg.ShowDialog() != DialogResult.OK)
{
return;
}
}
}
Logger.Debug("Start checking for invalid jobs...");
//Client
while (DMLClient.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} [{ex.GetType().Name}] occured at: {ex.StackTrace}");
if (MessageBox.Show($"An error occured while running Discord Media Loader:\n{ex.GetType().Name}: {ex.Message}\n\nDo you aggree to sending the error report to the creator of the tool?", "Discord Media Loader", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
Raven.Capture(new SentryEvent(ex));
}
}
}
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 DMLClient.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();
}
}
}

View file

@ -1,15 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord; using Discord;
using Discord.WebSocket; using SweetLib.Utils;
using DML.Application.Classes;
using DML.Client;
using SweetLib.Utils.Extensions;
using static SweetLib.Utils.Logger.Logger; using static SweetLib.Utils.Logger.Logger;
namespace DML.AppCore.Classes namespace DML.Application.Classes
{ {
public class Job public class Job
{ {
@ -17,7 +16,7 @@ namespace DML.AppCore.Classes
public ulong GuildId { get; set; } public ulong GuildId { get; set; }
public ulong ChannelId { get; set; } public ulong ChannelId { get; set; }
public double KnownTimestamp { get; set; } = 0; public double KnownTimestamp { get; set; } = 0;
private double StopTimestamp { get; set; } private double StopTimestamp { get; set; } = 0;
private bool IsValid { get; set; } = true; private bool IsValid { get; set; } = true;
internal void Store() internal void Store()
@ -29,12 +28,16 @@ namespace DML.AppCore.Classes
Trace("Adding new value..."); Trace("Adding new value...");
if (jobDb.Find(x => x.ChannelId == ChannelId && x.GuildId == GuildId).Any()) if (jobDb.Find(x => x.ChannelId == ChannelId && x.GuildId == GuildId).Any())
{
jobDb.Update(this); jobDb.Update(this);
}
else else
{
jobDb.Insert(this); jobDb.Insert(this);
}
} }
public void Delete() internal void Delete()
{ {
Debug("Deleting job from database..."); Debug("Deleting job from database...");
Trace("Getting jobs collection..."); Trace("Getting jobs collection...");
@ -44,22 +47,22 @@ namespace DML.AppCore.Classes
jobDb.Delete(Id); jobDb.Delete(Id);
} }
private SocketGuild FindServerById(ulong id) private Server FindServerById(ulong id)
{ {
Trace($"Trying to find server by Id: {id}"); Trace($"Trying to find server by Id: {id}");
return (from s in DMLClient.Client.Guilds where s.Id == id select s).FirstOrDefault(); return (from s in Core.Client.Servers where s.Id == id select s).FirstOrDefault();
} }
private SocketTextChannel FindChannelById(SocketGuild server, ulong id) private Channel FindChannelById(Server server, ulong id)
{ {
Trace($"Trying to find channel in {server} by id: {id}"); Trace($"Trying to find channel in {server} by id: {id}");
return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault(); return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault();
} }
internal async Task<List<IMessage>> Scan() internal async Task<List<Message>> Scan()
{ {
Debug($"Starting scan of guild {GuildId} channel {ChannelId}..."); Debug($"Starting scan of guild {GuildId} channel {ChannelId}...");
var result = new List<IMessage>(); var result = new List<Message>();
var limit = 100; var limit = 100;
var lastId = ulong.MaxValue; var lastId = ulong.MaxValue;
@ -69,14 +72,6 @@ namespace DML.AppCore.Classes
var guild = FindServerById(GuildId); var guild = FindServerById(GuildId);
var channel = FindChannelById(guild, ChannelId); var channel = FindChannelById(guild, ChannelId);
Debug("Checking channel access");
//channel.GetUser(channel.Guild.CurrentUser.Id);
if (channel.GetUser(channel.Guild.CurrentUser.Id) == null)
{
Info("Skipping channel without access");
return result;
}
if (Math.Abs(StopTimestamp) < 0.4) if (Math.Abs(StopTimestamp) < 0.4)
StopTimestamp = KnownTimestamp; StopTimestamp = KnownTimestamp;
Trace("Initialized scanning parameters."); Trace("Initialized scanning parameters.");
@ -84,30 +79,18 @@ namespace DML.AppCore.Classes
while (!finished) while (!finished)
{ {
Trace("Entering scanning loop..."); Trace("Entering scanning loop...");
var messages = new List<IMessage>(); Message[] messages;
Trace($"Downloading next {limit} messages..."); Trace($"Downloading next {limit} messages...");
if (isFirst) if (isFirst)
{ {
//messages = await channel.GetMessagesAsync(limit).ToArray() as SocketMessage[]; messages = await channel.DownloadMessages(limit, null);
var realMessages = await channel.GetMessagesAsync(limit).ToArrayAsync();
foreach (var realMessageArray in realMessages)
foreach (var realMessage in realMessageArray)
messages.Add(realMessage);
} }
else else
{ {
var realMessages = await channel.GetMessagesAsync(lastId, Direction.Before, limit).ToArrayAsync(); messages = await channel.DownloadMessages(limit, lastId);
foreach (var realMessageArray in realMessages)
foreach (var realMessage in realMessageArray)
messages.Add(realMessage);
//messages = await channel.GetMessagesAsync(lastId, Direction.Before, limit).ToArray() as SocketMessage[];
} }
Trace($"Downloaded {messages.Length} messages.");
Trace($"Downloaded {messages.Count} messages.");
isFirst = false; isFirst = false;
@ -116,8 +99,6 @@ namespace DML.AppCore.Classes
if (!IsValid) if (!IsValid)
return null; return null;
Core.Scheduler.MessagesScanned++;
Debug($"Processing message {m.Id}"); Debug($"Processing message {m.Id}");
if (m.Id < lastId) if (m.Id < lastId)
{ {
@ -125,36 +106,36 @@ namespace DML.AppCore.Classes
lastId = m.Id; lastId = m.Id;
} }
if (m.CreatedAt.UtcDateTime.ToUnixTimeStamp() <= StopTimestamp) if (SweetUtils.DateTimeToUnixTimeStamp(m.Timestamp) <= StopTimestamp)
{ {
Debug("Found a message with a known timestamp...Stopping scan."); Debug("Found a message with a known timestamp...Stopping scan.");
finished = true; finished = true;
continue; continue;
} }
Trace($"Message {m.Id} has {m.Attachments.Count} attachments."); Trace($"Message {m.Id} has {m.Attachments.Length} attachments.");
if (m.Attachments.Count > 0) if (m.Attachments.Length > 0)
{ {
result.Add(m); result.Add(m);
Core.Scheduler.TotalAttachments += (ulong) m.Attachments.Count; Core.Scheduler.TotalAttachments++;
Trace($"Added message {m.Id}"); Trace($"Added message {m.Id}");
} }
Debug($"Finished message {m.Id}"); Debug($"Finished message {m.Id}");
Core.Scheduler.MessagesScanned++;
} }
finished = finished || messages.Count < limit; finished = finished || messages.Length < limit;
} }
Trace($"Downloaded all messages for guild {GuildId} channel {ChannelId}."); Trace($"Downloaded all messages for guild {GuildId} channel {ChannelId}.");
Trace("Sorting messages..."); Trace("Sorting messages...");
result.Sort((a, b) => DateTime.Compare(a.CreatedAt.UtcDateTime, b.CreatedAt.UtcDateTime)); result.Sort((a, b) => DateTime.Compare(a.Timestamp, b.Timestamp));
if (result.Count > 0) if (result.Count > 0)
{ {
Trace("Updating StopTimestamp for next scan..."); Trace("Updating StopTimestamp for next scan...");
StopTimestamp = result[result.Count - 1].CreatedAt.UtcDateTime.ToUnixTimeStamp(); StopTimestamp = SweetUtils.DateTimeToUnixTimeStamp(result[result.Count - 1].Timestamp);
} }
Debug($"Fisnished scan of guild {GuildId} channel {ChannelId}."); Debug($"Fisnished scan of guild {GuildId} channel {ChannelId}.");
@ -162,12 +143,12 @@ namespace DML.AppCore.Classes
return result; return result;
} }
public void Stop() internal void Stop()
{ {
IsValid = false; IsValid = false;
} }
public static IEnumerable<Job> RestoreJobs() internal static IEnumerable<Job> RestoreJobs()
{ {
Debug("Restoring jobs..."); Debug("Restoring jobs...");
Trace("Getting jobs collection..."); Trace("Getting jobs collection...");

View file

@ -1,27 +1,28 @@
using System; using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord; using Discord;
using Discord.WebSocket; using SweetLib.Utils;
using DML.Application.Classes; using static SweetLib.Utils.Logger.Logger;
using SweetLib.Utils.Extensions;
using SweetLib.Utils.Logger;
namespace DML.AppCore.Classes namespace DML.Application.Classes
{ {
public class JobScheduler internal class JobScheduler
{ {
private ulong attachmentsDownloaded; private ulong messageScanned = 0;
private ulong messageScanned; private ulong totalAttachments = 0;
public Dictionary<int, Queue<IMessage>> RunningJobs = new Dictionary<int, Queue<IMessage>>(); private ulong attachmentsDownloaded = 0;
private ulong totalAttachments;
private bool Run { get; set; } private bool Run { get; set; } = false;
public List<Job> JobList { get; set; } = new List<Job>(); internal List<Job> JobList { get; set; } = new List<Job>();
internal int RunningThreads { get; set; } internal Dictionary<int, Queue<Message>> RunningJobs = new Dictionary<int, Queue<Message>>();
internal int RunningThreads { get; set; } = 0;
internal ulong MessagesScanned internal ulong MessagesScanned
{ {
@ -77,94 +78,90 @@ namespace DML.AppCore.Classes
} }
} }
public void Stop() internal ulong AttachmentsToDownload => TotalAttachments - AttachmentsDownloaded;
internal void Stop()
{ {
Run = false; Run = false;
} }
public void Start() internal void Start()
{ {
Run = true; Run = true;
Task.Run(async () => Task.Run(async () =>
{ {
Logger.Info("Started JobScheduler..."); Info("Started JobScheduler...");
while (Run) while (Run)
try {
Debug("Entering job list handler loop...");
//foreach (var job in JobList)
for(var i = JobList.Count-1;i>=0;i--)
{ {
Logger.Debug("Entering job list handler loop..."); var job = JobList[i];
//foreach (var job in JobList) Debug($"Checking job {job}");
for (var i = JobList.Count - 1; i >= 0; i--) var hasJob = false;
{
var job = JobList[i];
Logger.Debug($"Checking job {job}");
var hasJob = false;
Logger.Trace("Locking scheduler..."); Trace("Locking scheduler...");
lock (this)
{
Trace("Checking if job is already performed...");
hasJob = RunningJobs.ContainsKey(job.Id);
}
Trace("Unlocked scheduler.");
if (!hasJob)
{
Debug("Job is not performed yet...Performing job...");
var queue = new Queue<Message>();
Trace("Locking scheduler...");
lock (this) lock (this)
{ {
Logger.Trace("Checking if job is already performed..."); Trace("Adding job to running jobs.");
hasJob = RunningJobs.ContainsKey(job.Id); RunningJobs.Add(job.Id, queue);
} }
Trace("Unlocked scheduler.");
Logger.Trace("Unlocked scheduler."); Trace("Issuing job message scan...");
var messages = await job.Scan();
if (!hasJob) if(messages==null)
continue;
Trace($"Adding {messages.Count} messages to queue...");
foreach (var msg in messages)
{ {
Logger.Debug("Job is not performed yet...Performing job..."); queue.Enqueue(msg);
var queue = new Queue<IMessage>(); }
Trace($"Added {queue.Count} messages to queue.");
Logger.Trace("Locking scheduler..."); if (messages.Count != queue.Count)
Warn("Not all messages have been added into the queue.");
var startedDownload = false;
while (!startedDownload)
{
Debug("Entering loop to check thread availability");
Trace("Locking scheduler...");
lock (this) lock (this)
{ {
Logger.Trace("Adding job to running jobs."); Trace($"Checking thread limit. Running: {RunningThreads}, Max: {Core.Settings.ThreadLimit}");
RunningJobs.Add(job.Id, queue); if (RunningThreads >= Core.Settings.ThreadLimit)
continue;
RunningThreads++;
startedDownload = true;
} }
Trace("Unlocked scheduler.");
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
} }
Trace("Start downloading job async.");
Task.Run(() => WorkQueue(job.Id)); // do not await to work parallel
} }
} }
catch (Exception ex) }
{
Logger.Error(ex.Message);
}
}); });
} }
@ -172,168 +169,117 @@ namespace DML.AppCore.Classes
{ {
try try
{ {
Logger.Debug("Beginning job download..."); Debug("Beginning job download...");
Logger.Trace("Finding job..."); Trace("Finding job...");
var job = (from j in JobList where j.Id == jobId select j).FirstOrDefault(); var job = (from j in JobList where j.Id == jobId select j).FirstOrDefault();
if (job == null) if (job == null)
{ {
Logger.Warn($"Associating job not found! JobId: {jobId}"); Warn($"Associating job not found! JobId: {jobId}");
return; return;
} }
Trace("Found job.");
Logger.Trace("Found job."); Queue<Message> queue;
Trace("Locking scheduler...");
Queue<IMessage> queue;
Logger.Trace("Locking scheduler...");
lock (this) lock (this)
{ {
Logger.Trace("Finiding queue..."); Trace("Finiding queue...");
if (!RunningJobs.TryGetValue(jobId, out queue)) if (!RunningJobs.TryGetValue(jobId, out queue))
{ {
Logger.Warn($"Queue for job {jobId} not found!"); Warn($"Queue for job {jobId} not found!");
return; return;
} }
Trace("Queue found.");
Logger.Trace("Queue found.");
} }
Trace("Unlocked scheduler.");
Logger.Trace("Unlocked scheduler."); Debug($"Messages to process for job {jobId}: {queue.Count}");
Logger.Debug($"Messages to process for job {jobId}: {queue.Count}");
while (queue.Count > 0) while (queue.Count > 0)
{ {
Logger.Trace("Locking scheduler..."); Trace("Locking scheduler...");
lock (this) lock (this)
{ {
Logger.Trace("Checking if still a job..."); Trace("Checking if still a job...");
if (!RunningJobs.ContainsKey(jobId)) if (!RunningJobs.ContainsKey(jobId))
{ {
Logger.Warn($"Queue for job {jobId} not found!"); Warn($"Queue for job {jobId} not found!");
return; return;
} }
Trace("Continue working...");
Logger.Trace("Continue working...");
} }
Trace("Unlocked scheduler.");
Logger.Trace("Unlocked scheduler."); Trace("Dequeueing message...");
Logger.Trace("Dequeueing message...");
var message = queue.Dequeue(); var message = queue.Dequeue();
Logger.Debug($"Attachments for message {message.Id}: {message.Attachments.Count}"); Debug($"Attachments for message {message.Id}: {message.Attachments.Length}");
foreach (var a in message.Attachments) foreach (var a in message.Attachments)
{
try try
{ {
var fileName = Path.Combine(Core.Settings.OperatingFolder, Core.Settings.FileNameScheme); var fileName = Path.Combine(Core.Settings.OperatingFolder, Core.Settings.FileNameScheme);
Logger.Trace("Replacing filename placeholders..."); Trace("Replacing filename placeholders...");
var extensionRequired = !fileName.EndsWith("%name%"); var extensionRequired = !fileName.EndsWith("%name%");
var serverName = "unknown";
string nickname = null;
if (fileName.Contains("%guild%") || fileName.Contains("%nickname%"))
{
var socketTextChannel = message.Channel as SocketTextChannel;
if (socketTextChannel != null)
{
// fetch servername
serverName = socketTextChannel.Guild.Name;
serverName = Path.GetInvalidFileNameChars()
.Aggregate(serverName, (current, c) => current.Replace(c, ' '));
// fetch nickname
if (fileName.Contains("%nickname%"))
{
var serverUser =
socketTextChannel.GetUser(message.Author
.Id); // can be null if user left the server
if (serverUser != null)
{
nickname = serverUser.Nickname;
if (!string.IsNullOrEmpty(nickname))
nickname = Path.GetInvalidFileNameChars()
.Aggregate(nickname, (current, c) => current.Replace(c, ' '));
}
}
}
}
// fetch channelname
var channelName = message.Channel.Name;
channelName = Path.GetInvalidFileNameChars()
.Aggregate(channelName, (current, c) => current.Replace(c, ' '));
// fetch username
var username = message.Author.Username;
username = Path.GetInvalidFileNameChars()
.Aggregate(username, (current, c) => current.Replace(c, ' '));
fileName = fileName =
fileName.Replace("%guild%", serverName) fileName.Replace("%guild%", message.Server.Name.Replace(":","").Replace("/","").Replace("\\",""))
.Replace("%channel%", channelName) .Replace("%channel%", message.Channel.Name)
.Replace("%timestamp%", message.CreatedAt.UtcDateTime.ToUnixTimeStamp().ToString()) .Replace("%timestamp%", SweetUtils.DateTimeToUnixTimeStamp(message.Timestamp).ToString())
.Replace("%name%", a.Filename) .Replace("%name%", a.Filename)
.Replace("%id%", a.Id.ToString()) .Replace("%id%", a.Id);
.Replace("%userid%", message.Author.Id.ToString())
.Replace("%username%", username)
.Replace("%nickname%",
!string.IsNullOrEmpty(nickname) ? nickname : username);
if (extensionRequired) if (extensionRequired)
fileName += Path.GetExtension(a.Filename); fileName += Path.GetExtension(a.Filename);
Logger.Trace($"Detemined file name: {fileName}."); Trace($"Detemined file name: {fileName}.");
if (File.Exists(fileName) && new FileInfo(fileName).Length == a.Size) if (File.Exists(fileName) && new FileInfo(fileName).Length == a.Size)
{ {
Logger.Debug($"{fileName} already existing with its estimated size. Skipping..."); Debug($"{fileName} already existing with its estimated size. Skipping...");
continue; continue;
} }
Logger.Trace("Determining directory..."); Trace("Determining directory...");
var fileDirectory = Path.GetDirectoryName(fileName); var fileDirectory = Path.GetDirectoryName(fileName);
if (!Directory.Exists(fileDirectory)) if (!Directory.Exists(fileDirectory))
{ {
Logger.Info($"Directory {fileDirectory} does not exist. Creating directory..."); Info($"Directory {fileDirectory} does not exist. Creating directory...");
Directory.CreateDirectory(fileDirectory); Directory.CreateDirectory(fileDirectory);
Logger.Debug("Created directory."); Debug("Created directory.");
} }
var wc = new WebClient(); var wc = new WebClient();
Logger.Debug($"Starting downloading of attachment {a.Id}..."); Debug($"Starting downloading of attachment {a.Id}...");
wc.DownloadFile(new Uri(a.Url), fileName); wc.DownloadFile(new Uri(a.Url), fileName);
Logger.Debug($"Downloaded attachment {a.Id}."); Debug($"Downloaded attachment {a.Id}.");
Logger.Trace("Updating known timestamp for job..."); Trace("Updating known timestamp for job...");
job.KnownTimestamp = message.CreatedAt.UtcDateTime.ToUnixTimeStamp(); job.KnownTimestamp = SweetUtils.DateTimeToUnixTimeStamp(message.Timestamp);
job.Store(); job.Store();
} }
finally finally
{ {
AttachmentsDownloaded++; AttachmentsDownloaded++;
} }
}
} }
} }
finally finally
{ {
Logger.Trace("Locking scheduler..."); Trace("Locking scheduler...");
lock (this) lock (this)
{ {
Logger.Trace($"Removing {jobId} from running jobs..."); Trace($"Removing {jobId} from running jobs...");
RunningJobs.Remove(jobId); RunningJobs.Remove(jobId);
Logger.Trace("Decreasing thread count..."); Trace("Decreasing thread count...");
RunningThreads--; RunningThreads--;
} }
Trace("Unlocked scheduler.");
Logger.Trace("Unlocked scheduler.");
} }
} }
} }

View file

@ -1,8 +1,15 @@
using SweetLib.Utils.Logger; 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;
namespace DML.Application.Classes namespace DML.Application.Classes
{ {
public class Settings internal class Settings
{ {
public int Id { get; } = 1; // using always unique ID public int Id { get; } = 1; // using always unique ID
public string Email { get; set; } public string Email { get; set; }
@ -15,23 +22,22 @@ namespace DML.Application.Classes
public string FileNameScheme { get; set; } = @"%guild%\%channel%\%id%"; public string FileNameScheme { get; set; } = @"%guild%\%channel%\%id%";
public bool SkipExistingFiles { get; set; } = true; public bool SkipExistingFiles { get; set; } = true;
public int ThreadLimit { get; set; } = 50; public int ThreadLimit { get; set; } = 50;
public bool ShowStartUpHints { get; set; } = true;
public void Store() internal void Store()
{ {
Logger.Trace("Getting settings collection..."); Trace("Getting settings collection...");
var settingsDB = Core.Database.GetCollection<Settings>("settings"); var settingsDB = Core.Database.GetCollection<Settings>("settings");
Logger.Debug("Storing settings to database..."); Debug("Storing settings to database...");
if (settingsDB.Exists(_setting => _setting.Id == Id)) if (settingsDB.Exists(_setting => _setting.Id == Id))
{ {
Logger.Trace("Updating existing value..."); Trace("Updating existing value...");
settingsDB.Update(this); settingsDB.Update(this);
} }
else else
{ {
Logger.Trace("Adding new value..."); Trace("Adding new value...");
settingsDB.Insert(this); settingsDB.Insert(this);
} }
} }

View file

@ -2,17 +2,25 @@
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime;
using System.Runtime.Remoting.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms;
using Discord; using Discord;
using Discord.Net; using Discord.Net;
using Discord.WebSocket; using DML.Application.Classes;
using DML.Core.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;
namespace DML.Core namespace DML.Application
{ {
public static class Core public static class Core
{ {
internal static DiscordSocketClient Client { get; set; } internal static DiscordClient Client { get; set; }
internal static LiteDatabase Database { get; set; } internal static LiteDatabase Database { get; set; }
internal static Settings Settings { get; set; } internal static Settings Settings { get; set; }
internal static JobScheduler Scheduler { get; } = new JobScheduler(); internal static JobScheduler Scheduler { get; } = new JobScheduler();
@ -119,12 +127,11 @@ namespace DML.Core
} }
Debug("Creating discord client..."); Debug("Creating discord client...");
Client = new DiscordClient();
Client = new DiscordSocketClient(); Client.Log.Message += (sender, message) =>
Client.Log += (arg) =>
{ {
var logMessage = $"DiscordClient: {arg.Message}"; var logMessage = $"DiscordClient: {message.Message}";
switch (arg.Severity) switch (message.Severity)
{ {
case LogSeverity.Verbose: case LogSeverity.Verbose:
Trace(logMessage); Trace(logMessage);
@ -142,42 +149,40 @@ namespace DML.Core
Error(logMessage); Error(logMessage);
break; break;
} }
return Task.CompletedTask;
}; };
Info("Trying to log into discord..."); Info("Trying to log into discord...");
var abort = false; var abort = false;
Client.Connected += Client_Connected; while (Client.State != ConnectionState.Connected && !abort)
while (Client.LoginState != LoginState.LoggedIn && !abort)
{ {
Debug(Client.ConnectionState.ToString());
Debug(Client.LoginState.ToString());
Trace("Entering login loop."); Trace("Entering login loop.");
try try
{ {
if (Client.ConnectionState == ConnectionState.Connecting)
continue;
if (!string.IsNullOrEmpty(Settings.LoginToken)) if (!string.IsNullOrEmpty(Settings.LoginToken))
{ {
Debug("Trying to login with last known token..."); Debug("Trying to login with last known token...");
await Client.LoginAsync(TokenType.User, Settings.LoginToken); await Client.Connect(Settings.LoginToken, TokenType.User);
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 ex) catch (HttpException)
{ {
Warn($"Login seems to have failed or gone wrong: {ex.GetType().Name} - {ex.Message}"); Warn("Login seems to have failed or gone wrong.");
} }
if (Client.LoginState == LoginState.LoggedOut) if (Client.State != ConnectionState.Connected)
{ {
Settings.Password = string.Empty; Settings.Password = string.Empty;
Debug("Showing dialog for username and password..."); Debug("Showing dialog for username and password...");
@ -187,41 +192,6 @@ namespace DML.Core
} }
} }
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(); splash.Close();
Info("Starting scheduler..."); Info("Starting scheduler...");
@ -237,24 +207,5 @@ namespace DML.Core
Error($"{ex.Message} occured at: {ex.StackTrace}"); Error($"{ex.Message} occured at: {ex.StackTrace}");
} }
} }
private static Task Client_Connected()
{
Debug("Connected");
return Task.CompletedTask;
}
//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();
}
} }
} }

View file

@ -11,9 +11,6 @@
<AssemblyName>Discord Media Loader.Application</AssemblyName> <AssemblyName>Discord Media Loader.Application</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -23,7 +20,6 @@
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<LangVersion>8</LangVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
@ -32,197 +28,56 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<LangVersion>8</LangVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="LiteDB, Version=4.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL"> <Reference Include="Discord.Net, Version=0.9.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\LiteDB.4.1.4\lib\net40\LiteDB.dll</HintPath> <HintPath>..\packages\Discord.Net.0.9.6\lib\net45\Discord.Net.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="LiteDB, Version=3.1.0.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath> <HintPath>..\packages\LiteDB.3.1.0\lib\net35\LiteDB.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.3.1.6\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL"> <Reference Include="Nito.AsyncEx, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.6\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath> <HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="Nito.AsyncEx.Concurrent, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath> <HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Concurrent.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Win32.Registry, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="Nito.AsyncEx.Enlightenment, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Registry.4.7.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath> <HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Enlightenment.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="RestSharp, Version=105.2.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\RestSharp.105.2.3\lib\net46\RestSharp.dll</HintPath>
</Reference> <Private>True</Private>
<Reference Include="Nito.AsyncEx.Context, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Context.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Context.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Coordination, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Coordination.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Coordination.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Interop.WaitHandles, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Interop.WaitHandles.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Interop.WaitHandles.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Oop, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Oop.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Oop.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Tasks, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Tasks.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Tasks.dll</HintPath>
</Reference>
<Reference Include="Nito.Cancellation, Version=1.0.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.Cancellation.1.0.5\lib\netstandard2.0\Nito.Cancellation.dll</HintPath>
</Reference>
<Reference Include="Nito.Collections.Deque, Version=1.0.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.Collections.Deque.1.0.4\lib\netstandard2.0\Nito.Collections.Deque.dll</HintPath>
</Reference>
<Reference Include="Nito.Disposables, Version=2.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.Disposables.2.1.0\lib\net461\Nito.Disposables.dll</HintPath>
</Reference>
<Reference Include="Octokit, Version=0.48.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Octokit.0.48.0\lib\net46\Octokit.dll</HintPath>
</Reference>
<Reference Include="RestSharp, Version=106.11.4.0, Culture=neutral, PublicKeyToken=598062e77f915f75, processorArchitecture=MSIL">
<HintPath>..\packages\RestSharp.106.11.4\lib\net452\RestSharp.dll</HintPath>
</Reference>
<Reference Include="SharpRaven, Version=2.4.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SharpRaven.2.4.0\lib\net45\SharpRaven.dll</HintPath>
</Reference>
<Reference Include="SuperSocket.ClientEngine, Version=0.10.0.0, Culture=neutral, PublicKeyToken=ee9af13f57f00acc, processorArchitecture=MSIL">
<HintPath>..\packages\SuperSocket.ClientEngine.Core.0.10.0\lib\net45\SuperSocket.ClientEngine.dll</HintPath>
</Reference>
<Reference Include="SweetLib, Version=0.2.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SweetLib.0.2.1-alpha\lib\netstandard1.3\SweetLib.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll</HintPath>
</Reference>
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Immutable, Version=1.2.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Immutable.1.7.1\lib\net461\System.Collections.Immutable.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Specialized, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Specialized.4.3.0\lib\net46\System.Collections.Specialized.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Configuration" />
<Reference Include="System.Console, Version=4.0.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
</Reference>
<Reference Include="System.Interactive.Async, Version=4.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\packages\System.Interactive.Async.4.0.0\lib\net461\System.Interactive.Async.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Linq.Async, Version=4.1.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\packages\System.Linq.Async.4.1.1\lib\net461\System.Linq.Async.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.NameResolution, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.NameResolution.4.3.0\lib\net46\System.Net.NameResolution.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Security, Version=4.0.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.AccessControl, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.AccessControl.4.7.0\lib\net461\System.Security.AccessControl.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net461\System.Security.Cryptography.Algorithms.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Principal.Windows, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Principal.Windows.4.7.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="WebSocket4Net, Version=0.14.1.0, Culture=neutral, PublicKeyToken=eb4e154b696bf72a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Xml.ReaderWriter.4.3.1\lib\net46\System.Xml.ReaderWriter.dll</HintPath> <HintPath>..\packages\WebSocket4Net.0.14.1\lib\net45\WebSocket4Net.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="WebSocket4Net, Version=0.15.2.11, Culture=neutral, PublicKeyToken=eb4e154b696bf72a, processorArchitecture=MSIL">
<HintPath>..\packages\WebSocket4Net.0.15.2\lib\net45\WebSocket4Net.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Classes\Core.cs" />
<Compile Include="Classes\Job.cs" /> <Compile Include="Classes\Job.cs" />
<Compile Include="Classes\JobScheduler.cs" /> <Compile Include="Classes\JobScheduler.cs" />
<Compile Include="Classes\Settings.cs" />
<Compile Include="Core.cs" />
<Compile Include="Dialogs\LoginDialog.cs"> <Compile Include="Dialogs\LoginDialog.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -235,7 +90,6 @@
<Compile Include="FrmInternalSplash.Designer.cs"> <Compile Include="FrmInternalSplash.Designer.cs">
<DependentUpon>FrmInternalSplash.cs</DependentUpon> <DependentUpon>FrmInternalSplash.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Helper\IdentifiedString.cs" />
<Compile Include="MainForm.cs"> <Compile Include="MainForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -248,7 +102,6 @@
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon> <DependentUpon>Resources.resx</DependentUpon>
</Compile> </Compile>
<Compile Include="Classes\Settings.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Dialogs\LoginDialog.resx"> <EmbeddedResource Include="Dialogs\LoginDialog.resx">
@ -266,41 +119,18 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" />
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DML.Client\DML.Client.csproj"> <ProjectReference Include="..\..\SweetLib\SweetLib\SweetLib.csproj">
<Project>{045eb4a1-34e7-47e0-867e-e10c40505095}</Project> <Project>{02c1f8ef-32f2-4e77-a36d-79129402af37}</Project>
<Name>DML.Client</Name> <Name>SweetLib</Name>
</ProjectReference>
<ProjectReference Include="..\libs\Discord.Net\src\Discord.Net.Core\Discord.Net.Core.csproj">
<Project>{8bd82fae-47f7-41fd-a862-892c8aff8c66}</Project>
<Name>Discord.Net.Core</Name>
</ProjectReference>
<ProjectReference Include="..\libs\Discord.Net\src\Discord.Net.Rest\Discord.Net.Rest.csproj">
<Project>{103472c3-834d-4561-9395-6febfeb165ac}</Project>
<Name>Discord.Net.Rest</Name>
</ProjectReference>
<ProjectReference Include="..\libs\Discord.Net\src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj">
<Project>{58009f12-b2d9-4f1c-954b-a7cfea17dbc7}</Project>
<Name>Discord.Net.WebSocket</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Resources\Serraniel-Logo4-NO-BG.png" /> <None Include="Resources\Serraniel-Logo4-NO-BG.png" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="Resources\info_icon.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">

View file

@ -1,2 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp80</s:String></wpf:ResourceDictionary>

View file

@ -30,12 +30,25 @@
{ {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginDialog)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginDialog));
this.pnlButtons = new System.Windows.Forms.Panel(); this.pnlButtons = new System.Windows.Forms.Panel();
this.btnAbort = new System.Windows.Forms.Button(); this.tbcLoginMethods = new System.Windows.Forms.TabControl();
this.btnOk = new System.Windows.Forms.Button(); this.tpgToken = new System.Windows.Forms.TabPage();
this.lbHowToToken = new System.Windows.Forms.Label(); this.tpgUserdata = new System.Windows.Forms.TabPage();
this.edToken = new System.Windows.Forms.TextBox();
this.lbToken = new System.Windows.Forms.Label(); 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.pnlButtons.SuspendLayout(); this.pnlButtons.SuspendLayout();
this.tbcLoginMethods.SuspendLayout();
this.tpgToken.SuspendLayout();
this.tpgUserdata.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// pnlButtons // pnlButtons
@ -44,20 +57,138 @@
this.pnlButtons.Controls.Add(this.btnAbort); this.pnlButtons.Controls.Add(this.btnAbort);
this.pnlButtons.Controls.Add(this.btnOk); this.pnlButtons.Controls.Add(this.btnOk);
this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Bottom; this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Bottom;
this.pnlButtons.Location = new System.Drawing.Point(0, 189); this.pnlButtons.Location = new System.Drawing.Point(0, 168);
this.pnlButtons.Name = "pnlButtons"; this.pnlButtons.Name = "pnlButtons";
this.pnlButtons.Size = new System.Drawing.Size(426, 51); this.pnlButtons.Size = new System.Drawing.Size(426, 51);
this.pnlButtons.TabIndex = 0; this.pnlButtons.TabIndex = 0;
// //
// btnAbort // tbcLoginMethods
// //
this.btnAbort.Location = new System.Drawing.Point(348, 16); this.tbcLoginMethods.Controls.Add(this.tpgToken);
this.btnAbort.Name = "btnAbort"; this.tbcLoginMethods.Controls.Add(this.tpgUserdata);
this.btnAbort.Size = new System.Drawing.Size(75, 23); this.tbcLoginMethods.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnAbort.TabIndex = 1; this.tbcLoginMethods.Location = new System.Drawing.Point(0, 0);
this.btnAbort.Text = "&Abort"; this.tbcLoginMethods.Name = "tbcLoginMethods";
this.btnAbort.UseVisualStyleBackColor = true; this.tbcLoginMethods.SelectedIndex = 0;
this.btnAbort.Click += new System.EventHandler(this.btnAbort_Click); 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.";
// //
// btnOk // btnOk
// //
@ -69,40 +200,22 @@
this.btnOk.UseVisualStyleBackColor = true; this.btnOk.UseVisualStyleBackColor = true;
this.btnOk.Click += new System.EventHandler(this.btnOk_Click); this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
// //
// lbHowToToken // btnAbort
// //
this.lbHowToToken.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.btnAbort.Location = new System.Drawing.Point(348, 16);
| System.Windows.Forms.AnchorStyles.Left))); this.btnAbort.Name = "btnAbort";
this.lbHowToToken.Location = new System.Drawing.Point(7, 58); this.btnAbort.Size = new System.Drawing.Size(75, 23);
this.lbHowToToken.Name = "lbHowToToken"; this.btnAbort.TabIndex = 1;
this.lbHowToToken.Size = new System.Drawing.Size(412, 128); this.btnAbort.Text = "&Abort";
this.lbHowToToken.TabIndex = 5; this.btnAbort.UseVisualStyleBackColor = true;
this.lbHowToToken.Text = resources.GetString("lbHowToToken.Text"); this.btnAbort.Click += new System.EventHandler(this.btnAbort_Click);
//
// 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 // LoginDialog
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(426, 240); this.ClientSize = new System.Drawing.Size(426, 219);
this.Controls.Add(this.lbHowToToken); this.Controls.Add(this.tbcLoginMethods);
this.Controls.Add(this.edToken);
this.Controls.Add(this.lbToken);
this.Controls.Add(this.pnlButtons); this.Controls.Add(this.pnlButtons);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
@ -114,18 +227,32 @@
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDialog_FormClosing); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDialog_FormClosing);
this.Shown += new System.EventHandler(this.LoginDialog_Shown); this.Shown += new System.EventHandler(this.LoginDialog_Shown);
this.pnlButtons.ResumeLayout(false); 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.ResumeLayout(false);
this.PerformLayout();
} }
#endregion #endregion
private System.Windows.Forms.Panel pnlButtons; private System.Windows.Forms.Panel pnlButtons;
private System.Windows.Forms.Button btnAbort; private System.Windows.Forms.TabControl tbcLoginMethods;
private System.Windows.Forms.Button btnOk; private System.Windows.Forms.TabPage tpgToken;
private System.Windows.Forms.Label lbHowToToken; private System.Windows.Forms.Label lbHowToToken;
private System.Windows.Forms.TextBox edToken; private System.Windows.Forms.TextBox edToken;
private System.Windows.Forms.Label lbToken; 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;
} }
} }

View file

@ -1,6 +1,12 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using DML.Application.Classes;
using static SweetLib.Utils.Logger.Logger; using static SweetLib.Utils.Logger.Logger;
namespace DML.Application.Dialogs namespace DML.Application.Dialogs
@ -16,6 +22,12 @@ namespace DML.Application.Dialogs
{ {
Trace("Login dialog shown."); Trace("Login dialog shown.");
edToken.Text = Core.Settings.LoginToken; 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) private void LoginDialog_FormClosing(object sender, FormClosingEventArgs e)
@ -26,6 +38,10 @@ namespace DML.Application.Dialogs
Debug("Adjusting login settings..."); Debug("Adjusting login settings...");
Core.Settings.LoginToken = edToken.Text; 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(); Core.Settings.Store();
} }

View file

@ -120,9 +120,7 @@
<data name="lbHowToToken.Text" xml:space="preserve"> <data name="lbHowToToken.Text" xml:space="preserve">
<value>To find your login token please start Discord and press Ctrl + Shift + I shortcut. A browser inspector will open. <value>To find your login token please start Discord and press Ctrl + Shift + I shortcut. A browser inspector will open.
Navigate into the "Application" tab and select "Local Storage" / "https://discordapp.com". If the right site keeps blank use "Session Storage" instead. Navigate into the "Application" tab and select "Local Storage" / "https://discordapp.com". If the right site keeps blank use "Session Storage" instead.
Look for the token key and copy its value without the quotation marks. Look for the token key and copy its value without the quotation marks.</value>
IF YOU CANNOT FIND YOUR TOKEN you can try pressing Ctrl + R while having the inspector open. While reloading you still should be able to grab the token. It may disappear after discord has finished loading.</value>
</data> </data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View file

@ -1,4 +1,12 @@
using System.Windows.Forms; using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DML.Application namespace DML.Application
{ {

View file

@ -1,19 +0,0 @@
namespace DML.Application.Helper
{
internal class IdentifiedString<T>
{
internal IdentifiedString(T id, string caption)
{
Id = id;
Caption = caption;
}
internal T Id { get; set; }
internal string Caption { get; set; }
public override string ToString()
{
return Caption;
}
}
}

View file

@ -31,7 +31,6 @@
this.components = new System.ComponentModel.Container(); this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.pnlSettings = new System.Windows.Forms.GroupBox(); this.pnlSettings = new System.Windows.Forms.GroupBox();
this.btnFileNameHelp = new System.Windows.Forms.Button();
this.lbThreadLimit = new System.Windows.Forms.Label(); this.lbThreadLimit = new System.Windows.Forms.Label();
this.edThreadLimit = new System.Windows.Forms.NumericUpDown(); this.edThreadLimit = new System.Windows.Forms.NumericUpDown();
this.cbSkipExisting = new System.Windows.Forms.CheckBox(); this.cbSkipExisting = new System.Windows.Forms.CheckBox();
@ -47,25 +46,17 @@
this.cbGuild = new System.Windows.Forms.ComboBox(); this.cbGuild = new System.Windows.Forms.ComboBox();
this.lbGuild = new System.Windows.Forms.Label(); this.lbGuild = new System.Windows.Forms.Label();
this.statusStrip = new System.Windows.Forms.StatusStrip(); this.statusStrip = new System.Windows.Forms.StatusStrip();
this.lbStatus = new System.Windows.Forms.ToolStripDropDownButton();
this.invisibleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.doNotDisturbToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.doNotDenyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.onlineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pgbProgress = new System.Windows.Forms.ToolStripProgressBar(); this.pgbProgress = new System.Windows.Forms.ToolStripProgressBar();
this.lbProgress = new System.Windows.Forms.ToolStripStatusLabel(); this.lbProgress = new System.Windows.Forms.ToolStripStatusLabel();
this.lblVersionPlaceholder = new System.Windows.Forms.ToolStripStatusLabel();
this.lbVersion = new System.Windows.Forms.ToolStripStatusLabel();
this.btnDropDown = new System.Windows.Forms.ToolStripSplitButton();
this.showTokenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.visitGithubToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.groupBox2 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox();
this.btnDelete = new System.Windows.Forms.Button(); this.btnDelete = new System.Windows.Forms.Button();
this.lbxJobs = new System.Windows.Forms.ListBox(); this.lbxJobs = new System.Windows.Forms.ListBox();
this.tmrRefreshProgress = new System.Windows.Forms.Timer(this.components); this.tmrRefreshProgress = new System.Windows.Forms.Timer(this.components);
this.tmrTriggerRefresh = new System.Windows.Forms.Timer(this.components); this.lblVersionPlaceholder = new System.Windows.Forms.ToolStripStatusLabel();
this.lbVersion = new System.Windows.Forms.ToolStripStatusLabel();
this.btnDropDown = new System.Windows.Forms.ToolStripSplitButton();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.visitGithubToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pnlSettings.SuspendLayout(); this.pnlSettings.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.edThreadLimit)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.edThreadLimit)).BeginInit();
this.groupBox1.SuspendLayout(); this.groupBox1.SuspendLayout();
@ -75,7 +66,6 @@
// //
// pnlSettings // pnlSettings
// //
this.pnlSettings.Controls.Add(this.btnFileNameHelp);
this.pnlSettings.Controls.Add(this.lbThreadLimit); this.pnlSettings.Controls.Add(this.lbThreadLimit);
this.pnlSettings.Controls.Add(this.edThreadLimit); this.pnlSettings.Controls.Add(this.edThreadLimit);
this.pnlSettings.Controls.Add(this.cbSkipExisting); this.pnlSettings.Controls.Add(this.cbSkipExisting);
@ -87,22 +77,11 @@
this.pnlSettings.Dock = System.Windows.Forms.DockStyle.Top; this.pnlSettings.Dock = System.Windows.Forms.DockStyle.Top;
this.pnlSettings.Location = new System.Drawing.Point(0, 0); this.pnlSettings.Location = new System.Drawing.Point(0, 0);
this.pnlSettings.Name = "pnlSettings"; this.pnlSettings.Name = "pnlSettings";
this.pnlSettings.Size = new System.Drawing.Size(690, 93); this.pnlSettings.Size = new System.Drawing.Size(553, 93);
this.pnlSettings.TabIndex = 0; this.pnlSettings.TabIndex = 0;
this.pnlSettings.TabStop = false; this.pnlSettings.TabStop = false;
this.pnlSettings.Text = "Settings"; this.pnlSettings.Text = "Settings";
// //
// btnFileNameHelp
//
this.btnFileNameHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnFileNameHelp.Image = global::DML.Application.Properties.Resources.info_icon;
this.btnFileNameHelp.Location = new System.Drawing.Point(554, 37);
this.btnFileNameHelp.Name = "btnFileNameHelp";
this.btnFileNameHelp.Size = new System.Drawing.Size(25, 23);
this.btnFileNameHelp.TabIndex = 8;
this.btnFileNameHelp.UseVisualStyleBackColor = true;
this.btnFileNameHelp.Click += new System.EventHandler(this.btnFileNameHelp_Click);
//
// lbThreadLimit // lbThreadLimit
// //
this.lbThreadLimit.AutoSize = true; this.lbThreadLimit.AutoSize = true;
@ -134,7 +113,7 @@
// //
this.cbSkipExisting.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.cbSkipExisting.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cbSkipExisting.AutoSize = true; this.cbSkipExisting.AutoSize = true;
this.cbSkipExisting.Location = new System.Drawing.Point(584, 42); this.cbSkipExisting.Location = new System.Drawing.Point(447, 42);
this.cbSkipExisting.Name = "cbSkipExisting"; this.cbSkipExisting.Name = "cbSkipExisting";
this.cbSkipExisting.Size = new System.Drawing.Size(106, 17); this.cbSkipExisting.Size = new System.Drawing.Size(106, 17);
this.cbSkipExisting.TabIndex = 5; this.cbSkipExisting.TabIndex = 5;
@ -148,7 +127,7 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.edNameScheme.Location = new System.Drawing.Point(113, 39); this.edNameScheme.Location = new System.Drawing.Point(113, 39);
this.edNameScheme.Name = "edNameScheme"; this.edNameScheme.Name = "edNameScheme";
this.edNameScheme.Size = new System.Drawing.Size(435, 20); this.edNameScheme.Size = new System.Drawing.Size(328, 20);
this.edNameScheme.TabIndex = 4; this.edNameScheme.TabIndex = 4;
this.edNameScheme.TextChanged += new System.EventHandler(this.DoSomethingChanged); this.edNameScheme.TextChanged += new System.EventHandler(this.DoSomethingChanged);
// //
@ -164,7 +143,7 @@
// btnSearchFolders // btnSearchFolders
// //
this.btnSearchFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnSearchFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnSearchFolders.Location = new System.Drawing.Point(659, 11); this.btnSearchFolders.Location = new System.Drawing.Point(522, 11);
this.btnSearchFolders.Name = "btnSearchFolders"; this.btnSearchFolders.Name = "btnSearchFolders";
this.btnSearchFolders.Size = new System.Drawing.Size(25, 23); this.btnSearchFolders.Size = new System.Drawing.Size(25, 23);
this.btnSearchFolders.TabIndex = 2; this.btnSearchFolders.TabIndex = 2;
@ -178,7 +157,7 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.edOperatingFolder.Location = new System.Drawing.Point(113, 13); this.edOperatingFolder.Location = new System.Drawing.Point(113, 13);
this.edOperatingFolder.Name = "edOperatingFolder"; this.edOperatingFolder.Name = "edOperatingFolder";
this.edOperatingFolder.Size = new System.Drawing.Size(540, 20); this.edOperatingFolder.Size = new System.Drawing.Size(403, 20);
this.edOperatingFolder.TabIndex = 1; this.edOperatingFolder.TabIndex = 1;
this.edOperatingFolder.TextChanged += new System.EventHandler(this.DoSomethingChanged); this.edOperatingFolder.TextChanged += new System.EventHandler(this.DoSomethingChanged);
// //
@ -201,7 +180,7 @@
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top; this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
this.groupBox1.Location = new System.Drawing.Point(0, 93); this.groupBox1.Location = new System.Drawing.Point(0, 93);
this.groupBox1.Name = "groupBox1"; this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(690, 57); this.groupBox1.Size = new System.Drawing.Size(553, 57);
this.groupBox1.TabIndex = 1; this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false; this.groupBox1.TabStop = false;
this.groupBox1.Text = "Add a job"; this.groupBox1.Text = "Add a job";
@ -209,7 +188,7 @@
// btnAddJob // btnAddJob
// //
this.btnAddJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnAddJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnAddJob.Location = new System.Drawing.Point(618, 19); this.btnAddJob.Location = new System.Drawing.Point(481, 19);
this.btnAddJob.Name = "btnAddJob"; this.btnAddJob.Name = "btnAddJob";
this.btnAddJob.Size = new System.Drawing.Size(66, 23); this.btnAddJob.Size = new System.Drawing.Size(66, 23);
this.btnAddJob.TabIndex = 4; this.btnAddJob.TabIndex = 4;
@ -224,7 +203,7 @@
this.cbChannel.FormattingEnabled = true; this.cbChannel.FormattingEnabled = true;
this.cbChannel.Location = new System.Drawing.Point(294, 19); this.cbChannel.Location = new System.Drawing.Point(294, 19);
this.cbChannel.Name = "cbChannel"; this.cbChannel.Name = "cbChannel";
this.cbChannel.Size = new System.Drawing.Size(318, 21); this.cbChannel.Size = new System.Drawing.Size(181, 21);
this.cbChannel.TabIndex = 3; this.cbChannel.TabIndex = 3;
// //
// lbChannel // lbChannel
@ -257,57 +236,17 @@
// statusStrip // statusStrip
// //
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lbStatus,
this.pgbProgress, this.pgbProgress,
this.lbProgress, this.lbProgress,
this.lblVersionPlaceholder, this.lblVersionPlaceholder,
this.lbVersion, this.lbVersion,
this.btnDropDown}); this.btnDropDown});
this.statusStrip.Location = new System.Drawing.Point(0, 393); this.statusStrip.Location = new System.Drawing.Point(0, 311);
this.statusStrip.Name = "statusStrip"; this.statusStrip.Name = "statusStrip";
this.statusStrip.Size = new System.Drawing.Size(690, 22); this.statusStrip.Size = new System.Drawing.Size(553, 22);
this.statusStrip.TabIndex = 2; this.statusStrip.TabIndex = 2;
this.statusStrip.Text = "statusStrip1"; this.statusStrip.Text = "statusStrip1";
// //
// 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);
//
// invisibleToolStripMenuItem
//
this.invisibleToolStripMenuItem.Name = "invisibleToolStripMenuItem";
this.invisibleToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.invisibleToolStripMenuItem.Tag = "3";
this.invisibleToolStripMenuItem.Text = "Invisible";
//
// doNotDisturbToolStripMenuItem
//
this.doNotDisturbToolStripMenuItem.Name = "doNotDisturbToolStripMenuItem";
this.doNotDisturbToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.doNotDisturbToolStripMenuItem.Tag = "2";
this.doNotDisturbToolStripMenuItem.Text = "Do not disturb";
//
// doNotDenyToolStripMenuItem
//
this.doNotDenyToolStripMenuItem.Name = "doNotDenyToolStripMenuItem";
this.doNotDenyToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.doNotDenyToolStripMenuItem.Tag = "1";
this.doNotDenyToolStripMenuItem.Text = "Idle";
//
// onlineToolStripMenuItem
//
this.onlineToolStripMenuItem.Name = "onlineToolStripMenuItem";
this.onlineToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.onlineToolStripMenuItem.Tag = "0";
this.onlineToolStripMenuItem.Text = "Online";
//
// pgbProgress // pgbProgress
// //
this.pgbProgress.Name = "pgbProgress"; this.pgbProgress.Name = "pgbProgress";
@ -318,57 +257,6 @@
this.lbProgress.Name = "lbProgress"; this.lbProgress.Name = "lbProgress";
this.lbProgress.Size = new System.Drawing.Size(0, 17); this.lbProgress.Size = new System.Drawing.Size(0, 17);
// //
// lblVersionPlaceholder
//
this.lblVersionPlaceholder.Name = "lblVersionPlaceholder";
this.lblVersionPlaceholder.Size = new System.Drawing.Size(490, 17);
this.lblVersionPlaceholder.Spring = true;
//
// lbVersion
//
this.lbVersion.Name = "lbVersion";
this.lbVersion.Size = new System.Drawing.Size(54, 17);
this.lbVersion.Text = "VERSION";
//
// btnDropDown
//
this.btnDropDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.btnDropDown.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.showTokenToolStripMenuItem,
this.toolStripSeparator2,
this.visitGithubToolStripMenuItem,
this.aboutToolStripMenuItem});
this.btnDropDown.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btnDropDown.Name = "btnDropDown";
this.btnDropDown.Size = new System.Drawing.Size(16, 20);
this.btnDropDown.Text = "Options";
//
// showTokenToolStripMenuItem
//
this.showTokenToolStripMenuItem.Name = "showTokenToolStripMenuItem";
this.showTokenToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
this.showTokenToolStripMenuItem.Text = "Copy login token";
this.showTokenToolStripMenuItem.Click += new System.EventHandler(this.showTokenToolStripMenuItem_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(162, 6);
//
// visitGithubToolStripMenuItem
//
this.visitGithubToolStripMenuItem.Name = "visitGithubToolStripMenuItem";
this.visitGithubToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
this.visitGithubToolStripMenuItem.Text = "Visit Github";
this.visitGithubToolStripMenuItem.Click += new System.EventHandler(this.visitGithubToolStripMenuItem_Click);
//
// aboutToolStripMenuItem
//
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
this.aboutToolStripMenuItem.Text = "About";
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
//
// groupBox2 // groupBox2
// //
this.groupBox2.Controls.Add(this.btnDelete); this.groupBox2.Controls.Add(this.btnDelete);
@ -376,7 +264,7 @@
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill; this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox2.Location = new System.Drawing.Point(0, 150); this.groupBox2.Location = new System.Drawing.Point(0, 150);
this.groupBox2.Name = "groupBox2"; this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(690, 243); this.groupBox2.Size = new System.Drawing.Size(553, 161);
this.groupBox2.TabIndex = 3; this.groupBox2.TabIndex = 3;
this.groupBox2.TabStop = false; this.groupBox2.TabStop = false;
this.groupBox2.Text = "Jobs"; this.groupBox2.Text = "Jobs";
@ -384,9 +272,9 @@
// btnDelete // btnDelete
// //
this.btnDelete.Dock = System.Windows.Forms.DockStyle.Bottom; this.btnDelete.Dock = System.Windows.Forms.DockStyle.Bottom;
this.btnDelete.Location = new System.Drawing.Point(3, 217); this.btnDelete.Location = new System.Drawing.Point(3, 135);
this.btnDelete.Name = "btnDelete"; this.btnDelete.Name = "btnDelete";
this.btnDelete.Size = new System.Drawing.Size(684, 23); this.btnDelete.Size = new System.Drawing.Size(547, 23);
this.btnDelete.TabIndex = 1; this.btnDelete.TabIndex = 1;
this.btnDelete.Text = "Delete selected"; this.btnDelete.Text = "Delete selected";
this.btnDelete.UseVisualStyleBackColor = true; this.btnDelete.UseVisualStyleBackColor = true;
@ -400,7 +288,7 @@
this.lbxJobs.FormattingEnabled = true; this.lbxJobs.FormattingEnabled = true;
this.lbxJobs.Location = new System.Drawing.Point(6, 19); this.lbxJobs.Location = new System.Drawing.Point(6, 19);
this.lbxJobs.Name = "lbxJobs"; this.lbxJobs.Name = "lbxJobs";
this.lbxJobs.Size = new System.Drawing.Size(678, 186); this.lbxJobs.Size = new System.Drawing.Size(541, 108);
this.lbxJobs.TabIndex = 0; this.lbxJobs.TabIndex = 0;
// //
// tmrRefreshProgress // tmrRefreshProgress
@ -409,16 +297,48 @@
this.tmrRefreshProgress.Interval = 500; this.tmrRefreshProgress.Interval = 500;
this.tmrRefreshProgress.Tick += new System.EventHandler(this.tmrRefreshProgress_Tick); this.tmrRefreshProgress.Tick += new System.EventHandler(this.tmrRefreshProgress_Tick);
// //
// tmrTriggerRefresh // lblVersionPlaceholder
// //
this.tmrTriggerRefresh.Interval = 5000; this.lblVersionPlaceholder.Name = "lblVersionPlaceholder";
this.tmrTriggerRefresh.Tick += new System.EventHandler(this.tmrTriggerRefresh_Tick); this.lblVersionPlaceholder.Size = new System.Drawing.Size(271, 17);
this.lblVersionPlaceholder.Spring = true;
//
// lbVersion
//
this.lbVersion.Name = "lbVersion";
this.lbVersion.Size = new System.Drawing.Size(118, 17);
this.lbVersion.Text = "v https://github.com";
//
// btnDropDown
//
this.btnDropDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.btnDropDown.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.visitGithubToolStripMenuItem,
this.aboutToolStripMenuItem});
this.btnDropDown.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btnDropDown.Name = "btnDropDown";
this.btnDropDown.Size = new System.Drawing.Size(16, 20);
this.btnDropDown.Text = "Options";
//
// aboutToolStripMenuItem
//
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.aboutToolStripMenuItem.Text = "About";
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
//
// visitGithubToolStripMenuItem
//
this.visitGithubToolStripMenuItem.Name = "visitGithubToolStripMenuItem";
this.visitGithubToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.visitGithubToolStripMenuItem.Text = "Visit Github";
this.visitGithubToolStripMenuItem.Click += new System.EventHandler(this.visitGithubToolStripMenuItem_Click);
// //
// MainForm // MainForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(690, 415); this.ClientSize = new System.Drawing.Size(553, 333);
this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox2);
this.Controls.Add(this.statusStrip); this.Controls.Add(this.statusStrip);
this.Controls.Add(this.groupBox1); this.Controls.Add(this.groupBox1);
@ -471,14 +391,5 @@
private System.Windows.Forms.ToolStripSplitButton btnDropDown; private System.Windows.Forms.ToolStripSplitButton btnDropDown;
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem visitGithubToolStripMenuItem; 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;
private System.Windows.Forms.ToolStripMenuItem showTokenToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.Button btnFileNameHelp;
} }
} }

View file

@ -1,37 +1,22 @@
using System; using System.Diagnostics;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Windows.Forms; using System.Windows.Forms;
using Discord; using Discord;
using Discord.WebSocket;
using DML.AppCore.Classes;
using DML.Application.Classes; using DML.Application.Classes;
using DML.Application.Helper;
using DML.Application.Properties;
using DML.Client;
using static SweetLib.Utils.Logger.Logger; using static SweetLib.Utils.Logger.Logger;
namespace DML.Application namespace DML.Application
{ {
internal enum OnlineState
{
Online,
Idle,
DoNotDisturb,
Invisible
}
public partial class MainForm : Form public partial class MainForm : Form
{ {
private bool IsInitialized { get; set; } = false;
public MainForm() public MainForm()
{ {
InitializeComponent(); InitializeComponent();
} }
private bool IsInitialized { get; set; } private void MainForm_Shown(object sender, System.EventArgs e)
private void MainForm_Shown(object sender, EventArgs e)
{ {
Trace("MainForm shown executed."); Trace("MainForm shown executed.");
RefreshComponents(); RefreshComponents();
@ -60,10 +45,7 @@ namespace DML.Application
if (cbGuild.Items.Count == 0) if (cbGuild.Items.Count == 0)
{ {
Trace("Adding guilds to component..."); Trace("Adding guilds to component...");
cbGuild.Items.AddRange(Core.Client.Servers.OrderBy(g => g.Name).Select(g => g.Name).ToArray());
cbGuild.Items.AddRange(DMLClient.Client.Guilds.Where(g => g.Name != null).OrderBy(g => g.Name)
.Select(g => new IdentifiedString<ulong>(g.Id, g.Name)).ToArray());
cbGuild.SelectedIndex = 0; cbGuild.SelectedIndex = 0;
Trace("Guild component initialized."); Trace("Guild component initialized.");
} }
@ -72,14 +54,14 @@ namespace DML.Application
var oldIndex = lbxJobs.SelectedIndex; var oldIndex = lbxJobs.SelectedIndex;
lbxJobs.Items.Clear(); lbxJobs.Items.Clear();
foreach (var job in Core.Scheduler.JobList) foreach (var job in Core.Scheduler.JobList)
lbxJobs.Items.Add(new IdentifiedString<int>(job.Id, {
$"{FindServerById(job.GuildId)?.Name}:{FindChannelById(FindServerById(job.GuildId), job.ChannelId)?.Name}")); lbxJobs.Items.Add(
$"{FindServerById(job.GuildId)?.Name}:{FindChannelById(FindServerById(job.GuildId), job.ChannelId)?.Name}");
}
lbxJobs.SelectedIndex = oldIndex; lbxJobs.SelectedIndex = oldIndex;
lbStatus.Text = DMLClient.Client.CurrentUser.Status.ToString();
} }
private void DoSomethingChanged(object sender, EventArgs e) private void DoSomethingChanged(object sender, System.EventArgs e)
{ {
Debug($"DoSomethingChanged excuted by {sender}."); Debug($"DoSomethingChanged excuted by {sender}.");
if (!IsInitialized) if (!IsInitialized)
@ -98,7 +80,7 @@ namespace DML.Application
Core.Settings.SkipExistingFiles = cbSkipExisting.Checked; Core.Settings.SkipExistingFiles = cbSkipExisting.Checked;
Trace("Updating thread limit..."); Trace("Updating thread limit...");
Core.Settings.ThreadLimit = (int) edThreadLimit.Value; Core.Settings.ThreadLimit = (int)edThreadLimit.Value;
Trace("Storing new settings..."); Trace("Storing new settings...");
Core.Settings.Store(); Core.Settings.Store();
@ -106,7 +88,7 @@ namespace DML.Application
Info("New settings have been saved."); Info("New settings have been saved.");
} }
private void btnSearchFolders_Click(object sender, EventArgs e) private void btnSearchFolders_Click(object sender, System.EventArgs e)
{ {
Trace("Operating folder button pressed."); Trace("Operating folder button pressed.");
using (var browserDialog = new FolderBrowserDialog()) using (var browserDialog = new FolderBrowserDialog())
@ -125,31 +107,31 @@ namespace DML.Application
} }
} }
private SocketGuild FindServerByName(string name) private Server FindServerByName(string name)
{ {
Trace($"Trying to find server by name: {name}"); Trace($"Trying to find server by name: {name}");
return (from s in DMLClient.Client.Guilds where s.Name == name select s).FirstOrDefault(); return (from s in Core.Client.Servers where s.Name == name select s).FirstOrDefault();
} }
private SocketTextChannel FindChannelByName(SocketGuild server, string name) private Channel FindChannelByName(Server server, string name)
{ {
Trace($"Trying to find channel in {server} by name: {name}"); Trace($"Trying to find channel in {server} by name: {name}");
return (from c in server.TextChannels where c.Name == name select c).FirstOrDefault(); return (from c in server.TextChannels where c.Name == name select c).FirstOrDefault();
} }
private SocketGuild FindServerById(ulong id) private Server FindServerById(ulong id)
{ {
Trace($"Trying to find server by Id: {id}"); Trace($"Trying to find server by Id: {id}");
return (from s in DMLClient.Client.Guilds where s.Id == id select s).FirstOrDefault(); return (from s in Core.Client.Servers where s.Id == id select s).FirstOrDefault();
} }
private SocketTextChannel FindChannelById(SocketGuild server, ulong id) private Channel FindChannelById(Server server, ulong id)
{ {
Trace($"Trying to find channel in {server} by id: {id}"); Trace($"Trying to find channel in {server} by id: {id}");
return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault(); return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault();
} }
private void cbGuild_SelectedIndexChanged(object sender, EventArgs e) private void cbGuild_SelectedIndexChanged(object sender, System.EventArgs e)
{ {
Trace("Guild index changed."); Trace("Guild index changed.");
Debug("Updating channel dropdown component..."); Debug("Updating channel dropdown component...");
@ -157,7 +139,7 @@ namespace DML.Application
UseWaitCursor = true; UseWaitCursor = true;
try try
{ {
var guild = FindServerById(((IdentifiedString<ulong>) cbGuild.SelectedItem).Id); var guild = FindServerByName(cbGuild.Text);
if (guild != null) if (guild != null)
{ {
@ -165,10 +147,7 @@ namespace DML.Application
cbChannel.Items.Clear(); cbChannel.Items.Clear();
Trace("Adding new channels..."); Trace("Adding new channels...");
cbChannel.Items.AddRange(guild.TextChannels.OrderBy(c => c.Position).Select(c => c.Name).ToArray());
cbChannel.Items.AddRange(guild.TextChannels.OrderBy(c => c.Position)
.Select(c => new IdentifiedString<ulong>(c.Id, c.Name)).ToArray());
Trace($"Added {cbChannel.Items.Count} channels."); Trace($"Added {cbChannel.Items.Count} channels.");
cbChannel.SelectedIndex = 0; cbChannel.SelectedIndex = 0;
@ -186,17 +165,17 @@ namespace DML.Application
Debug("Finished updating channel dropdown component."); Debug("Finished updating channel dropdown component.");
} }
private void btnAddJob_Click(object sender, EventArgs e) private void btnAddJob_Click(object sender, System.EventArgs e)
{ {
var job = new Job var job = new Job
{ {
GuildId = ((IdentifiedString<ulong>) cbGuild.SelectedItem).Id, GuildId = FindServerByName(cbGuild.Text).Id,
ChannelId = ((IdentifiedString<ulong>) cbChannel.SelectedItem).Id ChannelId = FindChannelByName(FindServerByName(cbGuild.Text), cbChannel.Text).Id
}; };
if (!(from j in Core.Scheduler.JobList if (!(from j in Core.Scheduler.JobList
where j.GuildId == job.GuildId && j.ChannelId == job.ChannelId where j.GuildId == job.GuildId && j.ChannelId == job.ChannelId
select j).Any()) select j).Any())
{ {
job.Store(); job.Store();
Core.Scheduler.JobList.Add(job); Core.Scheduler.JobList.Add(job);
@ -205,7 +184,7 @@ namespace DML.Application
RefreshComponents(); RefreshComponents();
} }
private void btnDelete_Click(object sender, EventArgs e) private void btnDelete_Click(object sender, System.EventArgs e)
{ {
Trace("Deleting job pressed."); Trace("Deleting job pressed.");
@ -215,85 +194,55 @@ namespace DML.Application
MessageBox.Show("No job has been seleted.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); MessageBox.Show("No job has been seleted.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} }
var jobId = ((IdentifiedString<int>) lbxJobs.SelectedItem).Id; var jobNameData = lbxJobs.SelectedItem.ToString().Split(':');
var job = Core.Scheduler.JobList.FirstOrDefault(j => j.Id == jobId); var guildName = "";
if (job != null) for (var i = 0; i < jobNameData.Length - 1; i++)
guildName += jobNameData[i] + ":";
guildName = guildName.Substring(0, guildName.Length - 1);
var channelName = jobNameData[jobNameData.Length - 1];
var guild = FindServerByName(guildName);
var channel = FindChannelByName(guild, channelName);
foreach (var job in Core.Scheduler.JobList)
{ {
Core.Scheduler.JobList.Remove(job); if (job.GuildId == guild.Id && job.ChannelId == channel.Id)
Core.Scheduler.RunningJobs.Remove(job.Id); {
job.Stop(); Core.Scheduler.JobList.Remove(job);
job.Delete(); Core.Scheduler.RunningJobs.Remove(job.Id);
job.Stop();
job.Delete();
break;
}
} }
lbxJobs.SelectedIndex = -1; lbxJobs.SelectedIndex = -1;
RefreshComponents(); RefreshComponents();
} }
private void tmrRefreshProgress_Tick(object sender, EventArgs e) private void tmrRefreshProgress_Tick(object sender, System.EventArgs e)
{ {
var scanned = Core.Scheduler.MessagesScanned; var scanned = Core.Scheduler.MessagesScanned;
var totalAttachments = Core.Scheduler.TotalAttachments; var totalAttachments = Core.Scheduler.TotalAttachments;
var done = Core.Scheduler.AttachmentsDownloaded; var done = Core.Scheduler.AttachmentsDownloaded;
var progress = totalAttachments > 0 ? (int) (100 * done / totalAttachments) : 0; var progress = totalAttachments > 0 ? (int)(100 * done / totalAttachments) : 0;
progress = Math.Min(Math.Max(0, progress), 100);
pgbProgress.Maximum = 100; pgbProgress.Maximum = 100;
pgbProgress.Value = progress; pgbProgress.Value = progress;
lbProgress.Text = $"Scanned: {scanned} Downloaded: {done} Open: {totalAttachments - done}"; lbProgress.Text = $"Scanned: {scanned} Downloaded: {done} Open: {totalAttachments - done}";
} }
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) private void aboutToolStripMenuItem_Click(object sender, System.EventArgs e)
{ {
MessageBox.Show(Resources.AboutString); MessageBox.Show(Properties.Resources.AboutString);
} }
private void visitGithubToolStripMenuItem_Click(object sender, EventArgs e) private void visitGithubToolStripMenuItem_Click(object sender, System.EventArgs e)
{ {
Process.Start("https://github.com/Serraniel/DiscordMediaLoader/"); Process.Start("https://github.com/Serraniel/DiscordMediaLoader/");
} }
private async void toolStripDropDownButton1_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
var 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();
}
private void showTokenToolStripMenuItem_Click(object sender, EventArgs e)
{
Clipboard.SetText(Core.Settings.LoginToken);
MessageBox.Show(this, "Your login token has been copied to your clipboard.", "Discord Media Loader",
MessageBoxButtons.OK);
}
private void btnFileNameHelp_Click(object sender, EventArgs e)
{
MessageBox.Show(Resources.FileNameInfo);
}
} }
} }

View file

@ -123,9 +123,6 @@
<metadata name="tmrRefreshProgress.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="tmrRefreshProgress.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>126, 17</value> <value>126, 17</value>
</metadata> </metadata>
<metadata name="tmrTriggerRefresh.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>284, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>

View file

@ -1,4 +1,5 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden // Allgemeine Informationen über eine Assembly werden über die folgenden
@ -9,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Serraniel")] [assembly: AssemblyCompany("Serraniel")]
[assembly: AssemblyProduct("Discord Media Loader.Application")] [assembly: AssemblyProduct("Discord Media Loader.Application")]
[assembly: AssemblyCopyright("Copyright © 2017 - 2019 by Serraniel")] [assembly: AssemblyCopyright("Copyright © 2017 by Serraniel")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -31,5 +32,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben: // übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.5.3.0")] [assembly: AssemblyVersion("0.99.148.0")]
[assembly: AssemblyFileVersion("1.5.3.0")] [assembly: AssemblyFileVersion("0.99.148.0")]

View file

@ -19,7 +19,7 @@ namespace DML.Application.Properties {
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources { internal class Resources {
@ -79,34 +79,6 @@ namespace DML.Application.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die You can use the following placeholders for your filenames:
///
///%guild% -&gt; server name
///%channel% -&gt; channel name
///%timestamp% -&gt; message timestamp (Unix timestamp)
///%name% -&gt; attachment filename
///%username% -&gt; author username
///%nickname% -&gt; author nickname (if unassigned, username will be used)
///%id% -&gt; attachment id (given by Discord)
///%userid% -&gt; author id (given by discord) ähnelt.
/// </summary>
internal static string FileNameInfo {
get {
return ResourceManager.GetString("FileNameInfo", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap info_icon {
get {
object obj = ResourceManager.GetObject("info_icon", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary> /// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary> /// </summary>

View file

@ -129,25 +129,9 @@ Nito.AsyncEx (Copyright (c) 2014 StephenCleary - MIT License)
RestSharp (Copyright (c) restsharp - Apache 2.0 License) RestSharp (Copyright (c) restsharp - Apache 2.0 License)
WebSocket4Net (Copyright (c) kerryjiang - Apache 2.0 License) WebSocket4Net (Copyright (c) kerryjiang - Apache 2.0 License)
LiteDB (Copyright (c) 2014 - 2015 Mauricio David - MIT License) LiteDB (Copyright (c) 2014 - 2015 Mauricio David - MIT License)
Octokit (Copyright (c) 2012 GitHub, Inc - MIT License) Octokit (Copyright (c) 2012 GitHub, Inc - MIT License)</value>
Flaticons (Roundicons Circle Flat) - Flaticon Basic License</value>
</data>
<data name="FileNameInfo" xml:space="preserve">
<value>You can use the following placeholders for your filenames:
%guild% -&gt; server name
%channel% -&gt; channel name
%timestamp% -&gt; message timestamp (Unix timestamp)
%name% -&gt; attachment filename
%username% -&gt; author username
%nickname% -&gt; author nickname (if unassigned, username will be used)
%id% -&gt; attachment id (given by Discord)
%userid% -&gt; author id (given by discord)</value>
</data> </data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="info_icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\info_icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Serraniel_Logo4_NO_BG" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Serraniel_Logo4_NO_BG" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Serraniel-Logo4-NO-BG.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\Serraniel-Logo4-NO-BG.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Interactive.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.6.0" newVersion="3.1.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.5.0" newVersion="1.2.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /></startup></configuration>

View file

@ -1,28 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="LiteDB" version="5.0.9" targetFramework="net461" /> <package id="Discord.Net" version="0.9.6" targetFramework="net461" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net461" /> <package id="LiteDB" version="3.1.0" targetFramework="net461" />
<package id="Microsoft.NETCore.Platforms" version="5.0.1" targetFramework="net461" /> <package id="Newtonsoft.Json" version="8.0.3" targetFramework="net461" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net461" /> <package id="Nito.AsyncEx" version="3.0.1" targetFramework="net461" />
<package id="Microsoft.Win32.Registry" version="5.0.0" targetFramework="net461" /> <package id="RestSharp" version="105.2.3" targetFramework="net461" />
<package id="NETStandard.Library" version="2.0.3" targetFramework="net461" /> <package id="WebSocket4Net" version="0.14.1" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net461" />
<package id="SharpRaven" version="2.4.0" targetFramework="net461" />
<package id="SweetLib" version="0.2.1-alpha" targetFramework="net461" />
<package id="System.Buffers" version="4.5.1" targetFramework="net461" />
<package id="System.Collections.Immutable" version="5.0.0" targetFramework="net461" />
<package id="System.Linq" version="4.3.0" targetFramework="net461" requireReinstallation="true" />
<package id="System.Linq.Async" version="4.1.1" targetFramework="net461" />
<package id="System.Memory" version="4.5.4" targetFramework="net461" />
<package id="System.Net.Security" version="4.3.2" targetFramework="net461" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net461" />
<package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0" targetFramework="net461" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net461" />
<package id="System.Security.AccessControl" version="5.0.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net461" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net461" />
<package id="System.Security.Principal.Windows" version="5.0.0" targetFramework="net461" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net461" />
</packages> </packages>

View file

@ -1,29 +1,13 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio 15
VisualStudioVersion = 16.0.29324.140 VisualStudioVersion = 15.0.26403.7
MinimumVisualStudioVersion = 10.0.40219.1 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}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord Media Loader", "Discord Media Loader\Discord Media Loader.csproj", "{EDC92554-DBC1-4F9C-9317-379A8BF441E8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.Application", "Discord Media Loader.Application\DML.Application.csproj", "{C130DE6A-3237-42B5-BE9F-783D1CD104C6}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.Application", "Discord Media Loader.Application\DML.Application.csproj", "{C130DE6A-3237-42B5-BE9F-783D1CD104C6}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DML.Client", "DML.Client\DML.Client.csproj", "{045EB4A1-34E7-47E0-867E-E10C40505095}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SweetLib", "..\SweetLib\SweetLib\SweetLib.csproj", "{02C1F8EF-32F2-4E77-A36D-79129402AF37}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Core", "libs\Discord.Net\src\Discord.Net.Core\Discord.Net.Core.csproj", "{8BD82FAE-47F7-41FD-A862-892C8AFF8C66}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libs", "libs", "{451BDCAA-EC43-475E-8887-0F80EA605A73}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers", "libs\Discord.Net\src\Discord.Net.Analyzers\Discord.Net.Analyzers.csproj", "{99FB0F60-AEEC-4059-9605-6FA2D7408EFC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Commands", "libs\Discord.Net\src\Discord.Net.Commands\Discord.Net.Commands.csproj", "{B3B30663-625D-452F-A3D7-57B381D021F6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Providers.WS4Net", "libs\Discord.Net\src\Discord.Net.Providers.WS4Net\Discord.Net.Providers.WS4Net.csproj", "{AD6116CD-1DC1-4FED-A2D5-0E72B553DD32}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Rest", "libs\Discord.Net\src\Discord.Net.Rest\Discord.Net.Rest.csproj", "{103472C3-834D-4561-9395-6FEBFEB165AC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Webhook", "libs\Discord.Net\src\Discord.Net.Webhook\Discord.Net.Webhook.csproj", "{58D6AEF3-5837-4601-A5D3-C6F11AC313B0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.WebSocket", "libs\Discord.Net\src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj", "{58009F12-B2D9-4F1C-954B-A7CFEA17DBC7}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -39,52 +23,12 @@ Global
{C130DE6A-3237-42B5-BE9F-783D1CD104C6}.Debug|Any CPU.Build.0 = Debug|Any CPU {C130DE6A-3237-42B5-BE9F-783D1CD104C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C130DE6A-3237-42B5-BE9F-783D1CD104C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {C130DE6A-3237-42B5-BE9F-783D1CD104C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C130DE6A-3237-42B5-BE9F-783D1CD104C6}.Release|Any CPU.Build.0 = Release|Any CPU {C130DE6A-3237-42B5-BE9F-783D1CD104C6}.Release|Any CPU.Build.0 = Release|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.Debug|Any CPU.Build.0 = Debug|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Debug|Any CPU.Build.0 = Debug|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.Release|Any CPU.ActiveCfg = Release|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.ActiveCfg = Release|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.Release|Any CPU.Build.0 = Release|Any CPU {02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.Build.0 = Release|Any CPU
{8BD82FAE-47F7-41FD-A862-892C8AFF8C66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8BD82FAE-47F7-41FD-A862-892C8AFF8C66}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8BD82FAE-47F7-41FD-A862-892C8AFF8C66}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8BD82FAE-47F7-41FD-A862-892C8AFF8C66}.Release|Any CPU.Build.0 = Release|Any CPU
{99FB0F60-AEEC-4059-9605-6FA2D7408EFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{99FB0F60-AEEC-4059-9605-6FA2D7408EFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{99FB0F60-AEEC-4059-9605-6FA2D7408EFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{99FB0F60-AEEC-4059-9605-6FA2D7408EFC}.Release|Any CPU.Build.0 = Release|Any CPU
{B3B30663-625D-452F-A3D7-57B381D021F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B3B30663-625D-452F-A3D7-57B381D021F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B3B30663-625D-452F-A3D7-57B381D021F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B3B30663-625D-452F-A3D7-57B381D021F6}.Release|Any CPU.Build.0 = Release|Any CPU
{AD6116CD-1DC1-4FED-A2D5-0E72B553DD32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD6116CD-1DC1-4FED-A2D5-0E72B553DD32}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD6116CD-1DC1-4FED-A2D5-0E72B553DD32}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD6116CD-1DC1-4FED-A2D5-0E72B553DD32}.Release|Any CPU.Build.0 = Release|Any CPU
{103472C3-834D-4561-9395-6FEBFEB165AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{103472C3-834D-4561-9395-6FEBFEB165AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{103472C3-834D-4561-9395-6FEBFEB165AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{103472C3-834D-4561-9395-6FEBFEB165AC}.Release|Any CPU.Build.0 = Release|Any CPU
{58D6AEF3-5837-4601-A5D3-C6F11AC313B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{58D6AEF3-5837-4601-A5D3-C6F11AC313B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{58D6AEF3-5837-4601-A5D3-C6F11AC313B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{58D6AEF3-5837-4601-A5D3-C6F11AC313B0}.Release|Any CPU.Build.0 = Release|Any CPU
{58009F12-B2D9-4F1C-954B-A7CFEA17DBC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{58009F12-B2D9-4F1C-954B-A7CFEA17DBC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{58009F12-B2D9-4F1C-954B-A7CFEA17DBC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{58009F12-B2D9-4F1C-954B-A7CFEA17DBC7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{8BD82FAE-47F7-41FD-A862-892C8AFF8C66} = {451BDCAA-EC43-475E-8887-0F80EA605A73}
{99FB0F60-AEEC-4059-9605-6FA2D7408EFC} = {451BDCAA-EC43-475E-8887-0F80EA605A73}
{B3B30663-625D-452F-A3D7-57B381D021F6} = {451BDCAA-EC43-475E-8887-0F80EA605A73}
{AD6116CD-1DC1-4FED-A2D5-0E72B553DD32} = {451BDCAA-EC43-475E-8887-0F80EA605A73}
{103472C3-834D-4561-9395-6FEBFEB165AC} = {451BDCAA-EC43-475E-8887-0F80EA605A73}
{58D6AEF3-5837-4601-A5D3-C6F11AC313B0} = {451BDCAA-EC43-475E-8887-0F80EA605A73}
{58009F12-B2D9-4F1C-954B-A7CFEA17DBC7} = {451BDCAA-EC43-475E-8887-0F80EA605A73}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0B742DE0-D6AF-4033-9605-863C32A7FFD8}
EndGlobalSection
EndGlobal EndGlobal

View file

@ -1,74 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
</startup> </startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Interactive.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.6.0" newVersion="3.1.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.5.0" newVersion="1.2.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration> </configuration>

View file

@ -13,8 +13,6 @@
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile /> <TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
@ -42,145 +40,34 @@
<StartupObject /> <StartupObject />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="Nito.AsyncEx, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath> <HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL"> <Reference Include="Nito.AsyncEx.Concurrent, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.3.1.6\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath> <HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Concurrent.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL"> <Reference Include="Nito.AsyncEx.Enlightenment, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.6\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath> <HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Enlightenment.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="Octokit, Version=0.24.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath> <HintPath>..\packages\Octokit.0.24.1-alpha0001\lib\net45\Octokit.dll</HintPath>
</Reference> <Private>True</Private>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Context, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Context.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Context.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Coordination, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Coordination.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Coordination.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Interop.WaitHandles, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Interop.WaitHandles.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Interop.WaitHandles.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Oop, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Oop.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Oop.dll</HintPath>
</Reference>
<Reference Include="Nito.AsyncEx.Tasks, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.Tasks.5.0.0\lib\netstandard2.0\Nito.AsyncEx.Tasks.dll</HintPath>
</Reference>
<Reference Include="Nito.Cancellation, Version=1.0.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.Cancellation.1.0.5\lib\netstandard2.0\Nito.Cancellation.dll</HintPath>
</Reference>
<Reference Include="Nito.Collections.Deque, Version=1.0.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.Collections.Deque.1.0.4\lib\netstandard2.0\Nito.Collections.Deque.dll</HintPath>
</Reference>
<Reference Include="Nito.Disposables, Version=2.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.Disposables.2.1.0\lib\net461\Nito.Disposables.dll</HintPath>
</Reference>
<Reference Include="Octokit, Version=0.48.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Octokit.0.48.0\lib\net46\Octokit.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll</HintPath>
</Reference>
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Immutable, Version=1.2.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Immutable.1.7.1\lib\net461\System.Collections.Immutable.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Console, Version=4.0.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
</Reference>
<Reference Include="System.Interactive.Async, Version=4.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\packages\System.Interactive.Async.4.0.0\lib\net461\System.Interactive.Async.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.Compression.FileSystem" /> <Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Linq.Async, Version=4.1.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\packages\System.Linq.Async.4.1.1\lib\net461\System.Linq.Async.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net461\System.Security.Cryptography.Algorithms.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Deployment" /> <Reference Include="System.Deployment" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Xml.ReaderWriter.4.3.1\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="FrmDownload.cs"> <Compile Include="FrmDownload.cs">
@ -241,13 +128,6 @@
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">

View file

@ -1,7 +1,12 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.Net; using System.Net;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;

View file

@ -1,6 +1,13 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using Discord_Media_Loader.Helper; using Discord_Media_Loader.Helper;
@ -19,7 +26,7 @@ namespace Discord_Media_Loader
try try
{ {
var releaseVersion = await VersionHelper.GetReleaseVersion(); var releaseVersion = await VersionHelper.GetReleaseVersion();
if (releaseVersion > VersionHelper.AppVersion) if (releaseVersion > VersionHelper.CurrentVersion)
{ {
var tmpFile = Path.GetTempFileName(); var tmpFile = Path.GetTempFileName();
var downloadManager = new FrmDownload(tmpFile, await VersionHelper.DownloadVersion(releaseVersion)); var downloadManager = new FrmDownload(tmpFile, await VersionHelper.DownloadVersion(releaseVersion));
@ -28,7 +35,7 @@ namespace Discord_Media_Loader
downloadManager.ShowDialog(); downloadManager.ShowDialog();
var tmpFolder = Path.GetTempFileName(); var tmpFolder = Path.GetTempFileName();
tmpFolder = Path.Combine(Path.GetFullPath(tmpFolder).Replace(Path.GetFileName(tmpFolder), ""), Path.GetFileNameWithoutExtension(tmpFolder)); tmpFolder = Path.Combine(Path.GetFullPath(tmpFolder).Replace(Path.GetFileName(tmpFolder),""), Path.GetFileNameWithoutExtension(tmpFolder));
var di = Directory.CreateDirectory(tmpFolder); var di = Directory.CreateDirectory(tmpFolder);
@ -45,7 +52,6 @@ namespace Discord_Media_Loader
} }
File.Delete(tmpFile); File.Delete(tmpFile);
DialogResult = DialogResult.Cancel;
} }
} }
finally finally
@ -53,7 +59,7 @@ namespace Discord_Media_Loader
UseWaitCursor = false; UseWaitCursor = false;
} }
DialogResult = DialogResult.OK; Close();
} }
} }
} }

View file

@ -1,6 +1,9 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Octokit; using Octokit;
@ -10,14 +13,12 @@ namespace Discord_Media_Loader.Helper
{ {
internal static Version CurrentVersion => Assembly.GetExecutingAssembly().GetName().Version; internal static Version CurrentVersion => Assembly.GetExecutingAssembly().GetName().Version;
internal static Version AppVersion => AssemblyName.GetAssemblyName("Discord Media Loader.Application.dll").Version;
internal static async Task<Version> GetReleaseVersion() internal static async Task<Version> GetReleaseVersion()
{ {
var github = new GitHubClient(new ProductHeaderValue("DiscordMedialLoader")); var github = new GitHubClient(new ProductHeaderValue("DiscordMedialLoader"));
var tag = var tag =
(await github.Repository.Release.GetAll("Serraniel", "DiscordMediaLoader")).Where(x => x.Prerelease == false).OrderByDescending(x => x.CreatedAt).First().TagName.Replace("v", "") ?? ""; (await github.Repository.Release.GetAll("Serraniel", "DiscordMediaLoader")).OrderByDescending(x => x.CreatedAt).First().TagName.Replace("v", "") ?? "";
var version = new Version(tag); var version = new Version(tag);
return version; return version;

View file

@ -1,28 +1,28 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using DML.Application.Classes; using Discord_Media_Loader.Helper;
using DML.Application;
using Nito.AsyncEx; using Nito.AsyncEx;
namespace Discord_Media_Loader namespace Discord_Media_Loader
{ {
internal static class Program static class Program
{ {
[STAThread] [STAThread]
private static void Main(string[] paramStrings) static void Main(string[] paramStrings)
{ {
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
var splashScreen = new FrmSplash(); var splashScreen = new FrmSplash();
if (splashScreen.ShowDialog() == DialogResult.OK) splashScreen.ShowDialog();
DoLaunch(paramStrings);
else
Application.Restart();
}
private static void DoLaunch(string[] paramStrings)
{
AsyncContext.Run(() => Core.Run(paramStrings)); AsyncContext.Run(() => Core.Run(paramStrings));
Console.WriteLine("Ende");
} }
} }
} }

View file

@ -1,4 +1,5 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden // Allgemeine Informationen über eine Assembly werden über die folgenden
@ -9,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Serraniel")] [assembly: AssemblyCompany("Serraniel")]
[assembly: AssemblyProduct("Discord Media Loader")] [assembly: AssemblyProduct("Discord Media Loader")]
[assembly: AssemblyCopyright("Copyright © 2017 - 2019 by Serraniel")] [assembly: AssemblyCopyright("Copyright © 2017 by Serraniel")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -31,5 +32,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben: // übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.0.0")] [assembly: AssemblyVersion("0.99.75.0")]
[assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyFileVersion("0.99.75.0")]

View file

@ -1,30 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net461" /> <package id="Nito.AsyncEx" version="3.0.1" targetFramework="net462" />
<package id="Microsoft.NETCore.Platforms" version="5.0.1" targetFramework="net461" /> <package id="Octokit" version="0.24.1-alpha0001" targetFramework="net461" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net461" />
<package id="NETStandard.Library" version="2.0.3" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net461" />
<package id="Nito.AsyncEx" version="5.1.2" targetFramework="net461" />
<package id="Nito.AsyncEx.Context" version="5.1.2" targetFramework="net461" />
<package id="Nito.AsyncEx.Coordination" version="5.1.2" targetFramework="net461" />
<package id="Nito.AsyncEx.Interop.WaitHandles" version="5.1.2" targetFramework="net461" />
<package id="Nito.AsyncEx.Oop" version="5.1.2" targetFramework="net461" />
<package id="Nito.AsyncEx.Tasks" version="5.1.2" targetFramework="net461" />
<package id="Nito.Cancellation" version="1.1.2" targetFramework="net461" />
<package id="Nito.Collections.Deque" version="1.1.1" targetFramework="net461" />
<package id="Nito.Disposables" version="2.2.1" targetFramework="net461" />
<package id="Octokit" version="0.50.0" targetFramework="net461" />
<package id="System.Buffers" version="4.5.1" targetFramework="net461" />
<package id="System.Collections.Immutable" version="5.0.0" targetFramework="net461" />
<package id="System.Linq" version="4.3.0" targetFramework="net461" />
<package id="System.Memory" version="4.5.4" targetFramework="net461" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net461" />
<package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0" targetFramework="net461" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net461" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net461" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net461" />
</packages> </packages>

View file

@ -1,12 +1,7 @@
# Discord Media Loader # Discord Media Loader
## IMPORTANT: This selfbot may violate discord TOS. Use at own risk!!!
*Discord Media Loader* is a small tool for downloading all attachments of *Discord* servers. *Discord Media Loader* is a small tool for downloading all attachments of *Discord* servers.
**[Downloadlatest release](https://github.com/Serraniel/DiscordMediaLoader/releases)** or install with *winget*: `winget install -e --id Serraniel.DiscordMediaLoader`. **[Download](https://github.com/Serraniel/DiscordMediaLoader/releases)**
**Build:** [![build status badge](https://ci.serraniel.com/app/rest/builds/buildType:(DiscordMediaLoader_BuildMaster)/statusIcon)](https://ci.serraniel.com/viewType.html?buildTypeId=DiscordMediaLoader_BuildMaster)
## License ## License
@ -24,14 +19,3 @@ Apache License 2.0
## Requirements ## Requirements
* [.Net Framework 4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137) by Microsoft * [.Net Framework 4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137) by Microsoft
## How to use
First things first: **Do not use if you have MFA enabled** as long as login is only supported via username and password. That might get you lost your account. A switch to a token based login will come soon™!
Otherwise you may just do the following steps:
1. Login
2. Select a guild
3. Select a channel
4. Select a directory to save the files
5. Do other settings if wished
6. Press the magic button to download stuff

View file

@ -1,216 +0,0 @@
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Discord Media Loader"
#define MyAppVersion "1.5.3.0"
#define MyAppPublisher "Serraniel"
#define MyAppURL "https://github.com/Serraniel/DiscordMediaLoader"
#define MyAppExeName "Discord Media Loader.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{CC50DF25-9ECA-4F99-8DFF-9A0FB0A63DA3}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={localappdata}\Programs\{#MyAppName}
DisableProgramGroupPage=yes
; The [Icons] "quicklaunchicon" entry uses {userappdata} but its [Tasks] entry has a proper IsAdminInstallMode Check.
UsedUserAreasWarning=no
LicenseFile=C:\Users\Daniel\Documents\Projects\Discord Media Loader\LICENSE
; Remove the following line to run in administrative install mode (install for all users.)
PrivilegesRequired=lowest
PrivilegesRequiredOverridesAllowed=commandline
OutputDir=C:\Users\Daniel\Documents\Projects\Discord Media Loader\install
OutputBaseFilename=Discord_Media_Loader_Setup
Compression=lzma
WizardStyle=modern
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode
[Files]
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord Media Loader.Application.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord Media Loader.Application.dll.config"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord Media Loader.Application.pdb"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord Media Loader.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord Media Loader.exe.config"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord Media Loader.pdb"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.Core.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.Core.pdb"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.Core.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.Rest.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.Rest.pdb"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.Rest.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.WebSocket.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.WebSocket.pdb"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Discord.Net.WebSocket.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\DML.Client.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\DML.Client.pdb"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\LiteDB.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\LiteDB.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Bcl.AsyncInterfaces.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Bcl.AsyncInterfaces.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Extensions.DependencyInjection.Abstractions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Extensions.DependencyInjection.Abstractions.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Extensions.DependencyInjection.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Extensions.DependencyInjection.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Win32.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Win32.Registry.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Microsoft.Win32.Registry.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\netstandard.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Newtonsoft.Json.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Newtonsoft.Json.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Context.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Context.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Coordination.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Coordination.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Interop.WaitHandles.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Interop.WaitHandles.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Oop.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Oop.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Tasks.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.AsyncEx.Tasks.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.Cancellation.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.Cancellation.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.Collections.Deque.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.Collections.Deque.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.Disposables.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Nito.Disposables.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Octokit.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\Octokit.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\SharpRaven.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\SweetLib.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\SweetLib.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.AppContext.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Buffers.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Buffers.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Collections.Concurrent.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Collections.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Collections.Immutable.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Collections.Immutable.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Collections.NonGeneric.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Collections.Specialized.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.ComponentModel.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.ComponentModel.EventBasedAsync.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.ComponentModel.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.ComponentModel.TypeConverter.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Console.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Data.Common.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.Contracts.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.Debug.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.DiagnosticSource.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.DiagnosticSource.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.FileVersionInfo.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.Process.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.StackTrace.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.TextWriterTraceListener.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.Tools.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.TraceSource.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Diagnostics.Tracing.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Drawing.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Dynamic.Runtime.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Globalization.Calendars.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Globalization.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Globalization.Extensions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.Compression.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.Compression.ZipFile.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.FileSystem.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.FileSystem.DriveInfo.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.FileSystem.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.FileSystem.Watcher.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.IsolatedStorage.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.MemoryMappedFiles.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.Pipes.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.IO.UnmanagedMemoryStream.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Linq.Async.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Linq.Async.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Linq.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Linq.Expressions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Linq.Parallel.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Linq.Queryable.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Memory.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Memory.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.Http.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.NameResolution.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.NetworkInformation.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.Ping.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.Requests.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.Security.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.Sockets.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.WebHeaderCollection.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.WebSockets.Client.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Net.WebSockets.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Numerics.Vectors.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Numerics.Vectors.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.ObjectModel.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Reflection.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Reflection.Extensions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Reflection.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Resources.Reader.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Resources.ResourceManager.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Resources.Writer.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.CompilerServices.Unsafe.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.CompilerServices.Unsafe.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.CompilerServices.VisualC.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.Extensions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.Handles.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.InteropServices.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.InteropServices.RuntimeInformation.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.Numerics.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.Serialization.Formatters.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.Serialization.Json.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.Serialization.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Runtime.Serialization.Xml.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.Claims.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.Cryptography.Algorithms.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.Cryptography.Csp.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.Cryptography.Encoding.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.Cryptography.Primitives.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.Cryptography.X509Certificates.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.Principal.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Security.SecureString.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Text.Encoding.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Text.Encoding.Extensions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Text.RegularExpressions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.Overlapped.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.Tasks.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.Tasks.Extensions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.Tasks.Extensions.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.Tasks.Parallel.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.Thread.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.ThreadPool.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Threading.Timer.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.ValueTuple.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Xml.ReaderWriter.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Xml.XDocument.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Xml.XmlDocument.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Xml.XmlSerializer.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Xml.XPath.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Daniel\Documents\Projects\Discord Media Loader\Discord Media Loader\bin\Release\System.Xml.XPath.XDocument.dll"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

View file

@ -1,2 +0,0 @@
iscc install.iss /O+ /O. /Qp
pause

View file

@ -1,21 +0,0 @@
Id: Serraniel.DiscordMediaLoader
Publisher: Serraniel
Name: Discord Media Loader
Version: 1.3.0.0
License: Copyright (C) 2016-2020 Serraniel - Apache License 2.0
InstallerType: NULLSOFT
LicenseUrl: https://github.com/Serraniel/DiscordMediaLoader/blob/master/LICENSE
AppMoniker: Discord Media Loader
Tags: DiscordMediaLoader,Discord,DML
Description: Tool to automatically download media files from Discord Servers.
Homepage: https://github.com/Serraniel/DiscordMediaLoader
Installers:
- Arch: x86
InstallerType: Inno
Url: https://github.com/Serraniel/DiscordMediaLoader/releases/download/v1.3.0.0/Discord_Media_Loader_Setup.exe
Sha256: 0A0FE038F655E9BC6343A9A6F43F2AECA1EF90EE7CE61DB0D822CC3C76908855
Language: EN
Switches:
Silent: /VERYSILENT
SilentWithProgress: /SILENT
# Generated by https://github.com/ptorr-msft/WinGetYamlGenerator

View file

@ -1,21 +0,0 @@
Id: Serraniel.DiscordMediaLoader
Publisher: Serraniel
Name: Discord Media Loader
Version: 1.4.0.0
License: Copyright (C) 2016-2020 Serraniel - Apache License 2.0
InstallerType: NULLSOFT
LicenseUrl: https://github.com/Serraniel/DiscordMediaLoader/blob/master/LICENSE
AppMoniker: Discord Media Loader
Tags: DiscordMediaLoader,Discord,DML
Description: Tool to automatically download media files from Discord Servers.
Homepage: https://github.com/Serraniel/DiscordMediaLoader
Installers:
- Arch: x86
InstallerType: Inno
Url: https://github.com/Serraniel/DiscordMediaLoader/releases/download/v1.4.0.0/Discord_Media_Loader_Setup.exe
Sha256: a48ad932d176976209797e7cb6aaaafce90811d97c06b25491323312ee849b59
Language: EN
Switches:
Silent: /VERYSILENT
SilentWithProgress: /SILENT
# Generated by https://github.com/ptorr-msft/WinGetYamlGenerator

@ -1 +0,0 @@
Subproject commit 373318d3eae295f789c11a24948d86690db91a0f