Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 208d7638c9 | |||
| 26a74a9269 | |||
| ffa6692e07 | |||
| 44690f8e9d | |||
| 9aa9d5ab03 | |||
|
|
88ff621f22 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -362,5 +362,3 @@ MigrationBackup/
|
|||||||
|
|
||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
|
||||||
*.txt
|
|
||||||
1
.idea/.idea.SethDiscordBot/.idea/.name
generated
1
.idea/.idea.SethDiscordBot/.idea/.name
generated
@@ -1 +0,0 @@
|
|||||||
SethDiscordBot
|
|
||||||
10
.idea/.idea.SethDiscordBot/.idea/avalonia.xml
generated
10
.idea/.idea.SethDiscordBot/.idea/avalonia.xml
generated
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="AvaloniaProject">
|
|
||||||
<option name="projectPerEditor">
|
|
||||||
<map>
|
|
||||||
<entry key="Updater/MainWindow.axaml" value="Updater/Updater.csproj" />
|
|
||||||
</map>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
8
.idea/.idea.SethDiscordBot/.idea/indexLayout.xml
generated
8
.idea/.idea.SethDiscordBot/.idea/indexLayout.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="UserContentModel">
|
|
||||||
<attachedFolders />
|
|
||||||
<explicitIncludes />
|
|
||||||
<explicitExcludes />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="RiderProjectSettingsUpdater">
|
|
||||||
<option name="vcsConfiguration" value="2" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
6
.idea/.idea.SethDiscordBot/.idea/vcs.xml
generated
6
.idea/.idea.SethDiscordBot/.idea/vcs.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
106
.idea/.idea.SethDiscordBot/.idea/workspace.xml
generated
106
.idea/.idea.SethDiscordBot/.idea/workspace.xml
generated
@@ -1,106 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="AutoGeneratedRunConfigurationManager">
|
|
||||||
<projectFile pubXmlPath="DiscordBot/Properties/PublishProfiles/LinuxProfile.pubxml">DiscordBot/DiscordBot.csproj</projectFile>
|
|
||||||
<projectFile pubXmlPath="DiscordBot/Properties/PublishProfiles/WindowsBuild.pubxml">DiscordBot/DiscordBot.csproj</projectFile>
|
|
||||||
<projectFile>Updater/Updater.csproj</projectFile>
|
|
||||||
</component>
|
|
||||||
<component name="AutoImportSettings">
|
|
||||||
<option name="autoReloadType" value="SELECTIVE" />
|
|
||||||
</component>
|
|
||||||
<component name="ChangeListManager">
|
|
||||||
<list default="true" id="ab173b07-aba1-4bb8-94c1-ae9846bbdb0a" name="Changes" comment="">
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/.idea.SethDiscordBot/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.SethDiscordBot/.idea/workspace.xml" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/BUILDS/net6.0/PluginManager.dll" beforeDir="false" afterPath="$PROJECT_DIR$/BUILDS/net6.0/PluginManager.dll" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/DiscordBot/DiscordBot.csproj" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/DiscordBot.csproj" afterDir="false" />
|
|
||||||
</list>
|
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
||||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
||||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
||||||
</component>
|
|
||||||
<component name="MarkdownSettingsMigration">
|
|
||||||
<option name="stateVersion" value="1" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectId" id="2CUQteUHoNWL2Ok4DVEh1GfFaXk" />
|
|
||||||
<component name="ProjectViewState">
|
|
||||||
<option name="hideEmptyMiddlePackages" value="true" />
|
|
||||||
<option name="showLibraryContents" value="true" />
|
|
||||||
</component>
|
|
||||||
<component name="PropertiesComponent">{
|
|
||||||
"keyToString": {
|
|
||||||
"ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
|
||||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
|
||||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
||||||
"WebServerToolWindowFactoryState": "false",
|
|
||||||
"node.js.detected.package.eslint": "true",
|
|
||||||
"node.js.detected.package.tslint": "true",
|
|
||||||
"node.js.selected.package.eslint": "(autodetect)",
|
|
||||||
"node.js.selected.package.tslint": "(autodetect)",
|
|
||||||
"nodejs_package_manager_path": "npm",
|
|
||||||
"settings.editor.selected.configurable": "preferences.pluginManager",
|
|
||||||
"vue.rearranger.settings.migration": "true"
|
|
||||||
}
|
|
||||||
}</component>
|
|
||||||
<component name="RunManager" selected="Publish to IIS.DiscordBot: WindowsBuild">
|
|
||||||
<configuration name="DiscordBot: LinuxProfile" type="DotNetMsBuildPublish" factoryName="Publish to IIS">
|
|
||||||
<riderPublish publish_profile="LinuxProfile.pubxml" pubxml_path="$PROJECT_DIR$/DiscordBot/Properties/PublishProfiles/LinuxProfile.pubxml" uuid_high="612037599008934041" uuid_low="-9069359786678974134" />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
<configuration name="DiscordBot: WindowsBuild" type="DotNetMsBuildPublish" factoryName="Publish to IIS">
|
|
||||||
<riderPublish publish_profile="WindowsBuild.pubxml" pubxml_path="$PROJECT_DIR$/DiscordBot/Properties/PublishProfiles/WindowsBuild.pubxml" uuid_high="612037599008934041" uuid_low="-9069359786678974134" />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
<configuration name="Updater" type="DotNetProject" factoryName=".NET Project">
|
|
||||||
<option name="EXE_PATH" value="" />
|
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
|
||||||
<option name="WORKING_DIRECTORY" value="" />
|
|
||||||
<option name="PASS_PARENT_ENVS" value="1" />
|
|
||||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
|
||||||
<option name="USE_MONO" value="0" />
|
|
||||||
<option name="RUNTIME_ARGUMENTS" value="" />
|
|
||||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Updater/Updater.csproj" />
|
|
||||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
|
||||||
<option name="PROJECT_TFM" value="" />
|
|
||||||
<method v="2">
|
|
||||||
<option name="Build" />
|
|
||||||
</method>
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
||||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
|
||||||
<component name="TaskManager">
|
|
||||||
<task active="true" id="Default" summary="Default task">
|
|
||||||
<changelist id="ab173b07-aba1-4bb8-94c1-ae9846bbdb0a" name="Changes" comment="" />
|
|
||||||
<created>1658854902538</created>
|
|
||||||
<option name="number" value="Default" />
|
|
||||||
<option name="presentableId" value="Default" />
|
|
||||||
<updated>1658854902538</updated>
|
|
||||||
<workItem from="1658854908500" duration="1731000" />
|
|
||||||
<workItem from="1662205818938" duration="46000" />
|
|
||||||
<workItem from="1662205887643" duration="139000" />
|
|
||||||
</task>
|
|
||||||
<servers />
|
|
||||||
</component>
|
|
||||||
<component name="TypeScriptGeneratedFilesManager">
|
|
||||||
<option name="version" value="3" />
|
|
||||||
</component>
|
|
||||||
<component name="UnityCheckinConfiguration" checkUnsavedScenes="true" />
|
|
||||||
<component name="UnityUnitTestConfiguration" currentTestLauncher="NUnit" />
|
|
||||||
<component name="Vcs.Log.Tabs.Properties">
|
|
||||||
<option name="TAB_STATES">
|
|
||||||
<map>
|
|
||||||
<entry key="MAIN">
|
|
||||||
<value>
|
|
||||||
<State />
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</map>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
<component name="VcsManagerConfiguration">
|
|
||||||
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"rpc.enabled": true,
|
||||||
|
"discord.enabled": true
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
@@ -6,25 +6,12 @@
|
|||||||
"compilationOptions": {},
|
"compilationOptions": {},
|
||||||
"targets": {
|
"targets": {
|
||||||
".NETCoreApp,Version=v6.0": {
|
".NETCoreApp,Version=v6.0": {
|
||||||
"Music Commands/1.0.0": {
|
"MusicCommands/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"PluginManager": "1.0.0",
|
"PluginManager": "1.0.0"
|
||||||
"YoutubeExplode": "6.2.0"
|
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"Music Commands.dll": {}
|
"MusicCommands.dll": {}
|
||||||
}
|
|
||||||
},
|
|
||||||
"AngleSharp/0.17.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"System.Buffers": "4.5.1",
|
|
||||||
"System.Text.Encoding.CodePages": "5.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/AngleSharp.dll": {
|
|
||||||
"assemblyVersion": "0.17.0.0",
|
|
||||||
"fileVersion": "0.17.0.0"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Discord.Net/3.7.2": {
|
"Discord.Net/3.7.2": {
|
||||||
@@ -121,7 +108,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.NETCore.Platforms/5.0.0": {},
|
|
||||||
"Newtonsoft.Json/13.0.1": {
|
"Newtonsoft.Json/13.0.1": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
@@ -130,7 +116,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"System.Buffers/4.5.1": {},
|
|
||||||
"System.Collections.Immutable/5.0.0": {},
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
"System.Interactive.Async/5.0.0": {
|
"System.Interactive.Async/5.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -159,23 +144,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"System.Text.Encoding.CodePages/5.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.NETCore.Platforms": "5.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.ValueTuple/4.5.0": {},
|
"System.ValueTuple/4.5.0": {},
|
||||||
"YoutubeExplode/6.2.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"AngleSharp": "0.17.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net5.0/YoutubeExplode.dll": {
|
|
||||||
"assemblyVersion": "6.2.0.0",
|
|
||||||
"fileVersion": "6.2.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PluginManager/1.0.0": {
|
"PluginManager/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Discord.Net": "3.7.2"
|
"Discord.Net": "3.7.2"
|
||||||
@@ -187,18 +156,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libraries": {
|
"libraries": {
|
||||||
"Music Commands/1.0.0": {
|
"MusicCommands/1.0.0": {
|
||||||
"type": "project",
|
"type": "project",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AngleSharp/0.17.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-74haoXINcj4SdMsmiNzk+9VUwIX1U9P61O6AZd5Uao8SGNnJJB8Y/r8VJRc8orn4c7Vk/oURAKSNF9XcSDxbfA==",
|
|
||||||
"path": "anglesharp/0.17.0",
|
|
||||||
"hashPath": "anglesharp.0.17.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net/3.7.2": {
|
"Discord.Net/3.7.2": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
@@ -255,13 +217,6 @@
|
|||||||
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"Microsoft.NETCore.Platforms/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
|
|
||||||
"path": "microsoft.netcore.platforms/5.0.0",
|
|
||||||
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.1": {
|
"Newtonsoft.Json/13.0.1": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
@@ -269,13 +224,6 @@
|
|||||||
"path": "newtonsoft.json/13.0.1",
|
"path": "newtonsoft.json/13.0.1",
|
||||||
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"System.Buffers/4.5.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==",
|
|
||||||
"path": "system.buffers/4.5.1",
|
|
||||||
"hashPath": "system.buffers.4.5.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Collections.Immutable/5.0.0": {
|
"System.Collections.Immutable/5.0.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
@@ -304,13 +252,6 @@
|
|||||||
"path": "system.reactive/5.0.0",
|
"path": "system.reactive/5.0.0",
|
||||||
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"System.Text.Encoding.CodePages/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==",
|
|
||||||
"path": "system.text.encoding.codepages/5.0.0",
|
|
||||||
"hashPath": "system.text.encoding.codepages.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.ValueTuple/4.5.0": {
|
"System.ValueTuple/4.5.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
@@ -318,13 +259,6 @@
|
|||||||
"path": "system.valuetuple/4.5.0",
|
"path": "system.valuetuple/4.5.0",
|
||||||
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"YoutubeExplode/6.2.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-oH5kst4w1QkUwRjJco0alF57JOmFofSGlPkr4OniODB8R6MEyRWn1xFg3JS2wFYd6scZluoXRDhM3/uyUjO9/g==",
|
|
||||||
"path": "youtubeexplode/6.2.0",
|
|
||||||
"hashPath": "youtubeexplode.6.2.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"PluginManager/1.0.0": {
|
"PluginManager/1.0.0": {
|
||||||
"type": "project",
|
"type": "project",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
BIN
BUILDS/net6.0/MusicCommands.dll
Normal file
BIN
BUILDS/net6.0/MusicCommands.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
BUILDS/net6.0/Plugins/Commands/MusicCommands.dll
Normal file
BIN
BUILDS/net6.0/Plugins/Commands/MusicCommands.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -4,7 +4,7 @@
|
|||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<BaseOutputPath>bin\</BaseOutputPath>
|
<BaseOutputPath>..\DiscordBot\bin\Debug\net6.0\Data\Plugins\Commands\LevelingSystem</BaseOutputPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager;
|
using PluginManager;
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
@@ -12,23 +11,25 @@ internal class Level : DBCommand
|
|||||||
{
|
{
|
||||||
public string Command => "level";
|
public string Command => "level";
|
||||||
|
|
||||||
public List<string> Aliases => new() { "lvl" };
|
|
||||||
|
|
||||||
public string Description => "Display tour current level";
|
public string Description => "Display tour current level";
|
||||||
|
|
||||||
public string Usage => "level";
|
public string Usage => "level";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
if (!File.Exists(Config.GetValue<string>("LevelingSystemPath") + $"/{context.Message.Author.Id}.dat"))
|
if (!File.Exists(Config.GetValue<string>("LevelingSystemPath") + $"/{message.Author.Id}.dat"))
|
||||||
{
|
{
|
||||||
await context.Channel.SendMessageAsync("You are now unranked !");
|
await context.Channel.SendMessageAsync("You are now unranked !");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var user = await Functions.ConvertFromJson<User>(Config.GetValue<string>("LevelingSystemPath") + $"/{context.Message.Author.Id}.dat");
|
var user = await Functions.ConvertFromJson<User>(Config.GetValue<string>("LevelingSystemPath") + $"/{message.Author.Id}.dat");
|
||||||
if (user == null)
|
if (user == null)
|
||||||
{
|
{
|
||||||
await context.Channel.SendMessageAsync("You are now unranked !");
|
await context.Channel.SendMessageAsync("You are now unranked !");
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<BaseOutputPath>bin\</BaseOutputPath>
|
<BaseOutputPath></BaseOutputPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
23
CMD_Utils/Echo.cs
Normal file
23
CMD_Utils/Echo.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
|
internal class Echo : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "echo";
|
||||||
|
|
||||||
|
public string Description => "Replay with the same message";
|
||||||
|
|
||||||
|
public string Usage => "echo [message]";
|
||||||
|
|
||||||
|
public bool canUseDM => true;
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
var m = message.Content.Substring(6);
|
||||||
|
await message.Channel.SendMessageAsync(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,32 +1,30 @@
|
|||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace CMD_Utils;
|
namespace CMD_Utils;
|
||||||
|
|
||||||
internal class FlipCoin : DBCommand
|
internal class FlipCoin : DBCommand
|
||||||
{
|
{
|
||||||
public string Command => "flip";
|
public string Command => "flip";
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
public string Description => "Flip a coin";
|
public string Description => "Flip a coin";
|
||||||
|
|
||||||
public string Usage => "flip";
|
public string Usage => "flip";
|
||||||
|
|
||||||
|
public bool canUseDM => true;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
public async void ExecuteDM(SocketCommandContext context) => ExecuteServer(context);
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
|
||||||
{
|
{
|
||||||
var random = new System.Random();
|
var random = new System.Random();
|
||||||
var r = random.Next(1, 3);
|
var r = random.Next(1, 3);
|
||||||
if (r == 1)
|
if (r == 1)
|
||||||
await context.Message.Channel.SendMessageAsync("Heads");
|
await message.Channel.SendMessageAsync("Heads");
|
||||||
else
|
else
|
||||||
await context.Message.Channel.SendMessageAsync("Tails");
|
await message.Channel.SendMessageAsync("Tails");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
@@ -13,18 +11,21 @@ public class Poll : DBCommand
|
|||||||
{
|
{
|
||||||
public string Command => "poll";
|
public string Command => "poll";
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
public string Description => "Create a poll with options";
|
public string Description => "Create a poll with options";
|
||||||
|
|
||||||
public string Usage => "poll [This-is-question] [This-is-answer-1] [This-is-answer-2] ... ";
|
public string Usage => "poll [This-is-question] [This-is-answer-1] [This-is-answer-2] ... ";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
public bool requireAdmin => true;
|
public bool requireAdmin => true;
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
var question = context.Message.Content.Split(' ')[1].Replace('-', ' ');
|
if (isDM) return;
|
||||||
var answers = Functions.MergeStrings(context.Message.Content.Split(' '), 2).Split(' ');
|
var question = message.Content.Split(' ')[1].Replace('-', ' ');
|
||||||
|
var answers = Functions.MergeStrings(message.Content.Split(' '), 2).Split(' ');
|
||||||
var embedBuilder = new EmbedBuilder();
|
var embedBuilder = new EmbedBuilder();
|
||||||
embedBuilder.Title = question;
|
embedBuilder.Title = question;
|
||||||
var len = answers.Length;
|
var len = answers.Length;
|
||||||
|
|||||||
@@ -1,28 +1,24 @@
|
|||||||
using System.Collections.Generic;
|
using Discord.Commands;
|
||||||
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
public class Random : DBCommand
|
public class Random : DBCommand
|
||||||
{
|
{
|
||||||
public string Command => "random";
|
public string Command => "random";
|
||||||
|
|
||||||
public List<string> Aliases => new() { "rnd" };
|
|
||||||
|
|
||||||
public string Description => "random number between number1 and number2";
|
public string Description => "random number between number1 and number2";
|
||||||
|
|
||||||
public string Usage => "random [number1] [number2]";
|
public string Usage => "random [number1] [number2]";
|
||||||
|
|
||||||
|
public bool canUseDM => true;
|
||||||
|
public bool canUseServer => true;
|
||||||
public bool requireAdmin => false;
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
public async void ExecuteDM(SocketCommandContext context) => ExecuteServer(context);
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var msg = context.Message.Content;
|
var msg = message.Content;
|
||||||
var a = int.Parse(msg.Split(' ')[1]);
|
var a = int.Parse(msg.Split(' ')[1]);
|
||||||
var b = int.Parse(msg.Split(' ')[2]);
|
var b = int.Parse(msg.Split(' ')[2]);
|
||||||
|
|
||||||
@@ -33,11 +29,11 @@ public class Random : DBCommand
|
|||||||
b = temp;
|
b = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
await context.Message.Channel.SendMessageAsync("Your random generated number is " + new System.Random().Next(a, b));
|
await message.Channel.SendMessageAsync("Your random generated number is " + new System.Random().Next(a, b));
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
await context.Message.Channel.SendMessageAsync("Invalid numbers or no numbers:\nUsage: " + Usage);
|
await message.Channel.SendMessageAsync("Invalid numbers or no numbers:\nUsage: " + Usage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
DiscordBot.dll
Normal file
BIN
DiscordBot.dll
Normal file
Binary file not shown.
@@ -1,10 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
using Discord;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
using PluginManager.Loaders;
|
using PluginManager.Loaders;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
@@ -21,17 +17,25 @@ internal class Help : DBCommand
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Command => "help";
|
public string Command => "help";
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Command Description
|
/// Command Description
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Description => "This command allows you to check all loaded commands";
|
public string Description => "This command allows you to check all loadded commands";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Command usage
|
/// Command usage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Usage => "help <command>";
|
public string Usage => "help";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
|
||||||
|
/// </summary>
|
||||||
|
public bool canUseDM => true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command can be used in a server
|
||||||
|
/// </summary>
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check if the command require administrator to be executed
|
/// Check if the command require administrator to be executed
|
||||||
@@ -45,18 +49,18 @@ internal class Help : DBCommand
|
|||||||
/// <param name="message">The command message</param>
|
/// <param name="message">The command message</param>
|
||||||
/// <param name="client">The discord bot client</param>
|
/// <param name="client">The discord bot client</param>
|
||||||
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
|
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
|
||||||
public void ExecuteServer(SocketCommandContext context)
|
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
var args = Functions.GetArguments(context.Message);
|
var args = Functions.GetArguments(message);
|
||||||
if (args.Count != 0)
|
if (args.Count != 0)
|
||||||
{
|
{
|
||||||
foreach (var item in args)
|
foreach (var item in args)
|
||||||
{
|
{
|
||||||
var e = GenerateHelpCommand(item);
|
var e = GenerateHelpCommand(item);
|
||||||
if (e is null)
|
if (e != null)
|
||||||
context.Channel.SendMessageAsync("Unknown Command " + item);
|
|
||||||
else
|
|
||||||
context.Channel.SendMessageAsync(embed: e.Build());
|
context.Channel.SendMessageAsync(embed: e.Build());
|
||||||
|
else
|
||||||
|
context.Channel.SendMessageAsync("Unknown Command " + item);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -66,31 +70,30 @@ internal class Help : DBCommand
|
|||||||
|
|
||||||
var adminCommands = "";
|
var adminCommands = "";
|
||||||
var normalCommands = "";
|
var normalCommands = "";
|
||||||
|
var DMCommands = "";
|
||||||
|
|
||||||
foreach (var cmd in PluginLoader.Commands!)
|
foreach (var cmd in PluginLoader.Commands!)
|
||||||
{
|
{
|
||||||
|
if (cmd.canUseDM) DMCommands += cmd.Command + " ";
|
||||||
if (cmd.requireAdmin)
|
if (cmd.requireAdmin)
|
||||||
adminCommands += cmd.Command + " ";
|
adminCommands += cmd.Command + " ";
|
||||||
else
|
else if (cmd.canUseServer) normalCommands += cmd.Command + " ";
|
||||||
normalCommands += cmd.Command + " ";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
embedBuilder.AddField("Admin Commands", adminCommands);
|
embedBuilder.AddField("Admin Commands", adminCommands);
|
||||||
embedBuilder.AddField("Normal Commands", normalCommands);
|
embedBuilder.AddField("Normal Commands", normalCommands);
|
||||||
|
embedBuilder.AddField("DM Commands", DMCommands);
|
||||||
context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
||||||
}
|
}
|
||||||
|
|
||||||
private EmbedBuilder GenerateHelpCommand(string command)
|
private EmbedBuilder GenerateHelpCommand(string command)
|
||||||
{
|
{
|
||||||
var embedBuilder = new EmbedBuilder();
|
var embedBuilder = new EmbedBuilder();
|
||||||
var cmd = PluginLoader.Commands!.Find(p => p.Command == command || (p.Aliases is not null && p.Aliases.Contains(command)));
|
var cmd = PluginLoader.Commands.Find(p => p.Command == command);
|
||||||
if (cmd == null) return null;
|
if (cmd == null) return null;
|
||||||
|
|
||||||
embedBuilder.AddField("Usage", cmd.Usage);
|
embedBuilder.AddField("Usage", cmd.Usage);
|
||||||
embedBuilder.AddField("Description", cmd.Description);
|
embedBuilder.AddField("Description", cmd.Description);
|
||||||
if (cmd.Aliases is null)
|
|
||||||
return embedBuilder;
|
|
||||||
embedBuilder.AddField("Alias", cmd.Aliases.Count == 0 ? "-" : string.Join(", ", cmd.Aliases));
|
|
||||||
|
|
||||||
return embedBuilder;
|
return embedBuilder;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
@@ -18,8 +17,6 @@ internal class Restart : DBCommand
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Command => "restart";
|
public string Command => "restart";
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Command Description
|
/// Command Description
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -30,18 +27,32 @@ internal class Restart : DBCommand
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Usage => "restart [-p | -c | -args | -cmd] <args>";
|
public string Usage => "restart [-p | -c | -args | -cmd] <args>";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
|
||||||
|
/// </summary>
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command can be used in a server
|
||||||
|
/// </summary>
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check if the command require administrator to be executed
|
/// Check if the command require administrator to be executed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool requireAdmin => true;
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main body of the command
|
/// The main body of the command
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">The command context</param>
|
/// <param name="context">The command context</param>
|
||||||
public async void ExecuteServer(DiscordLibCommands.SocketCommandContext context)
|
/// <param name="message">The command message</param>
|
||||||
|
/// <param name="client">The discord bot client</param>
|
||||||
|
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
|
||||||
|
public async void Execute(DiscordLibCommands.SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
var args = Functions.GetArguments(context.Message);
|
if (!(message.Author as SocketGuildUser).hasPermission(DiscordLib.GuildPermission.Administrator)) return;
|
||||||
|
var args = Functions.GetArguments(message);
|
||||||
var OS = Functions.GetOperatingSystem();
|
var OS = Functions.GetOperatingSystem();
|
||||||
if (args.Count == 0)
|
if (args.Count == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager;
|
using PluginManager;
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
@@ -17,8 +14,6 @@ internal class Settings : DBCommand
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Command => "set";
|
public string Command => "set";
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Command Description
|
/// Command Description
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -29,6 +24,16 @@ internal class Settings : DBCommand
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Usage => "set [keyword] [new Value]";
|
public string Usage => "set [keyword] [new Value]";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
|
||||||
|
/// </summary>
|
||||||
|
public bool canUseDM => true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command can be used in a server
|
||||||
|
/// </summary>
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check if the command require administrator to be executed
|
/// Check if the command require administrator to be executed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -38,12 +43,15 @@ internal class Settings : DBCommand
|
|||||||
/// The main body of the command
|
/// The main body of the command
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">The command context</param>
|
/// <param name="context">The command context</param>
|
||||||
public async void Execute(SocketCommandContext context)
|
/// <param name="message">The command message</param>
|
||||||
|
/// <param name="client">The discord bot client</param>
|
||||||
|
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
var channel = context.Message.Channel;
|
var channel = message.Channel;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var content = context.Message.Content;
|
var content = message.Content;
|
||||||
var data = content.Split(' ');
|
var data = content.Split(' ');
|
||||||
var keyword = data[1];
|
var keyword = data[1];
|
||||||
if (keyword.ToLower() == "help")
|
if (keyword.ToLower() == "help")
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager;
|
using PluginManager;
|
||||||
|
|
||||||
using static PluginManager.Others.Functions;
|
using static PluginManager.Others.Functions;
|
||||||
|
|
||||||
namespace DiscordBot.Discord.Core;
|
namespace DiscordBot.Discord.Core;
|
||||||
@@ -63,9 +60,7 @@ internal class Boot
|
|||||||
/// <returns>Task</returns>
|
/// <returns>Task</returns>
|
||||||
public async Task Awake()
|
public async Task Awake()
|
||||||
{
|
{
|
||||||
DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true };
|
client = new DiscordSocketClient();
|
||||||
|
|
||||||
client = new DiscordSocketClient(config);
|
|
||||||
service = new CommandService();
|
service = new CommandService();
|
||||||
|
|
||||||
CommonTasks();
|
CommonTasks();
|
||||||
@@ -101,6 +96,16 @@ internal class Boot
|
|||||||
Console.Title = "ONLINE";
|
Console.Title = "ONLINE";
|
||||||
isReady = true;
|
isReady = true;
|
||||||
|
|
||||||
|
new Thread(() =>
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
Config.SaveConfig();
|
||||||
|
Thread.Sleep(10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).Start();
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,5 +146,4 @@ internal class Boot
|
|||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Loaders;
|
using PluginManager.Loaders;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
using PluginManager.Others.Permissions;
|
using PluginManager.Others.Permissions;
|
||||||
@@ -49,16 +47,13 @@ internal class CommandHandler
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (Message as SocketUserMessage == null)
|
if (Message as SocketUserMessage == null) return;
|
||||||
return;
|
|
||||||
|
|
||||||
var message = Message as SocketUserMessage;
|
var message = Message as SocketUserMessage;
|
||||||
|
|
||||||
if (message == null)
|
if (message == null) return;
|
||||||
return;
|
|
||||||
|
|
||||||
if (!message.Content.StartsWith(botPrefix))
|
if (!message.Content.StartsWith(botPrefix)) return;
|
||||||
return;
|
|
||||||
|
|
||||||
var argPos = 0;
|
var argPos = 0;
|
||||||
|
|
||||||
@@ -68,28 +63,69 @@ internal class CommandHandler
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.Author.IsBot)
|
if (message.Author.IsBot) return;
|
||||||
return;
|
|
||||||
|
|
||||||
var context = new SocketCommandContext(client, message);
|
var context = new SocketCommandContext(client, message);
|
||||||
|
|
||||||
await commandService.ExecuteAsync(context, argPos, null);
|
await commandService.ExecuteAsync(
|
||||||
|
context,
|
||||||
|
argPos,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
var plugin = PluginLoader.Commands!.Where(p => p.Command == message.Content.Split(' ')[0].Substring(botPrefix.Length) || (p.Aliases is not null && p.Aliases.Contains(message.Content.Split(' ')[0].Substring(botPrefix.Length)))).FirstOrDefault();
|
var plugin = PluginLoader.Commands!.Where(p => p.Command == message.Content.Split(' ')[0].Substring(botPrefix.Length)).FirstOrDefault();
|
||||||
|
|
||||||
if (plugin is null) throw new System.Exception("Failed to run command. !");
|
|
||||||
|
|
||||||
if (plugin.requireAdmin && !context.Message.Author.isAdmin())
|
if (plugin != null)
|
||||||
return;
|
{
|
||||||
|
if (message.Channel == await message.Author.CreateDMChannelAsync())
|
||||||
if (context.Channel is SocketDMChannel)
|
{
|
||||||
plugin.ExecuteDM(context);
|
if (plugin.canUseDM)
|
||||||
else plugin.ExecuteServer(context);
|
{
|
||||||
|
if (plugin.requireAdmin)
|
||||||
}
|
{
|
||||||
catch (System.Exception ex)
|
if (message.Author.isAdmin())
|
||||||
|
{
|
||||||
|
plugin.Execute(context, message, client, true);
|
||||||
|
Functions.WriteLogFile($"[{message.Author.Id}] Executed command (DM) : " + plugin.Command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await message.Channel.SendMessageAsync("This command is for administrators only !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.Execute(context, message, client, true);
|
||||||
|
Functions.WriteLogFile($"[{message.Author.Id}] Executed command (DM) : " + plugin.Command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await message.Channel.SendMessageAsync("This command is not for DMs");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.canUseServer)
|
||||||
|
{
|
||||||
|
if (plugin.requireAdmin)
|
||||||
|
{
|
||||||
|
if (message.Author.isAdmin())
|
||||||
|
{
|
||||||
|
plugin.Execute(context, message, client, false);
|
||||||
|
Functions.WriteLogFile($"[{message.Author.Id}] Executed command : " + plugin.Command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await message.Channel.SendMessageAsync("This command is for administrators only !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.Execute(context, message, client, false);
|
||||||
|
Functions.WriteLogFile($"[{message.Author.Id}] Executed command : " + plugin.Command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
{
|
{
|
||||||
ex.WriteErrFile();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<StartupObject />
|
<StartupObject />
|
||||||
<SignAssembly>False</SignAssembly>
|
<SignAssembly>False</SignAssembly>
|
||||||
<IsPublishable>True</IsPublishable>
|
<IsPublishable>True</IsPublishable>
|
||||||
<AssemblyVersion>1.0.0.11</AssemblyVersion>
|
<AssemblyVersion>1.0.0.1</AssemblyVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -1,16 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using Discord;
|
|
||||||
|
|
||||||
using DiscordBot.Discord.Core;
|
using DiscordBot.Discord.Core;
|
||||||
|
|
||||||
using PluginManager;
|
using PluginManager;
|
||||||
using PluginManager.Items;
|
using PluginManager.Items;
|
||||||
using PluginManager.Online;
|
using PluginManager.Online;
|
||||||
@@ -22,7 +15,6 @@ public class Program
|
|||||||
{
|
{
|
||||||
private static bool loadPluginsOnStartup;
|
private static bool loadPluginsOnStartup;
|
||||||
private static bool listPluginsAtStartup;
|
private static bool listPluginsAtStartup;
|
||||||
private static ConsoleCommandsHandler consoleCommandsHandler;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main entry point for the application.
|
/// The main entry point for the application.
|
||||||
@@ -31,42 +23,12 @@ public class Program
|
|||||||
[Obsolete]
|
[Obsolete]
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Loading resources ...");
|
|
||||||
|
|
||||||
Directory.CreateDirectory("./Data/Resources");
|
Directory.CreateDirectory("./Data/Resources");
|
||||||
Directory.CreateDirectory("./Data/Plugins/Commands");
|
Directory.CreateDirectory("./Data/Plugins/Commands");
|
||||||
Directory.CreateDirectory("./Data/Plugins/Events");
|
Directory.CreateDirectory("./Data/Plugins/Events");
|
||||||
PreLoadComponents().Wait();
|
PreLoadComponents().Wait();
|
||||||
do
|
|
||||||
{
|
|
||||||
if (!Config.ContainsKey("ServerID"))
|
|
||||||
{
|
|
||||||
|
|
||||||
|
if (!Config.ContainsKey("token") || Config.GetValue<string>("token") == null || Config.GetValue<string>("token")?.Length != 70)
|
||||||
Console.WriteLine("Please enter the server ID: ");
|
|
||||||
Console_Utilities.WriteColorText("You can find it in the Server Settings at &r\"Widget\"&c section");
|
|
||||||
Console.WriteLine("Example: 1234567890123456789");
|
|
||||||
|
|
||||||
Console.WriteLine("This is not required, but is recommended. If you refuse to provide the ID, just press enter.\nThe server id is required to make easier for the bot to interact with the server.\nRemember: this bot is for one server ONLY.");
|
|
||||||
Console.Write("User Input > ");
|
|
||||||
ConsoleKeyInfo key = Console.ReadKey();
|
|
||||||
if (key.Key == ConsoleKey.Enter)
|
|
||||||
Config.AddValueToVariables("ServerID", "null", false);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
string SID = key.KeyChar + Console.ReadLine();
|
|
||||||
if (SID.Length != 18)
|
|
||||||
{
|
|
||||||
Console.Clear();
|
|
||||||
Console_Utilities.WriteColorText("&rYour server ID is not 18 characters long. Please try again. \n");
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Config.AddValueToVariables("ServerID", SID, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Config.ContainsKey("token") || Config.GetValue<string>("token") == null || (Config.GetValue<string>("token")?.Length != 70 && Config.GetValue<string>("token")?.Length != 59))
|
|
||||||
{
|
{
|
||||||
Console.WriteLine("Please insert your token");
|
Console.WriteLine("Please insert your token");
|
||||||
Console.Write("Token = ");
|
Console.Write("Token = ");
|
||||||
@@ -74,31 +36,27 @@ public class Program
|
|||||||
if (token?.Length == 59 || token?.Length == 70)
|
if (token?.Length == 59 || token?.Length == 70)
|
||||||
Config.AddValueToVariables("token", token, true);
|
Config.AddValueToVariables("token", token, true);
|
||||||
else
|
else
|
||||||
{
|
Console.WriteLine("Invalid token");
|
||||||
Console.Clear();
|
|
||||||
Console_Utilities.WriteColorText("&rThe token length is invalid !");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Config.ContainsKey("prefix") || Config.GetValue<string>("prefix") == null || Config.GetValue<string>("prefix")?.Length != 1)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Please insert your prefix (max. 1 character long):");
|
Console.WriteLine("Please insert your prefix (max. 1 character long):");
|
||||||
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces, numbers, '/' or '\\' allowed");
|
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces or numbers allowed");
|
||||||
Console.Write("Prefix = ");
|
Console.Write("Prefix = ");
|
||||||
var prefix = Console.ReadLine()![0];
|
var prefix = Console.ReadLine()![0];
|
||||||
|
|
||||||
if (prefix == ' ' || char.IsDigit(prefix) || prefix == '/' || prefix == '\\')
|
if (prefix == ' ' || char.IsDigit(prefix)) return;
|
||||||
{
|
Config.AddValueToVariables("prefix", prefix.ToString(), false);
|
||||||
Console.Clear();
|
}
|
||||||
Console_Utilities.WriteColorText("&rThe prefix is invalid");
|
|
||||||
continue;
|
if (!Config.ContainsKey("prefix") || Config.GetValue<string>("prefix") == default)
|
||||||
}
|
{
|
||||||
|
Console.WriteLine("Please insert your prefix (max. 1 character long):");
|
||||||
|
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces or numbers allowed");
|
||||||
|
Console.Write("Prefix = ");
|
||||||
|
var prefix = Console.ReadLine()![0];
|
||||||
|
if (prefix == ' ') return;
|
||||||
Config.AddValueToVariables("prefix", prefix.ToString(), false);
|
Config.AddValueToVariables("prefix", prefix.ToString(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
|
||||||
} while (true);
|
|
||||||
|
|
||||||
HandleInput(args).Wait();
|
HandleInput(args).Wait();
|
||||||
}
|
}
|
||||||
@@ -107,28 +65,20 @@ public class Program
|
|||||||
/// The main loop for the discord bot
|
/// The main loop for the discord bot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="discordbooter">The discord booter used to start the application</param>
|
/// <param name="discordbooter">The discord booter used to start the application</param>
|
||||||
private static void NoGUI(Boot discordbooter)
|
private static Task NoGUI(Boot discordbooter)
|
||||||
{
|
{
|
||||||
|
var consoleCommandsHandler = new ConsoleCommandsHandler(discordbooter.client);
|
||||||
#if DEBUG
|
|
||||||
Console.WriteLine();
|
|
||||||
ConsoleCommandsHandler.ExecuteCommad("lp").Wait();
|
|
||||||
#else
|
|
||||||
if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp");
|
if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp");
|
||||||
if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs");
|
if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs");
|
||||||
#endif
|
|
||||||
Config.SaveConfig(SaveType.NORMAL).Wait();
|
Config.SaveConfig();
|
||||||
|
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
var cmd = Console.ReadLine();
|
var cmd = Console.ReadLine();
|
||||||
if (!consoleCommandsHandler.HandleCommand(cmd!
|
if (!consoleCommandsHandler.HandleCommand(cmd))
|
||||||
#if DEBUG
|
|
||||||
, false
|
|
||||||
#endif
|
|
||||||
|
|
||||||
) && cmd.Length > 0)
|
|
||||||
Console.WriteLine("Failed to run command " + cmd);
|
Console.WriteLine("Failed to run command " + cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,42 +92,21 @@ public class Program
|
|||||||
Console.Clear();
|
Console.Clear();
|
||||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
||||||
|
|
||||||
List<string> startupMessageList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage");
|
List<string> startupMessageList = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage");
|
||||||
|
|
||||||
foreach (var message in startupMessageList)
|
foreach (var message in startupMessageList) Console.WriteLine(message);
|
||||||
Console.WriteLine(message);
|
|
||||||
|
|
||||||
Console.WriteLine($"Running on version: {Config.GetValue<string>("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}");
|
Console.WriteLine($"Running on version: {Config.GetValue<string>("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}");
|
||||||
Console.WriteLine($"Git URL: {Config.GetValue<string>("GitURL") ?? " Could not find Git URL"}");
|
Console.WriteLine($"Git URL: {Config.GetValue<string>("GitURL") ?? " Could not find Git URL"}");
|
||||||
|
|
||||||
Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n");
|
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
|
||||||
if (Config.ContainsKey("LaunchMessage"))
|
|
||||||
{
|
|
||||||
Console_Utilities.WriteColorText(Config.GetValue<string>("LaunchMessage"));
|
|
||||||
Config.RemoveKey("LaunchMessage");
|
|
||||||
}
|
|
||||||
|
|
||||||
Console_Utilities.WriteColorText("Please note that the bot saves a backup save file every time you are using the shudown command (&ysd&c)");
|
|
||||||
Console.WriteLine($"============================ LOG ============================");
|
Console.WriteLine($"============================ LOG ============================");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var token = Config.GetValue<string>("token");
|
var token = Config.GetValue<string>("token");
|
||||||
#if DEBUG
|
|
||||||
Console.WriteLine("Starting in DEBUG MODE");
|
|
||||||
if (!Directory.Exists("./Data/BetaTest"))
|
|
||||||
Console.WriteLine("Failed to start in debug mode because the folder ./Data/BetaTest does not exist");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
token = File.ReadAllText("./Data/BetaTest/token.txt");
|
|
||||||
|
|
||||||
//Debug mode code...
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
var prefix = Config.GetValue<string>("prefix");
|
var prefix = Config.GetValue<string>("prefix");
|
||||||
|
|
||||||
var discordbooter = new Boot(token, prefix);
|
var discordbooter = new Boot(token, prefix);
|
||||||
await discordbooter.Awake();
|
await discordbooter.Awake();
|
||||||
return discordbooter;
|
return discordbooter;
|
||||||
@@ -212,7 +141,6 @@ public class Program
|
|||||||
/// <param name="args">The arguments</param>
|
/// <param name="args">The arguments</param>
|
||||||
private static async Task HandleInput(string[] args)
|
private static async Task HandleInput(string[] args)
|
||||||
{
|
{
|
||||||
|
|
||||||
var len = args.Length;
|
var len = args.Length;
|
||||||
|
|
||||||
if (len == 3 && args[0] == "/download")
|
if (len == 3 && args[0] == "/download")
|
||||||
@@ -225,72 +153,18 @@ public class Program
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len > 0 && args[0] == "/test")
|
|
||||||
{
|
|
||||||
int p = 1;
|
|
||||||
bool allowed = true;
|
|
||||||
Console.CancelKeyPress += (sender, e) => allowed = false;
|
|
||||||
Console_Utilities.ProgressBar bar = new(ProgressBarType.NO_END);// { NoColor = false, Color = ConsoleColor.DarkRed };
|
|
||||||
Console.WriteLine("Press Ctrl + C to stop.");
|
|
||||||
while (p <= int.MaxValue - 1 && allowed)
|
|
||||||
{
|
|
||||||
bar.Update(100 / p);
|
|
||||||
await Task.Delay(100);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage")))
|
if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage")))
|
||||||
{
|
{
|
||||||
if (args.Contains("lp") || args.Contains("loadplugins"))
|
if (args.Contains("lp") || args.Contains("loadplugins")) loadPluginsOnStartup = true;
|
||||||
loadPluginsOnStartup = true;
|
if (args.Contains("listplugs")) listPluginsAtStartup = true;
|
||||||
if (args.Contains("listplugs"))
|
|
||||||
listPluginsAtStartup = true;
|
|
||||||
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var b = await StartNoGUI();
|
|
||||||
consoleCommandsHandler = new ConsoleCommandsHandler(b.client);
|
|
||||||
|
|
||||||
if (len > 0 && args[0] == "/remplug")
|
|
||||||
{
|
|
||||||
|
|
||||||
string plugName = Functions.MergeStrings(args, 1);
|
|
||||||
Console.WriteLine("Starting to remove " + plugName);
|
|
||||||
await ConsoleCommandsHandler.ExecuteCommad("remplug " + plugName);
|
|
||||||
loadPluginsOnStartup = true;
|
|
||||||
len = 0;
|
len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (len == 0 || (args[0] != "--exec" && args[0] != "--execute"))
|
if (len == 0 || (args[0] != "--exec" && args[0] != "--execute"))
|
||||||
{
|
{
|
||||||
|
var b = await StartNoGUI();
|
||||||
Thread mainThread = new Thread(() =>
|
await NoGUI(b);
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
NoGUI(b);
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
if (ex.Message == "No process is on the other end of the pipe." || (uint)ex.HResult == 0x800700E9)
|
|
||||||
{
|
|
||||||
if (!Config.ContainsKey("LaunchMessage"))
|
|
||||||
Config.AddValueToVariables("LaunchMessage", "An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !", false);
|
|
||||||
Functions.WriteErrFile(ex.ToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
mainThread.Start();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,7 +190,15 @@ public class Program
|
|||||||
case "--help":
|
case "--help":
|
||||||
case "-help":
|
case "-help":
|
||||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
||||||
Console.WriteLine("\tCommand name\t\t\t\tDescription\n" + "-- help | -help\t\t ------ \tDisplay the help message\n" + "--reset-full\t\t ------ \tReset all files (clear files)\n" + "--reset-settings\t ------ \tReset only bot settings\n" + "--reset-logs\t\t ------ \tClear up the output folder\n" + "--start\t\t ------ \tStart the bot\n" + "exit\t\t\t ------ \tClose the application");
|
Console.WriteLine(
|
||||||
|
"\tCommand name\t\t\t\tDescription\n" +
|
||||||
|
"-- help | -help\t\t ------ \tDisplay the help message\n" +
|
||||||
|
"--reset-full\t\t ------ \tReset all files (clear files)\n" +
|
||||||
|
"--reset-settings\t ------ \tReset only bot settings\n" +
|
||||||
|
"--reset-logs\t\t ------ \tClear up the output folder\n" +
|
||||||
|
"--start\t\t ------ \tStart the bot\n" +
|
||||||
|
"exit\t\t\t ------ \tClose the application"
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
case "--reset-full":
|
case "--reset-full":
|
||||||
await ClearFolder("./Data/Resources/");
|
await ClearFolder("./Data/Resources/");
|
||||||
@@ -330,12 +212,16 @@ public class Program
|
|||||||
case "--reset-logs":
|
case "--reset-logs":
|
||||||
await ClearFolder("./Output/Logs");
|
await ClearFolder("./Output/Logs");
|
||||||
await ClearFolder("./Output/Errors");
|
await ClearFolder("./Output/Errors");
|
||||||
Console.WriteLine("Successfully clear logs folder");
|
Console.WriteLine("Successfully cleard logs folder");
|
||||||
break;
|
break;
|
||||||
case "--exit":
|
case "--exit":
|
||||||
case "exit":
|
case "exit":
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
break;
|
break;
|
||||||
|
case "--start":
|
||||||
|
var booter = await StartNoGUI();
|
||||||
|
await NoGUI(booter);
|
||||||
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Console.WriteLine("Failed to execute command " + message[0]);
|
Console.WriteLine("Failed to execute command " + message[0]);
|
||||||
@@ -346,21 +232,19 @@ public class Program
|
|||||||
|
|
||||||
private static async Task PreLoadComponents()
|
private static async Task PreLoadComponents()
|
||||||
{
|
{
|
||||||
Console_Utilities.ProgressBar main = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
|
|
||||||
main.Start();
|
|
||||||
await Config.LoadConfig();
|
await Config.LoadConfig();
|
||||||
if (Config.ContainsKey("DeleteLogsAtStartup"))
|
if (Config.ContainsKey("DeleteLogsAtStartup"))
|
||||||
if (Config.GetValue<bool>("DeleteLogsAtStartup"))
|
if (Config.GetValue<bool>("DeleteLogsAtStartup"))
|
||||||
foreach (var file in Directory.GetFiles("./Output/Logs/"))
|
foreach (var file in Directory.GetFiles("./Output/Logs/"))
|
||||||
File.Delete(file);
|
File.Delete(file);
|
||||||
List<string> OnlineDefaultKeys = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys");
|
List<string> OnlineDefaultKeys = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys");
|
||||||
|
|
||||||
Config.PluginConfig.Load();
|
Config.PluginConfig.Load();
|
||||||
|
|
||||||
if (!Config.ContainsKey("Version"))
|
if (!Config.ContainsKey("Version"))
|
||||||
Config.AddValueToVariables("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString(), false);
|
Config.AddValueToVariables("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), false);
|
||||||
else
|
else
|
||||||
Config.SetValue("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString());
|
Config.SetValue("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
|
||||||
|
|
||||||
foreach (var key in OnlineDefaultKeys)
|
foreach (var key in OnlineDefaultKeys)
|
||||||
{
|
{
|
||||||
@@ -368,8 +252,7 @@ public class Program
|
|||||||
string[] s = key.Split(' ');
|
string[] s = key.Split(' ');
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (Config.ContainsKey(s[0])) Config.SetValue(s[0], s[1]);
|
Config.GetAndAddValueToVariable(s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase));
|
||||||
else Config.GetAndAddValueToVariable(s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase));
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -377,11 +260,7 @@ public class Program
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<string> onlineSettingsList = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData");
|
||||||
|
|
||||||
|
|
||||||
List<string> onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData");
|
|
||||||
main.Stop();
|
|
||||||
foreach (var key in onlineSettingsList)
|
foreach (var key in onlineSettingsList)
|
||||||
{
|
{
|
||||||
if (key.Length <= 3 || !key.Contains(' ')) continue;
|
if (key.Length <= 3 || !key.Contains(' ')) continue;
|
||||||
@@ -393,45 +272,41 @@ public class Program
|
|||||||
string newVersion = s[1];
|
string newVersion = s[1];
|
||||||
if (!newVersion.Equals(Config.GetValue<string>("Version")))
|
if (!newVersion.Equals(Config.GetValue<string>("Version")))
|
||||||
{
|
{
|
||||||
if (Functions.GetOperatingSystem() == PluginManager.Others.OperatingSystem.WINDOWS)
|
Console.WriteLine("A new version has been released on github page.");
|
||||||
{
|
Console.WriteLine("Download the new version using the following link wrote in yellow");
|
||||||
|
Console_Utilities.WriteColorText("&y" + Config.GetValue<string>("GitURL") + "&c");
|
||||||
|
|
||||||
string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0.zip";
|
Console.WriteLine();
|
||||||
//string url2 = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}-preview/net6.0.zip";
|
Console.WriteLine("Your product will work just fine on this outdated version, but an update is recommended.\n" +
|
||||||
Process.Start("./Updater/Updater.exe", $"/update {url} ./DiscordBot.exe ./");
|
"From now on, this version is no longer supported"
|
||||||
}
|
);
|
||||||
else
|
Console_Utilities.WriteColorText("&rUse at your own risk&c");
|
||||||
|
|
||||||
|
Console_Utilities.WriteColorText("&mCurrent Version: " + Config.GetValue<string>("Version") + "&c");
|
||||||
|
Console_Utilities.WriteColorText("&gNew Version: " + newVersion + "&c");
|
||||||
|
|
||||||
|
Console.WriteLine("\n\n");
|
||||||
|
await Task.Delay(1000);
|
||||||
|
|
||||||
|
int waitTime = 20; //wait time to proceed
|
||||||
|
|
||||||
|
Console.Write($"The bot will start in {waitTime} seconds");
|
||||||
|
while (waitTime > 0)
|
||||||
{
|
{
|
||||||
string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0_linux.zip";
|
await Task.Delay(1000);
|
||||||
Process.Start("./Updater/Updater", $"/update {url} ./DiscordBot ./");
|
waitTime--;
|
||||||
|
Console.SetCursorPosition("The bot will start in ".Length, Console.CursorTop);
|
||||||
|
Console.Write(" ");
|
||||||
|
Console.SetCursorPosition("The bot will start in ".Length, Console.CursorTop);
|
||||||
|
Console.Write(waitTime + " seconds");
|
||||||
}
|
}
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
|
||||||
case "UpdaterVersion":
|
|
||||||
string updaternewversion = s[1];
|
|
||||||
if (Config.UpdaterVersion != updaternewversion)
|
|
||||||
{
|
|
||||||
Console.Clear();
|
|
||||||
Console.WriteLine("Installing updater ...\nDo NOT close the bot during update !");
|
|
||||||
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
|
|
||||||
bar.Start();
|
|
||||||
await ServerCom.DownloadFileNoProgressAsync("https://github.com/Wizzy69/installer/releases/download/release-1-discordbot/Updater.zip", "./Updater.zip");
|
|
||||||
await Functions.ExtractArchive("./Updater.zip", "./", null, UnzipProgressType.PercentageFromTotalSize);
|
|
||||||
Config.UpdaterVersion = updaternewversion;
|
|
||||||
File.Delete("Updater.zip");
|
|
||||||
await Config.SaveConfig(SaveType.NORMAL);
|
|
||||||
bar.Stop();
|
|
||||||
Console.Clear();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Console_Utilities.Initialize();
|
Config.SaveConfig();
|
||||||
await Config.SaveConfig(SaveType.NORMAL);
|
|
||||||
Console.Clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,14 +21,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EVE_LevelingSystem", "EVE_L
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_LevelingSystem", "CMD_LevelingSystem\CMD_LevelingSystem.csproj", "{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_LevelingSystem", "CMD_LevelingSystem\CMD_LevelingSystem.csproj", "{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Roles", "Roles\Roles.csproj", "{954F2AA9-6624-4554-946D-0F17B84487C3}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Others", "Others", "{727BBA0B-9114-4BC8-B9A8-3F461449A564}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Updater", "Updater\Updater.csproj", "{24616F7E-E2E9-45A3-8A44-AB51FCD2D525}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeGamesModule", "FreeGamesModule\FreeGamesModule.csproj", "{8959C766-414D-4EF8-BC85-9928B30AAF0A}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -59,18 +51,6 @@ Global
|
|||||||
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.Build.0 = Release|Any CPU
|
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{954F2AA9-6624-4554-946D-0F17B84487C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{954F2AA9-6624-4554-946D-0F17B84487C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{954F2AA9-6624-4554-946D-0F17B84487C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{954F2AA9-6624-4554-946D-0F17B84487C3}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{24616F7E-E2E9-45A3-8A44-AB51FCD2D525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{24616F7E-E2E9-45A3-8A44-AB51FCD2D525}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{24616F7E-E2E9-45A3-8A44-AB51FCD2D525}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{24616F7E-E2E9-45A3-8A44-AB51FCD2D525}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{8959C766-414D-4EF8-BC85-9928B30AAF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{8959C766-414D-4EF8-BC85-9928B30AAF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{8959C766-414D-4EF8-BC85-9928B30AAF0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{8959C766-414D-4EF8-BC85-9928B30AAF0A}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@@ -82,10 +62,6 @@ Global
|
|||||||
{B1B4976E-5112-4217-B57B-3A03C5207B6E} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
{B1B4976E-5112-4217-B57B-3A03C5207B6E} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
||||||
{EEC445DC-0C4B-43EA-8694-606BA0390B77} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012}
|
{EEC445DC-0C4B-43EA-8694-606BA0390B77} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012}
|
||||||
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
||||||
{954F2AA9-6624-4554-946D-0F17B84487C3} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
|
||||||
{727BBA0B-9114-4BC8-B9A8-3F461449A564} = {1862ABD5-7C30-4F15-A561-45AC8A9CA10E}
|
|
||||||
{24616F7E-E2E9-45A3-8A44-AB51FCD2D525} = {727BBA0B-9114-4BC8-B9A8-3F461449A564}
|
|
||||||
{8959C766-414D-4EF8-BC85-9928B30AAF0A} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF}
|
SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<BaseOutputPath></BaseOutputPath>
|
<BaseOutputPath>..\DiscordBot\bin\Debug\net6.0\Data\Plugins\Events\LevelingSystem</BaseOutputPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
using Discord;
|
using Discord;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using EVE_LevelingSystem.LevelingSystemCore;
|
using EVE_LevelingSystem.LevelingSystemCore;
|
||||||
|
|
||||||
using PluginManager;
|
using PluginManager;
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
@@ -13,18 +11,15 @@ namespace EVE_LevelingSystem
|
|||||||
{
|
{
|
||||||
public string name => "Leveling System Event Handler";
|
public string name => "Leveling System Event Handler";
|
||||||
public string description => "The Leveling System Event Handler";
|
public string description => "The Leveling System Event Handler";
|
||||||
|
|
||||||
internal static Settings globalSettings = new();
|
internal static Settings globalSettings = new();
|
||||||
|
|
||||||
|
|
||||||
public async void Start(DiscordSocketClient client)
|
public async void Start(DiscordSocketClient client)
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory("./Data/Resources/LevelingSystem");
|
Directory.CreateDirectory("./Data/Resources/LevelingSystem");
|
||||||
if (!Config.ContainsKey("LevelingSystemPath"))
|
|
||||||
Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem", true);
|
Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem", true);
|
||||||
if (!Config.ContainsKey("LevelingSystemSettingsFile"))
|
|
||||||
Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt", true);
|
Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt", true);
|
||||||
//PluginManager.Config.AddValueToVariables
|
|
||||||
if (!File.Exists(Config.GetValue<string>("LevelingSystemSettingsFile")))
|
if (!File.Exists(Config.GetValue<string>("LevelingSystemSettingsFile")))
|
||||||
{
|
{
|
||||||
globalSettings = new Settings { TimeToWaitBetweenMessages = 5 };
|
globalSettings = new Settings { TimeToWaitBetweenMessages = 5 };
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using PluginManager;
|
using PluginManager;
|
||||||
|
|
||||||
namespace EVE_LevelingSystem.LevelingSystemCore
|
namespace EVE_LevelingSystem.LevelingSystemCore
|
||||||
@@ -28,14 +27,14 @@ namespace EVE_LevelingSystem.LevelingSystemCore
|
|||||||
{
|
{
|
||||||
if (OnWaitingList.Contains(user.user.userID.ToString())) return false;
|
if (OnWaitingList.Contains(user.user.userID.ToString())) return false;
|
||||||
Random r = new Random();
|
Random r = new Random();
|
||||||
int exp = r.Next(Level.globalSettings.MinEXP, Level.globalSettings.MaxEXP + 1);
|
int exp = r.Next(2, 12);
|
||||||
Int64 userXP = user.CurrentEXP;
|
Int64 userXP = user.CurrentEXP;
|
||||||
Int64 reqEXP = user.RequiredEXPToLevelUp;
|
Int64 reqEXP = user.RequiredEXPToLevelUp;
|
||||||
if (userXP + exp >= reqEXP)
|
if (userXP + exp >= reqEXP)
|
||||||
{
|
{
|
||||||
user.LevelUp();
|
user.LevelUp();
|
||||||
user.CurrentEXP = exp - (reqEXP - userXP);
|
user.CurrentEXP = exp - (reqEXP - userXP);
|
||||||
//Console.WriteLine("Level up");
|
Console.WriteLine("Level up");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +49,7 @@ namespace EVE_LevelingSystem.LevelingSystemCore
|
|||||||
Thread.Sleep(60000 * minutesToWait);
|
Thread.Sleep(60000 * minutesToWait);
|
||||||
OnWaitingList.Remove(user.user.userID.ToString());
|
OnWaitingList.Remove(user.user.userID.ToString());
|
||||||
}
|
}
|
||||||
).Start();
|
);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,5 @@ namespace EVE_LevelingSystem
|
|||||||
public class Settings
|
public class Settings
|
||||||
{
|
{
|
||||||
public int TimeToWaitBetweenMessages { get; set; }
|
public int TimeToWaitBetweenMessages { get; set; }
|
||||||
public int MinEXP { get; set; }
|
|
||||||
public int MaxEXP { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
using Discord.Commands;
|
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace FreeGamesModule
|
|
||||||
{
|
|
||||||
public class Free : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "free";
|
|
||||||
|
|
||||||
public List<string>? Aliases => null;
|
|
||||||
|
|
||||||
public string Description => "Check out any free game";
|
|
||||||
|
|
||||||
public string Usage => "free";
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public void ExecuteServer(SocketCommandContext context)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
using AngleSharp.Dom;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
internal class AudioFile
|
|
||||||
{
|
|
||||||
internal string Name { get; set; }
|
|
||||||
internal string Url { get; set; }
|
|
||||||
|
|
||||||
internal AudioFile(string name, string url)
|
|
||||||
{
|
|
||||||
Name = name;
|
|
||||||
Url = url;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal async Task DownloadAudioFile()
|
|
||||||
{
|
|
||||||
Process proc = new Process();
|
|
||||||
proc.StartInfo.FileName = "MusicDownloader";
|
|
||||||
proc.StartInfo.Arguments = $"{Url},{Name}";
|
|
||||||
proc.StartInfo.UseShellExecute = false;
|
|
||||||
proc.StartInfo.RedirectStandardOutput = true;
|
|
||||||
|
|
||||||
proc.Start();
|
|
||||||
await proc.WaitForExitAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,6 +8,5 @@ internal static class Data
|
|||||||
internal static IAudioClient audioClient = null;
|
internal static IAudioClient audioClient = null;
|
||||||
internal static IVoiceChannel voiceChannel = null;
|
internal static IVoiceChannel voiceChannel = null;
|
||||||
|
|
||||||
internal static MusicPlayer MusicPlayer = null;
|
internal static MusicPlayer CurrentlyRunning = null;
|
||||||
internal static MusicPlaylist Playlist = new();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using Discord.Commands;
|
||||||
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
namespace MusicCommands;
|
namespace MusicCommands;
|
||||||
@@ -11,32 +8,24 @@ internal class Leave : DBCommand
|
|||||||
{
|
{
|
||||||
public string Command => "leave";
|
public string Command => "leave";
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
public string Description => "Leave the voice channel";
|
public string Description => "Leave the voice channel";
|
||||||
|
|
||||||
public string Usage => "leave";
|
public string Usage => "leave";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
if (Data.audioClient is not null && Data.voiceChannel is not null)
|
if (Data.audioClient is not null && Data.voiceChannel is not null)
|
||||||
{
|
{
|
||||||
|
Data.CurrentlyRunning.Stop();
|
||||||
|
Data.CurrentlyRunning = null;
|
||||||
await Data.audioClient.StopAsync();
|
await Data.audioClient.StopAsync();
|
||||||
await Data.voiceChannel.DisconnectAsync();
|
await Data.voiceChannel.DisconnectAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Data.Playlist is not null)
|
|
||||||
{
|
|
||||||
Data.Playlist.ClearQueue();
|
|
||||||
Data.Playlist = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data.MusicPlayer is not null)
|
|
||||||
{
|
|
||||||
Data.MusicPlayer.Stop();
|
|
||||||
Data.MusicPlayer = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<Nullable>warnings</Nullable>
|
<Nullable>warnings</Nullable>
|
||||||
<BaseOutputPath>bin\</BaseOutputPath>
|
<BaseOutputPath>..\DiscordBot\bin\Debug\net6.0\Data\Plugins\Commands\MusicCommands</BaseOutputPath>
|
||||||
<AssemblyName>Music Commands</AssemblyName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
@@ -18,8 +17,4 @@
|
|||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="YoutubeExplode" Version="6.2.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,53 +1,118 @@
|
|||||||
using System.IO;
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace MusicCommands;
|
namespace MusicCommands;
|
||||||
|
|
||||||
internal class MusicPlayer
|
internal class MusicPlayer
|
||||||
{
|
{
|
||||||
private Stream outputStream { get; }
|
public MusicPlayer(Stream input, Stream output)
|
||||||
internal AudioFile NowPlaying = null;
|
|
||||||
|
|
||||||
internal bool isPlaying, isPaused;
|
|
||||||
|
|
||||||
public MusicPlayer(Stream outputChannel)
|
|
||||||
{
|
{
|
||||||
outputStream = outputChannel;
|
inputStream = input;
|
||||||
|
outputStream = output;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Play(Stream source, int byteSize, AudioFile songPlaying)
|
public MusicPlayer(Stream output)
|
||||||
{
|
{
|
||||||
isPlaying = true;
|
inputStream = null;
|
||||||
NowPlaying = songPlaying;
|
outputStream = output;
|
||||||
while (isPlaying)
|
|
||||||
{
|
|
||||||
if (isPaused)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var bits = new byte[byteSize];
|
|
||||||
var read = await source.ReadAsync(bits, 0, byteSize);
|
|
||||||
if (read == 0)
|
|
||||||
break;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await outputStream.WriteAsync(bits, 0, read);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stream inputStream { get; } // from FFMPEG
|
||||||
|
public Stream outputStream { get; } // to Voice Channel
|
||||||
|
|
||||||
await source.FlushAsync();
|
public bool Paused { get; set; }
|
||||||
await source.DisposeAsync();
|
private bool _stop { get; set; }
|
||||||
source.Close();
|
|
||||||
await outputStream.FlushAsync();
|
|
||||||
isPlaying = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
public void Stop()
|
||||||
{
|
{
|
||||||
isPlaying = false;
|
_stop = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task StartSendAudioFromLink(string URL)
|
||||||
|
{
|
||||||
|
/* using (HttpClient client = new HttpClient())
|
||||||
|
using (HttpResponseMessage response = await client.GetAsync(URL))
|
||||||
|
using (var content = response.Content)
|
||||||
|
{
|
||||||
|
await (await content.ReadAsStreamAsync()).CopyToAsync(outputStream);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
Stream ms = new MemoryStream();
|
||||||
|
var bsize = 512;
|
||||||
|
new Thread(async delegate(object o)
|
||||||
|
{
|
||||||
|
var response = await new HttpClient().GetAsync(URL);
|
||||||
|
using (var stream = await response.Content.ReadAsStreamAsync())
|
||||||
|
{
|
||||||
|
var buffer = new byte[bsize];
|
||||||
|
int read;
|
||||||
|
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
|
||||||
|
{
|
||||||
|
var pos = ms.Position;
|
||||||
|
ms.Position = ms.Length;
|
||||||
|
ms.Write(buffer, 0, read);
|
||||||
|
ms.Position = pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).Start();
|
||||||
|
Console.Write("Reading data: ");
|
||||||
|
while (ms.Length < bsize * 10)
|
||||||
|
{
|
||||||
|
await Task.Delay(1000);
|
||||||
|
Console.Title = "Reading data: " + ms.Length + " bytes read of " + bsize * 10;
|
||||||
|
Console.Write(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("\nDone");
|
||||||
|
ms.Position = 0;
|
||||||
|
|
||||||
|
_stop = false;
|
||||||
|
Paused = false;
|
||||||
|
|
||||||
|
while (!_stop)
|
||||||
|
{
|
||||||
|
if (Paused) continue;
|
||||||
|
var buffer = new byte[bsize];
|
||||||
|
var read = await ms.ReadAsync(buffer, 0, buffer.Length);
|
||||||
|
if (read > 0)
|
||||||
|
await outputStream.WriteAsync(buffer, 0, read);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task StartSendAudio()
|
||||||
|
{
|
||||||
|
Paused = false;
|
||||||
|
_stop = false;
|
||||||
|
while (!_stop)
|
||||||
|
{
|
||||||
|
if (Paused) continue;
|
||||||
|
var bsize = 512;
|
||||||
|
var buffer = new byte[bsize];
|
||||||
|
var bcount = await inputStream.ReadAsync(buffer, 0, bsize);
|
||||||
|
if (bcount <= 0)
|
||||||
|
{
|
||||||
|
Stop();
|
||||||
|
Data.CurrentlyRunning = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await outputStream.WriteAsync(buffer, 0, bcount);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
await outputStream.FlushAsync();
|
||||||
|
Functions.WriteLogFile(ex.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
internal class MusicPlaylist
|
|
||||||
{
|
|
||||||
internal MusicPlaylist()
|
|
||||||
{
|
|
||||||
Console.WriteLine("Initialized playlist.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public Queue<AudioFile> QueueList = new();
|
|
||||||
|
|
||||||
public void Enqueue(AudioFile query) => QueueList.Enqueue(query);
|
|
||||||
public void ClearQueue() => QueueList.Clear();
|
|
||||||
|
|
||||||
public int Count => QueueList.Count;
|
|
||||||
public AudioFile GetNextSong => QueueList.Dequeue();
|
|
||||||
public AudioFile WhatIsNext => QueueList.Peek();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using Discord.Commands;
|
||||||
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
namespace MusicCommands;
|
namespace MusicCommands;
|
||||||
@@ -11,16 +8,18 @@ internal class Pause : DBCommand
|
|||||||
{
|
{
|
||||||
public string Command => "pause";
|
public string Command => "pause";
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
public string Description => "Pause the music";
|
||||||
|
|
||||||
public string Description => "Pause/Unpause the music that is currently running";
|
|
||||||
|
|
||||||
public string Usage => "pause";
|
public string Usage => "pause";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
public void ExecuteServer(SocketCommandContext context)
|
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
Data.MusicPlayer.isPaused = !Data.MusicPlayer.isPaused;
|
Data.CurrentlyRunning.Paused = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Audio;
|
using Discord.Audio;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
@@ -15,102 +12,50 @@ namespace MusicCommands;
|
|||||||
|
|
||||||
internal class Play : DBCommand
|
internal class Play : DBCommand
|
||||||
{
|
{
|
||||||
public string Command => "play";
|
public string Command => "fplay";
|
||||||
|
|
||||||
public List<string> Aliases => new() { "p" };
|
|
||||||
|
|
||||||
public string Description => "Play music from a file";
|
public string Description => "Play music from a file";
|
||||||
|
|
||||||
public string Usage => "play [name/url]";
|
public string Usage => "fplay [name]";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory("Music");
|
var path = "./Music";
|
||||||
var path = "./Music/";
|
var FileName = Functions.GetArguments(message).ToArray().MergeStrings(0);
|
||||||
string[] splitted = context.Message.Content.Split(' ');
|
path += "/" + FileName + ".ogg";
|
||||||
if (splitted.Length < 2)
|
if (!File.Exists(path))
|
||||||
return;
|
|
||||||
do
|
|
||||||
{
|
{
|
||||||
if (splitted.Length == 2 && splitted[1].Contains("youtube.com") || splitted[1].Contains("youtu.be"))
|
Console.WriteLine("Unknown path " + path);
|
||||||
{
|
|
||||||
var url = splitted[1];
|
|
||||||
path += $"{Functions.CreateMD5(url)}";
|
|
||||||
if (File.Exists(path))
|
|
||||||
{
|
|
||||||
Data.Playlist.Enqueue(new AudioFile(path, null));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var file = new AudioFile(path, url);
|
|
||||||
await file.DownloadAudioFile();
|
|
||||||
Data.Playlist.Enqueue(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var searchString = splitted.MergeStrings(1);
|
|
||||||
path += $"{Functions.CreateMD5(searchString)}";
|
|
||||||
if (File.Exists(path))
|
|
||||||
{
|
|
||||||
Data.Playlist.Enqueue(new AudioFile(path, null));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync("Searching for " + searchString);
|
|
||||||
var file = new AudioFile(path, searchString);
|
|
||||||
await file.DownloadAudioFile();
|
|
||||||
Data.Playlist.Enqueue(file);
|
|
||||||
if (Data.MusicPlayer is null)
|
|
||||||
await context.Channel.SendMessageAsync("Playing: " + searchString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data.MusicPlayer is not null)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync("Queued your request: " + splitted.MergeStrings(1));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
while (false); // run only one time !
|
|
||||||
|
|
||||||
|
|
||||||
Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel;
|
Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel;
|
||||||
|
|
||||||
if (Data.voiceChannel == null)
|
if (Data.voiceChannel == null)
|
||||||
{
|
{
|
||||||
await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument.");
|
await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Data.audioClient is null)
|
Data.audioClient = await Data.voiceChannel.ConnectAsync();
|
||||||
{
|
|
||||||
Data.audioClient = await Data.voiceChannel.ConnectAsync(true);
|
|
||||||
Data.MusicPlayer = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
using (var ffmpeg = CreateStream(path))
|
||||||
using (var discordChanneAudioOutStream = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
using (var output = ffmpeg.StandardOutput.BaseStream)
|
||||||
|
using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
||||||
{
|
{
|
||||||
Data.MusicPlayer ??= new MusicPlayer(discordChanneAudioOutStream);
|
if (Data.CurrentlyRunning != null) Data.CurrentlyRunning.Stop();
|
||||||
while (Data.Playlist.Count > 0)
|
Data.CurrentlyRunning = new MusicPlayer(output, discord);
|
||||||
{
|
await Data.CurrentlyRunning.StartSendAudio();
|
||||||
var nowPlaying = Data.Playlist.GetNextSong;
|
|
||||||
using (var ffmpeg = CreateStream(nowPlaying.Name))
|
|
||||||
using (var ffmpegOutputBaseStream = ffmpeg.StandardOutput.BaseStream)
|
|
||||||
{
|
|
||||||
await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024, nowPlaying);
|
|
||||||
Console.WriteLine("Finished playing from " + nowPlaying.Url);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Data.MusicPlayer = null;
|
private Process CreateStream(string path)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Process CreateStream(string path)
|
|
||||||
{
|
{
|
||||||
return Process.Start(new ProcessStartInfo { FileName = "ffmpeg", Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1", UseShellExecute = false, RedirectStandardOutput = true });
|
return Process.Start(new ProcessStartInfo { FileName = "ffmpeg", Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1", UseShellExecute = false, RedirectStandardOutput = true });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
public class Skip : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "skip";
|
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
public string Description => "skip the music that is currently running";
|
|
||||||
|
|
||||||
public string Usage => "skip";
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
|
||||||
{
|
|
||||||
var loadedSong = Data.MusicPlayer.NowPlaying;
|
|
||||||
|
|
||||||
if (loadedSong is null || Data.MusicPlayer.isPlaying == false)
|
|
||||||
{
|
|
||||||
await context.Message.Channel.SendMessageAsync("There is no music playing");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Data.MusicPlayer.isPlaying = false;
|
|
||||||
await context.Message.Channel.SendMessageAsync($"You have skipped {loadedSong.Name}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
25
MusicCommands/Unpause.cs
Normal file
25
MusicCommands/Unpause.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
|
namespace MusicCommands;
|
||||||
|
|
||||||
|
internal class Unpause : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "unpause";
|
||||||
|
|
||||||
|
public string Description => "Unpause the music";
|
||||||
|
|
||||||
|
public string Usage => "unpause";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
Data.CurrentlyRunning.Paused = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
49
MusicCommands/lplay.cs
Normal file
49
MusicCommands/lplay.cs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
using Discord;
|
||||||
|
using Discord.Audio;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
|
namespace MusicCommands;
|
||||||
|
|
||||||
|
internal class lplay : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "lplay";
|
||||||
|
|
||||||
|
public string Description => "Play music from a link";
|
||||||
|
|
||||||
|
public string Usage => "lplay [url]";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => false;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
var URL = message.Content.Split(' ')[1];
|
||||||
|
if (!URL.EndsWith(".mp3") && !URL.EndsWith(".wav") && !URL.EndsWith(".flac") && !URL.EndsWith(".ogg"))
|
||||||
|
{
|
||||||
|
await message.Channel.SendMessageAsync("Invalid URL");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel;
|
||||||
|
if (Data.voiceChannel == null)
|
||||||
|
{
|
||||||
|
await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Data.audioClient = await Data.voiceChannel.ConnectAsync();
|
||||||
|
|
||||||
|
using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
||||||
|
{
|
||||||
|
await message.Channel.SendMessageAsync("Loading...");
|
||||||
|
|
||||||
|
Data.CurrentlyRunning = new MusicPlayer(discord);
|
||||||
|
await Data.CurrentlyRunning.StartSendAudioFromLink(URL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
public class queue : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "queue";
|
|
||||||
public List<string> Aliases => new() { "q" };
|
|
||||||
|
|
||||||
public string Description => "check queue";
|
|
||||||
|
|
||||||
public string Usage => "queue";
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync($"You have {Data.Playlist.Count} items in queue");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,24 +4,22 @@ using System.IO;
|
|||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace PluginManager
|
namespace PluginManager
|
||||||
{
|
{
|
||||||
internal class AppConfig
|
internal class AppConfig
|
||||||
{
|
{
|
||||||
public string UpdaterVersion { get; set; }
|
public Dictionary<string, object>? ApplicationVariables { get; set; }
|
||||||
public Dictionary<string, object>? ApplicationVariables { get; init; }
|
public List<string>? ProtectedKeyWords { get; set; }
|
||||||
public List<string>? ProtectedKeyWords { get; init; }
|
|
||||||
public Dictionary<string, string>? PluginVersions { get; init; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Config
|
public static class Config
|
||||||
{
|
{
|
||||||
public static class PluginConfig
|
public static class PluginConfig
|
||||||
{
|
{
|
||||||
public static readonly List<Tuple<string, PluginType>> InstalledPlugins = new();
|
public static List<Tuple<string, PluginType>> InstalledPlugins = new();
|
||||||
|
|
||||||
public static void Load()
|
public static void Load()
|
||||||
{
|
{
|
||||||
@@ -59,8 +57,9 @@ namespace PluginManager
|
|||||||
public static bool Contains(string pluginName)
|
public static bool Contains(string pluginName)
|
||||||
{
|
{
|
||||||
foreach (var tuple in InstalledPlugins)
|
foreach (var tuple in InstalledPlugins)
|
||||||
if (tuple.Item1 == pluginName)
|
{
|
||||||
return true;
|
if (tuple.Item1 == pluginName) return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -68,9 +67,9 @@ namespace PluginManager
|
|||||||
public static PluginType GetPluginType(string pluginName)
|
public static PluginType GetPluginType(string pluginName)
|
||||||
{
|
{
|
||||||
foreach (var tuple in InstalledPlugins)
|
foreach (var tuple in InstalledPlugins)
|
||||||
if (tuple.Item1 == pluginName)
|
{
|
||||||
return tuple.Item2;
|
if (tuple.Item1 == pluginName) return tuple.Item2;
|
||||||
|
}
|
||||||
|
|
||||||
return PluginType.Unknown;
|
return PluginType.Unknown;
|
||||||
}
|
}
|
||||||
@@ -78,58 +77,20 @@ namespace PluginManager
|
|||||||
|
|
||||||
private static AppConfig? appConfig { get; set; }
|
private static AppConfig? appConfig { get; set; }
|
||||||
|
|
||||||
public static string UpdaterVersion { get => appConfig.UpdaterVersion; set => appConfig.UpdaterVersion = value; }
|
public static bool AddValueToVariables<T>(string key, T value, bool isProtected)
|
||||||
|
|
||||||
public static string GetPluginVersion(string pluginName) => appConfig!.PluginVersions![pluginName];
|
|
||||||
public static void SetPluginVersion(string pluginName, string newVersion)
|
|
||||||
{
|
{
|
||||||
if (appConfig!.PluginVersions!.ContainsKey(pluginName))
|
if (appConfig!.ApplicationVariables!.ContainsKey(key)) return false;
|
||||||
appConfig.PluginVersions[pluginName] = newVersion;
|
if (value == null) return false;
|
||||||
else appConfig.PluginVersions.Add(pluginName, newVersion);
|
|
||||||
|
|
||||||
// SaveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void RemovePluginVersion(string pluginName) => appConfig!.PluginVersions!.Remove(pluginName);
|
|
||||||
public static bool PluginVersionsContainsKey(string pluginName) => appConfig!.PluginVersions!.ContainsKey(pluginName);
|
|
||||||
|
|
||||||
public static void AddValueToVariables<T>(string key, T value, bool isProtected)
|
|
||||||
{
|
|
||||||
if (value == null)
|
|
||||||
throw new Exception("The value cannot be null");
|
|
||||||
if (appConfig!.ApplicationVariables!.ContainsKey(key))
|
|
||||||
throw new Exception($"The key ({key}) already exists in the variables. Value {GetValue<T>(key)}");
|
|
||||||
|
|
||||||
appConfig.ApplicationVariables.Add(key, value);
|
appConfig.ApplicationVariables.Add(key, value);
|
||||||
if (isProtected && key != "Version")
|
if (isProtected && key != "Version") appConfig.ProtectedKeyWords!.Add(key);
|
||||||
appConfig.ProtectedKeyWords!.Add(key);
|
|
||||||
|
|
||||||
SaveConfig(SaveType.NORMAL);
|
SaveConfig();
|
||||||
}
|
return true;
|
||||||
|
|
||||||
public static Type GetVariableType(string value)
|
|
||||||
{
|
|
||||||
if (int.TryParse(value, out var intValue))
|
|
||||||
return typeof(int);
|
|
||||||
if (bool.TryParse(value, out var boolValue))
|
|
||||||
return typeof(bool);
|
|
||||||
if (float.TryParse(value, out var floatValue))
|
|
||||||
return typeof(float);
|
|
||||||
if (double.TryParse(value, out var doubleValue))
|
|
||||||
return typeof(double);
|
|
||||||
if (uint.TryParse(value, out var uintValue))
|
|
||||||
return typeof(uint);
|
|
||||||
if (long.TryParse(value, out var longValue))
|
|
||||||
return typeof(long);
|
|
||||||
if (byte.TryParse(value, out var byteValue))
|
|
||||||
return typeof(byte);
|
|
||||||
return typeof(string);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GetAndAddValueToVariable(string key, string value, bool isReadOnly)
|
public static void GetAndAddValueToVariable(string key, string value, bool isReadOnly)
|
||||||
{
|
{
|
||||||
if (Config.ContainsKey(key))
|
if (Config.ContainsKey(key)) return;
|
||||||
return;
|
|
||||||
if (int.TryParse(value, out var intValue))
|
if (int.TryParse(value, out var intValue))
|
||||||
Config.AddValueToVariables(key, intValue, isReadOnly);
|
Config.AddValueToVariables(key, intValue, isReadOnly);
|
||||||
else if (bool.TryParse(value, out var boolValue))
|
else if (bool.TryParse(value, out var boolValue))
|
||||||
@@ -162,73 +123,47 @@ namespace PluginManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetValue<T>(string key, T value)
|
public static bool SetValue<T>(string key, T value)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (!appConfig!.ApplicationVariables!.ContainsKey(key)) return false;
|
||||||
throw new Exception("Value is null");
|
if (appConfig.ProtectedKeyWords!.Contains(key)) return false;
|
||||||
if (!appConfig!.ApplicationVariables!.ContainsKey(key))
|
if (value == null) return false;
|
||||||
throw new Exception("Key does not exist in the config file");
|
|
||||||
if (appConfig.ProtectedKeyWords!.Contains(key))
|
|
||||||
throw new Exception("Key is protected");
|
|
||||||
|
|
||||||
appConfig.ApplicationVariables[key] = JsonSerializer.SerializeToElement(value);
|
appConfig.ApplicationVariables[key] = JsonSerializer.SerializeToElement(value);
|
||||||
SaveConfig(SaveType.NORMAL);
|
SaveConfig();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RemoveKey(string key)
|
public static bool RemoveKey(string key)
|
||||||
{
|
{
|
||||||
if (key == "Version" || key == "token" || key == "prefix")
|
if (key == "Version" || key == "token" || key == "prefix") return false;
|
||||||
throw new Exception("Key is protected");
|
|
||||||
appConfig!.ApplicationVariables!.Remove(key);
|
appConfig!.ApplicationVariables!.Remove(key);
|
||||||
appConfig.ProtectedKeyWords!.Remove(key);
|
appConfig.ProtectedKeyWords!.Remove(key);
|
||||||
SaveConfig(SaveType.NORMAL);
|
SaveConfig();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task SaveConfig(SaveType type)
|
public static async void SaveConfig()
|
||||||
{
|
|
||||||
if (type == SaveType.NORMAL)
|
|
||||||
{
|
{
|
||||||
string path = Functions.dataFolder + "config.json";
|
string path = Functions.dataFolder + "config.json";
|
||||||
await Functions.SaveToJsonFile<AppConfig>(path, appConfig!);
|
await Functions.SaveToJsonFile<AppConfig>(path, appConfig!);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (type == SaveType.BACKUP)
|
|
||||||
{
|
|
||||||
string path = Functions.dataFolder + "config.json.bak";
|
|
||||||
await Functions.SaveToJsonFile<AppConfig>(path, appConfig!);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task LoadConfig()
|
public static async Task LoadConfig()
|
||||||
{
|
{
|
||||||
string path = Functions.dataFolder + "config.json";
|
string path = Functions.dataFolder + "config.json";
|
||||||
if (File.Exists(path))
|
if (File.Exists(path))
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
appConfig = await Functions.ConvertFromJson<AppConfig>(path);
|
appConfig = await Functions.ConvertFromJson<AppConfig>(path);
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
File.Delete(path);
|
|
||||||
Console.WriteLine("An error occured while loading the settings. Importing from backup file...");
|
|
||||||
path = Functions.dataFolder + "config.json.bak";
|
|
||||||
appConfig = await Functions.ConvertFromJson<AppConfig>(path);
|
|
||||||
Functions.WriteErrFile(ex.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables.");
|
Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables.");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
appConfig = new() { ApplicationVariables = new Dictionary<string, object>(), ProtectedKeyWords = new List<string>(), PluginVersions = new Dictionary<string, string>(), UpdaterVersion = "-1" };
|
else
|
||||||
|
appConfig = new() { ApplicationVariables = new Dictionary<string, object>(), ProtectedKeyWords = new List<string>() };
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ContainsValue<T>(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!);
|
public static bool ContainsValue<T>(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!);
|
||||||
public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key);
|
public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key);
|
||||||
|
|
||||||
public static ReadOnlyDictionary<string, object> GetAllVariables() => new(appConfig!.ApplicationVariables!);
|
public static Dictionary<string, object> GetAllVariables() => new(appConfig!.ApplicationVariables!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using Discord.Commands;
|
||||||
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
namespace PluginManager.Interfaces;
|
namespace PluginManager.Interfaces;
|
||||||
@@ -13,11 +11,6 @@ public interface DBCommand
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
string Command { get; }
|
string Command { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command aliases. Users may use this to execute the command
|
|
||||||
/// </summary>
|
|
||||||
List<string>? Aliases { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Command description
|
/// Command description
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -29,20 +22,30 @@ public interface DBCommand
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
string Usage { get; }
|
string Usage { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// true if the command can be used in a DM channel, otherwise false
|
||||||
|
/// </summary>
|
||||||
|
bool canUseDM { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// true if the command can be used in a server, otherwise false
|
||||||
|
/// </summary>
|
||||||
|
bool canUseServer { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// true if the command requre admin, otherwise false
|
/// true if the command requre admin, otherwise false
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool requireAdmin { get; }
|
bool requireAdmin { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main body of the command. This is what is executed when user calls the command in Server
|
/// The main body of the command. This is what is executed when user calls the command
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">The disocrd Context</param>
|
/// <param name="context">The disocrd Context</param>
|
||||||
void ExecuteServer(SocketCommandContext context) { }
|
/// <param name="message">The message that the user types</param>
|
||||||
|
/// <param name="client">The discord client of the bot</param>
|
||||||
/// <summary>
|
/// <param name="isDM">true if the message was sent from DM, otherwise false. It is always false if canUseDM is false</param>
|
||||||
/// The main body of the command. This is what is executed when user calls the command in DM
|
void Execute(SocketCommandContext context,
|
||||||
/// </summary>
|
SocketMessage message,
|
||||||
/// <param name="context">The disocrd Context</param>
|
DiscordSocketClient client,
|
||||||
void ExecuteDM(SocketCommandContext context) { }
|
bool isDM);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Items;
|
namespace PluginManager.Items;
|
||||||
|
|
||||||
public class Command
|
internal class Command
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The author of the command
|
/// The author of the command
|
||||||
@@ -21,7 +20,10 @@ public class Command
|
|||||||
{
|
{
|
||||||
Author = message.Author;
|
Author = message.Author;
|
||||||
var data = message.Content.Split(' ');
|
var data = message.Content.Split(' ');
|
||||||
Arguments = data.Length > 1 ? new List<string>(data.MergeStrings(1).Split(' ')) : new List<string>();
|
if (data.Length > 1)
|
||||||
|
Arguments = new List<string>(data.MergeStrings(1).Split(' '));
|
||||||
|
else
|
||||||
|
Arguments = new List<string>();
|
||||||
CommandName = data[0].Substring(1);
|
CommandName = data[0].Substring(1);
|
||||||
PrefixUsed = data[0][0];
|
PrefixUsed = data[0][0];
|
||||||
}
|
}
|
||||||
@@ -44,8 +46,8 @@ public class Command
|
|||||||
|
|
||||||
public class ConsoleCommand
|
public class ConsoleCommand
|
||||||
{
|
{
|
||||||
public string CommandName { get; init; }
|
public string CommandName { get; set; }
|
||||||
public string Description { get; init; }
|
public string Description { get; set; }
|
||||||
public string Usage { get; init; }
|
public string Usage { get; set; }
|
||||||
public Action<string[]> Action { get; init; }
|
public Action<string[]> Action { get; set; }
|
||||||
}
|
}
|
||||||
@@ -3,18 +3,11 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Loaders;
|
using PluginManager.Loaders;
|
||||||
using PluginManager.Online;
|
using PluginManager.Online;
|
||||||
using PluginManager.Online.Helpers;
|
|
||||||
using PluginManager.Online.Updates;
|
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Items;
|
namespace PluginManager.Items;
|
||||||
@@ -22,23 +15,19 @@ namespace PluginManager.Items;
|
|||||||
public class ConsoleCommandsHandler
|
public class ConsoleCommandsHandler
|
||||||
{
|
{
|
||||||
private static readonly PluginsManager manager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt");
|
private static readonly PluginsManager manager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt");
|
||||||
private static readonly List<ConsoleCommand> commandList = new();
|
public static List<ConsoleCommand> commandList = new();
|
||||||
private readonly DiscordSocketClient? client;
|
private readonly DiscordSocketClient? client;
|
||||||
|
|
||||||
|
|
||||||
private static bool isDownloading = false;
|
|
||||||
private static bool pluginsLoaded = false;
|
|
||||||
|
|
||||||
public ConsoleCommandsHandler(DiscordSocketClient client)
|
public ConsoleCommandsHandler(DiscordSocketClient client)
|
||||||
{
|
{
|
||||||
this.client = client;
|
this.client = client;
|
||||||
InitializeBasicCommands();
|
InitializeBasicCommands();
|
||||||
//Console.WriteLine("Initialized console command handler !");
|
Console.WriteLine("Initialized console command handler !");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeBasicCommands()
|
private void InitializeBasicCommands()
|
||||||
{
|
{
|
||||||
|
var pluginsLoaded = false;
|
||||||
commandList.Clear();
|
commandList.Clear();
|
||||||
|
|
||||||
AddCommand("help", "Show help", "help <command>", args =>
|
AddCommand("help", "Show help", "help <command>", args =>
|
||||||
@@ -54,12 +43,14 @@ public class ConsoleCommandsHandler
|
|||||||
|
|
||||||
foreach (var command in commandList)
|
foreach (var command in commandList)
|
||||||
{
|
{
|
||||||
var pa = from p in command.Action.Method.GetParameters() where p.Name != null select p.ParameterType.FullName;
|
var pa = from p in command.Action.Method.GetParameters()
|
||||||
|
where p.Name != null
|
||||||
|
select p.ParameterType.FullName;
|
||||||
items.Add(new[] { command.CommandName, command.Description, command.Usage });
|
items.Add(new[] { command.CommandName, command.Description, command.Usage });
|
||||||
}
|
}
|
||||||
|
|
||||||
items.Add(new[] { "-", "-", "-" });
|
items.Add(new[] { "-", "-", "-" });
|
||||||
Console_Utilities.FormatAndAlignTable(items, TableFormat.DEFAULT);
|
Console_Utilities.FormatAndAlignTable(items);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -79,62 +70,39 @@ public class ConsoleCommandsHandler
|
|||||||
|
|
||||||
AddCommand("lp", "Load plugins", () =>
|
AddCommand("lp", "Load plugins", () =>
|
||||||
{
|
{
|
||||||
if (pluginsLoaded)
|
if (pluginsLoaded) return;
|
||||||
return;
|
|
||||||
var loader = new PluginLoader(client!);
|
var loader = new PluginLoader(client!);
|
||||||
ConsoleColor cc = Console.ForegroundColor;
|
|
||||||
loader.onCMDLoad += (name, typeName, success, exception) =>
|
loader.onCMDLoad += (name, typeName, success, exception) =>
|
||||||
{
|
|
||||||
|
|
||||||
if (name == null || name.Length < 2)
|
|
||||||
name = typeName;
|
|
||||||
if (success)
|
|
||||||
{
|
{
|
||||||
Console.ForegroundColor = ConsoleColor.Green;
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
if (name == null || name.Length < 2) name = typeName;
|
||||||
|
if (success)
|
||||||
Console.WriteLine("[CMD] Successfully loaded command : " + name);
|
Console.WriteLine("[CMD] Successfully loaded command : " + name);
|
||||||
}
|
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
Console.ForegroundColor = ConsoleColor.Red;
|
|
||||||
|
|
||||||
Console.WriteLine("[CMD] Failed to load command : " + name + " because " + exception!.Message);
|
Console.WriteLine("[CMD] Failed to load command : " + name + " because " + exception!.Message);
|
||||||
}
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
Console.ForegroundColor = cc;
|
|
||||||
};
|
};
|
||||||
loader.onEVELoad += (name, typeName, success, exception) =>
|
loader.onEVELoad += (name, typeName, success, exception) =>
|
||||||
{
|
{
|
||||||
if (name == null || name.Length < 2)
|
if (name == null || name.Length < 2) name = typeName;
|
||||||
name = typeName;
|
|
||||||
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
Console.ForegroundColor = ConsoleColor.Green;
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
if (success)
|
||||||
Console.WriteLine("[EVENT] Successfully loaded event : " + name);
|
Console.WriteLine("[EVENT] Successfully loaded event : " + name);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
Console.ForegroundColor = ConsoleColor.Red;
|
|
||||||
Console.WriteLine("[EVENT] Failed to load event : " + name + " because " + exception!.Message);
|
Console.WriteLine("[EVENT] Failed to load event : " + name + " because " + exception!.Message);
|
||||||
}
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
Console.ForegroundColor = cc;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
loader.LoadPlugins();
|
loader.LoadPlugins();
|
||||||
Console.ForegroundColor = cc;
|
|
||||||
pluginsLoaded = true;
|
pluginsLoaded = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
AddCommand("listplugs", "list available plugins", () => { manager.ListAvailablePlugins().Wait(); });
|
AddCommand("listplugs", "list available plugins", async () => { await manager.ListAvailablePlugins(); });
|
||||||
|
|
||||||
AddCommand("dwplug", "download plugin", "dwplug [name]", async args =>
|
AddCommand("dwplug", "download plugin", "dwplug [name]", async args =>
|
||||||
{
|
{
|
||||||
isDownloading = true;
|
|
||||||
if (args.Length == 1)
|
if (args.Length == 1)
|
||||||
{
|
{
|
||||||
isDownloading = false;
|
|
||||||
Console.WriteLine("Please specify plugin name");
|
Console.WriteLine("Please specify plugin name");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -148,27 +116,26 @@ public class ConsoleCommandsHandler
|
|||||||
{
|
{
|
||||||
if (name == "")
|
if (name == "")
|
||||||
{
|
{
|
||||||
isDownloading = false;
|
|
||||||
Console_Utilities.WriteColorText("Name is invalid");
|
Console_Utilities.WriteColorText("Name is invalid");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
isDownloading = false;
|
|
||||||
Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" + " Use &glistplugs &ccommand to display all available plugins !");
|
Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" +
|
||||||
|
" Use &glistplugs &ccommand to display all available plugins !"
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string path;
|
string path;
|
||||||
if (info[0] == "Command" || info[0] == "Event")
|
if (info[0] == "Command" || info[0] == "Event")
|
||||||
path = "./Data/Plugins/" + info[0] + "s/" + name + "." + (info[0] == "Command" ? PluginLoader.pluginCMDExtension : PluginLoader.pluginEVEExtension);
|
path = "./Data/Plugins/" + info[0] + "s/" + name + ".dll";
|
||||||
else
|
else
|
||||||
path = $"./{info[1].Split('/')[info[1].Split('/').Length - 1]}";
|
path = $"./{info[1].Split('/')[info[1].Split('/').Length - 1]}";
|
||||||
//Console.WriteLine("Downloading: " + path + " [" + info[1] + "]");
|
|
||||||
await ServerCom.DownloadFileAsync(info[1], path);
|
await ServerCom.DownloadFileAsync(info[1], path);
|
||||||
if (info[0] == "Command" || info[0] == "Event")
|
if (info[0] == "Command" || info[0] == "Event")
|
||||||
if (info[0] == "Event")
|
if (info[0] == "Event")
|
||||||
Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Event));
|
Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Event));
|
||||||
else if (info[0] == "Command")
|
else if (info[0] == "Command") Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Command));
|
||||||
Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Command));
|
|
||||||
|
|
||||||
|
|
||||||
Console.WriteLine("\n");
|
Console.WriteLine("\n");
|
||||||
@@ -179,25 +146,40 @@ public class ConsoleCommandsHandler
|
|||||||
{
|
{
|
||||||
Console.WriteLine($"Downloading requirements for plugin : {name}");
|
Console.WriteLine($"Downloading requirements for plugin : {name}");
|
||||||
|
|
||||||
var lines = await ServerCom.ReadTextFromURL(info[2]);
|
var lines = await ServerCom.ReadTextFromFile(info[2]);
|
||||||
|
|
||||||
foreach (var line in lines)
|
foreach (var line in lines)
|
||||||
{
|
{
|
||||||
if (!(line.Length > 0 && line.Contains(",")))
|
if (!(line.Length > 0 && line.Contains(","))) continue;
|
||||||
continue;
|
|
||||||
var split = line.Split(',');
|
var split = line.Split(',');
|
||||||
Console.WriteLine($"\nDownloading item: {split[1]}");
|
Console.WriteLine($"\nDownloading item: {split[1]}");
|
||||||
if (File.Exists("./" + split[1])) File.Delete("./" + split[1]);
|
|
||||||
await ServerCom.DownloadFileAsync(split[0], "./" + split[1]);
|
await ServerCom.DownloadFileAsync(split[0], "./" + split[1]);
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
|
|
||||||
if (split[0].EndsWith(".zip") || split[0].EndsWith(".pak") || split[0].EndsWith(".pkg"))
|
if (split[0].EndsWith(".zip"))
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Extracting {split[1]} ...");
|
Console.WriteLine($"Extracting {split[1]}");
|
||||||
var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END) { Max = 100f, Color = ConsoleColor.Green };
|
var proc = 0d;
|
||||||
bar.Start();
|
var isExtracting = true;
|
||||||
await Functions.ExtractArchive("./" + split[1], "./", null, UnzipProgressType.PercentageFromTotalSize);
|
var bar = new Console_Utilities.ProgressBar { Max = 100, Color = ConsoleColor.Green };
|
||||||
bar.Stop();
|
|
||||||
|
IProgress<float> extractProgress = new Progress<float>(value => { proc = value; });
|
||||||
|
new Thread(new Task(() =>
|
||||||
|
{
|
||||||
|
while (isExtracting)
|
||||||
|
{
|
||||||
|
bar.Update((int)proc);
|
||||||
|
if (proc >= 99.9f) break;
|
||||||
|
Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).Start
|
||||||
|
).Start();
|
||||||
|
await Functions.ExtractArchive("./" + split[1], "./", extractProgress);
|
||||||
|
bar.Update(100);
|
||||||
|
isExtracting = false;
|
||||||
|
await Task.Delay(1000);
|
||||||
|
bar.Update(100);
|
||||||
Console.WriteLine("\n");
|
Console.WriteLine("\n");
|
||||||
File.Delete("./" + split[1]);
|
File.Delete("./" + split[1]);
|
||||||
}
|
}
|
||||||
@@ -205,32 +187,23 @@ public class ConsoleCommandsHandler
|
|||||||
|
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
}
|
}
|
||||||
VersionString? ver = await VersionString.GetVersionOfPackageFromWeb(name);
|
|
||||||
if (ver is null) throw new Exception("Incorrect version");
|
|
||||||
Config.SetPluginVersion(name, $"{ver.PackageVersionID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}");
|
|
||||||
// Console.WriteLine();
|
|
||||||
|
|
||||||
isDownloading = false;
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
AddCommand("value", "read value from VariableStack", "value [key]", args =>
|
AddCommand("value", "read value from VariableStack", "value [key]",args =>
|
||||||
{
|
{
|
||||||
if (args.Length != 2)
|
if (args.Length != 2) return;
|
||||||
return;
|
if (!Config.ContainsKey(args[1])) return;
|
||||||
if (!Config.ContainsKey(args[1]))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var data = Config.GetValue<string>(args[1]);
|
var data = Config.GetValue<string>(args[1]);
|
||||||
Console.WriteLine($"{args[1]} => {data}");
|
Console.WriteLine($"{args[1]} => {data}");
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
AddCommand("add", "add variable to the system variables", "add [key] [value] [isReadOnly=true/false]", args =>
|
AddCommand("add", "add variable to the system variables","add [key] [value] [isReadOnly=true/false]", args =>
|
||||||
{
|
{
|
||||||
if (args.Length < 4)
|
if (args.Length < 4) return;
|
||||||
return;
|
|
||||||
var key = args[1];
|
var key = args[1];
|
||||||
var value = args[2];
|
var value = args[2];
|
||||||
var isReadOnly = args[3].Equals("true", StringComparison.CurrentCultureIgnoreCase);
|
var isReadOnly = args[3].Equals("true", StringComparison.CurrentCultureIgnoreCase);
|
||||||
@@ -249,159 +222,46 @@ public class ConsoleCommandsHandler
|
|||||||
|
|
||||||
AddCommand("remv", "remove variable from system variables", "remv [key]", args =>
|
AddCommand("remv", "remove variable from system variables", "remv [key]", args =>
|
||||||
{
|
{
|
||||||
if (args.Length < 2)
|
if (args.Length < 2) return;
|
||||||
return;
|
|
||||||
Config.RemoveKey(args[1]);
|
Config.RemoveKey(args[1]);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
AddCommand("vars", "Display all variables", () =>
|
||||||
|
{
|
||||||
|
var d = Config.GetAllVariables();
|
||||||
|
var data = new List<string[]>();
|
||||||
|
data.Add(new[] { "-", "-" });
|
||||||
|
data.Add(new[] { "Key", "Value" });
|
||||||
|
data.Add(new[] { "-", "-" });
|
||||||
|
foreach (var kvp in d) data.Add(new[] { kvp.Key, kvp.Value.ToString()! });
|
||||||
|
data.Add(new[] { "-", "-" });
|
||||||
|
Console_Utilities.FormatAndAlignTable(data);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
AddCommand("sd", "Shuts down the discord bot", async () =>
|
AddCommand("sd", "Shuts down the discord bot", async () =>
|
||||||
{
|
{
|
||||||
if (client is null)
|
if (client is null) return;
|
||||||
return;
|
|
||||||
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
|
|
||||||
|
|
||||||
bar.Start();
|
|
||||||
await Config.SaveConfig(SaveType.NORMAL);
|
|
||||||
await Config.SaveConfig(SaveType.BACKUP);
|
|
||||||
await Task.Delay(4000);
|
|
||||||
bar.Stop();
|
|
||||||
Console.WriteLine();
|
|
||||||
await client.StopAsync();
|
await client.StopAsync();
|
||||||
await client.DisposeAsync();
|
await client.DisposeAsync();
|
||||||
|
Config.SaveConfig();
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
AddCommand("extern", "Load an external command", "extern [pluginName]", async (args) =>
|
|
||||||
{
|
|
||||||
if (args.Length <= 1) return;
|
|
||||||
string pName = Functions.MergeStrings(args, 1);
|
|
||||||
HttpClient client = new HttpClient();
|
|
||||||
string url = (await manager.GetPluginLinkByName(pName))[1];
|
|
||||||
Stream s = await client.GetStreamAsync(url);
|
|
||||||
MemoryStream str = new MemoryStream();
|
|
||||||
await s.CopyToAsync(str);
|
|
||||||
var asmb = Assembly.Load(str.ToArray());
|
|
||||||
|
|
||||||
var types = asmb.GetTypes();
|
|
||||||
foreach (var type in types)
|
|
||||||
{
|
|
||||||
if (type.IsClass && typeof(DBEvent).IsAssignableFrom(type))
|
|
||||||
{
|
|
||||||
DBEvent instance = (DBEvent)Activator.CreateInstance(type);
|
|
||||||
instance.Start(this.client);
|
|
||||||
Console.WriteLine($"Loaded external {type.FullName}!");
|
|
||||||
}
|
|
||||||
else if (type.IsClass && typeof(DBCommand).IsAssignableFrom(type))
|
|
||||||
{
|
|
||||||
Console.WriteLine("Only events can be loaded from external sources !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AddCommand("remplug", "Remove a plugin", "remplug [plugName]", async args =>
|
|
||||||
{
|
|
||||||
|
|
||||||
if (args.Length <= 1) return;
|
|
||||||
|
|
||||||
isDownloading = true;
|
|
||||||
string plugName = Functions.MergeStrings(args, 1);
|
|
||||||
if (pluginsLoaded)
|
|
||||||
{
|
|
||||||
if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS)
|
|
||||||
{
|
|
||||||
Process.Start("DiscordBot.exe", $"/remplug {plugName}");
|
|
||||||
await Task.Delay(100);
|
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Process.Start("./DiscordBot", $"/remplug {plugName}");
|
|
||||||
await Task.Delay(100);
|
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
isDownloading = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string location = "./Data/Plugins/";
|
|
||||||
|
|
||||||
location = Config.PluginConfig.GetPluginType(plugName) switch
|
|
||||||
{
|
|
||||||
PluginType.Command => location + "Commands/" + plugName + "." + PluginLoader.pluginCMDExtension,
|
|
||||||
PluginType.Event => location + "Events/" + plugName + "." + PluginLoader.pluginEVEExtension,
|
|
||||||
PluginType.Unknown => "./",
|
|
||||||
_ => throw new NotImplementedException("Plugin type incorrect")
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!File.Exists(location))
|
|
||||||
{
|
|
||||||
Console.WriteLine("The plugin does not exist");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
File.Delete(location);
|
|
||||||
if (Config.PluginConfig.Contains(plugName))
|
|
||||||
{
|
|
||||||
var tuple = Config.PluginConfig.InstalledPlugins.Where(t => t.Item1 == plugName).FirstOrDefault();
|
|
||||||
Console.WriteLine("Found: " + tuple.ToString());
|
|
||||||
Config.PluginConfig.InstalledPlugins.Remove(tuple);
|
|
||||||
Config.RemovePluginVersion(plugName);
|
|
||||||
await Config.SaveConfig(SaveType.NORMAL);
|
|
||||||
}
|
|
||||||
Console.WriteLine("Removed the plugin DLL. Checking for other files ...");
|
|
||||||
|
|
||||||
var info = await manager.GetPluginLinkByName(plugName);
|
|
||||||
if (info[2] != string.Empty)
|
|
||||||
{
|
|
||||||
var lines = await ServerCom.ReadTextFromURL(info[2]);
|
|
||||||
foreach (var line in lines)
|
|
||||||
{
|
|
||||||
if (!(line.Length > 0 && line.Contains(",")))
|
|
||||||
continue;
|
|
||||||
var split = line.Split(',');
|
|
||||||
if (File.Exists("./" + split[1]))
|
|
||||||
File.Delete("./" + split[1]);
|
|
||||||
|
|
||||||
|
|
||||||
Console.WriteLine("Removed: " + split[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (Directory.Exists(plugName))
|
|
||||||
Directory.Delete(plugName, true);
|
|
||||||
}
|
|
||||||
isDownloading = false;
|
|
||||||
Console.WriteLine(plugName + " has been successfully deleted !");
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
AddCommand("reload", "Reload the bot with all plugins", () =>
|
|
||||||
{
|
|
||||||
if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS)
|
|
||||||
{
|
|
||||||
Process.Start("DiscordBot.exe", $"lp");
|
|
||||||
HandleCommand("sd");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
Process.Start("./DiscordBot", $"lp");
|
|
||||||
HandleCommand("sd");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//Sort the commands by name
|
//Sort the commands by name
|
||||||
commandList.Sort((x, y) => x.CommandName.CompareTo(y.CommandName));
|
commandList.Sort((x, y) => x.CommandName.CompareTo(y.CommandName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddCommand(string command, string description, string usage, Action<string[]> action)
|
public static void AddCommand(string command, string description, string usage, Action<string[]> action)
|
||||||
{
|
{
|
||||||
commandList.Add(new ConsoleCommand { CommandName = command, Description = description, Action = action, Usage = usage });
|
commandList.Add(new ConsoleCommand
|
||||||
|
{
|
||||||
|
CommandName = command,
|
||||||
|
Description = description,
|
||||||
|
Action = action,
|
||||||
|
Usage = usage
|
||||||
|
});
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
Console_Utilities.WriteColorText($"Command &r{command} &cadded to the list of commands");
|
Console_Utilities.WriteColorText($"Command &r{command} &cadded to the list of commands");
|
||||||
}
|
}
|
||||||
@@ -418,7 +278,7 @@ public class ConsoleCommandsHandler
|
|||||||
|
|
||||||
public static bool CommandExists(string command)
|
public static bool CommandExists(string command)
|
||||||
{
|
{
|
||||||
return GetCommand(command) is not null;
|
return !(GetCommand(command) is null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ConsoleCommand? GetCommand(string command)
|
public static ConsoleCommand? GetCommand(string command)
|
||||||
@@ -426,24 +286,8 @@ public class ConsoleCommandsHandler
|
|||||||
return commandList.FirstOrDefault(t => t.CommandName == command);
|
return commandList.FirstOrDefault(t => t.CommandName == command);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task ExecuteCommad(string command)
|
|
||||||
{
|
|
||||||
var args = command.Split(' ');
|
|
||||||
// Console.WriteLine(command);
|
|
||||||
foreach (var item in commandList.ToList())
|
|
||||||
if (item.CommandName == args[0])
|
|
||||||
{
|
|
||||||
item.Action.Invoke(args);
|
|
||||||
Console.WriteLine();
|
|
||||||
|
|
||||||
while (isDownloading) await Task.Delay(1000);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool HandleCommand(string command, bool removeCommandExecution = true)
|
public bool HandleCommand(string command, bool removeCommandExecution = true)
|
||||||
{
|
{
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
|
||||||
var args = command.Split(' ');
|
var args = command.Split(' ');
|
||||||
foreach (var item in commandList.ToList())
|
foreach (var item in commandList.ToList())
|
||||||
if (item.CommandName == args[0])
|
if (item.CommandName == args[0])
|
||||||
@@ -451,14 +295,12 @@ public class ConsoleCommandsHandler
|
|||||||
if (removeCommandExecution)
|
if (removeCommandExecution)
|
||||||
{
|
{
|
||||||
Console.SetCursorPosition(0, Console.CursorTop - 1);
|
Console.SetCursorPosition(0, Console.CursorTop - 1);
|
||||||
for (int i = 0; i < command.Length + 30; i++)
|
for (int i = 0; i < command.Length; i++) Console.Write(" ");
|
||||||
Console.Write(" ");
|
|
||||||
Console.SetCursorPosition(0, Console.CursorTop);
|
Console.SetCursorPosition(0, Console.CursorTop);
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
item.Action(args);
|
item.Action(args);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,6 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
using PluginManager.Online.Updates;
|
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Loaders;
|
namespace PluginManager.Loaders;
|
||||||
@@ -52,7 +49,6 @@ internal class Loader<T>
|
|||||||
var files = Directory.GetFiles(path, $"*.{extension}", SearchOption.AllDirectories);
|
var files = Directory.GetFiles(path, $"*.{extension}", SearchOption.AllDirectories);
|
||||||
foreach (var file in files)
|
foreach (var file in files)
|
||||||
{
|
{
|
||||||
|
|
||||||
Assembly.LoadFrom(file);
|
Assembly.LoadFrom(file);
|
||||||
if (FileLoaded != null)
|
if (FileLoaded != null)
|
||||||
{
|
{
|
||||||
@@ -61,7 +57,7 @@ internal class Loader<T>
|
|||||||
Exception = null,
|
Exception = null,
|
||||||
TypeName = nameof(T),
|
TypeName = nameof(T),
|
||||||
IsLoaded = false,
|
IsLoaded = false,
|
||||||
PluginName = new FileInfo(file).Name.Split('.')[0],
|
PluginName = file,
|
||||||
Plugin = null
|
Plugin = null
|
||||||
};
|
};
|
||||||
FileLoaded.Invoke(args);
|
FileLoaded.Invoke(args);
|
||||||
|
|||||||
@@ -1,15 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
using PluginManager.Online.Helpers;
|
|
||||||
using PluginManager.Online.Updates;
|
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Loaders;
|
namespace PluginManager.Loaders;
|
||||||
@@ -60,45 +52,8 @@ public class PluginLoader
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main mathod that is called to load all events
|
/// The main mathod that is called to load all events
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public async void LoadPlugins()
|
public void LoadPlugins()
|
||||||
{
|
{
|
||||||
//Check for updates in commands
|
|
||||||
foreach (var file in Directory.GetFiles("./Data/Plugins/Commands", $"*.{pluginCMDExtension}", SearchOption.AllDirectories))
|
|
||||||
{
|
|
||||||
await Task.Run(async () =>
|
|
||||||
{
|
|
||||||
string name = new FileInfo(file).Name.Split('.')[0];
|
|
||||||
if (!Config.PluginVersionsContainsKey(name))
|
|
||||||
Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0");
|
|
||||||
|
|
||||||
if (await PluginUpdater.CheckForUpdates(name))
|
|
||||||
await PluginUpdater.Download(name);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check for updates in events
|
|
||||||
foreach (var file in Directory.GetFiles("./Data/Plugins/Events", $"*.{pluginEVEExtension}", SearchOption.AllDirectories))
|
|
||||||
{
|
|
||||||
await Task.Run(async () =>
|
|
||||||
{
|
|
||||||
string name = new FileInfo(file).Name.Split('.')[0];
|
|
||||||
if (!Config.PluginVersionsContainsKey(name))
|
|
||||||
Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0");
|
|
||||||
|
|
||||||
if (await PluginUpdater.CheckForUpdates(name))
|
|
||||||
await PluginUpdater.Download(name);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Save the new config file (after the updates)
|
|
||||||
await Config.SaveConfig(SaveType.NORMAL);
|
|
||||||
|
|
||||||
|
|
||||||
//Load all plugins
|
|
||||||
|
|
||||||
Commands = new List<DBCommand>();
|
Commands = new List<DBCommand>();
|
||||||
Events = new List<DBEvent>();
|
Events = new List<DBEvent>();
|
||||||
|
|
||||||
@@ -116,42 +71,24 @@ public class PluginLoader
|
|||||||
|
|
||||||
Commands = commandsLoader.Load();
|
Commands = commandsLoader.Load();
|
||||||
Events = eventsLoader.Load();
|
Events = eventsLoader.Load();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EventFileLoaded(LoaderArgs e)
|
private void EventFileLoaded(LoaderArgs e)
|
||||||
{
|
{
|
||||||
if (!e.IsLoaded)
|
if (e.IsLoaded) Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !");
|
||||||
{
|
|
||||||
Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnCommandFileLoaded(LoaderArgs e)
|
private void OnCommandFileLoaded(LoaderArgs e)
|
||||||
{
|
{
|
||||||
if (!e.IsLoaded)
|
if (e.IsLoaded) Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !");
|
||||||
{
|
|
||||||
Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnEventLoaded(LoaderArgs e)
|
private void OnEventLoaded(LoaderArgs e)
|
||||||
{
|
{
|
||||||
try
|
if (e.IsLoaded) ((DBEvent)e.Plugin!).Start(_client);
|
||||||
{
|
|
||||||
if (e.IsLoaded)
|
|
||||||
((DBEvent)e.Plugin!).Start(_client);
|
|
||||||
|
|
||||||
onEVELoad?.Invoke(((DBEvent)e.Plugin!).name, e.TypeName!, e.IsLoaded, e.Exception);
|
onEVELoad?.Invoke(((DBEvent)e.Plugin!).name, e.TypeName!, e.IsLoaded, e.Exception);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex.ToString());
|
|
||||||
Console.WriteLine("Plugin: " + e.PluginName);
|
|
||||||
Console.WriteLine("Type: " + e.TypeName);
|
|
||||||
Console.WriteLine("IsLoaded: " + e.IsLoaded);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnCommandLoaded(LoaderArgs e)
|
private void OnCommandLoaded(LoaderArgs e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,19 +18,21 @@ namespace PluginManager.Online.Helpers
|
|||||||
/// <param name="progress">The <see cref="IProgress{T}"/> that is used to track the download progress</param>
|
/// <param name="progress">The <see cref="IProgress{T}"/> that is used to track the download progress</param>
|
||||||
/// <param name="cancellation">The cancellation token</param>
|
/// <param name="cancellation">The cancellation token</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination, IProgress<float>? progress = null, IProgress<long>? downloadedBytes = null, int bufferSize = 81920, CancellationToken cancellation = default)
|
internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination,
|
||||||
|
IProgress<float>? progress = null, IProgress<long>? downloadedBytes = null, CancellationToken cancellation = default)
|
||||||
{
|
{
|
||||||
using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation))
|
using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
|
||||||
{
|
{
|
||||||
var contentLength = response.Content.Headers.ContentLength;
|
var contentLength = response.Content.Headers.ContentLength;
|
||||||
|
|
||||||
using (var download = await response.Content.ReadAsStreamAsync(cancellation))
|
using (var download = await response.Content.ReadAsStreamAsync())
|
||||||
{
|
{
|
||||||
|
|
||||||
// Ignore progress reporting when no progress reporter was
|
// Ignore progress reporting when no progress reporter was
|
||||||
// passed or when the content length is unknown
|
// passed or when the content length is unknown
|
||||||
if (progress == null || !contentLength.HasValue)
|
if (progress == null || !contentLength.HasValue)
|
||||||
{
|
{
|
||||||
await download.CopyToAsync(destination, cancellation);
|
await download.CopyToAsync(destination);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,11 +41,9 @@ namespace PluginManager.Online.Helpers
|
|||||||
{
|
{
|
||||||
progress.Report((float)totalBytes / contentLength.Value * 100);
|
progress.Report((float)totalBytes / contentLength.Value * 100);
|
||||||
downloadedBytes?.Report(totalBytes);
|
downloadedBytes?.Report(totalBytes);
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
// Use extension method to report progress while downloading
|
// Use extension method to report progress while downloading
|
||||||
await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation);
|
await download.CopyToOtherStreamAsync(destination, 81920, relativeProgress, cancellation);
|
||||||
progress.Report(1);
|
progress.Report(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,8 +57,10 @@ namespace PluginManager.Online.Helpers
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
internal static async Task<string> DownloadStringAsync(string url, CancellationToken cancellation = default)
|
internal static async Task<string> DownloadStringAsync(string url, CancellationToken cancellation = default)
|
||||||
{
|
{
|
||||||
using var client = new HttpClient();
|
using (var client = new HttpClient())
|
||||||
return await client.GetStringAsync(url, cancellation);
|
{
|
||||||
|
return await client.GetStringAsync(url);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PluginManager.Online.Helpers
|
|
||||||
{
|
|
||||||
public class VersionString
|
|
||||||
{
|
|
||||||
public int PackageVersionID;
|
|
||||||
public int PackageMainVersion;
|
|
||||||
public int PackageCheckVersion;
|
|
||||||
|
|
||||||
public VersionString(string version)
|
|
||||||
{
|
|
||||||
string[] data = version.Split('.');
|
|
||||||
try
|
|
||||||
{
|
|
||||||
PackageVersionID = int.Parse(data[0]);
|
|
||||||
PackageMainVersion = int.Parse(data[1]);
|
|
||||||
PackageCheckVersion = int.Parse(data[2]);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new Exception("Failed to write Version", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region operators
|
|
||||||
public static bool operator >(VersionString s1, VersionString s2)
|
|
||||||
{
|
|
||||||
if (s1.PackageVersionID > s2.PackageVersionID) return true;
|
|
||||||
if (s1.PackageVersionID == s2.PackageVersionID)
|
|
||||||
{
|
|
||||||
if (s1.PackageMainVersion > s2.PackageMainVersion) return true;
|
|
||||||
if (s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion > s2.PackageCheckVersion) return true;
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
public static bool operator <(VersionString s1, VersionString s2) => !(s1 > s2) && s1 != s2;
|
|
||||||
|
|
||||||
public static bool operator ==(VersionString s1, VersionString s2)
|
|
||||||
{
|
|
||||||
if (s1.PackageVersionID == s2.PackageVersionID && s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion == s2.PackageCheckVersion) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool operator !=(VersionString s1, VersionString s2) => !(s1 == s2);
|
|
||||||
|
|
||||||
public static bool operator <=(VersionString s1, VersionString s2) => (s1 < s2 || s1 == s2);
|
|
||||||
public static bool operator >=(VersionString s1, VersionString s2) => (s1 > s2 || s1 == s2);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return "{PackageID: " + PackageVersionID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}";
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ToShortString()
|
|
||||||
{
|
|
||||||
if (PackageVersionID == 0 && PackageCheckVersion == 0 && PackageMainVersion == 0)
|
|
||||||
return "Unknown";
|
|
||||||
return $"{PackageVersionID}.{PackageMainVersion}.{PackageCheckVersion}";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VersionString? GetVersionOfPackage(string pakName)
|
|
||||||
{
|
|
||||||
if (!Config.PluginVersionsContainsKey(pakName))
|
|
||||||
return null;
|
|
||||||
return new VersionString(Config.GetPluginVersion(pakName));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<VersionString?> GetVersionOfPackageFromWeb(string pakName)
|
|
||||||
{
|
|
||||||
string url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions";
|
|
||||||
List<string> data = await ServerCom.ReadTextFromURL(url);
|
|
||||||
string? version = (from item in data
|
|
||||||
where !item.StartsWith("#") && item.StartsWith(pakName)
|
|
||||||
select item.Split(',')[1]).FirstOrDefault();
|
|
||||||
if (version == default || version == null) return null;
|
|
||||||
return new VersionString(version);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using PluginManager.Online.Helpers;
|
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
using OperatingSystem = PluginManager.Others.OperatingSystem;
|
using OperatingSystem = PluginManager.Others.OperatingSystem;
|
||||||
|
|
||||||
namespace PluginManager.Online;
|
namespace PluginManager.Online;
|
||||||
@@ -33,21 +30,20 @@ public class PluginsManager
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var list = await ServerCom.ReadTextFromURL(PluginsLink);
|
var list = await ServerCom.ReadTextFromFile(PluginsLink);
|
||||||
var lines = list.ToArray();
|
var lines = list.ToArray();
|
||||||
|
|
||||||
var data = new List<string[]>();
|
var data = new List<string[]>();
|
||||||
var op = Functions.GetOperatingSystem();
|
var op = Functions.GetOperatingSystem();
|
||||||
|
|
||||||
var len = lines.Length;
|
var len = lines.Length;
|
||||||
string[] titles = { "Name", "Description", "Type", "Version", "Installed" };
|
string[] titles = { "Name", "Description", "Plugin Type", "Libraries", "Installed" };
|
||||||
data.Add(new[] { "-", "-", "-", "-", "-" });
|
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||||
data.Add(titles);
|
data.Add(titles);
|
||||||
data.Add(new[] { "-", "-", "-", "-", "-" });
|
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||||
for (var i = 0; i < len; i++)
|
for (var i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
if (lines[i].Length <= 2)
|
if (lines[i].Length <= 2) continue;
|
||||||
continue;
|
|
||||||
var content = lines[i].Split(',');
|
var content = lines[i].Split(',');
|
||||||
var display = new string[titles.Length];
|
var display = new string[titles.Length];
|
||||||
if (op == OperatingSystem.WINDOWS)
|
if (op == OperatingSystem.WINDOWS)
|
||||||
@@ -57,7 +53,11 @@ public class PluginsManager
|
|||||||
display[0] = content[0];
|
display[0] = content[0];
|
||||||
display[1] = content[1];
|
display[1] = content[1];
|
||||||
display[2] = content[2];
|
display[2] = content[2];
|
||||||
display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString();
|
if (content.Length == 6 && (content[5] != null || content[5].Length > 2))
|
||||||
|
display[3] = ((await ServerCom.ReadTextFromFile(content[5])).Count + 1).ToString();
|
||||||
|
|
||||||
|
else
|
||||||
|
display[3] = "1";
|
||||||
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
||||||
display[4] = "✓";
|
display[4] = "✓";
|
||||||
else
|
else
|
||||||
@@ -72,7 +72,7 @@ public class PluginsManager
|
|||||||
display[0] = content[0];
|
display[0] = content[0];
|
||||||
display[1] = content[1];
|
display[1] = content[1];
|
||||||
display[2] = content[2];
|
display[2] = content[2];
|
||||||
display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString();
|
if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) display[3] = ((await ServerCom.ReadTextFromFile(content[5])).Count + 1).ToString();
|
||||||
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
||||||
display[4] = "✓";
|
display[4] = "✓";
|
||||||
else
|
else
|
||||||
@@ -84,11 +84,11 @@ public class PluginsManager
|
|||||||
|
|
||||||
data.Add(new[] { "-", "-", "-", "-", "-" });
|
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||||
|
|
||||||
Console_Utilities.FormatAndAlignTable(data, TableFormat.CENTER_EACH_COLUMN_BASED);
|
Console_Utilities.FormatAndAlignTable(data);
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message);
|
Console.WriteLine("Failed to execute command: listlang\nReason: " + exception.Message);
|
||||||
Functions.WriteErrFile(exception.ToString());
|
Functions.WriteErrFile(exception.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,7 +102,7 @@ public class PluginsManager
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var list = await ServerCom.ReadTextFromURL(PluginsLink);
|
var list = await ServerCom.ReadTextFromFile(PluginsLink);
|
||||||
var lines = list.ToArray();
|
var lines = list.ToArray();
|
||||||
var len = lines.Length;
|
var len = lines.Length;
|
||||||
for (var i = 0; i < len; i++)
|
for (var i = 0; i < len; i++)
|
||||||
@@ -110,10 +110,8 @@ public class PluginsManager
|
|||||||
var contents = lines[i].Split(',');
|
var contents = lines[i].Split(',');
|
||||||
if (contents[0] == name)
|
if (contents[0] == name)
|
||||||
{
|
{
|
||||||
if (contents.Length == 6)
|
if (contents.Length == 6) return new[] { contents[2], contents[3], contents[5] };
|
||||||
return new[] { contents[2], contents[3], contents[5] };
|
if (contents.Length == 5) return new[] { contents[2], contents[3], string.Empty };
|
||||||
if (contents.Length == 5)
|
|
||||||
return new[] { contents[2], contents[3], string.Empty };
|
|
||||||
throw new Exception("Failed to download plugin. Invalid Argument Length");
|
throw new Exception("Failed to download plugin. Invalid Argument Length");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,14 +9,15 @@ using PluginManager.Others;
|
|||||||
|
|
||||||
namespace PluginManager.Online
|
namespace PluginManager.Online
|
||||||
{
|
{
|
||||||
public static class ServerCom
|
public class ServerCom
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Read all lines from a file async
|
/// Read all lines from a file async
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="link">The link of the file</param>
|
/// <param name="link">The link of the file</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static async Task<List<string>> ReadTextFromURL(string link)
|
public static async Task<List<string>> ReadTextFromFile(string link)
|
||||||
{
|
{
|
||||||
string response = await OnlineFunctions.DownloadStringAsync(link);
|
string response = await OnlineFunctions.DownloadStringAsync(link);
|
||||||
string[] lines = response.Split('\n');
|
string[] lines = response.Split('\n');
|
||||||
@@ -52,11 +53,14 @@ namespace PluginManager.Online
|
|||||||
public static async Task DownloadFileAsync(string URL, string location)
|
public static async Task DownloadFileAsync(string URL, string location)
|
||||||
{
|
{
|
||||||
bool isDownloading = true;
|
bool isDownloading = true;
|
||||||
float c_progress = 0;
|
int c_progress = 0;
|
||||||
|
|
||||||
Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, NoColor = true };
|
Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar { Max = 100, NoColor = true };
|
||||||
|
|
||||||
IProgress<float> progress = new Progress<float>(percent => { c_progress = percent; });
|
IProgress<float> progress = new Progress<float>(percent =>
|
||||||
|
{
|
||||||
|
c_progress = (int)percent;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
Task updateProgressBarTask = new Task(() =>
|
Task updateProgressBarTask = new Task(() =>
|
||||||
@@ -64,8 +68,7 @@ namespace PluginManager.Online
|
|||||||
while (isDownloading)
|
while (isDownloading)
|
||||||
{
|
{
|
||||||
pbar.Update(c_progress);
|
pbar.Update(c_progress);
|
||||||
if (c_progress == 100f)
|
if (c_progress == 100) break;
|
||||||
break;
|
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,15 +78,9 @@ namespace PluginManager.Online
|
|||||||
await DownloadFileAsync(URL, location, progress);
|
await DownloadFileAsync(URL, location, progress);
|
||||||
|
|
||||||
|
|
||||||
c_progress = pbar.Max;
|
c_progress = 100;
|
||||||
pbar.Update(100f);
|
pbar.Update(100);
|
||||||
isDownloading = false;
|
isDownloading = false;
|
||||||
}
|
}
|
||||||
public static async Task DownloadFileNoProgressAsync(string URL, string location)
|
|
||||||
{
|
|
||||||
IProgress<float> progress = new Progress<float>();
|
|
||||||
await DownloadFileAsync(URL, location, progress);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
using PluginManager.Items;
|
|
||||||
using PluginManager.Online.Helpers;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace PluginManager.Online.Updates
|
|
||||||
{
|
|
||||||
public class PluginUpdater
|
|
||||||
{
|
|
||||||
public static async Task<bool> CheckForUpdates(string pakName)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var webV = await VersionString.GetVersionOfPackageFromWeb(pakName);
|
|
||||||
var local = VersionString.GetVersionOfPackage(pakName);
|
|
||||||
|
|
||||||
if (local is null) return true;
|
|
||||||
if (webV is null) return false;
|
|
||||||
|
|
||||||
if (webV == local) return false;
|
|
||||||
if (webV > local) return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex) { Console.WriteLine(ex.Message); }
|
|
||||||
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<Update> DownloadUpdateInfo(string pakName)
|
|
||||||
{
|
|
||||||
string url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions";
|
|
||||||
List<string> info = await ServerCom.ReadTextFromURL(url);
|
|
||||||
VersionString? version = await VersionString.GetVersionOfPackageFromWeb(pakName);
|
|
||||||
|
|
||||||
if (version is null) return Update.Empty;
|
|
||||||
Update update = new Update(pakName, string.Join('\n', info), version);
|
|
||||||
return update;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task Download(string pakName)
|
|
||||||
{
|
|
||||||
Console_Utilities.WriteColorText("An update was found for &g" + pakName + "&c. Version: &r" + (await VersionString.GetVersionOfPackageFromWeb(pakName))?.ToShortString() + "&c. Current Version: &y" + VersionString.GetVersionOfPackage(pakName)?.ToShortString());
|
|
||||||
await ConsoleCommandsHandler.ExecuteCommad("dwplug " + pakName);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
using PluginManager.Online.Helpers;
|
|
||||||
|
|
||||||
namespace PluginManager.Online.Updates
|
|
||||||
{
|
|
||||||
public class Update
|
|
||||||
{
|
|
||||||
public static Update Empty = new Update(null, null, null);
|
|
||||||
public string pakName;
|
|
||||||
public string UpdateMessage;
|
|
||||||
|
|
||||||
public VersionString newVersion;
|
|
||||||
|
|
||||||
private bool isEmpty;
|
|
||||||
|
|
||||||
public Update(string pakName, string updateMessage, VersionString newVersion)
|
|
||||||
{
|
|
||||||
this.pakName = pakName;
|
|
||||||
UpdateMessage = updateMessage;
|
|
||||||
this.newVersion = newVersion;
|
|
||||||
|
|
||||||
if (pakName is null && updateMessage is null && newVersion is null)
|
|
||||||
isEmpty = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
if (isEmpty)
|
|
||||||
throw new System.Exception("The update is EMPTY. Can not print information about an empty update !");
|
|
||||||
return $"Package Name: {this.pakName}\n" +
|
|
||||||
$"Update Message: {UpdateMessage}\n" +
|
|
||||||
$"Version: {newVersion.ToString()}";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,115 +1,25 @@
|
|||||||
using Discord;
|
using System;
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace PluginManager.Others
|
namespace PluginManager.Others
|
||||||
{
|
{
|
||||||
public static class Console_Utilities
|
public class Console_Utilities
|
||||||
{
|
{
|
||||||
public static void Initialize()
|
|
||||||
{
|
|
||||||
if (!Config.ContainsKey("TableVariables"))
|
|
||||||
Config.AddValueToVariables("TableVariables", new Dictionary<string, string> { { "DefaultSpace", "3" } }, false);
|
|
||||||
if (!Config.ContainsKey("ColorDataBase"))
|
|
||||||
Config.AddValueToVariables("ColorDataBase", new Dictionary<char, ConsoleColor>()
|
|
||||||
{
|
|
||||||
{ 'g', ConsoleColor.Green },
|
|
||||||
{ 'b', ConsoleColor.Blue },
|
|
||||||
{ 'r', ConsoleColor.Red },
|
|
||||||
{ 'm', ConsoleColor.Magenta },
|
|
||||||
{ 'y', ConsoleColor.Yellow },
|
|
||||||
}, false
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!Config.ContainsKey("ColorPrefix"))
|
|
||||||
Config.AddValueToVariables("ColorPrefix", '&', false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Progress bar object
|
/// Progress bar object
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ProgressBar
|
public class ProgressBar
|
||||||
{
|
{
|
||||||
public ProgressBar(ProgressBarType type)
|
public int Max { get; init; }
|
||||||
{
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float Max { get; init; }
|
|
||||||
public ConsoleColor Color { get; init; }
|
public ConsoleColor Color { get; init; }
|
||||||
public bool NoColor { get; init; }
|
public bool NoColor { get; init; }
|
||||||
public ProgressBarType type { get; set; }
|
|
||||||
|
|
||||||
private int BarLength = 32;
|
|
||||||
private int position = 1;
|
|
||||||
private bool positive = true;
|
|
||||||
|
|
||||||
private bool isRunning;
|
public void Update(int progress, double speed = -1, string? unit = null)
|
||||||
|
|
||||||
public async void Start()
|
|
||||||
{
|
|
||||||
if (type != ProgressBarType.NO_END)
|
|
||||||
throw new Exception("Only NO_END progress bar can use this method");
|
|
||||||
if (isRunning)
|
|
||||||
throw new Exception("This progress bar is already running");
|
|
||||||
|
|
||||||
isRunning = true;
|
|
||||||
while (isRunning)
|
|
||||||
{
|
|
||||||
UpdateNoEnd();
|
|
||||||
await System.Threading.Tasks.Task.Delay(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
if (type != ProgressBarType.NO_END)
|
|
||||||
throw new Exception("Only NO_END progress bar can use this method");
|
|
||||||
if (!isRunning)
|
|
||||||
throw new Exception("Can not stop a progressbar that did not start");
|
|
||||||
isRunning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update(float progress)
|
|
||||||
{
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case ProgressBarType.NORMAL:
|
|
||||||
UpdateNormal(progress);
|
|
||||||
return;
|
|
||||||
case ProgressBarType.NO_END:
|
|
||||||
if (progress <= 99.9f)
|
|
||||||
UpdateNoEnd();
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateNoEnd()
|
|
||||||
{
|
{
|
||||||
Console.CursorLeft = 0;
|
Console.CursorLeft = 0;
|
||||||
Console.Write("[");
|
Console.Write("[");
|
||||||
for (int i = 1; i <= position; i++)
|
Console.CursorLeft = 32;
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write("<==()==>");
|
|
||||||
position += positive ? 1 : -1;
|
|
||||||
for (int i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++)
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write("]");
|
|
||||||
|
|
||||||
|
|
||||||
if (position == BarLength - 1 || position == 1)
|
|
||||||
positive = !positive;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateNormal(float progress)
|
|
||||||
{
|
|
||||||
Console.CursorLeft = 0;
|
|
||||||
Console.Write("[");
|
|
||||||
Console.CursorLeft = BarLength;
|
|
||||||
Console.Write("]");
|
Console.Write("]");
|
||||||
Console.CursorLeft = 1;
|
Console.CursorLeft = 1;
|
||||||
float onechunk = 30.0f / Max;
|
float onechunk = 30.0f / Max;
|
||||||
@@ -118,38 +28,44 @@ namespace PluginManager.Others
|
|||||||
|
|
||||||
for (int i = 0; i < onechunk * progress; i++)
|
for (int i = 0; i < onechunk * progress; i++)
|
||||||
{
|
{
|
||||||
Console.BackgroundColor = NoColor ? ConsoleColor.Black : this.Color;
|
if (NoColor)
|
||||||
|
Console.BackgroundColor = ConsoleColor.Black; //this.Color
|
||||||
|
else
|
||||||
|
Console.BackgroundColor = this.Color;
|
||||||
Console.CursorLeft = position++;
|
Console.CursorLeft = position++;
|
||||||
Console.Write("#");
|
Console.Write("#");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = position; i < BarLength; i++)
|
for (int i = position; i <= 31; i++)
|
||||||
{
|
{
|
||||||
Console.BackgroundColor = NoColor ? ConsoleColor.Black : ConsoleColor.DarkGray;
|
if (NoColor)
|
||||||
|
Console.BackgroundColor = ConsoleColor.Black; // background of empty bar
|
||||||
|
else
|
||||||
|
Console.BackgroundColor = ConsoleColor.DarkGray;
|
||||||
Console.CursorLeft = position++;
|
Console.CursorLeft = position++;
|
||||||
Console.Write(" ");
|
Console.Write(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.CursorLeft = BarLength + 4;
|
Console.CursorLeft = 35;
|
||||||
Console.BackgroundColor = ConsoleColor.Black;
|
Console.BackgroundColor = ConsoleColor.Black;
|
||||||
if (progress.CanAproximateTo(Max))
|
if (speed == -1 || unit == null)
|
||||||
Console.Write(progress + " % ✓");
|
{
|
||||||
|
if (progress == Max)
|
||||||
|
Console.Write(progress.ToString() + " % ✓");
|
||||||
|
else Console.Write(progress.ToString() + " % ");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
Console.Write(MathF.Round(progress, 2) + " % ");
|
Console.Write(progress.ToString() + $"{speed} {unit}/s ");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static bool CanAproximateTo(this float f, float y) => (MathF.Abs(f - y) < 0.000001);
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A way to create a table based on input data
|
/// A way to create a table based on input data
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="data">The List of arrays of strings that represent the rows.</param>
|
/// <param name="data">The List of arrays of strings that represent the rows.</param>
|
||||||
public static void FormatAndAlignTable(List<string[]> data, TableFormat format)
|
public static void FormatAndAlignTable(List<string[]> data)
|
||||||
{
|
|
||||||
if (format == TableFormat.CENTER_EACH_COLUMN_BASED)
|
|
||||||
{
|
{
|
||||||
char tableLine = '-';
|
char tableLine = '-';
|
||||||
char tableCross = '+';
|
char tableCross = '+';
|
||||||
@@ -157,17 +73,17 @@ namespace PluginManager.Others
|
|||||||
|
|
||||||
int[] len = new int[data[0].Length];
|
int[] len = new int[data[0].Length];
|
||||||
foreach (var line in data)
|
foreach (var line in data)
|
||||||
|
{
|
||||||
for (int i = 0; i < line.Length; i++)
|
for (int i = 0; i < line.Length; i++)
|
||||||
if (line[i].Length > len[i])
|
if (line[i].Length > len[i])
|
||||||
len[i] = line[i].Length;
|
len[i] = line[i].Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
foreach (string[] row in data)
|
foreach (string[] row in data)
|
||||||
{
|
{
|
||||||
if (row[0][0] == tableLine)
|
if (row[0][0] == tableLine) Console.Write(tableCross);
|
||||||
Console.Write(tableCross);
|
else Console.Write(tableWall);
|
||||||
else
|
|
||||||
Console.Write(tableWall);
|
|
||||||
for (int l = 0; l < row.Length; l++)
|
for (int l = 0; l < row.Length; l++)
|
||||||
{
|
{
|
||||||
if (row[l][0] == tableLine)
|
if (row[l][0] == tableLine)
|
||||||
@@ -183,6 +99,7 @@ namespace PluginManager.Others
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
int lenHalf = row[l].Length / 2;
|
int lenHalf = row[l].Length / 2;
|
||||||
for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i)
|
for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i)
|
||||||
Console.Write(" ");
|
Console.Write(" ");
|
||||||
@@ -193,132 +110,47 @@ namespace PluginManager.Others
|
|||||||
Console.Write(" ");
|
Console.Write(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.Write(row[l][0] == tableLine ? tableCross : tableWall);
|
if (row[l][0] == tableLine) Console.Write(tableCross);
|
||||||
|
else Console.Write(tableWall);
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine(); //end line
|
Console.WriteLine(); //end line
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format == TableFormat.CENTER_OVERALL_LENGTH)
|
|
||||||
{
|
|
||||||
int maxLen = 0;
|
|
||||||
foreach (string[] row in data)
|
|
||||||
foreach (string s in row)
|
|
||||||
if (s.Length > maxLen)
|
|
||||||
maxLen = s.Length;
|
|
||||||
|
|
||||||
int div = (maxLen + 4) / 2;
|
|
||||||
|
|
||||||
foreach (string[] row in data)
|
|
||||||
{
|
|
||||||
Console.Write("\t");
|
|
||||||
if (row[0] == "-")
|
|
||||||
Console.Write("+");
|
|
||||||
else
|
|
||||||
Console.Write("|");
|
|
||||||
|
|
||||||
foreach (string s in row)
|
|
||||||
{
|
|
||||||
if (s == "-")
|
|
||||||
{
|
|
||||||
for (int i = 0; i < maxLen + 4; ++i)
|
|
||||||
Console.Write("-");
|
|
||||||
}
|
|
||||||
else if (s.Length == maxLen)
|
|
||||||
{
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write(s);
|
|
||||||
Console.Write(" ");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int lenHalf = s.Length / 2;
|
|
||||||
for (int i = 0; i < div - lenHalf; ++i)
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write(s);
|
|
||||||
for (int i = div + lenHalf + 1; i < maxLen + 4; ++i)
|
|
||||||
Console.Write(" ");
|
|
||||||
if (s.Length % 2 == 0)
|
|
||||||
Console.Write(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s == "-")
|
|
||||||
Console.Write("+");
|
|
||||||
else
|
|
||||||
Console.Write("|");
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine(); //end line
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format == TableFormat.DEFAULT)
|
|
||||||
{
|
|
||||||
int[] widths = new int[data[0].Length];
|
|
||||||
int space_between_columns = int.Parse(Config.GetValue<Dictionary<string, string>>("TableVariables")?["DefaultSpace"]!);
|
|
||||||
for (int i = 0; i < data.Count; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < data[i].Length; j++)
|
|
||||||
{
|
|
||||||
if (data[i][j].Length > widths[j])
|
|
||||||
widths[j] = data[i][j].Length;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.Count; i++)
|
public static void WriteColorText(string text, bool appendNewLine = true)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < data[i].Length; j++)
|
|
||||||
|
string[] words = text.Split(' ');
|
||||||
|
ConsoleColor fg = Console.ForegroundColor;
|
||||||
|
Dictionary<string, ConsoleColor> colors = new Dictionary<string, ConsoleColor>()
|
||||||
{
|
{
|
||||||
if (data[i][j] == "-")
|
{ "&g", ConsoleColor.Green },
|
||||||
data[i][j] = " ";
|
{ "&b", ConsoleColor.Blue },
|
||||||
Console.Write(data[i][j]);
|
{ "&r", ConsoleColor.Red },
|
||||||
for (int k = 0; k < widths[j] - data[i][j].Length + 1 + space_between_columns; k++)
|
{ "&m", ConsoleColor.Magenta },
|
||||||
Console.Write(" ");
|
{ "&y", ConsoleColor.Yellow },
|
||||||
|
{ "&c", fg }
|
||||||
|
};
|
||||||
|
foreach (string word in words)
|
||||||
|
{
|
||||||
|
if (word.Length >= 2)
|
||||||
|
{
|
||||||
|
string prefix = word.Substring(0, 2);
|
||||||
|
if (colors.ContainsKey(prefix))
|
||||||
|
Console.ForegroundColor = colors[prefix];
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine();
|
string m = word;
|
||||||
|
foreach (var key in colors.Keys) { m = m.Replace(key, ""); }
|
||||||
|
|
||||||
|
Console.Write(m + " ");
|
||||||
|
}
|
||||||
|
if (appendNewLine)
|
||||||
|
Console.Write('\n');
|
||||||
|
|
||||||
|
Console.ForegroundColor = fg;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Exception("Unknown type of table");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteColorText(string text, bool appendNewLineAtEnd = true)
|
|
||||||
{
|
|
||||||
ConsoleColor initialForeGround = Console.ForegroundColor;
|
|
||||||
char[] input = text.ToCharArray();
|
|
||||||
for (int i = 0; i < input.Length; i++)
|
|
||||||
{
|
|
||||||
if (input[i] == Config.GetValue<char>("ColorPrefix"))
|
|
||||||
{
|
|
||||||
if (i + 1 < input.Length)
|
|
||||||
{
|
|
||||||
if (Config.GetValue<Dictionary<char, ConsoleColor>>("ColorDataBase")!.ContainsKey(input[i + 1]))
|
|
||||||
{
|
|
||||||
Console.ForegroundColor = Config.GetValue<Dictionary<char, ConsoleColor>>("ColorDataBase")![input[i + 1]];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else if (input[i + 1] == 'c')
|
|
||||||
{
|
|
||||||
Console.ForegroundColor = initialForeGround;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Console.Write(input[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.ForegroundColor = initialForeGround;
|
|
||||||
if (appendNewLineAtEnd)
|
|
||||||
Console.WriteLine();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,10 +27,3 @@ public enum OutputLogLevel { NONE, INFO, WARNING, ERROR, CRITICAL }
|
|||||||
/// Plugin Type
|
/// Plugin Type
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum PluginType { Command, Event, Unknown }
|
public enum PluginType { Command, Event, Unknown }
|
||||||
|
|
||||||
public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize }
|
|
||||||
|
|
||||||
public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT }
|
|
||||||
|
|
||||||
public enum SaveType { NORMAL, BACKUP }
|
|
||||||
public enum ProgressBarType { NORMAL, NO_END }
|
|
||||||
@@ -4,7 +4,6 @@ using System;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Security.Cryptography;
|
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using PluginManager.Items;
|
using PluginManager.Items;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -26,22 +25,17 @@ namespace PluginManager.Others
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The location for all logs
|
/// The location for all logs
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly string logFolder = @"./Data/Output/Logs/";
|
public static readonly string logFolder = @"./Output/Logs/";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The location for all errors
|
/// The location for all errors
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly string errFolder = @"./Data/Output/Errors/";
|
public static readonly string errFolder = @"./Output/Errors/";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Archives folder
|
/// Archives folder
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly string pakFolder = @"./Data/PAKS/";
|
public static readonly string pakFolder = @"./Data/Resources/PAK/";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Beta testing folder
|
|
||||||
/// </summary>
|
|
||||||
public static readonly string betaFolder = @"./Data/BetaTest/";
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -56,13 +50,25 @@ namespace PluginManager.Others
|
|||||||
Directory.CreateDirectory(pakFolder);
|
Directory.CreateDirectory(pakFolder);
|
||||||
if (!File.Exists(archFile)) throw new FileNotFoundException("Failed to load file !");
|
if (!File.Exists(archFile)) throw new FileNotFoundException("Failed to load file !");
|
||||||
|
|
||||||
using ZipArchive archive = ZipFile.OpenRead(archFile);
|
Stream? textValue = null;
|
||||||
ZipArchiveEntry? entry = archive.GetEntry(FileName);
|
var fs = new FileStream(archFile, FileMode.Open);
|
||||||
if (entry is null) return Stream.Null;
|
var zip = new ZipArchive(fs, ZipArchiveMode.Read);
|
||||||
MemoryStream stream = new MemoryStream();
|
foreach (var entry in zip.Entries)
|
||||||
await (entry?.Open()!).CopyToAsync(stream);
|
{
|
||||||
|
if (entry.Name == FileName || entry.FullName == FileName)
|
||||||
|
{
|
||||||
|
Stream s = entry.Open();
|
||||||
|
StreamReader reader = new StreamReader(s);
|
||||||
|
textValue = reader.BaseStream;
|
||||||
|
textValue.Position = 0;
|
||||||
|
reader.Close();
|
||||||
|
s.Close();
|
||||||
|
fs.Close();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return stream;
|
return textValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -71,8 +77,8 @@ namespace PluginManager.Others
|
|||||||
/// <param name="LogMessage">The message to be wrote</param>
|
/// <param name="LogMessage">The message to be wrote</param>
|
||||||
public static void WriteLogFile(string LogMessage)
|
public static void WriteLogFile(string LogMessage)
|
||||||
{
|
{
|
||||||
string logsPath = logFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Log.txt";
|
string logsPath = logFolder + "Log.txt";
|
||||||
Directory.CreateDirectory(logFolder);
|
if (!Directory.Exists(logFolder)) Directory.CreateDirectory(logFolder);
|
||||||
File.AppendAllText(logsPath, LogMessage + " \n");
|
File.AppendAllText(logsPath, LogMessage + " \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,16 +88,11 @@ namespace PluginManager.Others
|
|||||||
/// <param name="ErrMessage">The message to be wrote</param>
|
/// <param name="ErrMessage">The message to be wrote</param>
|
||||||
public static void WriteErrFile(string ErrMessage)
|
public static void WriteErrFile(string ErrMessage)
|
||||||
{
|
{
|
||||||
string errPath = errFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Error.txt";
|
string errPath = errFolder + "Error.txt";
|
||||||
Directory.CreateDirectory(errFolder);
|
if (!Directory.Exists(errFolder)) Directory.CreateDirectory(errFolder);
|
||||||
File.AppendAllText(errPath, ErrMessage + " \n");
|
File.AppendAllText(errPath, ErrMessage + " \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void WriteErrFile(this Exception ex)
|
|
||||||
{
|
|
||||||
WriteErrFile(ex.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Merge one array of strings into one string
|
/// Merge one array of strings into one string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -168,21 +169,19 @@ namespace PluginManager.Others
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="zip">The zip location</param>
|
/// <param name="zip">The zip location</param>
|
||||||
/// <param name="folder">The target location</param>
|
/// <param name="folder">The target location</param>
|
||||||
/// <param name="progress">The progress that is updated as a file is processed</param>
|
|
||||||
/// <param name="type">The type of progress</param>
|
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static async Task ExtractArchive(string zip, string folder, IProgress<float> progress, UnzipProgressType type)
|
public static async Task ExtractArchive(string zip, string folder, IProgress<float> progress)
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(folder);
|
if (!Directory.Exists(folder)) Directory.CreateDirectory(folder);
|
||||||
|
|
||||||
|
|
||||||
using (ZipArchive archive = ZipFile.OpenRead(zip))
|
using (ZipArchive archive = ZipFile.OpenRead(zip))
|
||||||
{
|
|
||||||
if (type == UnzipProgressType.PercentageFromNumberOfFiles)
|
|
||||||
{
|
{
|
||||||
int totalZIPFiles = archive.Entries.Count();
|
int totalZIPFiles = archive.Entries.Count();
|
||||||
int currentZIPFile = 0;
|
int currentZIPFile = 0;
|
||||||
foreach (ZipArchiveEntry entry in archive.Entries)
|
foreach (ZipArchiveEntry entry in archive.Entries)
|
||||||
{
|
{
|
||||||
if (entry.FullName.EndsWith("/")) // it is a folder
|
if (entry.FullName.EndsWith("/"))
|
||||||
Directory.CreateDirectory(Path.Combine(folder, entry.FullName));
|
Directory.CreateDirectory(Path.Combine(folder, entry.FullName));
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -190,49 +189,15 @@ namespace PluginManager.Others
|
|||||||
{
|
{
|
||||||
entry.ExtractToFile(Path.Combine(folder, entry.FullName), true);
|
entry.ExtractToFile(Path.Combine(folder, entry.FullName), true);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
currentZIPFile++;
|
currentZIPFile++;
|
||||||
await Task.Delay(10);
|
await Task.Delay(10);
|
||||||
if (progress != null)
|
|
||||||
progress.Report((float)currentZIPFile / totalZIPFiles * 100);
|
progress.Report((float)currentZIPFile / totalZIPFiles * 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (type == UnzipProgressType.PercentageFromTotalSize)
|
|
||||||
{
|
|
||||||
ulong zipSize = 0;
|
|
||||||
|
|
||||||
foreach (ZipArchiveEntry entry in archive.Entries)
|
|
||||||
zipSize += (ulong)entry.CompressedLength;
|
|
||||||
|
|
||||||
ulong currentSize = 0;
|
|
||||||
foreach (ZipArchiveEntry entry in archive.Entries)
|
|
||||||
{
|
|
||||||
if (entry.FullName.EndsWith("/"))
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(Path.Combine(folder, entry.FullName));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
entry.ExtractToFile(Path.Combine(folder, entry.FullName), true);
|
|
||||||
currentSize += (ulong)entry.CompressedLength;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}");
|
|
||||||
}
|
|
||||||
|
|
||||||
await Task.Delay(10);
|
|
||||||
if (progress != null)
|
|
||||||
progress.Report((float)currentSize / zipSize * 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -270,9 +235,9 @@ namespace PluginManager.Others
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static async Task SaveToJsonFile<T>(string file, T Data)
|
public static async Task SaveToJsonFile<T>(string file, T Data)
|
||||||
{
|
{
|
||||||
MemoryStream str = new MemoryStream();
|
var s = File.OpenWrite(file);
|
||||||
await JsonSerializer.SerializeAsync(str, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true });
|
await JsonSerializer.SerializeAsync(s, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true });
|
||||||
await File.WriteAllBytesAsync(file, str.ToArray());
|
s.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -285,7 +250,8 @@ namespace PluginManager.Others
|
|||||||
{
|
{
|
||||||
Stream text;
|
Stream text;
|
||||||
if (File.Exists(input))
|
if (File.Exists(input))
|
||||||
text = new MemoryStream(await File.ReadAllBytesAsync(input));
|
text = File.Open(input, FileMode.OpenOrCreate);
|
||||||
|
|
||||||
else
|
else
|
||||||
text = new MemoryStream(Encoding.ASCII.GetBytes(input));
|
text = new MemoryStream(Encoding.ASCII.GetBytes(input));
|
||||||
text.Position = 0;
|
text.Position = 0;
|
||||||
@@ -337,15 +303,5 @@ namespace PluginManager.Others
|
|||||||
var data = jsonObject.RootElement.TryGetProperty(codeName, out element);
|
var data = jsonObject.RootElement.TryGetProperty(codeName, out element);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string CreateMD5(string input)
|
|
||||||
{
|
|
||||||
using (MD5 md5 = MD5.Create())
|
|
||||||
{
|
|
||||||
byte[] inputBytes = Encoding.ASCII.GetBytes(input);
|
|
||||||
byte[] hashBytes = md5.ComputeHash(inputBytes);
|
|
||||||
return Convert.ToHexString(hashBytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ This project is based on:
|
|||||||
|
|
||||||
- [.NET 6 (C#)](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)
|
- [.NET 6 (C#)](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)
|
||||||
- [Discord.Net](https://github.com/discord-net/Discord.Net)
|
- [Discord.Net](https://github.com/discord-net/Discord.Net)
|
||||||
|
- [Avalonia UI](https://avaloniaui.net/) for `DiscordBotUI` extension
|
||||||
|
|
||||||
|
|
||||||
## Plugins
|
## Plugins
|
||||||
@@ -16,6 +17,10 @@ Plugin Types:
|
|||||||
1. Commands
|
1. Commands
|
||||||
2. Events
|
2. Events
|
||||||
|
|
||||||
|
Project Structure
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### How to create a plugin
|
### How to create a plugin
|
||||||
|
|
||||||
First of all, Create a new project (class library) in Visual Studio.
|
First of all, Create a new project (class library) in Visual Studio.
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
using System.IO.Compression;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
|
|
||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.Rest;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
|
|
||||||
using Microsoft.Win32.SafeHandles;
|
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
using Roles.Internals;
|
|
||||||
|
|
||||||
namespace Roles
|
|
||||||
{
|
|
||||||
public class AddRole : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "addrole";
|
|
||||||
|
|
||||||
public List<string> Aliases => new() { "ar", "addr", "roleadd" };
|
|
||||||
|
|
||||||
public string Description => "Role options";
|
|
||||||
|
|
||||||
public string Usage => "addrole [user1] [user2] ... [role1] [role2] ...";
|
|
||||||
|
|
||||||
public bool requireAdmin => true;
|
|
||||||
|
|
||||||
public async void ExecuteServer(SocketCommandContext context)
|
|
||||||
{
|
|
||||||
if (context.Message.MentionedUsers.Count == 0 || context.Message.MentionedRoles.Count == 0)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync($"Invalid invocation\nUsage:{Usage}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var users = context.Message.MentionedUsers;
|
|
||||||
var roles = context.Message.MentionedRoles;
|
|
||||||
|
|
||||||
foreach (var user in users)
|
|
||||||
{
|
|
||||||
foreach (var role in roles)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await ((SocketGuildUser)context.Guild.GetUser(user.Id)).AddRoleAsync(role);
|
|
||||||
await context.Channel.SendMessageAsync($"User {user.Mention} got role : {role.Name}");
|
|
||||||
}
|
|
||||||
catch (Exception ex) { ex.WriteErrFile(); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Discord;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace Roles.Internals
|
|
||||||
{
|
|
||||||
internal static class RoleManagement
|
|
||||||
{
|
|
||||||
internal static async void AddRole(this SocketGuildUser user, string roleName)
|
|
||||||
{
|
|
||||||
string role = roleName;
|
|
||||||
IRole? r = user.Guild.Roles.FirstOrDefault(rl => rl.Name == role || rl.Mention == role);
|
|
||||||
if (r is null)
|
|
||||||
throw new Exception("The role does not exist");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await user.AddRoleAsync(r);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase))
|
|
||||||
throw new Exception("Insufficient permissions");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async void AddRole(this SocketGuildUser user, IRole role)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await user.AddRoleAsync(role);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase))
|
|
||||||
throw new Exception("Insufficient permissions");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async void AddRoles(this SocketGuildUser user, string[] roleNames)
|
|
||||||
{
|
|
||||||
foreach (string rolename in roleNames)
|
|
||||||
{
|
|
||||||
string roleName = rolename;
|
|
||||||
IRole? r = user.Guild.Roles.FirstOrDefault(rl => rl.Name == roleName || rl.Mention == roleName);
|
|
||||||
if (r is null)
|
|
||||||
throw new Exception("The role does not exist");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await user.AddRoleAsync(r);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase))
|
|
||||||
throw new Exception("Insufficient permissions");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async void AddRoles(this SocketGuildUser user, IEnumerable<IRole> roles)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await user.AddRolesAsync(roles);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase))
|
|
||||||
throw new Exception("Insufficient permissions");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
70
TODO
Normal file
70
TODO
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
Discord Bot:
|
||||||
|
✔ Create bootloader
|
||||||
|
✔ Create commands handler
|
||||||
|
✔ Create bot launcher
|
||||||
|
✔ Enable startup commands
|
||||||
|
✔ Enable console input
|
||||||
|
☐ Create self update feature
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Plugin Manager:
|
||||||
|
Define plugin interface:
|
||||||
|
✔ DBCommand
|
||||||
|
✔ DBPlugin
|
||||||
|
|
||||||
|
Functions.cs:
|
||||||
|
✔ Read from file
|
||||||
|
✔ Read from archive (PAK)
|
||||||
|
✔ Write Logs & Errors
|
||||||
|
✔ Manipulate settings (files) and strings
|
||||||
|
✔ Stream copy async
|
||||||
|
|
||||||
|
Console Utilities:
|
||||||
|
✔ Progress bar
|
||||||
|
✔ Create table
|
||||||
|
✔ Write to console with colors
|
||||||
|
|
||||||
|
Discord Permissions:
|
||||||
|
✔ Check if user has permission
|
||||||
|
✔ Check if user is owner
|
||||||
|
|
||||||
|
Discord Plugins:
|
||||||
|
✔ Create loader for commands
|
||||||
|
✔ Create loader for events
|
||||||
|
☐ Improve memory efficiency
|
||||||
|
☐ Improve performance
|
||||||
|
☐ Improve stability
|
||||||
|
|
||||||
|
Language System:
|
||||||
|
✔ Create language system
|
||||||
|
✔ Load language files
|
||||||
|
|
||||||
|
Server Communication:
|
||||||
|
✔ Plugin Download system
|
||||||
|
✔ Language Download system
|
||||||
|
☐ Move to a new server
|
||||||
|
☐ Create plugin versioning system
|
||||||
|
☐ Create plugin update system
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Plugins:
|
||||||
|
Events:
|
||||||
|
✔ Leveling system
|
||||||
|
Utilities:
|
||||||
|
✔ Random number generator
|
||||||
|
✔ Flip a coin
|
||||||
|
✔ Poll
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
✔ Leveling system
|
||||||
|
☐ Music Commands @started
|
||||||
|
|
||||||
|
// Windows only version
|
||||||
|
// Download as a patch but replaces old DiscordBot executable with a new one
|
||||||
|
// Adds new dll to support windows forms
|
||||||
|
// Must act the same as the old version
|
||||||
|
☐ Create version of discord bot with windows form
|
||||||
|
☐ Download system and patch will result in a windows only based version of bot
|
||||||
|
☐ Possibility to reverse patch to get back to original version
|
||||||
454
Updater/.gitignore
vendored
454
Updater/.gitignore
vendored
@@ -1,454 +0,0 @@
|
|||||||
## Ignore Visual Studio temporary files, build results, and
|
|
||||||
## files generated by popular Visual Studio add-ons.
|
|
||||||
##
|
|
||||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
|
||||||
|
|
||||||
# User-specific files
|
|
||||||
*.rsuser
|
|
||||||
*.suo
|
|
||||||
*.user
|
|
||||||
*.userosscache
|
|
||||||
*.sln.docstates
|
|
||||||
|
|
||||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
|
||||||
*.userprefs
|
|
||||||
|
|
||||||
# Mono auto generated files
|
|
||||||
mono_crash.*
|
|
||||||
|
|
||||||
# Build results
|
|
||||||
[Dd]ebug/
|
|
||||||
[Dd]ebugPublic/
|
|
||||||
[Rr]elease/
|
|
||||||
[Rr]eleases/
|
|
||||||
x64/
|
|
||||||
x86/
|
|
||||||
[Ww][Ii][Nn]32/
|
|
||||||
[Aa][Rr][Mm]/
|
|
||||||
[Aa][Rr][Mm]64/
|
|
||||||
bld/
|
|
||||||
[Bb]in/
|
|
||||||
[Oo]bj/
|
|
||||||
[Ll]og/
|
|
||||||
[Ll]ogs/
|
|
||||||
|
|
||||||
# Visual Studio 2015/2017 cache/options directory
|
|
||||||
.vs/
|
|
||||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
|
||||||
#wwwroot/
|
|
||||||
|
|
||||||
# Visual Studio 2017 auto generated files
|
|
||||||
Generated\ Files/
|
|
||||||
|
|
||||||
# MSTest test Results
|
|
||||||
[Tt]est[Rr]esult*/
|
|
||||||
[Bb]uild[Ll]og.*
|
|
||||||
|
|
||||||
# NUnit
|
|
||||||
*.VisualState.xml
|
|
||||||
TestResult.xml
|
|
||||||
nunit-*.xml
|
|
||||||
|
|
||||||
# Build Results of an ATL Project
|
|
||||||
[Dd]ebugPS/
|
|
||||||
[Rr]eleasePS/
|
|
||||||
dlldata.c
|
|
||||||
|
|
||||||
# Benchmark Results
|
|
||||||
BenchmarkDotNet.Artifacts/
|
|
||||||
|
|
||||||
# .NET Core
|
|
||||||
project.lock.json
|
|
||||||
project.fragment.lock.json
|
|
||||||
artifacts/
|
|
||||||
|
|
||||||
# Tye
|
|
||||||
.tye/
|
|
||||||
|
|
||||||
# ASP.NET Scaffolding
|
|
||||||
ScaffoldingReadMe.txt
|
|
||||||
|
|
||||||
# StyleCop
|
|
||||||
StyleCopReport.xml
|
|
||||||
|
|
||||||
# Files built by Visual Studio
|
|
||||||
*_i.c
|
|
||||||
*_p.c
|
|
||||||
*_h.h
|
|
||||||
*.ilk
|
|
||||||
*.meta
|
|
||||||
*.obj
|
|
||||||
*.iobj
|
|
||||||
*.pch
|
|
||||||
*.pdb
|
|
||||||
*.ipdb
|
|
||||||
*.pgc
|
|
||||||
*.pgd
|
|
||||||
*.rsp
|
|
||||||
*.sbr
|
|
||||||
*.tlb
|
|
||||||
*.tli
|
|
||||||
*.tlh
|
|
||||||
*.tmp
|
|
||||||
*.tmp_proj
|
|
||||||
*_wpftmp.csproj
|
|
||||||
*.log
|
|
||||||
*.vspscc
|
|
||||||
*.vssscc
|
|
||||||
.builds
|
|
||||||
*.pidb
|
|
||||||
*.svclog
|
|
||||||
*.scc
|
|
||||||
|
|
||||||
# Chutzpah Test files
|
|
||||||
_Chutzpah*
|
|
||||||
|
|
||||||
# Visual C++ cache files
|
|
||||||
ipch/
|
|
||||||
*.aps
|
|
||||||
*.ncb
|
|
||||||
*.opendb
|
|
||||||
*.opensdf
|
|
||||||
*.sdf
|
|
||||||
*.cachefile
|
|
||||||
*.VC.db
|
|
||||||
*.VC.VC.opendb
|
|
||||||
|
|
||||||
# Visual Studio profiler
|
|
||||||
*.psess
|
|
||||||
*.vsp
|
|
||||||
*.vspx
|
|
||||||
*.sap
|
|
||||||
|
|
||||||
# Visual Studio Trace Files
|
|
||||||
*.e2e
|
|
||||||
|
|
||||||
# TFS 2012 Local Workspace
|
|
||||||
$tf/
|
|
||||||
|
|
||||||
# Guidance Automation Toolkit
|
|
||||||
*.gpState
|
|
||||||
|
|
||||||
# ReSharper is a .NET coding add-in
|
|
||||||
_ReSharper*/
|
|
||||||
*.[Rr]e[Ss]harper
|
|
||||||
*.DotSettings.user
|
|
||||||
|
|
||||||
# TeamCity is a build add-in
|
|
||||||
_TeamCity*
|
|
||||||
|
|
||||||
# DotCover is a Code Coverage Tool
|
|
||||||
*.dotCover
|
|
||||||
|
|
||||||
# AxoCover is a Code Coverage Tool
|
|
||||||
.axoCover/*
|
|
||||||
!.axoCover/settings.json
|
|
||||||
|
|
||||||
# Coverlet is a free, cross platform Code Coverage Tool
|
|
||||||
coverage*.json
|
|
||||||
coverage*.xml
|
|
||||||
coverage*.info
|
|
||||||
|
|
||||||
# Visual Studio code coverage results
|
|
||||||
*.coverage
|
|
||||||
*.coveragexml
|
|
||||||
|
|
||||||
# NCrunch
|
|
||||||
_NCrunch_*
|
|
||||||
.*crunch*.local.xml
|
|
||||||
nCrunchTemp_*
|
|
||||||
|
|
||||||
# MightyMoose
|
|
||||||
*.mm.*
|
|
||||||
AutoTest.Net/
|
|
||||||
|
|
||||||
# Web workbench (sass)
|
|
||||||
.sass-cache/
|
|
||||||
|
|
||||||
# Installshield output folder
|
|
||||||
[Ee]xpress/
|
|
||||||
|
|
||||||
# DocProject is a documentation generator add-in
|
|
||||||
DocProject/buildhelp/
|
|
||||||
DocProject/Help/*.HxT
|
|
||||||
DocProject/Help/*.HxC
|
|
||||||
DocProject/Help/*.hhc
|
|
||||||
DocProject/Help/*.hhk
|
|
||||||
DocProject/Help/*.hhp
|
|
||||||
DocProject/Help/Html2
|
|
||||||
DocProject/Help/html
|
|
||||||
|
|
||||||
# Click-Once directory
|
|
||||||
publish/
|
|
||||||
|
|
||||||
# Publish Web Output
|
|
||||||
*.[Pp]ublish.xml
|
|
||||||
*.azurePubxml
|
|
||||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
|
||||||
# but database connection strings (with potential passwords) will be unencrypted
|
|
||||||
*.pubxml
|
|
||||||
*.publishproj
|
|
||||||
|
|
||||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
|
||||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
|
||||||
# in these scripts will be unencrypted
|
|
||||||
PublishScripts/
|
|
||||||
|
|
||||||
# NuGet Packages
|
|
||||||
*.nupkg
|
|
||||||
# NuGet Symbol Packages
|
|
||||||
*.snupkg
|
|
||||||
# The packages folder can be ignored because of Package Restore
|
|
||||||
**/[Pp]ackages/*
|
|
||||||
# except build/, which is used as an MSBuild target.
|
|
||||||
!**/[Pp]ackages/build/
|
|
||||||
# Uncomment if necessary however generally it will be regenerated when needed
|
|
||||||
#!**/[Pp]ackages/repositories.config
|
|
||||||
# NuGet v3's project.json files produces more ignorable files
|
|
||||||
*.nuget.props
|
|
||||||
*.nuget.targets
|
|
||||||
|
|
||||||
# Microsoft Azure Build Output
|
|
||||||
csx/
|
|
||||||
*.build.csdef
|
|
||||||
|
|
||||||
# Microsoft Azure Emulator
|
|
||||||
ecf/
|
|
||||||
rcf/
|
|
||||||
|
|
||||||
# Windows Store app package directories and files
|
|
||||||
AppPackages/
|
|
||||||
BundleArtifacts/
|
|
||||||
Package.StoreAssociation.xml
|
|
||||||
_pkginfo.txt
|
|
||||||
*.appx
|
|
||||||
*.appxbundle
|
|
||||||
*.appxupload
|
|
||||||
|
|
||||||
# Visual Studio cache files
|
|
||||||
# files ending in .cache can be ignored
|
|
||||||
*.[Cc]ache
|
|
||||||
# but keep track of directories ending in .cache
|
|
||||||
!?*.[Cc]ache/
|
|
||||||
|
|
||||||
# Others
|
|
||||||
ClientBin/
|
|
||||||
~$*
|
|
||||||
*~
|
|
||||||
*.dbmdl
|
|
||||||
*.dbproj.schemaview
|
|
||||||
*.jfm
|
|
||||||
*.pfx
|
|
||||||
*.publishsettings
|
|
||||||
orleans.codegen.cs
|
|
||||||
|
|
||||||
# Including strong name files can present a security risk
|
|
||||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
|
||||||
#*.snk
|
|
||||||
|
|
||||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
|
||||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
|
||||||
#bower_components/
|
|
||||||
|
|
||||||
# RIA/Silverlight projects
|
|
||||||
Generated_Code/
|
|
||||||
|
|
||||||
# Backup & report files from converting an old project file
|
|
||||||
# to a newer Visual Studio version. Backup files are not needed,
|
|
||||||
# because we have git ;-)
|
|
||||||
_UpgradeReport_Files/
|
|
||||||
Backup*/
|
|
||||||
UpgradeLog*.XML
|
|
||||||
UpgradeLog*.htm
|
|
||||||
ServiceFabricBackup/
|
|
||||||
*.rptproj.bak
|
|
||||||
|
|
||||||
# SQL Server files
|
|
||||||
*.mdf
|
|
||||||
*.ldf
|
|
||||||
*.ndf
|
|
||||||
|
|
||||||
# Business Intelligence projects
|
|
||||||
*.rdl.data
|
|
||||||
*.bim.layout
|
|
||||||
*.bim_*.settings
|
|
||||||
*.rptproj.rsuser
|
|
||||||
*- [Bb]ackup.rdl
|
|
||||||
*- [Bb]ackup ([0-9]).rdl
|
|
||||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
|
||||||
|
|
||||||
# Microsoft Fakes
|
|
||||||
FakesAssemblies/
|
|
||||||
|
|
||||||
# GhostDoc plugin setting file
|
|
||||||
*.GhostDoc.xml
|
|
||||||
|
|
||||||
# Node.js Tools for Visual Studio
|
|
||||||
.ntvs_analysis.dat
|
|
||||||
node_modules/
|
|
||||||
|
|
||||||
# Visual Studio 6 build log
|
|
||||||
*.plg
|
|
||||||
|
|
||||||
# Visual Studio 6 workspace options file
|
|
||||||
*.opt
|
|
||||||
|
|
||||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
|
||||||
*.vbw
|
|
||||||
|
|
||||||
# Visual Studio LightSwitch build output
|
|
||||||
**/*.HTMLClient/GeneratedArtifacts
|
|
||||||
**/*.DesktopClient/GeneratedArtifacts
|
|
||||||
**/*.DesktopClient/ModelManifest.xml
|
|
||||||
**/*.Server/GeneratedArtifacts
|
|
||||||
**/*.Server/ModelManifest.xml
|
|
||||||
_Pvt_Extensions
|
|
||||||
|
|
||||||
# Paket dependency manager
|
|
||||||
.paket/paket.exe
|
|
||||||
paket-files/
|
|
||||||
|
|
||||||
# FAKE - F# Make
|
|
||||||
.fake/
|
|
||||||
|
|
||||||
# CodeRush personal settings
|
|
||||||
.cr/personal
|
|
||||||
|
|
||||||
# Python Tools for Visual Studio (PTVS)
|
|
||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
|
|
||||||
# Cake - Uncomment if you are using it
|
|
||||||
# tools/**
|
|
||||||
# !tools/packages.config
|
|
||||||
|
|
||||||
# Tabs Studio
|
|
||||||
*.tss
|
|
||||||
|
|
||||||
# Telerik's JustMock configuration file
|
|
||||||
*.jmconfig
|
|
||||||
|
|
||||||
# BizTalk build output
|
|
||||||
*.btp.cs
|
|
||||||
*.btm.cs
|
|
||||||
*.odx.cs
|
|
||||||
*.xsd.cs
|
|
||||||
|
|
||||||
# OpenCover UI analysis results
|
|
||||||
OpenCover/
|
|
||||||
|
|
||||||
# Azure Stream Analytics local run output
|
|
||||||
ASALocalRun/
|
|
||||||
|
|
||||||
# MSBuild Binary and Structured Log
|
|
||||||
*.binlog
|
|
||||||
|
|
||||||
# NVidia Nsight GPU debugger configuration file
|
|
||||||
*.nvuser
|
|
||||||
|
|
||||||
# MFractors (Xamarin productivity tool) working folder
|
|
||||||
.mfractor/
|
|
||||||
|
|
||||||
# Local History for Visual Studio
|
|
||||||
.localhistory/
|
|
||||||
|
|
||||||
# BeatPulse healthcheck temp database
|
|
||||||
healthchecksdb
|
|
||||||
|
|
||||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
|
||||||
MigrationBackup/
|
|
||||||
|
|
||||||
# Ionide (cross platform F# VS Code tools) working folder
|
|
||||||
.ionide/
|
|
||||||
|
|
||||||
# Fody - auto-generated XML schema
|
|
||||||
FodyWeavers.xsd
|
|
||||||
|
|
||||||
##
|
|
||||||
## Visual studio for Mac
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
# globs
|
|
||||||
Makefile.in
|
|
||||||
*.userprefs
|
|
||||||
*.usertasks
|
|
||||||
config.make
|
|
||||||
config.status
|
|
||||||
aclocal.m4
|
|
||||||
install-sh
|
|
||||||
autom4te.cache/
|
|
||||||
*.tar.gz
|
|
||||||
tarballs/
|
|
||||||
test-results/
|
|
||||||
|
|
||||||
# Mac bundle stuff
|
|
||||||
*.dmg
|
|
||||||
*.app
|
|
||||||
|
|
||||||
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
|
|
||||||
# General
|
|
||||||
.DS_Store
|
|
||||||
.AppleDouble
|
|
||||||
.LSOverride
|
|
||||||
|
|
||||||
# Icon must end with two \r
|
|
||||||
Icon
|
|
||||||
|
|
||||||
|
|
||||||
# Thumbnails
|
|
||||||
._*
|
|
||||||
|
|
||||||
# Files that might appear in the root of a volume
|
|
||||||
.DocumentRevisions-V100
|
|
||||||
.fseventsd
|
|
||||||
.Spotlight-V100
|
|
||||||
.TemporaryItems
|
|
||||||
.Trashes
|
|
||||||
.VolumeIcon.icns
|
|
||||||
.com.apple.timemachine.donotpresent
|
|
||||||
|
|
||||||
# Directories potentially created on remote AFP share
|
|
||||||
.AppleDB
|
|
||||||
.AppleDesktop
|
|
||||||
Network Trash Folder
|
|
||||||
Temporary Items
|
|
||||||
.apdisk
|
|
||||||
|
|
||||||
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
|
|
||||||
# Windows thumbnail cache files
|
|
||||||
Thumbs.db
|
|
||||||
ehthumbs.db
|
|
||||||
ehthumbs_vista.db
|
|
||||||
|
|
||||||
# Dump file
|
|
||||||
*.stackdump
|
|
||||||
|
|
||||||
# Folder config file
|
|
||||||
[Dd]esktop.ini
|
|
||||||
|
|
||||||
# Recycle Bin used on file shares
|
|
||||||
$RECYCLE.BIN/
|
|
||||||
|
|
||||||
# Windows Installer files
|
|
||||||
*.cab
|
|
||||||
*.msi
|
|
||||||
*.msix
|
|
||||||
*.msm
|
|
||||||
*.msp
|
|
||||||
|
|
||||||
# Windows shortcuts
|
|
||||||
*.lnk
|
|
||||||
|
|
||||||
# JetBrains Rider
|
|
||||||
.idea/
|
|
||||||
*.sln.iml
|
|
||||||
|
|
||||||
##
|
|
||||||
## Visual Studio Code
|
|
||||||
##
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/settings.json
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<Application xmlns="https://github.com/avaloniaui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
x:Class="Updater.App">
|
|
||||||
<Application.Styles>
|
|
||||||
<FluentTheme Mode="Dark"/>
|
|
||||||
</Application.Styles>
|
|
||||||
</Application>
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
using Avalonia;
|
|
||||||
using Avalonia.Controls.ApplicationLifetimes;
|
|
||||||
using Avalonia.Markup.Xaml;
|
|
||||||
|
|
||||||
namespace Updater
|
|
||||||
{
|
|
||||||
public partial class App : Application
|
|
||||||
{
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnFrameworkInitializationCompleted()
|
|
||||||
{
|
|
||||||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
|
||||||
{
|
|
||||||
desktop.MainWindow = new MainWindow() { Width = 250, Height = 50 };
|
|
||||||
}
|
|
||||||
|
|
||||||
base.OnFrameworkInitializationCompleted();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<Window xmlns="https://github.com/avaloniaui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
mc:Ignorable="d" d:DesignWidth="250" d:DesignHeight="50"
|
|
||||||
x:Class="Updater.MainWindow"
|
|
||||||
Title="Updater">
|
|
||||||
<StackPanel Margin="0">
|
|
||||||
<Label Content="Updating ... "/>
|
|
||||||
<ProgressBar x:Class="Updater.MainWindow" x:Name="progressBar1" IsIndeterminate="True" />
|
|
||||||
</StackPanel>
|
|
||||||
</Window>
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
using Avalonia.Controls;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.IO.Compression;
|
|
||||||
using System.Net;
|
|
||||||
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Updater
|
|
||||||
{
|
|
||||||
public partial class MainWindow : Window
|
|
||||||
{
|
|
||||||
public MainWindow()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
Activated += (sender, e) => FormActive();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async void FormActive()
|
|
||||||
{
|
|
||||||
if (Program.Command != "/update")
|
|
||||||
return;
|
|
||||||
await Task.Delay(3000);
|
|
||||||
WebClient c = new WebClient();
|
|
||||||
Directory.CreateDirectory("./Updater/Downloads");
|
|
||||||
await c.DownloadFileTaskAsync(Program.Link, "./Updater/Downloads/Update.zip");
|
|
||||||
await Task.Run(() => ZipFile.ExtractToDirectory("./Updater/Downloads/Update.zip", Program.Location, true));
|
|
||||||
Process.Start(Program.AppToOpen);
|
|
||||||
File.Delete("./Updater/Downloads/Update.zip");
|
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
using Avalonia;
|
|
||||||
using Avalonia.Controls;
|
|
||||||
using Avalonia.Controls.ApplicationLifetimes;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Updater
|
|
||||||
{
|
|
||||||
internal class Program
|
|
||||||
{
|
|
||||||
|
|
||||||
public static string Command, Link, AppToOpen, Location;
|
|
||||||
|
|
||||||
// Initialization code. Don't use any Avalonia, third-party APIs or any
|
|
||||||
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
|
|
||||||
// yet and stuff might break.
|
|
||||||
[STAThread]
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
|
||||||
Command = args[0];
|
|
||||||
Link = args[1];
|
|
||||||
AppToOpen = args[2];
|
|
||||||
Location = string.Join(' ', args, 3, args.Length - 3);
|
|
||||||
BuildAvaloniaApp()
|
|
||||||
.StartWithClassicDesktopLifetime(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Avalonia configuration, don't remove; also used by visual designer.
|
|
||||||
public static AppBuilder BuildAvaloniaApp()
|
|
||||||
=> AppBuilder.Configure<App>()
|
|
||||||
.UsePlatformDetect()
|
|
||||||
.LogToTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>WinExe</OutputType>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<!--Avalonia doesen't support TrimMode=link currently,but we are working on that https://github.com/AvaloniaUI/Avalonia/issues/6892 -->
|
|
||||||
<TrimMode>copyused</TrimMode>
|
|
||||||
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Remove=".gitignore" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<!--This helps with theme dll-s trimming.
|
|
||||||
If you will publish your application in self-contained mode with p:PublishTrimmed=true and it will use Fluent theme Default theme will be trimmed from the output and vice versa.
|
|
||||||
https://github.com/AvaloniaUI/Avalonia/issues/5593 -->
|
|
||||||
<TrimmableAssembly Include="Avalonia.Themes.Fluent" />
|
|
||||||
<TrimmableAssembly Include="Avalonia.Themes.Default" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Avalonia" Version="0.10.18" />
|
|
||||||
<PackageReference Include="Avalonia.Desktop" Version="0.10.18" />
|
|
||||||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
|
||||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="0.10.18" />
|
|
||||||
<PackageReference Include="XamlNameReferenceGenerator" Version="1.3.4" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
1
Version.txt
Normal file
1
Version.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
0
|
||||||
Reference in New Issue
Block a user