Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9dcd1e16b0 | |||
| 28b45da382 | |||
| b20872222a | |||
|
|
c08496e819 | ||
|
|
0f4a82171c | ||
|
|
cbad45605c | ||
| 208d7638c9 | |||
| 26a74a9269 | |||
| ffa6692e07 | |||
| 44690f8e9d | |||
| 9aa9d5ab03 | |||
|
|
88ff621f22 |
12
.gitignore
vendored
12
.gitignore
vendored
@@ -98,7 +98,6 @@ StyleCopReport.xml
|
|||||||
*.pidb
|
*.pidb
|
||||||
*.svclog
|
*.svclog
|
||||||
*.scc
|
*.scc
|
||||||
*.code-workspace
|
|
||||||
|
|
||||||
# Chutzpah Test files
|
# Chutzpah Test files
|
||||||
_Chutzpah*
|
_Chutzpah*
|
||||||
@@ -364,13 +363,4 @@ MigrationBackup/
|
|||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
|
||||||
*.txt
|
*.txt
|
||||||
|
|
||||||
#folders
|
|
||||||
/Plugins/
|
|
||||||
/DiscordBot.rar
|
|
||||||
/DiscordBot/Data/
|
|
||||||
/DiscordBot/Updater/
|
|
||||||
.idea/
|
|
||||||
DiscordBot/Launcher.exe
|
|
||||||
DiscordBotUI/*
|
|
||||||
6
.idea/.idea.SethDiscordBot/.idea/projectSettingsUpdater.xml
generated
Normal file
6
.idea/.idea.SethDiscordBot/.idea/projectSettingsUpdater.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RiderProjectSettingsUpdater">
|
||||||
|
<option name="vcsConfiguration" value="2" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
107
.idea/.idea.SethDiscordBot/.idea/workspace.xml
generated
Normal file
107
.idea/.idea.SethDiscordBot/.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoGeneratedRunConfigurationManager">
|
||||||
|
<projectFile>DiscordBot/DiscordBot.csproj</projectFile>
|
||||||
|
<projectFile pubXmlPath="DiscordBot/Properties/PublishProfiles/WindowsBuild.pubxml">DiscordBot/DiscordBot.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 afterPath="$PROJECT_DIR$/Roles/AddRole.cs" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/Roles/Internals/RoleManagement.cs" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/Roles/Roles.csproj" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/BUILDS/net6.0/CMD_Utils.dll" beforeDir="false" afterPath="$PROJECT_DIR$/BUILDS/net6.0/CMD_Utils.dll" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/BUILDS/net6.0/Music Commands.dll" beforeDir="false" afterPath="$PROJECT_DIR$/BUILDS/net6.0/Music Commands.dll" 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$/CMD_LevelingSystem/Level.cs" beforeDir="false" afterPath="$PROJECT_DIR$/CMD_LevelingSystem/Level.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/CMD_Utils/Echo.cs" beforeDir="false" afterPath="$PROJECT_DIR$/CMD_Utils/Echo.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/CMD_Utils/FlipCoin.cs" beforeDir="false" afterPath="$PROJECT_DIR$/CMD_Utils/FlipCoin.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/CMD_Utils/Poll.cs" beforeDir="false" afterPath="$PROJECT_DIR$/CMD_Utils/Poll.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/CMD_Utils/Random.cs" beforeDir="false" afterPath="$PROJECT_DIR$/CMD_Utils/Random.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/DiscordBot/Discord/Commands/Help.cs" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/Discord/Commands/Help.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/DiscordBot/Discord/Commands/Restart.cs" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/Discord/Commands/Restart.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/DiscordBot/Discord/Commands/Settings.cs" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/Discord/Commands/Settings.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/DiscordBot/Discord/Core/Boot.cs" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/Discord/Core/Boot.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/DiscordBot/Discord/Core/CommandHandler.cs" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/Discord/Core/CommandHandler.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/DiscordBot/DiscordBot.csproj" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/DiscordBot.csproj" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/DiscordBot/Program.cs" beforeDir="false" afterPath="$PROJECT_DIR$/DiscordBot/Program.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/MusicCommands/Leave.cs" beforeDir="false" afterPath="$PROJECT_DIR$/MusicCommands/Leave.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/MusicCommands/MusicPlayer.cs" beforeDir="false" afterPath="$PROJECT_DIR$/MusicCommands/MusicPlayer.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/MusicCommands/Pause.cs" beforeDir="false" afterPath="$PROJECT_DIR$/MusicCommands/Pause.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/MusicCommands/Play.cs" beforeDir="false" afterPath="$PROJECT_DIR$/MusicCommands/Play.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/MusicCommands/Skip.cs" beforeDir="false" afterPath="$PROJECT_DIR$/MusicCommands/Skip.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/MusicCommands/queue.cs" beforeDir="false" afterPath="$PROJECT_DIR$/MusicCommands/queue.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/PluginManager/Config.cs" beforeDir="false" afterPath="$PROJECT_DIR$/PluginManager/Config.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/PluginManager/Interfaces/DBCommand.cs" beforeDir="false" afterPath="$PROJECT_DIR$/PluginManager/Interfaces/DBCommand.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/PluginManager/Items/Command.cs" beforeDir="false" afterPath="$PROJECT_DIR$/PluginManager/Items/Command.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/PluginManager/Items/ConsoleCommandsHandler.cs" beforeDir="false" afterPath="$PROJECT_DIR$/PluginManager/Items/ConsoleCommandsHandler.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/SethDiscordBot.sln" beforeDir="false" afterPath="$PROJECT_DIR$/SethDiscordBot.sln" 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"><![CDATA[{
|
||||||
|
"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">
|
||||||
|
<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>
|
||||||
|
</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" />
|
||||||
|
</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>
|
||||||
26
.vscode/launch.json
vendored
26
.vscode/launch.json
vendored
@@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
|
||||||
// Use hover for the description of the existing attributes
|
|
||||||
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
|
|
||||||
"name": ".NET Core Launch (console)",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"preLaunchTask": "build",
|
|
||||||
// If you have changed target frameworks, make sure to update the program path.
|
|
||||||
"program": "${workspaceFolder}/DiscordBot/bin/Debug/net6.0/DiscordBot.dll",
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}/DiscordBot/bin/Debug/net6.0/",
|
|
||||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
|
||||||
"console": "externalTerminal",
|
|
||||||
"stopAtEntry": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": ".NET Core Attach",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "attach"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
41
.vscode/tasks.json
vendored
41
.vscode/tasks.json
vendored
@@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"label": "build",
|
|
||||||
"command": "dotnet",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"${workspaceFolder}/DiscordBot/DiscordBot.csproj",
|
|
||||||
"/property:GenerateFullPaths=true",
|
|
||||||
"/consoleloggerparameters:NoSummary"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "publish",
|
|
||||||
"command": "dotnet",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"publish",
|
|
||||||
"${workspaceFolder}/DiscordBot/DiscordBot.csproj",
|
|
||||||
"/property:GenerateFullPaths=true",
|
|
||||||
"/consoleloggerparameters:NoSummary"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "watch",
|
|
||||||
"command": "dotnet",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"watch",
|
|
||||||
"run",
|
|
||||||
"--project",
|
|
||||||
"${workspaceFolder}/DiscordBot/DiscordBot.csproj"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
BIN
BUILDS/DLL/libopus.dll
Normal file
BIN
BUILDS/DLL/libopus.dll
Normal file
Binary file not shown.
BIN
BUILDS/DLL/libsodium.dll
Normal file
BIN
BUILDS/DLL/libsodium.dll
Normal file
Binary file not shown.
BIN
BUILDS/DLL/opus.dll
Normal file
BIN
BUILDS/DLL/opus.dll
Normal file
Binary file not shown.
268
BUILDS/net5.0/CMD_LevelingSystem.deps.json
Normal file
268
BUILDS/net5.0/CMD_LevelingSystem.deps.json
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v5.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v5.0": {
|
||||||
|
"CMD_LevelingSystem/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"PluginManager": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"CMD_LevelingSystem.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Commands": "3.5.0",
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Interactions": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Discord.Net.Webhook": "3.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Commands.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Newtonsoft.Json": "13.0.1",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Interactive.Async": "5.0.0",
|
||||||
|
"System.ValueTuple": "4.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Core.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Interactions.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Rest.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Webhook.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.WebSocket.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.20.51904"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Linq.Async": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/System.Reactive.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"PluginManager.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"CMD_LevelingSystem/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-IUtexpvogudb1rllKBWkIEpBVQoToMjtVo81KPkt+gNMe7KtRDcZJgcn6+72viMtyw0e95OJPXFV5VEA/n2OQQ==",
|
||||||
|
"path": "discord.net/3.5.0",
|
||||||
|
"hashPath": "discord.net.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ClTv8aiTlitvS48YatRiTLvgE2f2uKgmHNPVBIuvJBHZO2u4bZCzoN1fid+pZn2sbVOkt8uftlLGzz5DSZlFIA==",
|
||||||
|
"path": "discord.net.commands/3.5.0",
|
||||||
|
"hashPath": "discord.net.commands.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rCzzaznMVQ+bLMxOpYwTyqm9V22kMy6BxlQisSxemHZDe2Jedz3Clp/a0dToACLz+Dlp3u+jYUfCBnTz7L6f4g==",
|
||||||
|
"path": "discord.net.core/3.5.0",
|
||||||
|
"hashPath": "discord.net.core.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-wE9+V9DJ7r+1s4euOi4sGPIAt4sD7r+Tk5s9mrlbLCHVQTK4KllAvcrL25bPFI38FuFceREEzFoRlTrekSyB2Q==",
|
||||||
|
"path": "discord.net.interactions/3.5.0",
|
||||||
|
"hashPath": "discord.net.interactions.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-BnTdLFuuQsKvCv08VQrD4X1Hw2Xp+MELIRQiDiKfG01IiQlRTN+1gc3LB1zXgn5xBvC0HXjHxwV22GrMD9uKHQ==",
|
||||||
|
"path": "discord.net.rest/3.5.0",
|
||||||
|
"hashPath": "discord.net.rest.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vCIGZS+m88sQDuFmdbUqg+2RIXS/NJWx8ei3MX+ZEYiAvOkDgQfkIlEnU1NKpds6ivTt5GFlv6UzcWubb5VJ1w==",
|
||||||
|
"path": "discord.net.webhook/3.5.0",
|
||||||
|
"hashPath": "discord.net.webhook.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-LjBOvcP40vJ+dhOtBDi8haEeblPAKpAIqR04NBzTM1/0RVavJZH89ovfSQIk42ygkiOaDV4E2x0Mmh6DRoIYcw==",
|
||||||
|
"path": "discord.net.websocket/3.5.0",
|
||||||
|
"hashPath": "discord.net.websocket.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
||||||
|
"path": "system.collections.immutable/5.0.0",
|
||||||
|
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
||||||
|
"path": "system.interactive.async/5.0.0",
|
||||||
|
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
||||||
|
"path": "system.linq.async/5.0.0",
|
||||||
|
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||||
|
"path": "system.reactive/5.0.0",
|
||||||
|
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
||||||
|
"path": "system.valuetuple/4.5.0",
|
||||||
|
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
BUILDS/net5.0/CMD_LevelingSystem.dll
Normal file
BIN
BUILDS/net5.0/CMD_LevelingSystem.dll
Normal file
Binary file not shown.
268
BUILDS/net5.0/CMD_Utils.deps.json
Normal file
268
BUILDS/net5.0/CMD_Utils.deps.json
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v5.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v5.0": {
|
||||||
|
"CMD_Utils/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"PluginManager": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"CMD_Utils.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Commands": "3.5.0",
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Interactions": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Discord.Net.Webhook": "3.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Commands.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Newtonsoft.Json": "13.0.1",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Interactive.Async": "5.0.0",
|
||||||
|
"System.ValueTuple": "4.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Core.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Interactions.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Rest.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Webhook.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.WebSocket.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.20.51904"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Linq.Async": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/System.Reactive.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"PluginManager.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"CMD_Utils/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-IUtexpvogudb1rllKBWkIEpBVQoToMjtVo81KPkt+gNMe7KtRDcZJgcn6+72viMtyw0e95OJPXFV5VEA/n2OQQ==",
|
||||||
|
"path": "discord.net/3.5.0",
|
||||||
|
"hashPath": "discord.net.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ClTv8aiTlitvS48YatRiTLvgE2f2uKgmHNPVBIuvJBHZO2u4bZCzoN1fid+pZn2sbVOkt8uftlLGzz5DSZlFIA==",
|
||||||
|
"path": "discord.net.commands/3.5.0",
|
||||||
|
"hashPath": "discord.net.commands.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rCzzaznMVQ+bLMxOpYwTyqm9V22kMy6BxlQisSxemHZDe2Jedz3Clp/a0dToACLz+Dlp3u+jYUfCBnTz7L6f4g==",
|
||||||
|
"path": "discord.net.core/3.5.0",
|
||||||
|
"hashPath": "discord.net.core.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-wE9+V9DJ7r+1s4euOi4sGPIAt4sD7r+Tk5s9mrlbLCHVQTK4KllAvcrL25bPFI38FuFceREEzFoRlTrekSyB2Q==",
|
||||||
|
"path": "discord.net.interactions/3.5.0",
|
||||||
|
"hashPath": "discord.net.interactions.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-BnTdLFuuQsKvCv08VQrD4X1Hw2Xp+MELIRQiDiKfG01IiQlRTN+1gc3LB1zXgn5xBvC0HXjHxwV22GrMD9uKHQ==",
|
||||||
|
"path": "discord.net.rest/3.5.0",
|
||||||
|
"hashPath": "discord.net.rest.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vCIGZS+m88sQDuFmdbUqg+2RIXS/NJWx8ei3MX+ZEYiAvOkDgQfkIlEnU1NKpds6ivTt5GFlv6UzcWubb5VJ1w==",
|
||||||
|
"path": "discord.net.webhook/3.5.0",
|
||||||
|
"hashPath": "discord.net.webhook.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-LjBOvcP40vJ+dhOtBDi8haEeblPAKpAIqR04NBzTM1/0RVavJZH89ovfSQIk42ygkiOaDV4E2x0Mmh6DRoIYcw==",
|
||||||
|
"path": "discord.net.websocket/3.5.0",
|
||||||
|
"hashPath": "discord.net.websocket.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
||||||
|
"path": "system.collections.immutable/5.0.0",
|
||||||
|
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
||||||
|
"path": "system.interactive.async/5.0.0",
|
||||||
|
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
||||||
|
"path": "system.linq.async/5.0.0",
|
||||||
|
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||||
|
"path": "system.reactive/5.0.0",
|
||||||
|
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
||||||
|
"path": "system.valuetuple/4.5.0",
|
||||||
|
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
BUILDS/net5.0/CMD_Utils.dll
Normal file
BIN
BUILDS/net5.0/CMD_Utils.dll
Normal file
Binary file not shown.
268
BUILDS/net5.0/EVE_LevelingSystem.deps.json
Normal file
268
BUILDS/net5.0/EVE_LevelingSystem.deps.json
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v5.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v5.0": {
|
||||||
|
"EVE_LevelingSystem/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"PluginManager": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"EVE_LevelingSystem.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Commands": "3.5.0",
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Interactions": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Discord.Net.Webhook": "3.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Commands.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Newtonsoft.Json": "13.0.1",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Interactive.Async": "5.0.0",
|
||||||
|
"System.ValueTuple": "4.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Core.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Interactions.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Rest.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Webhook.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.WebSocket.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.20.51904"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Linq.Async": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/System.Reactive.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"PluginManager.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"EVE_LevelingSystem/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-IUtexpvogudb1rllKBWkIEpBVQoToMjtVo81KPkt+gNMe7KtRDcZJgcn6+72viMtyw0e95OJPXFV5VEA/n2OQQ==",
|
||||||
|
"path": "discord.net/3.5.0",
|
||||||
|
"hashPath": "discord.net.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ClTv8aiTlitvS48YatRiTLvgE2f2uKgmHNPVBIuvJBHZO2u4bZCzoN1fid+pZn2sbVOkt8uftlLGzz5DSZlFIA==",
|
||||||
|
"path": "discord.net.commands/3.5.0",
|
||||||
|
"hashPath": "discord.net.commands.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rCzzaznMVQ+bLMxOpYwTyqm9V22kMy6BxlQisSxemHZDe2Jedz3Clp/a0dToACLz+Dlp3u+jYUfCBnTz7L6f4g==",
|
||||||
|
"path": "discord.net.core/3.5.0",
|
||||||
|
"hashPath": "discord.net.core.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-wE9+V9DJ7r+1s4euOi4sGPIAt4sD7r+Tk5s9mrlbLCHVQTK4KllAvcrL25bPFI38FuFceREEzFoRlTrekSyB2Q==",
|
||||||
|
"path": "discord.net.interactions/3.5.0",
|
||||||
|
"hashPath": "discord.net.interactions.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-BnTdLFuuQsKvCv08VQrD4X1Hw2Xp+MELIRQiDiKfG01IiQlRTN+1gc3LB1zXgn5xBvC0HXjHxwV22GrMD9uKHQ==",
|
||||||
|
"path": "discord.net.rest/3.5.0",
|
||||||
|
"hashPath": "discord.net.rest.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vCIGZS+m88sQDuFmdbUqg+2RIXS/NJWx8ei3MX+ZEYiAvOkDgQfkIlEnU1NKpds6ivTt5GFlv6UzcWubb5VJ1w==",
|
||||||
|
"path": "discord.net.webhook/3.5.0",
|
||||||
|
"hashPath": "discord.net.webhook.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-LjBOvcP40vJ+dhOtBDi8haEeblPAKpAIqR04NBzTM1/0RVavJZH89ovfSQIk42ygkiOaDV4E2x0Mmh6DRoIYcw==",
|
||||||
|
"path": "discord.net.websocket/3.5.0",
|
||||||
|
"hashPath": "discord.net.websocket.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
||||||
|
"path": "system.collections.immutable/5.0.0",
|
||||||
|
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
||||||
|
"path": "system.interactive.async/5.0.0",
|
||||||
|
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
||||||
|
"path": "system.linq.async/5.0.0",
|
||||||
|
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||||
|
"path": "system.reactive/5.0.0",
|
||||||
|
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
||||||
|
"path": "system.valuetuple/4.5.0",
|
||||||
|
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
BUILDS/net5.0/EVE_LevelingSystem.dll
Normal file
BIN
BUILDS/net5.0/EVE_LevelingSystem.dll
Normal file
Binary file not shown.
268
BUILDS/net5.0/MusicCommands.deps.json
Normal file
268
BUILDS/net5.0/MusicCommands.deps.json
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v5.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v5.0": {
|
||||||
|
"MusicCommands/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"PluginManager": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"MusicCommands.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Commands": "3.5.0",
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Interactions": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Discord.Net.Webhook": "3.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Commands.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Newtonsoft.Json": "13.0.1",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Interactive.Async": "5.0.0",
|
||||||
|
"System.ValueTuple": "4.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Core.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Interactions.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Rest.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Webhook.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.WebSocket.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.20.51904"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Linq.Async": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/System.Reactive.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"PluginManager.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"MusicCommands/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-IUtexpvogudb1rllKBWkIEpBVQoToMjtVo81KPkt+gNMe7KtRDcZJgcn6+72viMtyw0e95OJPXFV5VEA/n2OQQ==",
|
||||||
|
"path": "discord.net/3.5.0",
|
||||||
|
"hashPath": "discord.net.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ClTv8aiTlitvS48YatRiTLvgE2f2uKgmHNPVBIuvJBHZO2u4bZCzoN1fid+pZn2sbVOkt8uftlLGzz5DSZlFIA==",
|
||||||
|
"path": "discord.net.commands/3.5.0",
|
||||||
|
"hashPath": "discord.net.commands.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rCzzaznMVQ+bLMxOpYwTyqm9V22kMy6BxlQisSxemHZDe2Jedz3Clp/a0dToACLz+Dlp3u+jYUfCBnTz7L6f4g==",
|
||||||
|
"path": "discord.net.core/3.5.0",
|
||||||
|
"hashPath": "discord.net.core.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-wE9+V9DJ7r+1s4euOi4sGPIAt4sD7r+Tk5s9mrlbLCHVQTK4KllAvcrL25bPFI38FuFceREEzFoRlTrekSyB2Q==",
|
||||||
|
"path": "discord.net.interactions/3.5.0",
|
||||||
|
"hashPath": "discord.net.interactions.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-BnTdLFuuQsKvCv08VQrD4X1Hw2Xp+MELIRQiDiKfG01IiQlRTN+1gc3LB1zXgn5xBvC0HXjHxwV22GrMD9uKHQ==",
|
||||||
|
"path": "discord.net.rest/3.5.0",
|
||||||
|
"hashPath": "discord.net.rest.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vCIGZS+m88sQDuFmdbUqg+2RIXS/NJWx8ei3MX+ZEYiAvOkDgQfkIlEnU1NKpds6ivTt5GFlv6UzcWubb5VJ1w==",
|
||||||
|
"path": "discord.net.webhook/3.5.0",
|
||||||
|
"hashPath": "discord.net.webhook.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-LjBOvcP40vJ+dhOtBDi8haEeblPAKpAIqR04NBzTM1/0RVavJZH89ovfSQIk42ygkiOaDV4E2x0Mmh6DRoIYcw==",
|
||||||
|
"path": "discord.net.websocket/3.5.0",
|
||||||
|
"hashPath": "discord.net.websocket.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
||||||
|
"path": "system.collections.immutable/5.0.0",
|
||||||
|
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
||||||
|
"path": "system.interactive.async/5.0.0",
|
||||||
|
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
||||||
|
"path": "system.linq.async/5.0.0",
|
||||||
|
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||||
|
"path": "system.reactive/5.0.0",
|
||||||
|
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
||||||
|
"path": "system.valuetuple/4.5.0",
|
||||||
|
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
BUILDS/net5.0/MusicCommands.dll
Normal file
BIN
BUILDS/net5.0/MusicCommands.dll
Normal file
Binary file not shown.
BIN
BUILDS/net5.0/PluginManager.dll
Normal file
BIN
BUILDS/net5.0/PluginManager.dll
Normal file
Binary file not shown.
268
BUILDS/net5.0/StartupEvents.deps.json
Normal file
268
BUILDS/net5.0/StartupEvents.deps.json
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v5.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v5.0": {
|
||||||
|
"StartupEvents/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"PluginManager": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"StartupEvents.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Commands": "3.5.0",
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Interactions": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Discord.Net.Webhook": "3.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Commands.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Newtonsoft.Json": "13.0.1",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Interactive.Async": "5.0.0",
|
||||||
|
"System.ValueTuple": "4.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Core.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0",
|
||||||
|
"Discord.Net.WebSocket": "3.5.0",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Interactions.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Rest.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.Webhook.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.5.0",
|
||||||
|
"Discord.Net.Rest": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/Discord.Net.WebSocket.dll": {
|
||||||
|
"assemblyVersion": "3.5.0.0",
|
||||||
|
"fileVersion": "3.5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.20.51904"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Linq.Async": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/System.Reactive.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": "3.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"PluginManager.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"StartupEvents/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Discord.Net/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-IUtexpvogudb1rllKBWkIEpBVQoToMjtVo81KPkt+gNMe7KtRDcZJgcn6+72viMtyw0e95OJPXFV5VEA/n2OQQ==",
|
||||||
|
"path": "discord.net/3.5.0",
|
||||||
|
"hashPath": "discord.net.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ClTv8aiTlitvS48YatRiTLvgE2f2uKgmHNPVBIuvJBHZO2u4bZCzoN1fid+pZn2sbVOkt8uftlLGzz5DSZlFIA==",
|
||||||
|
"path": "discord.net.commands/3.5.0",
|
||||||
|
"hashPath": "discord.net.commands.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rCzzaznMVQ+bLMxOpYwTyqm9V22kMy6BxlQisSxemHZDe2Jedz3Clp/a0dToACLz+Dlp3u+jYUfCBnTz7L6f4g==",
|
||||||
|
"path": "discord.net.core/3.5.0",
|
||||||
|
"hashPath": "discord.net.core.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-wE9+V9DJ7r+1s4euOi4sGPIAt4sD7r+Tk5s9mrlbLCHVQTK4KllAvcrL25bPFI38FuFceREEzFoRlTrekSyB2Q==",
|
||||||
|
"path": "discord.net.interactions/3.5.0",
|
||||||
|
"hashPath": "discord.net.interactions.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-BnTdLFuuQsKvCv08VQrD4X1Hw2Xp+MELIRQiDiKfG01IiQlRTN+1gc3LB1zXgn5xBvC0HXjHxwV22GrMD9uKHQ==",
|
||||||
|
"path": "discord.net.rest/3.5.0",
|
||||||
|
"hashPath": "discord.net.rest.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vCIGZS+m88sQDuFmdbUqg+2RIXS/NJWx8ei3MX+ZEYiAvOkDgQfkIlEnU1NKpds6ivTt5GFlv6UzcWubb5VJ1w==",
|
||||||
|
"path": "discord.net.webhook/3.5.0",
|
||||||
|
"hashPath": "discord.net.webhook.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-LjBOvcP40vJ+dhOtBDi8haEeblPAKpAIqR04NBzTM1/0RVavJZH89ovfSQIk42ygkiOaDV4E2x0Mmh6DRoIYcw==",
|
||||||
|
"path": "discord.net.websocket/3.5.0",
|
||||||
|
"hashPath": "discord.net.websocket.3.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
||||||
|
"path": "system.collections.immutable/5.0.0",
|
||||||
|
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
||||||
|
"path": "system.interactive.async/5.0.0",
|
||||||
|
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
||||||
|
"path": "system.linq.async/5.0.0",
|
||||||
|
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||||
|
"path": "system.reactive/5.0.0",
|
||||||
|
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
||||||
|
"path": "system.valuetuple/4.5.0",
|
||||||
|
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
BUILDS/net5.0/StartupEvents.dll
Normal file
BIN
BUILDS/net5.0/StartupEvents.dll
Normal file
Binary file not shown.
BIN
BUILDS/net5.0/ref/CMD_LevelingSystem.dll
Normal file
BIN
BUILDS/net5.0/ref/CMD_LevelingSystem.dll
Normal file
Binary file not shown.
BIN
BUILDS/net5.0/ref/CMD_Utils.dll
Normal file
BIN
BUILDS/net5.0/ref/CMD_Utils.dll
Normal file
Binary file not shown.
BIN
BUILDS/net5.0/ref/EVE_LevelingSystem.dll
Normal file
BIN
BUILDS/net5.0/ref/EVE_LevelingSystem.dll
Normal file
Binary file not shown.
BIN
BUILDS/net5.0/ref/MusicCommands.dll
Normal file
BIN
BUILDS/net5.0/ref/MusicCommands.dll
Normal file
Binary file not shown.
BIN
BUILDS/net5.0/ref/StartupEvents.dll
Normal file
BIN
BUILDS/net5.0/ref/StartupEvents.dll
Normal file
Binary file not shown.
268
BUILDS/net6.0/CMD_Utils.deps.json
Normal file
268
BUILDS/net6.0/CMD_Utils.deps.json
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v6.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v6.0": {
|
||||||
|
"CMD_Utils/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"PluginManager": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"CMD_Utils.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Commands": "3.7.2",
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Interactions": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2",
|
||||||
|
"Discord.Net.WebSocket": "3.7.2",
|
||||||
|
"Discord.Net.Webhook": "3.7.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Commands.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Newtonsoft.Json": "13.0.1",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Interactive.Async": "5.0.0",
|
||||||
|
"System.ValueTuple": "4.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Core.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2",
|
||||||
|
"Discord.Net.WebSocket": "3.7.2",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Interactions.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Rest.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Webhook.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.20.51904"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Linq.Async": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/System.Reactive.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"PluginManager.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"CMD_Utils/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Discord.Net/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FAiCLGu5rp6+Z10FjKbbJ6LLpKjbMBGpozixkJlz5LZvuncPx8f4AWFAw7pBecKUuAh983qiZ8CZYZcNXsI4qg==",
|
||||||
|
"path": "discord.net/3.7.2",
|
||||||
|
"hashPath": "discord.net.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-aOEGP04X64htsTr7ozKj9qHpmvOfitSw5gfR8Tw9TX0+FdswD2LNL2KfOAIaxRKZmRTm34aXQEJrVq0K8AptmQ==",
|
||||||
|
"path": "discord.net.commands/3.7.2",
|
||||||
|
"hashPath": "discord.net.commands.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-apwswc6LjN4dj3u27SO3Hr56Jzl91wzReahieoD7IQhV+BJQaRxhTRiEEWFTrBzHfeFHEOQ7r6vZnra3zeFhKA==",
|
||||||
|
"path": "discord.net.core/3.7.2",
|
||||||
|
"hashPath": "discord.net.core.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-dwGhEdDB0yyo/lGtjwIDVZmsuD52di7lIZWu/sBtvvA05dMgYZq5S6ILdsBXjOyaHeXd+EV4YMlj2VS/rm619w==",
|
||||||
|
"path": "discord.net.interactions/3.7.2",
|
||||||
|
"hashPath": "discord.net.interactions.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-dyp8YaMBNJ837EH1KNz2PNGZqc2y71WFd1+pdldF+pLQJ3Gf/+V7685paAR7bQw7yFNyqEBR/QRBCNp+QIQ7Wg==",
|
||||||
|
"path": "discord.net.rest/3.7.2",
|
||||||
|
"hashPath": "discord.net.rest.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-da3i/mTq2y7mfj3xlHH14S4PivHbflJCVr8OUikJtQrxBOxvPkqP7ZYk3Y9S28q0K8qik+TUjCcjL5gELKrh/A==",
|
||||||
|
"path": "discord.net.webhook/3.7.2",
|
||||||
|
"hashPath": "discord.net.webhook.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-pYCd6ET44ADaNiyEw82TaJnR7TKYHfrKCytWFWMPL5faJhoh260avZn3Hwunlf331lEQ0f4K1CujPkQbNuq7kQ==",
|
||||||
|
"path": "discord.net.websocket/3.7.2",
|
||||||
|
"hashPath": "discord.net.websocket.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Collections.Immutable/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
||||||
|
"path": "system.collections.immutable/5.0.0",
|
||||||
|
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
||||||
|
"path": "system.interactive.async/5.0.0",
|
||||||
|
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
||||||
|
"path": "system.linq.async/5.0.0",
|
||||||
|
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||||
|
"path": "system.reactive/5.0.0",
|
||||||
|
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.ValueTuple/4.5.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
||||||
|
"path": "system.valuetuple/4.5.0",
|
||||||
|
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"PluginManager/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
BUILDS/net6.0/CMD_Utils.dll
Normal file
BIN
BUILDS/net6.0/CMD_Utils.dll
Normal file
Binary file not shown.
334
BUILDS/net6.0/Music Commands.deps.json
Normal file
334
BUILDS/net6.0/Music Commands.deps.json
Normal file
@@ -0,0 +1,334 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v6.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v6.0": {
|
||||||
|
"Music Commands/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"PluginManager": "1.0.0",
|
||||||
|
"YoutubeExplode": "6.2.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Music Commands.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": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Commands": "3.7.2",
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Interactions": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2",
|
||||||
|
"Discord.Net.WebSocket": "3.7.2",
|
||||||
|
"Discord.Net.Webhook": "3.7.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Commands.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Newtonsoft.Json": "13.0.1",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Interactive.Async": "5.0.0",
|
||||||
|
"System.ValueTuple": "4.5.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Core.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2",
|
||||||
|
"Discord.Net.WebSocket": "3.7.2",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
||||||
|
"System.Collections.Immutable": "5.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Interactions.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Rest.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.Webhook.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.7.2": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net.Core": "3.7.2",
|
||||||
|
"Discord.Net.Rest": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
||||||
|
"assemblyVersion": "3.7.2.0",
|
||||||
|
"fileVersion": "3.7.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.20.51904"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.NETCore.Platforms/5.0.0": {},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Buffers/4.5.1": {},
|
||||||
|
"System.Collections.Immutable/5.0.0": {},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Linq.Async": "5.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net5.0/System.Reactive.dll": {
|
||||||
|
"assemblyVersion": "5.0.0.0",
|
||||||
|
"fileVersion": "5.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Text.Encoding.CodePages/5.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.Platforms": "5.0.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": {
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": "3.7.2"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"PluginManager.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Music Commands/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"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": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FAiCLGu5rp6+Z10FjKbbJ6LLpKjbMBGpozixkJlz5LZvuncPx8f4AWFAw7pBecKUuAh983qiZ8CZYZcNXsI4qg==",
|
||||||
|
"path": "discord.net/3.7.2",
|
||||||
|
"hashPath": "discord.net.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Commands/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-aOEGP04X64htsTr7ozKj9qHpmvOfitSw5gfR8Tw9TX0+FdswD2LNL2KfOAIaxRKZmRTm34aXQEJrVq0K8AptmQ==",
|
||||||
|
"path": "discord.net.commands/3.7.2",
|
||||||
|
"hashPath": "discord.net.commands.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Core/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-apwswc6LjN4dj3u27SO3Hr56Jzl91wzReahieoD7IQhV+BJQaRxhTRiEEWFTrBzHfeFHEOQ7r6vZnra3zeFhKA==",
|
||||||
|
"path": "discord.net.core/3.7.2",
|
||||||
|
"hashPath": "discord.net.core.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Interactions/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-dwGhEdDB0yyo/lGtjwIDVZmsuD52di7lIZWu/sBtvvA05dMgYZq5S6ILdsBXjOyaHeXd+EV4YMlj2VS/rm619w==",
|
||||||
|
"path": "discord.net.interactions/3.7.2",
|
||||||
|
"hashPath": "discord.net.interactions.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Rest/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-dyp8YaMBNJ837EH1KNz2PNGZqc2y71WFd1+pdldF+pLQJ3Gf/+V7685paAR7bQw7yFNyqEBR/QRBCNp+QIQ7Wg==",
|
||||||
|
"path": "discord.net.rest/3.7.2",
|
||||||
|
"hashPath": "discord.net.rest.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.Webhook/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-da3i/mTq2y7mfj3xlHH14S4PivHbflJCVr8OUikJtQrxBOxvPkqP7ZYk3Y9S28q0K8qik+TUjCcjL5gELKrh/A==",
|
||||||
|
"path": "discord.net.webhook/3.7.2",
|
||||||
|
"hashPath": "discord.net.webhook.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Discord.Net.WebSocket/3.7.2": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-pYCd6ET44ADaNiyEw82TaJnR7TKYHfrKCytWFWMPL5faJhoh260avZn3Hwunlf331lEQ0f4K1CujPkQbNuq7kQ==",
|
||||||
|
"path": "discord.net.websocket/3.7.2",
|
||||||
|
"hashPath": "discord.net.websocket.3.7.2.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
||||||
|
"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": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"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": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
||||||
|
"path": "system.collections.immutable/5.0.0",
|
||||||
|
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Interactive.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
||||||
|
"path": "system.interactive.async/5.0.0",
|
||||||
|
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Linq.Async/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
||||||
|
"path": "system.linq.async/5.0.0",
|
||||||
|
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Reactive/5.0.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
||||||
|
"path": "system.reactive/5.0.0",
|
||||||
|
"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": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
||||||
|
"path": "system.valuetuple/4.5.0",
|
||||||
|
"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": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
BUILDS/net6.0/Music Commands.dll
Normal file
BIN
BUILDS/net6.0/Music Commands.dll
Normal file
Binary file not shown.
BIN
BUILDS/net6.0/PluginManager.dll
Normal file
BIN
BUILDS/net6.0/PluginManager.dll
Normal file
Binary file not shown.
BIN
BUILDS/net6.0/Plugins/Commands/CMD_LevelingSystem.dll
Normal file
BIN
BUILDS/net6.0/Plugins/Commands/CMD_LevelingSystem.dll
Normal file
Binary file not shown.
BIN
BUILDS/net6.0/Plugins/Commands/CMD_Utils.dll
Normal file
BIN
BUILDS/net6.0/Plugins/Commands/CMD_Utils.dll
Normal file
Binary file not shown.
BIN
BUILDS/net6.0/Plugins/Commands/Music Commands.dll
Normal file
BIN
BUILDS/net6.0/Plugins/Commands/Music Commands.dll
Normal file
Binary file not shown.
BIN
BUILDS/net6.0/Plugins/Commands/Roles.dll
Normal file
BIN
BUILDS/net6.0/Plugins/Commands/Roles.dll
Normal file
Binary file not shown.
BIN
BUILDS/net6.0/Plugins/Events/EVE_LevelingSystem.dll
Normal file
BIN
BUILDS/net6.0/Plugins/Events/EVE_LevelingSystem.dll
Normal file
Binary file not shown.
14
CMD_LevelingSystem/CMD_LevelingSystem.csproj
Normal file
14
CMD_LevelingSystem/CMD_LevelingSystem.csproj
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<BaseOutputPath>bin\</BaseOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
50
CMD_LevelingSystem/Level.cs
Normal file
50
CMD_LevelingSystem/Level.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
using Discord;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace CMD_LevelingSystem;
|
||||||
|
|
||||||
|
internal class Level : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "level";
|
||||||
|
|
||||||
|
public List<string> Aliases => new() { "lvl" };
|
||||||
|
|
||||||
|
public string Description => "Display tour current level";
|
||||||
|
|
||||||
|
public string Usage => "level";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
if (!File.Exists(Config.GetValue<string>("LevelingSystemPath") + $"/{message.Author.Id}.dat"))
|
||||||
|
{
|
||||||
|
await context.Channel.SendMessageAsync("You are now unranked !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var user = await Functions.ConvertFromJson<User>(Config.GetValue<string>("LevelingSystemPath") + $"/{message.Author.Id}.dat");
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
await context.Channel.SendMessageAsync("You are now unranked !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var builder = new EmbedBuilder();
|
||||||
|
var r = new Random();
|
||||||
|
builder.WithColor(r.Next(256), r.Next(256), r.Next(256));
|
||||||
|
builder.AddField("Current Level", user.CurrentLevel, true)
|
||||||
|
.AddField("Current EXP", user.CurrentEXP, true)
|
||||||
|
.AddField("Required Exp", user.RequiredEXPToLevelUp, true);
|
||||||
|
builder.WithTimestamp(DateTimeOffset.Now);
|
||||||
|
await context.Channel.SendMessageAsync(embed: builder.Build());
|
||||||
|
}
|
||||||
|
}
|
||||||
18
CMD_LevelingSystem/User.cs
Normal file
18
CMD_LevelingSystem/User.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using Discord.WebSocket;
|
||||||
|
|
||||||
|
namespace CMD_LevelingSystem;
|
||||||
|
|
||||||
|
public class DiscordUser
|
||||||
|
{
|
||||||
|
public string Username { get; set; }
|
||||||
|
public ushort DiscordTag { get; set; }
|
||||||
|
public ulong userID { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class User
|
||||||
|
{
|
||||||
|
public DiscordUser user { get; set; }
|
||||||
|
public int CurrentLevel { get; set; }
|
||||||
|
public long CurrentEXP { get; set; }
|
||||||
|
public long RequiredEXPToLevelUp { get; set; }
|
||||||
|
}
|
||||||
19
CMD_Utils/CMD_Utils.csproj
Normal file
19
CMD_Utils/CMD_Utils.csproj
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<BaseOutputPath>bin\</BaseOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<OutputPath>..\BUILDS\</OutputPath>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
26
CMD_Utils/Echo.cs
Normal file
26
CMD_Utils/Echo.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
internal class Echo : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "echo";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
33
CMD_Utils/FlipCoin.cs
Normal file
33
CMD_Utils/FlipCoin.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CMD_Utils;
|
||||||
|
|
||||||
|
internal class FlipCoin : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "flip";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
public string Description => "Flip a coin";
|
||||||
|
|
||||||
|
public string Usage => "flip";
|
||||||
|
|
||||||
|
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 random = new System.Random();
|
||||||
|
var r = random.Next(1, 3);
|
||||||
|
if (r == 1)
|
||||||
|
await message.Channel.SendMessageAsync("Heads");
|
||||||
|
else
|
||||||
|
await message.Channel.SendMessageAsync("Tails");
|
||||||
|
}
|
||||||
|
}
|
||||||
47
CMD_Utils/Poll.cs
Normal file
47
CMD_Utils/Poll.cs
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Discord;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace CMD_Utils;
|
||||||
|
|
||||||
|
public class Poll : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "poll";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
public string Description => "Create a poll with options";
|
||||||
|
|
||||||
|
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 async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
if (isDM) return;
|
||||||
|
var question = message.Content.Split(' ')[1].Replace('-', ' ');
|
||||||
|
var answers = Functions.MergeStrings(message.Content.Split(' '), 2).Split(' ');
|
||||||
|
var embedBuilder = new EmbedBuilder();
|
||||||
|
embedBuilder.Title = question;
|
||||||
|
var len = answers.Length;
|
||||||
|
for (var i = 0; i < len; i++) embedBuilder.AddField($"Answer {i + 1}", answers[i].Replace('-', ' '), true);
|
||||||
|
var msg = await context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
||||||
|
|
||||||
|
var emotes = new List<IEmote>();
|
||||||
|
emotes.Add(Emoji.Parse(":one:"));
|
||||||
|
emotes.Add(Emoji.Parse(":two:"));
|
||||||
|
emotes.Add(Emoji.Parse(":three:"));
|
||||||
|
emotes.Add(Emoji.Parse(":four:"));
|
||||||
|
emotes.Add(Emoji.Parse(":five:"));
|
||||||
|
emotes.Add(Emoji.Parse(":six:"));
|
||||||
|
|
||||||
|
for (var i = 0; i < len; i++) await msg.AddReactionAsync(emotes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
42
CMD_Utils/Random.cs
Normal file
42
CMD_Utils/Random.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
|
public class Random : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "random";
|
||||||
|
|
||||||
|
public List<string> Aliases => new() { "rnd" };
|
||||||
|
|
||||||
|
public string Description => "random number between number1 and number2";
|
||||||
|
|
||||||
|
public string Usage => "random [number1] [number2]";
|
||||||
|
|
||||||
|
public bool canUseDM => true;
|
||||||
|
public bool canUseServer => true;
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var msg = message.Content;
|
||||||
|
var a = int.Parse(msg.Split(' ')[1]);
|
||||||
|
var b = int.Parse(msg.Split(' ')[2]);
|
||||||
|
|
||||||
|
if (a > b)
|
||||||
|
{
|
||||||
|
var temp = a;
|
||||||
|
a = b;
|
||||||
|
b = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
await message.Channel.SendMessageAsync("Your random generated number is " + new System.Random().Next(a, b));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
await message.Channel.SendMessageAsync("Invalid numbers or no numbers:\nUsage: " + Usage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
4
DiscordBot/App.config
Normal file
4
DiscordBot/App.config
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Actions;
|
|
||||||
|
|
||||||
public class Clear : ICommandAction
|
|
||||||
{
|
|
||||||
public string ActionName => "clear";
|
|
||||||
public string Description => "Clears the console";
|
|
||||||
public string Usage => "clear";
|
|
||||||
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
|
||||||
|
|
||||||
public Task Execute(string[] args)
|
|
||||||
{
|
|
||||||
Console.Clear();
|
|
||||||
Console.ForegroundColor = ConsoleColor.Yellow;
|
|
||||||
Console.WriteLine("===== Seth Discord Bot =====");
|
|
||||||
Console.ResetColor();
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Actions;
|
|
||||||
|
|
||||||
public class Exit : ICommandAction
|
|
||||||
{
|
|
||||||
public string ActionName => "exit";
|
|
||||||
public string Description => "Exits the bot and saves the config. Use exit help for more info.";
|
|
||||||
public string Usage => "exit [help|force (-f)]";
|
|
||||||
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
|
||||||
|
|
||||||
public async Task Execute(string[] args)
|
|
||||||
{
|
|
||||||
if (args is null || args.Length == 0)
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Exiting...", source: typeof(ICommandAction), type: LogType.WARNING);
|
|
||||||
await Config.AppSettings.SaveToFile();
|
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch ( args[0] )
|
|
||||||
{
|
|
||||||
case "help":
|
|
||||||
Console.WriteLine("Usage : exit [help|force]");
|
|
||||||
Console.WriteLine("help : Displays this message");
|
|
||||||
Console.WriteLine("force | -f : Exits the bot without saving the config");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "-f":
|
|
||||||
case "force":
|
|
||||||
Config.Logger.Log("Exiting (FORCE)...", source: typeof(ICommandAction), type: LogType.WARNING);
|
|
||||||
Environment.Exit(0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Console.WriteLine("Invalid argument !");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using DiscordBot.Utilities;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Loaders;
|
|
||||||
using PluginManager.Online;
|
|
||||||
using PluginManager.Others;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Actions.Extra;
|
|
||||||
|
|
||||||
internal static class PluginMethods
|
|
||||||
{
|
|
||||||
private static readonly PluginsManager PluginsManager = new();
|
|
||||||
|
|
||||||
internal static async Task List()
|
|
||||||
{
|
|
||||||
var data = await ConsoleUtilities.ExecuteWithProgressBar(PluginsManager.GetAvailablePlugins(), "Loading plugins...");
|
|
||||||
|
|
||||||
TableData tableData = new(new List<string> { "Name", "Description", "Type", "Version" });
|
|
||||||
foreach (var plugin in data) tableData.AddRow(plugin);
|
|
||||||
|
|
||||||
tableData.HasRoundBorders = false;
|
|
||||||
tableData.PrintAsTable();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async Task RefreshPlugins(bool quiet)
|
|
||||||
{
|
|
||||||
await Program.internalActionManager.Execute("plugin", "load", quiet ? "-q" : string.Empty);
|
|
||||||
await Program.internalActionManager.Refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async Task DownloadPlugin(PluginsManager manager, string pluginName)
|
|
||||||
{
|
|
||||||
var pluginData = await manager.GetPluginLinkByName(pluginName);
|
|
||||||
if (pluginData.Length == 0)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Plugin {pluginName} not found. Please check the spelling and try again.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var pluginType = pluginData[0];
|
|
||||||
var pluginLink = pluginData[1];
|
|
||||||
var pluginRequirements = pluginData[2];
|
|
||||||
|
|
||||||
|
|
||||||
await AnsiConsole.Progress()
|
|
||||||
.Columns(new ProgressColumn[]
|
|
||||||
{
|
|
||||||
new TaskDescriptionColumn(),
|
|
||||||
new ProgressBarColumn(),
|
|
||||||
new PercentageColumn()
|
|
||||||
})
|
|
||||||
.StartAsync(async ctx =>
|
|
||||||
{
|
|
||||||
var downloadTask = ctx.AddTask("Downloading plugin...");
|
|
||||||
|
|
||||||
IProgress<float> progress = new Progress<float>(p => { downloadTask.Value = p; });
|
|
||||||
|
|
||||||
await ServerCom.DownloadFileAsync(pluginLink, $"./Data/{pluginType}s/{pluginName}.dll", progress);
|
|
||||||
|
|
||||||
downloadTask.Increment(100);
|
|
||||||
|
|
||||||
ctx.Refresh();
|
|
||||||
});
|
|
||||||
|
|
||||||
if (pluginRequirements == string.Empty)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Finished installing " + pluginName + " successfully");
|
|
||||||
await RefreshPlugins(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<string> requirementsUrLs = new();
|
|
||||||
|
|
||||||
await AnsiConsole.Progress()
|
|
||||||
.Columns(new ProgressColumn[]
|
|
||||||
{
|
|
||||||
new TaskDescriptionColumn(),
|
|
||||||
new ProgressBarColumn(),
|
|
||||||
new PercentageColumn()
|
|
||||||
})
|
|
||||||
.StartAsync(async ctx =>
|
|
||||||
{
|
|
||||||
var gatherInformationTask = ctx.AddTask("Gathering info...");
|
|
||||||
gatherInformationTask.IsIndeterminate = true;
|
|
||||||
requirementsUrLs = await ServerCom.ReadTextFromURL(pluginRequirements);
|
|
||||||
await Task.Delay(2000);
|
|
||||||
gatherInformationTask.Increment(100);
|
|
||||||
});
|
|
||||||
|
|
||||||
await AnsiConsole.Progress()
|
|
||||||
.Columns(new ProgressColumn[]
|
|
||||||
{
|
|
||||||
new TaskDescriptionColumn(),
|
|
||||||
new ProgressBarColumn(),
|
|
||||||
new PercentageColumn()
|
|
||||||
})
|
|
||||||
.StartAsync(async ctx =>
|
|
||||||
{
|
|
||||||
List<Tuple<ProgressTask, IProgress<float>, Task>> downloadTasks = new();
|
|
||||||
|
|
||||||
foreach (var info in requirementsUrLs)
|
|
||||||
{
|
|
||||||
if (info.Length < 2) continue;
|
|
||||||
string[] data = info.Split(',');
|
|
||||||
string url = data[0];
|
|
||||||
string fileName = data[1];
|
|
||||||
|
|
||||||
var task = ctx.AddTask($"Downloading {fileName}...");
|
|
||||||
IProgress<float> progress = new Progress<float>(p =>
|
|
||||||
{
|
|
||||||
task.Value = p;
|
|
||||||
});
|
|
||||||
|
|
||||||
var downloadTask = ServerCom.DownloadFileAsync(url, $"./{fileName}", progress);
|
|
||||||
downloadTasks.Add(new Tuple<ProgressTask, IProgress<float>, Task>(task, progress, downloadTask));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var task in downloadTasks)
|
|
||||||
{
|
|
||||||
await task.Item3;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
await RefreshPlugins(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async Task<bool> LoadPlugins(string[] args)
|
|
||||||
{
|
|
||||||
var loader = new PluginLoader(Config.DiscordBot.client);
|
|
||||||
if (args.Length == 2 && args[1] == "-q")
|
|
||||||
{
|
|
||||||
loader.LoadPlugins();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cc = Console.ForegroundColor;
|
|
||||||
loader.onCMDLoad += (name, typeName, success, exception) =>
|
|
||||||
{
|
|
||||||
if (name == null || name.Length < 2)
|
|
||||||
name = typeName;
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Successfully loaded command : " + name, source: typeof(ICommandAction),
|
|
||||||
type: LogType.INFO);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Failed to load command : " + name + " because " + exception?.Message,
|
|
||||||
source: typeof(ICommandAction), type: LogType.ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.ForegroundColor = cc;
|
|
||||||
};
|
|
||||||
loader.onEVELoad += (name, typeName, success, exception) =>
|
|
||||||
{
|
|
||||||
if (name == null || name.Length < 2)
|
|
||||||
name = typeName;
|
|
||||||
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Successfully loaded event : " + name, source: typeof(ICommandAction),
|
|
||||||
type: LogType.INFO);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Failed to load event : " + name + " because " + exception?.Message,
|
|
||||||
source: typeof(ICommandAction), type: LogType.ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.ForegroundColor = cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
loader.onSLSHLoad += (name, typeName, success, exception) =>
|
|
||||||
{
|
|
||||||
if (name == null || name.Length < 2)
|
|
||||||
name = typeName;
|
|
||||||
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Successfully loaded slash command : " + name, source: typeof(ICommandAction),
|
|
||||||
type: LogType.INFO);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Failed to load slash command : " + name + " because " + exception?.Message,
|
|
||||||
source: typeof(ICommandAction), type: LogType.ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.ForegroundColor = cc;
|
|
||||||
};
|
|
||||||
|
|
||||||
loader.LoadPlugins();
|
|
||||||
Console.ForegroundColor = cc;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using PluginManager;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Actions.Extra;
|
|
||||||
|
|
||||||
internal static class SettingsConfigExtra
|
|
||||||
{
|
|
||||||
internal static void SetSettings(string key, params string[] value)
|
|
||||||
{
|
|
||||||
if (key is null) return;
|
|
||||||
|
|
||||||
if (value is null) return;
|
|
||||||
|
|
||||||
if (!Config.AppSettings.ContainsKey(key))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Config.AppSettings[key] = string.Join(' ', value);
|
|
||||||
// Config.AppSettings.SaveToFile().Wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void RemoveSettings(string key)
|
|
||||||
{
|
|
||||||
if (key is null) return;
|
|
||||||
|
|
||||||
if(!Config.AppSettings.ContainsKey(key))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Config.AppSettings.Remove(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void AddSettings(string key, params string[] value)
|
|
||||||
{
|
|
||||||
if (key is null) return;
|
|
||||||
|
|
||||||
if (value is null) return;
|
|
||||||
|
|
||||||
if (Config.AppSettings.ContainsKey(key))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Config.AppSettings.Add(key, string.Join(' ', value));
|
|
||||||
// Config.AppSettings.SaveToFile().Wait();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using DiscordBot.Utilities;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Actions;
|
|
||||||
|
|
||||||
public class Help : ICommandAction
|
|
||||||
{
|
|
||||||
public string ActionName => "help";
|
|
||||||
|
|
||||||
public string Description => "Shows the list of commands and their usage";
|
|
||||||
|
|
||||||
public string Usage => "help [command]";
|
|
||||||
|
|
||||||
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
|
||||||
|
|
||||||
public async Task Execute(string[] args)
|
|
||||||
{
|
|
||||||
if (args == null || args.Length == 0)
|
|
||||||
{
|
|
||||||
var items = new List<string[]>
|
|
||||||
{
|
|
||||||
new[] { "-", "-", "-" },
|
|
||||||
new[] { "Command", "Usage", "Description" },
|
|
||||||
new[] { "-", "-", "-" }
|
|
||||||
};
|
|
||||||
|
|
||||||
foreach (var a in Program.internalActionManager.Actions)
|
|
||||||
items.Add(new[] { a.Key, a.Value.Usage, a.Value.Description });
|
|
||||||
|
|
||||||
items.Add(new[] { "-", "-", "-" });
|
|
||||||
|
|
||||||
ConsoleUtilities.FormatAndAlignTable(items,
|
|
||||||
TableFormat.CENTER_EACH_COLUMN_BASED
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Program.internalActionManager.Actions.ContainsKey(args[0]))
|
|
||||||
{
|
|
||||||
Console.WriteLine("Command not found");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var action = Program.internalActionManager.Actions[args[0]];
|
|
||||||
var actionData = new List<string[]>
|
|
||||||
{
|
|
||||||
new[] { "-", "-", "-" },
|
|
||||||
new[] { "Command", "Usage", "Description" },
|
|
||||||
new[] { "-", "-", "-" },
|
|
||||||
new[] { action.ActionName, action.Usage, action.Description },
|
|
||||||
new[] { "-", "-", "-" }
|
|
||||||
};
|
|
||||||
|
|
||||||
ConsoleUtilities.FormatAndAlignTable(actionData,
|
|
||||||
TableFormat.CENTER_EACH_COLUMN_BASED
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Input;
|
|
||||||
using DiscordBot.Bot.Actions.Extra;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Loaders;
|
|
||||||
using PluginManager.Online;
|
|
||||||
using PluginManager.Others;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Actions;
|
|
||||||
|
|
||||||
public class Plugin : ICommandAction
|
|
||||||
{
|
|
||||||
private bool pluginsLoaded;
|
|
||||||
public string ActionName => "plugin";
|
|
||||||
public string Description => "Manages plugins. Use plugin help for more info.";
|
|
||||||
public string Usage => "plugin [help|list|load|install|refresh]";
|
|
||||||
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
|
||||||
|
|
||||||
public async Task Execute(string[] args)
|
|
||||||
{
|
|
||||||
if (args is null || args.Length == 0 || args[0] == "help")
|
|
||||||
{
|
|
||||||
Console.WriteLine("Usage : plugin [help|list|load|install]");
|
|
||||||
Console.WriteLine("help : Displays this message");
|
|
||||||
Console.WriteLine("list : Lists all plugins");
|
|
||||||
Console.WriteLine("load : Loads all plugins");
|
|
||||||
Console.WriteLine("install : Installs a plugin");
|
|
||||||
Console.WriteLine("refresh : Refreshes the plugin list");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var manager = new PluginsManager();
|
|
||||||
|
|
||||||
switch (args[0])
|
|
||||||
{
|
|
||||||
case "refresh":
|
|
||||||
await PluginMethods.RefreshPlugins(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "list":
|
|
||||||
await PluginMethods.List();
|
|
||||||
break;
|
|
||||||
case "load":
|
|
||||||
if (pluginsLoaded)
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Plugins already loaded", source: typeof(ICommandAction), type: LogType.WARNING);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Config.DiscordBot is null)
|
|
||||||
{
|
|
||||||
Config.Logger.Log("DiscordBot is null", source: typeof(ICommandAction), type: LogType.WARNING);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pluginsLoaded = await PluginMethods.LoadPlugins(args);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "install":
|
|
||||||
var pluginName = string.Join(' ', args, 1, args.Length - 1);
|
|
||||||
if (string.IsNullOrEmpty(pluginName) || pluginName.Length < 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Please specify a plugin name");
|
|
||||||
Console.Write("Plugin name : ");
|
|
||||||
pluginName = Console.ReadLine();
|
|
||||||
if (string.IsNullOrEmpty(pluginName) || pluginName.Length < 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid plugin name");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await PluginMethods.DownloadPlugin(manager, pluginName);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using DiscordBot.Bot.Actions.Extra;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Actions;
|
|
||||||
|
|
||||||
public class SettingsConfig : ICommandAction
|
|
||||||
{
|
|
||||||
public string ActionName => "config";
|
|
||||||
public string Description => "Change the settings of the bot";
|
|
||||||
public string Usage => "config [options] <setting?> <value?>";
|
|
||||||
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
|
||||||
public Task Execute(string[] args)
|
|
||||||
{
|
|
||||||
if (args is null)
|
|
||||||
{
|
|
||||||
foreach (var settings in Config.AppSettings)
|
|
||||||
Console.WriteLine(settings.Key + ": " + settings.Value);
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (args[0])
|
|
||||||
{
|
|
||||||
case "-s":
|
|
||||||
case "set":
|
|
||||||
if(args.Length < 3)
|
|
||||||
return Task.CompletedTask;
|
|
||||||
SettingsConfigExtra.SetSettings(args[1],args[2..]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "-r":
|
|
||||||
case "remove":
|
|
||||||
if(args.Length < 2)
|
|
||||||
return Task.CompletedTask;
|
|
||||||
SettingsConfigExtra.RemoveSettings(args[1]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "-a":
|
|
||||||
case "add":
|
|
||||||
if(args.Length < 3)
|
|
||||||
return Task.CompletedTask;
|
|
||||||
SettingsConfigExtra.AddSettings(args[1], args[2..]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "-h":
|
|
||||||
case "-help":
|
|
||||||
Console.WriteLine("Options:");
|
|
||||||
Console.WriteLine("-s <settingName> <newValue>: Set a setting");
|
|
||||||
Console.WriteLine("-r <settingName>: Remove a setting");
|
|
||||||
Console.WriteLine("-a <settingName> <newValue>: Add a setting");
|
|
||||||
Console.WriteLine("-h: Show this help message");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Console.WriteLine("Invalid option");
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using Discord;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Loaders;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Commands;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The help command
|
|
||||||
/// </summary>
|
|
||||||
internal class Help : DBCommand
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Command name
|
|
||||||
/// </summary>
|
|
||||||
public string Command => "help";
|
|
||||||
|
|
||||||
public List<string> Aliases => null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command Description
|
|
||||||
/// </summary>
|
|
||||||
public string Description => "This command allows you to check all loaded commands";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command usage
|
|
||||||
/// </summary>
|
|
||||||
public string Usage => "help <command>";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command require administrator to be executed
|
|
||||||
/// </summary>
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The main body of the command
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">The command context</param>
|
|
||||||
public void ExecuteServer(DBCommandExecutingArguments args)
|
|
||||||
{
|
|
||||||
if (args.arguments is not null)
|
|
||||||
{
|
|
||||||
var e = GenerateHelpCommand(args.arguments[0]);
|
|
||||||
if (e is null)
|
|
||||||
args.context.Channel.SendMessageAsync("Unknown Command " + args.arguments[0]);
|
|
||||||
else
|
|
||||||
args.context.Channel.SendMessageAsync(embed: e.Build());
|
|
||||||
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var embedBuilder = new EmbedBuilder();
|
|
||||||
|
|
||||||
var adminCommands = "";
|
|
||||||
var normalCommands = "";
|
|
||||||
|
|
||||||
foreach (var cmd in PluginLoader.Commands)
|
|
||||||
if (cmd.requireAdmin)
|
|
||||||
adminCommands += cmd.Command + " ";
|
|
||||||
else
|
|
||||||
normalCommands += cmd.Command + " ";
|
|
||||||
|
|
||||||
|
|
||||||
if (adminCommands.Length > 0)
|
|
||||||
embedBuilder.AddField("Admin Commands", adminCommands);
|
|
||||||
if (normalCommands.Length > 0)
|
|
||||||
embedBuilder.AddField("Normal Commands", normalCommands);
|
|
||||||
args.context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
|
||||||
}
|
|
||||||
|
|
||||||
private EmbedBuilder GenerateHelpCommand(string command)
|
|
||||||
{
|
|
||||||
var embedBuilder = new EmbedBuilder();
|
|
||||||
var cmd = PluginLoader.Commands.Find(p => p.Command == command ||
|
|
||||||
p.Aliases is not null && p.Aliases.Contains(command)
|
|
||||||
);
|
|
||||||
if (cmd == null) return null;
|
|
||||||
|
|
||||||
embedBuilder.AddField("Usage", Config.AppSettings["prefix"] + cmd.Usage);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Discord;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Loaders;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace DiscordBot.Bot.Commands.SlashCommands;
|
|
||||||
|
|
||||||
public class Help : DBSlashCommand
|
|
||||||
{
|
|
||||||
public string Name => "help";
|
|
||||||
public string Description => "This command allows you to check all loaded commands";
|
|
||||||
public bool canUseDM => true;
|
|
||||||
|
|
||||||
public List<SlashCommandOptionBuilder> Options =>
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
new SlashCommandOptionBuilder()
|
|
||||||
.WithName("command")
|
|
||||||
.WithDescription("The command you want to get help for")
|
|
||||||
.WithRequired(false)
|
|
||||||
.WithType(ApplicationCommandOptionType.String)
|
|
||||||
};
|
|
||||||
|
|
||||||
public async void ExecuteServer(SocketSlashCommand context)
|
|
||||||
{
|
|
||||||
EmbedBuilder embedBuilder = new();
|
|
||||||
|
|
||||||
embedBuilder.WithTitle("Help Command");
|
|
||||||
embedBuilder.WithColor(Functions.RandomColor);
|
|
||||||
var slashCommands = PluginLoader.SlashCommands;
|
|
||||||
var options = context.Data.Options;
|
|
||||||
|
|
||||||
//Console.WriteLine("Options: " + options.Count);
|
|
||||||
if (options is null || options.Count == 0)
|
|
||||||
foreach (var slashCommand in slashCommands)
|
|
||||||
embedBuilder.AddField(slashCommand.Name, slashCommand.Description);
|
|
||||||
|
|
||||||
if (options.Count > 0)
|
|
||||||
{
|
|
||||||
var commandName = options.First().Name;
|
|
||||||
var slashCommand = slashCommands.FirstOrDefault(x => x.Name == commandName);
|
|
||||||
if (slashCommand is null)
|
|
||||||
{
|
|
||||||
await context.RespondAsync("Unknown Command " + commandName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
embedBuilder.AddField(slashCommand.Name, slashCommand.canUseDM)
|
|
||||||
.WithDescription(slashCommand.Description);
|
|
||||||
}
|
|
||||||
|
|
||||||
await context.RespondAsync(embed: embedBuilder.Build());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
109
DiscordBot/Discord/Commands/Help.cs
Normal file
109
DiscordBot/Discord/Commands/Help.cs
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Discord;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace DiscordBot.Discord.Commands;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The help command
|
||||||
|
/// </summary>
|
||||||
|
internal class Help : DBCommand
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Command name
|
||||||
|
/// </summary>
|
||||||
|
public string Command => "help";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command Description
|
||||||
|
/// </summary>
|
||||||
|
public string Description => "This command allows you to check all loaded commands";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command usage
|
||||||
|
/// </summary>
|
||||||
|
public string Usage => "help <command>";
|
||||||
|
|
||||||
|
/// <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>
|
||||||
|
/// Check if the command require administrator to be executed
|
||||||
|
/// </summary>
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The main body of the command
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">The command context</param>
|
||||||
|
/// <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 void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
var args = Functions.GetArguments(message);
|
||||||
|
if (args.Count != 0)
|
||||||
|
{
|
||||||
|
foreach (var item in args)
|
||||||
|
{
|
||||||
|
var e = GenerateHelpCommand(item);
|
||||||
|
if (e is null)
|
||||||
|
context.Channel.SendMessageAsync("Unknown Command " + item);
|
||||||
|
else
|
||||||
|
context.Channel.SendMessageAsync(embed: e.Build());
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var embedBuilder = new EmbedBuilder();
|
||||||
|
|
||||||
|
var adminCommands = "";
|
||||||
|
var normalCommands = "";
|
||||||
|
var DMCommands = "";
|
||||||
|
|
||||||
|
foreach (var cmd in PluginLoader.Commands!)
|
||||||
|
{
|
||||||
|
if (cmd.canUseDM)
|
||||||
|
DMCommands += cmd.Command + " ";
|
||||||
|
if (cmd.requireAdmin)
|
||||||
|
adminCommands += cmd.Command + " ";
|
||||||
|
if (cmd.canUseServer)
|
||||||
|
normalCommands += cmd.Command + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
embedBuilder.AddField("Admin Commands", adminCommands);
|
||||||
|
embedBuilder.AddField("Normal Commands", normalCommands);
|
||||||
|
embedBuilder.AddField("DM Commands", DMCommands);
|
||||||
|
context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private EmbedBuilder GenerateHelpCommand(string command)
|
||||||
|
{
|
||||||
|
var embedBuilder = new EmbedBuilder();
|
||||||
|
var cmd = PluginLoader.Commands!.Find(p => p.Command == command || (p.Aliases is not null && p.Aliases.Contains(command)));
|
||||||
|
if (cmd == null) return null;
|
||||||
|
|
||||||
|
embedBuilder.AddField("Usage", cmd.Usage);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
116
DiscordBot/Discord/Commands/Restart.cs
Normal file
116
DiscordBot/Discord/Commands/Restart.cs
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Permissions;
|
||||||
|
using DiscordLibCommands = Discord.Commands;
|
||||||
|
using DiscordLib = Discord;
|
||||||
|
using OperatingSystem = PluginManager.Others.OperatingSystem;
|
||||||
|
|
||||||
|
namespace DiscordBot.Discord.Commands;
|
||||||
|
|
||||||
|
internal class Restart : DBCommand
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Command name
|
||||||
|
/// </summary>
|
||||||
|
public string Command => "restart";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command Description
|
||||||
|
/// </summary>
|
||||||
|
public string Description => "Restart the bot";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command usage
|
||||||
|
/// </summary>
|
||||||
|
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>
|
||||||
|
/// Check if the command require administrator to be executed
|
||||||
|
/// </summary>
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The main body of the command
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">The command context</param>
|
||||||
|
/// <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)
|
||||||
|
{
|
||||||
|
if (!(message.Author as SocketGuildUser).hasPermission(DiscordLib.GuildPermission.Administrator)) return;
|
||||||
|
var args = Functions.GetArguments(message);
|
||||||
|
var OS = Functions.GetOperatingSystem();
|
||||||
|
if (args.Count == 0)
|
||||||
|
{
|
||||||
|
switch (OS)
|
||||||
|
{
|
||||||
|
case OperatingSystem.WINDOWS:
|
||||||
|
Process.Start("./DiscordBot.exe");
|
||||||
|
break;
|
||||||
|
case OperatingSystem.LINUX:
|
||||||
|
case OperatingSystem.MAC_OS:
|
||||||
|
Process.Start("./DiscordBot");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (args[0])
|
||||||
|
{
|
||||||
|
case "-p":
|
||||||
|
case "-poweroff":
|
||||||
|
case "-c":
|
||||||
|
case "-close":
|
||||||
|
Environment.Exit(0);
|
||||||
|
break;
|
||||||
|
case "-cmd":
|
||||||
|
case "-args":
|
||||||
|
var cmd = "--args";
|
||||||
|
|
||||||
|
if (args.Count > 1)
|
||||||
|
for (var i = 1; i < args.Count; i++)
|
||||||
|
cmd += $" {args[i]}";
|
||||||
|
|
||||||
|
|
||||||
|
switch (OS)
|
||||||
|
{
|
||||||
|
case OperatingSystem.WINDOWS:
|
||||||
|
Functions.WriteLogFile("Restarting the bot with the following arguments: \"" + cmd + "\"");
|
||||||
|
Process.Start("./DiscordBot.exe", cmd);
|
||||||
|
break;
|
||||||
|
case OperatingSystem.LINUX:
|
||||||
|
//case PluginManager.Others.OperatingSystem.MAC_OS: ?? - not tested
|
||||||
|
Process.Start("./DiscordBot", cmd);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Environment.Exit(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
await context.Channel.SendMessageAsync("Invalid argument. Use `help restart` to see the usage.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
100
DiscordBot/Discord/Commands/Settings.cs
Normal file
100
DiscordBot/Discord/Commands/Settings.cs
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Discord;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
|
namespace DiscordBot.Discord.Commands;
|
||||||
|
|
||||||
|
internal class Settings : DBCommand
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Command name
|
||||||
|
/// </summary>
|
||||||
|
public string Command => "set";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command Description
|
||||||
|
/// </summary>
|
||||||
|
public string Description => "This command allows you change all settings. Use \"set help\" to show details";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command usage
|
||||||
|
/// </summary>
|
||||||
|
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>
|
||||||
|
/// Check if the command require administrator to be executed
|
||||||
|
/// </summary>
|
||||||
|
public bool requireAdmin => true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The main body of the command
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">The command context</param>
|
||||||
|
/// <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 = message.Channel;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var content = message.Content;
|
||||||
|
var data = content.Split(' ');
|
||||||
|
var keyword = data[1];
|
||||||
|
if (keyword.ToLower() == "help")
|
||||||
|
{
|
||||||
|
await channel.SendMessageAsync("set token [new value] -- set the value of the new token (require restart)");
|
||||||
|
await channel.SendMessageAsync("set prefix [new value] -- set the value of the new preifx (require restart)");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (keyword.ToLower())
|
||||||
|
{
|
||||||
|
case "token":
|
||||||
|
if (data.Length != 3)
|
||||||
|
{
|
||||||
|
await channel.SendMessageAsync("Invalid token !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.SetValue("token", data[2]);
|
||||||
|
break;
|
||||||
|
case "prefix":
|
||||||
|
if (data.Length != 3)
|
||||||
|
{
|
||||||
|
await channel.SendMessageAsync("Invalid token !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.SetValue("token", data[2]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await channel.SendMessageAsync("Restart required ...");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.Message);
|
||||||
|
await channel.SendMessageAsync("Unknown usage to this command !\nUsage: " + Usage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,13 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
|
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.Others;
|
using PluginManager;
|
||||||
|
using static PluginManager.Others.Functions;
|
||||||
|
|
||||||
namespace PluginManager.Bot;
|
namespace DiscordBot.Discord.Core;
|
||||||
|
|
||||||
public class Boot
|
internal class Boot
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The bot prefix
|
/// The bot prefix
|
||||||
@@ -49,28 +51,16 @@ public class Boot
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks if the bot is ready
|
/// Checks if the bot is ready
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value> true if the bot is ready, otherwise false </value>
|
/// <value> true if the bot is ready, othwerwise false </value>
|
||||||
public bool isReady { get; private set; }
|
public bool isReady { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The start method for the bot. This method is used to load the bot
|
/// The start method for the bot. This method is used to load the bot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="config">
|
|
||||||
/// The discord socket config. If null then the default one will be applied (AlwaysDownloadUsers=true,
|
|
||||||
/// UseInteractionSnowflakeDate=false, GatewayIntents=GatewayIntents.All)
|
|
||||||
/// </param>
|
|
||||||
/// <returns>Task</returns>
|
/// <returns>Task</returns>
|
||||||
public async Task Awake(DiscordSocketConfig? config = null)
|
public async Task Awake()
|
||||||
{
|
{
|
||||||
if (config is null)
|
DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true };
|
||||||
config = new DiscordSocketConfig
|
|
||||||
{
|
|
||||||
AlwaysDownloadUsers = true,
|
|
||||||
|
|
||||||
//Disable system clock checkup (for responses at slash commands)
|
|
||||||
UseInteractionSnowflakeDate = false,
|
|
||||||
GatewayIntents = GatewayIntents.All
|
|
||||||
};
|
|
||||||
|
|
||||||
client = new DiscordSocketClient(config);
|
client = new DiscordSocketClient(config);
|
||||||
service = new CommandService();
|
service = new CommandService();
|
||||||
@@ -78,55 +68,45 @@ public class Boot
|
|||||||
CommonTasks();
|
CommonTasks();
|
||||||
|
|
||||||
await client.LoginAsync(TokenType.Bot, botToken);
|
await client.LoginAsync(TokenType.Bot, botToken);
|
||||||
|
|
||||||
await client.StartAsync();
|
await client.StartAsync();
|
||||||
|
|
||||||
commandServiceHandler = new CommandHandler(client, service, botPrefix);
|
commandServiceHandler = new CommandHandler(client, service, botPrefix);
|
||||||
|
|
||||||
await commandServiceHandler.InstallCommandsAsync();
|
await commandServiceHandler.InstallCommandsAsync();
|
||||||
|
|
||||||
Config._DiscordBotClient = this;
|
await Task.Delay(2000);
|
||||||
|
|
||||||
while (!isReady) ;
|
while (!isReady) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CommonTasks()
|
private void CommonTasks()
|
||||||
{
|
{
|
||||||
if (client == null) return;
|
if (client == null) return;
|
||||||
client.LoggedOut += Client_LoggedOut;
|
client.LoggedOut += Client_LoggedOut;
|
||||||
client.Log += Log;
|
client.Log += Log;
|
||||||
client.LoggedIn += LoggedIn;
|
client.LoggedIn += LoggedIn;
|
||||||
client.Ready += Ready;
|
client.Ready += Ready;
|
||||||
client.Disconnected += Client_Disconnected;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task Client_Disconnected(Exception arg)
|
private Task Client_LoggedOut()
|
||||||
{
|
{
|
||||||
if (arg.Message.Contains("401"))
|
WriteLogFile("Successfully Logged Out");
|
||||||
{
|
Log(new LogMessage(LogSeverity.Info, "Boot", "Successfully logged out from discord !"));
|
||||||
Config.AppSettings.Remove("token");
|
return Task.CompletedTask;
|
||||||
Config.Logger.Log("The token is invalid. Please restart the bot and enter a valid token.", source:typeof(Boot), type: LogType.CRITICAL);
|
|
||||||
await Config.AppSettings.SaveToFile();
|
|
||||||
await Task.Delay(4000);
|
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task Client_LoggedOut()
|
|
||||||
{
|
|
||||||
Config.Logger.Log("Successfully Logged Out", source: typeof(Boot));
|
|
||||||
await Log(new LogMessage(LogSeverity.Info, "Boot", "Successfully logged out from discord !"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task Ready()
|
private Task Ready()
|
||||||
{
|
{
|
||||||
isReady = true;
|
Console.Title = "ONLINE";
|
||||||
|
isReady = true;
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task LoggedIn()
|
private Task LoggedIn()
|
||||||
{
|
{
|
||||||
Config.Logger.Log("Successfully Logged In", source: typeof(Boot));
|
Console.Title = "CONNECTED";
|
||||||
|
WriteLogFile("The bot has been logged in at " + DateTime.Now.ToShortDateString() + " (" +
|
||||||
|
DateTime.Now.ToShortTimeString() + ")"
|
||||||
|
);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,12 +116,21 @@ public class Boot
|
|||||||
{
|
{
|
||||||
case LogSeverity.Error:
|
case LogSeverity.Error:
|
||||||
case LogSeverity.Critical:
|
case LogSeverity.Critical:
|
||||||
Config.Logger.Log(message.Message, source: typeof(Boot), type: LogType.ERROR);
|
WriteErrFile(message.Message);
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine("[ERROR] " + message.Message);
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LogSeverity.Info:
|
case LogSeverity.Info:
|
||||||
case LogSeverity.Debug:
|
case LogSeverity.Debug:
|
||||||
Config.Logger.Log(message.Message, source: typeof(Boot), type: LogType.INFO);
|
WriteLogFile(message.Message);
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Cyan;
|
||||||
|
Console.WriteLine("[INFO] " + message.Message);
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
131
DiscordBot/Discord/Core/CommandHandler.cs
Normal file
131
DiscordBot/Discord/Core/CommandHandler.cs
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Permissions;
|
||||||
|
|
||||||
|
namespace DiscordBot.Discord.Core;
|
||||||
|
|
||||||
|
internal class CommandHandler
|
||||||
|
{
|
||||||
|
private readonly string botPrefix;
|
||||||
|
private readonly DiscordSocketClient client;
|
||||||
|
private readonly CommandService commandService;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command handler constructor
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="client">The discord bot client</param>
|
||||||
|
/// <param name="commandService">The discord bot command service</param>
|
||||||
|
/// <param name="botPrefix">The prefix to watch for</param>
|
||||||
|
public CommandHandler(DiscordSocketClient client, CommandService commandService, string botPrefix)
|
||||||
|
{
|
||||||
|
this.client = client;
|
||||||
|
this.commandService = commandService;
|
||||||
|
this.botPrefix = botPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The method to initialize all commands
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task InstallCommandsAsync()
|
||||||
|
{
|
||||||
|
client.MessageReceived += MessageHandler;
|
||||||
|
await commandService.AddModulesAsync(Assembly.GetEntryAssembly(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The message handler for the bot
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Message">The message got from the user in discord chat</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task MessageHandler(SocketMessage Message)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (Message as SocketUserMessage == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var message = Message as SocketUserMessage;
|
||||||
|
|
||||||
|
if (message == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!message.Content.StartsWith(botPrefix))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var argPos = 0;
|
||||||
|
|
||||||
|
if (message.HasMentionPrefix(client.CurrentUser, ref argPos))
|
||||||
|
{
|
||||||
|
await message.Channel.SendMessageAsync("Can not exec mentioned commands !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message.Author.IsBot)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var context = new SocketCommandContext(client, message);
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
|
||||||
|
if (plugin != null)
|
||||||
|
{
|
||||||
|
if (message.Channel == await message.Author.CreateDMChannelAsync())
|
||||||
|
{
|
||||||
|
if (plugin.canUseDM)
|
||||||
|
{
|
||||||
|
if (plugin.requireAdmin)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,43 +1,48 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<OutputType>Exe</OutputType>
|
||||||
<Nullable>disable</Nullable>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ApplicationIcon/>
|
<Nullable>disable</Nullable>
|
||||||
<StartupObject/>
|
<ApplicationIcon />
|
||||||
<SignAssembly>False</SignAssembly>
|
<StartupObject />
|
||||||
<IsPublishable>True</IsPublishable>
|
<SignAssembly>False</SignAssembly>
|
||||||
<AssemblyVersion>1.0.3.1</AssemblyVersion>
|
<IsPublishable>True</IsPublishable>
|
||||||
</PropertyGroup>
|
<AssemblyVersion>1.0.0.3</AssemblyVersion>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
</PropertyGroup>
|
||||||
<DebugType>none</DebugType>
|
|
||||||
</PropertyGroup>
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<DebugType>none</DebugType>
|
||||||
<DebugType>none</DebugType>
|
</PropertyGroup>
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
<Compile Remove="Data\**"/>
|
<DebugType>none</DebugType>
|
||||||
<Compile Remove="obj\**"/>
|
</PropertyGroup>
|
||||||
<Compile Remove="Output\**"/>
|
|
||||||
</ItemGroup>
|
<ItemGroup>
|
||||||
<ItemGroup>
|
<Compile Remove="Data\**" />
|
||||||
<EmbeddedResource Remove="Data\**"/>
|
<Compile Remove="obj\**" />
|
||||||
<EmbeddedResource Remove="obj\**"/>
|
<Compile Remove="Output\**" />
|
||||||
<EmbeddedResource Remove="Output\**"/>
|
</ItemGroup>
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Remove="Data\**"/>
|
<EmbeddedResource Remove="Data\**" />
|
||||||
<None Remove="obj\**"/>
|
<EmbeddedResource Remove="obj\**" />
|
||||||
<None Remove="Output\**"/>
|
<EmbeddedResource Remove="Output\**" />
|
||||||
<None Remove="builder.bat" />
|
</ItemGroup>
|
||||||
<None Remove="builder.sh" />
|
|
||||||
</ItemGroup>
|
<ItemGroup>
|
||||||
<ItemGroup>
|
<None Remove="Data\**" />
|
||||||
<PackageReference Include="Discord.Net" Version="3.11.0"/>
|
<None Remove="obj\**" />
|
||||||
<PackageReference Include="pythonnet" Version="3.0.1" />
|
<None Remove="Output\**" />
|
||||||
<PackageReference Include="Spectre.Console" Version="0.47.0" />
|
</ItemGroup>
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj"/>
|
<PackageReference Include="Discord.Net" Version="3.7.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace DiscordBot;
|
|
||||||
|
|
||||||
public static class Entry
|
|
||||||
{
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
|
||||||
#if DEBUG
|
|
||||||
if (args.Length == 1 && args[0] == "/purge_plugins")
|
|
||||||
{
|
|
||||||
foreach (var plugin in Directory.GetFiles("./Data/Plugins", "*.dll", SearchOption.AllDirectories))
|
|
||||||
{
|
|
||||||
File.Delete(plugin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
var currentDomain = AppDomain.CurrentDomain;
|
|
||||||
currentDomain.AssemblyResolve += LoadFromSameFolder;
|
|
||||||
|
|
||||||
static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
|
|
||||||
{
|
|
||||||
var folderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, "./Libraries");
|
|
||||||
var assemblyPath = Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll");
|
|
||||||
if (!File.Exists(assemblyPath)) return null;
|
|
||||||
var assembly = Assembly.LoadFrom(assemblyPath);
|
|
||||||
|
|
||||||
return assembly;
|
|
||||||
}
|
|
||||||
|
|
||||||
Program.Startup(args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
using PluginManager;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace DiscordBot;
|
|
||||||
|
|
||||||
public static class Installer
|
|
||||||
{
|
|
||||||
public static void GenerateStartupConfig()
|
|
||||||
{
|
|
||||||
AnsiConsole.MarkupLine("Welcome to the [bold]SethBot[/] installer !");
|
|
||||||
AnsiConsole.MarkupLine("First, we need to configure the bot. Don't worry, it will be quick !");
|
|
||||||
|
|
||||||
var token = AnsiConsole.Ask<string>("Please enter the bot [yellow]token[/]:");
|
|
||||||
var prefix = AnsiConsole.Ask<string>("Please enter the bot [yellow]prefix[/]:");
|
|
||||||
var serverId = AnsiConsole.Ask<string>("Please enter the [yellow]Server ID[/]:");
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(serverId)) serverId = "NULL";
|
|
||||||
Config.AppSettings.Add("token", token);
|
|
||||||
Config.AppSettings.Add("prefix", prefix);
|
|
||||||
Config.AppSettings.Add("ServerID", serverId);
|
|
||||||
|
|
||||||
Config.AppSettings.SaveToFile();
|
|
||||||
|
|
||||||
AnsiConsole.MarkupLine("[bold]Config saved ![/]");
|
|
||||||
|
|
||||||
Config.Logger.Log("Config Saved", source: typeof(Installer));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,54 +1,135 @@
|
|||||||
using System;
|
using System;
|
||||||
|
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;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DiscordBot.Utilities;
|
|
||||||
using PluginManager.Bot;
|
using Discord;
|
||||||
|
|
||||||
|
using DiscordBot.Discord.Core;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Items;
|
||||||
|
using PluginManager.Online;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
using PluginManager.Others.Actions;
|
|
||||||
using Spectre.Console;
|
|
||||||
using static PluginManager.Config;
|
|
||||||
|
|
||||||
namespace DiscordBot;
|
namespace DiscordBot;
|
||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
public static InternalActionManager internalActionManager;
|
private static bool loadPluginsOnStartup;
|
||||||
|
private static bool listPluginsAtStartup;
|
||||||
|
private static ConsoleCommandsHandler consoleCommandsHandler;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main entry point for the application.
|
/// The main entry point for the application.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void Startup(string[] args)
|
[STAThread]
|
||||||
|
[Obsolete]
|
||||||
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
PreLoadComponents(args).Wait();
|
|
||||||
|
|
||||||
if (!AppSettings.ContainsKey("ServerID") || !AppSettings.ContainsKey("token") || !AppSettings.ContainsKey("prefix"))
|
|
||||||
Installer.GenerateStartupConfig();
|
|
||||||
|
|
||||||
HandleInput().Wait();
|
Directory.CreateDirectory("./Data/Resources");
|
||||||
|
Directory.CreateDirectory("./Data/Plugins/Commands");
|
||||||
|
Directory.CreateDirectory("./Data/Plugins/Events");
|
||||||
|
PreLoadComponents().Wait();
|
||||||
|
|
||||||
|
|
||||||
|
if (!Config.ContainsKey("ServerID"))
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Console.Clear();
|
||||||
|
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.WriteLine("Your server ID is not 18 characters long. Please try again.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Config.AddValueToVariables("ServerID", SID, false);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} while (true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Config.ContainsKey("token") || Config.GetValue<string>("token") == null || Config.GetValue<string>("token")?.Length != 70)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Please insert your token");
|
||||||
|
Console.Write("Token = ");
|
||||||
|
var token = Console.ReadLine();
|
||||||
|
if (token?.Length == 59 || token?.Length == 70)
|
||||||
|
Config.AddValueToVariables("token", token, true);
|
||||||
|
else
|
||||||
|
Console.WriteLine("Invalid token");
|
||||||
|
|
||||||
|
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 == ' ' || char.IsDigit(prefix))
|
||||||
|
return;
|
||||||
|
Config.AddValueToVariables("prefix", prefix.ToString(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HandleInput(args).Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main loop for the discord bot
|
/// The main loop for the discord bot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static void NoGUI()
|
/// <param name="discordbooter">The discord booter used to start the application</param>
|
||||||
|
private static void NoGUI(Boot discordbooter)
|
||||||
{
|
{
|
||||||
internalActionManager.Initialize().Wait();
|
|
||||||
internalActionManager.Execute("plugin", "load").Wait();
|
#if DEBUG
|
||||||
internalActionManager.Refresh().Wait();
|
Console.WriteLine();
|
||||||
|
ConsoleCommandsHandler.ExecuteCommad("lp").Wait();
|
||||||
|
#else
|
||||||
|
if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp");
|
||||||
|
if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs");
|
||||||
|
#endif
|
||||||
|
Config.SaveConfig(SaveType.NORMAL).Wait();
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
var cmd = Console.ReadLine();
|
|
||||||
var args = cmd.Split(' ');
|
|
||||||
var command = args[0];
|
|
||||||
args = args.Skip(1).ToArray();
|
|
||||||
if (args.Length == 0)
|
|
||||||
args = null;
|
|
||||||
|
|
||||||
internalActionManager.Execute(command, args).Wait(); // Execute the command
|
var cmd = Console.ReadLine();
|
||||||
|
if (!consoleCommandsHandler.HandleCommand(cmd!
|
||||||
|
#if DEBUG
|
||||||
|
, false
|
||||||
|
#endif
|
||||||
|
|
||||||
|
) && cmd.Length > 0)
|
||||||
|
Console.WriteLine("Failed to run command " + cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,87 +137,292 @@ public class Program
|
|||||||
/// Start the bot without user interface
|
/// Start the bot without user interface
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Returns the boot loader for the Discord Bot</returns>
|
/// <returns>Returns the boot loader for the Discord Bot</returns>
|
||||||
private static async Task StartNoGui()
|
private static async Task<Boot> StartNoGUI()
|
||||||
{
|
{
|
||||||
Console.Clear();
|
Console.Clear();
|
||||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
||||||
|
|
||||||
Console.WriteLine($"Running on version: {Assembly.GetExecutingAssembly().GetName().Version}");
|
List<string> startupMessageList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage");
|
||||||
Console.WriteLine("Git SethBot: https://github.com/andreitdr/SethDiscordBot");
|
|
||||||
Console.WriteLine("Git Plugins: https://github.com/andreitdr/SethPlugins");
|
|
||||||
|
|
||||||
ConsoleUtilities.WriteColorText("&rRemember to close the bot using the ShutDown command (&yexit&r) or some settings won't be saved");
|
|
||||||
|
|
||||||
ConsoleUtilities.WriteColorText($"Running on &m{Functions.GetOperatingSystem()}");
|
foreach (var message in startupMessageList)
|
||||||
Console.WriteLine("============================ LOG ============================");
|
Console.WriteLine(message);
|
||||||
|
|
||||||
|
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_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 ============================");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var token = AppSettings["token"];
|
var token = Config.GetValue<string>("token");
|
||||||
var prefix = AppSettings["prefix"];
|
#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 discordbooter = new Boot(token, prefix);
|
var discordbooter = new Boot(token, prefix);
|
||||||
await discordbooter.Awake();
|
await discordbooter.Awake();
|
||||||
|
return discordbooter;
|
||||||
}
|
}
|
||||||
catch ( Exception ex )
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.Log(ex.ToString(), source: typeof(Program), type: LogType.CRITICAL);
|
Console.WriteLine(ex);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clear folder
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="d">Directory path</param>
|
||||||
|
private static Task ClearFolder(string d)
|
||||||
|
{
|
||||||
|
var files = Directory.GetFiles(d);
|
||||||
|
var fileNumb = files.Length;
|
||||||
|
for (var i = 0; i < fileNumb; i++)
|
||||||
|
{
|
||||||
|
File.Delete(files[i]);
|
||||||
|
Console.WriteLine("Deleting : " + files[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handle user input arguments from the startup of the application
|
/// Handle user input arguments from the startup of the application
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="args">The arguments</param>
|
/// <param name="args">The arguments</param>
|
||||||
private static async Task HandleInput()
|
private static async Task HandleInput(string[] args)
|
||||||
{
|
{
|
||||||
await StartNoGui();
|
|
||||||
try
|
var len = args.Length;
|
||||||
|
|
||||||
|
if (len == 3 && args[0] == "/download")
|
||||||
{
|
{
|
||||||
internalActionManager = new InternalActionManager("./Data/Plugins", "*.dll");
|
var url = args[1];
|
||||||
NoGUI();
|
var location = args[2];
|
||||||
|
|
||||||
|
await ServerCom.DownloadFileAsync(url, location);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
catch ( IOException ex )
|
|
||||||
|
if (len > 0 && args[0] == "/test")
|
||||||
{
|
{
|
||||||
if (ex.Message == "No process is on the other end of the pipe." || (uint)ex.HResult == 0x800700E9)
|
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)
|
||||||
{
|
{
|
||||||
if (AppSettings.ContainsKey("LaunchMessage"))
|
bar.Update(100 / p);
|
||||||
AppSettings.Add("LaunchMessage",
|
await Task.Delay(100);
|
||||||
"An error occured while closing the bot last time. Please consider closing the bot using the &rexit&c method !\n" +
|
p++;
|
||||||
"There is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !");
|
}
|
||||||
|
|
||||||
Logger.Log("An error occured while closing the bot last time. Please consider closing the bot using the &rexit&c method !\n" +
|
return;
|
||||||
"There is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !",
|
}
|
||||||
source: typeof(Program), type: LogType.ERROR);
|
|
||||||
|
if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage")))
|
||||||
|
{
|
||||||
|
if (args.Contains("lp") || args.Contains("loadplugins"))
|
||||||
|
loadPluginsOnStartup = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (len == 0 || (args[0] != "--exec" && args[0] != "--execute"))
|
||||||
|
{
|
||||||
|
|
||||||
|
Thread mainThread = new Thread(() =>
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
||||||
|
Console.WriteLine("Execute command interface noGUI\n\n");
|
||||||
|
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-logs\t\t ------ \tClear up the output folder\n" +
|
||||||
|
"--start\t\t ------ \tStart the bot\n" +
|
||||||
|
"exit\t\t\t ------ \tClose the application"
|
||||||
|
);
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
Console.Write("> ");
|
||||||
|
var message = Console.ReadLine().Split(' ');
|
||||||
|
|
||||||
|
switch (message[0])
|
||||||
|
{
|
||||||
|
case "--help":
|
||||||
|
case "-help":
|
||||||
|
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");
|
||||||
|
break;
|
||||||
|
case "--reset-full":
|
||||||
|
await ClearFolder("./Data/Resources/");
|
||||||
|
await ClearFolder("./Output/Logs/");
|
||||||
|
await ClearFolder("./Output/Errors");
|
||||||
|
await ClearFolder("./Data/Languages/");
|
||||||
|
await ClearFolder("./Data/Plugins/Commands");
|
||||||
|
await ClearFolder("./Data/Plugins/Events");
|
||||||
|
Console.WriteLine("Successfully cleared all folders");
|
||||||
|
break;
|
||||||
|
case "--reset-logs":
|
||||||
|
await ClearFolder("./Output/Logs");
|
||||||
|
await ClearFolder("./Output/Errors");
|
||||||
|
Console.WriteLine("Successfully clear logs folder");
|
||||||
|
break;
|
||||||
|
case "--exit":
|
||||||
|
case "exit":
|
||||||
|
Environment.Exit(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Failed to execute command " + message[0]);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task PreLoadComponents(string[] args)
|
private static async Task PreLoadComponents()
|
||||||
{
|
{
|
||||||
await Initialize();
|
await Config.LoadConfig();
|
||||||
|
if (Config.ContainsKey("DeleteLogsAtStartup"))
|
||||||
Logger.OnLog += (sender, logMessage) =>
|
if (Config.GetValue<bool>("DeleteLogsAtStartup"))
|
||||||
{
|
foreach (var file in Directory.GetFiles("./Output/Logs/"))
|
||||||
string messageColor = logMessage.Type switch
|
File.Delete(file);
|
||||||
{
|
List<string> OnlineDefaultKeys = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys");
|
||||||
LogType.INFO => "[green]",
|
|
||||||
LogType.WARNING => "[yellow]",
|
|
||||||
LogType.ERROR => "[red]",
|
|
||||||
LogType.CRITICAL => "[red]",
|
|
||||||
_ => "[white]"
|
|
||||||
};
|
|
||||||
|
|
||||||
if (logMessage.Message.Contains('['))
|
Config.PluginConfig.Load();
|
||||||
|
|
||||||
|
if (!Config.ContainsKey("Version"))
|
||||||
|
Config.AddValueToVariables("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString(), false);
|
||||||
|
else
|
||||||
|
Config.SetValue("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString());
|
||||||
|
|
||||||
|
foreach (var key in OnlineDefaultKeys)
|
||||||
|
{
|
||||||
|
if (key.Length <= 3 || !key.Contains(' ')) continue;
|
||||||
|
string[] s = key.Split(' ');
|
||||||
|
try
|
||||||
{
|
{
|
||||||
// If the message contains a tag, just print it as it is. No need to format it
|
if (Config.ContainsKey(s[0])) Config.SetValue(s[0], s[1]);
|
||||||
Console.WriteLine(logMessage.Message);
|
else Config.GetAndAddValueToVariable(s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
AnsiConsole.MarkupLine($"{messageColor}{logMessage.ThrowTime} {logMessage.Message} [/]");
|
{
|
||||||
};
|
Functions.WriteErrFile(ex.Message);
|
||||||
|
}
|
||||||
AppSettings["Version"] = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
}
|
||||||
|
|
||||||
|
List<string> onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData");
|
||||||
|
foreach (var key in onlineSettingsList)
|
||||||
|
{
|
||||||
|
if (key.Length <= 3 || !key.Contains(' ')) continue;
|
||||||
|
|
||||||
|
string[] s = key.Split(' ');
|
||||||
|
switch (s[0])
|
||||||
|
{
|
||||||
|
case "CurrentVersion":
|
||||||
|
string newVersion = s[1];
|
||||||
|
if (!newVersion.Equals(Config.GetValue<string>("Version")))
|
||||||
|
{
|
||||||
|
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");
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Your product will work just fine on this outdated version, but an update is recommended.\n" +
|
||||||
|
"From now on, this version is no longer supported"
|
||||||
|
);
|
||||||
|
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 = 10; //wait time to proceed
|
||||||
|
|
||||||
|
Console.Write($"The bot will start in {waitTime} seconds");
|
||||||
|
while (waitTime > 0)
|
||||||
|
{
|
||||||
|
await Task.Delay(1000);
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console_Utilities.Initialize();
|
||||||
|
|
||||||
|
Config.SaveConfig(SaveType.NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,342 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace DiscordBot.Utilities;
|
|
||||||
|
|
||||||
public class TableData
|
|
||||||
{
|
|
||||||
public List<string> Columns;
|
|
||||||
public List<string[]> Rows;
|
|
||||||
|
|
||||||
public bool IsEmpty => Rows.Count == 0;
|
|
||||||
public bool HasRoundBorders { get; set; } = true;
|
|
||||||
|
|
||||||
public TableData(List<string> columns)
|
|
||||||
{
|
|
||||||
Columns = columns;
|
|
||||||
Rows = new List<string[]>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public TableData(string[] columns)
|
|
||||||
{
|
|
||||||
Columns = columns.ToList();
|
|
||||||
Rows = new List<string[]>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddRow(string[] row)
|
|
||||||
{
|
|
||||||
Rows.Add(row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ConsoleUtilities
|
|
||||||
{
|
|
||||||
|
|
||||||
public static async Task<T> ExecuteWithProgressBar<T>(Task<T> function, string message)
|
|
||||||
{
|
|
||||||
T result = default;
|
|
||||||
await AnsiConsole.Progress()
|
|
||||||
.Columns(
|
|
||||||
new ProgressColumn[]
|
|
||||||
{
|
|
||||||
new TaskDescriptionColumn(),
|
|
||||||
new ProgressBarColumn(),
|
|
||||||
new PercentageColumn(),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.StartAsync(
|
|
||||||
async ctx =>
|
|
||||||
{
|
|
||||||
var task = ctx.AddTask(message);
|
|
||||||
task.IsIndeterminate = true;
|
|
||||||
result = await function;
|
|
||||||
task.Increment(100);
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task ExecuteWithProgressBar(Task function, string message)
|
|
||||||
{
|
|
||||||
await AnsiConsole.Progress()
|
|
||||||
.Columns(new ProgressColumn[]
|
|
||||||
{
|
|
||||||
new TaskDescriptionColumn(),
|
|
||||||
new ProgressBarColumn(),
|
|
||||||
new PercentageColumn(),
|
|
||||||
})
|
|
||||||
.StartAsync(async ctx =>
|
|
||||||
{
|
|
||||||
var task = ctx.AddTask(message);
|
|
||||||
task.IsIndeterminate = true;
|
|
||||||
await function;
|
|
||||||
task.Increment(100);
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static readonly Dictionary<char, ConsoleColor> Colors = new()
|
|
||||||
{
|
|
||||||
{ 'g', ConsoleColor.Green },
|
|
||||||
{ 'b', ConsoleColor.Blue },
|
|
||||||
{ 'r', ConsoleColor.Red },
|
|
||||||
{ 'm', ConsoleColor.Magenta },
|
|
||||||
{ 'y', ConsoleColor.Yellow }
|
|
||||||
};
|
|
||||||
|
|
||||||
private static readonly char ColorPrefix = '&';
|
|
||||||
|
|
||||||
private static bool CanAproximateTo(this float f, float y)
|
|
||||||
{
|
|
||||||
return MathF.Abs(f - y) < 0.000001;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void PrintAsTable(this TableData tableData)
|
|
||||||
{
|
|
||||||
var table = new Table();
|
|
||||||
table.Border(tableData.HasRoundBorders ? TableBorder.Rounded : TableBorder.Square);
|
|
||||||
table.AddColumns(tableData.Columns.ToArray());
|
|
||||||
foreach (var row in tableData.Rows)
|
|
||||||
table.AddRow(row);
|
|
||||||
|
|
||||||
AnsiConsole.Write(table);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A way to create a table based on input data
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="data">The List of arrays of string that represent the rows.</param>
|
|
||||||
public static void FormatAndAlignTable(List<string[]> data, TableFormat format)
|
|
||||||
{
|
|
||||||
if (format == TableFormat.SPECTRE_CONSOLE)
|
|
||||||
{
|
|
||||||
var table = new Table();
|
|
||||||
table.Border(TableBorder.Rounded);
|
|
||||||
table.AddColumns(data[0]);
|
|
||||||
data.RemoveAt(0);
|
|
||||||
foreach (var row in data)
|
|
||||||
table.AddRow(row);
|
|
||||||
|
|
||||||
AnsiConsole.Write(table);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format == TableFormat.CENTER_EACH_COLUMN_BASED)
|
|
||||||
{
|
|
||||||
var tableLine = '-';
|
|
||||||
var tableCross = '+';
|
|
||||||
var tableWall = '|';
|
|
||||||
|
|
||||||
var len = new int[data[0].Length];
|
|
||||||
foreach (var line in data)
|
|
||||||
for (var i = 0; i < line.Length; i++)
|
|
||||||
if (line[i].Length > len[i])
|
|
||||||
len[i] = line[i].Length;
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var row in data)
|
|
||||||
{
|
|
||||||
if (row[0][0] == tableLine)
|
|
||||||
Console.Write(tableCross);
|
|
||||||
else
|
|
||||||
Console.Write(tableWall);
|
|
||||||
for (var l = 0; l < row.Length; l++)
|
|
||||||
{
|
|
||||||
if (row[l][0] == tableLine)
|
|
||||||
{
|
|
||||||
for (var i = 0; i < len[l] + 4; ++i)
|
|
||||||
Console.Write(tableLine);
|
|
||||||
}
|
|
||||||
else if (row[l].Length == len[l])
|
|
||||||
{
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write(row[l]);
|
|
||||||
Console.Write(" ");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var lenHalf = row[l].Length / 2;
|
|
||||||
for (var i = 0; i < (len[l] + 4) / 2 - lenHalf; ++i)
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write(row[l]);
|
|
||||||
for (var i = (len[l] + 4) / 2 + lenHalf + 1; i < len[l] + 4; ++i)
|
|
||||||
Console.Write(" ");
|
|
||||||
if (row[l].Length % 2 == 0)
|
|
||||||
Console.Write(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.Write(row[l][0] == tableLine ? tableCross : tableWall);
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine(); //end line
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format == TableFormat.CENTER_OVERALL_LENGTH)
|
|
||||||
{
|
|
||||||
var maxLen = 0;
|
|
||||||
foreach (var row in data)
|
|
||||||
foreach (var s in row)
|
|
||||||
if (s.Length > maxLen)
|
|
||||||
maxLen = s.Length;
|
|
||||||
|
|
||||||
var div = (maxLen + 4) / 2;
|
|
||||||
|
|
||||||
foreach (var row in data)
|
|
||||||
{
|
|
||||||
Console.Write("\t");
|
|
||||||
if (row[0] == "-")
|
|
||||||
Console.Write("+");
|
|
||||||
else
|
|
||||||
Console.Write("|");
|
|
||||||
|
|
||||||
foreach (var s in row)
|
|
||||||
{
|
|
||||||
if (s == "-")
|
|
||||||
{
|
|
||||||
for (var i = 0; i < maxLen + 4; ++i)
|
|
||||||
Console.Write("-");
|
|
||||||
}
|
|
||||||
else if (s.Length == maxLen)
|
|
||||||
{
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write(s);
|
|
||||||
Console.Write(" ");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var lenHalf = s.Length / 2;
|
|
||||||
for (var i = 0; i < div - lenHalf; ++i)
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.Write(s);
|
|
||||||
for (var 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)
|
|
||||||
{
|
|
||||||
var widths = new int[data[0].Length];
|
|
||||||
var space_between_columns = 3;
|
|
||||||
for (var i = 0; i < data.Count; i++)
|
|
||||||
for (var j = 0; j < data[i].Length; j++)
|
|
||||||
if (data[i][j].Length > widths[j])
|
|
||||||
widths[j] = data[i][j].Length;
|
|
||||||
|
|
||||||
for (var i = 0; i < data.Count; i++)
|
|
||||||
{
|
|
||||||
for (var j = 0; j < data[i].Length; j++)
|
|
||||||
{
|
|
||||||
if (data[i][j] == "-")
|
|
||||||
data[i][j] = " ";
|
|
||||||
Console.Write(data[i][j]);
|
|
||||||
for (var k = 0; k < widths[j] - data[i][j].Length + 1 + space_between_columns; k++)
|
|
||||||
Console.Write(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Exception("Unknown type of table");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteColorText(string text, bool appendNewLineAtEnd = true)
|
|
||||||
{
|
|
||||||
var initialForeGround = Console.ForegroundColor;
|
|
||||||
var input = text.ToCharArray();
|
|
||||||
for (var i = 0; i < input.Length; i++)
|
|
||||||
if (input[i] == ColorPrefix)
|
|
||||||
{
|
|
||||||
if (i + 1 < input.Length)
|
|
||||||
{
|
|
||||||
if (Colors.ContainsKey(input[i + 1]))
|
|
||||||
{
|
|
||||||
Console.ForegroundColor = Colors[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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class Spinner
|
|
||||||
{
|
|
||||||
private readonly string[] Sequence;
|
|
||||||
private bool isRunning;
|
|
||||||
public string Message;
|
|
||||||
private int position;
|
|
||||||
private Thread thread;
|
|
||||||
|
|
||||||
public Spinner()
|
|
||||||
{
|
|
||||||
Sequence = new[] { "|", "/", "-", "\\" };
|
|
||||||
position = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Start()
|
|
||||||
{
|
|
||||||
Console.CursorVisible = false;
|
|
||||||
isRunning = true;
|
|
||||||
thread = new Thread(() =>
|
|
||||||
{
|
|
||||||
while (isRunning)
|
|
||||||
{
|
|
||||||
Console.SetCursorPosition(0, Console.CursorTop);
|
|
||||||
Console.Write(" " + Sequence[position] + " " + Message + " ");
|
|
||||||
position++;
|
|
||||||
if (position >= Sequence.Length)
|
|
||||||
position = 0;
|
|
||||||
Thread.Sleep(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
thread.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
isRunning = false;
|
|
||||||
Console.CursorVisible = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace DiscordBot.Utilities;
|
|
||||||
|
|
||||||
public enum TableFormat
|
|
||||||
{
|
|
||||||
SPECTRE_CONSOLE,
|
|
||||||
CENTER_EACH_COLUMN_BASED,
|
|
||||||
CENTER_OVERALL_LENGTH,
|
|
||||||
DEFAULT
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
@echo off
|
|
||||||
echo "Building..."
|
|
||||||
|
|
||||||
echo "Building linux-x64 not self-contained"
|
|
||||||
dotnet publish -r linux-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/linux-x64
|
|
||||||
|
|
||||||
echo "Building win-x64 not self-contained"
|
|
||||||
dotnet publish -r win-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/win-x64
|
|
||||||
|
|
||||||
echo "Building osx-x64 not self-contained"
|
|
||||||
dotnet publish -r osx-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/osx-x64
|
|
||||||
|
|
||||||
|
|
||||||
echo "Building linux-x64 self-contained"
|
|
||||||
dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/linux-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Building win-x64 self-contained"
|
|
||||||
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/win-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Building osx-x64 self-contained"
|
|
||||||
dotnet publish -r osx-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/osx-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Zipping..."
|
|
||||||
mkdir ../publish/zip
|
|
||||||
|
|
||||||
|
|
||||||
zip -r ../publish/zip/linux-x64.zip ../publish/linux-x64
|
|
||||||
zip -r ../publish/zip/win-x64.zip ../publish/win-x64
|
|
||||||
zip -r ../publish/zip/osx-x64.zip ../publish/osx-x64
|
|
||||||
|
|
||||||
zip -r ../publish/zip/linux-x64-selfcontained.zip ../publish/linux-x64-selfcontained
|
|
||||||
zip -r ../publish/zip/win-x64-selfcontained.zip ../publish/win-x64-selfcontained
|
|
||||||
zip -r ../publish/zip/osx-x64-selfcontained.zip ../publish/osx-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Done!"
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# All files in this directory will be copied to the root of the container
|
|
||||||
|
|
||||||
echo "Building..."
|
|
||||||
|
|
||||||
echo "Building linux-x64 not self-contained"
|
|
||||||
dotnet publish -r linux-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ./publish/linux-x64
|
|
||||||
|
|
||||||
echo "Building win-x64 not self-contained"
|
|
||||||
dotnet publish -r win-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ./publish/win-x64
|
|
||||||
|
|
||||||
echo "Building osx-x64 not self-contained"
|
|
||||||
dotnet publish -r osx-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ./publish/osx-x64
|
|
||||||
|
|
||||||
#One file per platform
|
|
||||||
echo "Building linux-x64 self-contained"
|
|
||||||
dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ./publish/linux-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Building win-x64 self-contained"
|
|
||||||
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ./publish/win-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Building osx-x64 self-contained"
|
|
||||||
dotnet publish -r osx-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ./publish/osx-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Zipping..."
|
|
||||||
mkdir ./publish/zip
|
|
||||||
|
|
||||||
|
|
||||||
zip -r ./publish/zip/linux-x64.zip ./publish/linux-x64
|
|
||||||
zip -r ./publish/zip/win-x64.zip ./publish/win-x64
|
|
||||||
zip -r ./publish/zip/osx-x64.zip ./publish/osx-x64
|
|
||||||
|
|
||||||
zip -r ./publish/zip/linux-x64-selfcontained.zip ./publish/linux-x64-selfcontained
|
|
||||||
zip -r ./publish/zip/win-x64-selfcontained.zip ./publish/win-x64-selfcontained
|
|
||||||
zip -r ./publish/zip/osx-x64-selfcontained.zip ./publish/osx-x64-selfcontained
|
|
||||||
|
|
||||||
echo "Done!"
|
|
||||||
20
EVE_LevelingSystem/EVE_LevelingSystem.csproj
Normal file
20
EVE_LevelingSystem/EVE_LevelingSystem.csproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<BaseOutputPath></BaseOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="bin\**" />
|
||||||
|
<EmbeddedResource Remove="bin\**" />
|
||||||
|
<None Remove="bin\**" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
59
EVE_LevelingSystem/Level.cs
Normal file
59
EVE_LevelingSystem/Level.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
using Discord;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
|
||||||
|
using EVE_LevelingSystem.LevelingSystemCore;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace EVE_LevelingSystem
|
||||||
|
{
|
||||||
|
internal class Level : DBEvent
|
||||||
|
{
|
||||||
|
public string name => "Leveling System Event Handler";
|
||||||
|
public string description => "The Leveling System Event Handler";
|
||||||
|
|
||||||
|
internal static Settings globalSettings = new();
|
||||||
|
|
||||||
|
|
||||||
|
public async void Start(DiscordSocketClient client)
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory("./Data/Resources/LevelingSystem");
|
||||||
|
if (!Config.ContainsKey("LevelingSystemPath"))
|
||||||
|
Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem", true);
|
||||||
|
if (!Config.ContainsKey("LevelingSystemSettingsFile"))
|
||||||
|
Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt", true);
|
||||||
|
//PluginManager.Config.AddValueToVariables
|
||||||
|
if (!File.Exists(Config.GetValue<string>("LevelingSystemSettingsFile")))
|
||||||
|
{
|
||||||
|
globalSettings = new Settings { TimeToWaitBetweenMessages = 5 };
|
||||||
|
await Functions.SaveToJsonFile<Settings>(Config.GetValue<string>("LevelingSystemSettingsFile"), globalSettings);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
globalSettings = await Functions.ConvertFromJson<Settings>(Config.GetValue<string>("LevelingSystemSettingsFile"));
|
||||||
|
|
||||||
|
// Console.WriteLine(globalSettings.TimeToWaitBetweenMessages);
|
||||||
|
client.MessageReceived += ClientOnMessageReceived;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ClientOnMessageReceived(SocketMessage arg)
|
||||||
|
{
|
||||||
|
if (arg.Author.IsBot || arg.IsTTS || arg.Content.StartsWith(Config.GetValue<string>("prefix"))) return;
|
||||||
|
string userID = arg.Author.Id.ToString();
|
||||||
|
User user;
|
||||||
|
if (File.Exists($"{Config.GetValue<string>("LevelingSystemPath")}/{userID}.dat"))
|
||||||
|
{
|
||||||
|
user = await Functions.ConvertFromJson<User>(Config.GetValue<string>("LevelingSystemPath")! + $"/{userID}.dat");
|
||||||
|
// Console.WriteLine(Config.GetValue("LevelingSystemPath"));
|
||||||
|
if (user.AddEXP()) await arg.Channel.SendMessageAsync($"{arg.Author.Mention} is now level {user.CurrentLevel}");
|
||||||
|
await Functions.SaveToJsonFile(Config.GetValue<string>("LevelingSystemPath") + $"/{userID}.dat", user);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
user = new User { CurrentEXP = 0, CurrentLevel = 1, RequiredEXPToLevelUp = LevelCalculator.GetNextLevelRequiredEXP(1), user = new DiscordUser { DiscordTag = arg.Author.DiscriminatorValue, userID = arg.Author.Id, Username = arg.Author.Username } };
|
||||||
|
if (user.AddEXP()) await arg.Channel.SendMessageAsync($"{arg.Author.Mention} is now level {user.CurrentLevel}");
|
||||||
|
await Functions.SaveToJsonFile<User>($"{Config.GetValue<string>("LevelingSystemPath")}/{userID}.dat", user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
58
EVE_LevelingSystem/LevelingSystemCore/LevelCalculator.cs
Normal file
58
EVE_LevelingSystem/LevelingSystemCore/LevelCalculator.cs
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
|
||||||
|
namespace EVE_LevelingSystem.LevelingSystemCore
|
||||||
|
{
|
||||||
|
internal static class LevelCalculator
|
||||||
|
{
|
||||||
|
internal static List<string> OnWaitingList = new();
|
||||||
|
|
||||||
|
internal static Int64 GetNextLevelRequiredEXP(int currentLevel)
|
||||||
|
{
|
||||||
|
return currentLevel * 8 + 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void LevelUp(this User user)
|
||||||
|
{
|
||||||
|
user.CurrentEXP = 0;
|
||||||
|
user.RequiredEXPToLevelUp = GetNextLevelRequiredEXP(user.CurrentLevel);
|
||||||
|
user.CurrentLevel++;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static bool AddEXP(this User user)
|
||||||
|
{
|
||||||
|
if (OnWaitingList.Contains(user.user.userID.ToString())) return false;
|
||||||
|
Random r = new Random();
|
||||||
|
int exp = r.Next(Level.globalSettings.MinEXP, Level.globalSettings.MaxEXP + 1);
|
||||||
|
Int64 userXP = user.CurrentEXP;
|
||||||
|
Int64 reqEXP = user.RequiredEXPToLevelUp;
|
||||||
|
if (userXP + exp >= reqEXP)
|
||||||
|
{
|
||||||
|
user.LevelUp();
|
||||||
|
user.CurrentEXP = exp - (reqEXP - userXP);
|
||||||
|
//Console.WriteLine("Level up");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
user.CurrentEXP += exp;
|
||||||
|
|
||||||
|
OnWaitingList.Add(user.user.userID.ToString());
|
||||||
|
|
||||||
|
|
||||||
|
new Thread(() =>
|
||||||
|
{
|
||||||
|
int minutesToWait = Level.globalSettings.TimeToWaitBetweenMessages;
|
||||||
|
Thread.Sleep(60000 * minutesToWait);
|
||||||
|
OnWaitingList.Remove(user.user.userID.ToString());
|
||||||
|
}
|
||||||
|
).Start();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
20
EVE_LevelingSystem/LevelingSystemCore/User.cs
Normal file
20
EVE_LevelingSystem/LevelingSystemCore/User.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using Discord;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
|
||||||
|
namespace EVE_LevelingSystem.LevelingSystemCore
|
||||||
|
{
|
||||||
|
public class DiscordUser
|
||||||
|
{
|
||||||
|
public string Username { get; set; }
|
||||||
|
public ushort DiscordTag { get; set; }
|
||||||
|
public ulong userID { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class User
|
||||||
|
{
|
||||||
|
public DiscordUser user { get; set; }
|
||||||
|
public int CurrentLevel { get; set; }
|
||||||
|
public long CurrentEXP { get; set; }
|
||||||
|
public long RequiredEXPToLevelUp { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
15
EVE_LevelingSystem/Settings.cs
Normal file
15
EVE_LevelingSystem/Settings.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace EVE_LevelingSystem
|
||||||
|
{
|
||||||
|
public class Settings
|
||||||
|
{
|
||||||
|
public int TimeToWaitBetweenMessages { get; set; }
|
||||||
|
public int MinEXP { get; set; }
|
||||||
|
public int MaxEXP { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
35
MusicCommands/AudioFile.cs
Normal file
35
MusicCommands/AudioFile.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
MusicCommands/Data.cs
Normal file
13
MusicCommands/Data.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using Discord;
|
||||||
|
using Discord.Audio;
|
||||||
|
|
||||||
|
namespace MusicCommands;
|
||||||
|
|
||||||
|
internal static class Data
|
||||||
|
{
|
||||||
|
internal static IAudioClient audioClient = null;
|
||||||
|
internal static IVoiceChannel voiceChannel = null;
|
||||||
|
|
||||||
|
internal static MusicPlayer MusicPlayer = null;
|
||||||
|
internal static MusicPlaylist Playlist = new();
|
||||||
|
}
|
||||||
44
MusicCommands/Leave.cs
Normal file
44
MusicCommands/Leave.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
|
namespace MusicCommands;
|
||||||
|
|
||||||
|
internal class Leave : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "leave";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
public string Description => "Leave the voice channel";
|
||||||
|
|
||||||
|
public string Usage => "leave";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
if (Data.audioClient is not null && Data.voiceChannel is not null)
|
||||||
|
{
|
||||||
|
await Data.audioClient.StopAsync();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
MusicCommands/MusicCommands.csproj
Normal file
25
MusicCommands/MusicCommands.csproj
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<Nullable>warnings</Nullable>
|
||||||
|
<BaseOutputPath>bin\</BaseOutputPath>
|
||||||
|
<AssemblyName>Music Commands</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<OutputPath>../BUILDS/</OutputPath>
|
||||||
|
<ErrorReport>none</ErrorReport>
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="YoutubeExplode" Version="6.2.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
53
MusicCommands/MusicPlayer.cs
Normal file
53
MusicCommands/MusicPlayer.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MusicCommands;
|
||||||
|
|
||||||
|
internal class MusicPlayer
|
||||||
|
{
|
||||||
|
private Stream outputStream { get; }
|
||||||
|
internal AudioFile NowPlaying = null;
|
||||||
|
|
||||||
|
internal bool isPlaying, isPaused;
|
||||||
|
|
||||||
|
public MusicPlayer(Stream outputChannel)
|
||||||
|
{
|
||||||
|
outputStream = outputChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Play(Stream source, int byteSize, AudioFile songPlaying)
|
||||||
|
{
|
||||||
|
isPlaying = true;
|
||||||
|
NowPlaying = songPlaying;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
await source.FlushAsync();
|
||||||
|
await source.DisposeAsync();
|
||||||
|
source.Close();
|
||||||
|
await outputStream.FlushAsync();
|
||||||
|
isPlaying = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop()
|
||||||
|
{
|
||||||
|
isPlaying = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
MusicCommands/MusicPlaylist.cs
Normal file
25
MusicCommands/MusicPlaylist.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
28
MusicCommands/Pause.cs
Normal file
28
MusicCommands/Pause.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
|
namespace MusicCommands;
|
||||||
|
|
||||||
|
internal class Pause : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "pause";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
public string Description => "Pause/Unpause the music that is currently running";
|
||||||
|
|
||||||
|
public string Usage => "pause";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
Data.MusicPlayer.isPaused = !Data.MusicPlayer.isPaused;
|
||||||
|
}
|
||||||
|
}
|
||||||
119
MusicCommands/Play.cs
Normal file
119
MusicCommands/Play.cs
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using Discord;
|
||||||
|
using Discord.Audio;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace MusicCommands;
|
||||||
|
|
||||||
|
internal class Play : DBCommand
|
||||||
|
{
|
||||||
|
public string Command => "play";
|
||||||
|
|
||||||
|
public List<string> Aliases => new() { "p" };
|
||||||
|
|
||||||
|
public string Description => "Play music from a file";
|
||||||
|
|
||||||
|
public string Usage => "play [name/url]";
|
||||||
|
|
||||||
|
public bool canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory("Music");
|
||||||
|
var path = "./Music/";
|
||||||
|
string[] splitted = message.Content.Split(' ');
|
||||||
|
if (splitted.Length < 2)
|
||||||
|
return;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (splitted.Length == 2 && splitted[1].Contains("youtube.com") || splitted[1].Contains("youtu.be"))
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (false); // run only one time !
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Data.audioClient is null)
|
||||||
|
{
|
||||||
|
Data.audioClient = await Data.voiceChannel.ConnectAsync(true);
|
||||||
|
Data.MusicPlayer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
using (var discordChanneAudioOutStream = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
||||||
|
{
|
||||||
|
Data.MusicPlayer ??= new MusicPlayer(discordChanneAudioOutStream);
|
||||||
|
while (Data.Playlist.Count > 0)
|
||||||
|
{
|
||||||
|
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 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 });
|
||||||
|
}
|
||||||
|
}
|
||||||
42
MusicCommands/Skip.cs
Normal file
42
MusicCommands/Skip.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
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 canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
var loadedSong = Data.MusicPlayer.NowPlaying;
|
||||||
|
|
||||||
|
if (loadedSong is null || Data.MusicPlayer.isPlaying == false)
|
||||||
|
{
|
||||||
|
message.Channel.SendMessageAsync("There is no music playing");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Data.MusicPlayer.isPlaying = false;
|
||||||
|
message.Channel.SendMessageAsync($"You have skipped {loadedSong.Name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
32
MusicCommands/queue.cs
Normal file
32
MusicCommands/queue.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
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 canUseDM => false;
|
||||||
|
|
||||||
|
public bool canUseServer => true;
|
||||||
|
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||||
|
{
|
||||||
|
await context.Channel.SendMessageAsync($"You have {Data.Playlist.Count} items in queue");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Loaders;
|
|
||||||
using PluginManager.Others;
|
|
||||||
using PluginManager.Others.Permissions;
|
|
||||||
|
|
||||||
namespace PluginManager.Bot;
|
|
||||||
|
|
||||||
internal class CommandHandler
|
|
||||||
{
|
|
||||||
private readonly string botPrefix;
|
|
||||||
private readonly DiscordSocketClient client;
|
|
||||||
private readonly CommandService commandService;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command handler constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="client">The discord bot client</param>
|
|
||||||
/// <param name="commandService">The discord bot command service</param>
|
|
||||||
/// <param name="botPrefix">The prefix to watch for</param>
|
|
||||||
public CommandHandler(DiscordSocketClient client, CommandService commandService, string botPrefix)
|
|
||||||
{
|
|
||||||
this.client = client;
|
|
||||||
this.commandService = commandService;
|
|
||||||
this.botPrefix = botPrefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The method to initialize all commands
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task InstallCommandsAsync()
|
|
||||||
{
|
|
||||||
client.MessageReceived += MessageHandler;
|
|
||||||
client.SlashCommandExecuted += Client_SlashCommandExecuted;
|
|
||||||
await commandService.AddModulesAsync(Assembly.GetEntryAssembly(), null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task Client_SlashCommandExecuted(SocketSlashCommand arg)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var plugin = PluginLoader.SlashCommands!.FirstOrDefault(p => p.Name == arg.Data.Name);
|
|
||||||
|
|
||||||
if (plugin is null)
|
|
||||||
throw new Exception("Failed to run command. !");
|
|
||||||
|
|
||||||
|
|
||||||
if (arg.Channel is SocketDMChannel)
|
|
||||||
plugin.ExecuteDM(arg);
|
|
||||||
else plugin.ExecuteServer(arg);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Config.Logger.Log(ex.Message, type: LogType.ERROR, source: typeof(CommandHandler));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The message handler for the bot
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Message">The message got from the user in discord chat</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private async Task MessageHandler(SocketMessage Message)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Message.Author.IsBot)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (Message as SocketUserMessage == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var message = Message as SocketUserMessage;
|
|
||||||
|
|
||||||
if (message is null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var argPos = 0;
|
|
||||||
|
|
||||||
if (!message.Content.StartsWith(botPrefix) && !message.HasMentionPrefix(client.CurrentUser, ref argPos))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var context = new SocketCommandContext(client, message);
|
|
||||||
|
|
||||||
await commandService.ExecuteAsync(context, argPos, null);
|
|
||||||
|
|
||||||
DBCommand? plugin;
|
|
||||||
var cleanMessage = "";
|
|
||||||
|
|
||||||
if (message.HasMentionPrefix(client.CurrentUser, ref argPos))
|
|
||||||
{
|
|
||||||
var mentionPrefix = "<@" + client.CurrentUser.Id + ">";
|
|
||||||
|
|
||||||
plugin = PluginLoader.Commands!
|
|
||||||
.FirstOrDefault(plug => plug.Command ==
|
|
||||||
message.Content.Substring(mentionPrefix.Length + 1)
|
|
||||||
.Split(' ')[0] ||
|
|
||||||
(
|
|
||||||
plug.Aliases is not null &&
|
|
||||||
plug.Aliases.Contains(message.CleanContent
|
|
||||||
.Substring(mentionPrefix.Length + 1)
|
|
||||||
.Split(' ')[0])
|
|
||||||
));
|
|
||||||
|
|
||||||
cleanMessage = message.Content.Substring(mentionPrefix.Length + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
plugin = PluginLoader.Commands!
|
|
||||||
.FirstOrDefault(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))));
|
|
||||||
cleanMessage = message.Content.Substring(botPrefix.Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plugin is null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (plugin.requireAdmin && !context.Message.Author.isAdmin())
|
|
||||||
return;
|
|
||||||
|
|
||||||
var split = cleanMessage.Split(' ');
|
|
||||||
|
|
||||||
string[]? argsClean = null;
|
|
||||||
if (split.Length > 1)
|
|
||||||
argsClean = string.Join(' ', split, 1, split.Length - 1).Split(' ');
|
|
||||||
|
|
||||||
DBCommandExecutingArguments cmd = new(context, cleanMessage, split[0], argsClean);
|
|
||||||
|
|
||||||
Config.Logger.Log(
|
|
||||||
message: $"User ({context.User.Username}) from Guild \"{context.Guild.Name}\" executed command \"{cmd.cleanContent}\"",
|
|
||||||
source: typeof(CommandHandler),
|
|
||||||
type: LogType.INFO
|
|
||||||
);
|
|
||||||
|
|
||||||
if (context.Channel is SocketDMChannel)
|
|
||||||
plugin.ExecuteDM(cmd);
|
|
||||||
else plugin.ExecuteServer(cmd);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Config.Logger.Log(ex.Message, type: LogType.ERROR, source: typeof(CommandHandler));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +1,231 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using PluginManager.Bot;
|
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
using PluginManager.Others.Logger;
|
using System.IO;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace PluginManager;
|
namespace PluginManager
|
||||||
|
|
||||||
public class Config
|
|
||||||
{
|
{
|
||||||
private static bool _isLoaded;
|
internal class AppConfig
|
||||||
public static Logger Logger;
|
|
||||||
public static SettingsDictionary<string, string> AppSettings;
|
|
||||||
|
|
||||||
internal static Boot? _DiscordBotClient;
|
|
||||||
|
|
||||||
public static Boot? DiscordBot => _DiscordBotClient;
|
|
||||||
|
|
||||||
public static async Task Initialize()
|
|
||||||
{
|
{
|
||||||
if (_isLoaded) return;
|
public Dictionary<string, object>? ApplicationVariables { get; init; }
|
||||||
|
public List<string>? ProtectedKeyWords { get; init; }
|
||||||
Directory.CreateDirectory("./Data/Resources");
|
public Dictionary<string, string>? PluginVersions { get; init; }
|
||||||
Directory.CreateDirectory("./Data/Plugins");
|
}
|
||||||
Directory.CreateDirectory("./Data/PAKS");
|
|
||||||
Directory.CreateDirectory("./Data/Logs/Logs");
|
public static class Config
|
||||||
Directory.CreateDirectory("./Data/Logs/Errors");
|
{
|
||||||
|
public static class PluginConfig
|
||||||
AppSettings = new SettingsDictionary<string, string>("./Data/Resources/config.json");
|
{
|
||||||
|
public static readonly List<Tuple<string, PluginType>> InstalledPlugins = new();
|
||||||
AppSettings["LogFolder"] = "./Data/Logs/Logs";
|
|
||||||
|
public static void Load()
|
||||||
Logger = new Logger(false, true);
|
{
|
||||||
|
new Thread(LoadCommands).Start();
|
||||||
ArchiveManager.Initialize();
|
new Thread(LoadEvents).Start();
|
||||||
|
}
|
||||||
_isLoaded = true;
|
|
||||||
|
private static void LoadCommands()
|
||||||
Logger.Log(message: "Config initialized", source: typeof(Config));
|
{
|
||||||
|
string cmd_path = "./Data/Plugins/Commands/";
|
||||||
|
string[] files = Directory.GetFiles(cmd_path, $"*.{Loaders.PluginLoader.pluginCMDExtension}", SearchOption.AllDirectories);
|
||||||
|
foreach (var file in files)
|
||||||
|
if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
string PluginName = new FileInfo(file).Name;
|
||||||
|
string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginCMDExtension.Length);
|
||||||
|
InstalledPlugins.Add(new(name, PluginType.Command));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LoadEvents()
|
||||||
|
{
|
||||||
|
string eve_path = "./Data/Plugins/Events/";
|
||||||
|
string[] files = Directory.GetFiles(eve_path, $"*.{Loaders.PluginLoader.pluginEVEExtension}", SearchOption.AllDirectories);
|
||||||
|
foreach (var file in files)
|
||||||
|
if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
string PluginName = new FileInfo(file).Name;
|
||||||
|
string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginEVEExtension.Length);
|
||||||
|
InstalledPlugins.Add(new(name, PluginType.Event));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool Contains(string pluginName)
|
||||||
|
{
|
||||||
|
foreach (var tuple in InstalledPlugins)
|
||||||
|
if (tuple.Item1 == pluginName)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PluginType GetPluginType(string pluginName)
|
||||||
|
{
|
||||||
|
foreach (var tuple in InstalledPlugins)
|
||||||
|
if (tuple.Item1 == pluginName)
|
||||||
|
return tuple.Item2;
|
||||||
|
|
||||||
|
|
||||||
|
return PluginType.Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static AppConfig? appConfig { get; set; }
|
||||||
|
|
||||||
|
public static string GetPluginVersion(string pluginName) => appConfig!.PluginVersions![pluginName];
|
||||||
|
public static void SetPluginVersion(string pluginName, string newVersion)
|
||||||
|
{
|
||||||
|
if (appConfig!.PluginVersions!.ContainsKey(pluginName))
|
||||||
|
appConfig.PluginVersions[pluginName] = newVersion;
|
||||||
|
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);
|
||||||
|
if (isProtected && key != "Version")
|
||||||
|
appConfig.ProtectedKeyWords!.Add(key);
|
||||||
|
|
||||||
|
SaveConfig(SaveType.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
if (Config.ContainsKey(key))
|
||||||
|
return;
|
||||||
|
if (int.TryParse(value, out var intValue))
|
||||||
|
Config.AddValueToVariables(key, intValue, isReadOnly);
|
||||||
|
else if (bool.TryParse(value, out var boolValue))
|
||||||
|
Config.AddValueToVariables(key, boolValue, isReadOnly);
|
||||||
|
else if (float.TryParse(value, out var floatValue))
|
||||||
|
Config.AddValueToVariables(key, floatValue, isReadOnly);
|
||||||
|
else if (double.TryParse(value, out var doubleValue))
|
||||||
|
Config.AddValueToVariables(key, doubleValue, isReadOnly);
|
||||||
|
else if (uint.TryParse(value, out var uintValue))
|
||||||
|
Config.AddValueToVariables(key, uintValue, isReadOnly);
|
||||||
|
else if (long.TryParse(value, out var longValue))
|
||||||
|
Config.AddValueToVariables(key, longValue, isReadOnly);
|
||||||
|
else if (byte.TryParse(value, out var byteValue))
|
||||||
|
Config.AddValueToVariables(key, byteValue, isReadOnly);
|
||||||
|
else
|
||||||
|
Config.AddValueToVariables(key, value, isReadOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T? GetValue<T>(string key)
|
||||||
|
{
|
||||||
|
if (!appConfig!.ApplicationVariables!.ContainsKey(key)) return default;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
JsonElement element = (JsonElement)appConfig.ApplicationVariables[key];
|
||||||
|
return element.Deserialize<T>();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return (T)appConfig.ApplicationVariables[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetValue<T>(string key, T value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
throw new Exception("Value is null");
|
||||||
|
if (!appConfig!.ApplicationVariables!.ContainsKey(key))
|
||||||
|
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);
|
||||||
|
SaveConfig(SaveType.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveKey(string key)
|
||||||
|
{
|
||||||
|
if (key == "Version" || key == "token" || key == "prefix")
|
||||||
|
throw new Exception("Key is protected");
|
||||||
|
appConfig!.ApplicationVariables!.Remove(key);
|
||||||
|
appConfig.ProtectedKeyWords!.Remove(key);
|
||||||
|
SaveConfig(SaveType.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task SaveConfig(SaveType type)
|
||||||
|
{
|
||||||
|
if (type == SaveType.NORMAL)
|
||||||
|
{
|
||||||
|
string path = Functions.dataFolder + "config.json";
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
string path = Functions.dataFolder + "config.json";
|
||||||
|
if (File.Exists(path))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
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.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
appConfig = new() { ApplicationVariables = new Dictionary<string, object>(), ProtectedKeyWords = new List<string>(), PluginVersions = new Dictionary<string, string>() };
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool ContainsValue<T>(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!);
|
||||||
|
public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key);
|
||||||
|
|
||||||
|
public static ReadOnlyDictionary<string, object> GetAllVariables() => new(appConfig!.ApplicationVariables!);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,482 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Data;
|
|
||||||
using System.Data.SQLite;
|
|
||||||
using System.IO;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace PluginManager.Database;
|
|
||||||
|
|
||||||
public class SqlDatabase
|
|
||||||
{
|
|
||||||
private readonly SQLiteConnection Connection;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initialize a SQL connection by specifing its private path
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="fileName">The path to the database (it is starting from ./Data/Resources/)</param>
|
|
||||||
public SqlDatabase(string fileName)
|
|
||||||
{
|
|
||||||
if (!fileName.StartsWith("./Data/Resources/"))
|
|
||||||
fileName = Path.Combine("./Data/Resources", fileName);
|
|
||||||
if (!File.Exists(fileName))
|
|
||||||
SQLiteConnection.CreateFile(fileName);
|
|
||||||
var connectionString = $"URI=file:{fileName}";
|
|
||||||
Connection = new SQLiteConnection(connectionString);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Open the SQL Connection. To close use the Stop() method
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task Open()
|
|
||||||
{
|
|
||||||
await Connection.OpenAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <para>
|
|
||||||
/// Insert into a specified table some values
|
|
||||||
/// </para>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="values">The values to be inserted (in the correct order and number)</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task InsertAsync(string tableName, params string[] values)
|
|
||||||
{
|
|
||||||
var query = $"INSERT INTO {tableName} VALUES (";
|
|
||||||
for (var i = 0; i < values.Length; i++)
|
|
||||||
{
|
|
||||||
query += $"'{values[i]}'";
|
|
||||||
if (i != values.Length - 1)
|
|
||||||
query += ", ";
|
|
||||||
}
|
|
||||||
|
|
||||||
query += ")";
|
|
||||||
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
await command.ExecuteNonQueryAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <para>
|
|
||||||
/// Insert into a specified table some values
|
|
||||||
/// </para>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="values">The values to be inserted (in the correct order and number)</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public void Insert(string tableName, params string[] values)
|
|
||||||
{
|
|
||||||
var query = $"INSERT INTO {tableName} VALUES (";
|
|
||||||
for (var i = 0; i < values.Length; i++)
|
|
||||||
{
|
|
||||||
query += $"'{values[i]}'";
|
|
||||||
if (i != values.Length - 1)
|
|
||||||
query += ", ";
|
|
||||||
}
|
|
||||||
|
|
||||||
query += ")";
|
|
||||||
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
command.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Remove every row in a table that has a certain propery
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="KeyName">The column name that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the specified column</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task RemoveKeyAsync(string tableName, string KeyName, string KeyValue)
|
|
||||||
{
|
|
||||||
var query = $"DELETE FROM {tableName} WHERE {KeyName} = '{KeyValue}'";
|
|
||||||
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
await command.ExecuteNonQueryAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Remove every row in a table that has a certain propery
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="KeyName">The column name that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the specified column</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public void RemoveKey(string tableName, string KeyName, string KeyValue)
|
|
||||||
{
|
|
||||||
var query = $"DELETE FROM {tableName} WHERE {KeyName} = '{KeyValue}'";
|
|
||||||
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
command.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the key exists in the table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="keyName">The column that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the specified column</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<bool> KeyExistsAsync(string tableName, string keyName, string KeyValue)
|
|
||||||
{
|
|
||||||
var query = $"SELECT * FROM {tableName} where {keyName} = '{KeyValue}'";
|
|
||||||
|
|
||||||
if (await ReadDataAsync(query) is not null)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the key exists in the table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="keyName">The column that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the specified column</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public bool KeyExists(string tableName, string keyName, string KeyValue)
|
|
||||||
{
|
|
||||||
var query = $"SELECT * FROM {tableName} where {keyName} = '{KeyValue}'";
|
|
||||||
|
|
||||||
if (ReadData(query) is not null)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set value of a column in a table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="keyName">The column that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the column specified</param>
|
|
||||||
/// <param name="ResultColumnName">The column that has to be modified</param>
|
|
||||||
/// <param name="ResultColumnValue">The new value that will replace the old value from the column specified</param>
|
|
||||||
public async Task SetValueAsync(
|
|
||||||
string tableName, string keyName, string KeyValue, string ResultColumnName,
|
|
||||||
string ResultColumnValue)
|
|
||||||
{
|
|
||||||
if (!await TableExistsAsync(tableName))
|
|
||||||
throw new Exception($"Table {tableName} does not exist");
|
|
||||||
|
|
||||||
await ExecuteAsync(
|
|
||||||
$"UPDATE {tableName} SET {ResultColumnName}='{ResultColumnValue}' WHERE {keyName}='{KeyValue}'");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set value of a column in a table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="keyName">The column that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the column specified</param>
|
|
||||||
/// <param name="ResultColumnName">The column that has to be modified</param>
|
|
||||||
/// <param name="ResultColumnValue">The new value that will replace the old value from the column specified</param>
|
|
||||||
public void SetValue(
|
|
||||||
string tableName, string keyName, string KeyValue, string ResultColumnName,
|
|
||||||
string ResultColumnValue)
|
|
||||||
{
|
|
||||||
if (!TableExists(tableName))
|
|
||||||
throw new Exception($"Table {tableName} does not exist");
|
|
||||||
|
|
||||||
Execute($"UPDATE {tableName} SET {ResultColumnName}='{ResultColumnValue}' WHERE {keyName}='{KeyValue}'");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get value from a column in a table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="keyName">The column that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the specified column</param>
|
|
||||||
/// <param name="ResultColumnName">The column that has the result</param>
|
|
||||||
/// <returns>A string that has the requested value (can be null if nothing found)</returns>
|
|
||||||
public async Task<string?> GetValueAsync(
|
|
||||||
string tableName, string keyName, string KeyValue,
|
|
||||||
string ResultColumnName)
|
|
||||||
{
|
|
||||||
if (!await TableExistsAsync(tableName))
|
|
||||||
throw new Exception($"Table {tableName} does not exist");
|
|
||||||
|
|
||||||
return await ReadDataAsync($"SELECT {ResultColumnName} FROM {tableName} WHERE {keyName}='{KeyValue}'");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get value from a column in a table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="keyName">The column that the search is made by</param>
|
|
||||||
/// <param name="KeyValue">The value that is searched in the specified column</param>
|
|
||||||
/// <param name="ResultColumnName">The column that has the result</param>
|
|
||||||
/// <returns>A string that has the requested value (can be null if nothing found)</returns>
|
|
||||||
public string? GetValue(string tableName, string keyName, string KeyValue, string ResultColumnName)
|
|
||||||
{
|
|
||||||
if (!TableExists(tableName))
|
|
||||||
throw new Exception($"Table {tableName} does not exist");
|
|
||||||
|
|
||||||
return ReadData($"SELECT {ResultColumnName} FROM {tableName} WHERE {keyName}='{KeyValue}'");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stop the connection to the SQL Database
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async void Stop()
|
|
||||||
{
|
|
||||||
await Connection.CloseAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Change the structure of a table by adding new columns
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="columns">The columns to be added</param>
|
|
||||||
/// <param name="TYPE">The type of the columns (TEXT, INTEGER, FLOAT, etc)</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task AddColumnsToTableAsync(string tableName, string[] columns, string TYPE = "TEXT")
|
|
||||||
{
|
|
||||||
var command = Connection.CreateCommand();
|
|
||||||
command.CommandText = $"SELECT * FROM {tableName}";
|
|
||||||
var reader = await command.ExecuteReaderAsync();
|
|
||||||
var tableColumns = new List<string>();
|
|
||||||
for (var i = 0; i < reader.FieldCount; i++)
|
|
||||||
tableColumns.Add(reader.GetName(i));
|
|
||||||
|
|
||||||
foreach (var column in columns)
|
|
||||||
if (!tableColumns.Contains(column))
|
|
||||||
{
|
|
||||||
command.CommandText = $"ALTER TABLE {tableName} ADD COLUMN {column} {TYPE}";
|
|
||||||
await command.ExecuteNonQueryAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Change the structure of a table by adding new columns
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="columns">The columns to be added</param>
|
|
||||||
/// <param name="TYPE">The type of the columns (TEXT, INTEGER, FLOAT, etc)</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public void AddColumnsToTable(string tableName, string[] columns, string TYPE = "TEXT")
|
|
||||||
{
|
|
||||||
var command = Connection.CreateCommand();
|
|
||||||
command.CommandText = $"SELECT * FROM {tableName}";
|
|
||||||
var reader = command.ExecuteReader();
|
|
||||||
var tableColumns = new List<string>();
|
|
||||||
for (var i = 0; i < reader.FieldCount; i++)
|
|
||||||
tableColumns.Add(reader.GetName(i));
|
|
||||||
|
|
||||||
foreach (var column in columns)
|
|
||||||
if (!tableColumns.Contains(column))
|
|
||||||
{
|
|
||||||
command.CommandText = $"ALTER TABLE {tableName} ADD COLUMN {column} {TYPE}";
|
|
||||||
command.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if a table exists
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <returns>True if the table exists, false if not</returns>
|
|
||||||
public async Task<bool> TableExistsAsync(string tableName)
|
|
||||||
{
|
|
||||||
var cmd = Connection.CreateCommand();
|
|
||||||
cmd.CommandText = $"SELECT name FROM sqlite_master WHERE type='table' AND name='{tableName}'";
|
|
||||||
var result = await cmd.ExecuteScalarAsync();
|
|
||||||
|
|
||||||
if (result == null)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if a table exists
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <returns>True if the table exists, false if not</returns>
|
|
||||||
public bool TableExists(string tableName)
|
|
||||||
{
|
|
||||||
var cmd = Connection.CreateCommand();
|
|
||||||
cmd.CommandText = $"SELECT name FROM sqlite_master WHERE type='table' AND name='{tableName}'";
|
|
||||||
var result = cmd.ExecuteScalar();
|
|
||||||
|
|
||||||
if (result == null)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="columns">The columns of the table</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task CreateTableAsync(string tableName, params string[] columns)
|
|
||||||
{
|
|
||||||
var cmd = Connection.CreateCommand();
|
|
||||||
cmd.CommandText = $"CREATE TABLE IF NOT EXISTS {tableName} ({string.Join(", ", columns)})";
|
|
||||||
await cmd.ExecuteNonQueryAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a table
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tableName">The table name</param>
|
|
||||||
/// <param name="columns">The columns of the table</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public void CreateTable(string tableName, params string[] columns)
|
|
||||||
{
|
|
||||||
var cmd = Connection.CreateCommand();
|
|
||||||
cmd.CommandText = $"CREATE TABLE IF NOT EXISTS {tableName} ({string.Join(", ", columns)})";
|
|
||||||
cmd.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Execute a custom query
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="query">The query</param>
|
|
||||||
/// <returns>The number of rows that the query modified</returns>
|
|
||||||
public async Task<int> ExecuteAsync(string query)
|
|
||||||
{
|
|
||||||
if (!Connection.State.HasFlag(ConnectionState.Open))
|
|
||||||
await Connection.OpenAsync();
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
var answer = await command.ExecuteNonQueryAsync();
|
|
||||||
return answer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Execute a custom query
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="query">The query</param>
|
|
||||||
/// <returns>The number of rows that the query modified</returns>
|
|
||||||
public int Execute(string query)
|
|
||||||
{
|
|
||||||
if (!Connection.State.HasFlag(ConnectionState.Open))
|
|
||||||
Connection.Open();
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
var r = command.ExecuteNonQuery();
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Read data from the result table and return the first row
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="query">The query</param>
|
|
||||||
/// <returns>The result is a string that has all values separated by space character</returns>
|
|
||||||
public async Task<string?> ReadDataAsync(string query)
|
|
||||||
{
|
|
||||||
if (!Connection.State.HasFlag(ConnectionState.Open))
|
|
||||||
await Connection.OpenAsync();
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
var reader = await command.ExecuteReaderAsync();
|
|
||||||
|
|
||||||
var values = new object[reader.FieldCount];
|
|
||||||
if (reader.Read())
|
|
||||||
{
|
|
||||||
reader.GetValues(values);
|
|
||||||
return string.Join<object>(" ", values);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Read data from the result table and return the first row
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="query">The query</param>
|
|
||||||
/// <returns>The result is a string that has all values separated by space character</returns>
|
|
||||||
public string? ReadData(string query)
|
|
||||||
{
|
|
||||||
if (!Connection.State.HasFlag(ConnectionState.Open))
|
|
||||||
Connection.Open();
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
var reader = command.ExecuteReader();
|
|
||||||
|
|
||||||
var values = new object[reader.FieldCount];
|
|
||||||
if (reader.Read())
|
|
||||||
{
|
|
||||||
reader.GetValues(values);
|
|
||||||
return string.Join<object>(" ", values);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Read data from the result table and return the first row
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="query">The query</param>
|
|
||||||
/// <returns>The first row as separated items</returns>
|
|
||||||
public async Task<object[]?> ReadDataArrayAsync(string query)
|
|
||||||
{
|
|
||||||
if (!Connection.State.HasFlag(ConnectionState.Open))
|
|
||||||
await Connection.OpenAsync();
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
var reader = await command.ExecuteReaderAsync();
|
|
||||||
|
|
||||||
var values = new object[reader.FieldCount];
|
|
||||||
if (reader.Read())
|
|
||||||
{
|
|
||||||
reader.GetValues(values);
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Read data from the result table and return the first row
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="query">The query</param>
|
|
||||||
/// <returns>The first row as separated items</returns>
|
|
||||||
public object[]? ReadDataArray(string query)
|
|
||||||
{
|
|
||||||
if (!Connection.State.HasFlag(ConnectionState.Open))
|
|
||||||
Connection.Open();
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
var reader = command.ExecuteReader();
|
|
||||||
|
|
||||||
var values = new object[reader.FieldCount];
|
|
||||||
if (reader.Read())
|
|
||||||
{
|
|
||||||
reader.GetValues(values);
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Read all rows from the result table and return them as a list of string arrays. The string arrays contain the
|
|
||||||
/// values of each row
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="query">The query</param>
|
|
||||||
/// <returns>A list of string arrays representing the values that the query returns</returns>
|
|
||||||
public async Task<List<string[]>?> ReadAllRowsAsync(string query)
|
|
||||||
{
|
|
||||||
if (!Connection.State.HasFlag(ConnectionState.Open))
|
|
||||||
await Connection.OpenAsync();
|
|
||||||
var command = new SQLiteCommand(query, Connection);
|
|
||||||
var reader = await command.ExecuteReaderAsync();
|
|
||||||
|
|
||||||
if (!reader.HasRows)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
List<string[]> rows = new();
|
|
||||||
while (await reader.ReadAsync())
|
|
||||||
{
|
|
||||||
var values = new string[reader.FieldCount];
|
|
||||||
reader.GetValues(values);
|
|
||||||
rows.Add(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rows.Count == 0) return null;
|
|
||||||
|
|
||||||
return rows;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using PluginManager.Others;
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
|
||||||
namespace PluginManager.Interfaces;
|
namespace PluginManager.Interfaces;
|
||||||
|
|
||||||
@@ -27,24 +28,27 @@ 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="args">The disocrd Context</param>
|
/// <param name="context">The disocrd Context</param>
|
||||||
void ExecuteServer(DBCommandExecutingArguments args)
|
/// <param name="message">The message that the user types</param>
|
||||||
{
|
/// <param name="client">The discord client of the bot</param>
|
||||||
}
|
/// <param name="isDM">true if the message was sent from DM, otherwise false. It is always false if canUseDM is false</param>
|
||||||
|
void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM);
|
||||||
/// <summary>
|
|
||||||
/// The main body of the command. This is what is executed when user calls the command in DM
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="args">The disocrd Context</param>
|
|
||||||
void ExecuteDM(DBCommandExecutingArguments args)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ public interface DBEvent
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The name of the event
|
/// The name of the event
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string Name { get; }
|
string name { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The description of the event
|
/// The description of the event
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string Description { get; }
|
string description { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The method that is invoked when the event is loaded into memory
|
/// The method that is invoked when the event is loaded into memory
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using Discord;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
|
|
||||||
namespace PluginManager.Interfaces;
|
|
||||||
|
|
||||||
public interface DBSlashCommand
|
|
||||||
{
|
|
||||||
string Name { get; }
|
|
||||||
string Description { get; }
|
|
||||||
|
|
||||||
bool canUseDM { get; }
|
|
||||||
|
|
||||||
List<SlashCommandOptionBuilder> Options { get; }
|
|
||||||
|
|
||||||
void ExecuteServer(SocketSlashCommand context)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExecuteDM(SocketSlashCommand context) { }
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace PluginManager.Interfaces;
|
|
||||||
|
|
||||||
public interface ICommandAction
|
|
||||||
{
|
|
||||||
public string ActionName { get; }
|
|
||||||
|
|
||||||
public string? Description { get; }
|
|
||||||
|
|
||||||
public string? Usage { get; }
|
|
||||||
|
|
||||||
public InternalActionRunType RunType { get; }
|
|
||||||
|
|
||||||
public Task Execute(string[]? args);
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
using System;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace PluginManager.Interfaces.Logger;
|
|
||||||
|
|
||||||
internal interface ILog
|
|
||||||
{
|
|
||||||
string Message { get; set; }
|
|
||||||
string OutputFile { get; set; }
|
|
||||||
|
|
||||||
Type? Source { get; set; }
|
|
||||||
|
|
||||||
LogType Type { get; set; }
|
|
||||||
DateTime ThrowTime { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using PluginManager.Others;
|
|
||||||
using PluginManager.Others.Logger;
|
|
||||||
|
|
||||||
namespace PluginManager.Interfaces.Logger;
|
|
||||||
|
|
||||||
internal interface ILogger
|
|
||||||
{
|
|
||||||
bool IsEnabled { get; init; }
|
|
||||||
bool OutputToFile { get; init; }
|
|
||||||
|
|
||||||
event EventHandler<Log> OnLog;
|
|
||||||
void Log(
|
|
||||||
string message = "", string outputFile = "", Type? source = default, LogType type = LogType.INFO,
|
|
||||||
DateTime throwTime = default);
|
|
||||||
}
|
|
||||||
51
PluginManager/Items/Command.cs
Normal file
51
PluginManager/Items/Command.cs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace PluginManager.Items;
|
||||||
|
|
||||||
|
public class Command
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The author of the command
|
||||||
|
/// </summary>
|
||||||
|
public SocketUser? Author;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Command class contructor
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">The message that was sent</param>
|
||||||
|
public Command(SocketMessage message)
|
||||||
|
{
|
||||||
|
Author = message.Author;
|
||||||
|
var data = message.Content.Split(' ');
|
||||||
|
Arguments = data.Length > 1 ? new List<string>(data.MergeStrings(1).Split(' ')) : new List<string>();
|
||||||
|
CommandName = data[0].Substring(1);
|
||||||
|
PrefixUsed = data[0][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The list of arguments
|
||||||
|
/// </summary>
|
||||||
|
public List<string> Arguments { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The command that is executed
|
||||||
|
/// </summary>
|
||||||
|
public string CommandName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The prefix that is used for the command
|
||||||
|
/// </summary>
|
||||||
|
public char PrefixUsed { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ConsoleCommand
|
||||||
|
{
|
||||||
|
public string CommandName { get; init; }
|
||||||
|
public string Description { get; init; }
|
||||||
|
public string Usage { get; init; }
|
||||||
|
public Action<string[]> Action { get; init; }
|
||||||
|
}
|
||||||
494
PluginManager/Items/ConsoleCommandsHandler.cs
Normal file
494
PluginManager/Items/ConsoleCommandsHandler.cs
Normal file
@@ -0,0 +1,494 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using Discord.WebSocket;
|
||||||
|
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Online;
|
||||||
|
using PluginManager.Online.Helpers;
|
||||||
|
using PluginManager.Online.Updates;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace PluginManager.Items;
|
||||||
|
|
||||||
|
public class ConsoleCommandsHandler
|
||||||
|
{
|
||||||
|
private static readonly PluginsManager manager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt");
|
||||||
|
private static readonly List<ConsoleCommand> commandList = new();
|
||||||
|
private readonly DiscordSocketClient? client;
|
||||||
|
|
||||||
|
|
||||||
|
private static bool isDownloading = false;
|
||||||
|
private static bool pluginsLoaded = false;
|
||||||
|
|
||||||
|
public ConsoleCommandsHandler(DiscordSocketClient client)
|
||||||
|
{
|
||||||
|
this.client = client;
|
||||||
|
InitializeBasicCommands();
|
||||||
|
//Console.WriteLine("Initialized console command handler !");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeBasicCommands()
|
||||||
|
{
|
||||||
|
|
||||||
|
commandList.Clear();
|
||||||
|
|
||||||
|
AddCommand("help", "Show help", "help <command>", args =>
|
||||||
|
{
|
||||||
|
if (args.Length <= 1)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Available commands:");
|
||||||
|
List<string[]> items = new List<string[]>();
|
||||||
|
items.Add(new[] { "-", "-", "-" });
|
||||||
|
items.Add(new[] { "Command", "Description", "Usage" });
|
||||||
|
items.Add(new[] { " ", " ", "Argument type: <optional> [required]" });
|
||||||
|
items.Add(new[] { "-", "-", "-" });
|
||||||
|
|
||||||
|
foreach (var command in commandList)
|
||||||
|
{
|
||||||
|
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[] { "-", "-", "-" });
|
||||||
|
Console_Utilities.FormatAndAlignTable(items, TableFormat.DEFAULT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var command in commandList)
|
||||||
|
if (command.CommandName == args[1])
|
||||||
|
{
|
||||||
|
Console.WriteLine("Command description: " + command.Description);
|
||||||
|
Console.WriteLine("Command execution format:" + command.Usage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Command not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
AddCommand("lp", "Load plugins", () =>
|
||||||
|
{
|
||||||
|
if (pluginsLoaded)
|
||||||
|
return;
|
||||||
|
var loader = new PluginLoader(client!);
|
||||||
|
ConsoleColor cc = Console.ForegroundColor;
|
||||||
|
loader.onCMDLoad += (name, typeName, success, exception) =>
|
||||||
|
{
|
||||||
|
|
||||||
|
if (name == null || name.Length < 2)
|
||||||
|
name = typeName;
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
Console.WriteLine("[CMD] Successfully loaded command : " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
|
||||||
|
Console.WriteLine("[CMD] Failed to load command : " + name + " because " + exception!.Message);
|
||||||
|
}
|
||||||
|
Console.ForegroundColor = cc;
|
||||||
|
};
|
||||||
|
loader.onEVELoad += (name, typeName, success, exception) =>
|
||||||
|
{
|
||||||
|
if (name == null || name.Length < 2)
|
||||||
|
name = typeName;
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
Console.WriteLine("[EVENT] Successfully loaded event : " + name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine("[EVENT] Failed to load event : " + name + " because " + exception!.Message);
|
||||||
|
}
|
||||||
|
Console.ForegroundColor = cc;
|
||||||
|
};
|
||||||
|
|
||||||
|
loader.LoadPlugins();
|
||||||
|
Console.ForegroundColor = cc;
|
||||||
|
pluginsLoaded = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
AddCommand("listplugs", "list available plugins", () => { manager.ListAvailablePlugins().Wait(); });
|
||||||
|
|
||||||
|
AddCommand("dwplug", "download plugin", "dwplug [name]", async args =>
|
||||||
|
{
|
||||||
|
isDownloading = true;
|
||||||
|
if (args.Length == 1)
|
||||||
|
{
|
||||||
|
isDownloading = false;
|
||||||
|
Console.WriteLine("Please specify plugin name");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var name = args.MergeStrings(1);
|
||||||
|
// info[0] = plugin type
|
||||||
|
// info[1] = plugin link
|
||||||
|
// info[2] = if others are required, or string.Empty if none
|
||||||
|
var info = await manager.GetPluginLinkByName(name);
|
||||||
|
if (info[1] == null) // link is null
|
||||||
|
{
|
||||||
|
if (name == "")
|
||||||
|
{
|
||||||
|
isDownloading = false;
|
||||||
|
Console_Utilities.WriteColorText("Name is invalid");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isDownloading = false;
|
||||||
|
Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" + " Use &glistplugs &ccommand to display all available plugins !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string path;
|
||||||
|
if (info[0] == "Command" || info[0] == "Event")
|
||||||
|
path = "./Data/Plugins/" + info[0] + "s/" + name + "." + (info[0] == "Command" ? PluginLoader.pluginCMDExtension : PluginLoader.pluginEVEExtension);
|
||||||
|
else
|
||||||
|
path = $"./{info[1].Split('/')[info[1].Split('/').Length - 1]}";
|
||||||
|
//Console.WriteLine("Downloading: " + path + " [" + info[1] + "]");
|
||||||
|
await ServerCom.DownloadFileAsync(info[1], path);
|
||||||
|
if (info[0] == "Command" || info[0] == "Event")
|
||||||
|
if (info[0] == "Event")
|
||||||
|
Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Event));
|
||||||
|
else if (info[0] == "Command")
|
||||||
|
Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Command));
|
||||||
|
|
||||||
|
|
||||||
|
Console.WriteLine("\n");
|
||||||
|
|
||||||
|
// check requirements if any
|
||||||
|
|
||||||
|
if (info.Length == 3 && info[2] != string.Empty && info[2] != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Downloading requirements for plugin : {name}");
|
||||||
|
|
||||||
|
var lines = await ServerCom.ReadTextFromURL(info[2]);
|
||||||
|
|
||||||
|
foreach (var line in lines)
|
||||||
|
{
|
||||||
|
if (!(line.Length > 0 && line.Contains(",")))
|
||||||
|
continue;
|
||||||
|
var split = line.Split(',');
|
||||||
|
Console.WriteLine($"\nDownloading item: {split[1]}");
|
||||||
|
if (File.Exists("./" + split[1])) File.Delete("./" + split[1]);
|
||||||
|
await ServerCom.DownloadFileAsync(split[0], "./" + split[1]);
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
if (split[0].EndsWith(".zip") || split[0].EndsWith(".pak") || split[0].EndsWith(".pkg"))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Extracting {split[1]}");
|
||||||
|
var proc = 0f;
|
||||||
|
var isExtracting = true;
|
||||||
|
var bar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, Color = ConsoleColor.Green };
|
||||||
|
|
||||||
|
IProgress<float> extractProgress = new Progress<float>(value => { proc = value; });
|
||||||
|
new Thread(new Task(() =>
|
||||||
|
{
|
||||||
|
while (isExtracting)
|
||||||
|
{
|
||||||
|
bar.Update(proc);
|
||||||
|
if (proc >= 99.9f)
|
||||||
|
isExtracting = false;
|
||||||
|
Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).Start
|
||||||
|
).Start();
|
||||||
|
await Functions.ExtractArchive("./" + split[1], "./", extractProgress, UnzipProgressType.PercentageFromTotalSize);
|
||||||
|
bar.Update(100f);
|
||||||
|
isExtracting = false;
|
||||||
|
await Task.Delay(1000);
|
||||||
|
bar.Update(100);
|
||||||
|
Console.WriteLine("\n");
|
||||||
|
File.Delete("./" + split[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 =>
|
||||||
|
{
|
||||||
|
if (args.Length != 2)
|
||||||
|
return;
|
||||||
|
if (!Config.ContainsKey(args[1]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var data = Config.GetValue<string>(args[1]);
|
||||||
|
Console.WriteLine($"{args[1]} => {data}");
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
AddCommand("add", "add variable to the system variables", "add [key] [value] [isReadOnly=true/false]", args =>
|
||||||
|
{
|
||||||
|
if (args.Length < 4)
|
||||||
|
return;
|
||||||
|
var key = args[1];
|
||||||
|
var value = args[2];
|
||||||
|
var isReadOnly = args[3].Equals("true", StringComparison.CurrentCultureIgnoreCase);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Config.GetAndAddValueToVariable(key, value, isReadOnly);
|
||||||
|
Console.WriteLine($"Updated config file with the following command: {args[1]} => {value}");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
AddCommand("remv", "remove variable from system variables", "remv [key]", args =>
|
||||||
|
{
|
||||||
|
if (args.Length < 2)
|
||||||
|
return;
|
||||||
|
Config.RemoveKey(args[1]);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
AddCommand("sd", "Shuts down the discord bot", async () =>
|
||||||
|
{
|
||||||
|
if (client is null)
|
||||||
|
return;
|
||||||
|
bool run = true;
|
||||||
|
var t = new Thread(() =>
|
||||||
|
{
|
||||||
|
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
|
||||||
|
while (run)
|
||||||
|
{
|
||||||
|
bar.Update(1);
|
||||||
|
Thread.Sleep(50);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.Start();
|
||||||
|
await Config.SaveConfig(SaveType.NORMAL);
|
||||||
|
await Config.SaveConfig(SaveType.BACKUP);
|
||||||
|
await Task.Delay(4000);
|
||||||
|
run = false;
|
||||||
|
Console.WriteLine();
|
||||||
|
await client.StopAsync();
|
||||||
|
await client.DisposeAsync();
|
||||||
|
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
|
||||||
|
commandList.Sort((x, y) => x.CommandName.CompareTo(y.CommandName));
|
||||||
|
}
|
||||||
|
|
||||||
|
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 });
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
Console_Utilities.WriteColorText($"Command &r{command} &cadded to the list of commands");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddCommand(string command, string description, Action action)
|
||||||
|
{
|
||||||
|
AddCommand(command, description, command, args => action());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveCommand(string command)
|
||||||
|
{
|
||||||
|
commandList.RemoveAll(x => x.CommandName == command);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool CommandExists(string command)
|
||||||
|
{
|
||||||
|
return GetCommand(command) is not null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ConsoleCommand? GetCommand(string 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)
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
var args = command.Split(' ');
|
||||||
|
foreach (var item in commandList.ToList())
|
||||||
|
if (item.CommandName == args[0])
|
||||||
|
{
|
||||||
|
if (removeCommandExecution)
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(0, Console.CursorTop - 1);
|
||||||
|
for (int i = 0; i < command.Length + 30; i++)
|
||||||
|
Console.Write(" ");
|
||||||
|
Console.SetCursorPosition(0, Console.CursorTop);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
item.Action(args);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
//Console.WriteLine($"Executing: {args[0]} with the following parameters: {args.MergeStrings(1)}");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace PluginManager.Loaders;
|
|
||||||
|
|
||||||
public class ActionsLoader
|
|
||||||
{
|
|
||||||
public delegate void ActionLoaded(string name, string typeName, bool success, Exception? e = null);
|
|
||||||
|
|
||||||
private readonly string actionExtension = "dll";
|
|
||||||
|
|
||||||
private readonly string actionFolder = @"./Data/Plugins/";
|
|
||||||
|
|
||||||
public ActionsLoader(string path, string extension)
|
|
||||||
{
|
|
||||||
actionFolder = path;
|
|
||||||
actionExtension = extension;
|
|
||||||
}
|
|
||||||
|
|
||||||
public event ActionLoaded? ActionLoadedEvent;
|
|
||||||
|
|
||||||
public async Task<List<ICommandAction>?> Load()
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(actionFolder);
|
|
||||||
var files = Directory.GetFiles(actionFolder, $"*.{actionExtension}", SearchOption.AllDirectories);
|
|
||||||
|
|
||||||
var actions = new List<ICommandAction>();
|
|
||||||
|
|
||||||
foreach (var file in files)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Assembly.LoadFrom(file);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
ActionLoadedEvent?.Invoke(file, "", false, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
var types = AppDomain.CurrentDomain.GetAssemblies()
|
|
||||||
.SelectMany(s => s.GetTypes())
|
|
||||||
.Where(p => typeof(ICommandAction).IsAssignableFrom(p) && !p.IsInterface);
|
|
||||||
|
|
||||||
foreach (var type in types)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var action = (ICommandAction)Activator.CreateInstance(type);
|
|
||||||
if (action.ActionName == null)
|
|
||||||
{
|
|
||||||
ActionLoadedEvent?.Invoke(action.ActionName, type.Name, false);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (action.RunType == InternalActionRunType.ON_STARTUP)
|
|
||||||
await action.Execute(null);
|
|
||||||
|
|
||||||
ActionLoadedEvent?.Invoke(action.ActionName, type.Name, true);
|
|
||||||
actions.Add(action);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
ActionLoadedEvent?.Invoke(type.Name, type.Name, false, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return actions;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,87 +1,73 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using PluginManager.Interfaces;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using PluginManager.Online.Updates;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Loaders;
|
namespace PluginManager.Loaders;
|
||||||
|
|
||||||
internal class LoaderArgs : EventArgs
|
internal class LoaderArgs : EventArgs
|
||||||
{
|
{
|
||||||
internal string? PluginName { get; init; }
|
internal string? PluginName { get; init; }
|
||||||
internal string? TypeName { get; init; }
|
internal string? TypeName { get; init; }
|
||||||
internal bool IsLoaded { get; init; }
|
internal bool IsLoaded { get; init; }
|
||||||
internal Exception? Exception { get; init; }
|
internal Exception? Exception { get; init; }
|
||||||
internal object? Plugin { get; init; }
|
internal object? Plugin { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class Loader
|
internal class Loader<T>
|
||||||
{
|
{
|
||||||
internal Loader(string path, string extension)
|
internal Loader(string path, string extension)
|
||||||
{
|
{
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.extension = extension;
|
this.extension = extension;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private string path { get; }
|
private string path { get; }
|
||||||
private string extension { get; }
|
private string extension { get; }
|
||||||
|
|
||||||
|
|
||||||
|
internal delegate void FileLoadedEventHandler(LoaderArgs args);
|
||||||
|
|
||||||
|
internal delegate void PluginLoadedEventHandler(LoaderArgs args);
|
||||||
|
|
||||||
internal event FileLoadedEventHandler? FileLoaded;
|
internal event FileLoadedEventHandler? FileLoaded;
|
||||||
|
|
||||||
internal event PluginLoadedEventHandler? PluginLoaded;
|
internal event PluginLoadedEventHandler? PluginLoaded;
|
||||||
|
|
||||||
|
internal List<T>? Load()
|
||||||
internal (List<DBEvent>?, List<DBCommand>?, List<DBSlashCommand>?) Load()
|
|
||||||
{
|
{
|
||||||
List<DBEvent> events = new();
|
var list = new List<T>();
|
||||||
List<DBSlashCommand> slashCommands = new();
|
|
||||||
List<DBCommand> commands = new();
|
|
||||||
|
|
||||||
if (!Directory.Exists(path))
|
if (!Directory.Exists(path))
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(path);
|
Directory.CreateDirectory(path);
|
||||||
return (null, null, null);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
Assembly.LoadFrom(file);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Config.Logger.Log("PluginName: " + new FileInfo(file).Name.Split('.')[0] + " not loaded", source: typeof(Loader), type: LogType.ERROR);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Assembly.LoadFrom(file);
|
||||||
if (FileLoaded != null)
|
if (FileLoaded != null)
|
||||||
{
|
{
|
||||||
var args = new LoaderArgs
|
var args = new LoaderArgs
|
||||||
{
|
{
|
||||||
Exception = null,
|
Exception = null,
|
||||||
TypeName = null,
|
TypeName = nameof(T),
|
||||||
IsLoaded = false,
|
IsLoaded = false,
|
||||||
PluginName = new FileInfo(file).Name.Split('.')[0],
|
PluginName = new FileInfo(file).Name.Split('.')[0],
|
||||||
Plugin = null
|
Plugin = null
|
||||||
};
|
};
|
||||||
FileLoaded.Invoke(args);
|
FileLoaded.Invoke(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return (LoadItems<DBEvent>(), LoadItems<DBCommand>(), LoadItems<DBSlashCommand>());
|
|
||||||
}
|
|
||||||
|
|
||||||
internal List<T> LoadItems<T>()
|
|
||||||
{
|
|
||||||
List<T> list = new();
|
|
||||||
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var interfaceType = typeof(T);
|
var interfaceType = typeof(T);
|
||||||
@@ -101,44 +87,26 @@ internal class Loader
|
|||||||
|
|
||||||
if (PluginLoaded != null)
|
if (PluginLoaded != null)
|
||||||
PluginLoaded.Invoke(new LoaderArgs
|
PluginLoaded.Invoke(new LoaderArgs
|
||||||
{
|
{
|
||||||
Exception = null,
|
Exception = null,
|
||||||
IsLoaded = true,
|
IsLoaded = true,
|
||||||
PluginName = type.FullName,
|
PluginName = type.FullName,
|
||||||
TypeName = typeof(T) == typeof(DBCommand) ? "DBCommand" :
|
TypeName = nameof(T),
|
||||||
typeof(T) == typeof(DBEvent) ? "DBEvent" :
|
Plugin = plugin
|
||||||
typeof(T) == typeof(DBSlashCommand) ? "DBSlashCommand" :
|
}
|
||||||
null,
|
);
|
||||||
Plugin = plugin
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
if (PluginLoaded != null)
|
if (PluginLoaded != null) PluginLoaded.Invoke(new LoaderArgs { Exception = ex, IsLoaded = false, PluginName = type.FullName, TypeName = nameof(T) });
|
||||||
PluginLoaded.Invoke(new LoaderArgs
|
|
||||||
{
|
|
||||||
Exception = ex,
|
|
||||||
IsLoaded = false,
|
|
||||||
PluginName = type.FullName,
|
|
||||||
TypeName = nameof(T)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Config.Logger.Log(ex.Message, source: typeof(Loader), type: LogType.ERROR);
|
Functions.WriteErrFile(ex.ToString());
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal delegate void FileLoadedEventHandler(LoaderArgs args);
|
|
||||||
|
|
||||||
internal delegate void PluginLoadedEventHandler(LoaderArgs args);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.IO;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Discord;
|
|
||||||
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;
|
||||||
@@ -15,11 +20,11 @@ public class PluginLoader
|
|||||||
|
|
||||||
public delegate void EVELoaded(string name, string typeName, bool success, Exception? e = null);
|
public delegate void EVELoaded(string name, string typeName, bool success, Exception? e = null);
|
||||||
|
|
||||||
public delegate void SLSHLoaded(string name, string tyypename, bool success, Exception? e = null);
|
private const string pluginCMDFolder = @"./Data/Plugins/Commands/";
|
||||||
|
private const string pluginEVEFolder = @"./Data/Plugins/Events/";
|
||||||
|
|
||||||
private const string pluginFolder = @"./Data/Plugins/";
|
internal const string pluginCMDExtension = "dll";
|
||||||
|
internal const string pluginEVEExtension = "dll";
|
||||||
internal const string pluginExtension = "dll";
|
|
||||||
private readonly DiscordSocketClient _client;
|
private readonly DiscordSocketClient _client;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -32,11 +37,6 @@ public class PluginLoader
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public EVELoaded? onEVELoad;
|
public EVELoaded? onEVELoad;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Event that is fired when a <see cref="DBEvent" /> is successfully loaded into events list
|
|
||||||
/// </summary>
|
|
||||||
public SLSHLoaded? onSLSHLoad;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The Plugin Loader constructor
|
/// The Plugin Loader constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -57,126 +57,104 @@ public class PluginLoader
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<DBEvent>? Events { get; set; }
|
public static List<DBEvent>? Events { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A list of <see cref="DBSlashCommand" /> commands
|
|
||||||
/// </summary>
|
|
||||||
public static List<DBSlashCommand>? SlashCommands { get; set; }
|
|
||||||
|
|
||||||
public static int PluginsLoaded
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var count = 0;
|
|
||||||
if (Commands is not null)
|
|
||||||
count += Commands.Count;
|
|
||||||
if (Events is not null)
|
|
||||||
count += Events.Count;
|
|
||||||
if (SlashCommands is not null)
|
|
||||||
count += SlashCommands.Count;
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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 async 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
|
//Load all plugins
|
||||||
|
|
||||||
Commands = new List<DBCommand>();
|
Commands = new List<DBCommand>();
|
||||||
Events = new List<DBEvent>();
|
Events = new List<DBEvent>();
|
||||||
SlashCommands = new List<DBSlashCommand>();
|
|
||||||
|
|
||||||
Config.Logger.Log("Starting plugin loader ... Client: " + _client.CurrentUser.Username, source: typeof(PluginLoader), type: LogType.INFO);
|
Functions.WriteLogFile("Starting plugin loader ... Client: " + _client.CurrentUser.Username);
|
||||||
|
Console.WriteLine("Loading plugins");
|
||||||
|
|
||||||
|
var commandsLoader = new Loader<DBCommand>(pluginCMDFolder, pluginCMDExtension);
|
||||||
|
var eventsLoader = new Loader<DBEvent>(pluginEVEFolder, pluginEVEExtension);
|
||||||
|
|
||||||
|
commandsLoader.FileLoaded += OnCommandFileLoaded;
|
||||||
|
commandsLoader.PluginLoaded += OnCommandLoaded;
|
||||||
|
|
||||||
|
eventsLoader.FileLoaded += EventFileLoaded;
|
||||||
|
eventsLoader.PluginLoaded += OnEventLoaded;
|
||||||
|
|
||||||
|
Commands = commandsLoader.Load();
|
||||||
|
Events = eventsLoader.Load();
|
||||||
|
|
||||||
var loader = new Loader("./Data/Plugins", "dll");
|
|
||||||
loader.FileLoaded += args => Config.Logger.Log($"{args.PluginName} file Loaded", source: typeof(PluginLoader), type: LogType.INFO);
|
|
||||||
loader.PluginLoaded += Loader_PluginLoaded;
|
|
||||||
var res = loader.Load();
|
|
||||||
Events = res.Item1;
|
|
||||||
Commands = res.Item2;
|
|
||||||
SlashCommands = res.Item3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void Loader_PluginLoaded(LoaderArgs args)
|
private void EventFileLoaded(LoaderArgs e)
|
||||||
{
|
{
|
||||||
switch (args.TypeName)
|
if (!e.IsLoaded)
|
||||||
{
|
{
|
||||||
case "DBCommand":
|
Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !");
|
||||||
onCMDLoad?.Invoke(((DBCommand)args.Plugin!).Command, args.TypeName!, args.IsLoaded, args.Exception);
|
|
||||||
break;
|
|
||||||
case "DBEvent":
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (args.IsLoaded)
|
|
||||||
((DBEvent)args.Plugin!).Start(_client);
|
|
||||||
|
|
||||||
onEVELoad?.Invoke(((DBEvent)args.Plugin!).Name, args.TypeName!, args.IsLoaded, args.Exception);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Config.Logger.Log(ex.Message, source: typeof(PluginLoader), type: LogType.ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case "DBSlashCommand":
|
|
||||||
if (args.IsLoaded)
|
|
||||||
{
|
|
||||||
var slash = (DBSlashCommand)args.Plugin;
|
|
||||||
var builder = new SlashCommandBuilder();
|
|
||||||
builder.WithName(slash.Name);
|
|
||||||
builder.WithDescription(slash.Description);
|
|
||||||
builder.WithDMPermission(slash.canUseDM);
|
|
||||||
builder.Options = slash.Options;
|
|
||||||
|
|
||||||
onSLSHLoad?.Invoke(((DBSlashCommand)args.Plugin!).Name, args.TypeName, args.IsLoaded,
|
|
||||||
args.Exception);
|
|
||||||
await _client.CreateGlobalApplicationCommandAsync(builder.Build());
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task LoadPluginFromAssembly(Assembly asmb, DiscordSocketClient client)
|
private void OnCommandFileLoaded(LoaderArgs e)
|
||||||
{
|
{
|
||||||
var types = asmb.GetTypes();
|
if (!e.IsLoaded)
|
||||||
foreach (var type in types)
|
{
|
||||||
try
|
Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !");
|
||||||
{
|
}
|
||||||
if (type.IsClass && typeof(DBEvent).IsAssignableFrom(type))
|
}
|
||||||
{
|
|
||||||
var instance = (DBEvent)Activator.CreateInstance(type);
|
|
||||||
instance.Start(client);
|
|
||||||
Events.Add(instance);
|
|
||||||
Config.Logger.Log($"[EVENT] Loaded external {type.FullName}!", source: typeof(PluginLoader));
|
|
||||||
}
|
|
||||||
else if (type.IsClass && typeof(DBCommand).IsAssignableFrom(type))
|
|
||||||
{
|
|
||||||
var instance = (DBCommand)Activator.CreateInstance(type);
|
|
||||||
Commands.Add(instance);
|
|
||||||
Config.Logger.Log($"[CMD] Instance: {type.FullName} loaded !", source: typeof(PluginLoader));
|
|
||||||
}
|
|
||||||
else if (type.IsClass && typeof(DBSlashCommand).IsAssignableFrom(type))
|
|
||||||
{
|
|
||||||
var instance = (DBSlashCommand)Activator.CreateInstance(type);
|
|
||||||
var builder = new SlashCommandBuilder();
|
|
||||||
builder.WithName(instance.Name);
|
|
||||||
builder.WithDescription(instance.Description);
|
|
||||||
builder.WithDMPermission(instance.canUseDM);
|
|
||||||
builder.Options = instance.Options;
|
|
||||||
|
|
||||||
await client.CreateGlobalApplicationCommandAsync(builder.Build());
|
private void OnEventLoaded(LoaderArgs e)
|
||||||
SlashCommands.Add(instance);
|
{
|
||||||
Config.Logger.Log($"[SLASH] Instance: {type.FullName} loaded !", source: typeof(PluginLoader));
|
try
|
||||||
}
|
{
|
||||||
}
|
if (e.IsLoaded)
|
||||||
catch (Exception ex)
|
((DBEvent)e.Plugin!).Start(_client);
|
||||||
{
|
|
||||||
//Console.WriteLine(ex.Message);
|
onEVELoad?.Invoke(((DBEvent)e.Plugin!).name, e.TypeName!, e.IsLoaded, e.Exception);
|
||||||
Config.Logger.Log(ex.Message, source: typeof(PluginLoader), type: LogType.ERROR);
|
}
|
||||||
}
|
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)
|
||||||
|
{
|
||||||
|
onCMDLoad?.Invoke(((DBCommand)e.Plugin!).Command, e.TypeName!, e.IsLoaded, e.Exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,72 +1,67 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Online.Helpers;
|
namespace PluginManager.Online.Helpers
|
||||||
|
|
||||||
internal static class OnlineFunctions
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
internal static class OnlineFunctions
|
||||||
/// Downloads a <see cref="Stream" /> and saves it to another <see cref="Stream" />.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="client">The <see cref="HttpClient" /> that is used to download the file</param>
|
|
||||||
/// <param name="url">The url to the file</param>
|
|
||||||
/// <param name="destination">The <see cref="Stream" /> to save the downloaded data</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>
|
|
||||||
/// <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)
|
|
||||||
{
|
{
|
||||||
using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation))
|
/// <summary>
|
||||||
|
/// Downloads a <see cref="Stream"/> and saves it to another <see cref="Stream"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="client">The <see cref="HttpClient"/> that is used to download the file</param>
|
||||||
|
/// <param name="url">The url to the file</param>
|
||||||
|
/// <param name="destination">The <see cref="Stream"/> to save the downloaded data</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>
|
||||||
|
/// <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)
|
||||||
{
|
{
|
||||||
var contentLength = response.Content.Headers.ContentLength;
|
using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation))
|
||||||
|
|
||||||
using (var download = await response.Content.ReadAsStreamAsync(cancellation))
|
|
||||||
{
|
{
|
||||||
// Ignore progress reporting when no progress reporter was
|
var contentLength = response.Content.Headers.ContentLength;
|
||||||
// passed or when the content length is unknown
|
|
||||||
if (progress == null || !contentLength.HasValue)
|
using (var download = await response.Content.ReadAsStreamAsync(cancellation))
|
||||||
{
|
{
|
||||||
await download.CopyToAsync(destination, cancellation);
|
// Ignore progress reporting when no progress reporter was
|
||||||
if(!contentLength.HasValue)
|
// passed or when the content length is unknown
|
||||||
progress?.Report(100f);
|
if (progress == null || !contentLength.HasValue)
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert absolute progress (bytes downloaded) into relative progress (0% - 100%)
|
|
||||||
// total ... 100%
|
|
||||||
// downloaded ... x%
|
|
||||||
// x = downloaded * 100 / total => x = downloaded / total * 100
|
|
||||||
var relativeProgress = new Progress<long>(totalBytesDownloaded =>
|
|
||||||
{
|
{
|
||||||
progress?.Report(totalBytesDownloaded / (float)contentLength.Value * 100);
|
await download.CopyToAsync(destination, cancellation);
|
||||||
downloadedBytes?.Report(totalBytesDownloaded);
|
return;
|
||||||
}
|
}
|
||||||
);
|
|
||||||
|
|
||||||
// Use extension method to report progress while downloading
|
// Convert absolute progress (bytes downloaded) into relative progress (0% - 100%)
|
||||||
await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation);
|
var relativeProgress = new Progress<long>(totalBytes =>
|
||||||
progress.Report(100f);
|
{
|
||||||
|
progress.Report((float)totalBytes / contentLength.Value * 100);
|
||||||
|
downloadedBytes?.Report(totalBytes);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Use extension method to report progress while downloading
|
||||||
|
await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation);
|
||||||
|
progress.Report(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Read contents of a file as string from specified URL
|
/// Read contents of a file as string from specified URL
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="url">The URL to read from</param>
|
/// <param name="url">The URL to read from</param>
|
||||||
/// <param name="cancellation">The cancellation token</param>
|
/// <param name="cancellation">The cancellation token</param>
|
||||||
/// <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, cancellation);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,117 +1,91 @@
|
|||||||
using System;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Online.Helpers;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
public class VersionString
|
namespace PluginManager.Online.Helpers
|
||||||
{
|
{
|
||||||
public int PackageCheckVersion;
|
public class VersionString
|
||||||
public int PackageMainVersion;
|
|
||||||
public int PackageVersionID;
|
|
||||||
|
|
||||||
public VersionString(string version)
|
|
||||||
{
|
{
|
||||||
var data = version.Split('.');
|
public int PackageVersionID;
|
||||||
try
|
public int PackageMainVersion;
|
||||||
|
public int PackageCheckVersion;
|
||||||
|
|
||||||
|
public VersionString(string version)
|
||||||
{
|
{
|
||||||
if (data.Length == 3)
|
string[] data = version.Split('.');
|
||||||
|
try
|
||||||
{
|
{
|
||||||
PackageVersionID = int.Parse(data[0]);
|
PackageVersionID = int.Parse(data[0]);
|
||||||
PackageMainVersion = int.Parse(data[1]);
|
PackageMainVersion = int.Parse(data[1]);
|
||||||
PackageCheckVersion = int.Parse(data[2]);
|
PackageCheckVersion = int.Parse(data[2]);
|
||||||
}
|
}
|
||||||
else if (data.Length == 4)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// ignore the first item data[0]
|
throw new Exception("Failed to write Version", ex);
|
||||||
PackageVersionID = int.Parse(data[1]);
|
|
||||||
PackageMainVersion = int.Parse(data[2]);
|
|
||||||
PackageCheckVersion = int.Parse(data[3]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception("Invalid version string");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
|
|
||||||
|
|
||||||
|
#region operators
|
||||||
|
public static bool operator >(VersionString s1, VersionString s2)
|
||||||
{
|
{
|
||||||
Console.WriteLine(version);
|
if (s1.PackageVersionID > s2.PackageVersionID) return true;
|
||||||
throw new Exception("Failed to write Version", ex);
|
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;
|
||||||
|
|
||||||
private bool Equals(VersionString other)
|
public static bool operator ==(VersionString s1, VersionString s2)
|
||||||
{
|
|
||||||
return PackageCheckVersion == other.PackageCheckVersion && PackageMainVersion == other.PackageMainVersion &&
|
|
||||||
PackageVersionID == other.PackageVersionID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Equals(object? obj)
|
|
||||||
{
|
|
||||||
if (ReferenceEquals(null, obj)) return false;
|
|
||||||
if (ReferenceEquals(this, obj)) return true;
|
|
||||||
if (obj.GetType() != GetType()) return false;
|
|
||||||
return Equals((VersionString)obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int GetHashCode()
|
|
||||||
{
|
|
||||||
return HashCode.Combine(PackageCheckVersion, PackageMainVersion, PackageVersionID);
|
|
||||||
}
|
|
||||||
|
|
||||||
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}";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#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.PackageVersionID == s2.PackageVersionID && s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion == s2.PackageCheckVersion) return true;
|
||||||
if (s1.PackageMainVersion == s2.PackageMainVersion &&
|
return false;
|
||||||
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)
|
public static bool operator <=(VersionString s1, VersionString s2) => (s1 < s2 || s1 == s2);
|
||||||
{
|
public static bool operator >=(VersionString s1, VersionString s2) => (s1 > s2 || s1 == s2);
|
||||||
return !(s1 > s2) && s1 != s2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool operator ==(VersionString s1, VersionString s2)
|
#endregion
|
||||||
{
|
|
||||||
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)
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return !(s1 == s2);
|
return "{PackageID: " + PackageVersionID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool operator <=(VersionString s1, VersionString s2)
|
public string ToShortString()
|
||||||
{
|
{
|
||||||
return s1 < s2 || s1 == s2;
|
if (PackageVersionID == 0 && PackageCheckVersion == 0 && PackageMainVersion == 0)
|
||||||
}
|
return "Unknown";
|
||||||
|
return $"{PackageVersionID}.{PackageMainVersion}.{PackageCheckVersion}";
|
||||||
|
}
|
||||||
|
|
||||||
public static bool operator >=(VersionString s1, VersionString s2)
|
public static VersionString? GetVersionOfPackage(string pakName)
|
||||||
{
|
{
|
||||||
return s1 > s2 || s1 == s2;
|
if (!Config.PluginVersionsContainsKey(pakName))
|
||||||
}
|
return null;
|
||||||
|
return new VersionString(Config.GetPluginVersion(pakName));
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
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,8 +1,10 @@
|
|||||||
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.Online.Helpers;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
using OperatingSystem = PluginManager.Others.OperatingSystem;
|
using OperatingSystem = PluginManager.Others.OperatingSystem;
|
||||||
|
|
||||||
namespace PluginManager.Online;
|
namespace PluginManager.Online;
|
||||||
@@ -12,21 +14,10 @@ public class PluginsManager
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The Plugin Manager constructor
|
/// The Plugin Manager constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="plink">The link to the file where all plugins are stored</param>
|
/// <param name="link">The link to the file where all plugins are stored</param>
|
||||||
/// <param name="vlink">The link to the file where all plugin versions are stored</param>
|
public PluginsManager(string link)
|
||||||
public PluginsManager(string plink, string vlink)
|
|
||||||
{
|
{
|
||||||
PluginsLink = plink;
|
PluginsLink = link;
|
||||||
VersionsLink = vlink;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The default Plugin Manager constructor. It uses the default links.
|
|
||||||
/// </summary>
|
|
||||||
public PluginsManager()
|
|
||||||
{
|
|
||||||
PluginsLink = "https://raw.githubusercontent.com/andreitdr/SethPlugins/releases/PluginsList";
|
|
||||||
VersionsLink = "https://raw.githubusercontent.com/andreitdr/SethPlugins/releases/Versions";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -34,30 +25,31 @@ public class PluginsManager
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string PluginsLink { get; }
|
public string PluginsLink { get; }
|
||||||
|
|
||||||
public string VersionsLink { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The method to load all plugins
|
/// The method to load all plugins
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<List<string[]>> GetAvailablePlugins()
|
public async Task ListAvailablePlugins()
|
||||||
{
|
{
|
||||||
// Config.Logger.Log("Got data from " + VersionsLink, this, LogLevel.INFO);
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var list = await ServerCom.ReadTextFromURL(PluginsLink);
|
var list = await ServerCom.ReadTextFromURL(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" };
|
||||||
|
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||||
|
data.Add(titles);
|
||||||
|
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[4]; // 4 columns
|
var display = new string[titles.Length];
|
||||||
if (op == OperatingSystem.WINDOWS)
|
if (op == OperatingSystem.WINDOWS)
|
||||||
{
|
{
|
||||||
if (content[4].Contains("Windows"))
|
if (content[4].Contains("Windows"))
|
||||||
@@ -65,9 +57,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] =
|
display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString();
|
||||||
(await GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0"))
|
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
||||||
.ToShortString();
|
display[4] = "✓";
|
||||||
|
else
|
||||||
|
display[4] = "X";
|
||||||
data.Add(display);
|
data.Add(display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,40 +72,25 @@ 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] =
|
display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString();
|
||||||
(await GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0"))
|
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
||||||
.ToShortString();
|
display[4] = "✓";
|
||||||
|
else
|
||||||
|
display[4] = "X";
|
||||||
data.Add(display);
|
data.Add(display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return data;
|
|
||||||
|
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||||
|
|
||||||
|
Console_Utilities.FormatAndAlignTable(data, TableFormat.CENTER_EACH_COLUMN_BASED);
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
Config.Logger.Log(message: "Failed to execute command: listplugs\nReason: " + exception.Message, source: typeof(PluginsManager), type: LogType.ERROR );
|
Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message);
|
||||||
|
Functions.WriteErrFile(exception.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<VersionString?> GetVersionOfPackageFromWeb(string pakName)
|
|
||||||
{
|
|
||||||
var data = await ServerCom.ReadTextFromURL(VersionsLink);
|
|
||||||
foreach (var item in data)
|
|
||||||
{
|
|
||||||
if (item.StartsWith("#"))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var split = item.Split(',');
|
|
||||||
if (split[0] == pakName)
|
|
||||||
{
|
|
||||||
// Config.Logger.Log("Searched for " + pakName + " and found " + split[1] + " as version.", LogLevel.INFO);
|
|
||||||
return new VersionString(split[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -123,13 +102,13 @@ public class PluginsManager
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var list = await ServerCom.ReadTextFromURL(PluginsLink);
|
var list = await ServerCom.ReadTextFromURL(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++)
|
||||||
{
|
{
|
||||||
var contents = lines[i].Split(',');
|
var contents = lines[i].Split(',');
|
||||||
if (contents[0].ToLowerInvariant() == name.ToLowerInvariant())
|
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] };
|
||||||
@@ -141,9 +120,10 @@ public class PluginsManager
|
|||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
Config.Logger.Log("Failed to execute command: plugin list\nReason: " + exception.Message, source: typeof(PluginsManager), type: LogType.ERROR);
|
Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message);
|
||||||
|
Functions.WriteErrFile(exception.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return new string[] { null!, null!, null! };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,52 +1,83 @@
|
|||||||
using System;
|
using PluginManager.Online.Helpers;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using PluginManager.Online.Helpers;
|
using PluginManager.Others;
|
||||||
|
|
||||||
namespace PluginManager.Online;
|
namespace PluginManager.Online
|
||||||
|
|
||||||
public static class ServerCom
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
public static class ServerCom
|
||||||
/// Read all lines from a file async
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="link">The link of the file</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static async Task<List<string>> ReadTextFromURL(string link)
|
|
||||||
{
|
{
|
||||||
var response = await OnlineFunctions.DownloadStringAsync(link);
|
/// <summary>
|
||||||
var lines = response.Split('\n');
|
/// Read all lines from a file async
|
||||||
return lines.ToList();
|
/// </summary>
|
||||||
}
|
/// <param name="link">The link of the file</param>
|
||||||
|
/// <returns></returns>
|
||||||
/// <summary>
|
public static async Task<List<string>> ReadTextFromURL(string link)
|
||||||
/// Download file from url
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="URL">The url to the file</param>
|
|
||||||
/// <param name="location">The location where to store the downloaded data</param>
|
|
||||||
/// <param name="progress">The <see cref="IProgress{T}" /> to track the download</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static async Task DownloadFileAsync(
|
|
||||||
string URL, string location, IProgress<float> progress,
|
|
||||||
IProgress<long>? downloadedBytes)
|
|
||||||
{
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
{
|
||||||
client.Timeout = TimeSpan.FromMinutes(5);
|
string response = await OnlineFunctions.DownloadStringAsync(link);
|
||||||
|
string[] lines = response.Split('\n');
|
||||||
|
return lines.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
using (var file = new FileStream(location, FileMode.Create, FileAccess.Write, FileShare.None))
|
/// <summary>
|
||||||
|
/// Download file from url
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="URL">The url to the file</param>
|
||||||
|
/// <param name="location">The location where to store the downloaded data</param>
|
||||||
|
/// <param name="progress">The <see cref="IProgress{T}"/> to track the download</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static async Task DownloadFileAsync(string URL, string location, IProgress<float> progress, IProgress<long>? downloadedBytes = null)
|
||||||
|
{
|
||||||
|
using (var client = new System.Net.Http.HttpClient())
|
||||||
{
|
{
|
||||||
await client.DownloadFileAsync(URL, file, progress, downloadedBytes);
|
client.Timeout = TimeSpan.FromMinutes(5);
|
||||||
|
|
||||||
|
using (var file = new FileStream(location, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||||
|
{
|
||||||
|
await client.DownloadFileAsync(URL, file, progress, downloadedBytes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task DownloadFileAsync(string URl, string location, IProgress<float> progress)
|
/// <summary>
|
||||||
{
|
/// Download file from url
|
||||||
await DownloadFileAsync(URl, location, progress, null);
|
/// </summary>
|
||||||
|
/// <param name="URL">The url to the file</param>
|
||||||
|
/// <param name="location">The location where to store the downloaded data</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static async Task DownloadFileAsync(string URL, string location)
|
||||||
|
{
|
||||||
|
bool isDownloading = true;
|
||||||
|
float c_progress = 0;
|
||||||
|
|
||||||
|
Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, NoColor = true };
|
||||||
|
|
||||||
|
IProgress<float> progress = new Progress<float>(percent => { c_progress = percent; });
|
||||||
|
|
||||||
|
|
||||||
|
Task updateProgressBarTask = new Task(() =>
|
||||||
|
{
|
||||||
|
while (isDownloading)
|
||||||
|
{
|
||||||
|
pbar.Update(c_progress);
|
||||||
|
if (c_progress == 100f)
|
||||||
|
break;
|
||||||
|
Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
new Thread(updateProgressBarTask.Start).Start();
|
||||||
|
await DownloadFileAsync(URL, location, progress);
|
||||||
|
|
||||||
|
|
||||||
|
c_progress = pbar.Max;
|
||||||
|
pbar.Update(100f);
|
||||||
|
isDownloading = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
51
PluginManager/Online/Updates/PluginUpdater.cs
Normal file
51
PluginManager/Online/Updates/PluginUpdater.cs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
36
PluginManager/Online/Updates/Update.cs
Normal file
36
PluginManager/Online/Updates/Update.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
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()}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user