Compare commits
92 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 28fff8db8a | |||
| fa15bc2333 | |||
| 113c64279f | |||
| 81cc6709d6 | |||
| 571c0a5360 | |||
|
|
eefdea2de9 | ||
| f7e6b0a398 | |||
| 68a83b052a | |||
| d689eee7fa | |||
| f6442af30c | |||
| b98f57fcf8 | |||
| 77aad985fa | |||
|
|
f8ebf76f92 | ||
| 6da9828e5c | |||
| 3ba45790e7 | |||
| e440e97948 | |||
|
|
938c73c810 | ||
| a8520c8c96 | |||
| debdc58646 | |||
| 8b36c086ef | |||
| 1f5e5d0611 | |||
| bbc1c601c9 | |||
| 5ab3195956 | |||
| 1f1983480a | |||
| 2fcd86cf12 | |||
| 2c83d00c00 | |||
|
|
ccac0ca6d0 | ||
| 4c9c7410f0 | |||
| eef13db3aa | |||
| 27bbe899ab | |||
| 79002de9a5 | |||
| 17f68a8e5e | |||
| c415fa1c0c | |||
| b8ec6f42df | |||
| 3f67d7f3f9 | |||
| 2dae8a3a63 | |||
| 47aae730c7 | |||
| aa808e950a | |||
| 7dd43b7841 | |||
| 82a3744d48 | |||
| 3839e4d838 | |||
| a66ebc43d9 | |||
| 45bbda8185 | |||
| 2db6bf2729 | |||
| 3097eb7fca | |||
| efb6ac5192 | |||
| 27fe615447 | |||
| c40fcdac9d | |||
| c674c76bd0 | |||
| 1292e0f585 | |||
| 3abb4cdda7 | |||
| c6e8976456 | |||
| 19115a837c | |||
| 0a200abec6 | |||
| c80fe33e6d | |||
|
|
edc5cb97ba | ||
| 059228ca52 | |||
| 861b83cda2 | |||
| 97888626b6 | |||
| 781bb489bd | |||
| 1712205222 | |||
| 51324f6dca | |||
| 531edcd3cc | |||
| c66ff52d94 | |||
|
|
195c082cd7 | ||
| 16005ef30d | |||
| c15f7b4874 | |||
| fd28a166f7 | |||
| 4fbea983da | |||
| 690b7fe5f1 | |||
| e88d654da1 | |||
| 0b6b57cc84 | |||
| 8fcd33e734 | |||
| 0d524cdf65 | |||
| ab6f14e74c | |||
| 3e01e75de3 | |||
| 1ae48a100e | |||
| 4855c8495d | |||
| f8de1536b2 | |||
| c1d0155867 | |||
| a9ce01e7c9 | |||
| e6692e4263 | |||
| 16c06c8319 | |||
| 363c85d0b3 | |||
| 760a840cc7 | |||
| 0160b011dd | |||
| 6e09fa9738 | |||
| c7ae9202e6 | |||
|
|
55ac4e2b52 | ||
| 96b681bbda | |||
| 9f656d5f3f | |||
| c719eaf4fd |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -362,3 +362,9 @@ MigrationBackup/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
*.txt
|
||||
|
||||
#folders
|
||||
/Plugins/
|
||||
/DiscordBot.rar
|
||||
|
||||
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/net5.0/DiscordBot.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/DiscordBot",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Attach",
|
||||
"type": "coreclr",
|
||||
"request": "attach"
|
||||
}
|
||||
]
|
||||
}
|
||||
5
.vscode/solution-explorer/class.cs-template
vendored
5
.vscode/solution-explorer/class.cs-template
vendored
@@ -1,5 +0,0 @@
|
||||
namespace {{namespace}};
|
||||
|
||||
public class {{name}}
|
||||
{
|
||||
}
|
||||
3
.vscode/solution-explorer/class.ts-template
vendored
3
.vscode/solution-explorer/class.ts-template
vendored
@@ -1,3 +0,0 @@
|
||||
export class {{name}} {
|
||||
|
||||
}
|
||||
9
.vscode/solution-explorer/class.vb-template
vendored
9
.vscode/solution-explorer/class.vb-template
vendored
@@ -1,9 +0,0 @@
|
||||
Imports System
|
||||
|
||||
Namespace {{namespace}}
|
||||
|
||||
Public Class {{name}}
|
||||
|
||||
End Class
|
||||
|
||||
End Namespace
|
||||
@@ -1,3 +0,0 @@
|
||||
export default {{name}} {
|
||||
|
||||
}
|
||||
5
.vscode/solution-explorer/enum.cs-template
vendored
5
.vscode/solution-explorer/enum.cs-template
vendored
@@ -1,5 +0,0 @@
|
||||
namespace {{namespace}};
|
||||
|
||||
public enum {{name}}
|
||||
{
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
namespace {{namespace}};
|
||||
|
||||
public interface {{name}}
|
||||
{
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export interface {{name}} {
|
||||
|
||||
}
|
||||
46
.vscode/solution-explorer/template-list.json
vendored
46
.vscode/solution-explorer/template-list.json
vendored
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"templates": [
|
||||
{
|
||||
"name": "Class",
|
||||
"extension": "cs",
|
||||
"file": "./class.cs-template",
|
||||
"parameters": "./template-parameters.js"
|
||||
},
|
||||
{
|
||||
"name": "Interface",
|
||||
"extension": "cs",
|
||||
"file": "./interface.cs-template",
|
||||
"parameters": "./template-parameters.js"
|
||||
},
|
||||
{
|
||||
"name": "Enum",
|
||||
"extension": "cs",
|
||||
"file": "./enum.cs-template",
|
||||
"parameters": "./template-parameters.js"
|
||||
},
|
||||
{
|
||||
"name": "Class",
|
||||
"extension": "ts",
|
||||
"file": "./class.ts-template",
|
||||
"parameters": "./template-parameters.js"
|
||||
},
|
||||
{
|
||||
"name": "Interface",
|
||||
"extension": "ts",
|
||||
"file": "./interface.ts-template",
|
||||
"parameters": "./template-parameters.js"
|
||||
},
|
||||
{
|
||||
"name": "Default",
|
||||
"extension": "ts",
|
||||
"file": "./default.ts-template",
|
||||
"parameters": "./template-parameters.js"
|
||||
},
|
||||
{
|
||||
"name": "Class",
|
||||
"extension": "vb",
|
||||
"file": "./class.vb-template",
|
||||
"parameters": "./template-parameters.js"
|
||||
}
|
||||
]
|
||||
}
|
||||
17
.vscode/solution-explorer/template-parameters.js
vendored
17
.vscode/solution-explorer/template-parameters.js
vendored
@@ -1,17 +0,0 @@
|
||||
var path = require("path");
|
||||
|
||||
module.exports = function(filename, projectPath, folderPath) {
|
||||
var namespace = "Unknown";
|
||||
if (projectPath) {
|
||||
namespace = path.basename(projectPath, path.extname(projectPath));
|
||||
if (folderPath) {
|
||||
namespace += "." + folderPath.replace(path.dirname(projectPath), "").substring(1).replace(/[\\\/]/g, ".");
|
||||
}
|
||||
namespace = namespace.replace(/[\\\-]/g, "_");
|
||||
}
|
||||
|
||||
return {
|
||||
namespace: namespace,
|
||||
name: path.basename(filename, path.extname(filename))
|
||||
}
|
||||
};
|
||||
42
.vscode/tasks.json
vendored
42
.vscode/tasks.json
vendored
@@ -1,42 +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",
|
||||
"${workspaceFolder}/DiscordBot/DiscordBot.csproj",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v6.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v6.0": {
|
||||
"CMD_LevelingSystem/1.0.0": {
|
||||
"dependencies": {
|
||||
"PluginManager": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"CMD_LevelingSystem.dll": {}
|
||||
}
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Commands": "3.6.1",
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Interactions": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"Discord.Net.Webhook": "3.6.1"
|
||||
}
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Commands.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Rest.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Webhook.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.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.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"PluginManager.dll": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"CMD_LevelingSystem/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-TfcL/HG57fVt//WVJ2XyF2PlytY9IYkkwwkPLIhvu5FW4wf9rm7+N8RPh4qtELLfsa5ES0FK2RbgYjABRR9AjA==",
|
||||
"path": "discord.net/3.6.1",
|
||||
"hashPath": "discord.net.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-kK7m571yzSzPd93o+n8Z+TfvX62BT1HtOEZIWXKwXWO8itP/sgqBNExjWK/6DOpkbD6+khc2f3rp+TA0rJD88g==",
|
||||
"path": "discord.net.commands/3.6.1",
|
||||
"hashPath": "discord.net.commands.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ibVjQiWzgqh0GyP/GXE2kv3TA/9ysmmNFG/WmRE7GepQQAXXGxVUO9IMJ8h14EvIXMQ0m0DktMe5DkUnilo3Ag==",
|
||||
"path": "discord.net.core/3.6.1",
|
||||
"hashPath": "discord.net.core.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-WGOxz6SMUu4WS5b/JdrhlwQletcplBIYqvjFBBDfnqE+uNJqcNGtAdyjLqIILfXGx8aSSSSYZSCeAUa7FZ8Yew==",
|
||||
"path": "discord.net.interactions/3.6.1",
|
||||
"hashPath": "discord.net.interactions.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-T7RRThIS23roFEJwTL1l7aawjVyn7ZB5yH3tMge0d6TiCzzp4V4FAZ+ArTt19LHRFhPly90v8V3sWqmTMN+5Zg==",
|
||||
"path": "discord.net.rest/3.6.1",
|
||||
"hashPath": "discord.net.rest.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-xikKHIGAIMz0BzHkaTKb48DNpFjKW8mvJjLJSezJ1xQOu+laHNk/hav4qxVtyZz7HSI/vGTkmlq9hKVhWzpaUA==",
|
||||
"path": "discord.net.webhook/3.6.1",
|
||||
"hashPath": "discord.net.webhook.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-hF22Xy7URlVEDQZ69INOgzPvFUsIDfd+r6U+1yF9HWdBn3d4THnvAAhkv1TraSx/T/MKS7g+jvk/HZ3mh5S3aw==",
|
||||
"path": "discord.net.websocket/3.6.1",
|
||||
"hashPath": "discord.net.websocket.3.6.1.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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"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.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Commands": "3.6.1",
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Interactions": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"Discord.Net.Webhook": "3.6.1"
|
||||
}
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Commands.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Rest.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Webhook.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.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.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"PluginManager.dll": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"CMD_Utils/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-TfcL/HG57fVt//WVJ2XyF2PlytY9IYkkwwkPLIhvu5FW4wf9rm7+N8RPh4qtELLfsa5ES0FK2RbgYjABRR9AjA==",
|
||||
"path": "discord.net/3.6.1",
|
||||
"hashPath": "discord.net.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-kK7m571yzSzPd93o+n8Z+TfvX62BT1HtOEZIWXKwXWO8itP/sgqBNExjWK/6DOpkbD6+khc2f3rp+TA0rJD88g==",
|
||||
"path": "discord.net.commands/3.6.1",
|
||||
"hashPath": "discord.net.commands.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ibVjQiWzgqh0GyP/GXE2kv3TA/9ysmmNFG/WmRE7GepQQAXXGxVUO9IMJ8h14EvIXMQ0m0DktMe5DkUnilo3Ag==",
|
||||
"path": "discord.net.core/3.6.1",
|
||||
"hashPath": "discord.net.core.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-WGOxz6SMUu4WS5b/JdrhlwQletcplBIYqvjFBBDfnqE+uNJqcNGtAdyjLqIILfXGx8aSSSSYZSCeAUa7FZ8Yew==",
|
||||
"path": "discord.net.interactions/3.6.1",
|
||||
"hashPath": "discord.net.interactions.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-T7RRThIS23roFEJwTL1l7aawjVyn7ZB5yH3tMge0d6TiCzzp4V4FAZ+ArTt19LHRFhPly90v8V3sWqmTMN+5Zg==",
|
||||
"path": "discord.net.rest/3.6.1",
|
||||
"hashPath": "discord.net.rest.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-xikKHIGAIMz0BzHkaTKb48DNpFjKW8mvJjLJSezJ1xQOu+laHNk/hav4qxVtyZz7HSI/vGTkmlq9hKVhWzpaUA==",
|
||||
"path": "discord.net.webhook/3.6.1",
|
||||
"hashPath": "discord.net.webhook.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-hF22Xy7URlVEDQZ69INOgzPvFUsIDfd+r6U+1yF9HWdBn3d4THnvAAhkv1TraSx/T/MKS7g+jvk/HZ3mh5S3aw==",
|
||||
"path": "discord.net.websocket/3.6.1",
|
||||
"hashPath": "discord.net.websocket.3.6.1.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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v6.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v6.0": {
|
||||
"EVE_LevelingSystem/1.0.0": {
|
||||
"dependencies": {
|
||||
"PluginManager": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"EVE_LevelingSystem.dll": {}
|
||||
}
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Commands": "3.6.1",
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Interactions": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"Discord.Net.Webhook": "3.6.1"
|
||||
}
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Commands.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Rest.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Webhook.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.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.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"PluginManager.dll": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"EVE_LevelingSystem/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-TfcL/HG57fVt//WVJ2XyF2PlytY9IYkkwwkPLIhvu5FW4wf9rm7+N8RPh4qtELLfsa5ES0FK2RbgYjABRR9AjA==",
|
||||
"path": "discord.net/3.6.1",
|
||||
"hashPath": "discord.net.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-kK7m571yzSzPd93o+n8Z+TfvX62BT1HtOEZIWXKwXWO8itP/sgqBNExjWK/6DOpkbD6+khc2f3rp+TA0rJD88g==",
|
||||
"path": "discord.net.commands/3.6.1",
|
||||
"hashPath": "discord.net.commands.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ibVjQiWzgqh0GyP/GXE2kv3TA/9ysmmNFG/WmRE7GepQQAXXGxVUO9IMJ8h14EvIXMQ0m0DktMe5DkUnilo3Ag==",
|
||||
"path": "discord.net.core/3.6.1",
|
||||
"hashPath": "discord.net.core.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-WGOxz6SMUu4WS5b/JdrhlwQletcplBIYqvjFBBDfnqE+uNJqcNGtAdyjLqIILfXGx8aSSSSYZSCeAUa7FZ8Yew==",
|
||||
"path": "discord.net.interactions/3.6.1",
|
||||
"hashPath": "discord.net.interactions.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-T7RRThIS23roFEJwTL1l7aawjVyn7ZB5yH3tMge0d6TiCzzp4V4FAZ+ArTt19LHRFhPly90v8V3sWqmTMN+5Zg==",
|
||||
"path": "discord.net.rest/3.6.1",
|
||||
"hashPath": "discord.net.rest.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-xikKHIGAIMz0BzHkaTKb48DNpFjKW8mvJjLJSezJ1xQOu+laHNk/hav4qxVtyZz7HSI/vGTkmlq9hKVhWzpaUA==",
|
||||
"path": "discord.net.webhook/3.6.1",
|
||||
"hashPath": "discord.net.webhook.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-hF22Xy7URlVEDQZ69INOgzPvFUsIDfd+r6U+1yF9HWdBn3d4THnvAAhkv1TraSx/T/MKS7g+jvk/HZ3mh5S3aw==",
|
||||
"path": "discord.net.websocket/3.6.1",
|
||||
"hashPath": "discord.net.websocket.3.6.1.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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v6.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v6.0": {
|
||||
"MusicCommands/1.0.0": {
|
||||
"dependencies": {
|
||||
"PluginManager": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"MusicCommands.dll": {}
|
||||
}
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Commands": "3.6.1",
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Interactions": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"Discord.Net.Webhook": "3.6.1"
|
||||
}
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Commands.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Rest.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Webhook.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.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.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"PluginManager.dll": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"MusicCommands/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-TfcL/HG57fVt//WVJ2XyF2PlytY9IYkkwwkPLIhvu5FW4wf9rm7+N8RPh4qtELLfsa5ES0FK2RbgYjABRR9AjA==",
|
||||
"path": "discord.net/3.6.1",
|
||||
"hashPath": "discord.net.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-kK7m571yzSzPd93o+n8Z+TfvX62BT1HtOEZIWXKwXWO8itP/sgqBNExjWK/6DOpkbD6+khc2f3rp+TA0rJD88g==",
|
||||
"path": "discord.net.commands/3.6.1",
|
||||
"hashPath": "discord.net.commands.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ibVjQiWzgqh0GyP/GXE2kv3TA/9ysmmNFG/WmRE7GepQQAXXGxVUO9IMJ8h14EvIXMQ0m0DktMe5DkUnilo3Ag==",
|
||||
"path": "discord.net.core/3.6.1",
|
||||
"hashPath": "discord.net.core.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-WGOxz6SMUu4WS5b/JdrhlwQletcplBIYqvjFBBDfnqE+uNJqcNGtAdyjLqIILfXGx8aSSSSYZSCeAUa7FZ8Yew==",
|
||||
"path": "discord.net.interactions/3.6.1",
|
||||
"hashPath": "discord.net.interactions.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-T7RRThIS23roFEJwTL1l7aawjVyn7ZB5yH3tMge0d6TiCzzp4V4FAZ+ArTt19LHRFhPly90v8V3sWqmTMN+5Zg==",
|
||||
"path": "discord.net.rest/3.6.1",
|
||||
"hashPath": "discord.net.rest.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-xikKHIGAIMz0BzHkaTKb48DNpFjKW8mvJjLJSezJ1xQOu+laHNk/hav4qxVtyZz7HSI/vGTkmlq9hKVhWzpaUA==",
|
||||
"path": "discord.net.webhook/3.6.1",
|
||||
"hashPath": "discord.net.webhook.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-hF22Xy7URlVEDQZ69INOgzPvFUsIDfd+r6U+1yF9HWdBn3d4THnvAAhkv1TraSx/T/MKS7g+jvk/HZ3mh5S3aw==",
|
||||
"path": "discord.net.websocket/3.6.1",
|
||||
"hashPath": "discord.net.websocket.3.6.1.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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v6.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v6.0": {
|
||||
"StartupEvents/1.0.0": {
|
||||
"dependencies": {
|
||||
"PluginManager": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"StartupEvents.dll": {}
|
||||
}
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Commands": "3.6.1",
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Interactions": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"Discord.Net.Webhook": "3.6.1"
|
||||
}
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Commands.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1",
|
||||
"Discord.Net.WebSocket": "3.6.1",
|
||||
"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.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Rest.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.Webhook.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"dependencies": {
|
||||
"Discord.Net.Core": "3.6.1",
|
||||
"Discord.Net.Rest": "3.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
||||
"assemblyVersion": "3.6.1.0",
|
||||
"fileVersion": "3.6.1.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.6.1"
|
||||
},
|
||||
"runtime": {
|
||||
"PluginManager.dll": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"StartupEvents/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Discord.Net/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-TfcL/HG57fVt//WVJ2XyF2PlytY9IYkkwwkPLIhvu5FW4wf9rm7+N8RPh4qtELLfsa5ES0FK2RbgYjABRR9AjA==",
|
||||
"path": "discord.net/3.6.1",
|
||||
"hashPath": "discord.net.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Commands/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-kK7m571yzSzPd93o+n8Z+TfvX62BT1HtOEZIWXKwXWO8itP/sgqBNExjWK/6DOpkbD6+khc2f3rp+TA0rJD88g==",
|
||||
"path": "discord.net.commands/3.6.1",
|
||||
"hashPath": "discord.net.commands.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Core/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ibVjQiWzgqh0GyP/GXE2kv3TA/9ysmmNFG/WmRE7GepQQAXXGxVUO9IMJ8h14EvIXMQ0m0DktMe5DkUnilo3Ag==",
|
||||
"path": "discord.net.core/3.6.1",
|
||||
"hashPath": "discord.net.core.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Interactions/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-WGOxz6SMUu4WS5b/JdrhlwQletcplBIYqvjFBBDfnqE+uNJqcNGtAdyjLqIILfXGx8aSSSSYZSCeAUa7FZ8Yew==",
|
||||
"path": "discord.net.interactions/3.6.1",
|
||||
"hashPath": "discord.net.interactions.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Rest/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-T7RRThIS23roFEJwTL1l7aawjVyn7ZB5yH3tMge0d6TiCzzp4V4FAZ+ArTt19LHRFhPly90v8V3sWqmTMN+5Zg==",
|
||||
"path": "discord.net.rest/3.6.1",
|
||||
"hashPath": "discord.net.rest.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.Webhook/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-xikKHIGAIMz0BzHkaTKb48DNpFjKW8mvJjLJSezJ1xQOu+laHNk/hav4qxVtyZz7HSI/vGTkmlq9hKVhWzpaUA==",
|
||||
"path": "discord.net.webhook/3.6.1",
|
||||
"hashPath": "discord.net.webhook.3.6.1.nupkg.sha512"
|
||||
},
|
||||
"Discord.Net.WebSocket/3.6.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-hF22Xy7URlVEDQZ69INOgzPvFUsIDfd+r6U+1yF9HWdBn3d4THnvAAhkv1TraSx/T/MKS7g+jvk/HZ3mh5S3aw==",
|
||||
"path": "discord.net.websocket/3.6.1",
|
||||
"hashPath": "discord.net.websocket.3.6.1.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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,21 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<OutputPath>..\BUILDS\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<DebugType>none</DebugType>
|
||||
<DebugSymbols>false</DebugSymbols>
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
<WarningsAsErrors />
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,61 +0,0 @@
|
||||
using Discord;
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.LanguageSystem;
|
||||
|
||||
using System;
|
||||
|
||||
|
||||
public class level : DBCommand
|
||||
{
|
||||
public string Command => "rank";
|
||||
|
||||
public string Description => "Display your current level";
|
||||
|
||||
public string Usage => "rank";
|
||||
|
||||
public bool canUseDM => false;
|
||||
|
||||
public bool canUseServer => true;
|
||||
|
||||
public bool requireAdmin => false;
|
||||
|
||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
int cLv = Data.GetLevel(message.Author.Id);
|
||||
Int64 cEXP = Data.GetExp(message.Author.Id);
|
||||
Int64 rEXP = Data.GetReqEXP(message.Author.Id);
|
||||
|
||||
var embed = new EmbedBuilder()
|
||||
{
|
||||
Title = "Leveling System",
|
||||
Description = message.Author.Mention
|
||||
};
|
||||
Random r = new Random();
|
||||
int _r = r.Next(0, 256);
|
||||
int _g = r.Next(0, 256);
|
||||
int _b = r.Next(0, 256);
|
||||
embed.WithColor(new Color(_r, _g, _b));
|
||||
embed.AddField("Level", cLv);
|
||||
embed.AddField("Current EXP", cEXP);
|
||||
embed.AddField("Required Exp to Level up", rEXP);
|
||||
embed.WithCurrentTimestamp();
|
||||
await message.Channel.SendMessageAsync(embed: embed.Build());
|
||||
}
|
||||
catch
|
||||
{
|
||||
if (Language.ActiveLanguage != null)
|
||||
await message.Channel.SendMessageAsync(Language.ActiveLanguage.LanguageWords["DB_COMMAND_RANK_NO_RANK"]);
|
||||
else await message.Channel.SendMessageAsync("You are unranked now. Please type a message in chat that is not a command and try again this command");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public class Core
|
||||
{
|
||||
|
||||
public static Dictionary<ulong, string> playerMessages = new Dictionary<ulong, string>();
|
||||
|
||||
private static readonly string folder = @".\Data\Resources\LevelingSystem\";
|
||||
|
||||
public static int GetLevel(ulong id) => int.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[0].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetExp(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[1].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetReqEXP(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[2].Split('=')[1]);
|
||||
public static void SaveData(ulong id, int lv, Int64 cexp, Int64 rexp)
|
||||
{
|
||||
Directory.CreateDirectory(folder);
|
||||
File.WriteAllText(Path.Combine(folder, id.ToString() + ".data"), $"Level={lv},EXP={cexp},REXP={rexp}");
|
||||
}
|
||||
private static Int64 NextLevelXP(int level)
|
||||
{
|
||||
return (level * level) + 2 * level + 75;
|
||||
}
|
||||
|
||||
public static (bool, int) MessageSent(ulong id, int messageLength)
|
||||
{
|
||||
WaitForTimeToRemoveFromList(id, 60);
|
||||
|
||||
if (!File.Exists(Path.Combine(folder, id.ToString() + ".data")))
|
||||
{
|
||||
SaveData(id, 0, 0, 0);
|
||||
}
|
||||
Int64 cEXp = GetExp(id);
|
||||
Int64 rExp = GetReqEXP(id);
|
||||
int random = new System.Random().Next(3, 6) + messageLength;
|
||||
cEXp += random;
|
||||
if (cEXp >= rExp)
|
||||
{
|
||||
cEXp = cEXp - rExp;
|
||||
int lv = GetLevel(id);
|
||||
rExp = NextLevelXP(lv);
|
||||
lv++;
|
||||
SaveData(id, lv, cEXp, rExp);
|
||||
return (true, lv);
|
||||
}
|
||||
|
||||
SaveData(id, GetLevel(id), cEXp, rExp);
|
||||
return (false, -1);
|
||||
}
|
||||
|
||||
public static async void WaitForTimeToRemoveFromList(ulong id, int time_seconds)
|
||||
{
|
||||
await Task.Delay(time_seconds * 1000);
|
||||
playerMessages.Remove(id);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using Discord.WebSocket;
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
public static class Data
|
||||
{
|
||||
private static readonly string folder = @".\Data\Resources\LevelingSystem\";
|
||||
public static void registerPlayer(SocketGuildUser user)
|
||||
{
|
||||
ulong id = user.Id;
|
||||
Directory.CreateDirectory(folder);
|
||||
File.WriteAllText(Path.Combine(folder, id.ToString() + ".data"), "Level=0,EXP=0,REXP=100");
|
||||
}
|
||||
|
||||
public static int GetLevel(ulong id) => int.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[0].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetExp(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[1].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetReqEXP(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[2].Split('=')[1]);
|
||||
|
||||
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
</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>
|
||||
@@ -1,24 +0,0 @@
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
internal class Echo : DBCommand
|
||||
{
|
||||
public string Command => "echo";
|
||||
|
||||
public string Description => "Replay with the same message";
|
||||
|
||||
public string Usage => "echo [message]";
|
||||
|
||||
public bool canUseDM => true;
|
||||
public bool canUseServer => true;
|
||||
|
||||
public bool requireAdmin => false;
|
||||
|
||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||
{
|
||||
string m = message.Content.Substring(6);
|
||||
await message.Channel.SendMessageAsync(m);
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace CMD_Utils
|
||||
{
|
||||
class FlipCoin : DBCommand
|
||||
{
|
||||
public string Command => "flip";
|
||||
|
||||
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)
|
||||
{
|
||||
System.Random random = new System.Random();
|
||||
int r = random.Next(1, 3);
|
||||
if (r == 1)
|
||||
await message.Channel.SendMessageAsync("Heads");
|
||||
else await message.Channel.SendMessageAsync("Tails");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Discord;
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace CMD_Utils
|
||||
{
|
||||
public class Poll : DBCommand
|
||||
{
|
||||
public string Command => "poll";
|
||||
|
||||
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;
|
||||
string question = message.Content.Split(' ')[1].Replace('-', ' ');
|
||||
string[] answers = PluginManager.Others.Functions.MergeStrings(message.Content.Split(' '), 2).Split(' ');
|
||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
embedBuilder.Title = question;
|
||||
int len = answers.Length;
|
||||
for (int i = 0; i < len; i++)
|
||||
embedBuilder.AddField($"Answer {i + 1}", answers[i].Replace('-', ' '), true);
|
||||
var msg = await context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
||||
|
||||
List<IEmote> 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 (int i = 0; i < len; i++)
|
||||
await msg.AddReactionAsync(emotes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
public class Random : DBCommand
|
||||
{
|
||||
public string Command => "random";
|
||||
|
||||
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
|
||||
{
|
||||
string msg = message.Content;
|
||||
int a = int.Parse(msg.Split(' ')[1]);
|
||||
int b = int.Parse(msg.Split(' ')[2]);
|
||||
|
||||
if (a > b)
|
||||
{
|
||||
int x = a;
|
||||
a = b;
|
||||
b = x;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.1.32421.90
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscordBot", "DiscordBot\DiscordBot.csproj", "{087E64F4-1E1C-4899-8223-295356C9894A}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PluginManager", "PluginManager\PluginManager.csproj", "{EDD4D9B3-98DD-4367-A09F-D1C5ACB61132}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{1862ABD5-7C30-4F15-A561-45AC8A9CA10E}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Events", "Events", "{A290C028-77C4-4D1D-AB43-DDFE6ABD9012}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Commands", "Commands", "{449FA364-0B72-43FF-B3A3-806E2916200E}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_LevelingSystem", "CMD_LevelingSystem\CMD_LevelingSystem.csproj", "{A48E8DC6-DBA2-4B47-9D59-46F4835F82CC}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EVE_LevelingSystem", "EVE_LevelingSystem\EVE_LevelingSystem.csproj", "{1C1E7F3D-E05A-4A87-9789-62D98904C200}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StartupEvents", "StartupEvents\StartupEvents.csproj", "{CE9DBF06-38A0-4192-8B3E-4009210D040D}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_Utils", "CMD_Utils\CMD_Utils.csproj", "{E26C87A4-3DD6-4B58-B14B-C8E086B852F9}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicCommands", "MusicCommands\MusicCommands.csproj", "{B1B4976E-5112-4217-B57B-3A03C5207B6E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Holiday events", "Holiday events\Holiday events.csproj", "{108BD621-EC08-4AC4-86D2-79B429562A90}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "New User", "New User\New User.csproj", "{02217691-EF7E-4FB2-91FC-C6EF07BF6094}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{087E64F4-1E1C-4899-8223-295356C9894A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{087E64F4-1E1C-4899-8223-295356C9894A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{087E64F4-1E1C-4899-8223-295356C9894A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{087E64F4-1E1C-4899-8223-295356C9894A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EDD4D9B3-98DD-4367-A09F-D1C5ACB61132}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EDD4D9B3-98DD-4367-A09F-D1C5ACB61132}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EDD4D9B3-98DD-4367-A09F-D1C5ACB61132}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EDD4D9B3-98DD-4367-A09F-D1C5ACB61132}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A48E8DC6-DBA2-4B47-9D59-46F4835F82CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A48E8DC6-DBA2-4B47-9D59-46F4835F82CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A48E8DC6-DBA2-4B47-9D59-46F4835F82CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A48E8DC6-DBA2-4B47-9D59-46F4835F82CC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1C1E7F3D-E05A-4A87-9789-62D98904C200}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1C1E7F3D-E05A-4A87-9789-62D98904C200}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1C1E7F3D-E05A-4A87-9789-62D98904C200}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1C1E7F3D-E05A-4A87-9789-62D98904C200}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CE9DBF06-38A0-4192-8B3E-4009210D040D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CE9DBF06-38A0-4192-8B3E-4009210D040D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CE9DBF06-38A0-4192-8B3E-4009210D040D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CE9DBF06-38A0-4192-8B3E-4009210D040D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E26C87A4-3DD6-4B58-B14B-C8E086B852F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E26C87A4-3DD6-4B58-B14B-C8E086B852F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E26C87A4-3DD6-4B58-B14B-C8E086B852F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E26C87A4-3DD6-4B58-B14B-C8E086B852F9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B1B4976E-5112-4217-B57B-3A03C5207B6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B1B4976E-5112-4217-B57B-3A03C5207B6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B1B4976E-5112-4217-B57B-3A03C5207B6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B1B4976E-5112-4217-B57B-3A03C5207B6E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{108BD621-EC08-4AC4-86D2-79B429562A90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{108BD621-EC08-4AC4-86D2-79B429562A90}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{108BD621-EC08-4AC4-86D2-79B429562A90}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{108BD621-EC08-4AC4-86D2-79B429562A90}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{02217691-EF7E-4FB2-91FC-C6EF07BF6094}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{02217691-EF7E-4FB2-91FC-C6EF07BF6094}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{02217691-EF7E-4FB2-91FC-C6EF07BF6094}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{02217691-EF7E-4FB2-91FC-C6EF07BF6094}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{A290C028-77C4-4D1D-AB43-DDFE6ABD9012} = {1862ABD5-7C30-4F15-A561-45AC8A9CA10E}
|
||||
{449FA364-0B72-43FF-B3A3-806E2916200E} = {1862ABD5-7C30-4F15-A561-45AC8A9CA10E}
|
||||
{A48E8DC6-DBA2-4B47-9D59-46F4835F82CC} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
||||
{1C1E7F3D-E05A-4A87-9789-62D98904C200} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012}
|
||||
{CE9DBF06-38A0-4192-8B3E-4009210D040D} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012}
|
||||
{E26C87A4-3DD6-4B58-B14B-C8E086B852F9} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
||||
{B1B4976E-5112-4217-B57B-3A03C5207B6E} = {449FA364-0B72-43FF-B3A3-806E2916200E}
|
||||
{108BD621-EC08-4AC4-86D2-79B429562A90} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012}
|
||||
{02217691-EF7E-4FB2-91FC-C6EF07BF6094} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -1,16 +1,17 @@
|
||||
using Discord;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using Discord;
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Loaders;
|
||||
using PluginManager;
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.Others.Permissions;
|
||||
using PluginManager.Loaders;
|
||||
using PluginManager.Others;
|
||||
|
||||
using System.Collections.Generic;
|
||||
namespace DiscordBot.Discord.Commands;
|
||||
|
||||
namespace DiscordBot.Discord.Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// The help command
|
||||
/// </summary>
|
||||
@@ -21,25 +22,17 @@ namespace DiscordBot.Discord.Commands
|
||||
/// </summary>
|
||||
public string Command => "help";
|
||||
|
||||
public List<string> Aliases => null;
|
||||
|
||||
/// <summary>
|
||||
/// Command Description
|
||||
/// </summary>
|
||||
public string Description => "This command allows you to check all loadded commands";
|
||||
public string Description => "This command allows you to check all loaded commands";
|
||||
|
||||
/// <summary>
|
||||
/// Command usage
|
||||
/// </summary>
|
||||
public string Usage => "help";
|
||||
|
||||
/// <summary>
|
||||
/// Check if the command can be used <inheritdoca DM <see cref="IChannel"/>/>
|
||||
/// </summary>
|
||||
public bool canUseDM => true;
|
||||
|
||||
/// <summary>
|
||||
/// Check if the command can be used in a server
|
||||
/// </summary>
|
||||
public bool canUseServer => true;
|
||||
public string Usage => "help <command>";
|
||||
|
||||
/// <summary>
|
||||
/// Check if the command require administrator to be executed
|
||||
@@ -50,58 +43,53 @@ namespace DiscordBot.Discord.Commands
|
||||
/// 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)
|
||||
public void ExecuteServer(SocketCommandContext context)
|
||||
{
|
||||
List<string> args = Functions.GetArguments(message);
|
||||
var args = Functions.GetArguments(context.Message);
|
||||
if (args.Count != 0)
|
||||
{
|
||||
|
||||
foreach (var item in args)
|
||||
{
|
||||
var e = GenerateHelpCommand(item);
|
||||
if (e != null)
|
||||
context.Channel.SendMessageAsync(embed: e.Build());
|
||||
else
|
||||
if (e is null)
|
||||
context.Channel.SendMessageAsync("Unknown Command " + item);
|
||||
else
|
||||
context.Channel.SendMessageAsync(embed: e.Build());
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
|
||||
string adminCommands = "";
|
||||
string normalCommands = "";
|
||||
string DMCommands = "";
|
||||
var embedBuilder = new EmbedBuilder();
|
||||
|
||||
foreach (var cmd in PluginLoader.Plugins!)
|
||||
var adminCommands = "";
|
||||
var normalCommands = "";
|
||||
|
||||
foreach (var cmd in PluginLoader.Commands!)
|
||||
{
|
||||
if (cmd.canUseDM)
|
||||
DMCommands += cmd.Command + " ";
|
||||
if (cmd.requireAdmin)
|
||||
adminCommands += cmd.Command + " ";
|
||||
else if (cmd.canUseServer) normalCommands += cmd.Command + " ";
|
||||
else
|
||||
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)
|
||||
{
|
||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
DBCommand cmd = PluginLoader.Plugins.Find(p => p.Command == command);
|
||||
if (cmd == null)
|
||||
return null;
|
||||
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("Usage", Config.GetValue<string>("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,16 +1,16 @@
|
||||
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;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.Others.Permissions;
|
||||
using PluginManager.Others;
|
||||
namespace DiscordBot.Discord.Commands;
|
||||
|
||||
namespace DiscordBot.Discord.Commands
|
||||
{
|
||||
internal class Restart : DBCommand
|
||||
{
|
||||
/// <summary>
|
||||
@@ -18,6 +18,8 @@ namespace DiscordBot.Discord.Commands
|
||||
/// </summary>
|
||||
public string Command => "restart";
|
||||
|
||||
public List<string> Aliases => null;
|
||||
|
||||
/// <summary>
|
||||
/// Command Description
|
||||
/// </summary>
|
||||
@@ -28,48 +30,37 @@ namespace DiscordBot.Discord.Commands
|
||||
/// </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;
|
||||
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(DiscordLibCommands.SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||
public async void ExecuteServer(DiscordLibCommands.SocketCommandContext context)
|
||||
{
|
||||
if (!DiscordPermissions.hasPermission(message.Author as SocketGuildUser, DiscordLib.GuildPermission.Administrator)) return;
|
||||
var args = Functions.GetArguments(message);
|
||||
var args = Functions.GetArguments(context.Message);
|
||||
var OS = Functions.GetOperatingSystem();
|
||||
if (args.Count == 0)
|
||||
{
|
||||
switch (OS)
|
||||
{
|
||||
case PluginManager.Others.OperatingSystem.WINDOWS:
|
||||
case OperatingSystem.WINDOWS:
|
||||
Process.Start("./DiscordBot.exe");
|
||||
break;
|
||||
case PluginManager.Others.OperatingSystem.LINUX:
|
||||
case PluginManager.Others.OperatingSystem.MAC_OS:
|
||||
case OperatingSystem.LINUX:
|
||||
case OperatingSystem.MAC_OS:
|
||||
Process.Start("./DiscordBot");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
switch (args[0])
|
||||
{
|
||||
case "-p":
|
||||
@@ -80,35 +71,32 @@ namespace DiscordBot.Discord.Commands
|
||||
break;
|
||||
case "-cmd":
|
||||
case "-args":
|
||||
string cmd = "--args";
|
||||
var cmd = "--args";
|
||||
|
||||
if (args.Count > 1)
|
||||
for (int i = 1; i < args.Count; i++)
|
||||
for (var i = 1; i < args.Count; i++)
|
||||
cmd += $" {args[i]}";
|
||||
|
||||
|
||||
switch (OS)
|
||||
{
|
||||
case PluginManager.Others.OperatingSystem.WINDOWS:
|
||||
case OperatingSystem.WINDOWS:
|
||||
Functions.WriteLogFile("Restarting the bot with the following arguments: \"" + cmd + "\"");
|
||||
Process.Start("./DiscordBot.exe", cmd);
|
||||
break;
|
||||
case PluginManager.Others.OperatingSystem.LINUX:
|
||||
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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,28 +1,24 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Discord;
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Core;
|
||||
using PluginManager;
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.Others;
|
||||
using PluginManager.Others.Permissions;
|
||||
|
||||
namespace DiscordBot.Discord.Commands
|
||||
{
|
||||
class Settings : DBCommand
|
||||
{
|
||||
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>
|
||||
@@ -33,16 +29,6 @@ namespace DiscordBot.Discord.Commands
|
||||
/// </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>
|
||||
@@ -52,18 +38,14 @@ namespace DiscordBot.Discord.Commands
|
||||
/// 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)
|
||||
public async void Execute(SocketCommandContext context)
|
||||
{
|
||||
var channel = message.Channel;
|
||||
var channel = context.Message.Channel;
|
||||
try
|
||||
{
|
||||
|
||||
string content = message.Content;
|
||||
string[] data = content.Split(' ');
|
||||
string keyword = data[1];
|
||||
var content = context.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)");
|
||||
@@ -80,7 +62,8 @@ namespace DiscordBot.Discord.Commands
|
||||
await channel.SendMessageAsync("Invalid token !");
|
||||
return;
|
||||
}
|
||||
Functions.WriteToSettings("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", data[2], '\t');
|
||||
|
||||
Config.SetValue("token", data[2]);
|
||||
break;
|
||||
case "prefix":
|
||||
if (data.Length != 3)
|
||||
@@ -88,7 +71,8 @@ namespace DiscordBot.Discord.Commands
|
||||
await channel.SendMessageAsync("Invalid token !");
|
||||
return;
|
||||
}
|
||||
Functions.WriteToSettings("./Data/Resources/DiscordBotCore.data", "BOT_PREFIX", data[2], '\t');
|
||||
|
||||
Config.SetValue("token", data[2]);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
@@ -96,11 +80,10 @@ namespace DiscordBot.Discord.Commands
|
||||
|
||||
await channel.SendMessageAsync("Restart required ...");
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
await channel.SendMessageAsync("Unknown usage to this command !\nUsage: " + Usage);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
using Discord;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Discord;
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using PluginManager;
|
||||
|
||||
using static PluginManager.Others.Functions;
|
||||
|
||||
namespace PluginManager.Core
|
||||
{
|
||||
namespace DiscordBot.Discord.Core;
|
||||
|
||||
internal class Boot
|
||||
{
|
||||
/// <summary>
|
||||
@@ -21,13 +24,6 @@ namespace PluginManager.Core
|
||||
/// </summary>
|
||||
public readonly string botToken;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the bot is ready
|
||||
/// </summary>
|
||||
/// <value> true if the bot is ready, othwerwise false </value>
|
||||
public bool isReady { get; private set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// The bot client
|
||||
/// </summary>
|
||||
@@ -54,13 +50,22 @@ namespace PluginManager.Core
|
||||
this.botToken = botToken;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the bot is ready
|
||||
/// </summary>
|
||||
/// <value> true if the bot is ready, othwerwise false </value>
|
||||
public bool isReady { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The start method for the bot. This method is used to load the bot
|
||||
/// </summary>
|
||||
/// <returns>Task</returns>
|
||||
public async Task Awake()
|
||||
{
|
||||
client = new DiscordSocketClient();
|
||||
DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true };
|
||||
|
||||
client = new DiscordSocketClient(config);
|
||||
service = new CommandService();
|
||||
|
||||
CommonTasks();
|
||||
@@ -71,22 +76,8 @@ namespace PluginManager.Core
|
||||
commandServiceHandler = new CommandHandler(client, service, botPrefix);
|
||||
await commandServiceHandler.InstallCommandsAsync();
|
||||
|
||||
//wait for isReady to become true
|
||||
|
||||
await Task.Delay(2000);
|
||||
while (!isReady) ;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The method that stops the bot from running
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task ShutDown()
|
||||
{
|
||||
if (client == null) return;
|
||||
await client.LogoutAsync();
|
||||
await client.StopAsync();
|
||||
}
|
||||
|
||||
private void CommonTasks()
|
||||
@@ -109,6 +100,7 @@ namespace PluginManager.Core
|
||||
{
|
||||
Console.Title = "ONLINE";
|
||||
isReady = true;
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
@@ -116,7 +108,8 @@ namespace PluginManager.Core
|
||||
{
|
||||
Console.Title = "CONNECTED";
|
||||
WriteLogFile("The bot has been logged in at " + DateTime.Now.ToShortDateString() + " (" +
|
||||
DateTime.Now.ToShortTimeString() + ")");
|
||||
DateTime.Now.ToShortTimeString() + ")"
|
||||
);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
@@ -148,5 +141,5 @@ namespace PluginManager.Core
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,25 +1,21 @@
|
||||
using Discord.Commands;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
using System.Reflection;
|
||||
using PluginManager.Loaders;
|
||||
using PluginManager.Others;
|
||||
using PluginManager.Others.Permissions;
|
||||
using PluginManager.Loaders;
|
||||
|
||||
using System.Threading.Tasks;
|
||||
using System.Linq;
|
||||
using Discord;
|
||||
using System;
|
||||
namespace DiscordBot.Discord.Core;
|
||||
|
||||
namespace PluginManager.Core
|
||||
{
|
||||
internal class CommandHandler
|
||||
{
|
||||
private readonly string botPrefix;
|
||||
private readonly DiscordSocketClient client;
|
||||
private readonly CommandService commandService;
|
||||
private readonly string botPrefix;
|
||||
|
||||
/// <summary>
|
||||
/// Command handler constructor
|
||||
@@ -41,7 +37,7 @@ namespace PluginManager.Core
|
||||
public async Task InstallCommandsAsync()
|
||||
{
|
||||
client.MessageReceived += MessageHandler;
|
||||
await commandService.AddModulesAsync(assembly: Assembly.GetEntryAssembly(), services: null);
|
||||
await commandService.AddModulesAsync(Assembly.GetEntryAssembly(), null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -58,11 +54,13 @@ namespace PluginManager.Core
|
||||
|
||||
var message = Message as SocketUserMessage;
|
||||
|
||||
if (message == null) return;
|
||||
if (message == null)
|
||||
return;
|
||||
|
||||
if (!message.Content.StartsWith(botPrefix)) return;
|
||||
if (!message.Content.StartsWith(botPrefix))
|
||||
return;
|
||||
|
||||
int argPos = 0;
|
||||
var argPos = 0;
|
||||
|
||||
if (message.HasMentionPrefix(client.CurrentUser, ref argPos))
|
||||
{
|
||||
@@ -70,67 +68,28 @@ namespace PluginManager.Core
|
||||
return;
|
||||
}
|
||||
|
||||
if (message.Author.IsBot) return;
|
||||
if (message.Author.IsBot)
|
||||
return;
|
||||
|
||||
var context = new SocketCommandContext(client, message);
|
||||
|
||||
await commandService.ExecuteAsync(
|
||||
context: context,
|
||||
argPos: argPos,
|
||||
services: null
|
||||
);
|
||||
await commandService.ExecuteAsync(context, argPos, null);
|
||||
|
||||
DBCommand plugin = PluginLoader.Plugins!.Where(p => p.Command == (message.Content.Split(' ')[0]).Substring(botPrefix.Length)).FirstOrDefault();
|
||||
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 is null) throw new System.Exception("Failed to run command. !");
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
if (plugin.requireAdmin && !context.Message.Author.isAdmin())
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
if (context.Channel is SocketDMChannel)
|
||||
plugin.ExecuteDM(context);
|
||||
else plugin.ExecuteServer(context);
|
||||
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
ex.WriteErrFile();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,17 @@
|
||||
<Nullable>disable</Nullable>
|
||||
<ApplicationIcon />
|
||||
<StartupObject />
|
||||
<SignAssembly>False</SignAssembly>
|
||||
<IsPublishable>True</IsPublishable>
|
||||
<AssemblyVersion>1.0.0.12</AssemblyVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -27,7 +38,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Discord.Net" Version="3.6.1" />
|
||||
<PackageReference Include="Discord.Net" Version="3.7.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,363 +1,131 @@
|
||||
using Discord;
|
||||
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using PluginManager.Core;
|
||||
using PluginManager.Others;
|
||||
using PluginManager.Loaders;
|
||||
using PluginManager.LanguageSystem;
|
||||
using PluginManager.Online;
|
||||
using Discord;
|
||||
|
||||
using DiscordBot.Discord.Core;
|
||||
|
||||
using PluginManager;
|
||||
using PluginManager.Items;
|
||||
using PluginManager.Online;
|
||||
using PluginManager.Others;
|
||||
|
||||
namespace DiscordBot;
|
||||
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
namespace DiscordBot
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
private static PluginsManager manager = new PluginsManager("https://sethdiscordbot.000webhostapp.com/Storage/Discord%20Bot/Plugins");
|
||||
private static LanguageManager languageManager = new LanguageManager("https://sethdiscordbot.000webhostapp.com/Storage/Discord%20Bot/Languages");
|
||||
|
||||
private static bool loadPluginsOnStartup = false;
|
||||
private static bool listPluginsAtStartup = false;
|
||||
private static bool listLanguagAtStartup = false;
|
||||
|
||||
private static bool PluginsLoaded = false;
|
||||
private static bool loadPluginsOnStartup;
|
||||
private static bool listPluginsAtStartup;
|
||||
private static ConsoleCommandsHandler consoleCommandsHandler;
|
||||
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
[Obsolete]
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
Directory.CreateDirectory("./Data/Resources");
|
||||
Directory.CreateDirectory("./Data/Languages");
|
||||
Directory.CreateDirectory("./Data/Plugins/Commands");
|
||||
Directory.CreateDirectory("./Data/Plugins/Events");
|
||||
if (!File.Exists("./Data/Resources/DiscordBotCore.data") || (Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", '=').Length != 59 && Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", '=').Length != 70))
|
||||
Console.WriteLine("Loading resources ...");
|
||||
PreLoadComponents().Wait();
|
||||
do
|
||||
{
|
||||
File.WriteAllText("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN=token\nBOT_PREFIX=!\n");
|
||||
while (true)
|
||||
if (!Config.ContainsKey("ServerID"))
|
||||
{
|
||||
Console.WriteLine("Please insert your token: ");
|
||||
Console.Write("TOKEN: ");
|
||||
string botToken = Console.ReadLine();
|
||||
if (botToken.Length == 59 || botToken.Length == 70)
|
||||
|
||||
|
||||
Console.WriteLine("Please enter the server ID: ");
|
||||
Console_Utilities.WriteColorText("You can find it in the Server Settings at &r\"Widget\"&c section");
|
||||
Console.WriteLine("Example: 1234567890123456789");
|
||||
|
||||
Console.WriteLine("This is not required, but is recommended. If you refuse to provide the ID, just press enter.\nThe server id is required to make easier for the bot to interact with the server.\nRemember: this bot is for one server ONLY.");
|
||||
Console.Write("User Input > ");
|
||||
ConsoleKeyInfo key = Console.ReadKey();
|
||||
if (key.Key == ConsoleKey.Enter)
|
||||
Config.AddValueToVariables("ServerID", "null", false);
|
||||
else
|
||||
{
|
||||
string prefix = Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_PREFIX", '=');
|
||||
if (prefix == string.Empty || prefix == null)
|
||||
prefix = "!";
|
||||
File.WriteAllText("./Data/Resources/DiscordBotCore.data", $"BOT_TOKEN={botToken}\nBOT_PREFIX={prefix}\n");
|
||||
string SID = key.KeyChar + Console.ReadLine();
|
||||
if (SID.Length != 18)
|
||||
{
|
||||
Console.Clear();
|
||||
Console_Utilities.WriteColorText("&rYour server ID is not 18 characters long. Please try again. \n");
|
||||
|
||||
continue;
|
||||
}
|
||||
Config.AddValueToVariables("ServerID", SID, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!Config.ContainsKey("token") || Config.GetValue<string>("token") == null || (Config.GetValue<string>("token")?.Length != 70 && Config.GetValue<string>("token")?.Length != 59))
|
||||
{
|
||||
Console.WriteLine("Please insert your token");
|
||||
Console.Write("Token = ");
|
||||
var token = Console.ReadLine();
|
||||
if (token?.Length == 59 || token?.Length == 70)
|
||||
Config.AddValueToVariables("token", token, true);
|
||||
else
|
||||
{
|
||||
Console.Clear();
|
||||
Console_Utilities.WriteColorText("&rThe token length is invalid !");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Config.ContainsKey("prefix") || Config.GetValue<string>("prefix") == null || Config.GetValue<string>("prefix")?.Length != 1)
|
||||
{
|
||||
Console.WriteLine("Please insert your prefix (max. 1 character long):");
|
||||
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces, numbers, '/' or '\\' allowed");
|
||||
Console.Write("Prefix = ");
|
||||
var prefix = Console.ReadLine()![0];
|
||||
|
||||
if (prefix == ' ' || char.IsDigit(prefix) || prefix == '/' || prefix == '\\')
|
||||
{
|
||||
Console.Clear();
|
||||
Console_Utilities.WriteColorText("&rThe prefix is invalid");
|
||||
continue;
|
||||
}
|
||||
Config.AddValueToVariables("prefix", prefix.ToString(), false);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
else Console.WriteLine("Invalid Token !");
|
||||
}
|
||||
}
|
||||
} while (true);
|
||||
|
||||
HandleInput(args).Wait();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset all settings for the bot
|
||||
/// </summary>
|
||||
private static Task ResetSettings()
|
||||
{
|
||||
string[] files = Directory.GetFiles(@"./Data/Resources");
|
||||
foreach (string file in files) File.Delete(file);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The main loop for the discord bot
|
||||
/// </summary>
|
||||
/// <param name="discordbooter">The discord booter used to start the application</param>
|
||||
private static async Task NoGUI(Boot discordbooter)
|
||||
private static void NoGUI(Boot discordbooter)
|
||||
{
|
||||
LoadLanguage();
|
||||
if (loadPluginsOnStartup)
|
||||
LoadPlugins(discordbooter);
|
||||
if (listPluginsAtStartup)
|
||||
await manager.ListAvailablePlugins();
|
||||
if (listLanguagAtStartup)
|
||||
await languageManager.ListAllLanguages();
|
||||
|
||||
|
||||
Console_Utilities.ProgressBar pbar;
|
||||
IProgress<float> progress = null;
|
||||
Task t;
|
||||
int prg = 0;
|
||||
|
||||
#if DEBUG
|
||||
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)
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
Console_Utilities.WriteColorText("&mConsole ", false);
|
||||
string[] data = Console.ReadLine().Split(' ');
|
||||
|
||||
if (data[0].Length < 2)
|
||||
continue; // The input command is less then 2 characters long
|
||||
var cmd = Console.ReadLine();
|
||||
if (!consoleCommandsHandler.HandleCommand(cmd!
|
||||
#if DEBUG
|
||||
, false
|
||||
#endif
|
||||
|
||||
switch (data[0])
|
||||
{
|
||||
case "shutdown":
|
||||
case "sd":
|
||||
if (discordbooter.client.ConnectionState == ConnectionState.Connected)
|
||||
await discordbooter.ShutDown().ContinueWith(t => { Environment.Exit(0); });
|
||||
break;
|
||||
case "reload":
|
||||
case "rl":
|
||||
if (Environment.OSVersion.Platform != PlatformID.Win32NT)
|
||||
{
|
||||
Console.WriteLine("This command is for windows users ONLY");
|
||||
break;
|
||||
}
|
||||
Process.Start("./DiscordBot.exe", "--cmd lp");
|
||||
if (discordbooter.client.ConnectionState == ConnectionState.Connected)
|
||||
await discordbooter.ShutDown();
|
||||
else Environment.Exit(0);
|
||||
break;
|
||||
case "listplugs":
|
||||
await manager.ListAvailablePlugins();
|
||||
break;
|
||||
|
||||
case "dwplug":
|
||||
string name = data.MergeStrings(1);
|
||||
// info[0] = plugin type
|
||||
// info[1] = plugin link
|
||||
// info[2] = if others are required, or string.Empty if none
|
||||
string[] info = await manager.GetPluginLinkByName(name);
|
||||
if (info[1] == null) // link is null
|
||||
{
|
||||
if (name == "")
|
||||
{
|
||||
Console_Utilities.WriteColorText($"Name is invalid");
|
||||
break;
|
||||
}
|
||||
Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c! Use &glistplugs &ccommand to display all available plugins !");
|
||||
break;
|
||||
|
||||
}
|
||||
string path = "./Data/Plugins/" + info[0] + "s/" + name + ".dll";
|
||||
|
||||
await ServerCom.DownloadFileAsync(info[1], path);
|
||||
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}");
|
||||
|
||||
List<string> lines = await ServerCom.ReadTextFromFile(info[2]);
|
||||
int i = 1;
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
string[] split = line.Split(',');
|
||||
Console.WriteLine($"\nDownloading item: {split[1]}");
|
||||
|
||||
|
||||
await ServerCom.DownloadFileAsync(split[0], "./" + split[1]);
|
||||
Console.WriteLine();
|
||||
i++;
|
||||
}
|
||||
Console.WriteLine();
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case "setlang":
|
||||
if (data.Length == 2)
|
||||
SetLanguage(data[1]);
|
||||
else Console.WriteLine("Invalid arguments");
|
||||
break;
|
||||
case "set-setting":
|
||||
if (data.Length >= 3)
|
||||
Functions.WriteToSettingsFast(data[1], Functions.MergeStrings(data, 2));
|
||||
else Console.WriteLine("Failed to write to settings. Invalid params");
|
||||
break;
|
||||
case "listlang":
|
||||
await languageManager.ListAllLanguages();
|
||||
break;
|
||||
case "dwlang":
|
||||
string Lname = data.MergeStrings(1);
|
||||
string[] link = await languageManager.GetDownloadLink(Lname);
|
||||
try
|
||||
{
|
||||
if (link[0] is null || link is null)
|
||||
{
|
||||
if (Lname == "")
|
||||
{
|
||||
Console_Utilities.WriteColorText($"Name is invalid");
|
||||
break;
|
||||
}
|
||||
Console_Utilities.WriteColorText("Failed to find language &b" + Lname + " &c! Use &glistlang &ccommand to display all available languages !");
|
||||
break;
|
||||
}
|
||||
if (link[1].Contains("CrossPlatform") || link[1].Contains("cp"))
|
||||
{
|
||||
|
||||
string path2 = Functions.langFolder + Lname + ".lng";
|
||||
|
||||
await ServerCom.DownloadFileAsync(link[0], path2);
|
||||
Console.WriteLine("\n");
|
||||
}
|
||||
else Console_Utilities.WriteColorText("The language you are trying to download (&b" + Lname + "&c) is not compatible with the version of this bot. User &glistlang &ccommand in order to see all available languages for your current version !\n" + link[1]);
|
||||
break;
|
||||
}
|
||||
catch
|
||||
{
|
||||
if (Lname == "")
|
||||
{
|
||||
Console_Utilities.WriteColorText($"Name is invalid");
|
||||
break;
|
||||
}
|
||||
Console_Utilities.WriteColorText("Failed to find language &b" + Lname + " &c! Use &glistlang &ccommand to display all available languages !");
|
||||
break;
|
||||
}
|
||||
|
||||
case "loadplugins":
|
||||
case "lp":
|
||||
if (PluginsLoaded)
|
||||
{
|
||||
Console_Utilities.WriteColorText("&rPlugins are already loaded");
|
||||
break;
|
||||
}
|
||||
LoadPlugins(discordbooter);
|
||||
|
||||
break;
|
||||
case "help":
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
||||
Console.WriteLine
|
||||
(
|
||||
"lp | loadplugins -> load all plugins\n" +
|
||||
"sd | shutdown->close connection to the server(stop bot)\n" +
|
||||
"token -> display the current token\n" +
|
||||
"listplugs -> list all available plugins\n" +
|
||||
"dwplug [name] -> download plugin by name\n" +
|
||||
"listlang -> list all available languages\n" +
|
||||
"dwlang -> download language by name\n" +
|
||||
"setlang [name] -> set language from the downloaded languages\n" +
|
||||
"set-setting [setting.path] [value] -> set setting value"
|
||||
);
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
break;
|
||||
case "token":
|
||||
if (File.Exists("./Data/Resources/DiscordBotCore.data"))
|
||||
Console.WriteLine("Token: " + Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", '='));
|
||||
else Console.WriteLine("File could not be found. Please register token");
|
||||
break;
|
||||
default:
|
||||
goto case "help";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static void LoadPlugins(Boot discordbooter)
|
||||
{
|
||||
var loader = new PluginLoader(discordbooter.client);
|
||||
loader.onCMDLoad += (name, typeName, success, exception) =>
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
if (name == null || name.Length < 2)
|
||||
name = typeName;
|
||||
if (success)
|
||||
if (Language.ActiveLanguage == null)
|
||||
Console.WriteLine("[CMD] Successfully loaded command : " + name);
|
||||
else Console.WriteLine(Language.ActiveLanguage.FormatText(Language.ActiveLanguage.LanguageWords["COMMAND_LOAD_SUCCESS"], name));
|
||||
else
|
||||
if (Language.ActiveLanguage == null)
|
||||
Console.WriteLine("[CMD] Failed to load command : " + name + " because " + exception.Message);
|
||||
else
|
||||
Console.WriteLine(Language.ActiveLanguage.FormatText(Language.ActiveLanguage.LanguageWords["COMMAND_LOAD_FAIL"], name, exception.Message));
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
};
|
||||
loader.onEVELoad += (name, typeName, success, exception) =>
|
||||
{
|
||||
if (name == null || name.Length < 2)
|
||||
name = typeName;
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
if (success)
|
||||
if (Language.ActiveLanguage == null)
|
||||
Console.WriteLine("[EVENT] Successfully loaded event : " + name);
|
||||
else
|
||||
Console.WriteLine(Language.ActiveLanguage.FormatText(Language.ActiveLanguage.LanguageWords["EVENT_LOAD_SUCCESS"], name));
|
||||
else
|
||||
if (Language.ActiveLanguage == null)
|
||||
Console.WriteLine("[EVENT] Failed to load event : " + name + " because " + exception.Message);
|
||||
else
|
||||
Console.WriteLine(Language.ActiveLanguage.FormatText(Language.ActiveLanguage.LanguageWords["EVENT_LOAD_FAIL"], name, exception.Message));
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
};
|
||||
loader.LoadPlugins();
|
||||
|
||||
PluginsLoaded = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load the language from the specified file
|
||||
/// </summary>
|
||||
private static bool LoadLanguage()
|
||||
{
|
||||
string folder = Functions.langFolder;
|
||||
string langSettings = "./Data/Resources/Language.txt";
|
||||
if (!File.Exists(langSettings))
|
||||
File.WriteAllText(langSettings, "Language=English");
|
||||
//Load language from the specified file ...
|
||||
Language.ActiveLanguage = null;
|
||||
|
||||
string langname = Functions.readCodeFromFile(langSettings, "Language", '=');
|
||||
if (langname == "English")
|
||||
{
|
||||
Language.ActiveLanguage = null;
|
||||
return true;
|
||||
}
|
||||
foreach (var file in Directory.GetFiles(folder))
|
||||
{
|
||||
if (Functions.readCodeFromFile(file, "LANGUAGE_NAME", '=') == langname)
|
||||
{
|
||||
Language.ActiveLanguage = Language.CreateLanguageFromFile(file);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (Language.ActiveLanguage == null)
|
||||
{
|
||||
File.WriteAllText(langSettings, "Language=English");
|
||||
Console_Utilities.WriteColorText($"Failed to find language &r{langname} &c! Check available languages using command: &glistlang");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void SetLanguage(string LanguageName)
|
||||
{
|
||||
string langSettings = Functions.dataFolder + "Language.txt";
|
||||
File.WriteAllText(langSettings, "Language=" + LanguageName);
|
||||
|
||||
try
|
||||
{
|
||||
bool success = LoadLanguage();
|
||||
if (success)
|
||||
{
|
||||
Console_Utilities.WriteColorText($"Language has been setted to: &g{LanguageName}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console_Utilities.WriteColorText($"Could not find language &r{LanguageName}.");
|
||||
Functions.WriteErrFile(ex.ToString());
|
||||
File.WriteAllText(langSettings, "Language=English");
|
||||
LoadLanguage();
|
||||
) && cmd.Length > 0)
|
||||
Console.WriteLine("Failed to run command " + cmd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,19 +135,55 @@ namespace DiscordBot
|
||||
/// <returns>Returns the boot loader for the Discord Bot</returns>
|
||||
private static async Task<Boot> StartNoGUI()
|
||||
{
|
||||
|
||||
Console.Clear();
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
||||
//Console.WriteLine("Discord BOT for Cross Platform\n\nCreated by: Wizzy\nDiscord: Wizzy#9181");
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
Console.WriteLine("============================ Discord BOT - Cross Platform ============================");
|
||||
string token = Functions.readCodeFromFile(Functions.dataFolder + "DiscordBotCore.data", "BOT_TOKEN", '=');
|
||||
string prefix = Functions.readCodeFromFile(Functions.dataFolder + "DiscordBotCore.data", "BOT_PREFIX", '=');
|
||||
|
||||
List<string> startupMessageList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage");
|
||||
|
||||
foreach (var message in startupMessageList)
|
||||
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;
|
||||
|
||||
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
|
||||
{
|
||||
var token = Config.GetValue<string>("token");
|
||||
#if DEBUG
|
||||
Console.WriteLine("Starting in DEBUG MODE");
|
||||
if (!Directory.Exists("./Data/BetaTest"))
|
||||
Console.WriteLine("Failed to start in debug mode because the folder ./Data/BetaTest does not exist");
|
||||
else
|
||||
{
|
||||
token = File.ReadAllText("./Data/BetaTest/token.txt");
|
||||
|
||||
//Debug mode code...
|
||||
}
|
||||
#endif
|
||||
|
||||
var prefix = Config.GetValue<string>("prefix");
|
||||
var discordbooter = new Boot(token, prefix);
|
||||
await discordbooter.Awake();
|
||||
return discordbooter;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clear folder
|
||||
@@ -387,8 +191,8 @@ namespace DiscordBot
|
||||
/// <param name="d">Directory path</param>
|
||||
private static Task ClearFolder(string d)
|
||||
{
|
||||
string[] files = Directory.GetFiles(d);
|
||||
int fileNumb = files.Length;
|
||||
var files = Directory.GetFiles(d);
|
||||
var fileNumb = files.Length;
|
||||
for (var i = 0; i < fileNumb; i++)
|
||||
{
|
||||
File.Delete(files[i]);
|
||||
@@ -405,79 +209,84 @@ namespace DiscordBot
|
||||
private static async Task HandleInput(string[] args)
|
||||
{
|
||||
|
||||
if (args.Length > 0)
|
||||
if (args[0] == "progress")
|
||||
{
|
||||
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(100, "Download");
|
||||
for (int i = 0; i <= 100; i++)
|
||||
{
|
||||
bar.Update(i);
|
||||
await Task.Delay(10);
|
||||
var len = args.Length;
|
||||
|
||||
if (len == 3 && args[0] == "/download")
|
||||
{
|
||||
var url = args[1];
|
||||
var location = args[2];
|
||||
|
||||
await ServerCom.DownloadFileAsync(url, location);
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (args.Length == 0)
|
||||
{
|
||||
if (File.Exists("./ref/startupArguments.txt"))
|
||||
{
|
||||
var lines = await File.ReadAllLinesAsync("./ref/startupArguments.txt");
|
||||
args = lines;
|
||||
}
|
||||
}
|
||||
|
||||
int len = args.Length;
|
||||
if (len == 1 && args[0] == "--help")
|
||||
{
|
||||
Console.WriteLine("Available commands:\n--exec -> start the bot with tools enabled");
|
||||
return;
|
||||
}
|
||||
|
||||
if (len == 1 && args[0] == "--logout")
|
||||
{
|
||||
File.Delete(Functions.dataFolder + "Login.dat");
|
||||
Console.WriteLine("Logged out. Please restart the application !");
|
||||
return;
|
||||
}
|
||||
|
||||
if (len >= 2 && args[0] == "--encrypt")
|
||||
{
|
||||
string s2e = args.MergeStrings(1);
|
||||
Console.WriteLine("MD5: " + await Cryptography.CreateMD5(s2e));
|
||||
Console.WriteLine("SHA356: " + await Cryptography.CreateSHA256(s2e));
|
||||
return;
|
||||
}
|
||||
|
||||
if (len > 0 && (args.Contains("--cmd") || args.Contains("--args")))
|
||||
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;
|
||||
if (args.Contains("listlang"))
|
||||
listLanguagAtStartup = true;
|
||||
|
||||
len = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (len == 0 || args[0] != "--exec" && args[0] != "--execute")
|
||||
var b = await StartNoGUI();
|
||||
consoleCommandsHandler = new ConsoleCommandsHandler(b.client);
|
||||
|
||||
if (len > 0 && args[0] == "/remplug")
|
||||
{
|
||||
Boot b = await StartNoGUI();
|
||||
await NoGUI(b);
|
||||
|
||||
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] == "/updateplug")
|
||||
{
|
||||
string plugName = args.MergeStrings(1);
|
||||
Console.WriteLine("Updating " + plugName);
|
||||
await ConsoleCommandsHandler.ExecuteCommad("dwplug" + plugName);
|
||||
return;
|
||||
}
|
||||
|
||||
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-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"
|
||||
@@ -486,33 +295,20 @@ namespace DiscordBot
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
Console.Write("> ");
|
||||
string[] message = Console.ReadLine().Split(' ');
|
||||
var message = Console.ReadLine().Split(' ');
|
||||
|
||||
switch (message[0])
|
||||
{
|
||||
case "--reset-settings":
|
||||
await ResetSettings();
|
||||
Console.WriteLine("Successfully reseted all settings !");
|
||||
break;
|
||||
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"
|
||||
);
|
||||
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/Addons");
|
||||
await ClearFolder("./Data/Plugins/Commands");
|
||||
await ClearFolder("./Data/Plugins/Events");
|
||||
Console.WriteLine("Successfully cleared all folders");
|
||||
@@ -520,21 +316,112 @@ namespace DiscordBot
|
||||
case "--reset-logs":
|
||||
await ClearFolder("./Output/Logs");
|
||||
await ClearFolder("./Output/Errors");
|
||||
Console.WriteLine("Successfully cleard logs folder");
|
||||
Console.WriteLine("Successfully clear logs folder");
|
||||
break;
|
||||
case "--exit":
|
||||
case "exit":
|
||||
Environment.Exit(0);
|
||||
break;
|
||||
case "--start":
|
||||
Boot booter = await StartNoGUI();
|
||||
await NoGUI(booter);
|
||||
return;
|
||||
|
||||
default:
|
||||
Console.WriteLine("Failed to execute command " + message[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task PreLoadComponents()
|
||||
{
|
||||
Console_Utilities.ProgressBar main = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
|
||||
main.Start();
|
||||
Directory.CreateDirectory("./Data/Resources");
|
||||
Directory.CreateDirectory("./Data/Plugins/Commands");
|
||||
Directory.CreateDirectory("./Data/Plugins/Events");
|
||||
Directory.CreateDirectory("./Data/PAKS");
|
||||
await Config.LoadConfig();
|
||||
if (Config.ContainsKey("DeleteLogsAtStartup"))
|
||||
if (Config.GetValue<bool>("DeleteLogsAtStartup"))
|
||||
foreach (var file in Directory.GetFiles("./Output/Logs/"))
|
||||
File.Delete(file);
|
||||
List<string> OnlineDefaultKeys = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys");
|
||||
|
||||
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 (Config.ContainsKey(s[0])) Config.SetValue(s[0], s[1]);
|
||||
else Config.GetAndAddValueToVariable(s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Functions.WriteErrFile(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
List<string> onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData");
|
||||
main.Stop();
|
||||
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")))
|
||||
{
|
||||
if (Functions.GetOperatingSystem() == PluginManager.Others.OperatingSystem.WINDOWS)
|
||||
{
|
||||
|
||||
string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0.zip";
|
||||
//string url2 = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}-preview/net6.0.zip";
|
||||
Process.Start("./Updater/Updater.exe", $"/update {url} ./DiscordBot.exe ./");
|
||||
}
|
||||
else
|
||||
{
|
||||
string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0_linux.zip";
|
||||
Process.Start("./Updater/Updater", $"/update {url} ./DiscordBot ./");
|
||||
}
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
break;
|
||||
case "UpdaterVersion":
|
||||
string updaternewversion = s[1];
|
||||
if (Config.UpdaterVersion != updaternewversion)
|
||||
{
|
||||
Console.Clear();
|
||||
Console.WriteLine("Installing updater ...\nDo NOT close the bot during update !");
|
||||
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
|
||||
bar.Start();
|
||||
await ServerCom.DownloadFileNoProgressAsync("https://github.com/Wizzy69/installer/releases/download/release-1-discordbot/Updater.zip", "./Updater.zip");
|
||||
await Functions.ExtractArchive("./Updater.zip", "./", null, UnzipProgressType.PercentageFromTotalSize);
|
||||
Config.UpdaterVersion = updaternewversion;
|
||||
File.Delete("Updater.zip");
|
||||
await Config.SaveConfig(SaveType.NORMAL);
|
||||
bar.Stop();
|
||||
Console.Clear();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Console_Utilities.Initialize();
|
||||
await Config.SaveConfig(SaveType.NORMAL);
|
||||
Console.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public class Core
|
||||
{
|
||||
|
||||
public static Dictionary<ulong, string> playerMessages = new Dictionary<ulong, string>();
|
||||
|
||||
private static readonly string folder = @".\Data\Resources\LevelingSystem\";
|
||||
|
||||
public static int GetLevel(ulong id) => int.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[0].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetExp(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[1].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetReqEXP(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[2].Split('=')[1]);
|
||||
public static void SaveData(ulong id, int lv, Int64 cexp, Int64 rexp)
|
||||
{
|
||||
Directory.CreateDirectory(folder);
|
||||
File.WriteAllText(Path.Combine(folder, id.ToString() + ".data"), $"Level={lv},EXP={cexp},REXP={rexp}");
|
||||
}
|
||||
private static Int64 NextLevelXP(int level)
|
||||
{
|
||||
return (level * level) + 2 * level + 75;
|
||||
}
|
||||
|
||||
public static (bool, int) MessageSent(ulong id, int messageLength)
|
||||
{
|
||||
WaitForTimeToRemoveFromList(id, 60);
|
||||
|
||||
if (!File.Exists(Path.Combine(folder, id.ToString() + ".data")))
|
||||
{
|
||||
SaveData(id, 0, 0, 0);
|
||||
}
|
||||
Int64 cEXp = GetExp(id);
|
||||
Int64 rExp = GetReqEXP(id);
|
||||
int random = new System.Random().Next(3, 6) + messageLength;
|
||||
cEXp += random;
|
||||
if (cEXp >= rExp)
|
||||
{
|
||||
cEXp = cEXp - rExp;
|
||||
int lv = GetLevel(id);
|
||||
rExp = NextLevelXP(lv);
|
||||
lv++;
|
||||
SaveData(id, lv, cEXp, rExp);
|
||||
return (true, lv);
|
||||
}
|
||||
|
||||
SaveData(id, GetLevel(id), cEXp, rExp);
|
||||
return (false, -1);
|
||||
}
|
||||
|
||||
public static async void WaitForTimeToRemoveFromList(ulong id, int time_seconds)
|
||||
{
|
||||
await Task.Delay(time_seconds * 1000);
|
||||
playerMessages.Remove(id);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using Discord.WebSocket;
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
public static class Data
|
||||
{
|
||||
private static readonly string folder = @".\Data\Resources\LevelingSystem\";
|
||||
public static void registerPlayer(SocketGuildUser user)
|
||||
{
|
||||
ulong id = user.Id;
|
||||
Directory.CreateDirectory(folder);
|
||||
File.WriteAllText(Path.Combine(folder, id.ToString() + ".data"), "Level=0,EXP=0,REXP=100");
|
||||
}
|
||||
|
||||
public static int GetLevel(ulong id) => int.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[0].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetExp(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[1].Split('=')[1]);
|
||||
|
||||
|
||||
public static Int64 GetReqEXP(ulong id) => Int64.Parse(File.ReadAllText(Path.Combine(folder, id.ToString() + ".data")).Split(',')[2].Split('=')[1]);
|
||||
|
||||
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<OutputPath>..\BUILDS\</OutputPath>
|
||||
<DebugType>none</DebugType>
|
||||
<DebugSymbols>false</DebugSymbols>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,46 +0,0 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Others;
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.LanguageSystem;
|
||||
public class LevelingSystem : DBEvent
|
||||
{
|
||||
public string name => "Leveling System";
|
||||
|
||||
public string description => "Leveling System Event";
|
||||
|
||||
public void Start(DiscordSocketClient client)
|
||||
{
|
||||
client.MessageReceived += Client_MessageReceived;
|
||||
}
|
||||
|
||||
private async Task Client_MessageReceived(SocketMessage arg)
|
||||
{
|
||||
if (arg.Author.IsBot || arg.Attachments.Count > 0 ||
|
||||
arg.Content.StartsWith
|
||||
(
|
||||
Functions.readCodeFromFile
|
||||
(
|
||||
fileName: System.IO.Path.Combine(Functions.dataFolder, "DiscordBotCore.data"),
|
||||
Code: "BOT_PREFIX",
|
||||
separator: '='
|
||||
)
|
||||
)
|
||||
)
|
||||
return;
|
||||
//Console_Utilities.WriteColorText("Message from : " + arg.Author.Username);
|
||||
if (Core.playerMessages.ContainsKey(arg.Author.Id))
|
||||
return;
|
||||
|
||||
(bool x, int lv) = Core.MessageSent(arg.Author.Id, arg.Content.Length);
|
||||
Core.playerMessages.Add(arg.Author.Id, arg.Content);
|
||||
if (x)
|
||||
if (Language.ActiveLanguage != null)
|
||||
await arg.Channel.SendMessageAsync(Language.ActiveLanguage.LanguageWords["DB_EVENT_LEVEL_SYSTEM_LEVEL_UP"].Replace("{0}", lv.ToString()));
|
||||
else await arg.Channel.SendMessageAsync("You've successfully leveled up to level " + lv);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RootNamespace>Holiday_events</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,88 +0,0 @@
|
||||
using Discord.WebSocket;
|
||||
using Discord;
|
||||
using PluginManager.Interfaces;
|
||||
namespace Holiday_events
|
||||
{
|
||||
public class Holiday : DBEvent
|
||||
{
|
||||
public string name => "Holiday Events";
|
||||
|
||||
public string description => "Happy Holiday";
|
||||
|
||||
public async void Start(DiscordSocketClient client)
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
if (DateTime.Today.Hour == 0 && DateTime.Today.Minute == 0)
|
||||
await VerificareData(client);
|
||||
await Task.Delay(1000 * 60-1);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task VerificareData(DiscordSocketClient client)
|
||||
{
|
||||
string day = DateTime.Now.Day.ToString();
|
||||
string month = DateTime.Now.Month.ToString();
|
||||
|
||||
if (day == "1" && month == "1")
|
||||
{
|
||||
EmbedBuilder builder = new EmbedBuilder();
|
||||
builder.Title = "Happy New Year!";
|
||||
builder.Description = $"Make way for {DateTime.Now.Year}!\nNew adventures are around the corner.";
|
||||
builder.ImageUrl = "https://i.imgur.com/AWhxExZ.jpg";
|
||||
builder.Color = Color.Gold;
|
||||
await client.GetGuild(client.Guilds.First().Id).DefaultChannel.SendMessageAsync(embed: builder.Build());
|
||||
|
||||
}
|
||||
else if (day == "1" && month == "5")
|
||||
{
|
||||
EmbedBuilder builder = new EmbedBuilder();
|
||||
builder.Title = "Happy May Day!";
|
||||
builder.Description = " You have worked very hard throughout the year to meet all your goals. Now it is a day to relax and rejoice.\nSending you warm wishes on International Worker’s Day.";
|
||||
builder.ImageUrl = "https://i.imgur.com/SIIwelU.jpeg";
|
||||
builder.Color = Color.LightOrange;
|
||||
await client.GetGuild(client.Guilds.First().Id).DefaultChannel.SendMessageAsync(embed: builder.Build());
|
||||
}
|
||||
else if (day == "25" && month == "12")
|
||||
{
|
||||
EmbedBuilder builder = new EmbedBuilder();
|
||||
builder.Title = "Happy May Day!";
|
||||
builder.Description = "Wishing you and your family health, happiness, peace and prosperity this Christmas and in the coming New Year.";
|
||||
builder.ImageUrl = "https://i.imgur.com/qsDOI4t.jpg";
|
||||
builder.Color = Color.Red;
|
||||
await client.GetGuild(client.Guilds.First().Id).DefaultChannel.SendMessageAsync(embed: builder.Build());
|
||||
|
||||
}
|
||||
else if (day =="1" && month == "12")
|
||||
{
|
||||
EmbedBuilder builder = new EmbedBuilder();
|
||||
builder.Title = "Romania National Day";
|
||||
builder.Description = "I wish the people of Romania a happy national day and peace and prosperity in the year ahead.";
|
||||
builder.ImageUrl = "https://i.imgur.com/vHQnFHp.jpg";
|
||||
builder.Color = Color.Blue;
|
||||
await client.GetGuild(client.Guilds.First().Id).DefaultChannel.SendMessageAsync(embed: builder.Build());
|
||||
}
|
||||
|
||||
else if (day == "8" && month == "3")
|
||||
{
|
||||
EmbedBuilder builder = new EmbedBuilder();
|
||||
builder.Title = "National Womens Day";
|
||||
builder.Description = "Today we celebrate every woman on the planet. You bring so much love and beauty into our world just by being in it, and it makes everyone a little bit happier. The Sun shines brighter when you smile, ladies, so keep smiling! Happy Woman’s Day!";
|
||||
builder.ImageUrl = "https://i.imgur.com/dVzQ3rp.jpg";
|
||||
builder.Color = Color.Red;
|
||||
await client.GetGuild(client.Guilds.First().Id).DefaultChannel.SendMessageAsync(embed: builder.Build());
|
||||
}
|
||||
|
||||
else if (day == "31" && month == "10")
|
||||
{
|
||||
EmbedBuilder builder = new EmbedBuilder();
|
||||
builder.Title = "Happy Halloween";
|
||||
builder.Description = "This October, may your treats be many and your tricks be few. Hope you have a sweet Halloween.";
|
||||
builder.ImageUrl = "https://i.imgur.com/cJf6EgI.jpg";
|
||||
builder.Color = Color.Orange;
|
||||
await client.GetGuild(client.Guilds.First().Id).DefaultChannel.SendMessageAsync(embed: builder.Build());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
using Discord;
|
||||
using Discord.Audio;
|
||||
|
||||
using MusicCommands;
|
||||
|
||||
namespace CMD_Utils.Music
|
||||
{
|
||||
internal static class Data
|
||||
{
|
||||
internal static IAudioClient audioClient = null;
|
||||
internal static IVoiceChannel voiceChannel = null;
|
||||
|
||||
internal static MusicPlayer CurrentlyRunning = null;
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CMD_Utils.Music
|
||||
{
|
||||
class Leave : DBCommand
|
||||
{
|
||||
public string Command => "leave";
|
||||
|
||||
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)
|
||||
{
|
||||
Data.CurrentlyRunning.Stop();
|
||||
Data.CurrentlyRunning = null;
|
||||
await Data.audioClient.StopAsync();
|
||||
await Data.voiceChannel.DisconnectAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>warnings</Nullable>
|
||||
</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>
|
||||
|
||||
</Project>
|
||||
@@ -1,127 +0,0 @@
|
||||
using CMD_Utils.Music;
|
||||
|
||||
using PluginManager.Others;
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MusicCommands
|
||||
{
|
||||
class MusicPlayer
|
||||
{
|
||||
public Stream inputStream { get; private set; } // from FFMPEG
|
||||
public Stream outputStream { get; private set; } // to Voice Channel
|
||||
public MusicPlayer(Stream input, Stream output)
|
||||
{
|
||||
inputStream = input;
|
||||
outputStream = output;
|
||||
}
|
||||
|
||||
public MusicPlayer(Stream output)
|
||||
{
|
||||
inputStream = null;
|
||||
outputStream = output;
|
||||
}
|
||||
|
||||
public bool Paused { get; set; }
|
||||
private bool _stop { get; set; }
|
||||
public void Stop()
|
||||
{
|
||||
_stop = true;
|
||||
}
|
||||
|
||||
public async Task StartSendAudioFromLink(string URL)
|
||||
{
|
||||
|
||||
/* using (HttpClient client = new HttpClient())
|
||||
using (HttpResponseMessage response = await client.GetAsync(URL))
|
||||
using (var content = response.Content)
|
||||
{
|
||||
await (await content.ReadAsStreamAsync()).CopyToAsync(outputStream);
|
||||
}*/
|
||||
|
||||
|
||||
Stream ms = new MemoryStream();
|
||||
int bsize = 512;
|
||||
new Thread(async delegate (object o)
|
||||
{
|
||||
var response = await new HttpClient().GetAsync(URL);
|
||||
using (var stream = await response.Content.ReadAsStreamAsync())
|
||||
{
|
||||
byte[] buffer = new byte[bsize];
|
||||
int read;
|
||||
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
var pos = ms.Position;
|
||||
ms.Position = ms.Length;
|
||||
ms.Write(buffer, 0, read);
|
||||
ms.Position = pos;
|
||||
}
|
||||
}
|
||||
}).Start();
|
||||
Console.Write("Reading data: ");
|
||||
while (ms.Length < bsize * 10)
|
||||
{
|
||||
await Task.Delay(1000);
|
||||
Console.Title = "Reading data: " + ms.Length + " bytes read of " + bsize * 10;
|
||||
Console.Write(".");
|
||||
}
|
||||
Console.WriteLine("\nDone");
|
||||
ms.Position = 0;
|
||||
|
||||
_stop = false;
|
||||
Paused = false;
|
||||
|
||||
while (!_stop)
|
||||
{
|
||||
if (Paused) continue;
|
||||
byte[] buffer = new byte[bsize];
|
||||
int read = await ms.ReadAsync(buffer, 0, buffer.Length);
|
||||
if (read > 0)
|
||||
{
|
||||
await outputStream.WriteAsync(buffer, 0, read);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public async Task StartSendAudio()
|
||||
{
|
||||
Paused = false;
|
||||
_stop = false;
|
||||
while (!_stop)
|
||||
{
|
||||
if (Paused) continue;
|
||||
int bsize = 512;
|
||||
byte[] buffer = new byte[bsize];
|
||||
var bcount = await inputStream.ReadAsync(buffer, 0, bsize);
|
||||
if (bcount <= 0)
|
||||
{
|
||||
Stop();
|
||||
Data.CurrentlyRunning = null;
|
||||
break;
|
||||
}
|
||||
try
|
||||
{
|
||||
await outputStream.WriteAsync(buffer, 0, bcount);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await outputStream.FlushAsync();
|
||||
Functions.WriteLogFile(ex.ToString());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace CMD_Utils.Music
|
||||
{
|
||||
class Pause : DBCommand
|
||||
{
|
||||
public string Command => "pause";
|
||||
|
||||
public string Description => "Pause the music";
|
||||
|
||||
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.CurrentlyRunning.Paused = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
using Discord;
|
||||
using Discord.Audio;
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using MusicCommands;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.Others;
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
namespace CMD_Utils.Music
|
||||
{
|
||||
class Play : DBCommand
|
||||
{
|
||||
public string Command => "fplay";
|
||||
|
||||
public string Description => "Play music from a file";
|
||||
|
||||
public string Usage => "fplay [name]";
|
||||
|
||||
public bool canUseDM => false;
|
||||
|
||||
public bool canUseServer => true;
|
||||
|
||||
public bool requireAdmin => false;
|
||||
|
||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||
{
|
||||
string path = "./Music";
|
||||
string FileName = Functions.GetArguments(message).ToArray().MergeStrings(0);
|
||||
path += "/" + FileName + ".mp3";
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
Console.WriteLine("Unknown path " + path);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel;
|
||||
if (Data.voiceChannel == null) { await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument."); return; }
|
||||
|
||||
Data.audioClient = await Data.voiceChannel.ConnectAsync();
|
||||
|
||||
using (var ffmpeg = CreateStream(path))
|
||||
using (var output = ffmpeg.StandardOutput.BaseStream)
|
||||
using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
||||
{
|
||||
if (Data.CurrentlyRunning != null)
|
||||
Data.CurrentlyRunning.Stop();
|
||||
Data.CurrentlyRunning = new MusicPlayer(output, discord);
|
||||
await Data.CurrentlyRunning.StartSendAudio();
|
||||
}
|
||||
}
|
||||
|
||||
private 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,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
using CMD_Utils.Music;
|
||||
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MusicCommands
|
||||
{
|
||||
class Unpause : DBCommand
|
||||
{
|
||||
public string Command => "unpause";
|
||||
|
||||
public string Description => "Unpause the music";
|
||||
|
||||
public string Usage => "unpause";
|
||||
|
||||
public bool canUseDM => false;
|
||||
|
||||
public bool canUseServer => true;
|
||||
|
||||
public bool requireAdmin => false;
|
||||
|
||||
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||
{
|
||||
Data.CurrentlyRunning.Paused = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
using CMD_Utils.Music;
|
||||
using Discord.Audio;
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
using Discord;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace MusicCommands
|
||||
{
|
||||
class lplay : DBCommand
|
||||
{
|
||||
public string Command => "lplay";
|
||||
|
||||
public string Description => "Play music from a link";
|
||||
|
||||
public string Usage => "lplay [url]";
|
||||
|
||||
public bool canUseDM => false;
|
||||
|
||||
public bool canUseServer => false;
|
||||
|
||||
public bool requireAdmin => false;
|
||||
|
||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
||||
{
|
||||
string URL = message.Content.Split(' ')[1];
|
||||
if (!URL.EndsWith(".mp3") && !URL.EndsWith(".wav") && !URL.EndsWith(".flac") && !URL.EndsWith(".ogg"))
|
||||
{
|
||||
await message.Channel.SendMessageAsync("Invalid URL");
|
||||
return;
|
||||
}
|
||||
|
||||
Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel;
|
||||
if (Data.voiceChannel == null) { await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument."); return; }
|
||||
|
||||
Data.audioClient = await Data.voiceChannel.ConnectAsync();
|
||||
|
||||
using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
||||
{
|
||||
|
||||
|
||||
await message.Channel.SendMessageAsync("Loading...");
|
||||
|
||||
Data.CurrentlyRunning = new MusicPlayer(discord);
|
||||
await Data.CurrentlyRunning.StartSendAudioFromLink(URL);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
using Discord;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
namespace New_User
|
||||
{
|
||||
public class Greeting : DBEvent
|
||||
{
|
||||
public string name =>"Greeting";
|
||||
|
||||
public string description => "Greets new users";
|
||||
|
||||
public void Start(DiscordSocketClient client)
|
||||
{
|
||||
client.UserJoined += async (arg) =>
|
||||
{
|
||||
IGuild? guild = client.Guilds.FirstOrDefault();
|
||||
ITextChannel chn = await guild.GetDefaultChannelAsync();
|
||||
await chn.SendMessageAsync($"A wild {arg.Username} has apperead!");
|
||||
IRole? role = guild.Roles.FirstOrDefault(x => x.Name == "New User");
|
||||
if (role == null)
|
||||
await arg.Guild.CreateRoleAsync("New User", GuildPermissions.None, Color.DarkBlue);
|
||||
await arg.AddRoleAsync(role);
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RootNamespace>New_User</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
239
PluginManager/Config.cs
Normal file
239
PluginManager/Config.cs
Normal file
@@ -0,0 +1,239 @@
|
||||
using System;
|
||||
using PluginManager.Others;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Threading;
|
||||
|
||||
namespace PluginManager
|
||||
{
|
||||
internal class AppConfig
|
||||
{
|
||||
public string UpdaterVersion { get; set; }
|
||||
public Dictionary<string, object>? ApplicationVariables { get; init; }
|
||||
public List<string>? ProtectedKeyWords { get; init; }
|
||||
public Dictionary<string, string>? PluginVersions { get; init; }
|
||||
}
|
||||
|
||||
public static class Config
|
||||
{
|
||||
public static class PluginConfig
|
||||
{
|
||||
public static readonly List<Tuple<string, PluginType>> InstalledPlugins = new();
|
||||
|
||||
public static void Load()
|
||||
{
|
||||
new Thread(LoadCommands).Start();
|
||||
new Thread(LoadEvents).Start();
|
||||
}
|
||||
|
||||
private static void LoadCommands()
|
||||
{
|
||||
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 UpdaterVersion { get => appConfig.UpdaterVersion; set => appConfig.UpdaterVersion = value; }
|
||||
|
||||
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 bool IsReadOnly(string key)
|
||||
{
|
||||
return appConfig.ProtectedKeyWords.Contains(key);
|
||||
}
|
||||
|
||||
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>(), UpdaterVersion = "-1" };
|
||||
}
|
||||
|
||||
public static bool ContainsValue<T>(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!);
|
||||
public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key);
|
||||
|
||||
public static IDictionary<string, object> GetAllVariables() => appConfig.ApplicationVariables;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,10 @@
|
||||
namespace PluginManager.Interfaces
|
||||
{
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Discord.Commands;
|
||||
using Discord.WebSocket;
|
||||
|
||||
namespace PluginManager.Interfaces;
|
||||
|
||||
public interface DBCommand
|
||||
{
|
||||
/// <summary>
|
||||
@@ -8,6 +13,11 @@
|
||||
/// </summary>
|
||||
string Command { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Command aliases. Users may use this to execute the command
|
||||
/// </summary>
|
||||
List<string>? Aliases { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Command description
|
||||
/// </summary>
|
||||
@@ -19,31 +29,20 @@
|
||||
/// </summary>
|
||||
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>
|
||||
/// true if the command requre admin, otherwise false
|
||||
/// </summary>
|
||||
bool requireAdmin { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The main body of the command. This is what is executed when user calls the command
|
||||
/// The main body of the command. This is what is executed when user calls the command in Server
|
||||
/// </summary>
|
||||
/// <param name="context">The disocrd Context</param>
|
||||
/// <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(Discord.Commands.SocketCommandContext context,
|
||||
Discord.WebSocket.SocketMessage message,
|
||||
Discord.WebSocket.DiscordSocketClient client,
|
||||
bool isDM);
|
||||
}
|
||||
void ExecuteServer(SocketCommandContext context) { }
|
||||
|
||||
/// <summary>
|
||||
/// The main body of the command. This is what is executed when user calls the command in DM
|
||||
/// </summary>
|
||||
/// <param name="context">The disocrd Context</param>
|
||||
void ExecuteDM(SocketCommandContext context) { }
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
using Discord.WebSocket;
|
||||
|
||||
namespace PluginManager.Interfaces
|
||||
{
|
||||
namespace PluginManager.Interfaces;
|
||||
|
||||
public interface DBEvent
|
||||
{
|
||||
/// <summary>
|
||||
@@ -20,4 +20,3 @@ namespace PluginManager.Interfaces
|
||||
/// <param name="client">The discord bot client</param>
|
||||
void Start(DiscordSocketClient client);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,69 +1,51 @@
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Loaders;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Discord.WebSocket;
|
||||
using PluginManager.Others;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
namespace PluginManager.Items;
|
||||
|
||||
namespace PluginManager.Items
|
||||
{
|
||||
internal class Command
|
||||
public class Command
|
||||
{
|
||||
/// <summary>
|
||||
/// The author of the command
|
||||
/// </summary>
|
||||
public SocketUser? Author;
|
||||
|
||||
/// <summary>
|
||||
/// The list of arguments
|
||||
/// </summary>
|
||||
public List<string> Arguments { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The command that is executed
|
||||
/// </summary>
|
||||
public string CommandName { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The prefix that is used for the command
|
||||
/// </summary>
|
||||
public char PrefixUsed { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The Command class contructor
|
||||
/// </summary>
|
||||
/// <param name="message">The message that was sent</param>
|
||||
public Command(SocketMessage message)
|
||||
{
|
||||
this.Author = message.Author;
|
||||
string[] data = message.Content.Split(' ');
|
||||
if (data.Length > 1)
|
||||
this.Arguments = new List<string>(data.MergeStrings(1).Split(' '));
|
||||
else this.Arguments = new List<string>();
|
||||
this.CommandName = data[0].Substring(1);
|
||||
this.PrefixUsed = data[0][0];
|
||||
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 Command class contructor
|
||||
/// The list of arguments
|
||||
/// </summary>
|
||||
/// <param name="message">The message string itself</param>
|
||||
/// <param name="hasPrefix">True if the message has a prefix, false if not</param>
|
||||
public Command(string message, bool hasPrefix)
|
||||
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
|
||||
{
|
||||
string[] data = message.Split(' ');
|
||||
|
||||
this.Author = null;
|
||||
this.Arguments = new List<string>(data.MergeStrings(1).Split(' '));
|
||||
this.CommandName = data[0].Substring(1);
|
||||
if (hasPrefix)
|
||||
this.PrefixUsed = data[0][0];
|
||||
else this.PrefixUsed = '\0'; //null
|
||||
}
|
||||
|
||||
}
|
||||
public string CommandName { get; init; }
|
||||
public string Description { get; init; }
|
||||
public string Usage { get; init; }
|
||||
public Action<string[]> Action { get; init; }
|
||||
}
|
||||
468
PluginManager/Items/ConsoleCommandsHandler.cs
Normal file
468
PluginManager/Items/ConsoleCommandsHandler.cs
Normal file
@@ -0,0 +1,468 @@
|
||||
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] == "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(".pak"))
|
||||
File.Move("./" + split[1], "./Data/PAKS/" + split[1], true);
|
||||
else if (split[0].EndsWith(".zip") || split[0].EndsWith(".pkg"))
|
||||
{
|
||||
Console.WriteLine($"Extracting {split[1]} ...");
|
||||
var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);// { Max = 100f, Color = ConsoleColor.Green };
|
||||
bar.Start();
|
||||
await Functions.ExtractArchive("./" + split[1], "./", null, UnzipProgressType.PercentageFromTotalSize);
|
||||
bar.Stop();
|
||||
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;
|
||||
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
|
||||
|
||||
bar.Start();
|
||||
await Config.SaveConfig(SaveType.NORMAL);
|
||||
await Config.SaveConfig(SaveType.BACKUP);
|
||||
await Task.Delay(4000);
|
||||
bar.Stop();
|
||||
Console.WriteLine();
|
||||
await client.StopAsync();
|
||||
await client.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,54 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace PluginManager.Items
|
||||
{
|
||||
public class Spinner
|
||||
{
|
||||
/// <summary>
|
||||
/// True if active, false otherwise
|
||||
/// </summary>
|
||||
public bool isSpinning;
|
||||
|
||||
/// <summary>
|
||||
/// The Spinner constructor
|
||||
/// </summary>
|
||||
public Spinner()
|
||||
{
|
||||
isSpinning = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The method that is called to start spinning the spinner
|
||||
/// </summary>
|
||||
public async void Start()
|
||||
{
|
||||
isSpinning = true;
|
||||
int cnt = 0;
|
||||
|
||||
while (isSpinning)
|
||||
{
|
||||
cnt++;
|
||||
switch (cnt % 4)
|
||||
{
|
||||
case 0: Console.Write("/"); break;
|
||||
case 1: Console.Write("-"); break;
|
||||
case 2: Console.Write("\\"); break;
|
||||
case 3: Console.Write("|"); break;
|
||||
}
|
||||
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
|
||||
await Task.Delay(500);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The method that is called to stop the spinner from spinning
|
||||
/// </summary>
|
||||
public void Stop()
|
||||
{
|
||||
if (!isSpinning)
|
||||
throw new Others.Exceptions.APIException("The spinner was not running", "Stop()");
|
||||
isSpinning = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
using PluginManager.Others;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace PluginManager.LanguageSystem
|
||||
{
|
||||
public class Language
|
||||
{
|
||||
/// <summary>
|
||||
/// The active language
|
||||
/// </summary>
|
||||
public static Language? ActiveLanguage = null;
|
||||
|
||||
private static readonly string LanguageFileExtension = ".lng";
|
||||
|
||||
/// <summary>
|
||||
/// The name of the language
|
||||
/// </summary>
|
||||
public string LanguageName { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The file where the language is imported from
|
||||
/// </summary>
|
||||
public string fileName { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The dictionary of the language
|
||||
/// </summary>
|
||||
public Dictionary<string, string> LanguageWords { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The Language constructor
|
||||
/// </summary>
|
||||
/// <param name="fileName">The file to import the language from</param>
|
||||
/// <param name="words">The dictionary of the language</param>
|
||||
/// <param name="LanguageName">The name of the language</param>
|
||||
private Language(string fileName, Dictionary<string, string> words, string LanguageName)
|
||||
{
|
||||
this.fileName = fileName;
|
||||
this.LanguageName = LanguageName;
|
||||
LanguageWords = words;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load language from file
|
||||
/// </summary>
|
||||
/// <param name="LanguageFileLocation">The file path</param>
|
||||
/// <returns></returns>
|
||||
public static Language? CreateLanguageFromFile(string LanguageFileLocation)
|
||||
{
|
||||
if (!LanguageFileLocation.EndsWith(LanguageFileExtension))
|
||||
{
|
||||
Console.WriteLine("Failed to load language from file: " + LanguageFileLocation +
|
||||
"\nFile extension is not .lng");
|
||||
return null;
|
||||
}
|
||||
|
||||
string[] lines = File.ReadAllLines(LanguageFileLocation);
|
||||
var languageName = "Unknown";
|
||||
var words = new Dictionary<string, string>();
|
||||
|
||||
foreach (string line in lines)
|
||||
{
|
||||
if (line.StartsWith("#") || line.Length < 4)
|
||||
continue;
|
||||
string[] sLine = line.Split('=');
|
||||
|
||||
if (sLine[0] == "LANGUAGE_NAME")
|
||||
{
|
||||
languageName = sLine[1];
|
||||
continue;
|
||||
}
|
||||
|
||||
words.Add(sLine[0], sLine[1]);
|
||||
}
|
||||
|
||||
Functions.WriteLogFile("Successfully loaded language: " + languageName + " from file : " +
|
||||
LanguageFileLocation.Replace('\\', '/'));
|
||||
return new Language(LanguageFileLocation, words, languageName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Format text by inserting parameters
|
||||
/// </summary>
|
||||
/// <param name="text">The raw text</param>
|
||||
/// <param name="args">The arguments</param>
|
||||
/// <returns></returns>
|
||||
public string FormatText(string text, params string[] args)
|
||||
{
|
||||
if (ActiveLanguage == null) return text;
|
||||
int l = args.Length;
|
||||
for (var i = 0; i < l; i++) text = text.Replace($"{i}", args[i]);
|
||||
return text;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace PluginManager.Loaders
|
||||
{
|
||||
internal class CommandsLoader
|
||||
{
|
||||
private readonly string CMDPath;
|
||||
private readonly string CMDExtension;
|
||||
|
||||
|
||||
internal delegate void onCommandLoaded(string name, bool success, DBCommand? command = null, Exception? exception = null);
|
||||
internal delegate void onCommandFileLoaded(string path);
|
||||
|
||||
/// <summary>
|
||||
/// Event fired when a command is loaded
|
||||
/// </summary>
|
||||
internal onCommandLoaded? OnCommandLoaded;
|
||||
|
||||
/// <summary>
|
||||
/// Event fired when the file is loaded
|
||||
/// </summary>
|
||||
internal onCommandFileLoaded? OnCommandFileLoaded;
|
||||
|
||||
/// <summary>
|
||||
/// Command Loader contructor
|
||||
/// </summary>
|
||||
/// <param name="CommandPath">The path to the commands</param>
|
||||
/// <param name="CommandExtension">The extension to search for in the <paramref name="CommandPath"/></param>
|
||||
internal CommandsLoader(string CommandPath, string CommandExtension)
|
||||
{
|
||||
CMDPath = CommandPath;
|
||||
CMDExtension = CommandExtension;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The method that loads all commands
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
internal List<DBCommand>? LoadCommands()
|
||||
{
|
||||
if (!Directory.Exists(CMDPath))
|
||||
{
|
||||
Directory.CreateDirectory(CMDPath);
|
||||
return null;
|
||||
}
|
||||
string[] files = Directory.GetFiles(CMDPath, $"*{CMDExtension}", SearchOption.AllDirectories);
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
Assembly.LoadFile(Path.GetFullPath(file));
|
||||
if (OnCommandFileLoaded != null)
|
||||
OnCommandFileLoaded.Invoke(file);
|
||||
}
|
||||
|
||||
List<DBCommand> plugins = new List<DBCommand>();
|
||||
|
||||
try
|
||||
{
|
||||
Type interfaceType = typeof(DBCommand);
|
||||
Type[] types = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.SelectMany(a => a.GetTypes())
|
||||
.Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
|
||||
.ToArray();
|
||||
foreach (Type type in types)
|
||||
{
|
||||
try
|
||||
{
|
||||
DBCommand plugin = (DBCommand)Activator.CreateInstance(type)!;
|
||||
plugins.Add(plugin);
|
||||
|
||||
if (OnCommandLoaded != null)
|
||||
OnCommandLoaded.Invoke(type.FullName!, true, plugin);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (OnCommandLoaded != null)
|
||||
OnCommandLoaded.Invoke(type.FullName!, false, null, e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
return null;
|
||||
}
|
||||
|
||||
return plugins;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace PluginManager.Loaders
|
||||
{
|
||||
internal class EventsLoader
|
||||
{
|
||||
|
||||
private readonly string EVPath;
|
||||
private readonly string EVExtension;
|
||||
|
||||
internal delegate void onEventLoad(string name, bool success, DBEvent? ev = null, Exception? e = null);
|
||||
internal delegate void onEventFileLoaded(string path);
|
||||
|
||||
/// <summary>
|
||||
/// An event that is fired whenever a <see cref="DBEvent"/> event is loaded in memory
|
||||
/// </summary>
|
||||
internal onEventLoad? EventLoad;
|
||||
|
||||
/// <summary>
|
||||
/// An event that is fired whenever a <see cref="DBEvent"/> event file is loaded
|
||||
/// </summary>
|
||||
internal onEventFileLoaded? EventFileLoaded;
|
||||
|
||||
/// <summary>
|
||||
/// The Event Loader constructor
|
||||
/// </summary>
|
||||
/// <param name="path">The path to all events</param>
|
||||
/// <param name="ext">The extension for events</param>
|
||||
internal EventsLoader(string path, string ext)
|
||||
{
|
||||
EVPath = path;
|
||||
EVExtension = ext;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The method that loads all events
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
internal List<DBEvent>? LoadEvents()
|
||||
{
|
||||
|
||||
if (!Directory.Exists(EVPath))
|
||||
{
|
||||
Directory.CreateDirectory(EVPath);
|
||||
return null;
|
||||
}
|
||||
|
||||
string[] files = Directory.GetFiles(EVPath, $"*{EVExtension}", SearchOption.AllDirectories);
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
Assembly.LoadFile(Path.GetFullPath(file));
|
||||
if (EventFileLoaded != null)
|
||||
EventFileLoaded.Invoke(file);
|
||||
}
|
||||
|
||||
List<DBEvent> events = new List<DBEvent>();
|
||||
|
||||
try
|
||||
{
|
||||
Type interfaceType = typeof(DBEvent);
|
||||
Type[] types = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.SelectMany(a => a.GetTypes())
|
||||
.Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
|
||||
.ToArray();
|
||||
foreach (Type type in types)
|
||||
{
|
||||
try
|
||||
{
|
||||
DBEvent ev = (DBEvent)Activator.CreateInstance(type)!;
|
||||
events.Add(ev);
|
||||
|
||||
if (EventLoad != null)
|
||||
EventLoad.Invoke(type.FullName!, true, ev, null);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (EventLoad != null)
|
||||
EventLoad.Invoke(type.FullName!, false, null, e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
return null;
|
||||
}
|
||||
|
||||
return events;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
112
PluginManager/Loaders/Loader.cs
Normal file
112
PluginManager/Loaders/Loader.cs
Normal file
@@ -0,0 +1,112 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using PluginManager.Online.Updates;
|
||||
using PluginManager.Others;
|
||||
|
||||
namespace PluginManager.Loaders;
|
||||
|
||||
internal class LoaderArgs : EventArgs
|
||||
{
|
||||
internal string? PluginName { get; init; }
|
||||
internal string? TypeName { get; init; }
|
||||
internal bool IsLoaded { get; init; }
|
||||
internal Exception? Exception { get; init; }
|
||||
internal object? Plugin { get; init; }
|
||||
}
|
||||
|
||||
internal class Loader<T>
|
||||
{
|
||||
internal Loader(string path, string extension)
|
||||
{
|
||||
this.path = path;
|
||||
this.extension = extension;
|
||||
}
|
||||
|
||||
|
||||
private string path { get; }
|
||||
private string extension { get; }
|
||||
|
||||
|
||||
internal delegate void FileLoadedEventHandler(LoaderArgs args);
|
||||
|
||||
internal delegate void PluginLoadedEventHandler(LoaderArgs args);
|
||||
|
||||
internal event FileLoadedEventHandler? FileLoaded;
|
||||
|
||||
internal event PluginLoadedEventHandler? PluginLoaded;
|
||||
|
||||
internal List<T>? Load()
|
||||
{
|
||||
var list = new List<T>();
|
||||
if (!Directory.Exists(path))
|
||||
{
|
||||
Directory.CreateDirectory(path);
|
||||
return null;
|
||||
}
|
||||
|
||||
var files = Directory.GetFiles(path, $"*.{extension}", SearchOption.AllDirectories);
|
||||
foreach (var file in files)
|
||||
{
|
||||
|
||||
Assembly.LoadFrom(file);
|
||||
if (FileLoaded != null)
|
||||
{
|
||||
var args = new LoaderArgs
|
||||
{
|
||||
Exception = null,
|
||||
TypeName = nameof(T),
|
||||
IsLoaded = false,
|
||||
PluginName = new FileInfo(file).Name.Split('.')[0],
|
||||
Plugin = null
|
||||
};
|
||||
FileLoaded.Invoke(args);
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var interfaceType = typeof(T);
|
||||
var types = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.SelectMany(a => a.GetTypes())
|
||||
.Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
|
||||
.ToArray();
|
||||
|
||||
|
||||
list.Clear();
|
||||
foreach (var type in types)
|
||||
try
|
||||
{
|
||||
var plugin = (T)Activator.CreateInstance(type)!;
|
||||
list.Add(plugin);
|
||||
|
||||
|
||||
if (PluginLoaded != null)
|
||||
PluginLoaded.Invoke(new LoaderArgs
|
||||
{
|
||||
Exception = null,
|
||||
IsLoaded = true,
|
||||
PluginName = type.FullName,
|
||||
TypeName = nameof(T),
|
||||
Plugin = plugin
|
||||
}
|
||||
);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (PluginLoaded != null) PluginLoaded.Invoke(new LoaderArgs { Exception = ex, IsLoaded = false, PluginName = type.FullName, TypeName = nameof(T) });
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Functions.WriteErrFile(ex.ToString());
|
||||
}
|
||||
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -1,44 +1,31 @@
|
||||
using Discord.WebSocket;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.Online.Helpers;
|
||||
using PluginManager.Online.Updates;
|
||||
using PluginManager.Others;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
namespace PluginManager.Loaders
|
||||
{
|
||||
namespace PluginManager.Loaders;
|
||||
|
||||
public class PluginLoader
|
||||
{
|
||||
private DiscordSocketClient client;
|
||||
public delegate void CMDLoaded(string name, string typeName, bool success, Exception? e = null);
|
||||
|
||||
/// <summary>
|
||||
/// The Plugin Loader constructor
|
||||
/// </summary>
|
||||
/// <param name="discordSocketClient">The discord bot client where the plugins will pe attached to</param>
|
||||
public PluginLoader(DiscordSocketClient discordSocketClient)
|
||||
{
|
||||
this.client = discordSocketClient;
|
||||
}
|
||||
public delegate void EVELoaded(string name, string typeName, bool success, Exception? e = null);
|
||||
|
||||
private const string pluginCMDFolder = @"./Data/Plugins/Commands/";
|
||||
private const string pluginEVEFolder = @"./Data/Plugins/Events/";
|
||||
|
||||
private const string pluginCMDExtension = ".dll";
|
||||
private const string pluginEVEExtension = ".dll";
|
||||
|
||||
/// <summary>
|
||||
/// A list of <see cref="DBCommand"/> commands
|
||||
/// </summary>
|
||||
public static List<DBCommand>? Plugins { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A list of <see cref="DBEvent"/> commands
|
||||
/// </summary>
|
||||
public static List<DBEvent>? Events { get; set; }
|
||||
|
||||
|
||||
public delegate void CMDLoaded(string name, string typeName, bool success, Exception? e = null);
|
||||
public delegate void EVELoaded(string name, string typeName, bool success, Exception? e = null);
|
||||
internal const string pluginCMDExtension = "dll";
|
||||
internal const string pluginEVEExtension = "dll";
|
||||
private readonly DiscordSocketClient _client;
|
||||
|
||||
/// <summary>
|
||||
/// Event that is fired when a <see cref="DBCommand" /> is successfully loaded into commands list
|
||||
@@ -50,62 +37,124 @@ namespace PluginManager.Loaders
|
||||
/// </summary>
|
||||
public EVELoaded? onEVELoad;
|
||||
|
||||
/// <summary>
|
||||
/// The Plugin Loader constructor
|
||||
/// </summary>
|
||||
/// <param name="discordSocketClient">The discord bot client where the plugins will pe attached to</param>
|
||||
public PluginLoader(DiscordSocketClient discordSocketClient)
|
||||
{
|
||||
_client = discordSocketClient;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A list of <see cref="DBCommand" /> commands
|
||||
/// </summary>
|
||||
public static List<DBCommand>? Commands { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A list of <see cref="DBEvent" /> commands
|
||||
/// </summary>
|
||||
public static List<DBEvent>? Events { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The main mathod that is called to load all events
|
||||
/// </summary>
|
||||
public 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");
|
||||
|
||||
Plugins = new List<DBCommand>();
|
||||
if (await PluginUpdater.CheckForUpdates(name))
|
||||
await PluginUpdater.Download(name);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//Check for updates in events
|
||||
foreach (var file in Directory.GetFiles("./Data/Plugins/Events", $"*.{pluginEVEExtension}", SearchOption.AllDirectories))
|
||||
{
|
||||
await Task.Run(async () =>
|
||||
{
|
||||
string name = new FileInfo(file).Name.Split('.')[0];
|
||||
if (!Config.PluginVersionsContainsKey(name))
|
||||
Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0");
|
||||
|
||||
if (await PluginUpdater.CheckForUpdates(name))
|
||||
await PluginUpdater.Download(name);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
//Save the new config file (after the updates)
|
||||
await Config.SaveConfig(SaveType.NORMAL);
|
||||
|
||||
|
||||
//Load all plugins
|
||||
|
||||
Commands = new List<DBCommand>();
|
||||
Events = new List<DBEvent>();
|
||||
|
||||
Functions.WriteLogFile("Starting plugin loader ... Client: " + client.CurrentUser.Username);
|
||||
if (LanguageSystem.Language.ActiveLanguage != null)
|
||||
Console_Utilities.WriteColorText(
|
||||
LanguageSystem.Language.ActiveLanguage.FormatText(
|
||||
LanguageSystem.Language.ActiveLanguage.LanguageWords["PLUGIN_LOADING_START"]
|
||||
)
|
||||
);
|
||||
Functions.WriteLogFile("Starting plugin loader ... Client: " + _client.CurrentUser.Username);
|
||||
Console.WriteLine("Loading plugins");
|
||||
|
||||
//Load commands
|
||||
CommandsLoader CMDLoader = new CommandsLoader(pluginCMDFolder, pluginCMDExtension);
|
||||
CMDLoader.OnCommandLoaded += OnCommandLoaded!;
|
||||
CMDLoader.OnCommandFileLoaded += OnCommandFileLoaded;
|
||||
Plugins = CMDLoader.LoadCommands();
|
||||
var commandsLoader = new Loader<DBCommand>(pluginCMDFolder, pluginCMDExtension);
|
||||
var eventsLoader = new Loader<DBEvent>(pluginEVEFolder, pluginEVEExtension);
|
||||
|
||||
commandsLoader.FileLoaded += OnCommandFileLoaded;
|
||||
commandsLoader.PluginLoaded += OnCommandLoaded;
|
||||
|
||||
//Load Events
|
||||
EventsLoader EVLoader = new EventsLoader(pluginEVEFolder, pluginEVEExtension);
|
||||
EVLoader.EventLoad += OnEventLoaded!;
|
||||
EVLoader.EventFileLoaded += EventFileLoaded;
|
||||
Events = EVLoader.LoadEvents();
|
||||
eventsLoader.FileLoaded += EventFileLoaded;
|
||||
eventsLoader.PluginLoaded += OnEventLoaded;
|
||||
|
||||
Commands = commandsLoader.Load();
|
||||
Events = eventsLoader.Load();
|
||||
|
||||
}
|
||||
|
||||
private void EventFileLoaded(string path)
|
||||
private void EventFileLoaded(LoaderArgs e)
|
||||
{
|
||||
if (path != null)
|
||||
Functions.WriteLogFile($"[EVENT] Event from file [{path}] has been successfully created !");
|
||||
if (!e.IsLoaded)
|
||||
{
|
||||
Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !");
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCommandFileLoaded(string path)
|
||||
private void OnCommandFileLoaded(LoaderArgs e)
|
||||
{
|
||||
if (path != null)
|
||||
Functions.WriteLogFile($"[CMD] Command from file [{path}] has been successfully loaded !");
|
||||
if (!e.IsLoaded)
|
||||
{
|
||||
Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !");
|
||||
}
|
||||
}
|
||||
|
||||
private void OnEventLoaded(string typename, bool success, DBEvent eve, Exception exception)
|
||||
private void OnEventLoaded(LoaderArgs e)
|
||||
{
|
||||
if (eve != null && success)
|
||||
eve.Start(client);
|
||||
if (onEVELoad != null)
|
||||
onEVELoad.Invoke(eve!.name, typename, success, exception);
|
||||
try
|
||||
{
|
||||
if (e.IsLoaded)
|
||||
((DBEvent)e.Plugin!).Start(_client);
|
||||
|
||||
onEVELoad?.Invoke(((DBEvent)e.Plugin!).name, e.TypeName!, e.IsLoaded, e.Exception);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.ToString());
|
||||
Console.WriteLine("Plugin: " + e.PluginName);
|
||||
Console.WriteLine("Type: " + e.TypeName);
|
||||
Console.WriteLine("IsLoaded: " + e.IsLoaded);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCommandLoaded(string name, bool success, DBCommand command, Exception exception)
|
||||
private void OnCommandLoaded(LoaderArgs e)
|
||||
{
|
||||
if (onCMDLoad != null)
|
||||
onCMDLoad.Invoke(command.Command, name, success, exception);
|
||||
}
|
||||
onCMDLoad?.Invoke(((DBCommand)e.Plugin!).Command, e.TypeName!, e.IsLoaded, e.Exception);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,21 +18,19 @@ namespace PluginManager.Online.Helpers
|
||||
/// <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, CancellationToken cancellation = default)
|
||||
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))
|
||||
using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation))
|
||||
{
|
||||
var contentLength = response.Content.Headers.ContentLength;
|
||||
|
||||
using (var download = await response.Content.ReadAsStreamAsync())
|
||||
using (var download = await response.Content.ReadAsStreamAsync(cancellation))
|
||||
{
|
||||
|
||||
// Ignore progress reporting when no progress reporter was
|
||||
// passed or when the content length is unknown
|
||||
if (progress == null || !contentLength.HasValue)
|
||||
{
|
||||
await download.CopyToAsync(destination);
|
||||
await download.CopyToAsync(destination, cancellation);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -40,10 +38,12 @@ namespace PluginManager.Online.Helpers
|
||||
var relativeProgress = new Progress<long>(totalBytes =>
|
||||
{
|
||||
progress.Report((float)totalBytes / contentLength.Value * 100);
|
||||
downloadedBytes.Report(totalBytes);
|
||||
});
|
||||
downloadedBytes?.Report(totalBytes);
|
||||
}
|
||||
);
|
||||
|
||||
// Use extension method to report progress while downloading
|
||||
await download.CopyToOtherStreamAsync(destination, 81920, relativeProgress, cancellation);
|
||||
await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation);
|
||||
progress.Report(1);
|
||||
}
|
||||
}
|
||||
@@ -57,10 +57,11 @@ namespace PluginManager.Online.Helpers
|
||||
/// <returns></returns>
|
||||
internal static async Task<string> DownloadStringAsync(string url, CancellationToken cancellation = default)
|
||||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
return await client.GetStringAsync(url);
|
||||
}
|
||||
}
|
||||
using var client = new HttpClient();
|
||||
return await client.GetStringAsync(url, cancellation);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
91
PluginManager/Online/Helpers/VersionString.cs
Normal file
91
PluginManager/Online/Helpers/VersionString.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using PluginManager.Others;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using System.Linq;
|
||||
|
||||
namespace PluginManager.Online.Helpers
|
||||
{
|
||||
public class VersionString
|
||||
{
|
||||
public int PackageVersionID;
|
||||
public int PackageMainVersion;
|
||||
public int PackageCheckVersion;
|
||||
|
||||
public VersionString(string version)
|
||||
{
|
||||
string[] data = version.Split('.');
|
||||
try
|
||||
{
|
||||
PackageVersionID = int.Parse(data[0]);
|
||||
PackageMainVersion = int.Parse(data[1]);
|
||||
PackageCheckVersion = int.Parse(data[2]);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception("Failed to write Version", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region operators
|
||||
public static bool operator >(VersionString s1, VersionString s2)
|
||||
{
|
||||
if (s1.PackageVersionID > s2.PackageVersionID) return true;
|
||||
if (s1.PackageVersionID == s2.PackageVersionID)
|
||||
{
|
||||
if (s1.PackageMainVersion > s2.PackageMainVersion) return true;
|
||||
if (s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion > s2.PackageCheckVersion) return true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public static bool operator <(VersionString s1, VersionString s2) => !(s1 > s2) && s1 != s2;
|
||||
|
||||
public static bool operator ==(VersionString s1, VersionString s2)
|
||||
{
|
||||
if (s1.PackageVersionID == s2.PackageVersionID && s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion == s2.PackageCheckVersion) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool operator !=(VersionString s1, VersionString s2) => !(s1 == s2);
|
||||
|
||||
public static bool operator <=(VersionString s1, VersionString s2) => (s1 < s2 || s1 == s2);
|
||||
public static bool operator >=(VersionString s1, VersionString s2) => (s1 > s2 || s1 == s2);
|
||||
|
||||
#endregion
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return "{PackageID: " + PackageVersionID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}";
|
||||
}
|
||||
|
||||
public string ToShortString()
|
||||
{
|
||||
if (PackageVersionID == 0 && PackageCheckVersion == 0 && PackageMainVersion == 0)
|
||||
return "Unknown";
|
||||
return $"{PackageVersionID}.{PackageMainVersion}.{PackageCheckVersion}";
|
||||
}
|
||||
|
||||
public static VersionString? GetVersionOfPackage(string pakName)
|
||||
{
|
||||
if (!Config.PluginVersionsContainsKey(pakName))
|
||||
return null;
|
||||
return new VersionString(Config.GetPluginVersion(pakName));
|
||||
}
|
||||
|
||||
public static async Task<VersionString?> GetVersionOfPackageFromWeb(string pakName)
|
||||
{
|
||||
string url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions";
|
||||
List<string> data = await ServerCom.ReadTextFromURL(url);
|
||||
string? version = (from item in data
|
||||
where !item.StartsWith("#") && item.StartsWith(pakName)
|
||||
select item.Split(',')[1]).FirstOrDefault();
|
||||
if (version == default || version == null) return null;
|
||||
return new VersionString(version);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Net;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using PluginManager.Others;
|
||||
|
||||
namespace PluginManager.Online
|
||||
{
|
||||
public class LanguageManager
|
||||
{
|
||||
private string link;
|
||||
|
||||
/// <summary>
|
||||
/// The Language Manager constructor
|
||||
/// </summary>
|
||||
/// <param name="link">The link to where all the languages for the bot are stored</param>
|
||||
public LanguageManager(string link) => this.link = link;
|
||||
|
||||
/// <summary>
|
||||
/// The method to list all languages
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task ListAllLanguages()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
List<string> list = await ServerCom.ReadTextFromFile(link);
|
||||
string[] lines = list.ToArray();
|
||||
|
||||
List<string[]> info = new List<string[]>();
|
||||
info.Add(new string[] { "-", "-" });
|
||||
info.Add(new string[] { "Language Name", "File Size" });
|
||||
info.Add(new string[] { "-", "-" });
|
||||
foreach (var line in lines)
|
||||
{
|
||||
if (line.Length <= 2) continue;
|
||||
string[] d = line.Split(',');
|
||||
if (d[3].Contains("cp") || d[3].Contains("CrossPlatform"))
|
||||
info.Add(new string[] { d[0], d[1] });
|
||||
}
|
||||
info.Add(new string[] { "-", "-" });
|
||||
Console_Utilities.FormatAndAlignTable(info);
|
||||
}
|
||||
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine("Failed to execute command: listlang\nReason: " + exception.Message);
|
||||
Others.Functions.WriteErrFile(exception.ToString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A function that gets the download link for specified language
|
||||
/// </summary>
|
||||
/// <param name="langName">The name of the language</param>
|
||||
/// <returns></returns>
|
||||
public async Task<string[]?> GetDownloadLink(string langName)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<string> list = await ServerCom.ReadTextFromFile(link);
|
||||
string[] lines = list.ToArray();
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
if (line.Length <= 2) continue;
|
||||
string[] d = line.Split(',');
|
||||
if (d[0].Equals(langName) && (d[3].Contains("cp") || d[3].Contains("CrossPlatform")))
|
||||
return new string[] { d[2], d[3] };
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine("Failed to execute command: listlang\nReason: " + exception.Message);
|
||||
Others.Functions.WriteErrFile(exception.ToString());
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,16 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using PluginManager.Online.Helpers;
|
||||
using PluginManager.Others;
|
||||
|
||||
namespace PluginManager.Online
|
||||
{
|
||||
using OperatingSystem = PluginManager.Others.OperatingSystem;
|
||||
|
||||
namespace PluginManager.Online;
|
||||
|
||||
public class PluginsManager
|
||||
{
|
||||
/// <summary>
|
||||
/// The URL of the server
|
||||
/// </summary>
|
||||
public string PluginsLink { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The Plugin Manager constructor
|
||||
/// </summary>
|
||||
@@ -24,6 +20,11 @@ namespace PluginManager.Online
|
||||
PluginsLink = link;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The URL of the server
|
||||
/// </summary>
|
||||
public string PluginsLink { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The method to load all plugins
|
||||
/// </summary>
|
||||
@@ -32,60 +33,64 @@ namespace PluginManager.Online
|
||||
{
|
||||
try
|
||||
{
|
||||
List<string> list = await ServerCom.ReadTextFromFile(PluginsLink);
|
||||
string[] lines = list.ToArray();
|
||||
var list = await ServerCom.ReadTextFromURL(PluginsLink);
|
||||
var lines = list.ToArray();
|
||||
|
||||
List<string[]> data = new List<string[]>();
|
||||
var data = new List<string[]>();
|
||||
var op = Functions.GetOperatingSystem();
|
||||
|
||||
int len = lines.Length;
|
||||
string[] titles = { "Name", "Description", "Plugin Type", "Libraries" };
|
||||
data.Add(new string[] { "-", "-", "-", "-" });
|
||||
var len = lines.Length;
|
||||
string[] titles = { "Name", "Description", "Type", "Version", "Installed" };
|
||||
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||
data.Add(titles);
|
||||
data.Add(new string[] { "-", "-", "-", "-" });
|
||||
for (int i = 0; i < len; i++)
|
||||
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||
for (var i = 0; i < len; i++)
|
||||
{
|
||||
if (lines[i].Length <= 2) continue;
|
||||
string[] content = lines[i].Split(',');
|
||||
string[] display = new string[4];
|
||||
if (op == Others.OperatingSystem.WINDOWS)
|
||||
if (lines[i].Length <= 2)
|
||||
continue;
|
||||
var content = lines[i].Split(',');
|
||||
var display = new string[titles.Length];
|
||||
if (op == OperatingSystem.WINDOWS)
|
||||
{
|
||||
if (content[4].Contains("Windows"))
|
||||
{
|
||||
display[0] = content[0];
|
||||
display[1] = content[1];
|
||||
display[2] = content[2];
|
||||
if (content.Length == 6 && (content[5] != null || content[5].Length > 2))
|
||||
display[3] = ((await ServerCom.ReadTextFromFile(content[5])).Count + 1).ToString();
|
||||
|
||||
else display[3] = "1";
|
||||
display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString();
|
||||
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
||||
display[4] = "✓";
|
||||
else
|
||||
display[4] = "X";
|
||||
data.Add(display);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (op == Others.OperatingSystem.LINUX)
|
||||
else if (op == OperatingSystem.LINUX)
|
||||
{
|
||||
if (content[4].Contains("Linux"))
|
||||
{
|
||||
display[0] = content[0];
|
||||
display[1] = content[1];
|
||||
display[2] = content[2];
|
||||
display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString();
|
||||
if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0]))
|
||||
display[4] = "✓";
|
||||
else
|
||||
display[4] = "X";
|
||||
data.Add(display);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data.Add(new string[] { "-", "-", "-", "-" });
|
||||
data.Add(new[] { "-", "-", "-", "-", "-" });
|
||||
|
||||
Console_Utilities.FormatAndAlignTable(data);
|
||||
Console_Utilities.FormatAndAlignTable(data, TableFormat.CENTER_EACH_COLUMN_BASED);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine("Failed to execute command: listlang\nReason: " + exception.Message);
|
||||
Others.Functions.WriteErrFile(exception.ToString());
|
||||
Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message);
|
||||
Functions.WriteErrFile(exception.ToString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -97,32 +102,28 @@ namespace PluginManager.Online
|
||||
{
|
||||
try
|
||||
{
|
||||
List<string> list = await ServerCom.ReadTextFromFile(PluginsLink);
|
||||
string[] lines = list.ToArray();
|
||||
int len = lines.Length;
|
||||
for (int i = 0; i < len; i++)
|
||||
var list = await ServerCom.ReadTextFromURL(PluginsLink);
|
||||
var lines = list.ToArray();
|
||||
var len = lines.Length;
|
||||
for (var i = 0; i < len; i++)
|
||||
{
|
||||
string[] contents = lines[i].Split(',');
|
||||
var contents = lines[i].Split(',');
|
||||
if (contents[0] == name)
|
||||
{
|
||||
if (contents.Length == 6)
|
||||
return new string[] { contents[2], contents[3], contents[5] };
|
||||
else if (contents.Length == 5)
|
||||
return new string[] { contents[2], contents[3], string.Empty };
|
||||
else throw new Exception("Failed to download plugin. Invalid Argument Length");
|
||||
return new[] { contents[2], contents[3], contents[5] };
|
||||
if (contents.Length == 5)
|
||||
return new[] { contents[2], contents[3], string.Empty };
|
||||
throw new Exception("Failed to download plugin. Invalid Argument Length");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message);
|
||||
Others.Functions.WriteErrFile(exception.ToString());
|
||||
Functions.WriteErrFile(exception.ToString());
|
||||
}
|
||||
|
||||
return new string[] { null!, null!, null! };
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
using PluginManager.Online.Helpers;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using PluginManager.Others;
|
||||
|
||||
namespace PluginManager.Online
|
||||
{
|
||||
public class ServerCom
|
||||
public static class ServerCom
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 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>> ReadTextFromFile(string link)
|
||||
public static async Task<List<string>> ReadTextFromURL(string link)
|
||||
{
|
||||
string response = await OnlineFunctions.DownloadStringAsync(link);
|
||||
string[] lines = response.Split('\n');
|
||||
@@ -30,7 +30,7 @@ namespace PluginManager.Online
|
||||
/// <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)
|
||||
public static async Task DownloadFileAsync(string URL, string location, IProgress<float> progress, IProgress<long>? downloadedBytes = null)
|
||||
{
|
||||
using (var client = new System.Net.Http.HttpClient())
|
||||
{
|
||||
@@ -52,40 +52,38 @@ namespace PluginManager.Online
|
||||
public static async Task DownloadFileAsync(string URL, string location)
|
||||
{
|
||||
bool isDownloading = true;
|
||||
int c_progress = 0;
|
||||
float c_progress = 0;
|
||||
|
||||
//long m_dwBytes = 0;
|
||||
Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, NoColor = true };
|
||||
|
||||
Others.Console_Utilities.ProgressBar pbar = new Others.Console_Utilities.ProgressBar(100, "");
|
||||
IProgress<float> progress = new Progress<float>(percent => { c_progress = percent; });
|
||||
|
||||
IProgress<float> progress = new Progress<float>(percent =>
|
||||
{
|
||||
c_progress = (int)percent;
|
||||
});
|
||||
|
||||
IProgress<long> progress_downloaded = new Progress<long>(downloadedBytes =>
|
||||
{
|
||||
//m_dwBytes = downloadedBytes;
|
||||
});
|
||||
|
||||
Task updateProgressBarTask = new Task(async () =>
|
||||
Task updateProgressBarTask = new Task(() =>
|
||||
{
|
||||
while (isDownloading)
|
||||
{
|
||||
pbar.Update(c_progress);
|
||||
if (c_progress == 100)
|
||||
if (c_progress == 100f)
|
||||
break;
|
||||
System.Threading.Thread.Sleep(500);
|
||||
Thread.Sleep(500);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
new System.Threading.Thread(updateProgressBarTask.Start).Start();
|
||||
await DownloadFileAsync(URL, location, progress, progress_downloaded);
|
||||
new Thread(updateProgressBarTask.Start).Start();
|
||||
await DownloadFileAsync(URL, location, progress);
|
||||
|
||||
|
||||
c_progress = pbar.Max;
|
||||
pbar.Update(100f);
|
||||
isDownloading = false;
|
||||
c_progress = 100;
|
||||
pbar.Update(100);
|
||||
}
|
||||
public static async Task DownloadFileNoProgressAsync(string URL, string location)
|
||||
{
|
||||
IProgress<float> progress = new Progress<float>();
|
||||
await DownloadFileAsync(URL, location, progress);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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()}";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,8 @@
|
||||
using System.Threading.Tasks;
|
||||
using Discord;
|
||||
|
||||
using System.Threading.Tasks;
|
||||
namespace PluginManager.Others;
|
||||
|
||||
namespace PluginManager.Others
|
||||
{
|
||||
/// <summary>
|
||||
/// A class that handles the sending of messages to the user.
|
||||
/// </summary>
|
||||
@@ -14,29 +13,48 @@ namespace PluginManager.Others
|
||||
/// </summary>
|
||||
/// <param name="server">The server</param>
|
||||
/// <param name="name">The channel name</param>
|
||||
/// <returns><see cref="IGuildChannel"/></returns>
|
||||
public static IGuildChannel GetTextChannel(this IGuild server, string name) => server.GetTextChannel(name);
|
||||
/// <returns>
|
||||
/// <see cref="IGuildChannel" />
|
||||
/// </returns>
|
||||
public static IGuildChannel GetTextChannel(this IGuild server, string name)
|
||||
{
|
||||
return server.GetTextChannel(name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the voice channel by name from server
|
||||
/// </summary>
|
||||
/// <param name="server">The server</param>
|
||||
/// <param name="name">The channel name</param>
|
||||
/// <returns><see cref="IGuildChannel"/></returns>
|
||||
public static IGuildChannel GetVoiceChannel(this IGuild server, string name) => server.GetVoiceChannel(name);
|
||||
/// <returns>
|
||||
/// <see cref="IGuildChannel" />
|
||||
/// </returns>
|
||||
public static IGuildChannel GetVoiceChannel(this IGuild server, string name)
|
||||
{
|
||||
return server.GetVoiceChannel(name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the DM channel between <see cref="Discord.WebSocket.DiscordSocketClient" /> and <see cref="IGuildUser" />
|
||||
/// </summary>
|
||||
/// <param name="user"></param>
|
||||
/// <returns><see cref="IDMChannel"/></returns>
|
||||
public static async Task<IDMChannel> GetDMChannel(IGuildUser user) => await user.CreateDMChannelAsync();
|
||||
/// <returns>
|
||||
/// <see cref="IDMChannel" />
|
||||
/// </returns>
|
||||
public static async Task<IDMChannel> GetDMChannel(IGuildUser user)
|
||||
{
|
||||
return await user.CreateDMChannelAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the channel where the message was sent
|
||||
/// </summary>
|
||||
/// <param name="message">The message</param>
|
||||
/// <returns><see cref="IChannel"/></returns>
|
||||
public static IChannel GetChannel(IMessage message) => message.Channel;
|
||||
|
||||
/// <returns>
|
||||
/// <see cref="IChannel" />
|
||||
/// </returns>
|
||||
public static IChannel GetChannel(IMessage message)
|
||||
{
|
||||
return message.Channel;
|
||||
}
|
||||
}
|
||||
@@ -1,36 +1,115 @@
|
||||
using System;
|
||||
using Discord;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace PluginManager.Others
|
||||
{
|
||||
public class Console_Utilities
|
||||
public static class Console_Utilities
|
||||
{
|
||||
public static void Initialize()
|
||||
{
|
||||
if (!Config.ContainsKey("TableVariables"))
|
||||
Config.AddValueToVariables("TableVariables", new Dictionary<string, string> { { "DefaultSpace", "3" } }, false);
|
||||
if (!Config.ContainsKey("ColorDataBase"))
|
||||
Config.AddValueToVariables("ColorDataBase", new Dictionary<char, ConsoleColor>()
|
||||
{
|
||||
{ 'g', ConsoleColor.Green },
|
||||
{ 'b', ConsoleColor.Blue },
|
||||
{ 'r', ConsoleColor.Red },
|
||||
{ 'm', ConsoleColor.Magenta },
|
||||
{ 'y', ConsoleColor.Yellow },
|
||||
}, false
|
||||
);
|
||||
|
||||
if (!Config.ContainsKey("ColorPrefix"))
|
||||
Config.AddValueToVariables("ColorPrefix", '&', false);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Progress bar object
|
||||
/// </summary>
|
||||
public class ProgressBar
|
||||
{
|
||||
public int Progress { get; set; }
|
||||
public int Max { get; set; }
|
||||
public string Message { get; set; }
|
||||
|
||||
public ProgressBar(int max, string message)
|
||||
public ProgressBar(ProgressBarType type)
|
||||
{
|
||||
Max = max;
|
||||
Message = message;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public async void Update(int progress, double speed = -1, string? unit = null)
|
||||
{
|
||||
public float Max { get; init; }
|
||||
public ConsoleColor Color { get; init; }
|
||||
public bool NoColor { get; init; }
|
||||
public ProgressBarType type { get; set; }
|
||||
|
||||
//progress bar
|
||||
private int BarLength = 32;
|
||||
private int position = 1;
|
||||
private bool positive = true;
|
||||
|
||||
private bool isRunning;
|
||||
|
||||
public async void Start()
|
||||
{
|
||||
if (type != ProgressBarType.NO_END)
|
||||
throw new Exception("Only NO_END progress bar can use this method");
|
||||
if (isRunning)
|
||||
throw new Exception("This progress bar is already running");
|
||||
|
||||
isRunning = true;
|
||||
while (isRunning)
|
||||
{
|
||||
UpdateNoEnd();
|
||||
await System.Threading.Tasks.Task.Delay(100);
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
if (type != ProgressBarType.NO_END)
|
||||
throw new Exception("Only NO_END progress bar can use this method");
|
||||
if (!isRunning)
|
||||
throw new Exception("Can not stop a progressbar that did not start");
|
||||
isRunning = false;
|
||||
}
|
||||
|
||||
public void Update(float progress)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case ProgressBarType.NORMAL:
|
||||
UpdateNormal(progress);
|
||||
return;
|
||||
case ProgressBarType.NO_END:
|
||||
if (progress <= 99.9f)
|
||||
UpdateNoEnd();
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateNoEnd()
|
||||
{
|
||||
Console.CursorLeft = 0;
|
||||
Console.Write("[");
|
||||
Console.CursorLeft = 32;
|
||||
for (int i = 1; i <= position; i++)
|
||||
Console.Write(" ");
|
||||
Console.Write("<==()==>");
|
||||
position += positive ? 1 : -1;
|
||||
for (int i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++)
|
||||
Console.Write(" ");
|
||||
Console.Write("]");
|
||||
|
||||
|
||||
if (position == BarLength - 1 || position == 1)
|
||||
positive = !positive;
|
||||
}
|
||||
|
||||
private void UpdateNormal(float progress)
|
||||
{
|
||||
Console.CursorLeft = 0;
|
||||
Console.Write("[");
|
||||
Console.CursorLeft = BarLength;
|
||||
Console.Write("]");
|
||||
Console.CursorLeft = 1;
|
||||
float onechunk = 30.0f / Max;
|
||||
@@ -39,38 +118,38 @@ namespace PluginManager.Others
|
||||
|
||||
for (int i = 0; i < onechunk * progress; i++)
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.Green;
|
||||
Console.BackgroundColor = NoColor ? ConsoleColor.Black : this.Color;
|
||||
Console.CursorLeft = position++;
|
||||
Console.Write(" ");
|
||||
Console.Write("#");
|
||||
}
|
||||
|
||||
for (int i = position; i <= 31; i++)
|
||||
for (int i = position; i < BarLength; i++)
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.Gray;
|
||||
Console.BackgroundColor = NoColor ? ConsoleColor.Black : ConsoleColor.DarkGray;
|
||||
Console.CursorLeft = position++;
|
||||
Console.Write(" ");
|
||||
}
|
||||
|
||||
Console.CursorLeft = 35;
|
||||
Console.CursorLeft = BarLength + 4;
|
||||
Console.BackgroundColor = ConsoleColor.Black;
|
||||
if (speed == -1 || unit == null)
|
||||
{
|
||||
if (progress == Max)
|
||||
Console.Write(progress.ToString() + " % ✓");
|
||||
else Console.Write(progress.ToString() + " % ");
|
||||
}
|
||||
if (progress.CanAproximateTo(Max))
|
||||
Console.Write(progress + " % ✓");
|
||||
else
|
||||
Console.Write(progress.ToString() + $"{speed} {unit}/s ");
|
||||
Console.Write(MathF.Round(progress, 2) + " % ");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static bool CanAproximateTo(this float f, float y) => (MathF.Abs(f - y) < 0.000001);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A way to create a table based on input data
|
||||
/// </summary>
|
||||
/// <param name="data">The List of arrays of strings that represent the rows.</param>
|
||||
public static void FormatAndAlignTable(List<string[]> data)
|
||||
public static void FormatAndAlignTable(List<string[]> data, TableFormat format)
|
||||
{
|
||||
if (format == TableFormat.CENTER_EACH_COLUMN_BASED)
|
||||
{
|
||||
char tableLine = '-';
|
||||
char tableCross = '+';
|
||||
@@ -78,17 +157,17 @@ namespace PluginManager.Others
|
||||
|
||||
int[] len = new int[data[0].Length];
|
||||
foreach (var line in data)
|
||||
{
|
||||
for (int i = 0; i < line.Length; i++)
|
||||
if (line[i].Length > len[i])
|
||||
len[i] = line[i].Length;
|
||||
}
|
||||
|
||||
|
||||
foreach (string[] row in data)
|
||||
{
|
||||
if (row[0][0] == tableLine) Console.Write(tableCross);
|
||||
else Console.Write(tableWall);
|
||||
if (row[0][0] == tableLine)
|
||||
Console.Write(tableCross);
|
||||
else
|
||||
Console.Write(tableWall);
|
||||
for (int l = 0; l < row.Length; l++)
|
||||
{
|
||||
if (row[l][0] == tableLine)
|
||||
@@ -104,7 +183,6 @@ namespace PluginManager.Others
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
int lenHalf = row[l].Length / 2;
|
||||
for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i)
|
||||
Console.Write(" ");
|
||||
@@ -115,44 +193,132 @@ namespace PluginManager.Others
|
||||
Console.Write(" ");
|
||||
}
|
||||
|
||||
if (row[l][0] == tableLine) Console.Write(tableCross);
|
||||
else Console.Write(tableWall);
|
||||
Console.Write(row[l][0] == tableLine ? tableCross : tableWall);
|
||||
}
|
||||
|
||||
Console.WriteLine(); //end line
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static void WriteColorText(string text, bool appendNewLine = true)
|
||||
return;
|
||||
}
|
||||
|
||||
if (format == TableFormat.CENTER_OVERALL_LENGTH)
|
||||
{
|
||||
int maxLen = 0;
|
||||
foreach (string[] row in data)
|
||||
foreach (string s in row)
|
||||
if (s.Length > maxLen)
|
||||
maxLen = s.Length;
|
||||
|
||||
string[] words = text.Split(' ');
|
||||
ConsoleColor fg = Console.ForegroundColor;
|
||||
Dictionary<string, ConsoleColor> colors = new Dictionary<string, ConsoleColor>()
|
||||
int div = (maxLen + 4) / 2;
|
||||
|
||||
foreach (string[] row in data)
|
||||
{
|
||||
{"&g", ConsoleColor.Green },
|
||||
{"&b", ConsoleColor.Blue },
|
||||
{"&r", ConsoleColor.Red },
|
||||
{"&m", ConsoleColor.Magenta },
|
||||
{"&c", fg }
|
||||
};
|
||||
foreach (string word in words)
|
||||
Console.Write("\t");
|
||||
if (row[0] == "-")
|
||||
Console.Write("+");
|
||||
else
|
||||
Console.Write("|");
|
||||
|
||||
foreach (string s in row)
|
||||
{
|
||||
if (word.Length >= 2)
|
||||
if (s == "-")
|
||||
{
|
||||
string prefix = word.Substring(0, 2);
|
||||
if (colors.ContainsKey(prefix))
|
||||
Console.ForegroundColor = colors[prefix];
|
||||
for (int i = 0; i < maxLen + 4; ++i)
|
||||
Console.Write("-");
|
||||
}
|
||||
else if (s.Length == maxLen)
|
||||
{
|
||||
Console.Write(" ");
|
||||
Console.Write(s);
|
||||
Console.Write(" ");
|
||||
}
|
||||
else
|
||||
{
|
||||
int lenHalf = s.Length / 2;
|
||||
for (int i = 0; i < div - lenHalf; ++i)
|
||||
Console.Write(" ");
|
||||
Console.Write(s);
|
||||
for (int i = div + lenHalf + 1; i < maxLen + 4; ++i)
|
||||
Console.Write(" ");
|
||||
if (s.Length % 2 == 0)
|
||||
Console.Write(" ");
|
||||
}
|
||||
|
||||
string m = word.Replace("&g", "").Replace("&b", "").Replace("&r", "").Replace("&c", "").Replace("&m", "");
|
||||
Console.Write(m + " ");
|
||||
}
|
||||
if (appendNewLine)
|
||||
Console.Write('\n');
|
||||
|
||||
Console.ForegroundColor = fg;
|
||||
if (s == "-")
|
||||
Console.Write("+");
|
||||
else
|
||||
Console.Write("|");
|
||||
}
|
||||
|
||||
Console.WriteLine(); //end line
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (format == TableFormat.DEFAULT)
|
||||
{
|
||||
int[] widths = new int[data[0].Length];
|
||||
int space_between_columns = int.Parse(Config.GetValue<Dictionary<string, string>>("TableVariables")?["DefaultSpace"]!);
|
||||
for (int i = 0; i < data.Count; i++)
|
||||
{
|
||||
for (int j = 0; j < data[i].Length; j++)
|
||||
{
|
||||
if (data[i][j].Length > widths[j])
|
||||
widths[j] = data[i][j].Length;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < data.Count; i++)
|
||||
{
|
||||
for (int j = 0; j < data[i].Length; j++)
|
||||
{
|
||||
if (data[i][j] == "-")
|
||||
data[i][j] = " ";
|
||||
Console.Write(data[i][j]);
|
||||
for (int 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)
|
||||
{
|
||||
ConsoleColor initialForeGround = Console.ForegroundColor;
|
||||
char[] input = text.ToCharArray();
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
if (input[i] == Config.GetValue<char>("ColorPrefix"))
|
||||
{
|
||||
if (i + 1 < input.Length)
|
||||
{
|
||||
if (Config.GetValue<Dictionary<char, ConsoleColor>>("ColorDataBase")!.ContainsKey(input[i + 1]))
|
||||
{
|
||||
Console.ForegroundColor = Config.GetValue<Dictionary<char, ConsoleColor>>("ColorDataBase")![input[i + 1]];
|
||||
i++;
|
||||
}
|
||||
else if (input[i + 1] == 'c')
|
||||
{
|
||||
Console.ForegroundColor = initialForeGround;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
Console.Write(input[i]);
|
||||
}
|
||||
|
||||
Console.ForegroundColor = initialForeGround;
|
||||
if (appendNewLineAtEnd)
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace PluginManager.Others
|
||||
{
|
||||
public class Cryptography
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Translate hex to string
|
||||
/// </summary>
|
||||
/// <param name="hexString">The encrypted string</param>
|
||||
/// <returns></returns>
|
||||
public static string FromHexToString(string hexString)
|
||||
{
|
||||
var bytes = new byte[hexString.Length / 2];
|
||||
for (var i = 0; i < bytes.Length; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
|
||||
}
|
||||
|
||||
return System.Text.Encoding.Unicode.GetString(bytes);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Translate string to hex
|
||||
/// </summary>
|
||||
/// <param name="str">The string to encrypt</param>
|
||||
/// <returns></returns>
|
||||
public static string ToHexString(string str)
|
||||
{
|
||||
var sb = new System.Text.StringBuilder();
|
||||
|
||||
var bytes = System.Text.Encoding.Unicode.GetBytes(str);
|
||||
foreach (var t in bytes)
|
||||
{
|
||||
sb.Append(t.ToString("X2"));
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create MD5 hash
|
||||
/// </summary>
|
||||
/// <param name="text">The text to encrypt</param>
|
||||
/// <returns></returns>
|
||||
public static async System.Threading.Tasks.Task<string> CreateMD5(string text)
|
||||
{
|
||||
string output = "";
|
||||
using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
|
||||
{
|
||||
using (var s = GenerateStreamFromString(text))
|
||||
{
|
||||
byte[] t = await md5.ComputeHashAsync(s);
|
||||
output = System.Convert.ToBase64String(t);
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create SHA256 hash
|
||||
/// </summary>
|
||||
/// <param name="text">The text to encrypt</param>
|
||||
/// <returns></returns>
|
||||
public static async System.Threading.Tasks.Task<string> CreateSHA256(string text)
|
||||
{
|
||||
string output = "";
|
||||
using (System.Security.Cryptography.SHA256 sha = System.Security.Cryptography.SHA256.Create())
|
||||
{
|
||||
using (var s = GenerateStreamFromString(text))
|
||||
{
|
||||
byte[] t = await sha.ComputeHashAsync(s);
|
||||
output = System.Convert.ToBase64String(t);
|
||||
}
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
private static System.IO.Stream GenerateStreamFromString(string s)
|
||||
{
|
||||
var stream = new System.IO.MemoryStream();
|
||||
var writer = new System.IO.StreamWriter(stream);
|
||||
writer.Write(s);
|
||||
writer.Flush();
|
||||
stream.Position = 0;
|
||||
return stream;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,36 @@
|
||||
namespace PluginManager.Others
|
||||
{
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace PluginManager.Others;
|
||||
|
||||
/// <summary>
|
||||
/// A list of operating systems
|
||||
/// </summary>
|
||||
public enum OperatingSystem
|
||||
{ WINDOWS, LINUX, MAC_OS, UNKNOWN }
|
||||
{
|
||||
WINDOWS, LINUX, MAC_OS, UNKNOWN
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A list with all errors
|
||||
/// </summary>
|
||||
public enum Error
|
||||
{ UNKNOWN_ERROR, GUILD_NOT_FOUND, STREAM_NOT_FOUND, INVALID_USER, INVALID_CHANNEL, INVALID_PERMISSIONS }
|
||||
{
|
||||
UNKNOWN_ERROR, GUILD_NOT_FOUND, STREAM_NOT_FOUND, INVALID_USER, INVALID_CHANNEL, INVALID_PERMISSIONS
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The output log type
|
||||
/// </summary>
|
||||
public enum OutputLogLevel { NONE, INFO, WARNING, ERROR, CRITICAL }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Plugin Type
|
||||
/// </summary>
|
||||
public enum PluginType { Command, Event, Unknown }
|
||||
|
||||
public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize }
|
||||
|
||||
public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT }
|
||||
|
||||
public enum SaveType { NORMAL, BACKUP }
|
||||
public enum ProgressBarType { NORMAL, NO_END }
|
||||
@@ -1,83 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace PluginManager.Others.Exceptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Custom Exception for PluginManager
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
|
||||
public class APIException : Exception
|
||||
{
|
||||
/// <summary>
|
||||
/// The function where the error occurred
|
||||
/// </summary>
|
||||
public string? Function { get; } = "not specified";
|
||||
|
||||
/// <summary>
|
||||
/// The error code
|
||||
/// </summary>
|
||||
public Error? ErrorCode { get; } = Error.UNKNOWN_ERROR;
|
||||
|
||||
/// <summary>
|
||||
/// The possible cause that determined the error
|
||||
/// </summary>
|
||||
public string? PossibleCause { get; } = "not specified";
|
||||
|
||||
/// <summary>
|
||||
/// The APIException contructor
|
||||
/// </summary>
|
||||
/// <param name="message">The error message</param>
|
||||
/// <param name="function">The function where the message was triggered</param>
|
||||
/// <param name="possible_cause">The possible cause of the error</param>
|
||||
/// <param name="error">The error code</param>
|
||||
public APIException(string message, string? function, string possible_cause, Error error) : base(message)
|
||||
{
|
||||
ErrorCode = error;
|
||||
Function = function;
|
||||
PossibleCause = possible_cause;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The APIException contructor
|
||||
/// </summary>
|
||||
/// <param name="message">The error message</param>
|
||||
/// <param name="function">The function where the message was triggered</param>
|
||||
/// <param name="errorCode">The error code</param>
|
||||
public APIException(string message, string? function, Error? errorCode) : base(message)
|
||||
{
|
||||
ErrorCode = errorCode;
|
||||
Function = function;
|
||||
}
|
||||
/// <summary>
|
||||
/// The APIException contructor
|
||||
/// </summary>
|
||||
/// <param name="message">The error message</param>
|
||||
/// <param name="function">The function where the message was triggered</param>
|
||||
public APIException(string message, string? function) : base(message)
|
||||
{
|
||||
Function = function;
|
||||
}
|
||||
/// <summary>
|
||||
/// The APIException contructor
|
||||
/// </summary>
|
||||
/// <param name="message">The error message</param>
|
||||
public APIException(string message) : base(message)
|
||||
{
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// Method to print the error to <see cref="Console"/>
|
||||
/// </summary>
|
||||
public void Print()
|
||||
{
|
||||
Console.WriteLine("Message Content: " + Message);
|
||||
Console.WriteLine("Function: " + Function);
|
||||
Console.WriteLine("Error Code: " + ErrorCode.ToString());
|
||||
Console.WriteLine("Possible cause: " + PossibleCause);
|
||||
if (this.StackTrace != null)
|
||||
Functions.WriteErrFile(this.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,9 +4,12 @@ using System;
|
||||
using System.Threading.Tasks;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using Discord.WebSocket;
|
||||
using PluginManager.Items;
|
||||
using System.Threading;
|
||||
using System.Text.Json;
|
||||
using System.Text;
|
||||
|
||||
namespace PluginManager.Others
|
||||
{
|
||||
@@ -23,39 +26,23 @@ namespace PluginManager.Others
|
||||
/// <summary>
|
||||
/// The location for all logs
|
||||
/// </summary>
|
||||
public static readonly string logFolder = @"./Output/Logs/";
|
||||
public static readonly string logFolder = @"./Data/Output/Logs/";
|
||||
|
||||
/// <summary>
|
||||
/// The location for all errors
|
||||
/// </summary>
|
||||
public static readonly string errFolder = @"./Output/Errors/";
|
||||
|
||||
/// <summary>
|
||||
/// The location for all languages
|
||||
/// </summary>
|
||||
public static readonly string langFolder = @"./Data/Languages/";
|
||||
public static readonly string errFolder = @"./Data/Output/Errors/";
|
||||
|
||||
/// <summary>
|
||||
/// Archives folder
|
||||
/// </summary>
|
||||
public static readonly string pakFolder = @"./Data/Resources/PAKS/";
|
||||
public static readonly string pakFolder = @"./Data/PAKS/";
|
||||
|
||||
/// <summary>
|
||||
/// The mark that the line is a comment
|
||||
/// Beta testing folder
|
||||
/// </summary>
|
||||
private static readonly char commentMark = '#';
|
||||
public static readonly string betaFolder = @"./Data/BetaTest/";
|
||||
|
||||
/// <summary>
|
||||
/// Read data from file
|
||||
/// </summary>
|
||||
/// <param name="fileName">File name</param>
|
||||
/// <param name="Code">Setting name</param>
|
||||
/// <param name="separator">Separator between setting key code and its value</param>
|
||||
/// <returns>The value of the specified setting key code in the specified file (<see cref="string"/>)</returns>
|
||||
public static string? readCodeFromFile(string fileName, string Code, char separator)
|
||||
=> File.ReadAllLines(fileName)
|
||||
.Where(p => p.StartsWith(Code) && !p.StartsWith(commentMark.ToString()))
|
||||
.First().Split(separator)[1] ?? null;
|
||||
|
||||
/// <summary>
|
||||
/// Read data from a file that is inside an archive (ZIP format)
|
||||
@@ -63,31 +50,41 @@ namespace PluginManager.Others
|
||||
/// <param name="FileName">The file name that is inside the archive or its full path</param>
|
||||
/// <param name="archFile">The archive location from the PAKs folder</param>
|
||||
/// <returns>A string that represents the content of the file or null if the file does not exists or it has no content</returns>
|
||||
public static async Task<string?> ReadFromPakAsync(string FileName, string archFile)
|
||||
public static async Task<string> ReadFromPakAsync(string FileName, string archFile)
|
||||
{
|
||||
archFile = pakFolder + archFile;
|
||||
Directory.CreateDirectory(pakFolder);
|
||||
if (!File.Exists(archFile))
|
||||
throw new FileNotFoundException("Failed to load file !");
|
||||
throw new Exception("Failed to load file !");
|
||||
|
||||
string? textValue = null;
|
||||
var fs = new FileStream(archFile, FileMode.Open);
|
||||
var zip = new ZipArchive(fs, ZipArchiveMode.Read);
|
||||
try
|
||||
{
|
||||
string textValue = null;
|
||||
using (var fs = new FileStream(archFile, FileMode.Open))
|
||||
using (var zip = new ZipArchive(fs, ZipArchiveMode.Read))
|
||||
foreach (var entry in zip.Entries)
|
||||
{
|
||||
if (entry.Name == FileName || entry.FullName == FileName)
|
||||
{
|
||||
Stream s = entry.Open();
|
||||
StreamReader reader = new StreamReader(s);
|
||||
using (Stream s = entry.Open())
|
||||
using (StreamReader reader = new StreamReader(s))
|
||||
{
|
||||
textValue = await reader.ReadToEndAsync();
|
||||
reader.Close();
|
||||
s.Close();
|
||||
fs.Close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return textValue;
|
||||
}
|
||||
catch
|
||||
{
|
||||
await Task.Delay(100);
|
||||
return await ReadFromPakAsync(FileName, archFile);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Write logs to file
|
||||
@@ -95,8 +92,7 @@ namespace PluginManager.Others
|
||||
/// <param name="LogMessage">The message to be wrote</param>
|
||||
public static void WriteLogFile(string LogMessage)
|
||||
{
|
||||
string logsPath = logFolder + "Log.txt";
|
||||
if (!Directory.Exists(logFolder))
|
||||
string logsPath = logFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Log.txt";
|
||||
Directory.CreateDirectory(logFolder);
|
||||
File.AppendAllText(logsPath, LogMessage + " \n");
|
||||
}
|
||||
@@ -107,34 +103,14 @@ namespace PluginManager.Others
|
||||
/// <param name="ErrMessage">The message to be wrote</param>
|
||||
public static void WriteErrFile(string ErrMessage)
|
||||
{
|
||||
string errPath = errFolder + "Error.txt";
|
||||
if (!Directory.Exists(errFolder))
|
||||
string errPath = errFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Error.txt";
|
||||
Directory.CreateDirectory(errFolder);
|
||||
File.AppendAllText(errPath, ErrMessage + " \n");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write to settings file
|
||||
/// </summary>
|
||||
/// <param name="file">The settings file path</param>
|
||||
/// <param name="Code">The Key value of the setting</param>
|
||||
/// <param name="newValue">The new value of the settings</param>
|
||||
/// <param name="separator">The separator between the key and the value</param>
|
||||
public static void WriteToSettings(string file, string Code, string newValue, char separator)
|
||||
public static void WriteErrFile(this Exception ex)
|
||||
{
|
||||
|
||||
string[] lines = File.ReadAllLines(file);
|
||||
File.Delete(file);
|
||||
bool ok = false;
|
||||
foreach (var line in lines)
|
||||
if (line.StartsWith(Code))
|
||||
{
|
||||
File.AppendAllText(file, Code + separator + newValue + "\n"); ok = true;
|
||||
}
|
||||
else File.AppendAllText(file, line + "\n");
|
||||
|
||||
if (!ok)
|
||||
File.AppendAllText(file, Code + separator + newValue + "\n");
|
||||
WriteErrFile(ex.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -176,30 +152,6 @@ namespace PluginManager.Others
|
||||
return command.Arguments;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Write setting
|
||||
/// </summary>
|
||||
/// <param name="SettingName">The full path to the setting</param>
|
||||
/// <param name="NewValue">The new Value</param>
|
||||
public static void WriteToSettingsFast(string SettingName, string NewValue)
|
||||
{
|
||||
|
||||
string path = dataFolder; // Resources/
|
||||
|
||||
string[] args = SettingName.Split('.');
|
||||
|
||||
int len = args.Length;
|
||||
if (len < 2) return;
|
||||
for (int i = 0; i < len - 2; i++)
|
||||
path += args[i] + "/";
|
||||
path += args[len - 2] + ".txt";
|
||||
|
||||
|
||||
WriteToSettings(path, args[len - 1].Replace('_', ' '), NewValue, '=');
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy one Stream to another <see langword="async"/>
|
||||
/// </summary>
|
||||
@@ -212,18 +164,13 @@ namespace PluginManager.Others
|
||||
/// <exception cref="ArgumentOutOfRangeException">Triggered if <paramref name="bufferSize"/> is less then or equal to 0</exception>
|
||||
/// <exception cref="InvalidOperationException">Triggered if <paramref name="stream"/> is not readable</exception>
|
||||
/// <exception cref="ArgumentException">Triggered in <paramref name="destination"/> is not writable</exception>
|
||||
public static async Task CopyToOtherStreamAsync(this Stream stream, Stream destination, int bufferSize, IProgress<long> progress = null, CancellationToken cancellationToken = default)
|
||||
public static async Task CopyToOtherStreamAsync(this Stream stream, Stream destination, int bufferSize, IProgress<long>? progress = null, CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (stream == null)
|
||||
throw new ArgumentNullException(nameof(stream));
|
||||
if (destination == null)
|
||||
throw new ArgumentNullException(nameof(destination));
|
||||
if (bufferSize <= 0)
|
||||
throw new ArgumentOutOfRangeException(nameof(bufferSize));
|
||||
if (!stream.CanRead)
|
||||
throw new InvalidOperationException("The stream is not readable.");
|
||||
if (!destination.CanWrite)
|
||||
throw new ArgumentException("Destination stream is not writable", nameof(destination));
|
||||
if (stream == null) throw new ArgumentNullException(nameof(stream));
|
||||
if (destination == null) throw new ArgumentNullException(nameof(destination));
|
||||
if (bufferSize <= 0) throw new ArgumentOutOfRangeException(nameof(bufferSize));
|
||||
if (!stream.CanRead) throw new InvalidOperationException("The stream is not readable.");
|
||||
if (!destination.CanWrite) throw new ArgumentException("Destination stream is not writable", nameof(destination));
|
||||
|
||||
byte[] buffer = new byte[bufferSize];
|
||||
long totalBytesRead = 0;
|
||||
@@ -236,5 +183,190 @@ namespace PluginManager.Others
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Extract zip to location
|
||||
/// </summary>
|
||||
/// <param name="zip">The zip location</param>
|
||||
/// <param name="folder">The target location</param>
|
||||
/// <param name="progress">The progress that is updated as a file is processed</param>
|
||||
/// <param name="type">The type of progress</param>
|
||||
/// <returns></returns>
|
||||
public static async Task ExtractArchive(string zip, string folder, IProgress<float> progress, UnzipProgressType type)
|
||||
{
|
||||
Directory.CreateDirectory(folder);
|
||||
using (ZipArchive archive = ZipFile.OpenRead(zip))
|
||||
{
|
||||
if (type == UnzipProgressType.PercentageFromNumberOfFiles)
|
||||
{
|
||||
int totalZIPFiles = archive.Entries.Count();
|
||||
int currentZIPFile = 0;
|
||||
foreach (ZipArchiveEntry entry in archive.Entries)
|
||||
{
|
||||
if (entry.FullName.EndsWith("/")) // it is a folder
|
||||
Directory.CreateDirectory(Path.Combine(folder, entry.FullName));
|
||||
|
||||
else
|
||||
try
|
||||
{
|
||||
entry.ExtractToFile(Path.Combine(folder, entry.FullName), true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}");
|
||||
}
|
||||
|
||||
currentZIPFile++;
|
||||
await Task.Delay(10);
|
||||
if (progress != null)
|
||||
progress.Report((float)currentZIPFile / totalZIPFiles * 100);
|
||||
}
|
||||
}
|
||||
else if (type == UnzipProgressType.PercentageFromTotalSize)
|
||||
{
|
||||
ulong zipSize = 0;
|
||||
|
||||
foreach (ZipArchiveEntry entry in archive.Entries)
|
||||
zipSize += (ulong)entry.CompressedLength;
|
||||
|
||||
ulong currentSize = 0;
|
||||
foreach (ZipArchiveEntry entry in archive.Entries)
|
||||
{
|
||||
if (entry.FullName.EndsWith("/"))
|
||||
{
|
||||
Directory.CreateDirectory(Path.Combine(folder, entry.FullName));
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
entry.ExtractToFile(Path.Combine(folder, entry.FullName), true);
|
||||
currentSize += (ulong)entry.CompressedLength;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}");
|
||||
}
|
||||
|
||||
await Task.Delay(10);
|
||||
if (progress != null)
|
||||
progress.Report((float)currentSize / zipSize * 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Convert Bytes to highest measurement unit possible
|
||||
/// </summary>
|
||||
/// <param name="bytes">The amount of bytes</param>
|
||||
/// <returns></returns>
|
||||
public static (double, string) ConvertBytes(long bytes)
|
||||
{
|
||||
List<string> units = new List<string>()
|
||||
{
|
||||
"B",
|
||||
"KB",
|
||||
"MB",
|
||||
"GB",
|
||||
"TB"
|
||||
};
|
||||
int i = 0;
|
||||
while (bytes >= 1024)
|
||||
{
|
||||
i++;
|
||||
bytes /= 1024;
|
||||
}
|
||||
|
||||
return (bytes, units[i]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Save to JSON file
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The class type</typeparam>
|
||||
/// <param name="file">The file path</param>
|
||||
/// <param name="Data">The values</param>
|
||||
/// <returns></returns>
|
||||
public static async Task SaveToJsonFile<T>(string file, T Data)
|
||||
{
|
||||
MemoryStream str = new MemoryStream();
|
||||
await JsonSerializer.SerializeAsync(str, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true });
|
||||
await File.WriteAllBytesAsync(file, str.ToArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert json text or file to some kind of data
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The data type</typeparam>
|
||||
/// <param name="input">The file or json text</param>
|
||||
/// <returns></returns>
|
||||
public static async Task<T> ConvertFromJson<T>(string input)
|
||||
{
|
||||
Stream text;
|
||||
if (File.Exists(input))
|
||||
text = new MemoryStream(await File.ReadAllBytesAsync(input));
|
||||
else
|
||||
text = new MemoryStream(Encoding.ASCII.GetBytes(input));
|
||||
text.Position = 0;
|
||||
var obj = await JsonSerializer.DeserializeAsync<T>(text);
|
||||
text.Close();
|
||||
return (obj ?? default)!;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if all words from <paramref name="str"/> are in <paramref name="baseString"/><br/>
|
||||
/// This function returns true if<br/>
|
||||
/// 1. The <paramref name="str"/> is part of <paramref name="baseString"/><br/>
|
||||
/// 2. The words (split by a space) of <paramref name="str"/> are located (separately) in <paramref name="baseString"/> <br/>
|
||||
/// <example>
|
||||
/// The following example will return <see langword="TRUE"/><br/>
|
||||
/// <c>STRContains("Hello World !", "I type word Hello and then i typed word World !")</c><br/>
|
||||
/// The following example will return <see langword="TRUE"/><br/>
|
||||
/// <c>STRContains("Hello World !", "I typed Hello World !" </c><br/>
|
||||
/// The following example will return <see langword="TRUE"/><br/>
|
||||
/// <c>STRContains("Hello World", "I type World then Hello")</c><br/>
|
||||
/// The following example will return <see langword="FALSE"/><br/>
|
||||
/// <c>STRContains("Hello World !", "I typed Hello World")</c><br/>
|
||||
/// </example>
|
||||
/// </summary>
|
||||
/// <param name="str">The string you are checking</param>
|
||||
/// <param name="baseString">The main string that should contain <paramref name="str"/></param>
|
||||
/// <returns></returns>
|
||||
public static bool STRContains(this string str, string baseString)
|
||||
{
|
||||
if (baseString.Contains(str)) return true;
|
||||
string[] array = str.Split(' ');
|
||||
foreach (var s in array)
|
||||
if (!baseString.Contains(s))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool TryReadValueFromJson(string input, string codeName, out JsonElement element)
|
||||
{
|
||||
Stream text;
|
||||
if (File.Exists(input))
|
||||
text = File.OpenRead(input);
|
||||
|
||||
else
|
||||
text = new MemoryStream(Encoding.ASCII.GetBytes(input));
|
||||
|
||||
var jsonObject = JsonDocument.Parse(text);
|
||||
|
||||
var data = jsonObject.RootElement.TryGetProperty(codeName, out element);
|
||||
return data;
|
||||
}
|
||||
|
||||
public static string CreateMD5(string input)
|
||||
{
|
||||
using (MD5 md5 = MD5.Create())
|
||||
{
|
||||
byte[] inputBytes = Encoding.ASCII.GetBytes(input);
|
||||
byte[] hashBytes = md5.ComputeHash(inputBytes);
|
||||
return Convert.ToHexString(hashBytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
using Discord;
|
||||
using System.Linq;
|
||||
using Discord;
|
||||
using Discord.WebSocket;
|
||||
|
||||
using System.Linq;
|
||||
namespace PluginManager.Others.Permissions;
|
||||
|
||||
namespace PluginManager.Others.Permissions
|
||||
{
|
||||
/// <summary>
|
||||
/// A class whith all discord permissions
|
||||
/// </summary>
|
||||
@@ -16,7 +15,10 @@ namespace PluginManager.Others.Permissions
|
||||
/// <param name="role">The role</param>
|
||||
/// <param name="permission">The permission</param>
|
||||
/// <returns></returns>
|
||||
public static bool hasPermission(this IRole role, GuildPermission permission) => role.Permissions.Has(permission);
|
||||
public static bool hasPermission(this IRole role, GuildPermission permission)
|
||||
{
|
||||
return role.Permissions.Has(permission);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if user has the specified role
|
||||
@@ -24,7 +26,10 @@ namespace PluginManager.Others.Permissions
|
||||
/// <param name="user">The user</param>
|
||||
/// <param name="role">The role</param>
|
||||
/// <returns></returns>
|
||||
public static bool hasRole(this SocketGuildUser user, IRole role) => user.Roles.Contains(role);
|
||||
public static bool hasRole(this SocketGuildUser user, IRole role)
|
||||
{
|
||||
return user.Roles.Contains(role);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if user has the specified permission
|
||||
@@ -33,23 +38,27 @@ namespace PluginManager.Others.Permissions
|
||||
/// <param name="permission">The permission</param>
|
||||
/// <returns></returns>
|
||||
public static bool hasPermission(this SocketGuildUser user, GuildPermission permission)
|
||||
=> user.Roles.Where(role => role.hasPermission(permission)).Any() || user.Guild.Owner == user;
|
||||
/// <summary>
|
||||
/// Check if user is administrator of server
|
||||
/// </summary>
|
||||
/// <param name="user">The user</param>
|
||||
/// <returns></returns>
|
||||
public static bool isAdmin(this SocketGuildUser user) => user.hasPermission(GuildPermission.Administrator);
|
||||
{
|
||||
return user.Roles.Where(role => role.hasPermission(permission)).Any() || user.Guild.Owner == user;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if user is administrator of server
|
||||
/// </summary>
|
||||
/// <param name="user">The user</param>
|
||||
/// <returns></returns>
|
||||
public static bool isAdmin(this SocketUser user) => isAdmin((SocketGuildUser)user);
|
||||
public static bool isAdmin(this SocketGuildUser user)
|
||||
{
|
||||
return user.hasPermission(GuildPermission.Administrator);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Check if user is administrator of server
|
||||
/// </summary>
|
||||
/// <param name="user">The user</param>
|
||||
/// <returns></returns>
|
||||
public static bool isAdmin(this SocketUser user)
|
||||
{
|
||||
return isAdmin((SocketGuildUser)user);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user