Compare commits

...

210 commits

Author SHA1 Message Date
Daniel fff131ecb1
Create codeql-analysis.yml 2021-12-18 10:39:19 +01:00
Serraniel a7d129bd5b
Prepared another release 2021-12-17 23:04:12 +01:00
Serraniel 75ce11b854
Updated version number 2021-12-17 23:01:59 +01:00
Daniel b9e4670b61
Merge pull request #108 from Serraniel/bugfix/#107-guild-name-broken
#107 fixed a typo to replace guild name
2021-12-17 22:59:53 +01:00
Serraniel beb2fdc496
#107 fixed a typo to replace guild name 2021-12-17 22:59:21 +01:00
Serraniel e2d8a369bf
Prepared relesae 2021-12-16 15:02:21 +01:00
Serraniel 1c362361ac
Set version number 2021-12-16 14:58:53 +01:00
Daniel 691057d5f7
Merge pull request #106 from Serraniel/bugfix/#105-after-autoupdate-to-last-version-is-cant-download-anything-and-keep-scanning-for-no-reason
Bugfix/#105 after autoupdate to last version is cant download anything and keep scanning for no reason
2021-12-16 14:56:51 +01:00
Serraniel ed8039dfbc
#105 Extended filename legalisation to usernames 2021-12-16 14:53:37 +01:00
Serraniel dccbd4ab0b
#105 Only fetch some data if it is required to generate filename 2021-12-16 14:47:47 +01:00
Serraniel 767b2b35d1
#105 Added check if user is assigned during server nickname fetching 2021-12-16 14:41:05 +01:00
Serraniel cced819e77
Updated install script 2021-12-06 18:59:32 +01:00
Serraniel cba7d43b12
Updated version number 2021-12-06 18:57:44 +01:00
Serraniel 5c075ae0b6
Fixed dependencies for correct start 2021-12-06 18:55:32 +01:00
Serraniel 2f14784ec7
Updated install script 2021-12-05 22:41:04 +01:00
Serraniel 8accbe7294
Updated version numbers 2021-12-05 22:34:37 +01:00
Serraniel b99342966b
Fixed packages 2021-12-05 22:34:24 +01:00
Daniel b76b4da982
Merge pull request #98 from Serraniel/feature/update-libs
Feature/update libs
2021-12-05 22:22:46 +01:00
Serraniel 08921bd22a
Merge branch 'master' into feature/update-libs
# Conflicts:
#	Discord Media Loader.Application/Classes/JobScheduler.cs
2021-12-05 22:22:22 +01:00
Serraniel 961189b02e
Removed some unused libs 2021-12-05 22:07:57 +01:00
Serraniel f2992f37e9
Removed unused uses 2021-12-05 20:39:46 +01:00
Serraniel 7b59c0b01f
Updated discord libs to current release 2021-12-05 19:44:44 +01:00
Daniel ac412f5b40
Merge pull request #97 from Serraniel/feature/#96-pull-nickname-from-discord-api
Feature/#96 pull nickname from discord api
2021-12-05 19:16:18 +01:00
Serraniel cf06a34183
#96 Added nickname to explanation resource 2021-12-05 19:14:46 +01:00
Serraniel 55baa35cba
#96 Added nickname to filename variables 2021-12-05 19:10:40 +01:00
Daniel 4d2d111c74
Update README.md
#94 Fixed typo in winget install command
2021-11-18 19:53:42 +01:00
dependabot[bot] 2ff2f74862
Merge pull request #79 from Serraniel/dependabot/nuget/Octokit-0.50.0 2021-02-22 04:21:05 +00:00
dependabot[bot] 982b453e09
Bump Octokit from 0.49.0 to 0.50.0
Bumps [Octokit](https://github.com/octokit/octokit.net) from 0.49.0 to 0.50.0.
- [Release notes](https://github.com/octokit/octokit.net/releases)
- [Changelog](https://github.com/octokit/octokit.net/blob/main/ReleaseNotes.md)
- [Commits](https://github.com/octokit/octokit.net/compare/v0.49.0...v0.50.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-22 04:20:02 +00:00
dependabot[bot] ad3dc5aad2
Merge pull request #77 from Serraniel/dependabot/nuget/Octokit-0.49.0 2021-02-15 04:21:23 +00:00
dependabot[bot] f5a0b96674
Bump Octokit from 0.48.0 to 0.49.0
Bumps [Octokit](https://github.com/octokit/octokit.net) from 0.48.0 to 0.49.0.
- [Release notes](https://github.com/octokit/octokit.net/releases)
- [Changelog](https://github.com/octokit/octokit.net/blob/main/ReleaseNotes.md)
- [Commits](https://github.com/octokit/octokit.net/compare/v0.48.0...v0.49.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-15 04:20:19 +00:00
dependabot[bot] 3aa8cdc604
Merge pull request #76 from Serraniel/dependabot/nuget/Microsoft.NETCore.Platforms-5.0.1 2021-02-10 04:05:12 +00:00
dependabot[bot] ccb0d175f8
Bump Microsoft.NETCore.Platforms from 5.0.0 to 5.0.1
Bumps [Microsoft.NETCore.Platforms](https://github.com/dotnet/runtime) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v5.0.0...v5.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-10 04:04:03 +00:00
dependabot[bot] 82ade029eb
Merge pull request #72 from Serraniel/dependabot/nuget/Microsoft.Extensions.DependencyInjection-5.0.1 2020-12-09 04:22:02 +00:00
dependabot[bot] 8a04ed1642
Bump Microsoft.Extensions.DependencyInjection from 5.0.0 to 5.0.1
Bumps [Microsoft.Extensions.DependencyInjection](https://github.com/dotnet/runtime) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-09 04:20:59 +00:00
dependabot[bot] c16b7693c7
Merge pull request #66 from Serraniel/dependabot/nuget/Microsoft.NETCore.Platforms-5.0.0 2020-11-10 21:21:40 +00:00
dependabot[bot] b3c4ca3858
Bump Microsoft.NETCore.Platforms from 3.1.3 to 5.0.0
Bumps [Microsoft.NETCore.Platforms](https://github.com/dotnet/runtime) from 3.1.3 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 21:20:14 +00:00
dependabot[bot] 5dc351b83f
Merge pull request #59 from Serraniel/dependabot/nuget/Microsoft.Extensions.DependencyInjection-5.0.0 2020-11-10 21:19:35 +00:00
dependabot[bot] 8d1d85be88
Bump Microsoft.Extensions.DependencyInjection from 3.1.9 to 5.0.0
Bumps [Microsoft.Extensions.DependencyInjection](https://github.com/dotnet/runtime) from 3.1.9 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 21:18:44 +00:00
dependabot[bot] 43bd38fd7c
Merge pull request #65 from Serraniel/dependabot/nuget/System.Security.Principal.Windows-5.0.0 2020-11-10 21:18:00 +00:00
dependabot[bot] ae031edb68
Merge pull request #62 from Serraniel/dependabot/nuget/Microsoft.Win32.Registry-5.0.0 2020-11-10 21:17:32 +00:00
dependabot[bot] e8bcf58887
Merge pull request #64 from Serraniel/dependabot/nuget/System.Security.AccessControl-5.0.0 2020-11-10 21:17:00 +00:00
dependabot[bot] a457ca051a
Merge pull request #63 from Serraniel/dependabot/nuget/System.Runtime.CompilerServices.Unsafe-5.0.0 2020-11-10 21:16:51 +00:00
dependabot[bot] 280013fc22
Merge pull request #61 from Serraniel/dependabot/nuget/System.Collections.Immutable-5.0.0 2020-11-10 21:16:31 +00:00
dependabot[bot] 0cb9646cde
Bump Microsoft.Win32.Registry from 4.7.0 to 5.0.0
Bumps [Microsoft.Win32.Registry](https://github.com/dotnet/runtime) from 4.7.0 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 21:16:23 +00:00
dependabot[bot] 478cbdea90
Merge pull request #60 from Serraniel/dependabot/nuget/System.Diagnostics.DiagnosticSource-5.0.0 2020-11-10 21:16:13 +00:00
Daniel 861f26c8d6
Merge pull request #58 from Serraniel/dependabot/nuget/Microsoft.Bcl.AsyncInterfaces-5.0.0
Bump Microsoft.Bcl.AsyncInterfaces from 1.1.1 to 5.0.0
2020-11-10 22:15:42 +01:00
Daniel 581e5160b2
Merge pull request #57 from Serraniel/dependabot/nuget/Microsoft.Extensions.DependencyInjection.Abstractions-5.0.0
Bump Microsoft.Extensions.DependencyInjection.Abstractions from 3.1.9 to 5.0.0
2020-11-10 22:15:16 +01:00
dependabot[bot] 4dd328b95f
Bump System.Security.Principal.Windows from 4.7.0 to 5.0.0
Bumps [System.Security.Principal.Windows](https://github.com/dotnet/runtime) from 4.7.0 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 04:20:39 +00:00
dependabot[bot] 63d75d4cc6
Bump System.Security.AccessControl from 4.7.0 to 5.0.0
Bumps [System.Security.AccessControl](https://github.com/dotnet/runtime) from 4.7.0 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 04:20:38 +00:00
dependabot[bot] 6bf7fed50f
Bump System.Runtime.CompilerServices.Unsafe from 4.7.1 to 5.0.0
Bumps [System.Runtime.CompilerServices.Unsafe](https://github.com/dotnet/runtime) from 4.7.1 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 04:20:38 +00:00
dependabot[bot] 0fab065d67
Bump System.Collections.Immutable from 1.7.1 to 5.0.0
Bumps [System.Collections.Immutable](https://github.com/dotnet/runtime) from 1.7.1 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 04:20:34 +00:00
dependabot[bot] 2530aafae9
Bump System.Diagnostics.DiagnosticSource from 4.7.1 to 5.0.0
Bumps [System.Diagnostics.DiagnosticSource](https://github.com/dotnet/runtime) from 4.7.1 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 04:20:20 +00:00
dependabot[bot] b00c2fee92
Bump Microsoft.Bcl.AsyncInterfaces from 1.1.1 to 5.0.0
Bumps [Microsoft.Bcl.AsyncInterfaces](https://github.com/dotnet/runtime) from 1.1.1 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 04:20:11 +00:00
dependabot[bot] 656d2fc2e5
Bump Microsoft.Extensions.DependencyInjection.Abstractions
Bumps [Microsoft.Extensions.DependencyInjection.Abstractions](https://github.com/dotnet/runtime) from 3.1.9 to 5.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-10 04:20:10 +00:00
dependabot[bot] 70903be16f
Merge pull request #53 from Serraniel/dependabot/nuget/Microsoft.Extensions.DependencyInjection-3.1.9 2020-10-23 04:26:11 +00:00
dependabot[bot] 7cb58b0a7d
Bump Microsoft.Extensions.DependencyInjection from 3.1.6 to 3.1.9
Bumps [Microsoft.Extensions.DependencyInjection](https://github.com/aspnet/Extensions) from 3.1.6 to 3.1.9.
- [Release notes](https://github.com/aspnet/Extensions/releases)
- [Commits](https://github.com/aspnet/Extensions/compare/v3.1.6...v3.1.9)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-23 04:24:49 +00:00
dependabot[bot] 69c3c18436
Merge pull request #55 from Serraniel/dependabot/nuget/RestSharp-106.11.7 2020-10-23 04:23:57 +00:00
dependabot[bot] 1f9d561de2
Merge pull request #56 from Serraniel/dependabot/nuget/Nito.AsyncEx.Interop.WaitHandles-5.1.0 2020-10-23 04:23:47 +00:00
dependabot[bot] d2729d2df0
Merge pull request #54 from Serraniel/dependabot/nuget/Microsoft.Extensions.DependencyInjection.Abstractions-3.1.9 2020-10-23 04:23:31 +00:00
dependabot[bot] fa6dffdcf2
Bump Nito.AsyncEx.Interop.WaitHandles from 5.0.0 to 5.1.0
Bumps [Nito.AsyncEx.Interop.WaitHandles](https://github.com/StephenCleary/AsyncEx) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/StephenCleary/AsyncEx/releases)
- [Commits](https://github.com/StephenCleary/AsyncEx/compare/v5.0.0...v5.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-23 04:22:37 +00:00
dependabot[bot] 43ea46e286
Bump RestSharp from 106.11.4 to 106.11.7
Bumps [RestSharp](https://github.com/restsharp/RestSharp) from 106.11.4 to 106.11.7.
- [Release notes](https://github.com/restsharp/RestSharp/releases)
- [Changelog](https://github.com/restsharp/RestSharp/blob/dev/releasenotes.md)
- [Commits](https://github.com/restsharp/RestSharp/compare/106.11.4...106.11.7)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-23 04:22:31 +00:00
dependabot[bot] 6adf7c243c
Bump Microsoft.Extensions.DependencyInjection.Abstractions
Bumps [Microsoft.Extensions.DependencyInjection.Abstractions](https://github.com/aspnet/Extensions) from 3.1.6 to 3.1.9.
- [Release notes](https://github.com/aspnet/Extensions/releases)
- [Commits](https://github.com/aspnet/Extensions/compare/v3.1.6...v3.1.9)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-23 04:22:28 +00:00
dependabot[bot] 299dae84a5
Merge pull request #51 from Serraniel/dependabot/nuget/LiteDB-5.0.9 2020-10-22 18:15:44 +00:00
dependabot[bot] 8112ecaab9
Merge pull request #48 from Serraniel/dependabot/nuget/Microsoft.NETCore.Platforms-3.1.3 2020-10-22 18:15:33 +00:00
Daniel 52b6d74e3e
Merge pull request #47 from Serraniel/dependabot/nuget/Nito.Disposables-2.2.0
Bump Nito.Disposables from 2.1.0 to 2.2.0
2020-10-22 20:14:46 +02:00
dependabot[bot] ffdceabbb6
Merge pull request #50 from Serraniel/dependabot/nuget/Nito.AsyncEx.Context-5.1.0 2020-10-22 18:09:41 +00:00
dependabot[bot] 0ee62a19bf
Bump Nito.AsyncEx.Context from 5.0.0 to 5.1.0
Bumps [Nito.AsyncEx.Context](https://github.com/StephenCleary/AsyncEx) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/StephenCleary/AsyncEx/releases)
- [Commits](https://github.com/StephenCleary/AsyncEx/compare/v5.0.0...v5.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 18:08:21 +00:00
dependabot[bot] 543496d1b6
Merge pull request #52 from Serraniel/dependabot/nuget/Nito.AsyncEx-5.1.0 2020-10-22 18:07:27 +00:00
dependabot[bot] ca5f0b66fa
Bump Nito.AsyncEx from 5.0.0 to 5.1.0
Bumps [Nito.AsyncEx](https://github.com/StephenCleary/AsyncEx) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/StephenCleary/AsyncEx/releases)
- [Commits](https://github.com/StephenCleary/AsyncEx/compare/v5.0.0...v5.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 18:06:02 +00:00
Daniel 3b5d0314f1
Merge pull request #46 from Serraniel/dependabot/nuget/Nito.AsyncEx.Coordination-5.1.0
Bump Nito.AsyncEx.Coordination from 5.0.0 to 5.1.0
2020-10-22 20:05:30 +02:00
dependabot[bot] 0cc357c954
Merge pull request #49 from Serraniel/dependabot/nuget/Nito.AsyncEx.Oop-5.1.0 2020-10-22 18:05:22 +00:00
dependabot[bot] c3565d5230
Bump Nito.Disposables from 2.1.0 to 2.2.0
Bumps [Nito.Disposables](https://github.com/StephenCleary/Disposables) from 2.1.0 to 2.2.0.
- [Release notes](https://github.com/StephenCleary/Disposables/releases)
- [Changelog](https://github.com/StephenCleary/Disposables/blob/master/CHANGELOG.md)
- [Commits](https://github.com/StephenCleary/Disposables/compare/v2.1.0...v2.2.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 18:04:02 +00:00
dependabot[bot] 243956d7fd
Bump Nito.AsyncEx.Oop from 5.0.0 to 5.1.0
Bumps [Nito.AsyncEx.Oop](https://github.com/StephenCleary/AsyncEx) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/StephenCleary/AsyncEx/releases)
- [Commits](https://github.com/StephenCleary/AsyncEx/compare/v5.0.0...v5.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 18:04:02 +00:00
Daniel 08a9a77d31
Merge pull request #45 from Serraniel/dependabot/nuget/Nito.Collections.Deque-1.1.0
Bump Nito.Collections.Deque from 1.0.4 to 1.1.0
2020-10-22 20:03:11 +02:00
dependabot[bot] 71e2eebb29
Bump Nito.AsyncEx.Coordination from 5.0.0 to 5.1.0
Bumps [Nito.AsyncEx.Coordination](https://github.com/StephenCleary/AsyncEx) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/StephenCleary/AsyncEx/releases)
- [Commits](https://github.com/StephenCleary/AsyncEx/compare/v5.0.0...v5.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 17:59:32 +00:00
dependabot[bot] 22eade27f6
Bump Nito.Collections.Deque from 1.0.4 to 1.1.0
Bumps [Nito.Collections.Deque](https://github.com/StephenCleary/Deque) from 1.0.4 to 1.1.0.
- [Release notes](https://github.com/StephenCleary/Deque/releases)
- [Commits](https://github.com/StephenCleary/Deque/compare/v1.0.4...v1.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 17:59:30 +00:00
Daniel f3260c71f1
Merge pull request #43 from Serraniel/dependabot/nuget/Nito.AsyncEx.Tasks-5.1.0
Bump Nito.AsyncEx.Tasks from 5.0.0 to 5.1.0
2020-10-22 19:58:48 +02:00
dependabot[bot] 44edf0ffd1
Bump Nito.AsyncEx.Tasks from 5.0.0 to 5.1.0
Bumps [Nito.AsyncEx.Tasks](https://github.com/StephenCleary/AsyncEx) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/StephenCleary/AsyncEx/releases)
- [Commits](https://github.com/StephenCleary/AsyncEx/compare/v5.0.0...v5.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 17:51:51 +00:00
dependabot[bot] 40c6f97d82
Merge pull request #44 from Serraniel/dependabot/nuget/Nito.Cancellation-1.1.0 2020-10-22 17:49:31 +00:00
Daniel 7196f862e7
Added dependabot auto merge workflow 2020-10-22 19:48:31 +02:00
dependabot[bot] 8fbea8e22d
Bump LiteDB from 4.1.4 to 5.0.9
Bumps [LiteDB](https://github.com/mbdavid/LiteDB) from 4.1.4 to 5.0.9.
- [Release notes](https://github.com/mbdavid/LiteDB/releases)
- [Commits](https://github.com/mbdavid/LiteDB/compare/v4.1.4...v5.0.9)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 17:45:19 +00:00
dependabot[bot] 9fd6fbd0af
Bump Microsoft.NETCore.Platforms from 3.1.1 to 3.1.3
Bumps [Microsoft.NETCore.Platforms](https://github.com/dotnet/corefx) from 3.1.1 to 3.1.3.
- [Release notes](https://github.com/dotnet/corefx/releases)
- [Commits](https://github.com/dotnet/corefx/compare/v3.1.1...v3.1.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 17:45:16 +00:00
dependabot[bot] 7c6a165a2c
Bump Nito.Cancellation from 1.0.5 to 1.1.0
Bumps [Nito.Cancellation](https://github.com/StephenCleary/Cancellation) from 1.0.5 to 1.1.0.
- [Release notes](https://github.com/StephenCleary/Cancellation/releases)
- [Commits](https://github.com/StephenCleary/Cancellation/compare/v1.0.5...v1.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-22 17:45:09 +00:00
Daniel dfb957faaa
Merge pull request #42 from Serraniel/dependabot/nuget/Newtonsoft.Json-12.0.3
Bump Newtonsoft.Json from 12.0.2 to 12.0.3
2020-10-22 19:44:23 +02:00
Daniel 626e0ac88d
Merge pull request #41 from Serraniel/dependabot/nuget/System.Interactive.Async-4.1.1
Bump System.Interactive.Async from 4.0.0 to 4.1.1
2020-10-22 19:44:06 +02:00
dependabot-preview[bot] 80b031d786
Bump Newtonsoft.Json from 12.0.2 to 12.0.3
Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 12.0.2 to 12.0.3.
- [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases)
- [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.2...12.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-22 17:43:46 +00:00
Daniel effb7624c2
Merge pull request #40 from Serraniel/dependabot/add-v2-config-file
Create Dependabot config file
2020-10-22 19:43:44 +02:00
dependabot-preview[bot] 2d9f582295
Bump System.Interactive.Async from 4.0.0 to 4.1.1
Bumps [System.Interactive.Async](https://github.com/dotnet/reactive) from 4.0.0 to 4.1.1.
- [Release notes](https://github.com/dotnet/reactive/releases)
- [Commits](https://github.com/dotnet/reactive/compare/ixnet-v4.0.0...ixnet-v4.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-22 17:43:29 +00:00
dependabot-preview[bot] 2319aa3f38
Create Dependabot config file 2020-10-22 17:42:37 +00:00
Daniel 236b5f9d62
Merge pull request #38 from Serraniel/feature/#34-discord-api-migration
#34 Changed to new Discord.Net branch which will use the new API urls.
2020-09-20 15:49:08 +02:00
Serraniel 5aecf9b5ac
#34 Changed to new Discord.Net branch which will use the new API urls. 2020-09-20 15:49:07 +02:00
Serraniel a0bf6e8bea
Fixed hash in winget file after generating new installer 2020-07-27 13:42:34 +02:00
Serraniel f178818308
Fixed version in install script 2020-07-27 13:40:02 +02:00
Serraniel 6e68f68e9c
Prepared new winget yaml file 2020-07-27 13:36:22 +02:00
Serraniel d053faf926
Updated install scripts 2020-07-27 13:12:30 +02:00
Serraniel 123054baf1
Prepared new version 2020-07-27 13:05:35 +02:00
Daniel cc88113cd3
Merge pull request #35 from Serraniel/feature/#34-discord-api-migration
Feature/#34 discord api migration
2020-07-27 13:02:35 +02:00
Serraniel 59b7927fc6
#34 Ignore pre-releases 2020-07-27 12:58:56 +02:00
Serraniel a32cf6c6ad
#34 Some project settings 2020-07-27 12:58:39 +02:00
Serraniel 4fdae5b5bb
Revert "#34 Dev DB path"
This reverts commit f6135572fe.
2020-07-27 12:55:59 +02:00
Serraniel c9f998de10
#34 set correct .Net standard 2020-07-27 12:55:27 +02:00
Serraniel 88eb90da18
#34 Updated multiple other packages 2020-07-27 12:53:37 +02:00
Serraniel 237ab35e70
#34 Enabled user login again 2020-07-27 12:53:05 +02:00
Serraniel 4d9f40ac04
#34 Updated submodule to enable user tokens again 2020-07-27 12:02:41 +02:00
Serraniel a464b2cd11
#34 Switched from Discord.Net nuget package to submodule 2020-07-27 11:58:27 +02:00
Serraniel b002031cc3
#34 added Discord.Net Sumodule to fix API issues 2020-07-27 11:38:46 +02:00
Serraniel aab8d15a8c
#34 Switch to C#8 and syntax fixes for AsyncEnumerable 2020-07-27 11:31:51 +02:00
Serraniel 80cab1ea44
#34 Temporary disabled login code 2020-07-27 11:26:01 +02:00
Serraniel 123a2e6965
#64 Updated Discord.Net nuget packages 2020-07-27 11:23:27 +02:00
Serraniel f6135572fe
#34 Dev DB path
REVERT THIS LATER!!!
2020-07-27 10:41:45 +02:00
Daniel be9567e608
Update README.md
Added winget setup command.
2020-07-21 18:48:20 +02:00
Serraniel 24dec3ebaa
Fixed winget manifest 2020-07-21 18:41:57 +02:00
Serraniel d66f3cf2fe
Moved winget config 2020-07-17 22:16:12 +02:00
Serraniel b5fba8af27
Better build tools 2020-07-17 22:15:49 +02:00
Serraniel 5464984bcb
Added winget configuration file 2020-07-17 18:44:59 +02:00
Serraniel 861a7c51c3
prepared new release 2019-12-12 19:16:31 +01:00
Serraniel 881093ea4a
Merge branch 'feature/#32-userid-placeholder-for-filenames' 2019-12-12 19:14:22 +01:00
Serraniel 238900fea3
#32 added information string for filename placeholders and implemented info button 2019-12-12 19:13:52 +01:00
Serraniel ee161a7f1a
#32 added info icon and info button for filename placeholders (no implementation yet) 2019-12-12 19:06:58 +01:00
Serraniel a65e0adb6c
#32 added placeholder for username and userid in target filename 2019-12-12 18:53:23 +01:00
Daniel 945a92b995
Update README.md
Added build status bade
2019-02-01 23:25:25 +01:00
Serraniel fec2339e21
Merge branch 'support/1.2' 2019-01-30 21:03:17 +01:00
Serraniel 6b6991f309
Build preperation 2019-01-30 21:01:16 +01:00
Daniel caa1190cb2
Merge pull request #26 from Serraniel/bugfix/#20-application-cannot-be-closed-during-setup
#20 Only continue after login dialog if "ok" is the dialog result.

This will close #20 .
2019-01-30 20:58:58 +01:00
Daniel 7c6049a107
Merge pull request #25 from Serraniel/bugfix/#10-no-reprompt-on-wrong-login-data
Bugfix/#10 no reprompt on wrong login data

Fixes a bug added during fixing of #10 .
2019-01-30 20:55:33 +01:00
Serraniel d90457b6e3
#20 Only continue after login dialog if "ok" is the dialog result. 2019-01-30 20:54:07 +01:00
Serraniel 560c3711fa
#10 Some optimization 2019-01-30 20:50:53 +01:00
Serraniel ff52b5eb8a
#10 Fixed testing code 2019-01-30 20:50:22 +01:00
Daniel b05e7e3965
Merge pull request #23 from Serraniel/bugfix/#10-no-reprompt-on-wrong-login-data
Bugfix/#10 no reprompt on wrong login data
2019-01-30 20:48:07 +01:00
Serraniel 224273d97b
#10 Removed dead code 2019-01-30 20:47:13 +01:00
Serraniel c9a2fc1140
#10 Fixed handling of outdated / wrong logintokens 2019-01-30 20:35:29 +01:00
Daniel 03172ab363
Update README.md
Removed discontinued message
Added hint, that the selfbot is against discord tos and use is at own risk
2018-08-29 23:28:47 +02:00
Serraniel d773f7036d
Build 2018-08-29 23:21:05 +02:00
Serraniel 63b5197806
Merge branch 'feature/copyTokenToClipboard'
* feature/copyTokenToClipboard:
  Added option to copy login token to clipboard
2018-08-29 23:19:40 +02:00
Serraniel a3942c782b
Added option to copy login token to clipboard 2018-08-29 23:19:07 +02:00
Serraniel f311ed9f49
Merge branch 'bugfix/loginToken'
* bugfix/loginToken:
  Fixed the instructions how to gather the login token
  Added startup confirmation to inform the user about selfbots violating discord tos
2018-08-29 23:18:20 +02:00
Serraniel 4b6cc8cd93
Fixed the instructions how to gather the login token 2018-08-29 22:59:12 +02:00
Serraniel a85aa1f96c
Added startup confirmation to inform the user about selfbots violating discord tos 2018-08-29 22:55:01 +02:00
Serraniel 01c5a0d30a
Fixed readme 2018-08-14 21:32:31 +02:00
Serraniel f28091da2d
Added notice to readme that the project currently is on hold due to discord changes 2018-08-14 21:29:48 +02:00
Serraniel 49b8d4eaa3 Merge branch 'support/1.1' 2018-06-15 19:05:40 +02:00
Serraniel 145a5eb0ca Build 2018-06-15 19:04:32 +02:00
Serraniel 033cb203b0 Revert "Merge branch 'bugfix/UI-improvments' into support/1.1"
This reverts commit 33474c2dab, reversing
changes made to 6b2fc74a9e.
2018-06-15 18:59:34 +02:00
Serraniel 33474c2dab Merge branch 'bugfix/UI-improvments' into support/1.1
* bugfix/UI-improvments:
  Changed combobox style of guild and channel selection to suggest elements from its data lists
2018-06-15 18:52:59 +02:00
Serraniel 6b2fc74a9e Merge branch 'bugfix/18-multiple-channels-same-name' into support/1.1
* bugfix/18-multiple-channels-same-name:
  Switched joblist to IdentifiedString objects
  Added implementation for guild and channel selection with identified strings
  Added class for identified strings
2018-06-15 18:52:44 +02:00
Serraniel 8c7253dfcc Changed combobox style of guild and channel selection to suggest elements from its data lists 2018-06-15 18:51:16 +02:00
Serraniel 5c93684164 Switched joblist to IdentifiedString objects 2018-06-15 18:46:44 +02:00
Serraniel 5e940c09bd Added implementation for guild and channel selection with identified strings 2018-06-15 18:33:00 +02:00
Serraniel 801a0da615 Added class for identified strings 2018-06-15 18:32:18 +02:00
Serraniel 786c5eea87 Merge branch 'support/1.1'
* support/1.1:
  Build
  Fixed an error which issued an exception on startup if a guild is temporary not available
  Fixed nuget referencing to SweetLib and maintained code so it will compile with current SweetLib Version
2018-06-12 18:15:11 +02:00
Serraniel 00fa678271 Build 2018-05-24 20:16:59 +02:00
Serraniel e70bc31c29 Merge branch 'bugfix/exception_during_startup' into support/1.1
* bugfix/exception_during_startup:
  Fixed an error which issued an exception on startup if a guild is temporary not available
2018-05-24 20:15:59 +02:00
Serraniel 2a6f1a49fc Fixed an error which issued an exception on startup if a guild is temporary not available 2018-05-24 20:15:39 +02:00
Serraniel 57db3edc8a Fixed nuget referencing to SweetLib and maintained code so it will compile with current SweetLib Version 2018-05-20 16:22:04 +02:00
Serraniel 389b11d762 Merge branch 'master' into support/1.1
* master:
  Removed unneccasry parts of code
2018-03-29 13:55:48 +02:00
Serraniel cbad923333 Removed unneccasry parts of code 2018-03-26 00:01:03 +02:00
Serraniel b3bfb21139 Merge branch 'support/1.0'
* support/1.0:
  Build
  Added an option to set online state. Refresh timer added as it was required to display correct information in UI
2018-03-25 23:47:20 +02:00
Serraniel 7698c55da1 Build 2018-03-25 23:46:46 +02:00
Serraniel 325d5244fc Merge branch 'feature/online-state' into support/1.0
* feature/online-state:
  Added an option to set online state. Refresh timer added as it was required to display correct information in UI
2018-03-25 23:44:54 +02:00
Serraniel 40cb1ab14d Added an option to set online state. Refresh timer added as it was required to display correct information in UI 2018-03-25 23:44:33 +02:00
Serraniel 21a2a5ae9f Build 2018-01-22 20:17:54 +01:00
Serraniel bea7715599 Merge branch 'develop'
* develop:
  Fixed an error which caused null pointer exceptions in discord framework and interrupted the scanning queue permanently Changed message count to acutally count scanned messages even if they already have scanned before
  Contine on exception during scanning
2018-01-22 20:14:48 +01:00
Serraniel 0f1b6f8f9b Merge branch 'bugfix/DownloadQueue_stops_working' into develop
* bugfix/DownloadQueue_stops_working:
  Fixed an error which caused null pointer exceptions in discord framework and interrupted the scanning queue permanently Changed message count to acutally count scanned messages even if they already have scanned before
  Contine on exception during scanning
  New Build
2018-01-22 20:14:16 +01:00
Serraniel ef21b6ed05 Fixed an error which caused null pointer exceptions in discord framework and interrupted the scanning queue permanently
Changed message count to acutally count scanned messages even if they already have scanned before
2018-01-22 20:08:08 +01:00
Serraniel b5945036fd Contine on exception during scanning 2018-01-22 20:07:10 +01:00
Serraniel ee72907744 New Build 2017-12-16 16:06:43 +01:00
Serraniel 90877b824c Merge branch 'develop'
* develop:
  Cleanup of uses directives
  Fix for automatic update. Versionhelper has loaded the application dll :/
2017-12-16 16:05:51 +01:00
Serraniel f7b7ad2d7a Merge branch 'bugfix/Updater' into develop
* bugfix/Updater: (30 commits)
  Cleanup of uses directives
  Fix for automatic update. Versionhelper has loaded the application dll :/
  Build
  Added Sentry integration
  Fixed infiite download loop
  Build 0.99.150
  Finally fixed the attachment counter which caused crashs in older versions, too
  Fixed the fix for invalid path names :P
  Fixed invalid filenames
  It is working
  Tried fixing login bugs
  Helload of shit i have done and reversed 👀
  First changes for new api
  Semi upgraded to new Discord.Net
  Fixes
  Delete invalid jobs (they stop the queue :feelsBadMan:)
  Name adjustements
  Fixed some exception
  Some finalisation
  Did good stuff
  ...
2017-12-16 16:05:41 +01:00
Serraniel ef913f9cfc Cleanup of uses directives 2017-12-16 16:05:09 +01:00
Serraniel 3bbe5e72c5 Fix for automatic update. Versionhelper has loaded the application dll :/ 2017-12-16 16:04:01 +01:00
Serraniel 219f4601cd Build 2017-12-10 12:08:23 +01:00
Serraniel 8f8f3a4b1e Merge branch 'milestone/first_release'
* milestone/first_release: (26 commits)
  Added Sentry integration
  Fixed infiite download loop
  Build 0.99.150
  Finally fixed the attachment counter which caused crashs in older versions, too
  Fixed the fix for invalid path names :P
  Fixed invalid filenames
  It is working
  Tried fixing login bugs
  Helload of shit i have done and reversed 👀
  First changes for new api
  Semi upgraded to new Discord.Net
  Fixes
  Delete invalid jobs (they stop the queue :feelsBadMan:)
  Name adjustements
  Fixed some exception
  Some finalisation
  Did good stuff
  Fixed some project things Fixed error which kept downloading files over and over
  Some UI stuff and adjustments....Seriously...I am lost to the changes I did
  Somehow implementation of downloading all the shit out of it
  ...
2017-12-10 12:07:20 +01:00
Serraniel 0ddefc4023 Merge branch 'feature/sentry' into milestone/first_release
* feature/sentry:
  Added Sentry integration
2017-12-10 12:06:46 +01:00
Serraniel a5d6817429 Added Sentry integration 2017-12-10 12:05:51 +01:00
Serraniel 2d9d8570b1 Fixed infiite download loop 2017-10-12 21:28:02 +02:00
Serraniel f617a36a6f Build 0.99.150 2017-10-12 21:07:50 +02:00
Serraniel 2bd5b95e58 Merge branch 'feature/New_Discord_API' into milestone/first_release
* feature/New_Discord_API:
  Finally fixed the attachment counter which caused crashs in older versions, too
  Fixed the fix for invalid path names :P
  Fixed invalid filenames
  It is working
  Tried fixing login bugs
  Helload of shit i have done and reversed 👀
  First changes for new api
  Semi upgraded to new Discord.Net
2017-10-12 21:05:40 +02:00
Serraniel b1dbb28ea5 Finally fixed the attachment counter which caused crashs in older versions, too 2017-10-12 21:05:06 +02:00
Serraniel 1676c9d961 Fixed the fix for invalid path names :P 2017-10-12 21:04:48 +02:00
Serraniel 5ea5abfdfd Fixed invalid filenames 2017-10-12 20:15:46 +02:00
Serraniel 5c45aad049 It is working 2017-10-04 15:01:54 +02:00
Serraniel ecec55ec07 Tried fixing login bugs 2017-10-04 13:20:45 +02:00
Serraniel df0980c86e Helload of shit i have done and reversed 👀 2017-10-04 13:14:44 +02:00
Serraniel eca0e337c5 First changes for new api 2017-10-04 11:27:01 +02:00
Serraniel 221b2bdff9 Semi upgraded to new Discord.Net 2017-09-25 19:50:59 +02:00
Serraniel 2a5ff86ba9 Fixes 2017-05-20 10:23:31 +02:00
Serraniel c52dc3ddbd Delete invalid jobs (they stop the queue :feelsBadMan:) 2017-05-04 15:24:04 +02:00
Serraniel 6844627723 Name adjustements 2017-05-02 13:33:17 +02:00
Serraniel 548d10cda8 Fixed some exception 2017-05-02 13:32:37 +02:00
Serraniel cc1f9d4619 Some finalisation 2017-04-30 11:29:49 +02:00
Serraniel 87d65cbf9e Did good stuff 2017-04-30 11:06:10 +02:00
Serraniel 19673cb07b Fixed some project things
Fixed error which kept downloading files over and over
2017-04-29 10:43:43 +02:00
Serraniel 8484a5e04c Some UI stuff and adjustments....Seriously...I am lost to the changes I did 2017-04-17 23:02:57 +02:00
Serraniel fe4a4769f8 Somehow implementation of downloading all the shit out of it 2017-04-17 21:56:53 +02:00
Serraniel 53f49b20c5 Did some of the MainForm stuff
Referenced SweetLib directly (temporary) instead vie Nuget for now.
2017-04-17 14:39:29 +02:00
Serraniel 9384c9c2d0 Some basic stuff 2017-04-16 22:46:29 +02:00
Serraniel f48ce1a717 Added the SweetLib Package 2017-04-16 18:59:18 +02:00
Serraniel ca344f5c73 Created Downloader 2017-04-16 17:57:27 +02:00
Serraniel ffea67dd12 Added download form
Started Launcher
2017-03-09 20:56:48 +01:00
Serraniel 1ac96b3966 Recreated project files 2017-03-09 20:08:35 +01:00
Serraniel 9e0f83e43b Update README.md
Added How To
2017-03-09 18:51:35 +01:00
Serraniel 6ee94446d9 Build 2017-03-08 20:59:29 +01:00
Serraniel 89de707eaf Merge branch 'develop'
* develop:
  Fixed UI Bug
  Little Update system and reworked versions
  Some experimental stuff
2017-03-08 20:58:18 +01:00
Serraniel d14aec384a Merge branch 'master' into develop 2017-03-08 20:57:46 +01:00
Serraniel c37f04a4dc Merge branch 'bugfix/UI_Wording' into develop
* bugfix/UI_Wording:
  Fixed UI Bug
2017-03-08 20:57:06 +01:00
Serraniel 15aa7a16f1 Fixed UI Bug 2017-03-08 20:56:55 +01:00
Serraniel 89a832402d Merge branch 'feature/Updater' into develop
* feature/Updater:
  Little Update system and reworked versions
  Some experimental stuff
2017-03-08 20:55:30 +01:00
Serraniel 39e7733778 Little Update system and reworked versions 2017-03-08 20:55:15 +01:00
Serraniel 4a1ec5853b Some experimental stuff 2017-03-08 18:30:57 +01:00
Serraniel 3cc26bd70a Update README.md
First draft after release.
2017-01-29 10:54:17 +01:00
66 changed files with 5887 additions and 895 deletions

8
.github/dependabot.yml vendored Normal file
View file

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

14
.github/workflows/auto-merge.yml vendored Normal file
View file

@ -0,0 +1,14 @@
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 }}

70
.github/workflows/codeql-analysis.yml vendored Normal file
View file

@ -0,0 +1,70 @@
# 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,3 +250,4 @@ paket-files/
# JetBrains Rider
.idea/
*.sln.iml
install/Discord_Media_Loader_Setup.exe

3
.gitmodules vendored Normal file
View file

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

View file

@ -0,0 +1,17 @@
<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

@ -0,0 +1,15 @@
<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>

25
DML.Client/DMLClient.cs Normal file
View file

@ -0,0 +1,25 @@
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;
}
}
}

158
DML.Core/Classes/Job.cs Normal file
View file

@ -0,0 +1,158 @@
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

@ -0,0 +1,290 @@
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

@ -0,0 +1,38 @@
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);
}
}
}
}

260
DML.Core/Core.cs Normal file
View file

@ -0,0 +1,260 @@
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Discord;
using Discord.Net;
using Discord.WebSocket;
using DML.Core.Classes;
namespace DML.Core
{
public static class Core
{
internal static DiscordSocketClient Client { get; set; }
internal static LiteDatabase Database { get; set; }
internal static Settings Settings { get; set; }
internal static JobScheduler Scheduler { get; } = new JobScheduler();
internal static string DataDirectory
=> Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Serraniel\Discord Media Loader");
public static async Task Run(string[] paramStrings)
{
try
{
var splash = new FrmInternalSplash();
splash.Show();
System.Windows.Forms.Application.DoEvents();
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,
SweetUtils.LegalizeFilename($"{DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.SortableDateTimePattern)}.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();
}
Debug("Loading jobs collection out of database...");
Scheduler.JobList = Job.RestoreJobs().ToList();
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 DiscordSocketClient();
Client.Log += (arg) =>
{
var logMessage = $"DiscordClient: {arg.Message}";
switch (arg.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;
}
return Task.CompletedTask;
};
Info("Trying to log into discord...");
var abort = false;
Client.Connected += Client_Connected;
while (Client.LoginState != LoginState.LoggedIn && !abort)
{
Debug(Client.ConnectionState.ToString());
Debug(Client.LoginState.ToString());
Trace("Entering login loop.");
try
{
if (Client.ConnectionState == ConnectionState.Connecting)
continue;
if (!string.IsNullOrEmpty(Settings.LoginToken))
{
Debug("Trying to login with last known token...");
await Client.LoginAsync(TokenType.User, Settings.LoginToken);
await Task.Delay(1000);
}
}
catch (HttpException ex)
{
Warn($"Login seems to have failed or gone wrong: {ex.GetType().Name} - {ex.Message}");
}
if (Client.LoginState == LoginState.LoggedOut)
{
Settings.Password = string.Empty;
Debug("Showing dialog for username and password...");
var loginDlg = new LoginDialog();
loginDlg.ShowDialog();
Trace("Dialog closed.");
}
}
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();
Info("Starting scheduler...");
Scheduler.Start();
System.Windows.Forms.Application.Run(new MainForm());
Info("Stopping scheduler...");
Scheduler.Stop();
}
catch (Exception ex)
{
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

@ -0,0 +1,15 @@
<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

@ -0,0 +1,289 @@
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

@ -0,0 +1,180 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;
using DML.Application.Classes;
using DML.Client;
using SweetLib.Utils.Extensions;
using static SweetLib.Utils.Logger.Logger;
namespace DML.AppCore.Classes
{
public class Job
{
public int Id { get; set; }
public ulong GuildId { get; set; }
public ulong ChannelId { get; set; }
public double KnownTimestamp { get; set; } = 0;
private double StopTimestamp { get; set; }
private bool IsValid { get; set; } = true;
internal void Store()
{
Debug("Storing job to database...");
Trace("Getting jobs collection...");
var jobDb = 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);
}
public void Delete()
{
Debug("Deleting job from database...");
Trace("Getting jobs collection...");
var jobDb = 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 DMLClient.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<IMessage>> Scan()
{
Debug($"Starting scan of guild {GuildId} channel {ChannelId}...");
var result = new List<IMessage>();
var limit = 100;
var lastId = ulong.MaxValue;
var isFirst = true;
var finished = false;
var guild = FindServerById(GuildId);
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)
StopTimestamp = KnownTimestamp;
Trace("Initialized scanning parameters.");
while (!finished)
{
Trace("Entering scanning loop...");
var messages = new List<IMessage>();
Trace($"Downloading next {limit} messages...");
if (isFirst)
{
//messages = await channel.GetMessagesAsync(limit).ToArray() as SocketMessage[];
var realMessages = await channel.GetMessagesAsync(limit).ToArrayAsync();
foreach (var realMessageArray in realMessages)
foreach (var realMessage in realMessageArray)
messages.Add(realMessage);
}
else
{
var realMessages = await channel.GetMessagesAsync(lastId, Direction.Before, limit).ToArrayAsync();
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.Count} messages.");
isFirst = false;
foreach (var m in messages)
{
if (!IsValid)
return null;
Core.Scheduler.MessagesScanned++;
Debug($"Processing message {m.Id}");
if (m.Id < lastId)
{
Trace($"Updating lastId ({lastId}) to {m.Id}");
lastId = m.Id;
}
if (m.CreatedAt.UtcDateTime.ToUnixTimeStamp() <= StopTimestamp)
{
Debug("Found a message with a known timestamp...Stopping scan.");
finished = true;
continue;
}
Trace($"Message {m.Id} has {m.Attachments.Count} attachments.");
if (m.Attachments.Count > 0)
{
result.Add(m);
Core.Scheduler.TotalAttachments += (ulong) m.Attachments.Count;
Trace($"Added message {m.Id}");
}
Debug($"Finished message {m.Id}");
}
finished = finished || messages.Count < 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 = result[result.Count - 1].CreatedAt.UtcDateTime.ToUnixTimeStamp();
}
Debug($"Fisnished scan of guild {GuildId} channel {ChannelId}.");
return result;
}
public void Stop()
{
IsValid = false;
}
public static IEnumerable<Job> RestoreJobs()
{
Debug("Restoring jobs...");
Trace("Getting jobs collection...");
var jobDb = Core.Database.GetCollection<Job>("jobs");
Trace("Creating new empty job list");
return jobDb.FindAll();
}
}
}

View file

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

View file

@ -0,0 +1,39 @@
using SweetLib.Utils.Logger;
namespace DML.Application.Classes
{
public class Settings
{
public int Id { get; } = 1; // using always unique ID
public string Email { get; set; }
public string Password { get; set; }
public string LoginToken { get; set; }
public bool UseUserData { get; set; } = false;
public bool SavePassword { get; set; } = false;
public LogLevel ApplicactionLogLevel { get; set; } = LogLevel.Info | LogLevel.Warn | LogLevel.Error;
public string OperatingFolder { get; set; }
public string FileNameScheme { get; set; } = @"%guild%\%channel%\%id%";
public bool SkipExistingFiles { get; set; } = true;
public int ThreadLimit { get; set; } = 50;
public bool ShowStartUpHints { get; set; } = true;
public void Store()
{
Logger.Trace("Getting settings collection...");
var settingsDB = Core.Database.GetCollection<Settings>("settings");
Logger.Debug("Storing settings to database...");
if (settingsDB.Exists(_setting => _setting.Id == Id))
{
Logger.Trace("Updating existing value...");
settingsDB.Update(this);
}
else
{
Logger.Trace("Adding new value...");
settingsDB.Insert(this);
}
}
}
}

View file

@ -0,0 +1,311 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C130DE6A-3237-42B5-BE9F-783D1CD104C6}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DML.Application</RootNamespace>
<AssemblyName>Discord Media Loader.Application</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>8</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>8</LangVersion>
</PropertyGroup>
<ItemGroup>
<Reference Include="LiteDB, Version=4.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL">
<HintPath>..\packages\LiteDB.4.1.4\lib\net40\LiteDB.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.3.1.6\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.6\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Win32.Registry, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Registry.4.7.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
</Reference>
<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 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 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.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.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.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<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>
<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>
</ItemGroup>
<ItemGroup>
<Compile Include="Classes\Core.cs" />
<Compile Include="Classes\Job.cs" />
<Compile Include="Classes\JobScheduler.cs" />
<Compile Include="Dialogs\LoginDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Dialogs\LoginDialog.Designer.cs">
<DependentUpon>LoginDialog.cs</DependentUpon>
</Compile>
<Compile Include="FrmInternalSplash.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmInternalSplash.Designer.cs">
<DependentUpon>FrmInternalSplash.cs</DependentUpon>
</Compile>
<Compile Include="Helper\IdentifiedString.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Classes\Settings.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Dialogs\LoginDialog.resx">
<DependentUpon>LoginDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmInternalSplash.resx">
<DependentUpon>FrmInternalSplash.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DML.Client\DML.Client.csproj">
<Project>{045eb4a1-34e7-47e0-867e-e10c40505095}</Project>
<Name>DML.Client</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>
</ItemGroup>
<ItemGroup>
<None Include="Resources\Serraniel-Logo4-NO-BG.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\info_icon.png" />
</ItemGroup>
<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.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -0,0 +1,2 @@
<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

@ -0,0 +1,131 @@
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.btnAbort = new System.Windows.Forms.Button();
this.btnOk = new System.Windows.Forms.Button();
this.lbHowToToken = new System.Windows.Forms.Label();
this.edToken = new System.Windows.Forms.TextBox();
this.lbToken = new System.Windows.Forms.Label();
this.pnlButtons.SuspendLayout();
this.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, 189);
this.pnlButtons.Name = "pnlButtons";
this.pnlButtons.Size = new System.Drawing.Size(426, 51);
this.pnlButtons.TabIndex = 0;
//
// 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);
//
// 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);
//
// lbHowToToken
//
this.lbHowToToken.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.lbHowToToken.Location = new System.Drawing.Point(7, 58);
this.lbHowToToken.Name = "lbHowToToken";
this.lbHowToToken.Size = new System.Drawing.Size(412, 128);
this.lbHowToToken.TabIndex = 5;
this.lbHowToToken.Text = resources.GetString("lbHowToToken.Text");
//
// edToken
//
this.edToken.Location = new System.Drawing.Point(79, 12);
this.edToken.Name = "edToken";
this.edToken.Size = new System.Drawing.Size(335, 20);
this.edToken.TabIndex = 4;
//
// lbToken
//
this.lbToken.AutoSize = true;
this.lbToken.Location = new System.Drawing.Point(7, 15);
this.lbToken.Name = "lbToken";
this.lbToken.Size = new System.Drawing.Size(66, 13);
this.lbToken.TabIndex = 3;
this.lbToken.Text = "Login token:";
//
// LoginDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(426, 240);
this.Controls.Add(this.lbHowToToken);
this.Controls.Add(this.edToken);
this.Controls.Add(this.lbToken);
this.Controls.Add(this.pnlButtons);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
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.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel pnlButtons;
private System.Windows.Forms.Button btnAbort;
private System.Windows.Forms.Button btnOk;
private System.Windows.Forms.Label lbHowToToken;
private System.Windows.Forms.TextBox edToken;
private System.Windows.Forms.Label lbToken;
}
}

View file

@ -0,0 +1,45 @@
using System;
using System.Windows.Forms;
using DML.Application.Classes;
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;
}
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.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,415 @@
<?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.
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>
<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

@ -0,0 +1,80 @@
namespace DML.Application
{
partial class FrmInternalSplash
{
/// <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(FrmInternalSplash));
this.lblName = new System.Windows.Forms.Label();
this.pbLogo = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).BeginInit();
this.SuspendLayout();
//
// lblName
//
this.lblName.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblName.Location = new System.Drawing.Point(11, 129);
this.lblName.Name = "lblName";
this.lblName.Size = new System.Drawing.Size(379, 35);
this.lblName.TabIndex = 3;
this.lblName.Text = "Discord Media Loader";
this.lblName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// pbLogo
//
this.pbLogo.Image = global::DML.Application.Properties.Resources.Serraniel_Logo4_NO_BG;
this.pbLogo.Location = new System.Drawing.Point(14, 10);
this.pbLogo.Name = "pbLogo";
this.pbLogo.Size = new System.Drawing.Size(376, 116);
this.pbLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbLogo.TabIndex = 2;
this.pbLogo.TabStop = false;
//
// FrmInternalSplash
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(400, 175);
this.Controls.Add(this.lblName);
this.Controls.Add(this.pbLogo);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmInternalSplash";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Discord Media Loader";
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label lblName;
private System.Windows.Forms.PictureBox pbLogo;
}
}

View file

@ -0,0 +1,12 @@
using System.Windows.Forms;
namespace DML.Application
{
public partial class FrmInternalSplash : Form
{
public FrmInternalSplash()
{
InitializeComponent();
}
}
}

View file

@ -0,0 +1,19 @@
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

@ -0,0 +1,484 @@
namespace DML.Application
{
partial class MainForm
{
/// <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()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.pnlSettings = new System.Windows.Forms.GroupBox();
this.btnFileNameHelp = new System.Windows.Forms.Button();
this.lbThreadLimit = new System.Windows.Forms.Label();
this.edThreadLimit = new System.Windows.Forms.NumericUpDown();
this.cbSkipExisting = new System.Windows.Forms.CheckBox();
this.edNameScheme = new System.Windows.Forms.TextBox();
this.lbNameScheme = new System.Windows.Forms.Label();
this.btnSearchFolders = new System.Windows.Forms.Button();
this.edOperatingFolder = new System.Windows.Forms.TextBox();
this.lbOperatingFolder = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.btnAddJob = new System.Windows.Forms.Button();
this.cbChannel = new System.Windows.Forms.ComboBox();
this.lbChannel = new System.Windows.Forms.Label();
this.cbGuild = new System.Windows.Forms.ComboBox();
this.lbGuild = new System.Windows.Forms.Label();
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.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.btnDelete = new System.Windows.Forms.Button();
this.lbxJobs = new System.Windows.Forms.ListBox();
this.tmrRefreshProgress = new System.Windows.Forms.Timer(this.components);
this.tmrTriggerRefresh = new System.Windows.Forms.Timer(this.components);
this.pnlSettings.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.edThreadLimit)).BeginInit();
this.groupBox1.SuspendLayout();
this.statusStrip.SuspendLayout();
this.groupBox2.SuspendLayout();
this.SuspendLayout();
//
// pnlSettings
//
this.pnlSettings.Controls.Add(this.btnFileNameHelp);
this.pnlSettings.Controls.Add(this.lbThreadLimit);
this.pnlSettings.Controls.Add(this.edThreadLimit);
this.pnlSettings.Controls.Add(this.cbSkipExisting);
this.pnlSettings.Controls.Add(this.edNameScheme);
this.pnlSettings.Controls.Add(this.lbNameScheme);
this.pnlSettings.Controls.Add(this.btnSearchFolders);
this.pnlSettings.Controls.Add(this.edOperatingFolder);
this.pnlSettings.Controls.Add(this.lbOperatingFolder);
this.pnlSettings.Dock = System.Windows.Forms.DockStyle.Top;
this.pnlSettings.Location = new System.Drawing.Point(0, 0);
this.pnlSettings.Name = "pnlSettings";
this.pnlSettings.Size = new System.Drawing.Size(690, 93);
this.pnlSettings.TabIndex = 0;
this.pnlSettings.TabStop = false;
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
//
this.lbThreadLimit.AutoSize = true;
this.lbThreadLimit.Location = new System.Drawing.Point(12, 67);
this.lbThreadLimit.Name = "lbThreadLimit";
this.lbThreadLimit.Size = new System.Drawing.Size(64, 13);
this.lbThreadLimit.TabIndex = 6;
this.lbThreadLimit.Text = "Thread limit:";
//
// edThreadLimit
//
this.edThreadLimit.Location = new System.Drawing.Point(113, 65);
this.edThreadLimit.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.edThreadLimit.Name = "edThreadLimit";
this.edThreadLimit.Size = new System.Drawing.Size(120, 20);
this.edThreadLimit.TabIndex = 7;
this.edThreadLimit.Value = new decimal(new int[] {
1,
0,
0,
0});
this.edThreadLimit.ValueChanged += new System.EventHandler(this.DoSomethingChanged);
//
// cbSkipExisting
//
this.cbSkipExisting.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cbSkipExisting.AutoSize = true;
this.cbSkipExisting.Location = new System.Drawing.Point(584, 42);
this.cbSkipExisting.Name = "cbSkipExisting";
this.cbSkipExisting.Size = new System.Drawing.Size(106, 17);
this.cbSkipExisting.TabIndex = 5;
this.cbSkipExisting.Text = "Skip existing files";
this.cbSkipExisting.UseVisualStyleBackColor = true;
this.cbSkipExisting.TextChanged += new System.EventHandler(this.DoSomethingChanged);
//
// edNameScheme
//
this.edNameScheme.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.edNameScheme.Location = new System.Drawing.Point(113, 39);
this.edNameScheme.Name = "edNameScheme";
this.edNameScheme.Size = new System.Drawing.Size(435, 20);
this.edNameScheme.TabIndex = 4;
this.edNameScheme.TextChanged += new System.EventHandler(this.DoSomethingChanged);
//
// lbNameScheme
//
this.lbNameScheme.AutoSize = true;
this.lbNameScheme.Location = new System.Drawing.Point(12, 42);
this.lbNameScheme.Name = "lbNameScheme";
this.lbNameScheme.Size = new System.Drawing.Size(95, 13);
this.lbNameScheme.TabIndex = 3;
this.lbNameScheme.Text = "File name scheme:";
//
// btnSearchFolders
//
this.btnSearchFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnSearchFolders.Location = new System.Drawing.Point(659, 11);
this.btnSearchFolders.Name = "btnSearchFolders";
this.btnSearchFolders.Size = new System.Drawing.Size(25, 23);
this.btnSearchFolders.TabIndex = 2;
this.btnSearchFolders.Text = "...";
this.btnSearchFolders.UseVisualStyleBackColor = true;
this.btnSearchFolders.Click += new System.EventHandler(this.btnSearchFolders_Click);
//
// edOperatingFolder
//
this.edOperatingFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.edOperatingFolder.Location = new System.Drawing.Point(113, 13);
this.edOperatingFolder.Name = "edOperatingFolder";
this.edOperatingFolder.Size = new System.Drawing.Size(540, 20);
this.edOperatingFolder.TabIndex = 1;
this.edOperatingFolder.TextChanged += new System.EventHandler(this.DoSomethingChanged);
//
// lbOperatingFolder
//
this.lbOperatingFolder.AutoSize = true;
this.lbOperatingFolder.Location = new System.Drawing.Point(12, 16);
this.lbOperatingFolder.Name = "lbOperatingFolder";
this.lbOperatingFolder.Size = new System.Drawing.Size(85, 13);
this.lbOperatingFolder.TabIndex = 0;
this.lbOperatingFolder.Text = "Operating folder:";
//
// groupBox1
//
this.groupBox1.Controls.Add(this.btnAddJob);
this.groupBox1.Controls.Add(this.cbChannel);
this.groupBox1.Controls.Add(this.lbChannel);
this.groupBox1.Controls.Add(this.cbGuild);
this.groupBox1.Controls.Add(this.lbGuild);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
this.groupBox1.Location = new System.Drawing.Point(0, 93);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(690, 57);
this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Add a job";
//
// btnAddJob
//
this.btnAddJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnAddJob.Location = new System.Drawing.Point(618, 19);
this.btnAddJob.Name = "btnAddJob";
this.btnAddJob.Size = new System.Drawing.Size(66, 23);
this.btnAddJob.TabIndex = 4;
this.btnAddJob.Text = "&Add";
this.btnAddJob.UseVisualStyleBackColor = true;
this.btnAddJob.Click += new System.EventHandler(this.btnAddJob_Click);
//
// cbChannel
//
this.cbChannel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.cbChannel.FormattingEnabled = true;
this.cbChannel.Location = new System.Drawing.Point(294, 19);
this.cbChannel.Name = "cbChannel";
this.cbChannel.Size = new System.Drawing.Size(318, 21);
this.cbChannel.TabIndex = 3;
//
// lbChannel
//
this.lbChannel.AutoSize = true;
this.lbChannel.Location = new System.Drawing.Point(239, 22);
this.lbChannel.Name = "lbChannel";
this.lbChannel.Size = new System.Drawing.Size(49, 13);
this.lbChannel.TabIndex = 2;
this.lbChannel.Text = "Channel:";
//
// cbGuild
//
this.cbGuild.FormattingEnabled = true;
this.cbGuild.Location = new System.Drawing.Point(52, 19);
this.cbGuild.Name = "cbGuild";
this.cbGuild.Size = new System.Drawing.Size(181, 21);
this.cbGuild.TabIndex = 1;
this.cbGuild.SelectedIndexChanged += new System.EventHandler(this.cbGuild_SelectedIndexChanged);
//
// lbGuild
//
this.lbGuild.AutoSize = true;
this.lbGuild.Location = new System.Drawing.Point(12, 22);
this.lbGuild.Name = "lbGuild";
this.lbGuild.Size = new System.Drawing.Size(34, 13);
this.lbGuild.TabIndex = 0;
this.lbGuild.Text = "Guild:";
//
// statusStrip
//
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lbStatus,
this.pgbProgress,
this.lbProgress,
this.lblVersionPlaceholder,
this.lbVersion,
this.btnDropDown});
this.statusStrip.Location = new System.Drawing.Point(0, 393);
this.statusStrip.Name = "statusStrip";
this.statusStrip.Size = new System.Drawing.Size(690, 22);
this.statusStrip.TabIndex = 2;
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
//
this.pgbProgress.Name = "pgbProgress";
this.pgbProgress.Size = new System.Drawing.Size(100, 16);
//
// lbProgress
//
this.lbProgress.Name = "lbProgress";
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
//
this.groupBox2.Controls.Add(this.btnDelete);
this.groupBox2.Controls.Add(this.lbxJobs);
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox2.Location = new System.Drawing.Point(0, 150);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(690, 243);
this.groupBox2.TabIndex = 3;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Jobs";
//
// btnDelete
//
this.btnDelete.Dock = System.Windows.Forms.DockStyle.Bottom;
this.btnDelete.Location = new System.Drawing.Point(3, 217);
this.btnDelete.Name = "btnDelete";
this.btnDelete.Size = new System.Drawing.Size(684, 23);
this.btnDelete.TabIndex = 1;
this.btnDelete.Text = "Delete selected";
this.btnDelete.UseVisualStyleBackColor = true;
this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
//
// lbxJobs
//
this.lbxJobs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lbxJobs.FormattingEnabled = true;
this.lbxJobs.Location = new System.Drawing.Point(6, 19);
this.lbxJobs.Name = "lbxJobs";
this.lbxJobs.Size = new System.Drawing.Size(678, 186);
this.lbxJobs.TabIndex = 0;
//
// tmrRefreshProgress
//
this.tmrRefreshProgress.Enabled = true;
this.tmrRefreshProgress.Interval = 500;
this.tmrRefreshProgress.Tick += new System.EventHandler(this.tmrRefreshProgress_Tick);
//
// tmrTriggerRefresh
//
this.tmrTriggerRefresh.Interval = 5000;
this.tmrTriggerRefresh.Tick += new System.EventHandler(this.tmrTriggerRefresh_Tick);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(690, 415);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.statusStrip);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.pnlSettings);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(100, 75);
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Discord Medial Loader";
this.Shown += new System.EventHandler(this.MainForm_Shown);
this.pnlSettings.ResumeLayout(false);
this.pnlSettings.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.edThreadLimit)).EndInit();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.statusStrip.ResumeLayout(false);
this.statusStrip.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.GroupBox pnlSettings;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.StatusStrip statusStrip;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Label lbThreadLimit;
private System.Windows.Forms.NumericUpDown edThreadLimit;
private System.Windows.Forms.CheckBox cbSkipExisting;
private System.Windows.Forms.TextBox edNameScheme;
private System.Windows.Forms.Label lbNameScheme;
private System.Windows.Forms.Button btnSearchFolders;
private System.Windows.Forms.TextBox edOperatingFolder;
private System.Windows.Forms.Label lbOperatingFolder;
private System.Windows.Forms.Button btnAddJob;
private System.Windows.Forms.ComboBox cbChannel;
private System.Windows.Forms.Label lbChannel;
private System.Windows.Forms.ComboBox cbGuild;
private System.Windows.Forms.Label lbGuild;
private System.Windows.Forms.Button btnDelete;
private System.Windows.Forms.ListBox lbxJobs;
private System.Windows.Forms.ToolStripProgressBar pgbProgress;
private System.Windows.Forms.ToolStripStatusLabel lbProgress;
private System.Windows.Forms.Timer tmrRefreshProgress;
private System.Windows.Forms.ToolStripStatusLabel lblVersionPlaceholder;
private System.Windows.Forms.ToolStripStatusLabel lbVersion;
private System.Windows.Forms.ToolStripSplitButton btnDropDown;
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem visitGithubToolStripMenuItem;
private System.Windows.Forms.ToolStripDropDownButton lbStatus;
private System.Windows.Forms.ToolStripMenuItem invisibleToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem doNotDisturbToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem doNotDenyToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem onlineToolStripMenuItem;
private System.Windows.Forms.Timer tmrTriggerRefresh;
private System.Windows.Forms.ToolStripMenuItem showTokenToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.Button btnFileNameHelp;
}
}

View file

@ -0,0 +1,299 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using Discord;
using Discord.WebSocket;
using DML.AppCore.Classes;
using DML.Application.Classes;
using DML.Application.Helper;
using DML.Application.Properties;
using DML.Client;
using static SweetLib.Utils.Logger.Logger;
namespace DML.Application
{
internal enum OnlineState
{
Online,
Idle,
DoNotDisturb,
Invisible
}
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private bool IsInitialized { get; set; }
private void MainForm_Shown(object sender, EventArgs e)
{
Trace("MainForm shown executed.");
RefreshComponents();
IsInitialized = true;
}
private void RefreshComponents()
{
Debug("Refreshing components...");
lbVersion.Text = $"v{Assembly.GetExecutingAssembly().GetName().Version} Copyright © by Serraniel";
Trace("Refreshing operating folder component...");
edOperatingFolder.Text = Core.Settings.OperatingFolder;
Trace("Refreshing name scheme component...");
edNameScheme.Text = Core.Settings.FileNameScheme;
Trace("Refreshing skip existing files component...");
cbSkipExisting.Checked = Core.Settings.SkipExistingFiles;
Trace("Refreshing thread limit component...");
edThreadLimit.Value = Core.Settings.ThreadLimit;
if (cbGuild.Items.Count == 0)
{
Trace("Adding guilds to component...");
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;
Trace("Guild component initialized.");
}
Trace("Refreshing job list component...");
var oldIndex = lbxJobs.SelectedIndex;
lbxJobs.Items.Clear();
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.SelectedIndex = oldIndex;
lbStatus.Text = DMLClient.Client.CurrentUser.Status.ToString();
}
private void DoSomethingChanged(object sender, EventArgs e)
{
Debug($"DoSomethingChanged excuted by {sender}.");
if (!IsInitialized)
{
Trace("Form not initialized. Leaving DoSomethingChanged...");
return;
}
Trace("Updating operating folder...");
Core.Settings.OperatingFolder = edOperatingFolder.Text;
Trace("Updating name scheme...");
Core.Settings.FileNameScheme = edNameScheme.Text;
Trace("Updating skip existing files...");
Core.Settings.SkipExistingFiles = cbSkipExisting.Checked;
Trace("Updating thread limit...");
Core.Settings.ThreadLimit = (int) edThreadLimit.Value;
Trace("Storing new settings...");
Core.Settings.Store();
Info("New settings have been saved.");
}
private void btnSearchFolders_Click(object sender, EventArgs e)
{
Trace("Operating folder button pressed.");
using (var browserDialog = new FolderBrowserDialog())
{
Debug("Showing file browser dialog for operating folder...");
browserDialog.SelectedPath = edOperatingFolder.Text;
browserDialog.ShowNewFolderButton = true;
browserDialog.Description = "Select an operating folder...";
if (browserDialog.ShowDialog() == DialogResult.OK)
{
edOperatingFolder.Text = browserDialog.SelectedPath;
Debug("Updated operating folder.");
}
}
}
private SocketGuild FindServerByName(string name)
{
Trace($"Trying to find server by name: {name}");
return (from s in DMLClient.Client.Guilds where s.Name == name select s).FirstOrDefault();
}
private SocketTextChannel FindChannelByName(SocketGuild server, string name)
{
Trace($"Trying to find channel in {server} by name: {name}");
return (from c in server.TextChannels where c.Name == name select c).FirstOrDefault();
}
private SocketGuild FindServerById(ulong id)
{
Trace($"Trying to find server by Id: {id}");
return (from s in DMLClient.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();
}
private void cbGuild_SelectedIndexChanged(object sender, EventArgs e)
{
Trace("Guild index changed.");
Debug("Updating channel dropdown component...");
UseWaitCursor = true;
try
{
var guild = FindServerById(((IdentifiedString<ulong>) cbGuild.SelectedItem).Id);
if (guild != null)
{
Trace("Cleaning channel component from old values...");
cbChannel.Items.Clear();
Trace("Adding new channels...");
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.");
cbChannel.SelectedIndex = 0;
}
else
{
Warn($"Guild {cbGuild.Text} could not be found!");
}
}
finally
{
UseWaitCursor = false;
}
Debug("Finished updating channel dropdown component.");
}
private void btnAddJob_Click(object sender, EventArgs e)
{
var job = new Job
{
GuildId = ((IdentifiedString<ulong>) cbGuild.SelectedItem).Id,
ChannelId = ((IdentifiedString<ulong>) cbChannel.SelectedItem).Id
};
if (!(from j in Core.Scheduler.JobList
where j.GuildId == job.GuildId && j.ChannelId == job.ChannelId
select j).Any())
{
job.Store();
Core.Scheduler.JobList.Add(job);
}
RefreshComponents();
}
private void btnDelete_Click(object sender, EventArgs e)
{
Trace("Deleting job pressed.");
if (lbxJobs.SelectedIndex < 0)
{
Warn("No job selected.");
MessageBox.Show("No job has been seleted.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
var jobId = ((IdentifiedString<int>) lbxJobs.SelectedItem).Id;
var job = Core.Scheduler.JobList.FirstOrDefault(j => j.Id == jobId);
if (job != null)
{
Core.Scheduler.JobList.Remove(job);
Core.Scheduler.RunningJobs.Remove(job.Id);
job.Stop();
job.Delete();
}
lbxJobs.SelectedIndex = -1;
RefreshComponents();
}
private void tmrRefreshProgress_Tick(object sender, EventArgs e)
{
var scanned = Core.Scheduler.MessagesScanned;
var totalAttachments = Core.Scheduler.TotalAttachments;
var done = Core.Scheduler.AttachmentsDownloaded;
var progress = totalAttachments > 0 ? (int) (100 * done / totalAttachments) : 0;
progress = Math.Min(Math.Max(0, progress), 100);
pgbProgress.Maximum = 100;
pgbProgress.Value = progress;
lbProgress.Text = $"Scanned: {scanned} Downloaded: {done} Open: {totalAttachments - done}";
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show(Resources.AboutString);
}
private void visitGithubToolStripMenuItem_Click(object sender, EventArgs e)
{
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

@ -0,0 +1,417 @@
<?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>
<metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="tmrRefreshProgress.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>126, 17</value>
</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" />
<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

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("Discord Media Loader.Application")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Serraniel")]
[assembly: AssemblyProduct("Discord Media Loader.Application")]
[assembly: AssemblyCopyright("Copyright © 2017 - 2019 by Serraniel")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("c130de6a-3237-42b5-be9f-783d1cd104c6")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.5.3.0")]
[assembly: AssemblyFileVersion("1.5.3.0")]

View file

@ -0,0 +1,120 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DML.Application.Properties {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder 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
// 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.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DML.Application.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Discord Media Loader by Serraniel - Apache 2.0 License
///https://github.com/Serraniel/DiscordMediaLoader/
///
///Made with:
///SweetLib (Copyright (c) 2017 Serraniel - GNU General Public License v3.0)
///Discord.Net (Copyright (c) 2015 RogueException - MIT License)
///Newtonsoft.Json (Copyright (c) 2007 James Newton-King - MIT License)
///Nito.AsyncEx (Copyright (c) 2014 StephenCleary - MIT License)
///RestSharp (Copyright (c) restsharp - Apache 2.0 License)
///WebSocket4Net (Copyright (c) kerryjiang - Apache 2.0 License)
/// [Rest der Zeichenfolge wurde abgeschnitten]&quot;; ähnelt.
/// </summary>
internal static string AboutString {
get {
return ResourceManager.GetString("AboutString", resourceCulture);
}
}
/// <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>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Serraniel_Logo4_NO_BG {
get {
object obj = ResourceManager.GetObject("Serraniel_Logo4_NO_BG", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View file

@ -0,0 +1,154 @@
<?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="AboutString" xml:space="preserve">
<value>Discord Media Loader by Serraniel - Apache 2.0 License
https://github.com/Serraniel/DiscordMediaLoader/
Made with:
SweetLib (Copyright (c) 2017 Serraniel - GNU General Public License v3.0)
Discord.Net (Copyright (c) 2015 RogueException - MIT License)
Newtonsoft.Json (Copyright (c) 2007 James Newton-King - MIT License)
Nito.AsyncEx (Copyright (c) 2014 StephenCleary - MIT License)
RestSharp (Copyright (c) restsharp - Apache 2.0 License)
WebSocket4Net (Copyright (c) kerryjiang - Apache 2.0 License)
LiteDB (Copyright (c) 2014 - 2015 Mauricio David - MIT License)
Octokit (Copyright (c) 2012 GitHub, Inc - MIT License)
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>
<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">
<value>..\Resources\Serraniel-Logo4-NO-BG.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -0,0 +1,71 @@
<?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

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="LiteDB" version="5.0.9" targetFramework="net461" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net461" />
<package id="Microsoft.NETCore.Platforms" version="5.0.1" targetFramework="net461" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net461" />
<package id="Microsoft.Win32.Registry" version="5.0.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="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>

View file

@ -1,9 +1,29 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25123.0
# Visual Studio Version 16
VisualStudioVersion = 16.0.29324.140
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord Media Loader", "Discord Media Loader\Discord Media Loader.csproj", "{83E64057-7010-4DF3-A011-F7E536508407}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord Media Loader", "Discord Media Loader\Discord Media Loader.csproj", "{EDC92554-DBC1-4F9C-9317-379A8BF441E8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DML.Application", "Discord Media Loader.Application\DML.Application.csproj", "{C130DE6A-3237-42B5-BE9F-783D1CD104C6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DML.Client", "DML.Client\DML.Client.csproj", "{045EB4A1-34E7-47E0-867E-E10C40505095}"
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
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -11,12 +31,60 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{83E64057-7010-4DF3-A011-F7E536508407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83E64057-7010-4DF3-A011-F7E536508407}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83E64057-7010-4DF3-A011-F7E536508407}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83E64057-7010-4DF3-A011-F7E536508407}.Release|Any CPU.Build.0 = Release|Any CPU
{EDC92554-DBC1-4F9C-9317-379A8BF441E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EDC92554-DBC1-4F9C-9317-379A8BF441E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EDC92554-DBC1-4F9C-9317-379A8BF441E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EDC92554-DBC1-4F9C-9317-379A8BF441E8}.Release|Any CPU.Build.0 = Release|Any CPU
{C130DE6A-3237-42B5-BE9F-783D1CD104C6}.Debug|Any CPU.ActiveCfg = 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.Build.0 = Release|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.Debug|Any CPU.Build.0 = Debug|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.Release|Any CPU.ActiveCfg = Release|Any CPU
{045EB4A1-34E7-47E0-867E-E10C40505095}.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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
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

View file

@ -1,18 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Discord_Media_Loader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<userSettings>
<Discord_Media_Loader.Properties.Settings>
<setting name="email" serializeAs="String">
<value/>
</setting>
</Discord_Media_Loader.Properties.Settings>
</userSettings>
<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>

View file

@ -4,15 +4,17 @@
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{83E64057-7010-4DF3-A011-F7E536508407}</ProjectGuid>
<ProjectGuid>{EDC92554-DBC1-4F9C-9317-379A8BF441E8}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Discord_Media_Loader</RootNamespace>
<AssemblyName>Discord Media Loader</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -36,67 +38,172 @@
<PropertyGroup>
<ApplicationIcon>Serraniel-64x64.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="Discord.Net, Version=0.9.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Discord.Net.0.9.6\lib\net45\Discord.Net.dll</HintPath>
<Private>True</Private>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</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>
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.3.1.6\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath>
</Reference>
<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 Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.6\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
</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 Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
</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 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="RestSharp, Version=105.2.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RestSharp.105.2.3\lib\net46\RestSharp.dll</HintPath>
<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="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.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.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.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WebSocket4Net, Version=0.14.1.0, Culture=neutral, PublicKeyToken=eb4e154b696bf72a, processorArchitecture=MSIL">
<HintPath>..\packages\WebSocket4Net.0.14.1\lib\net45\WebSocket4Net.dll</HintPath>
<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>
<Compile Include="LoginForm.cs">
<Compile Include="FrmDownload.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="LoginForm.Designer.cs">
<DependentUpon>LoginForm.cs</DependentUpon>
<Compile Include="FrmDownload.Designer.cs">
<DependentUpon>FrmDownload.cs</DependentUpon>
</Compile>
<Compile Include="MainForm.cs">
<Compile Include="FrmSplash.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
<Compile Include="FrmSplash.Designer.cs">
<DependentUpon>FrmSplash.cs</DependentUpon>
</Compile>
<Compile Include="Helper\TaskBarProgress.cs" />
<Compile Include="Helper\VersionHelper.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="LoginForm.resx">
<DependentUpon>LoginForm.cs</DependentUpon>
<EmbeddedResource Include="FrmDownload.resx">
<DependentUpon>FrmDownload.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
<EmbeddedResource Include="FrmSplash.resx">
<DependentUpon>FrmSplash.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
@ -123,9 +230,24 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Serraniel-Logo4-NO-BG.png" />
<Content Include="Serraniel-64x64.ico" />
<Content Include="Serraniel-Logo4-ABGERUNDET.ico" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Discord Media Loader.Application\DML.Application.csproj">
<Project>{c130de6a-3237-42b5-be9f-783d1cd104c6}</Project>
<Name>DML.Application</Name>
</ProjectReference>
</ItemGroup>
<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.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View file

@ -0,0 +1,77 @@
namespace Discord_Media_Loader
{
partial class FrmDownload
{
/// <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(FrmDownload));
this.pgbProgress = new System.Windows.Forms.ProgressBar();
this.lbStatus = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// pgbProgress
//
this.pgbProgress.Location = new System.Drawing.Point(12, 12);
this.pgbProgress.Name = "pgbProgress";
this.pgbProgress.Size = new System.Drawing.Size(351, 23);
this.pgbProgress.TabIndex = 0;
//
// lbStatus
//
this.lbStatus.AutoSize = true;
this.lbStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lbStatus.ForeColor = System.Drawing.SystemColors.ControlDarkDark;
this.lbStatus.Location = new System.Drawing.Point(12, 47);
this.lbStatus.Name = "lbStatus";
this.lbStatus.Size = new System.Drawing.Size(37, 13);
this.lbStatus.TabIndex = 1;
this.lbStatus.Text = "Status";
//
// FrmDownload
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(375, 70);
this.ControlBox = false;
this.Controls.Add(this.lbStatus);
this.Controls.Add(this.pgbProgress);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmDownload";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Discord Media Loader";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ProgressBar pgbProgress;
private System.Windows.Forms.Label lbStatus;
}
}

View file

@ -0,0 +1,112 @@
using System;
using System.ComponentModel;
using System.Globalization;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Discord_Media_Loader
{
internal partial class FrmDownload : Form
{
private string FileName { get; }
private string Source { get; }
private bool Finished { get; set; } = false;
internal FrmDownload(string fileName, string source)
{
InitializeComponent();
FileName = fileName;
Source = source;
}
internal void StartDownload(bool waitForDialog = true)
{
Task.Run(() =>
{
while (waitForDialog && !Visible) { }
var wc = new WebClient
{
CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore)
};
SetStatus($"Downloading {FileName}...");
SetProgress(0, 100);
wc.DownloadProgressChanged += Wc_DownloadProgressChanged;
wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
wc.DownloadFileAsync(new Uri(Source), FileName);
while (!Finished)
{
// wait for download
}
RequestClose();
});
}
private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
SetStatus("Download finished");
Finished = true;
}
private void Wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
var bytesIn = double.Parse(e.BytesReceived.ToString(CultureInfo.InvariantCulture));
var totalBytes = double.Parse(e.TotalBytesToReceive.ToString(CultureInfo.InvariantCulture));
var percentage = bytesIn / totalBytes * 100;
SetProgress(percentage, 100);
}
delegate void SetStatusCallback(String status);
private void SetStatus(String status)
{
if (InvokeRequired)
{
var callback = new SetStatusCallback(SetStatus);
Invoke(callback, status);
}
else
{
lbStatus.Text = status;
}
}
delegate void SetProgressCallback(double current, int max);
private void SetProgress(double current, int max)
{
if (InvokeRequired)
{
var callback = new SetProgressCallback(SetProgress);
Invoke(callback, current, max);
}
else
{
pgbProgress.Maximum = max;
pgbProgress.Value = (int)current;
Helper.TaskBarProgress.SetState(Handle, Helper.TaskBarProgress.TaskbarStates.Normal);
Helper.TaskBarProgress.SetValue(Handle, (int)current, max);
}
}
delegate void RequestCloseCallback();
private void RequestClose()
{
if (InvokeRequired)
{
var callback = new RequestCloseCallback(RequestClose);
Invoke(callback, new object[] { });
}
else
{
Close();
}
}
}
}

View file

@ -0,0 +1,81 @@
namespace Discord_Media_Loader
{
partial class FrmSplash
{
/// <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(FrmSplash));
this.lblName = new System.Windows.Forms.Label();
this.pbLogo = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).BeginInit();
this.SuspendLayout();
//
// lblName
//
this.lblName.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblName.Location = new System.Drawing.Point(9, 131);
this.lblName.Name = "lblName";
this.lblName.Size = new System.Drawing.Size(379, 35);
this.lblName.TabIndex = 1;
this.lblName.Text = "Discord Media Loader";
this.lblName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// pbLogo
//
this.pbLogo.Image = global::Discord_Media_Loader.Properties.Resources.Serraniel_Logo4_NO_BG;
this.pbLogo.Location = new System.Drawing.Point(12, 12);
this.pbLogo.Name = "pbLogo";
this.pbLogo.Size = new System.Drawing.Size(376, 116);
this.pbLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbLogo.TabIndex = 0;
this.pbLogo.TabStop = false;
//
// FrmSplash
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(400, 175);
this.Controls.Add(this.lblName);
this.Controls.Add(this.pbLogo);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmSplash";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Discord Media Loader";
this.Shown += new System.EventHandler(this.FrmSplash_Shown);
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PictureBox pbLogo;
private System.Windows.Forms.Label lblName;
}
}

View file

@ -0,0 +1,59 @@
using System;
using System.IO;
using System.IO.Compression;
using System.Windows.Forms;
using Discord_Media_Loader.Helper;
namespace Discord_Media_Loader
{
public partial class FrmSplash : Form
{
public FrmSplash()
{
InitializeComponent();
}
private async void FrmSplash_Shown(object sender, EventArgs e)
{
UseWaitCursor = true;
try
{
var releaseVersion = await VersionHelper.GetReleaseVersion();
if (releaseVersion > VersionHelper.AppVersion)
{
var tmpFile = Path.GetTempFileName();
var downloadManager = new FrmDownload(tmpFile, await VersionHelper.DownloadVersion(releaseVersion));
downloadManager.StartDownload();
downloadManager.ShowDialog();
var tmpFolder = Path.GetTempFileName();
tmpFolder = Path.Combine(Path.GetFullPath(tmpFolder).Replace(Path.GetFileName(tmpFolder), ""), Path.GetFileNameWithoutExtension(tmpFolder));
var di = Directory.CreateDirectory(tmpFolder);
ZipFile.ExtractToDirectory(tmpFile, tmpFolder);
foreach (var f in di.GetFiles())
{
try
{
var fname = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, f.Name);
File.Copy(f.FullName, fname, true);
}
catch (Exception) { }
}
File.Delete(tmpFile);
DialogResult = DialogResult.Cancel;
}
}
finally
{
UseWaitCursor = false;
}
DialogResult = DialogResult.OK;
}
}
}

View file

@ -0,0 +1,408 @@
<?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>
<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

@ -0,0 +1,65 @@
using System;
using System.Runtime.InteropServices;
namespace Discord_Media_Loader.Helper
{
internal static class TaskBarProgress
{
internal enum TaskbarStates
{
NoProgress = 0,
Indeterminate = 0x1,
Normal = 0x2,
Error = 0x4,
Paused = 0x8
}
[ComImport]
[Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface ITaskbarList3
{
// ITaskbarList
[PreserveSig]
void HrInit();
[PreserveSig]
void AddTab(IntPtr hwnd);
[PreserveSig]
void DeleteTab(IntPtr hwnd);
[PreserveSig]
void ActivateTab(IntPtr hwnd);
[PreserveSig]
void SetActiveAlt(IntPtr hwnd);
// ITaskbarList2
[PreserveSig]
void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);
// ITaskbarList3
[PreserveSig]
void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);
[PreserveSig]
void SetProgressState(IntPtr hwnd, TaskbarStates state);
}
[Guid("56FDF344-FD6D-11d0-958A-006097C9A090")]
[ClassInterface(ClassInterfaceType.None)]
[ComImport]
private class TaskbarInstance
{
}
private static ITaskbarList3 taskbarInstance = (ITaskbarList3)new TaskbarInstance();
private static bool taskbarSupported = Environment.OSVersion.Version >= new Version(6, 1);
internal static void SetState(IntPtr windowHandle, TaskbarStates taskbarState)
{
if (taskbarSupported) taskbarInstance.SetProgressState(windowHandle, taskbarState);
}
internal static void SetValue(IntPtr windowHandle, double progressValue, double progressMax)
{
if (taskbarSupported) taskbarInstance.SetProgressValue(windowHandle, (ulong)progressValue, (ulong)progressMax);
}
}
}

View file

@ -0,0 +1,39 @@
using System;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Octokit;
namespace Discord_Media_Loader.Helper
{
internal class VersionHelper
{
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()
{
var github = new GitHubClient(new ProductHeaderValue("DiscordMedialLoader"));
var tag =
(await github.Repository.Release.GetAll("Serraniel", "DiscordMediaLoader")).Where(x => x.Prerelease == false).OrderByDescending(x => x.CreatedAt).First().TagName.Replace("v", "") ?? "";
var version = new Version(tag);
return version;
}
internal static async Task<string> DownloadLatestReleaseVersion()
{
return await DownloadVersion(await GetReleaseVersion());
}
internal static async Task<string> DownloadVersion(Version version)
{
var github = new GitHubClient(new ProductHeaderValue("DiscordMediaLoader"));
var releaseVersion = (from release in (await github.Repository.Release.GetAll("Serraniel", "DiscordMediaLoader")) where release.TagName == $"v{version.Major}.{version.Minor}.{version.Build}.{version.Revision}" select release).First();
return releaseVersion.Assets.FirstOrDefault()?.BrowserDownloadUrl;
}
}
}

View file

@ -1,127 +0,0 @@
namespace Discord_Media_Loader
{
partial class LoginForm
{
/// <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(LoginForm));
this.lbEmail = new System.Windows.Forms.Label();
this.lbPassword = new System.Windows.Forms.Label();
this.tbxEmail = new System.Windows.Forms.TextBox();
this.tbxPassword = new System.Windows.Forms.TextBox();
this.btnLogin = new System.Windows.Forms.Button();
this.btnAbort = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// lbEmail
//
this.lbEmail.AutoSize = true;
this.lbEmail.Location = new System.Drawing.Point(12, 9);
this.lbEmail.Name = "lbEmail";
this.lbEmail.Size = new System.Drawing.Size(35, 13);
this.lbEmail.TabIndex = 0;
this.lbEmail.Text = "Email:";
//
// lbPassword
//
this.lbPassword.AutoSize = true;
this.lbPassword.Location = new System.Drawing.Point(12, 35);
this.lbPassword.Name = "lbPassword";
this.lbPassword.Size = new System.Drawing.Size(56, 13);
this.lbPassword.TabIndex = 1;
this.lbPassword.Text = "Password:";
//
// tbxEmail
//
this.tbxEmail.Location = new System.Drawing.Point(79, 6);
this.tbxEmail.Name = "tbxEmail";
this.tbxEmail.Size = new System.Drawing.Size(204, 20);
this.tbxEmail.TabIndex = 2;
this.tbxEmail.KeyUp += new System.Windows.Forms.KeyEventHandler(this.tbx_KeyUp);
//
// tbxPassword
//
this.tbxPassword.Location = new System.Drawing.Point(79, 32);
this.tbxPassword.Name = "tbxPassword";
this.tbxPassword.PasswordChar = '•';
this.tbxPassword.Size = new System.Drawing.Size(204, 20);
this.tbxPassword.TabIndex = 3;
this.tbxPassword.KeyUp += new System.Windows.Forms.KeyEventHandler(this.tbx_KeyUp);
//
// btnLogin
//
this.btnLogin.Location = new System.Drawing.Point(127, 78);
this.btnLogin.Name = "btnLogin";
this.btnLogin.Size = new System.Drawing.Size(75, 23);
this.btnLogin.TabIndex = 4;
this.btnLogin.Text = "&Login";
this.btnLogin.UseVisualStyleBackColor = true;
this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
//
// btnAbort
//
this.btnAbort.Location = new System.Drawing.Point(208, 78);
this.btnAbort.Name = "btnAbort";
this.btnAbort.Size = new System.Drawing.Size(75, 23);
this.btnAbort.TabIndex = 5;
this.btnAbort.Text = "&Abort";
this.btnAbort.UseVisualStyleBackColor = true;
this.btnAbort.Click += new System.EventHandler(this.btnAbort_Click);
//
// LoginForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(296, 114);
this.Controls.Add(this.btnAbort);
this.Controls.Add(this.btnLogin);
this.Controls.Add(this.tbxPassword);
this.Controls.Add(this.tbxEmail);
this.Controls.Add(this.lbPassword);
this.Controls.Add(this.lbEmail);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "LoginForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Login";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lbEmail;
private System.Windows.Forms.Label lbPassword;
private System.Windows.Forms.TextBox tbxEmail;
private System.Windows.Forms.TextBox tbxPassword;
private System.Windows.Forms.Button btnLogin;
private System.Windows.Forms.Button btnAbort;
}
}

View file

@ -1,46 +0,0 @@
using System;
using System.Windows.Forms;
namespace Discord_Media_Loader
{
public partial class LoginForm : Form
{
public static bool Exec(ref string email, out string password)
{
var loginForm = new LoginForm { tbxEmail = { Text = email } };
password = "";
if (loginForm.ShowDialog() == DialogResult.OK)
{
email = loginForm.tbxEmail.Text;
password = loginForm.tbxPassword.Text;
return true;
}
return false;
}
public LoginForm()
{
InitializeComponent();
}
private void btnAbort_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Abort;
}
private void btnLogin_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
}
private void tbx_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return)
DialogResult = DialogResult.OK;
else if (e.KeyCode == Keys.Escape)
DialogResult = DialogResult.Abort;
}
}
}

View file

@ -1,310 +0,0 @@
namespace Discord_Media_Loader
{
partial class MainForm
{
/// <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(MainForm));
this.lbPath = new System.Windows.Forms.Label();
this.btnSearch = new System.Windows.Forms.Button();
this.tbxPath = new System.Windows.Forms.TextBox();
this.dtpLimit = new System.Windows.Forms.DateTimePicker();
this.btnDownload = new System.Windows.Forms.Button();
this.cbLimitDate = new System.Windows.Forms.CheckBox();
this.lbThread = new System.Windows.Forms.Label();
this.cbChannels = new System.Windows.Forms.ComboBox();
this.nupThreadCount = new System.Windows.Forms.NumericUpDown();
this.lbChannel = new System.Windows.Forms.Label();
this.lbScanCount = new System.Windows.Forms.Label();
this.lbUsername = new System.Windows.Forms.Label();
this.lbDownload = new System.Windows.Forms.Label();
this.cbGuilds = new System.Windows.Forms.ComboBox();
this.lbGuild = new System.Windows.Forms.Label();
this.cbSkip = new System.Windows.Forms.CheckBox();
this.lbCopyright = new System.Windows.Forms.Label();
this.lbGithub = new System.Windows.Forms.LinkLabel();
this.lbAbout = new System.Windows.Forms.LinkLabel();
this.lbVersion = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.nupThreadCount)).BeginInit();
this.SuspendLayout();
//
// lbPath
//
this.lbPath.AutoSize = true;
this.lbPath.Location = new System.Drawing.Point(12, 110);
this.lbPath.Name = "lbPath";
this.lbPath.Size = new System.Drawing.Size(32, 13);
this.lbPath.TabIndex = 8;
this.lbPath.Text = "Path:";
//
// btnSearch
//
this.btnSearch.Location = new System.Drawing.Point(403, 105);
this.btnSearch.Name = "btnSearch";
this.btnSearch.Size = new System.Drawing.Size(25, 23);
this.btnSearch.TabIndex = 9;
this.btnSearch.Text = "...";
this.btnSearch.UseVisualStyleBackColor = true;
this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
//
// tbxPath
//
this.tbxPath.Location = new System.Drawing.Point(50, 107);
this.tbxPath.Name = "tbxPath";
this.tbxPath.Size = new System.Drawing.Size(342, 20);
this.tbxPath.TabIndex = 7;
//
// dtpLimit
//
this.dtpLimit.Format = System.Windows.Forms.DateTimePickerFormat.Short;
this.dtpLimit.Location = new System.Drawing.Point(158, 70);
this.dtpLimit.Name = "dtpLimit";
this.dtpLimit.Size = new System.Drawing.Size(95, 20);
this.dtpLimit.TabIndex = 6;
//
// btnDownload
//
this.btnDownload.Location = new System.Drawing.Point(12, 167);
this.btnDownload.Name = "btnDownload";
this.btnDownload.Size = new System.Drawing.Size(415, 23);
this.btnDownload.TabIndex = 20;
this.btnDownload.Text = "Start downloading";
this.btnDownload.UseVisualStyleBackColor = true;
this.btnDownload.Click += new System.EventHandler(this.btnDownload_Click);
//
// cbLimitDate
//
this.cbLimitDate.AutoSize = true;
this.cbLimitDate.Checked = true;
this.cbLimitDate.CheckState = System.Windows.Forms.CheckState.Checked;
this.cbLimitDate.Location = new System.Drawing.Point(15, 73);
this.cbLimitDate.Name = "cbLimitDate";
this.cbLimitDate.Size = new System.Drawing.Size(137, 17);
this.cbLimitDate.TabIndex = 5;
this.cbLimitDate.Text = "Only media posted after";
this.cbLimitDate.UseVisualStyleBackColor = true;
this.cbLimitDate.CheckedChanged += new System.EventHandler(this.cbLimitDate_CheckedChanged);
//
// lbThread
//
this.lbThread.AutoSize = true;
this.lbThread.Location = new System.Drawing.Point(12, 141);
this.lbThread.Name = "lbThread";
this.lbThread.Size = new System.Drawing.Size(64, 13);
this.lbThread.TabIndex = 11;
this.lbThread.Text = "Thread limit:";
//
// cbChannels
//
this.cbChannels.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbChannels.FormattingEnabled = true;
this.cbChannels.Location = new System.Drawing.Point(264, 32);
this.cbChannels.Name = "cbChannels";
this.cbChannels.Size = new System.Drawing.Size(164, 21);
this.cbChannels.TabIndex = 4;
//
// nupThreadCount
//
this.nupThreadCount.Location = new System.Drawing.Point(82, 139);
this.nupThreadCount.Name = "nupThreadCount";
this.nupThreadCount.Size = new System.Drawing.Size(70, 20);
this.nupThreadCount.TabIndex = 12;
this.nupThreadCount.Value = new decimal(new int[] {
50,
0,
0,
0});
//
// lbChannel
//
this.lbChannel.AutoSize = true;
this.lbChannel.Location = new System.Drawing.Point(224, 38);
this.lbChannel.Name = "lbChannel";
this.lbChannel.Size = new System.Drawing.Size(34, 13);
this.lbChannel.TabIndex = 3;
this.lbChannel.Text = "Guild:";
//
// lbScanCount
//
this.lbScanCount.AutoSize = true;
this.lbScanCount.Location = new System.Drawing.Point(12, 203);
this.lbScanCount.Name = "lbScanCount";
this.lbScanCount.Size = new System.Drawing.Size(102, 13);
this.lbScanCount.TabIndex = 13;
this.lbScanCount.Text = "Messages scanned:";
//
// lbUsername
//
this.lbUsername.AutoSize = true;
this.lbUsername.Location = new System.Drawing.Point(12, 9);
this.lbUsername.Name = "lbUsername";
this.lbUsername.Size = new System.Drawing.Size(58, 13);
this.lbUsername.TabIndex = 2;
this.lbUsername.Text = "Username:";
//
// lbDownload
//
this.lbDownload.AutoSize = true;
this.lbDownload.Location = new System.Drawing.Point(234, 203);
this.lbDownload.Name = "lbDownload";
this.lbDownload.Size = new System.Drawing.Size(92, 13);
this.lbDownload.TabIndex = 14;
this.lbDownload.Text = "Files downloaded:";
//
// cbGuilds
//
this.cbGuilds.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbGuilds.FormattingEnabled = true;
this.cbGuilds.Location = new System.Drawing.Point(52, 32);
this.cbGuilds.Name = "cbGuilds";
this.cbGuilds.Size = new System.Drawing.Size(164, 21);
this.cbGuilds.TabIndex = 1;
this.cbGuilds.SelectedIndexChanged += new System.EventHandler(this.cbGuilds_SelectedIndexChanged);
//
// lbGuild
//
this.lbGuild.AutoSize = true;
this.lbGuild.Location = new System.Drawing.Point(12, 35);
this.lbGuild.Name = "lbGuild";
this.lbGuild.Size = new System.Drawing.Size(34, 13);
this.lbGuild.TabIndex = 0;
this.lbGuild.Text = "Guild:";
//
// cbSkip
//
this.cbSkip.AutoSize = true;
this.cbSkip.Checked = true;
this.cbSkip.CheckState = System.Windows.Forms.CheckState.Checked;
this.cbSkip.Location = new System.Drawing.Point(227, 141);
this.cbSkip.Name = "cbSkip";
this.cbSkip.Size = new System.Drawing.Size(106, 17);
this.cbSkip.TabIndex = 16;
this.cbSkip.Text = "Skip existing files";
this.cbSkip.UseVisualStyleBackColor = true;
//
// lbCopyright
//
this.lbCopyright.AutoSize = true;
this.lbCopyright.Location = new System.Drawing.Point(12, 274);
this.lbCopyright.Name = "lbCopyright";
this.lbCopyright.Size = new System.Drawing.Size(151, 13);
this.lbCopyright.TabIndex = 22;
this.lbCopyright.Text = "Copyright (c) 2017 by Serraniel";
//
// lbGithub
//
this.lbGithub.AutoSize = true;
this.lbGithub.Location = new System.Drawing.Point(169, 274);
this.lbGithub.Name = "lbGithub";
this.lbGithub.Size = new System.Drawing.Size(40, 13);
this.lbGithub.TabIndex = 23;
this.lbGithub.TabStop = true;
this.lbGithub.Text = "GitHub";
this.lbGithub.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lbGithub_LinkClicked);
//
// lbAbout
//
this.lbAbout.AutoSize = true;
this.lbAbout.Location = new System.Drawing.Point(223, 274);
this.lbAbout.Name = "lbAbout";
this.lbAbout.Size = new System.Drawing.Size(35, 13);
this.lbAbout.TabIndex = 24;
this.lbAbout.TabStop = true;
this.lbAbout.Text = "About";
this.lbAbout.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lbAbout_LinkClicked);
//
// lbVersion
//
this.lbVersion.Location = new System.Drawing.Point(328, 274);
this.lbVersion.Name = "lbVersion";
this.lbVersion.Size = new System.Drawing.Size(100, 13);
this.lbVersion.TabIndex = 25;
this.lbVersion.Text = "version";
this.lbVersion.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(439, 296);
this.Controls.Add(this.lbVersion);
this.Controls.Add(this.lbAbout);
this.Controls.Add(this.lbGithub);
this.Controls.Add(this.lbCopyright);
this.Controls.Add(this.cbSkip);
this.Controls.Add(this.lbDownload);
this.Controls.Add(this.lbScanCount);
this.Controls.Add(this.nupThreadCount);
this.Controls.Add(this.lbThread);
this.Controls.Add(this.btnDownload);
this.Controls.Add(this.tbxPath);
this.Controls.Add(this.lbPath);
this.Controls.Add(this.btnSearch);
this.Controls.Add(this.dtpLimit);
this.Controls.Add(this.cbLimitDate);
this.Controls.Add(this.cbChannels);
this.Controls.Add(this.lbChannel);
this.Controls.Add(this.lbUsername);
this.Controls.Add(this.cbGuilds);
this.Controls.Add(this.lbGuild);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Discord Media Loader";
this.Shown += new System.EventHandler(this.MainForm_Shown);
((System.ComponentModel.ISupportInitialize)(this.nupThreadCount)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lbPath;
private System.Windows.Forms.Button btnSearch;
private System.Windows.Forms.TextBox tbxPath;
private System.Windows.Forms.DateTimePicker dtpLimit;
private System.Windows.Forms.Button btnDownload;
private System.Windows.Forms.CheckBox cbLimitDate;
private System.Windows.Forms.Label lbThread;
private System.Windows.Forms.ComboBox cbChannels;
private System.Windows.Forms.NumericUpDown nupThreadCount;
private System.Windows.Forms.Label lbChannel;
private System.Windows.Forms.Label lbScanCount;
private System.Windows.Forms.Label lbUsername;
private System.Windows.Forms.Label lbDownload;
private System.Windows.Forms.ComboBox cbGuilds;
private System.Windows.Forms.Label lbGuild;
private System.Windows.Forms.CheckBox cbSkip;
private System.Windows.Forms.Label lbCopyright;
private System.Windows.Forms.LinkLabel lbGithub;
private System.Windows.Forms.LinkLabel lbAbout;
private System.Windows.Forms.Label lbVersion;
}
}

View file

@ -1,297 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
using Discord;
using Discord.Net;
using ConnectionState = Discord.ConnectionState;
namespace Discord_Media_Loader
{
public partial class MainForm : Form
{
private DiscordClient Client { get; } = new DiscordClient();
private event EventHandler<UpdateProgessEventArgs> UpdateProgress;
private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public MainForm()
{
InitializeComponent();
UpdateProgress += (s, e) =>
{
SetControlPropertyThreadSafe(lbDownload, "Text", $"Files downloaded: {e.Downloaded}");
SetControlPropertyThreadSafe(lbScanCount, "Text", $"Messages scanned: {e.Scanned}");
};
}
private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue);
private static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue)
{
if (control.InvokeRequired)
{
control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), control, propertyName, propertyValue);
}
else
{
control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new[] { propertyValue });
}
}
public async Task<bool> Login()
{
var email = Properties.Settings.Default.email;
var abort = false;
while (Client.State != ConnectionState.Connected && !abort)
{
string password;
if (LoginForm.Exec(ref email, out password))
{
try
{
Cursor = Cursors.WaitCursor;
try
{
await Client.Connect(email, password);
Properties.Settings.Default.email = email;
Properties.Settings.Default.Save();
}
finally
{
Cursor = Cursors.Default;
}
}
catch (HttpException)
{
// ignore http exception on invalid login
}
}
else
{
abort = true;
}
}
return !abort;
}
private async void MainForm_Shown(object sender, EventArgs e)
{
lbVersion.Text = $"v{Assembly.GetExecutingAssembly().GetName().Version}";
SetEnabled(false);
if (!await Login())
{
Close();
}
else
{
cbGuilds.Items.AddRange((from g in Client.Servers orderby g.Name select g.Name).ToArray());
cbGuilds.SelectedIndex = 0;
lbUsername.Text = $"Username: {Client.CurrentUser.Name}#{Client.CurrentUser.Discriminator}";
SetEnabled(true);
}
}
private Server FindServerByName(string name)
{
return (from s in Client.Servers where s.Name == name select s).FirstOrDefault();
}
private Channel FindChannelByName(Server server, string name)
{
return (from c in server.TextChannels where c.Name == name select c).FirstOrDefault();
}
private void SetEnabled(bool enabled)
{
foreach (Control c in Controls)
{
SetControlPropertyThreadSafe(c, "Enabled", enabled);
//c.Enabled = enabled;
}
}
private void cbGuilds_SelectedIndexChanged(object sender, EventArgs e)
{
Cursor = Cursors.WaitCursor;
try
{
Server guild = FindServerByName(cbGuilds.Text);
if (guild != null)
{
cbChannels.Items.Clear();
cbChannels.Items.AddRange((from c in guild.TextChannels orderby c.Position select c.Name).ToArray());
cbChannels.SelectedIndex = 0;
}
}
finally
{
Cursor = Cursors.Default;
}
}
private void cbLimitDate_CheckedChanged(object sender, EventArgs e)
{
dtpLimit.Enabled = cbLimitDate.Checked;
}
private void btnSearch_Click(object sender, EventArgs e)
{
var dlg = new FolderBrowserDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
tbxPath.Text = dlg.SelectedPath;
}
}
private void OnUpdateProgress(UpdateProgessEventArgs e)
{
EventHandler<UpdateProgessEventArgs> handler = UpdateProgress;
handler?.Invoke(this, e);
}
private static long DateTimeToUnixTimeStamp(DateTime dateTime)
{
TimeSpan elapsedTime = dateTime - Epoch;
return (long)elapsedTime.TotalSeconds;
}
private void btnDownload_Click(object sender, EventArgs e)
{
var path = tbxPath.Text;
var useStopDate = cbLimitDate.Checked;
var stopDate = dtpLimit.Value;
var threadLimit = nupThreadCount.Value;
var skipExisting = cbSkip.Checked;
if (!Directory.Exists(path))
{
MessageBox.Show("Please enter an existing directory.");
return;
}
SetEnabled(false);
var guild = FindServerByName(cbGuilds.Text);
var channel = FindChannelByName(guild, cbChannels.Text);
var clients = new List<WebClient>();
var limit = 100;
var stop = false;
var lastId = ulong.MaxValue;
var isFirst = true;
ulong msgScanCount = 0;
ulong downloadCount = 0;
var locker = new object();
Task.Run(async () =>
{
while (!stop)
{
Discord.Message[] messages;
if (isFirst)
messages = await channel.DownloadMessages(limit, null);
else
messages = await channel.DownloadMessages(limit, lastId);
isFirst = false;
foreach (var m in messages)
{
if (m.Id < lastId)
lastId = m.Id;
if (useStopDate && m.Timestamp < stopDate.Date)
{
stop = true;
continue;
}
foreach (var a in m.Attachments)
{
if (!path.EndsWith(@"\"))
path += @"\";
var fname = $"{guild.Name}_{channel.Name}_{DateTimeToUnixTimeStamp(m.Timestamp)}_{a.Filename}";
fname = Path.GetInvalidFileNameChars().Aggregate(fname, (current, c) => current.Replace(c, '-'));
fname = path + fname;
if (skipExisting && File.Exists(fname))
continue;
while (clients.Count >= threadLimit)
{
// wait
}
var wc = new WebClient();
clients.Add(wc);
wc.DownloadFileCompleted += (wcSender, wcE) =>
{
clients.Remove(wc);
lock (locker)
{
downloadCount++;
OnUpdateProgress(new UpdateProgessEventArgs() { Downloaded = downloadCount, Scanned = msgScanCount });
}
};
wc.DownloadFileAsync(new Uri(a.Url), fname);
}
msgScanCount++;
OnUpdateProgress(new UpdateProgessEventArgs() { Downloaded = downloadCount, Scanned = msgScanCount});
}
stop = stop || messages.Length < limit;
}
await Task.Run(() =>
{
while (clients.Count > 0)
{
// wait until download finished
}
});
Process.Start(path);
SetEnabled(true);
});
}
private void lbGithub_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://github.com/Serraniel/DiscordMediaLoader/releases");
}
private void lbAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
MessageBox.Show(Properties.Resources.AboutString);
}
}
internal class UpdateProgessEventArgs : EventArgs
{
internal ulong Scanned { get; set; }
internal ulong Downloaded { get; set; }
}
}

View file

@ -1,19 +1,28 @@
using System;
using System.Windows.Forms;
using DML.Application.Classes;
using Nito.AsyncEx;
namespace Discord_Media_Loader
{
static class Program
internal static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
private static void Main(string[] paramStrings)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
var splashScreen = new FrmSplash();
if (splashScreen.ShowDialog() == DialogResult.OK)
DoLaunch(paramStrings);
else
Application.Restart();
}
private static void DoLaunch(string[] paramStrings)
{
AsyncContext.Run(() => Core.Run(paramStrings));
}
}
}

View file

@ -1,4 +1,4 @@
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
@ -7,9 +7,9 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTitle("Discord Media Loader")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyCompany("Serraniel")]
[assembly: AssemblyProduct("Discord Media Loader")]
[assembly: AssemblyCopyright("Copyright © 2017 by Serraniel")]
[assembly: AssemblyCopyright("Copyright © 2017 - 2019 by Serraniel")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -19,7 +19,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("83e64057-7010-4df3-a011-f7e536508407")]
[assembly: Guid("edc92554-dbc1-4f9c-9317-379a8bf441e8")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.1.1.58")]
[assembly: AssemblyFileVersion("0.1.1.58")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]

View file

@ -61,19 +61,12 @@ namespace Discord_Media_Loader.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Discord Media Loader by Serraniel - Apache 2.0 License
///https://github.com/Serraniel/DiscordMediaLoader/
///
///Made with:
///Discord.Net (Copyright (c) 2015 RogueException - MIT License)
///Newtonsoft.Json (Copyright (c) 2007 James Newton-King - MIT License)
///Nito.AsyncEx (Copyright (c) 2014 StephenCleary - MIT License)
///RestSharp (Copyright (c) restsharp - Apache 2.0 License)
///WebSocket4Net (Copyright (c) kerryjiang - Apache 2.0 License) ähnelt.
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static string AboutString {
internal static System.Drawing.Bitmap Serraniel_Logo4_NO_BG {
get {
return ResourceManager.GetString("AboutString", resourceCulture);
object obj = ResourceManager.GetObject("Serraniel_Logo4_NO_BG", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}

View file

@ -117,15 +117,8 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AboutString" xml:space="preserve">
<value>Discord Media Loader by Serraniel - Apache 2.0 License
https://github.com/Serraniel/DiscordMediaLoader/
Made with:
Discord.Net (Copyright (c) 2015 RogueException - MIT License)
Newtonsoft.Json (Copyright (c) 2007 James Newton-King - MIT License)
Nito.AsyncEx (Copyright (c) 2014 StephenCleary - MIT License)
RestSharp (Copyright (c) restsharp - Apache 2.0 License)
WebSocket4Net (Copyright (c) kerryjiang - Apache 2.0 License)</value>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<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>
</data>
</root>

View file

@ -12,7 +12,7 @@ namespace Discord_Media_Loader.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@ -22,17 +22,5 @@ namespace Discord_Media_Loader.Properties {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string email {
get {
return ((string)(this["email"]));
}
set {
this["email"] = value;
}
}
}
}

View file

@ -1,9 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Discord_Media_Loader.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="email" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

View file

@ -1,8 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Discord.Net" version="0.9.6" 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" />
<package id="WebSocket4Net" version="0.14.1" targetFramework="net461" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net461" />
<package id="Microsoft.NETCore.Platforms" version="5.0.1" 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>

View file

@ -1 +1,37 @@
# 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.
**[Downloadlatest release](https://github.com/Serraniel/DiscordMediaLoader/releases)** or install with *winget*: `winget install -e --id Serraniel.DiscordMediaLoader`.
**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
Apache License 2.0
## Functionality
* Log into your discord account and gathering information about servers (guilds) and their channels
* Downloading attachments
* You can optionally specify a date. Only newer messages will be scanned
* You can specify a destination path
* You can specify amount of parallel workers
* You can skip existing for speeding up repeated scans (messages still must be scanned)
## Requirements
* [.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

216
install/install.iss Normal file
View file

@ -0,0 +1,216 @@
; 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

2
install/make_install.cmd Normal file
View file

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

View file

@ -0,0 +1,21 @@
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

@ -0,0 +1,21 @@
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
libs/Discord.Net Submodule

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