Some basic stuff

This commit is contained in:
Serraniel 2017-04-16 22:46:29 +02:00
parent f48ce1a717
commit 9384c9c2d0
12 changed files with 994 additions and 14 deletions

View file

@ -0,0 +1,41 @@
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
{
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;
internal void Store()
{
Trace("Getting settings collection...");
var settingsDB = 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,14 +1,194 @@
using Discord;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime;
using System.Runtime.Remoting.Channels;
using System.Threading.Tasks;
using System.Windows.Forms;
using Discord;
using Discord.Net;
using DML.Application.Classes;
using DML.Application.Dialogs;
using LiteDB;
using SweetLib.Utils.Logger;
using SweetLib.Utils.Logger.Memory;
using static SweetLib.Utils.Logger.Logger;
namespace DML.Application
{
public class Core
public static class Core
{
internal static DiscordClient Client;
internal static DiscordClient Client { get; set; }
internal static LiteDatabase Database { get; set; }
internal static Settings Settings { get; set; }
public static void Run()
internal static string DataDirectory
=> Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Serraniel\Discord Media Loader");
public static async Task Run(string[] paramStrings)
{
System.Windows.Forms.Application.Run(new MainForm());
try
{
Info("Starting up Discord Media Loader application...");
var useTrace = false;
#if DEBUG
//temporary add debug log level if debugging...
GlobalLogLevel |= LogLevel.Debug;
Debug("Running in debug configuartion. Added log level debug.");
#endif
Debug($"Parameters: {string.Join(", ", paramStrings)}");
if (paramStrings.Contains("--trace") || paramStrings.Contains("-t"))
{
useTrace = true;
GlobalLogLevel |= LogLevel.Trace;
Trace("Trace parameter found. Added log level trace.");
}
Debug($"Application data folder: {DataDirectory}");
Trace("Checking application data folder...");
if (!Directory.Exists(DataDirectory))
{
Debug("Creating application data folder...");
Directory.CreateDirectory(DataDirectory);
Trace("Creating application data folder.");
}
Trace("Initializing profile optimizations...");
ProfileOptimization.SetProfileRoot(System.Windows.Forms.Application.UserAppDataPath);
ProfileOptimization.StartProfile("profile.opt");
Trace("Finished initializing profile optimizations.");
Trace("Trying to identify log memory...");
var logMemory = DefaultLogMemory as ArchivableConsoleLogMemory;
if (logMemory != null)
{
var logFolder = Path.Combine(DataDirectory, "logs");
if (!Directory.Exists(logFolder))
{
Debug("Creating log folder...");
Directory.CreateDirectory(logFolder);
Trace("Created log folder.");
}
var logFile = Path.Combine(logFolder,
$"{DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.SortableDateTimePattern).Replace(':', '-')}.log.zip");
Trace($"Setting log file: {logFile}");
logMemory.AutoArchiveOnDispose = true;
logMemory.ArchiveFile = logFile;
}
Debug("Loading database...");
Database = new LiteDatabase(Path.Combine(DataDirectory, "config.db"));
Database.Log.Logging += (message) => Trace($"LiteDB: {message}");
Debug("Loading settings collection out of database...");
var settingsDB = Database.GetCollection<Settings>("settings");
if (settingsDB.Count() > 1)
{
Warn("Found more than one setting. Loading first one...");
}
Settings = settingsDB.FindAll().FirstOrDefault();
if (Settings == null)
{
Warn("Settings not found. Creating new one. This is normal on first start up...");
Settings = new Settings();
Settings.Store();
}
Info("Loaded settings.");
Debug(
$"Settings: Email: {Settings.Email}, password: {(string.IsNullOrEmpty(Settings.Password) ? "not set" : "is set")}, use username: {Settings.UseUserData}, loginToken: {Settings.LoginToken}");
Trace("Updating log level...");
GlobalLogLevel = Settings.ApplicactionLogLevel;
#if DEBUG
//temporary add debug log level if debugging...
GlobalLogLevel |= LogLevel.Debug;
Debug("Running in debug configuartion. Added log level debug.");
#endif
if (useTrace)
{
GlobalLogLevel |= LogLevel.Trace;
Trace("Creating application data folder.");
}
Debug("Creating discord client...");
Client = new DiscordClient();
Client.Log.Message += (sender, message) =>
{
var logMessage = $"DiscordClient: {message.Message}";
switch (message.Severity)
{
case LogSeverity.Verbose:
Trace(logMessage);
break;
case LogSeverity.Debug:
Trace(logMessage);
break;
case LogSeverity.Info:
Info(logMessage);
break;
case LogSeverity.Warning:
Warn(logMessage);
break;
case LogSeverity.Error:
Error(logMessage);
break;
}
};
Info("Trying to log into discord...");
var abort = false;
while (Client.State != ConnectionState.Connected && !abort)
{
Trace("Entering login loop.");
try
{
if (!string.IsNullOrEmpty(Settings.LoginToken))
{
Debug("Trying to login with last known token...");
await Client.Connect(Settings.LoginToken, TokenType.User);
}
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)
{
Warn("Login seems to have failed or gone wrong.");
}
if (Client.State != ConnectionState.Connected)
{
Settings.Password = string.Empty;
Debug("Showing dialog for username and password...");
var loginDlg = new LoginDialog();
loginDlg.ShowDialog();
Trace("Dialog closed.");
}
}
System.Windows.Forms.Application.Run(new MainForm());
}
catch (Exception ex)
{
Error($"{ex.Message} occured at: {ex.StackTrace}");
}
}
}
}

View file

@ -34,6 +34,10 @@
<HintPath>..\packages\Discord.Net.0.9.6\lib\net45\Discord.Net.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="LiteDB, Version=3.1.0.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL">
<HintPath>..\packages\LiteDB.3.1.0\lib\net35\LiteDB.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
@ -74,7 +78,14 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Classes\Settings.cs" />
<Compile Include="Core.cs" />
<Compile Include="Dialogs\LoginDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Dialogs\LoginDialog.Designer.cs">
<DependentUpon>LoginDialog.cs</DependentUpon>
</Compile>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
@ -84,6 +95,9 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Dialogs\LoginDialog.resx">
<DependentUpon>LoginDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>

View file

@ -0,0 +1,258 @@
namespace DML.Application.Dialogs
{
partial class LoginDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginDialog));
this.pnlButtons = new System.Windows.Forms.Panel();
this.tbcLoginMethods = new System.Windows.Forms.TabControl();
this.tpgToken = new System.Windows.Forms.TabPage();
this.tpgUserdata = new System.Windows.Forms.TabPage();
this.lbToken = new System.Windows.Forms.Label();
this.edToken = new System.Windows.Forms.TextBox();
this.lbHowToToken = new System.Windows.Forms.Label();
this.edEmail = new System.Windows.Forms.TextBox();
this.edPassword = new System.Windows.Forms.TextBox();
this.lbEmail = new System.Windows.Forms.Label();
this.lbPassword = new System.Windows.Forms.Label();
this.cbUseUserdata = new System.Windows.Forms.CheckBox();
this.cbSavePassword = new System.Windows.Forms.CheckBox();
this.lbUserdataHints = new System.Windows.Forms.Label();
this.btnOk = new System.Windows.Forms.Button();
this.btnAbort = new System.Windows.Forms.Button();
this.pnlButtons.SuspendLayout();
this.tbcLoginMethods.SuspendLayout();
this.tpgToken.SuspendLayout();
this.tpgUserdata.SuspendLayout();
this.SuspendLayout();
//
// pnlButtons
//
this.pnlButtons.BackColor = System.Drawing.SystemColors.ButtonShadow;
this.pnlButtons.Controls.Add(this.btnAbort);
this.pnlButtons.Controls.Add(this.btnOk);
this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Bottom;
this.pnlButtons.Location = new System.Drawing.Point(0, 168);
this.pnlButtons.Name = "pnlButtons";
this.pnlButtons.Size = new System.Drawing.Size(426, 51);
this.pnlButtons.TabIndex = 0;
//
// tbcLoginMethods
//
this.tbcLoginMethods.Controls.Add(this.tpgToken);
this.tbcLoginMethods.Controls.Add(this.tpgUserdata);
this.tbcLoginMethods.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbcLoginMethods.Location = new System.Drawing.Point(0, 0);
this.tbcLoginMethods.Name = "tbcLoginMethods";
this.tbcLoginMethods.SelectedIndex = 0;
this.tbcLoginMethods.Size = new System.Drawing.Size(426, 168);
this.tbcLoginMethods.TabIndex = 1;
//
// tpgToken
//
this.tpgToken.Controls.Add(this.lbHowToToken);
this.tpgToken.Controls.Add(this.edToken);
this.tpgToken.Controls.Add(this.lbToken);
this.tpgToken.Location = new System.Drawing.Point(4, 22);
this.tpgToken.Name = "tpgToken";
this.tpgToken.Padding = new System.Windows.Forms.Padding(3);
this.tpgToken.Size = new System.Drawing.Size(418, 142);
this.tpgToken.TabIndex = 0;
this.tpgToken.Text = "Token";
this.tpgToken.UseVisualStyleBackColor = true;
//
// tpgUserdata
//
this.tpgUserdata.Controls.Add(this.lbUserdataHints);
this.tpgUserdata.Controls.Add(this.cbSavePassword);
this.tpgUserdata.Controls.Add(this.cbUseUserdata);
this.tpgUserdata.Controls.Add(this.lbPassword);
this.tpgUserdata.Controls.Add(this.lbEmail);
this.tpgUserdata.Controls.Add(this.edPassword);
this.tpgUserdata.Controls.Add(this.edEmail);
this.tpgUserdata.Location = new System.Drawing.Point(4, 22);
this.tpgUserdata.Name = "tpgUserdata";
this.tpgUserdata.Padding = new System.Windows.Forms.Padding(3);
this.tpgUserdata.Size = new System.Drawing.Size(418, 142);
this.tpgUserdata.TabIndex = 1;
this.tpgUserdata.Text = "Userdata";
this.tpgUserdata.UseVisualStyleBackColor = true;
//
// lbToken
//
this.lbToken.AutoSize = true;
this.lbToken.Location = new System.Drawing.Point(3, 9);
this.lbToken.Name = "lbToken";
this.lbToken.Size = new System.Drawing.Size(66, 13);
this.lbToken.TabIndex = 0;
this.lbToken.Text = "Login token:";
//
// edToken
//
this.edToken.Location = new System.Drawing.Point(75, 6);
this.edToken.Name = "edToken";
this.edToken.Size = new System.Drawing.Size(335, 20);
this.edToken.TabIndex = 1;
//
// lbHowToToken
//
this.lbHowToToken.Location = new System.Drawing.Point(3, 52);
this.lbHowToToken.Name = "lbHowToToken";
this.lbHowToToken.Size = new System.Drawing.Size(412, 87);
this.lbHowToToken.TabIndex = 2;
this.lbHowToToken.Text = resources.GetString("lbHowToToken.Text");
//
// edEmail
//
this.edEmail.Location = new System.Drawing.Point(47, 6);
this.edEmail.Name = "edEmail";
this.edEmail.Size = new System.Drawing.Size(133, 20);
this.edEmail.TabIndex = 0;
//
// edPassword
//
this.edPassword.Location = new System.Drawing.Point(279, 6);
this.edPassword.Name = "edPassword";
this.edPassword.PasswordChar = '•';
this.edPassword.Size = new System.Drawing.Size(133, 20);
this.edPassword.TabIndex = 1;
//
// lbEmail
//
this.lbEmail.AutoSize = true;
this.lbEmail.Location = new System.Drawing.Point(6, 9);
this.lbEmail.Name = "lbEmail";
this.lbEmail.Size = new System.Drawing.Size(35, 13);
this.lbEmail.TabIndex = 2;
this.lbEmail.Text = "Email:";
//
// lbPassword
//
this.lbPassword.AutoSize = true;
this.lbPassword.Location = new System.Drawing.Point(217, 9);
this.lbPassword.Name = "lbPassword";
this.lbPassword.Size = new System.Drawing.Size(56, 13);
this.lbPassword.TabIndex = 3;
this.lbPassword.Text = "Password:";
//
// cbUseUserdata
//
this.cbUseUserdata.AutoSize = true;
this.cbUseUserdata.Location = new System.Drawing.Point(6, 32);
this.cbUseUserdata.Name = "cbUseUserdata";
this.cbUseUserdata.Size = new System.Drawing.Size(139, 17);
this.cbUseUserdata.TabIndex = 4;
this.cbUseUserdata.Text = "Use login with user data";
this.cbUseUserdata.UseVisualStyleBackColor = true;
//
// cbSavePassword
//
this.cbSavePassword.AutoSize = true;
this.cbSavePassword.Location = new System.Drawing.Point(313, 32);
this.cbSavePassword.Name = "cbSavePassword";
this.cbSavePassword.Size = new System.Drawing.Size(99, 17);
this.cbSavePassword.TabIndex = 5;
this.cbSavePassword.Text = "Save password";
this.cbSavePassword.UseVisualStyleBackColor = true;
//
// lbUserdataHints
//
this.lbUserdataHints.Location = new System.Drawing.Point(3, 52);
this.lbUserdataHints.Name = "lbUserdataHints";
this.lbUserdataHints.Size = new System.Drawing.Size(412, 87);
this.lbUserdataHints.TabIndex = 6;
this.lbUserdataHints.Text = "Login with email and password is not recommended. If you use two factor authentic" +
"ation this can cause a ban of your discord account.\r\n\r\nFor safety reasons we rec" +
"ommend to login with login token.";
//
// btnOk
//
this.btnOk.Location = new System.Drawing.Point(267, 16);
this.btnOk.Name = "btnOk";
this.btnOk.Size = new System.Drawing.Size(75, 23);
this.btnOk.TabIndex = 0;
this.btnOk.Text = "&Ok";
this.btnOk.UseVisualStyleBackColor = true;
this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
//
// btnAbort
//
this.btnAbort.Location = new System.Drawing.Point(348, 16);
this.btnAbort.Name = "btnAbort";
this.btnAbort.Size = new System.Drawing.Size(75, 23);
this.btnAbort.TabIndex = 1;
this.btnAbort.Text = "&Abort";
this.btnAbort.UseVisualStyleBackColor = true;
this.btnAbort.Click += new System.EventHandler(this.btnAbort_Click);
//
// LoginDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(426, 219);
this.Controls.Add(this.tbcLoginMethods);
this.Controls.Add(this.pnlButtons);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "LoginDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "LoginForm";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDialog_FormClosing);
this.Shown += new System.EventHandler(this.LoginDialog_Shown);
this.pnlButtons.ResumeLayout(false);
this.tbcLoginMethods.ResumeLayout(false);
this.tpgToken.ResumeLayout(false);
this.tpgToken.PerformLayout();
this.tpgUserdata.ResumeLayout(false);
this.tpgUserdata.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel pnlButtons;
private System.Windows.Forms.TabControl tbcLoginMethods;
private System.Windows.Forms.TabPage tpgToken;
private System.Windows.Forms.Label lbHowToToken;
private System.Windows.Forms.TextBox edToken;
private System.Windows.Forms.Label lbToken;
private System.Windows.Forms.TabPage tpgUserdata;
private System.Windows.Forms.Button btnAbort;
private System.Windows.Forms.Button btnOk;
private System.Windows.Forms.Label lbUserdataHints;
private System.Windows.Forms.CheckBox cbSavePassword;
private System.Windows.Forms.CheckBox cbUseUserdata;
private System.Windows.Forms.Label lbPassword;
private System.Windows.Forms.Label lbEmail;
private System.Windows.Forms.TextBox edPassword;
private System.Windows.Forms.TextBox edEmail;
}
}

View file

@ -0,0 +1,61 @@
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 static SweetLib.Utils.Logger.Logger;
namespace DML.Application.Dialogs
{
public partial class LoginDialog : Form
{
public LoginDialog()
{
InitializeComponent();
}
private void LoginDialog_Shown(object sender, EventArgs e)
{
Trace("Login dialog shown.");
edToken.Text = Core.Settings.LoginToken;
edEmail.Text = Core.Settings.Email;
edPassword.Text = Core.Settings.Password;
cbUseUserdata.Checked = Core.Settings.UseUserData;
cbSavePassword.Checked = Core.Settings.SavePassword;
tbcLoginMethods.SelectedTab = Core.Settings.UseUserData ? tpgUserdata : tpgToken;
}
private void LoginDialog_FormClosing(object sender, FormClosingEventArgs e)
{
Trace($"Closing login dialog. Result: {DialogResult}");
if (DialogResult != DialogResult.OK)
return;
Debug("Adjusting login settings...");
Core.Settings.LoginToken = edToken.Text;
Core.Settings.Email = edEmail.Text;
Core.Settings.Password = edPassword.Text;
Core.Settings.UseUserData = cbUseUserdata.Checked;
Core.Settings.SavePassword = cbSavePassword.Checked;
Core.Settings.Store();
}
private void btnOk_Click(object sender, EventArgs e)
{
Trace("btnOk pressed.");
DialogResult = DialogResult.OK;
}
private void btnAbort_Click(object sender, EventArgs e)
{
Trace("btnAbort pressed.");
DialogResult = DialogResult.Abort;
}
}
}

View file

@ -0,0 +1,413 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<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.
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.</value>
</data>
<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">
<value>
AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8b////VP///3////+m////zP//
/+T////1//////////r////u////3f///8z///+m////f////1T///8b////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////M////5D////b////////
////////////////////////////////////////////////////////////////////////////////
/9v///+Q////M////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///w3///90////1v//
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////W////dP///w3///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A2K4AANiuAADYrgAA2K4AANiuAADfswAA////EP//
/4D////t////////////////////////////////////////////////9/zq/7XiQ/+340n/w+ho/9Pu
kf/m9b//+Pzt///////////////////////////////////////////////////////////t////gf//
/xCa2AAAmtgAAJrYAACa2AAAmtgAAJrYAAD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ANiuAADYrgAA2K4AANiu
AAD///8B////Yf///+v//////////////////////////////////////////////////////////+z4
z/+a2AD/mtgA/5rYAP+a2AD/mtgA/6TcGf+65VL/3fKo//n98P//////////////////////////////
///////////////////////r////Yf///wGa2AAAmtgAAJrYAACa2AAA////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wDYrgAA2K4AANiuAAD///8k////xP//////////////////////////////////////////////////
///////////////////h87P/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+n3SD/zOt+//X7
5v/////////////////////////////////////////////////////E////I5rYAACa2AAAmtgAAP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A2K4AANiuAAD///9V////8f//////////////////////////////////
////////////////////////////////////////0+6Q/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+k3Bn/0e2K//v+9v//////////////////////////////////////////////
//H///9VmtgAAJrYAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wH///+M////////////////////////
/////////////////////////////////////////////////////////////8bpbv+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+u4DP/5/bD////////////////////
/////////////////////////////////4z///8B////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wb///+l////////
////////////////////////////////////////////////////////////////////////////////
//+55E//mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5zZ
Bv/P7Ib/////////////////////////////////////////////////////pf///wb///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wb///+3////////////////////////////////////////////////////////////////////////
///////////////////+//3/rd8x/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/7zlV//5/fH/////////////////////////////////////////
//////+3////Bv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wH///+k////////////////////////////////////////////////////////
////////////////////////////////////////+f3v/6PcF/+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/seE7//X75v//////////////
/////////////////////////////////6T///8B////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///+K////////////////////////////////////////
/////////////////////////////////////////////////////////////+751f+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+s3y7/9Pvi////////////////////////////////////////////////i////wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///9V////////////////////////
////////////////////////////////////////////////////////////////////////////////
///s+M//rd8w/6XcHf+c2Qb/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/6zfLv/1++f/////////////////////////////////////////
//////9V////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8j////8P//
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////v/6/fL/8PnZ/97yrP/E6Gv/qd4l/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/suE8//v99P//////////////
////////////////////////////8P///yP///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8B////xP//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////v9
9f/e8qz/s+JA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP/A51/////////////////////////////////////////////////E////Af///wD///8A////AP//
/wD///8A////AP///wD///8A////Yf//////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////f867/rN8t/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/9jwnP//////////////////////////////////////////////
/2H///8A////AP///wD///8A////AP///wD///8A////EP///+r/////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////r98//I6nX/mtgA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+h2xL/8/rh////////////////////
///////////////////////q////Ev///wD///8A////AP///wD///8A////AP///3//////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////9/yrf+h2xL/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/8Dn
X////////////////////////////////////////////////4D///8A////AP///wD///8A////AP//
/w3////u////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////7PjQ/6reKP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+c2QX/7vjT///////////////////////////////////////////u////Df//
/wD///8A////AP///wD///90////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////0++L/qd4n/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/8PoaP//////////////////////////////
/////////////////3T///8A////AP///wD///8B////2///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////+360P+k4g3/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+j2xb/+Pzu////
///////////////////////////////////////b////Af///wD///8A////O///////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////wNCY/53dAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+a2AD/mtgA/9/zr////////////////////////////////////////////////zv///8A////AP//
/5D/////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////f39/+Puin/n+AA/5rY
AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP/F6W3/////////////////////////////////////////
//////+Q////AP///wD////Y////////////////////////////////////////////////////////
/////////////////////////////+3t7f+3t7f/jIyM/3Nzc/9oaGj/a2tr/35+fv+dnZ3/xsbG//Hx
8f//////////////////////////////////////////////////////////////////////////////
////////iZNy/5zbAP+b2QD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/s+JA////////////////////
////////////////////////////2f///wD///8d////////////////////////////////////////
////////////////////////////////////////9fTx/46Pk/9BQUH/Li4u/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/Li4u/y4uLv9ERET/fn5+/8rKyv//////////////////////////////////////////////
/////////////////////////////4iHjP98qA3/n+AA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/6ne
J/////////////////////////////////////////////////////8e////Vv//////////////////
////////////////////////////////////////////////////////+fDL/45/Qv8kJjH/Li4u/y4u
Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Xl5e/7e3t//+/v7/////////
//////////////////////////////////////////////////9vbXX/T2Ig/57fAP+a2QD/mtgA/5rY
AP+a2AD/mtgA/5rYAP+l3Bz/////////////////////////////////////////////////////Vv//
/4T/////////////////////////////////////////////////////////////////////8+ax/+O5
D/92ZBv/JCYx/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/YGBg/8jIyP/////////////////////////////////////////////////09PT/QkJE/zEz
Lf+Mwgb/nd0A/5rYAP+a2AD/mtgA/5rYAP+a2AD/pdwb////////////////////////////////////
/////////////////4T///+t////////////////////////////////////////////////////////
////////8+ez/9mwB//htQD/dWMb/yQnMf8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/dHR0/97e3v//////////////////////////////
////////r6+v/y4uLv8nIzH/bZET/6HiAP+a2AD/mtgA/5rYAP+a2AD/mtgA/6neJv//////////////
//////////////////////////////////////+t////zP//////////////////////////////////
////////////////////////+PHS/9qyDv/YrgD/4rUA/3lmGf8kJjH/Li4u/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Ozs7/1ZWVv90dHT/jo6O/5mZmf/Hx8f//v7+////
////////////////////////7+/v/0dHR/8uLi7/KCUw/1BkH/+f4AD/mtgA/5rYAP+a2AD/mtgA/5rY
AP+z4T7/////////////////////////////////////////////////////zP///+X/////////////
/////////////////////////////////////////v35/+C/N//YrgD/2K4A/+O2AP+Dbhf/IyYx/y4u
Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/1VVVf+QkJD/xsbG/+rq6v//////////////
////////////////////////////////////////+vr6/2tra/8uLi7/Li4u/yspL/86Qij/ltEC/5va
AP+a2AD/mtgA/5rYAP+a2AD/x+ly////////////////////////////////////////////////////
/+D////y//////////////////////////////////////////////////////Dfm//YrgD/2K4A/9iu
AP/itQD/k3oT/yUnMf8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/cHBw/8bGxv/8/Pz/////////
////////////////////////////////////////////////////////7+/v/3BwcP8uLi7/Li4u/y4u
Lv8tLC7/Ly8u/4e7CP+e3gD/mtgA/5rYAP+a2AD/mtgA/+X1vf//////////////////////////////
///////////////////////s//////////////////////////////////////////////////////79
+f/euyr/2K4A/9iuAP/YrgD/4LQA/6iKDf8oKTD/Li4u/y4uLv8uLi7/Li4u/y4uLv9QUFD/xMTE////
////////////////////////////////////////////////////////////////////////w8PD/1BQ
UP8uLi7/Li4u/y4uLv8uLi7/Li4u/yknMP95pA7/n+EA/5rYAP+a2AD/mtgA/6neJ//8/vj/////////
////////////////////////////////////////////+f//////////////////////////////////
///////////////////168D/2K4A/9iuAP/YrgD/2K4A/92yAP+/mwf/MTAt/ywtLv8uLi7/Li4u/y4u
Lv9wcHD/8PDw//////////////////////////////////////////////////////////////////r6
+v/ExMT/bm5u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8oJDH/a44U/6HiAP+a2AD/mtgA/5rY
AP/W75j///////////////////////////////////////////////////////////n////y////////
////////////////////////////////////////6tR3/9iuAP/YrgD/2K4A/9iuAP/arwD/06oB/0VA
J/8pKi//Li4u/y4uLv9ra2v/+vr6//////////////////////////////////////////////////39
/f/n5+f/wsLC/4yMjP9SUlL/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/JyMx/2F+
GP+h4wD/mtgA/5rYAP+v4DX//P74////////////////////////////////////////////////////
///////s////5f///////////////////////////////////////////////+LDQv/YrgD/2K4A/9iu
AP/YrgD/2K4A/+C0AP9oWh7/JCcx/y4uLv9GRkb/7u7u/////////////////////////////v7+/8fH
x/+VlZX/iYmJ/3BwcP9TU1P/OTk5/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/Li4u/ygkMf9bdRv/oOEA/5rYAP+g2g7/7fjR////////////////////////////////////
////////////////////////////4P///8z/////////////////////////////////////////////
///euyj/2K4A/9iuAP/YrgD/2K4A/9iuAP/itQD/ln0S/yQnMf8uLi7/ra2t////////////////////
///////////////////i4uL/e3t7/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8oJDH/WXEc/6DhAP+d2Qf/4fOy////////////////////
/////////////////////////////////////////////////8z///+t////////////////////////
////////////////////////3Lcc/9iuAP/YrgD/2K4A/9iuAP/YrgD/3LEA/8agBf82NCz/Pj9C//T0
9P/////////////////////////////////////////////////Ozs7/ZmZm/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/KCQx/1pzHP+m4w//4POx////
//////////////////////////////////////////////////////////////////////+t////hP//
/////////////////////////////////////////////9y3Hf/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/gtAD/Z1ke/2lrcv//////////////////////////////////////////////////////////////
//++vr7/ZGRk/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/ygk
Mf93i0X/7PnL////////////////////////////////////////////////////////////////////
////////////hP///1T////////////////////////////////////////////////euyr/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/4LQA/66OC/+Dg4b/////////////////////////////////////////
///////////////////////////////////Pz8//hISE/0hISP8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u
Lv8uLi7/Li4u/0JCQv+RkJX/9PXy////////////////////////////////////////////////////
/////////////////////////////////1b///8c////////////////////////////////////////
////////48RG/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9mvAP/dsgD/kopq////////////////////
///////////////////////////////////////////////////////////////////09PT/y8vL/6Ki
ov+Dg4P/cXFx/21tbf94eHj/kJCQ/7q6uv/v7+//////////////////////////////////////////
//////////////////////////////////////////////////////8d////AP///9f/////////////
/////////////////////////////+rTdP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/4LQA/72f
Iv/09PT/////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////Y////AP//
/wD///+P///////////////////////////////////////////06Lb/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/esgD/zsKO////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////kP///wD///8A////Ov///////////////////////////////////////////fvx/9y2
Gv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/+G3Cf/578j/////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////zr///8A////AP///wH////a////////////////////////
///////////////////p0nD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/3bgh//r0
3P//////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////9v///8B////AP///wD///8A////dP//
////////////////////////////////////////+fPZ/9mxCP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/duCH/9+7I////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////90////AP//
/wD///8A////AP///wz////t///////////////////////////////////////////oz2n/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9qyDf/x4qT/////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////t////Df///wD///8A////AP///wD///8A////f///////////////////////////////////
////////+/fm/9u1Fv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/+nQ
bP/8+u7/////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////f////wD///8A////AP///wD///8A////AP///xD////q////////
///////////////////////////////////x4qX/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/3ron//Hipf///v3/////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////6v///xD///8A////AP///wD///8A////AP//
/wD///8A////YP///////////////////////////////////////////////+jPaf/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/4cA5//HipP/9+/H/////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////2H///8A////AP//
/wD///8A////AP///wD///8A////AP///wH////D////////////////////////////////////////
///+/fj/4sRE/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/3bgf/+fNY//x4qX/+PHT//367//+/vv////+////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/8P///8B////AP///wD///8A////AP///wD///8A////AP///wD///8A////Iv////D/////////////
//////////////////////////////z57f/gvzX/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9ivA//cthj/37wr//fuyv//////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////D///8i////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///9U////////////////////////////////////////////////+/jo/+C/Nf/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/48NH/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////9V////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///4j/////////////////////////////////////////////
///8+ev/4sND/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/btBP//Pns////////////////////////////////////////////////////
//////////////////////////////////////////////////////+J////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8B////pP//////////////////
//////////////////////////////789v/nzGD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/37wt///+/P//////////////////////////////
//////////////////////////////////////////////////////////////////////+k////Af//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wb///+3/////////////////////////////////////////////////////+7bj//asQr/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/+PGSv//////////////
////////////////////////////////////////////////////////////////////////////////
//////+3////Bv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////Bv///6X/////////////////////////////////////////////
////////9+7K/+HBO//YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/oz2n/////////////////////////////////////////////////////////////////////////
//////////////////////+l////Bv///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8B////jP//////////////////
///////////////////////////////////+/fr/7t2T/924Hv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu
AP/YrgD/2K4A/9iuAP/YrgD/7dqL////////////////////////////////////////////////////
//////////////////////////////////////+M////Af///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A2K4AANiu
AAD///9V////8f/////////////////////////////////////////////////////8+ev/7dmH/966
Jv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A//Plrv//////////////////////////////
//////////////////////////////////////////////////H///9VmtgAAJrYAAD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////ANiuAADYrgAA2K4AAP///yT////E////////////////////////////////////////
///////////////////9/PT/8+av/+bLWv/duB7/2K4A/9iuAP/YrgD/2K4A/9iuAP/37sv/////////
/////////////////////////////////////////////////////////////////8T///8jmtgAAJrY
AACa2AAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wDYrgAA2K4AANiuAADYrgAA////Af///2D////r////////
/////////////////////////////////////////////////////////fvx//btxv/v3pf/6dJw/+TH
T//jxEX/+/jo////////////////////////////////////////////////////////////////6///
/2D///8BmtgAAJrYAACa2AAAmtgAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////EP///3/////t////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////t////f////xD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////Df///3T////V////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////9X///90////Df///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/zP///+N////1///////////////////////////////////////////////////////////////////
///////////////////////X////jf///zP///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8b////VP///33///+l////y////+P////y////////
///////y////4////8v///+l////ff///1T///8b////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////4Af///////wAAD//////8AAAD/////+AAAAB/////wAAAAD////8AAAAAD////gAAAAA
H///4AAAAAAH///AAAAAAAP//4AAAAAAAf//AAAAAAAA//4AAAAAAAB//gAAAAAAAH/8AAAAAAAAP/gA
AAAAAAAf+AAAAAAAAB/wAAAAAAAAD/AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB8AAAAAAAAADwAAAAAAA
AAOAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAIAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABwAAAAAAAAAPAAAAAAAAAA+AA
AAAAAAAH4AAAAAAAAAfwAAAAAAAAD/AAAAAAAAAP+AAAAAAAAB/4AAAAAAAAH/wAAAAAAAA//gAAAAAA
AH/+AAAAAAAAf/8AAAAAAAD//4AAAAAAAf//wAAAAAAD///gAAAAAAf///gAAAAAH////AAAAAA/////
AAAAAP/////AAAAD//////AAAA///////AAAP///////4Af///8=
</value>
</data>
</root>

View file

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.2.102.0")]
[assembly: AssemblyFileVersion("0.2.102.0")]
[assembly: AssemblyVersion("0.2.116.0")]
[assembly: AssemblyFileVersion("0.2.116.0")]

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Discord.Net" version="0.9.6" targetFramework="net461" />
<package id="LiteDB" version="3.1.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net461" />
<package id="Nito.AsyncEx" version="3.0.1" targetFramework="net461" />
<package id="RestSharp" version="105.2.3" targetFramework="net461" />

View file

@ -40,6 +40,18 @@
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="Nito.AsyncEx, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Nito.AsyncEx.Concurrent, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Concurrent.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Nito.AsyncEx.Enlightenment, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Enlightenment.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Octokit, Version=0.24.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Octokit.0.24.1-alpha0001\lib\net45\Octokit.dll</HintPath>
<Private>True</Private>

View file

@ -6,24 +6,23 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using Discord_Media_Loader.Helper;
using DML.Application;
using Nito.AsyncEx;
namespace Discord_Media_Loader
{
static class Program
{
[STAThread]
static void Main()
static void Main(string[] paramStrings)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ProfileOptimization.SetProfileRoot(Application.UserAppDataPath);
ProfileOptimization.StartProfile("profile.opt");
var splashScreen = new FrmSplash();
splashScreen.ShowDialog();
Core.Run();
AsyncContext.Run(() => Core.Run(paramStrings));
Console.WriteLine("Ende");
}
}
}

View file

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.99.28.0")]
[assembly: AssemblyFileVersion("0.99.28.0")]
[assembly: AssemblyVersion("0.99.44.0")]
[assembly: AssemblyFileVersion("0.99.44.0")]

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Nito.AsyncEx" version="3.0.1" targetFramework="net462" />
<package id="Octokit" version="0.24.1-alpha0001" targetFramework="net461" />
</packages>