Compare commits

..

188 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 9e0f83e43b Update README.md
Added How To
2017-03-09 18:51:35 +01:00
48 changed files with 2515 additions and 605 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);
}
}
}
}

View file

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

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

View file

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

View file

@ -1,15 +1,8 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SweetLib.Utils.Logger;
using static SweetLib.Utils.Logger.Logger;
using SweetLib.Utils.Logger;
namespace DML.Application.Classes
{
internal class Settings
public class Settings
{
public int Id { get; } = 1; // using always unique ID
public string Email { get; set; }
@ -22,22 +15,23 @@ namespace DML.Application.Classes
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;
internal void Store()
public void Store()
{
Trace("Getting settings collection...");
Logger.Trace("Getting settings collection...");
var settingsDB = Core.Database.GetCollection<Settings>("settings");
Debug("Storing settings to database...");
Logger.Debug("Storing settings to database...");
if (settingsDB.Exists(_setting => _setting.Id == Id))
{
Trace("Updating existing value...");
Logger.Trace("Updating existing value...");
settingsDB.Update(this);
}
else
{
Trace("Adding new value...");
Logger.Trace("Adding new value...");
settingsDB.Insert(this);
}
}

View file

@ -11,6 +11,9 @@
<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>
@ -20,6 +23,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>8</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@ -28,56 +32,197 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>8</LangVersion>
</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="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="LiteDB, Version=3.1.0.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL">
<HintPath>..\packages\LiteDB.3.1.0\lib\net35\LiteDB.dll</HintPath>
<Private>True</Private>
<Reference 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="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="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="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.Net.Http" />
<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>
<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="Classes\Settings.cs" />
<Compile Include="Core.cs" />
<Compile Include="Dialogs\LoginDialog.cs">
<SubType>Form</SubType>
</Compile>
@ -90,6 +235,7 @@
<Compile Include="FrmInternalSplash.Designer.cs">
<DependentUpon>FrmInternalSplash.cs</DependentUpon>
</Compile>
<Compile Include="Helper\IdentifiedString.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
@ -102,6 +248,7 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Classes\Settings.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Dialogs\LoginDialog.resx">
@ -119,18 +266,41 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\SweetLib\SweetLib\SweetLib.csproj">
<Project>{02c1f8ef-32f2-4e77-a36d-79129402af37}</Project>
<Name>SweetLib</Name>
<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">

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

@ -30,25 +30,12 @@
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginDialog));
this.pnlButtons = new System.Windows.Forms.Panel();
this.tbcLoginMethods = new System.Windows.Forms.TabControl();
this.tpgToken = new System.Windows.Forms.TabPage();
this.tpgUserdata = new System.Windows.Forms.TabPage();
this.lbToken = new System.Windows.Forms.Label();
this.edToken = new System.Windows.Forms.TextBox();
this.lbHowToToken = new System.Windows.Forms.Label();
this.edEmail = new System.Windows.Forms.TextBox();
this.edPassword = new System.Windows.Forms.TextBox();
this.lbEmail = new System.Windows.Forms.Label();
this.lbPassword = new System.Windows.Forms.Label();
this.cbUseUserdata = new System.Windows.Forms.CheckBox();
this.cbSavePassword = new System.Windows.Forms.CheckBox();
this.lbUserdataHints = new System.Windows.Forms.Label();
this.btnOk = new System.Windows.Forms.Button();
this.btnAbort = new System.Windows.Forms.Button();
this.btnOk = new System.Windows.Forms.Button();
this.lbHowToToken = new System.Windows.Forms.Label();
this.edToken = new System.Windows.Forms.TextBox();
this.lbToken = new System.Windows.Forms.Label();
this.pnlButtons.SuspendLayout();
this.tbcLoginMethods.SuspendLayout();
this.tpgToken.SuspendLayout();
this.tpgUserdata.SuspendLayout();
this.SuspendLayout();
//
// pnlButtons
@ -57,149 +44,11 @@
this.pnlButtons.Controls.Add(this.btnAbort);
this.pnlButtons.Controls.Add(this.btnOk);
this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Bottom;
this.pnlButtons.Location = new System.Drawing.Point(0, 168);
this.pnlButtons.Location = new System.Drawing.Point(0, 189);
this.pnlButtons.Name = "pnlButtons";
this.pnlButtons.Size = new System.Drawing.Size(426, 51);
this.pnlButtons.TabIndex = 0;
//
// tbcLoginMethods
//
this.tbcLoginMethods.Controls.Add(this.tpgToken);
this.tbcLoginMethods.Controls.Add(this.tpgUserdata);
this.tbcLoginMethods.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbcLoginMethods.Location = new System.Drawing.Point(0, 0);
this.tbcLoginMethods.Name = "tbcLoginMethods";
this.tbcLoginMethods.SelectedIndex = 0;
this.tbcLoginMethods.Size = new System.Drawing.Size(426, 168);
this.tbcLoginMethods.TabIndex = 1;
//
// tpgToken
//
this.tpgToken.Controls.Add(this.lbHowToToken);
this.tpgToken.Controls.Add(this.edToken);
this.tpgToken.Controls.Add(this.lbToken);
this.tpgToken.Location = new System.Drawing.Point(4, 22);
this.tpgToken.Name = "tpgToken";
this.tpgToken.Padding = new System.Windows.Forms.Padding(3);
this.tpgToken.Size = new System.Drawing.Size(418, 142);
this.tpgToken.TabIndex = 0;
this.tpgToken.Text = "Token";
this.tpgToken.UseVisualStyleBackColor = true;
//
// tpgUserdata
//
this.tpgUserdata.Controls.Add(this.lbUserdataHints);
this.tpgUserdata.Controls.Add(this.cbSavePassword);
this.tpgUserdata.Controls.Add(this.cbUseUserdata);
this.tpgUserdata.Controls.Add(this.lbPassword);
this.tpgUserdata.Controls.Add(this.lbEmail);
this.tpgUserdata.Controls.Add(this.edPassword);
this.tpgUserdata.Controls.Add(this.edEmail);
this.tpgUserdata.Location = new System.Drawing.Point(4, 22);
this.tpgUserdata.Name = "tpgUserdata";
this.tpgUserdata.Padding = new System.Windows.Forms.Padding(3);
this.tpgUserdata.Size = new System.Drawing.Size(418, 142);
this.tpgUserdata.TabIndex = 1;
this.tpgUserdata.Text = "Userdata";
this.tpgUserdata.UseVisualStyleBackColor = true;
//
// lbToken
//
this.lbToken.AutoSize = true;
this.lbToken.Location = new System.Drawing.Point(3, 9);
this.lbToken.Name = "lbToken";
this.lbToken.Size = new System.Drawing.Size(66, 13);
this.lbToken.TabIndex = 0;
this.lbToken.Text = "Login token:";
//
// edToken
//
this.edToken.Location = new System.Drawing.Point(75, 6);
this.edToken.Name = "edToken";
this.edToken.Size = new System.Drawing.Size(335, 20);
this.edToken.TabIndex = 1;
//
// lbHowToToken
//
this.lbHowToToken.Location = new System.Drawing.Point(3, 52);
this.lbHowToToken.Name = "lbHowToToken";
this.lbHowToToken.Size = new System.Drawing.Size(412, 87);
this.lbHowToToken.TabIndex = 2;
this.lbHowToToken.Text = resources.GetString("lbHowToToken.Text");
//
// edEmail
//
this.edEmail.Location = new System.Drawing.Point(47, 6);
this.edEmail.Name = "edEmail";
this.edEmail.Size = new System.Drawing.Size(133, 20);
this.edEmail.TabIndex = 0;
//
// edPassword
//
this.edPassword.Location = new System.Drawing.Point(279, 6);
this.edPassword.Name = "edPassword";
this.edPassword.PasswordChar = '•';
this.edPassword.Size = new System.Drawing.Size(133, 20);
this.edPassword.TabIndex = 1;
//
// lbEmail
//
this.lbEmail.AutoSize = true;
this.lbEmail.Location = new System.Drawing.Point(6, 9);
this.lbEmail.Name = "lbEmail";
this.lbEmail.Size = new System.Drawing.Size(35, 13);
this.lbEmail.TabIndex = 2;
this.lbEmail.Text = "Email:";
//
// lbPassword
//
this.lbPassword.AutoSize = true;
this.lbPassword.Location = new System.Drawing.Point(217, 9);
this.lbPassword.Name = "lbPassword";
this.lbPassword.Size = new System.Drawing.Size(56, 13);
this.lbPassword.TabIndex = 3;
this.lbPassword.Text = "Password:";
//
// cbUseUserdata
//
this.cbUseUserdata.AutoSize = true;
this.cbUseUserdata.Location = new System.Drawing.Point(6, 32);
this.cbUseUserdata.Name = "cbUseUserdata";
this.cbUseUserdata.Size = new System.Drawing.Size(139, 17);
this.cbUseUserdata.TabIndex = 4;
this.cbUseUserdata.Text = "Use login with user data";
this.cbUseUserdata.UseVisualStyleBackColor = true;
//
// cbSavePassword
//
this.cbSavePassword.AutoSize = true;
this.cbSavePassword.Location = new System.Drawing.Point(313, 32);
this.cbSavePassword.Name = "cbSavePassword";
this.cbSavePassword.Size = new System.Drawing.Size(99, 17);
this.cbSavePassword.TabIndex = 5;
this.cbSavePassword.Text = "Save password";
this.cbSavePassword.UseVisualStyleBackColor = true;
//
// lbUserdataHints
//
this.lbUserdataHints.Location = new System.Drawing.Point(3, 52);
this.lbUserdataHints.Name = "lbUserdataHints";
this.lbUserdataHints.Size = new System.Drawing.Size(412, 87);
this.lbUserdataHints.TabIndex = 6;
this.lbUserdataHints.Text = "Login with email and password is not recommended. If you use two factor authentic" +
"ation this can cause a ban of your discord account.\r\n\r\nFor safety reasons we rec" +
"ommend to login with login token.";
//
// btnOk
//
this.btnOk.Location = new System.Drawing.Point(267, 16);
this.btnOk.Name = "btnOk";
this.btnOk.Size = new System.Drawing.Size(75, 23);
this.btnOk.TabIndex = 0;
this.btnOk.Text = "&Ok";
this.btnOk.UseVisualStyleBackColor = true;
this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
//
// btnAbort
//
this.btnAbort.Location = new System.Drawing.Point(348, 16);
@ -210,12 +59,50 @@
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, 219);
this.Controls.Add(this.tbcLoginMethods);
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")));
@ -227,32 +114,18 @@
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDialog_FormClosing);
this.Shown += new System.EventHandler(this.LoginDialog_Shown);
this.pnlButtons.ResumeLayout(false);
this.tbcLoginMethods.ResumeLayout(false);
this.tpgToken.ResumeLayout(false);
this.tpgToken.PerformLayout();
this.tpgUserdata.ResumeLayout(false);
this.tpgUserdata.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel pnlButtons;
private System.Windows.Forms.TabControl tbcLoginMethods;
private System.Windows.Forms.TabPage tpgToken;
private System.Windows.Forms.Button btnAbort;
private System.Windows.Forms.Button btnOk;
private System.Windows.Forms.Label lbHowToToken;
private System.Windows.Forms.TextBox edToken;
private System.Windows.Forms.Label lbToken;
private System.Windows.Forms.TabPage tpgUserdata;
private System.Windows.Forms.Button btnAbort;
private System.Windows.Forms.Button btnOk;
private System.Windows.Forms.Label lbUserdataHints;
private System.Windows.Forms.CheckBox cbSavePassword;
private System.Windows.Forms.CheckBox cbUseUserdata;
private System.Windows.Forms.Label lbPassword;
private System.Windows.Forms.Label lbEmail;
private System.Windows.Forms.TextBox edPassword;
private System.Windows.Forms.TextBox edEmail;
}
}

View file

@ -1,12 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DML.Application.Classes;
using static SweetLib.Utils.Logger.Logger;
namespace DML.Application.Dialogs
@ -22,12 +16,6 @@ namespace DML.Application.Dialogs
{
Trace("Login dialog shown.");
edToken.Text = Core.Settings.LoginToken;
edEmail.Text = Core.Settings.Email;
edPassword.Text = Core.Settings.Password;
cbUseUserdata.Checked = Core.Settings.UseUserData;
cbSavePassword.Checked = Core.Settings.SavePassword;
tbcLoginMethods.SelectedTab = Core.Settings.UseUserData ? tpgUserdata : tpgToken;
}
private void LoginDialog_FormClosing(object sender, FormClosingEventArgs e)
@ -38,10 +26,6 @@ namespace DML.Application.Dialogs
Debug("Adjusting login settings...");
Core.Settings.LoginToken = edToken.Text;
Core.Settings.Email = edEmail.Text;
Core.Settings.Password = edPassword.Text;
Core.Settings.UseUserData = cbUseUserdata.Checked;
Core.Settings.SavePassword = cbSavePassword.Checked;
Core.Settings.Store();
}

View file

@ -120,7 +120,9 @@
<data name="lbHowToToken.Text" xml:space="preserve">
<value>To find your login token please start Discord and press Ctrl + Shift + I shortcut. A browser inspector will open.
Navigate into the "Application" tab and select "Local Storage" / "https://discordapp.com". If the right site keeps blank use "Session Storage" instead.
Look for the token key and copy its value without the quotation marks.</value>
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">

View file

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

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

@ -31,6 +31,7 @@
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();
@ -46,17 +47,25 @@
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.lblVersionPlaceholder = new System.Windows.Forms.ToolStripStatusLabel();
this.lbVersion = new System.Windows.Forms.ToolStripStatusLabel();
this.btnDropDown = new System.Windows.Forms.ToolStripSplitButton();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.visitGithubToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tmrTriggerRefresh = new System.Windows.Forms.Timer(this.components);
this.pnlSettings.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.edThreadLimit)).BeginInit();
this.groupBox1.SuspendLayout();
@ -66,6 +75,7 @@
//
// 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);
@ -77,11 +87,22 @@
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(553, 93);
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;
@ -113,7 +134,7 @@
//
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(447, 42);
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;
@ -127,7 +148,7 @@
| 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(328, 20);
this.edNameScheme.Size = new System.Drawing.Size(435, 20);
this.edNameScheme.TabIndex = 4;
this.edNameScheme.TextChanged += new System.EventHandler(this.DoSomethingChanged);
//
@ -143,7 +164,7 @@
// 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(522, 11);
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;
@ -157,7 +178,7 @@
| 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(403, 20);
this.edOperatingFolder.Size = new System.Drawing.Size(540, 20);
this.edOperatingFolder.TabIndex = 1;
this.edOperatingFolder.TextChanged += new System.EventHandler(this.DoSomethingChanged);
//
@ -180,7 +201,7 @@
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(553, 57);
this.groupBox1.Size = new System.Drawing.Size(690, 57);
this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Add a job";
@ -188,7 +209,7 @@
// 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(481, 19);
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;
@ -203,7 +224,7 @@
this.cbChannel.FormattingEnabled = true;
this.cbChannel.Location = new System.Drawing.Point(294, 19);
this.cbChannel.Name = "cbChannel";
this.cbChannel.Size = new System.Drawing.Size(181, 21);
this.cbChannel.Size = new System.Drawing.Size(318, 21);
this.cbChannel.TabIndex = 3;
//
// lbChannel
@ -236,17 +257,57 @@
// 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, 311);
this.statusStrip.Location = new System.Drawing.Point(0, 393);
this.statusStrip.Name = "statusStrip";
this.statusStrip.Size = new System.Drawing.Size(553, 22);
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";
@ -257,6 +318,57 @@
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);
@ -264,7 +376,7 @@
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(553, 161);
this.groupBox2.Size = new System.Drawing.Size(690, 243);
this.groupBox2.TabIndex = 3;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Jobs";
@ -272,9 +384,9 @@
// btnDelete
//
this.btnDelete.Dock = System.Windows.Forms.DockStyle.Bottom;
this.btnDelete.Location = new System.Drawing.Point(3, 135);
this.btnDelete.Location = new System.Drawing.Point(3, 217);
this.btnDelete.Name = "btnDelete";
this.btnDelete.Size = new System.Drawing.Size(547, 23);
this.btnDelete.Size = new System.Drawing.Size(684, 23);
this.btnDelete.TabIndex = 1;
this.btnDelete.Text = "Delete selected";
this.btnDelete.UseVisualStyleBackColor = true;
@ -288,7 +400,7 @@
this.lbxJobs.FormattingEnabled = true;
this.lbxJobs.Location = new System.Drawing.Point(6, 19);
this.lbxJobs.Name = "lbxJobs";
this.lbxJobs.Size = new System.Drawing.Size(541, 108);
this.lbxJobs.Size = new System.Drawing.Size(678, 186);
this.lbxJobs.TabIndex = 0;
//
// tmrRefreshProgress
@ -297,48 +409,16 @@
this.tmrRefreshProgress.Interval = 500;
this.tmrRefreshProgress.Tick += new System.EventHandler(this.tmrRefreshProgress_Tick);
//
// lblVersionPlaceholder
// tmrTriggerRefresh
//
this.lblVersionPlaceholder.Name = "lblVersionPlaceholder";
this.lblVersionPlaceholder.Size = new System.Drawing.Size(271, 17);
this.lblVersionPlaceholder.Spring = true;
//
// lbVersion
//
this.lbVersion.Name = "lbVersion";
this.lbVersion.Size = new System.Drawing.Size(118, 17);
this.lbVersion.Text = "v https://github.com";
//
// btnDropDown
//
this.btnDropDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.btnDropDown.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.visitGithubToolStripMenuItem,
this.aboutToolStripMenuItem});
this.btnDropDown.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btnDropDown.Name = "btnDropDown";
this.btnDropDown.Size = new System.Drawing.Size(16, 20);
this.btnDropDown.Text = "Options";
//
// aboutToolStripMenuItem
//
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.aboutToolStripMenuItem.Text = "About";
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
//
// visitGithubToolStripMenuItem
//
this.visitGithubToolStripMenuItem.Name = "visitGithubToolStripMenuItem";
this.visitGithubToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.visitGithubToolStripMenuItem.Text = "Visit Github";
this.visitGithubToolStripMenuItem.Click += new System.EventHandler(this.visitGithubToolStripMenuItem_Click);
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(553, 333);
this.ClientSize = new System.Drawing.Size(690, 415);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.statusStrip);
this.Controls.Add(this.groupBox1);
@ -391,5 +471,14 @@
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

@ -1,22 +1,37 @@
using System.Diagnostics;
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
{
private bool IsInitialized { get; set; } = false;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Shown(object sender, System.EventArgs e)
private bool IsInitialized { get; set; }
private void MainForm_Shown(object sender, EventArgs e)
{
Trace("MainForm shown executed.");
RefreshComponents();
@ -45,7 +60,10 @@ namespace DML.Application
if (cbGuild.Items.Count == 0)
{
Trace("Adding guilds to component...");
cbGuild.Items.AddRange(Core.Client.Servers.OrderBy(g => g.Name).Select(g => g.Name).ToArray());
cbGuild.Items.AddRange(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.");
}
@ -54,14 +72,14 @@ namespace DML.Application
var oldIndex = lbxJobs.SelectedIndex;
lbxJobs.Items.Clear();
foreach (var job in Core.Scheduler.JobList)
{
lbxJobs.Items.Add(
$"{FindServerById(job.GuildId)?.Name}:{FindChannelById(FindServerById(job.GuildId), job.ChannelId)?.Name}");
}
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, System.EventArgs e)
private void DoSomethingChanged(object sender, EventArgs e)
{
Debug($"DoSomethingChanged excuted by {sender}.");
if (!IsInitialized)
@ -80,7 +98,7 @@ namespace DML.Application
Core.Settings.SkipExistingFiles = cbSkipExisting.Checked;
Trace("Updating thread limit...");
Core.Settings.ThreadLimit = (int)edThreadLimit.Value;
Core.Settings.ThreadLimit = (int) edThreadLimit.Value;
Trace("Storing new settings...");
Core.Settings.Store();
@ -88,7 +106,7 @@ namespace DML.Application
Info("New settings have been saved.");
}
private void btnSearchFolders_Click(object sender, System.EventArgs e)
private void btnSearchFolders_Click(object sender, EventArgs e)
{
Trace("Operating folder button pressed.");
using (var browserDialog = new FolderBrowserDialog())
@ -107,31 +125,31 @@ namespace DML.Application
}
}
private Server FindServerByName(string name)
private SocketGuild FindServerByName(string name)
{
Trace($"Trying to find server by name: {name}");
return (from s in Core.Client.Servers where s.Name == name select s).FirstOrDefault();
return (from s in DMLClient.Client.Guilds where s.Name == name select s).FirstOrDefault();
}
private Channel FindChannelByName(Server server, string name)
private SocketTextChannel FindChannelByName(SocketGuild server, string name)
{
Trace($"Trying to find channel in {server} by name: {name}");
return (from c in server.TextChannels where c.Name == name select c).FirstOrDefault();
}
private Server FindServerById(ulong id)
private SocketGuild FindServerById(ulong id)
{
Trace($"Trying to find server by Id: {id}");
return (from s in Core.Client.Servers where s.Id == id select s).FirstOrDefault();
return (from s in DMLClient.Client.Guilds where s.Id == id select s).FirstOrDefault();
}
private Channel FindChannelById(Server server, ulong id)
private SocketTextChannel FindChannelById(SocketGuild server, ulong id)
{
Trace($"Trying to find channel in {server} by id: {id}");
return (from c in server.TextChannels where c.Id == id select c).FirstOrDefault();
}
private void cbGuild_SelectedIndexChanged(object sender, System.EventArgs e)
private void cbGuild_SelectedIndexChanged(object sender, EventArgs e)
{
Trace("Guild index changed.");
Debug("Updating channel dropdown component...");
@ -139,7 +157,7 @@ namespace DML.Application
UseWaitCursor = true;
try
{
var guild = FindServerByName(cbGuild.Text);
var guild = FindServerById(((IdentifiedString<ulong>) cbGuild.SelectedItem).Id);
if (guild != null)
{
@ -147,7 +165,10 @@ namespace DML.Application
cbChannel.Items.Clear();
Trace("Adding new channels...");
cbChannel.Items.AddRange(guild.TextChannels.OrderBy(c => c.Position).Select(c => c.Name).ToArray());
cbChannel.Items.AddRange(guild.TextChannels.OrderBy(c => c.Position)
.Select(c => new IdentifiedString<ulong>(c.Id, c.Name)).ToArray());
Trace($"Added {cbChannel.Items.Count} channels.");
cbChannel.SelectedIndex = 0;
@ -165,12 +186,12 @@ namespace DML.Application
Debug("Finished updating channel dropdown component.");
}
private void btnAddJob_Click(object sender, System.EventArgs e)
private void btnAddJob_Click(object sender, EventArgs e)
{
var job = new Job
{
GuildId = FindServerByName(cbGuild.Text).Id,
ChannelId = FindChannelByName(FindServerByName(cbGuild.Text), cbChannel.Text).Id
GuildId = ((IdentifiedString<ulong>) cbGuild.SelectedItem).Id,
ChannelId = ((IdentifiedString<ulong>) cbChannel.SelectedItem).Id
};
if (!(from j in Core.Scheduler.JobList
@ -184,7 +205,7 @@ namespace DML.Application
RefreshComponents();
}
private void btnDelete_Click(object sender, System.EventArgs e)
private void btnDelete_Click(object sender, EventArgs e)
{
Trace("Deleting job pressed.");
@ -194,55 +215,85 @@ namespace DML.Application
MessageBox.Show("No job has been seleted.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
var jobNameData = lbxJobs.SelectedItem.ToString().Split(':');
var jobId = ((IdentifiedString<int>) lbxJobs.SelectedItem).Id;
var guildName = "";
for (var i = 0; i < jobNameData.Length - 1; i++)
guildName += jobNameData[i] + ":";
guildName = guildName.Substring(0, guildName.Length - 1);
var channelName = jobNameData[jobNameData.Length - 1];
var guild = FindServerByName(guildName);
var channel = FindChannelByName(guild, channelName);
foreach (var job in Core.Scheduler.JobList)
{
if (job.GuildId == guild.Id && job.ChannelId == channel.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();
break;
}
}
lbxJobs.SelectedIndex = -1;
RefreshComponents();
}
private void tmrRefreshProgress_Tick(object sender, System.EventArgs e)
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;
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, System.EventArgs e)
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show(Properties.Resources.AboutString);
MessageBox.Show(Resources.AboutString);
}
private void visitGithubToolStripMenuItem_Click(object sender, System.EventArgs e)
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

@ -123,6 +123,9 @@
<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>

View file

@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
@ -10,7 +9,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Serraniel")]
[assembly: AssemblyProduct("Discord Media Loader.Application")]
[assembly: AssemblyCopyright("Copyright © 2017 by Serraniel")]
[assembly: AssemblyCopyright("Copyright © 2017 - 2019 by Serraniel")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -32,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.99.148.0")]
[assembly: AssemblyFileVersion("0.99.148.0")]
[assembly: AssemblyVersion("1.5.3.0")]
[assembly: AssemblyFileVersion("1.5.3.0")]

View file

@ -19,7 +19,7 @@ namespace DML.Application.Properties {
// -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", "4.0.0.0")]
[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 {
@ -79,6 +79,34 @@ namespace DML.Application.Properties {
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die You can use the following placeholders for your filenames:
///
///%guild% -&gt; server name
///%channel% -&gt; channel name
///%timestamp% -&gt; message timestamp (Unix timestamp)
///%name% -&gt; attachment filename
///%username% -&gt; author username
///%nickname% -&gt; author nickname (if unassigned, username will be used)
///%id% -&gt; attachment id (given by Discord)
///%userid% -&gt; author id (given by discord) ähnelt.
/// </summary>
internal static string FileNameInfo {
get {
return ResourceManager.GetString("FileNameInfo", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap info_icon {
get {
object obj = ResourceManager.GetObject("info_icon", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>

View file

@ -129,9 +129,25 @@ 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)</value>
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>

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

@ -1,9 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Discord.Net" version="0.9.6" targetFramework="net461" />
<package id="LiteDB" version="3.1.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net461" />
<package id="Nito.AsyncEx" version="3.0.1" targetFramework="net461" />
<package id="RestSharp" version="105.2.3" targetFramework="net461" />
<package id="WebSocket4Net" version="0.14.1" targetFramework="net461" />
<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,13 +1,29 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26403.7
# 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", "{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("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SweetLib", "..\SweetLib\SweetLib\SweetLib.csproj", "{02C1F8EF-32F2-4E77-A36D-79129402AF37}"
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
@ -23,12 +39,52 @@ Global
{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
{02C1F8EF-32F2-4E77-A36D-79129402AF37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{02C1F8EF-32F2-4E77-A36D-79129402AF37}.Debug|Any CPU.Build.0 = Debug|Any CPU
{02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02C1F8EF-32F2-4E77-A36D-79129402AF37}.Release|Any CPU.Build.0 = Release|Any CPU
{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,6 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Interactive.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.6.0" newVersion="3.1.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.5.0" newVersion="1.2.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -13,6 +13,8 @@
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -40,34 +42,145 @@
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="Nito.AsyncEx, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll</HintPath>
<Private>True</Private>
<Reference 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="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.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.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="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="Octokit, Version=0.24.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Octokit.0.24.1-alpha0001\lib\net45\Octokit.dll</HintPath>
<Private>True</Private>
<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="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="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="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="FrmDownload.cs">
@ -128,6 +241,13 @@
</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

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

View file

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

View file

@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Octokit;
@ -13,12 +10,14 @@ namespace Discord_Media_Loader.Helper
{
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")).OrderByDescending(x => x.CreatedAt).First().TagName.Replace("v", "") ?? "";
(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;

View file

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

View file

@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
@ -10,7 +9,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[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("")]
@ -32,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.99.75.0")]
[assembly: AssemblyFileVersion("0.99.75.0")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]

View file

@ -1,5 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Nito.AsyncEx" version="3.0.1" targetFramework="net462" />
<package id="Octokit" version="0.24.1-alpha0001" targetFramework="net461" />
<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,7 +1,12 @@
# 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.
**[Download](https://github.com/Serraniel/DiscordMediaLoader/releases)**
**[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
@ -19,3 +24,14 @@ Apache License 2.0
## 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