Compare commits
212 Commits
v1.0.6-pre
...
v1.0.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
| d5f78c831e | |||
| 7847c6cc8d | |||
| 82716a4f4f | |||
| 9476f9ec31 | |||
| dc787ac130 | |||
| 9525394a6e | |||
| fc93255503 | |||
| cadf500400 | |||
| 780614e1e7 | |||
| f32920c564 | |||
| 123e8e90a1 | |||
| 0323c888b3 | |||
| 1bb6d3b731 | |||
| 4dc5819c4e | |||
| 5d4fa6fba7 | |||
| b6675af9cb | |||
| 23a914d2c9 | |||
| e8822deeac | |||
| 29ecdb6883 | |||
| 90aa5875b5 | |||
| 0fccf706a1 | |||
| fd9cd49844 | |||
| 3c3c6a1301 | |||
| a2179787b9 | |||
| 8c06df9110 | |||
| ef7a2c0896 | |||
| 14f280baef | |||
| 196fb6d3d1 | |||
| cc355d7d4f | |||
| af90ae5fba | |||
| c8480b3c83 | |||
| fe32ebc4d7 | |||
| 2280957ea9 | |||
| 944d59d9a3 | |||
| 79ecff971b | |||
| 1f0e6516fd | |||
| 692f3d8f8c | |||
| 6d41d51694 | |||
| 5f23bdadcf | |||
| d3555b6fca | |||
| b5cdc0afeb | |||
| 3858156393 | |||
| 6279c5c3a9 | |||
| f58a57c6cd | |||
| d00ebfd7ed | |||
| ab279bd284 | |||
| 89c4932cd7 | |||
| c577f625c2 | |||
| 58624f4037 | |||
| c9249dc71b | |||
| 5e4f1ca35f | |||
| 0d8fdb5904 | |||
| 92a18e3495 | |||
| e929646e8e | |||
| 6315d13d18 | |||
| ee527bb36f | |||
| 86514d1770 | |||
| 9e8ed1e911 | |||
| f3c3c7939c | |||
| 361ed37362 | |||
| ed3128b940 | |||
| 6bbd68a135 | |||
| 06d322b5b3 | |||
| 5497ee9119 | |||
| 0aa78e3560 | |||
| 41ad37b3bb | |||
| 0104d09509 | |||
| b4f5e40f12 | |||
| 7107b17f19 | |||
| 42e1fd917e | |||
| 9e6fcdbe6f | |||
| a24d8aa222 | |||
| 0e5c9ff14b | |||
| f8977d8840 | |||
| bb9768f3a1 | |||
| b3d6930142 | |||
| 5254be44be | |||
| 207e0d6abd | |||
| 968d23380f | |||
| fff9e2e897 | |||
| 3e4e777d8d | |||
| 7f906d400f | |||
| c1161a3bca | |||
| ac512e3a27 | |||
| 730b628fe3 | |||
| 701edc5c6a | |||
| e7688762b8 | |||
| a7a71bf49a | |||
| ac7212ca00 | |||
| 298e557260 | |||
| 7ba791f906 | |||
| 4a6a12baae | |||
| f1dda5da3c | |||
| 3ab96e2d0d | |||
| 970c519a32 | |||
| 188920ec7f | |||
| dcfc4ea32f | |||
| a8c02176d3 | |||
| 1665d47a25 | |||
| 0b2f1e6ab6 | |||
| bcd9245502 | |||
| 59da9b295b | |||
| 99d7d5e7e7 | |||
| e4c60f1606 | |||
| 77f1bef862 | |||
| f16c139362 | |||
| c94cdca6eb | |||
| dcdf80112d | |||
| eb836c5b74 | |||
| de680c6771 | |||
|
|
bcef58a46b | ||
|
|
0dc8cdbce5 | ||
|
|
dbdbaa9802 | ||
|
|
5edcf93371 | ||
|
|
b0be76c62b | ||
| 75a77389a8 | |||
| 0bbced3d58 | |||
| 244209093e | |||
| 54a68d635d | |||
| d7a5cb5a64 | |||
| 6124f89cb0 | |||
| 810a527cc1 | |||
| 0a2dff0c6d | |||
| 382c376c03 | |||
| 84b7d663bc | |||
| 623232b67e | |||
| d5df6cfb9d | |||
| 10b9548c29 | |||
| fa1a136ef1 | |||
| d20cb62139 | |||
| f2418d0395 | |||
| 460a85944a | |||
| 7e2fa02d07 | |||
| 873855937f | |||
| 1cdd2644df | |||
| 532540b74f | |||
| 9ba4ca43e2 | |||
| 8bcaf3f254 | |||
| 0d5c90323a | |||
| 5b01b15216 | |||
| 4f18f505f4 | |||
| 2d3566a01a | |||
| 22f2cd4e59 | |||
| 1683234376 | |||
| 69d99b4189 | |||
| 4a5e0ef2f3 | |||
| 79731a9704 | |||
| bd53d099d1 | |||
| de61f5de88 | |||
| 0527d43dd2 | |||
| e3511cd96b | |||
| d355d3c9b7 | |||
| 5bb13aa4a6 | |||
| 655f5e2ce0 | |||
| 9014d78a7d | |||
| 1c026e7f49 | |||
| d32b3902c9 | |||
| e5f3aff39a | |||
| 11ec02ef68 | |||
| cad19935d5 | |||
| 47f88f167f | |||
| 9d6c335799 | |||
| cbaf552e7a | |||
| a4975a4578 | |||
| 725d02d152 | |||
| ae7118e89a | |||
| cad3bb5b75 | |||
| 269d7d56ff | |||
| 403c023191 | |||
| 3f7a8e04d4 | |||
| 0abbd24b86 | |||
| 21f1975fbc | |||
| d6f072904e | |||
| 6fc491a0d6 | |||
| 7bc9db03f0 | |||
| 641f0f2856 | |||
| ef5439d204 | |||
| c2093c2aca | |||
| a39f7bb0c9 | |||
| 6d73ec7f24 | |||
| 24d4bee85b | |||
| a1bde013e6 | |||
| 23f951167b | |||
| 26505fd5c9 | |||
| 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 |
14
.gitignore
vendored
14
.gitignore
vendored
@@ -98,6 +98,7 @@ StyleCopReport.xml
|
|||||||
*.pidb
|
*.pidb
|
||||||
*.svclog
|
*.svclog
|
||||||
*.scc
|
*.scc
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
# Chutzpah Test files
|
# Chutzpah Test files
|
||||||
_Chutzpah*
|
_Chutzpah*
|
||||||
@@ -363,4 +364,15 @@ MigrationBackup/
|
|||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
|
||||||
*.txt
|
*.txt
|
||||||
|
|
||||||
|
#folders
|
||||||
|
/Plugins/
|
||||||
|
/DiscordBot.rar
|
||||||
|
/DiscordBot/Data/
|
||||||
|
/DiscordBot/Updater/
|
||||||
|
.idea/
|
||||||
|
DiscordBot/Launcher.exe
|
||||||
|
DiscordBotUI/bin
|
||||||
|
DiscordBotUI/obj
|
||||||
|
/.vscode
|
||||||
|
|||||||
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_Utils/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"PluginManager": "1.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"CMD_Utils.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Commands": "3.7.2",
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Interactions": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2",
|
|
||||||
"Discord.Net.WebSocket": "3.7.2",
|
|
||||||
"Discord.Net.Webhook": "3.7.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Commands/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Commands.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Core/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Newtonsoft.Json": "13.0.1",
|
|
||||||
"System.Collections.Immutable": "5.0.0",
|
|
||||||
"System.Interactive.Async": "5.0.0",
|
|
||||||
"System.ValueTuple": "4.5.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Core.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Interactions/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2",
|
|
||||||
"Discord.Net.WebSocket": "3.7.2",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
|
||||||
"System.Collections.Immutable": "5.0.0",
|
|
||||||
"System.Reactive": "5.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Interactions.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Rest/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Rest.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Webhook/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Webhook.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.WebSocket/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.20.51904"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.1": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
|
||||||
"assemblyVersion": "13.0.0.0",
|
|
||||||
"fileVersion": "13.0.1.25517"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Collections.Immutable/5.0.0": {},
|
|
||||||
"System.Interactive.Async/5.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"System.Linq.Async": "5.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Linq.Async/5.0.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Reactive/5.0.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net5.0/System.Reactive.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.ValueTuple/4.5.0": {},
|
|
||||||
"PluginManager/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"PluginManager.dll": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"CMD_Utils/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"sha512": ""
|
|
||||||
},
|
|
||||||
"Discord.Net/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-FAiCLGu5rp6+Z10FjKbbJ6LLpKjbMBGpozixkJlz5LZvuncPx8f4AWFAw7pBecKUuAh983qiZ8CZYZcNXsI4qg==",
|
|
||||||
"path": "discord.net/3.7.2",
|
|
||||||
"hashPath": "discord.net.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Commands/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-aOEGP04X64htsTr7ozKj9qHpmvOfitSw5gfR8Tw9TX0+FdswD2LNL2KfOAIaxRKZmRTm34aXQEJrVq0K8AptmQ==",
|
|
||||||
"path": "discord.net.commands/3.7.2",
|
|
||||||
"hashPath": "discord.net.commands.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Core/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-apwswc6LjN4dj3u27SO3Hr56Jzl91wzReahieoD7IQhV+BJQaRxhTRiEEWFTrBzHfeFHEOQ7r6vZnra3zeFhKA==",
|
|
||||||
"path": "discord.net.core/3.7.2",
|
|
||||||
"hashPath": "discord.net.core.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Interactions/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-dwGhEdDB0yyo/lGtjwIDVZmsuD52di7lIZWu/sBtvvA05dMgYZq5S6ILdsBXjOyaHeXd+EV4YMlj2VS/rm619w==",
|
|
||||||
"path": "discord.net.interactions/3.7.2",
|
|
||||||
"hashPath": "discord.net.interactions.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Rest/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-dyp8YaMBNJ837EH1KNz2PNGZqc2y71WFd1+pdldF+pLQJ3Gf/+V7685paAR7bQw7yFNyqEBR/QRBCNp+QIQ7Wg==",
|
|
||||||
"path": "discord.net.rest/3.7.2",
|
|
||||||
"hashPath": "discord.net.rest.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Webhook/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-da3i/mTq2y7mfj3xlHH14S4PivHbflJCVr8OUikJtQrxBOxvPkqP7ZYk3Y9S28q0K8qik+TUjCcjL5gELKrh/A==",
|
|
||||||
"path": "discord.net.webhook/3.7.2",
|
|
||||||
"hashPath": "discord.net.webhook.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.WebSocket/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-pYCd6ET44ADaNiyEw82TaJnR7TKYHfrKCytWFWMPL5faJhoh260avZn3Hwunlf331lEQ0f4K1CujPkQbNuq7kQ==",
|
|
||||||
"path": "discord.net.websocket/3.7.2",
|
|
||||||
"hashPath": "discord.net.websocket.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
|
||||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
|
||||||
"path": "newtonsoft.json/13.0.1",
|
|
||||||
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Collections.Immutable/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
|
||||||
"path": "system.collections.immutable/5.0.0",
|
|
||||||
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Interactive.Async/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
|
||||||
"path": "system.interactive.async/5.0.0",
|
|
||||||
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Linq.Async/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
|
||||||
"path": "system.linq.async/5.0.0",
|
|
||||||
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Reactive/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
|
||||||
"path": "system.reactive/5.0.0",
|
|
||||||
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.ValueTuple/4.5.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
|
||||||
"path": "system.valuetuple/4.5.0",
|
|
||||||
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"PluginManager/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"sha512": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
@@ -1,334 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeTarget": {
|
|
||||||
"name": ".NETCoreApp,Version=v6.0",
|
|
||||||
"signature": ""
|
|
||||||
},
|
|
||||||
"compilationOptions": {},
|
|
||||||
"targets": {
|
|
||||||
".NETCoreApp,Version=v6.0": {
|
|
||||||
"Music Commands/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"PluginManager": "1.0.0",
|
|
||||||
"YoutubeExplode": "6.2.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"Music Commands.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"AngleSharp/0.17.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"System.Buffers": "4.5.1",
|
|
||||||
"System.Text.Encoding.CodePages": "5.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/AngleSharp.dll": {
|
|
||||||
"assemblyVersion": "0.17.0.0",
|
|
||||||
"fileVersion": "0.17.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Commands": "3.7.2",
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Interactions": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2",
|
|
||||||
"Discord.Net.WebSocket": "3.7.2",
|
|
||||||
"Discord.Net.Webhook": "3.7.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Commands/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Commands.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Core/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Newtonsoft.Json": "13.0.1",
|
|
||||||
"System.Collections.Immutable": "5.0.0",
|
|
||||||
"System.Interactive.Async": "5.0.0",
|
|
||||||
"System.ValueTuple": "4.5.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Core.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Interactions/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2",
|
|
||||||
"Discord.Net.WebSocket": "3.7.2",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
|
|
||||||
"System.Collections.Immutable": "5.0.0",
|
|
||||||
"System.Reactive": "5.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Interactions.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Rest/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Rest.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.Webhook/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.Webhook.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Discord.Net.WebSocket/3.7.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net.Core": "3.7.2",
|
|
||||||
"Discord.Net.Rest": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Discord.Net.WebSocket.dll": {
|
|
||||||
"assemblyVersion": "3.7.2.0",
|
|
||||||
"fileVersion": "3.7.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.20.51904"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.NETCore.Platforms/5.0.0": {},
|
|
||||||
"Newtonsoft.Json/13.0.1": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
|
||||||
"assemblyVersion": "13.0.0.0",
|
|
||||||
"fileVersion": "13.0.1.25517"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Buffers/4.5.1": {},
|
|
||||||
"System.Collections.Immutable/5.0.0": {},
|
|
||||||
"System.Interactive.Async/5.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"System.Linq.Async": "5.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/netcoreapp3.1/System.Interactive.Async.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Linq.Async/5.0.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/netcoreapp3.1/System.Linq.Async.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Reactive/5.0.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net5.0/System.Reactive.dll": {
|
|
||||||
"assemblyVersion": "5.0.0.0",
|
|
||||||
"fileVersion": "5.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Text.Encoding.CodePages/5.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.NETCore.Platforms": "5.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.ValueTuple/4.5.0": {},
|
|
||||||
"YoutubeExplode/6.2.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"AngleSharp": "0.17.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net5.0/YoutubeExplode.dll": {
|
|
||||||
"assemblyVersion": "6.2.0.0",
|
|
||||||
"fileVersion": "6.2.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PluginManager/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Discord.Net": "3.7.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"PluginManager.dll": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"Music Commands/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"sha512": ""
|
|
||||||
},
|
|
||||||
"AngleSharp/0.17.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-74haoXINcj4SdMsmiNzk+9VUwIX1U9P61O6AZd5Uao8SGNnJJB8Y/r8VJRc8orn4c7Vk/oURAKSNF9XcSDxbfA==",
|
|
||||||
"path": "anglesharp/0.17.0",
|
|
||||||
"hashPath": "anglesharp.0.17.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-FAiCLGu5rp6+Z10FjKbbJ6LLpKjbMBGpozixkJlz5LZvuncPx8f4AWFAw7pBecKUuAh983qiZ8CZYZcNXsI4qg==",
|
|
||||||
"path": "discord.net/3.7.2",
|
|
||||||
"hashPath": "discord.net.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Commands/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-aOEGP04X64htsTr7ozKj9qHpmvOfitSw5gfR8Tw9TX0+FdswD2LNL2KfOAIaxRKZmRTm34aXQEJrVq0K8AptmQ==",
|
|
||||||
"path": "discord.net.commands/3.7.2",
|
|
||||||
"hashPath": "discord.net.commands.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Core/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-apwswc6LjN4dj3u27SO3Hr56Jzl91wzReahieoD7IQhV+BJQaRxhTRiEEWFTrBzHfeFHEOQ7r6vZnra3zeFhKA==",
|
|
||||||
"path": "discord.net.core/3.7.2",
|
|
||||||
"hashPath": "discord.net.core.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Interactions/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-dwGhEdDB0yyo/lGtjwIDVZmsuD52di7lIZWu/sBtvvA05dMgYZq5S6ILdsBXjOyaHeXd+EV4YMlj2VS/rm619w==",
|
|
||||||
"path": "discord.net.interactions/3.7.2",
|
|
||||||
"hashPath": "discord.net.interactions.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Rest/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-dyp8YaMBNJ837EH1KNz2PNGZqc2y71WFd1+pdldF+pLQJ3Gf/+V7685paAR7bQw7yFNyqEBR/QRBCNp+QIQ7Wg==",
|
|
||||||
"path": "discord.net.rest/3.7.2",
|
|
||||||
"hashPath": "discord.net.rest.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.Webhook/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-da3i/mTq2y7mfj3xlHH14S4PivHbflJCVr8OUikJtQrxBOxvPkqP7ZYk3Y9S28q0K8qik+TUjCcjL5gELKrh/A==",
|
|
||||||
"path": "discord.net.webhook/3.7.2",
|
|
||||||
"hashPath": "discord.net.webhook.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Discord.Net.WebSocket/3.7.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-pYCd6ET44ADaNiyEw82TaJnR7TKYHfrKCytWFWMPL5faJhoh260avZn3Hwunlf331lEQ0f4K1CujPkQbNuq7kQ==",
|
|
||||||
"path": "discord.net.websocket/3.7.2",
|
|
||||||
"hashPath": "discord.net.websocket.3.7.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0",
|
|
||||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.NETCore.Platforms/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
|
|
||||||
"path": "microsoft.netcore.platforms/5.0.0",
|
|
||||||
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
|
||||||
"path": "newtonsoft.json/13.0.1",
|
|
||||||
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Buffers/4.5.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==",
|
|
||||||
"path": "system.buffers/4.5.1",
|
|
||||||
"hashPath": "system.buffers.4.5.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Collections.Immutable/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==",
|
|
||||||
"path": "system.collections.immutable/5.0.0",
|
|
||||||
"hashPath": "system.collections.immutable.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Interactive.Async/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-QaqhQVDiULcu4vm6o89+iP329HcK44cETHOYgy/jfEjtzeFy0ZxmuM7nel9ocjnKxEM4yh1mli7hgh8Q9o+/Iw==",
|
|
||||||
"path": "system.interactive.async/5.0.0",
|
|
||||||
"hashPath": "system.interactive.async.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Linq.Async/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw==",
|
|
||||||
"path": "system.linq.async/5.0.0",
|
|
||||||
"hashPath": "system.linq.async.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Reactive/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==",
|
|
||||||
"path": "system.reactive/5.0.0",
|
|
||||||
"hashPath": "system.reactive.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Text.Encoding.CodePages/5.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==",
|
|
||||||
"path": "system.text.encoding.codepages/5.0.0",
|
|
||||||
"hashPath": "system.text.encoding.codepages.5.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.ValueTuple/4.5.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==",
|
|
||||||
"path": "system.valuetuple/4.5.0",
|
|
||||||
"hashPath": "system.valuetuple.4.5.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"YoutubeExplode/6.2.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-oH5kst4w1QkUwRjJco0alF57JOmFofSGlPkr4OniODB8R6MEyRWn1xFg3JS2wFYd6scZluoXRDhM3/uyUjO9/g==",
|
|
||||||
"path": "youtubeexplode/6.2.0",
|
|
||||||
"hashPath": "youtubeexplode.6.2.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"PluginManager/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"sha512": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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,14 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<BaseOutputPath>bin\</BaseOutputPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace CMD_LevelingSystem;
|
|
||||||
|
|
||||||
internal class Level : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "level";
|
|
||||||
|
|
||||||
public string Description => "Display tour current level";
|
|
||||||
|
|
||||||
public string Usage => "level";
|
|
||||||
|
|
||||||
public bool canUseDM => false;
|
|
||||||
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
if (!File.Exists(Config.GetValue<string>("LevelingSystemPath") + $"/{message.Author.Id}.dat"))
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync("You are now unranked !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var user = await Functions.ConvertFromJson<User>(Config.GetValue<string>("LevelingSystemPath") + $"/{message.Author.Id}.dat");
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync("You are now unranked !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var builder = new EmbedBuilder();
|
|
||||||
var r = new Random();
|
|
||||||
builder.WithColor(r.Next(256), r.Next(256), r.Next(256));
|
|
||||||
builder.AddField("Current Level", user.CurrentLevel, true)
|
|
||||||
.AddField("Current EXP", user.CurrentEXP, true)
|
|
||||||
.AddField("Required Exp", user.RequiredEXPToLevelUp, true);
|
|
||||||
builder.WithTimestamp(DateTimeOffset.Now);
|
|
||||||
await context.Channel.SendMessageAsync(embed: builder.Build());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
using Discord.WebSocket;
|
|
||||||
|
|
||||||
namespace CMD_LevelingSystem;
|
|
||||||
|
|
||||||
public class DiscordUser
|
|
||||||
{
|
|
||||||
public string Username { get; set; }
|
|
||||||
public ushort DiscordTag { get; set; }
|
|
||||||
public ulong userID { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class User
|
|
||||||
{
|
|
||||||
public DiscordUser user { get; set; }
|
|
||||||
public int CurrentLevel { get; set; }
|
|
||||||
public long CurrentEXP { get; set; }
|
|
||||||
public long RequiredEXPToLevelUp { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<BaseOutputPath>bin\</BaseOutputPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
|
||||||
<OutputPath>..\BUILDS\</OutputPath>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<DebugType>none</DebugType>
|
|
||||||
<DebugSymbols>false</DebugSymbols>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,23 +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)
|
|
||||||
{
|
|
||||||
var m = message.Content.Substring(6);
|
|
||||||
await message.Channel.SendMessageAsync(m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace CMD_Utils;
|
|
||||||
|
|
||||||
internal 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)
|
|
||||||
{
|
|
||||||
var random = new System.Random();
|
|
||||||
var r = random.Next(1, 3);
|
|
||||||
if (r == 1)
|
|
||||||
await message.Channel.SendMessageAsync("Heads");
|
|
||||||
else
|
|
||||||
await message.Channel.SendMessageAsync("Tails");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace CMD_Utils;
|
|
||||||
|
|
||||||
public class Poll : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "poll";
|
|
||||||
|
|
||||||
public string Description => "Create a poll with options";
|
|
||||||
|
|
||||||
public string Usage => "poll [This-is-question] [This-is-answer-1] [This-is-answer-2] ... ";
|
|
||||||
|
|
||||||
public bool canUseDM => false;
|
|
||||||
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
public bool requireAdmin => true;
|
|
||||||
|
|
||||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
if (isDM) return;
|
|
||||||
var question = message.Content.Split(' ')[1].Replace('-', ' ');
|
|
||||||
var answers = Functions.MergeStrings(message.Content.Split(' '), 2).Split(' ');
|
|
||||||
var embedBuilder = new EmbedBuilder();
|
|
||||||
embedBuilder.Title = question;
|
|
||||||
var len = answers.Length;
|
|
||||||
for (var i = 0; i < len; i++) embedBuilder.AddField($"Answer {i + 1}", answers[i].Replace('-', ' '), true);
|
|
||||||
var msg = await context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
|
||||||
|
|
||||||
var emotes = new List<IEmote>();
|
|
||||||
emotes.Add(Emoji.Parse(":one:"));
|
|
||||||
emotes.Add(Emoji.Parse(":two:"));
|
|
||||||
emotes.Add(Emoji.Parse(":three:"));
|
|
||||||
emotes.Add(Emoji.Parse(":four:"));
|
|
||||||
emotes.Add(Emoji.Parse(":five:"));
|
|
||||||
emotes.Add(Emoji.Parse(":six:"));
|
|
||||||
|
|
||||||
for (var i = 0; i < len; i++) await msg.AddReactionAsync(emotes[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +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
|
|
||||||
{
|
|
||||||
var msg = message.Content;
|
|
||||||
var a = int.Parse(msg.Split(' ')[1]);
|
|
||||||
var b = int.Parse(msg.Split(' ')[2]);
|
|
||||||
|
|
||||||
if (a > b)
|
|
||||||
{
|
|
||||||
var temp = a;
|
|
||||||
a = b;
|
|
||||||
b = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
await message.Channel.SendMessageAsync("Your random generated number is " + new System.Random().Next(a, b));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
await message.Channel.SendMessageAsync("Invalid numbers or no numbers:\nUsage: " + Usage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.0.0.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
28
DiscordBot/Bot/Actions/Clear.cs
Normal file
28
DiscordBot/Bot/Actions/Clear.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Actions;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Actions;
|
||||||
|
|
||||||
|
public class Clear: ICommandAction
|
||||||
|
{
|
||||||
|
public string ActionName => "clear";
|
||||||
|
public string Description => "Clears the console";
|
||||||
|
public string Usage => "clear";
|
||||||
|
public IEnumerable<InternalActionOption> ListOfOptions => [];
|
||||||
|
|
||||||
|
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
||||||
|
|
||||||
|
public Task Execute(string[] args)
|
||||||
|
{
|
||||||
|
Console.Clear();
|
||||||
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||||
|
Console.WriteLine("===== Seth Discord Bot =====");
|
||||||
|
Console.ResetColor();
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
53
DiscordBot/Bot/Actions/Exit.cs
Normal file
53
DiscordBot/Bot/Actions/Exit.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Actions;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Actions;
|
||||||
|
|
||||||
|
public class Exit: ICommandAction
|
||||||
|
{
|
||||||
|
public string ActionName => "exit";
|
||||||
|
public string Description => "Exits the bot and saves the config. Use exit help for more info.";
|
||||||
|
public string Usage => "exit <option?>";
|
||||||
|
public IEnumerable<InternalActionOption> ListOfOptions => new List<InternalActionOption>
|
||||||
|
{
|
||||||
|
new InternalActionOption("help", "Displays this message"),
|
||||||
|
new InternalActionOption("force | -f", "Exits the bot without saving the config")
|
||||||
|
};
|
||||||
|
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
||||||
|
|
||||||
|
public async Task Execute(string[] args)
|
||||||
|
{
|
||||||
|
if (args is null || args.Length == 0)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Exiting...", typeof(ICommandAction), LogType.WARNING);
|
||||||
|
await Config.AppSettings.SaveToFile();
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (args[0])
|
||||||
|
{
|
||||||
|
case "help":
|
||||||
|
Console.WriteLine("Usage : exit [help|force]");
|
||||||
|
Console.WriteLine("help : Displays this message");
|
||||||
|
Console.WriteLine("force | -f : Exits the bot without saving the config");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "-f":
|
||||||
|
case "force":
|
||||||
|
Config.Logger.Log("Exiting (FORCE)...", typeof(ICommandAction), LogType.WARNING);
|
||||||
|
Environment.Exit(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Invalid argument !");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
206
DiscordBot/Bot/Actions/Extra/PluginMethods.cs
Normal file
206
DiscordBot/Bot/Actions/Extra/PluginMethods.cs
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using DiscordBot.Utilities;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Online;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Actions.Extra;
|
||||||
|
|
||||||
|
internal static class PluginMethods
|
||||||
|
{
|
||||||
|
internal static async Task List(PluginsManager manager)
|
||||||
|
{
|
||||||
|
var data = await ConsoleUtilities.ExecuteWithProgressBar(manager.GetPluginsList(), "Reading remote database");
|
||||||
|
|
||||||
|
TableData tableData = new(["Name", "Description", "Version", "Is Installed"]);
|
||||||
|
|
||||||
|
var installedPlugins = await ConsoleUtilities.ExecuteWithProgressBar(manager.GetInstalledPlugins(), "Reading local database ");
|
||||||
|
|
||||||
|
foreach (var plugin in data)
|
||||||
|
{
|
||||||
|
bool isInstalled = installedPlugins.Any(p => p.PluginName == plugin.Name);
|
||||||
|
tableData.AddRow([plugin.Name, plugin.Description, plugin.Version.ToString(), isInstalled ? "Yes" : "No"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
tableData.HasRoundBorders = false;
|
||||||
|
tableData.PrintTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static async Task RefreshPlugins(bool quiet)
|
||||||
|
{
|
||||||
|
await Program.internalActionManager.Execute("plugin", "load", quiet ? "-q" : string.Empty);
|
||||||
|
await Program.internalActionManager.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static async Task DownloadPlugin(PluginsManager manager, string pluginName)
|
||||||
|
{
|
||||||
|
var pluginData = await manager.GetPluginDataByName(pluginName);
|
||||||
|
if (pluginData is null)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Plugin {pluginName} not found. Please check the spelling and try again.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var pluginLink = pluginData.DownLoadLink;
|
||||||
|
|
||||||
|
|
||||||
|
await AnsiConsole.Progress()
|
||||||
|
.Columns(new ProgressColumn[]
|
||||||
|
{
|
||||||
|
new TaskDescriptionColumn(), new ProgressBarColumn(), new PercentageColumn()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.StartAsync(async ctx =>
|
||||||
|
{
|
||||||
|
var downloadTask = ctx.AddTask("Downloading plugin...");
|
||||||
|
|
||||||
|
IProgress<float> progress = new Progress<float>(p => { downloadTask.Value = p; });
|
||||||
|
|
||||||
|
await ServerCom.DownloadFileAsync(pluginLink, $"{Config.AppSettings["PluginFolder"]}/{pluginName}.dll", progress);
|
||||||
|
|
||||||
|
downloadTask.Increment(100);
|
||||||
|
|
||||||
|
ctx.Refresh();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!pluginData.HasDependencies)
|
||||||
|
{
|
||||||
|
await manager.AppendPluginToDatabase(new PluginManager.Plugin.PluginInfo(pluginName, pluginData.Version, []));
|
||||||
|
Console.WriteLine("Finished installing " + pluginName + " successfully");
|
||||||
|
await RefreshPlugins(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Tuple<ProgressTask, IProgress<float>, string, string>> downloadTasks = new();
|
||||||
|
await AnsiConsole.Progress()
|
||||||
|
.Columns(new ProgressColumn[]
|
||||||
|
{
|
||||||
|
new TaskDescriptionColumn(), new ProgressBarColumn(), new PercentageColumn()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.StartAsync(async ctx =>
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var dependency in pluginData.Dependencies)
|
||||||
|
{
|
||||||
|
var task = ctx.AddTask($"Downloading {dependency.DownloadLocation}: ");
|
||||||
|
IProgress<float> progress = new Progress<float>(p =>
|
||||||
|
{
|
||||||
|
task.Value = p;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
task.IsIndeterminate = true;
|
||||||
|
downloadTasks.Add(new Tuple<ProgressTask, IProgress<float>, string, string>(task, progress, dependency.DownloadLink, dependency.DownloadLocation));
|
||||||
|
}
|
||||||
|
|
||||||
|
int maxParallelDownloads = 5;
|
||||||
|
|
||||||
|
if (Config.AppSettings.ContainsKey("MaxParallelDownloads"))
|
||||||
|
maxParallelDownloads = int.Parse(Config.AppSettings["MaxParallelDownloads"]);
|
||||||
|
|
||||||
|
var options = new ParallelOptions()
|
||||||
|
{
|
||||||
|
MaxDegreeOfParallelism = maxParallelDownloads,
|
||||||
|
TaskScheduler = TaskScheduler.Default
|
||||||
|
};
|
||||||
|
|
||||||
|
await Parallel.ForEachAsync(downloadTasks, options, async (tuple, token) =>
|
||||||
|
{
|
||||||
|
tuple.Item1.IsIndeterminate = false;
|
||||||
|
await ServerCom.DownloadFileAsync(tuple.Item3, $"./{tuple.Item4}", tuple.Item2);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
await manager.AppendPluginToDatabase(new PluginManager.Plugin.PluginInfo(pluginName, pluginData.Version, pluginData.Dependencies.Select(sep => sep.DownloadLocation).ToList()));
|
||||||
|
await RefreshPlugins(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static async Task<bool> LoadPlugins(string[] args)
|
||||||
|
{
|
||||||
|
var loader = new PluginLoader(Config.DiscordBot.Client);
|
||||||
|
if (args.Length == 2 && args[1] == "-q")
|
||||||
|
{
|
||||||
|
await loader.LoadPlugins();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var cc = Console.ForegroundColor;
|
||||||
|
loader.OnCommandLoaded += (data) =>
|
||||||
|
{
|
||||||
|
if (data.IsSuccess)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully loaded command : " + data.PluginName, typeof(ICommandAction),
|
||||||
|
LogType.INFO
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Failed to load command : " + data.PluginName + " because " + data.ErrorMessage,
|
||||||
|
typeof(ICommandAction), LogType.ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.ForegroundColor = cc;
|
||||||
|
};
|
||||||
|
loader.OnEventLoaded += (data) =>
|
||||||
|
{
|
||||||
|
if (data.IsSuccess)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully loaded event : " + data.PluginName, typeof(ICommandAction),
|
||||||
|
LogType.INFO
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Failed to load event : " + data.PluginName + " because " + data.ErrorMessage,
|
||||||
|
typeof(ICommandAction), LogType.ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.ForegroundColor = cc;
|
||||||
|
};
|
||||||
|
|
||||||
|
loader.OnSlashCommandLoaded += (data) =>
|
||||||
|
{
|
||||||
|
if (data.IsSuccess)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully loaded slash command : " + data.PluginName, typeof(ICommandAction),
|
||||||
|
LogType.INFO
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Failed to load slash command : " + data.PluginName + " because " + data.ErrorMessage,
|
||||||
|
typeof(ICommandAction), LogType.ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.ForegroundColor = cc;
|
||||||
|
};
|
||||||
|
|
||||||
|
await loader.LoadPlugins();
|
||||||
|
Console.ForegroundColor = cc;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
45
DiscordBot/Bot/Actions/Extra/SettingsConfigExtra.cs
Normal file
45
DiscordBot/Bot/Actions/Extra/SettingsConfigExtra.cs
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Actions.Extra;
|
||||||
|
|
||||||
|
internal static class SettingsConfigExtra
|
||||||
|
{
|
||||||
|
|
||||||
|
internal static void SetSettings(string key, params string[] value)
|
||||||
|
{
|
||||||
|
if (key is null) return;
|
||||||
|
|
||||||
|
if (value is null) return;
|
||||||
|
|
||||||
|
if (!Config.AppSettings.ContainsKey(key))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Config.AppSettings[key] = string.Join(' ', value);
|
||||||
|
// Config.AppSettings.SaveToFile().Wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void RemoveSettings(string key)
|
||||||
|
{
|
||||||
|
if (key is null) return;
|
||||||
|
|
||||||
|
if (!Config.AppSettings.ContainsKey(key))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Config.AppSettings.Remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void AddSettings(string key, params string[] value)
|
||||||
|
{
|
||||||
|
if (key is null) return;
|
||||||
|
|
||||||
|
if (value is null) return;
|
||||||
|
|
||||||
|
if (Config.AppSettings.ContainsKey(key))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Config.AppSettings.Add(key, string.Join(' ', value));
|
||||||
|
// Config.AppSettings.SaveToFile().Wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
84
DiscordBot/Bot/Actions/Help.cs
Normal file
84
DiscordBot/Bot/Actions/Help.cs
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using DiscordBot.Utilities;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Actions;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Actions;
|
||||||
|
|
||||||
|
public class Help: ICommandAction
|
||||||
|
{
|
||||||
|
public string ActionName => "help";
|
||||||
|
|
||||||
|
public string Description => "Shows the list of commands and their usage";
|
||||||
|
|
||||||
|
public string Usage => "help <command?>";
|
||||||
|
|
||||||
|
public IEnumerable<InternalActionOption> ListOfOptions => [];
|
||||||
|
|
||||||
|
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
||||||
|
|
||||||
|
public async Task Execute(string[] args)
|
||||||
|
{
|
||||||
|
TableData tableData = new TableData();
|
||||||
|
if (args == null || args.Length == 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
tableData.Columns = ["Command", "Usage", "Description", "Options"];
|
||||||
|
|
||||||
|
foreach (var a in Program.internalActionManager.Actions)
|
||||||
|
{
|
||||||
|
Markup actionName = new Markup($"[bold]{a.Key}[/]");
|
||||||
|
Markup usage = new Markup($"[italic]{a.Value.Usage}[/]");
|
||||||
|
Markup description = new Markup($"[dim]{a.Value.Description}[/]");
|
||||||
|
|
||||||
|
if (a.Value.ListOfOptions.Any())
|
||||||
|
{
|
||||||
|
|
||||||
|
var optionsTable = new Table();
|
||||||
|
optionsTable.AddColumn("Option");
|
||||||
|
optionsTable.AddColumn("Description");
|
||||||
|
|
||||||
|
foreach (var option in a.Value.ListOfOptions)
|
||||||
|
{
|
||||||
|
|
||||||
|
optionsTable.AddRow(option.OptionName, option.OptionDescription);
|
||||||
|
}
|
||||||
|
|
||||||
|
tableData.AddRow([actionName, usage, description, optionsTable]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tableData.AddRow([actionName, usage, description]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// render the table
|
||||||
|
tableData.HasRoundBorders = true;
|
||||||
|
tableData.DisplayLinesBetweenRows = true;
|
||||||
|
tableData.PrintTable();
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Program.internalActionManager.Actions.ContainsKey(args[0]))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Command not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var action = Program.internalActionManager.Actions[args[0]];
|
||||||
|
tableData.Columns = ["Command", "Usage", "Description"];
|
||||||
|
tableData.AddRow([action.ActionName, action.Usage, action.Description]);
|
||||||
|
|
||||||
|
|
||||||
|
tableData.PrintTable();
|
||||||
|
}
|
||||||
|
}
|
||||||
95
DiscordBot/Bot/Actions/Plugin.cs
Normal file
95
DiscordBot/Bot/Actions/Plugin.cs
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using DiscordBot.Bot.Actions.Extra;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Actions;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Actions;
|
||||||
|
|
||||||
|
public class Plugin: ICommandAction
|
||||||
|
{
|
||||||
|
private bool pluginsLoaded;
|
||||||
|
public string ActionName => "plugin";
|
||||||
|
public string Description => "Manages plugins. Use plugin help for more info.";
|
||||||
|
public string Usage => "plugin <option!>";
|
||||||
|
|
||||||
|
public IEnumerable<InternalActionOption> ListOfOptions => new List<InternalActionOption>
|
||||||
|
{
|
||||||
|
new InternalActionOption("help", "Displays this message"),
|
||||||
|
new InternalActionOption("list", "Lists all plugins"),
|
||||||
|
new InternalActionOption("load", "Loads all plugins"),
|
||||||
|
new InternalActionOption("install", "Installs a plugin"),
|
||||||
|
new InternalActionOption("refresh", "Refreshes the plugin list"),
|
||||||
|
new InternalActionOption("uninstall", "Uninstalls a plugin")
|
||||||
|
};
|
||||||
|
|
||||||
|
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
||||||
|
|
||||||
|
public async Task Execute(string[] args)
|
||||||
|
{
|
||||||
|
if (args is null || args.Length == 0 || args[0] == "help")
|
||||||
|
{
|
||||||
|
Console.WriteLine("Usage : plugin [help|list|load|install]");
|
||||||
|
Console.WriteLine("help : Displays this message");
|
||||||
|
Console.WriteLine("list : Lists all plugins");
|
||||||
|
Console.WriteLine("load : Loads all plugins");
|
||||||
|
Console.WriteLine("install : Installs a plugin");
|
||||||
|
Console.WriteLine("refresh : Refreshes the plugin list");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (args[0])
|
||||||
|
{
|
||||||
|
case "refresh":
|
||||||
|
await PluginMethods.RefreshPlugins(true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "uninstall":
|
||||||
|
string plugName = string.Join(' ', args, 1, args.Length-1);
|
||||||
|
bool result = await Config.PluginsManager.MarkPluginToUninstall(plugName);
|
||||||
|
if(result)
|
||||||
|
Console.WriteLine($"Marked to uninstall plugin {plugName}. Please restart the bot");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "list":
|
||||||
|
await PluginMethods.List(Config.PluginsManager);
|
||||||
|
break;
|
||||||
|
case "load":
|
||||||
|
if (pluginsLoaded)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Plugins already loaded", typeof(ICommandAction), LogType.WARNING);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Config.DiscordBot is null)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("DiscordBot is null", typeof(ICommandAction), LogType.WARNING);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pluginsLoaded = await PluginMethods.LoadPlugins(args);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "install":
|
||||||
|
var pluginName = string.Join(' ', args, 1, args.Length - 1);
|
||||||
|
if (string.IsNullOrEmpty(pluginName) || pluginName.Length < 2)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Please specify a plugin name");
|
||||||
|
Console.Write("Plugin name : ");
|
||||||
|
pluginName = Console.ReadLine();
|
||||||
|
if (string.IsNullOrEmpty(pluginName) || pluginName.Length < 2)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Invalid plugin name");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await PluginMethods.DownloadPlugin(Config.PluginsManager, pluginName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
76
DiscordBot/Bot/Actions/SettingsConfig.cs
Normal file
76
DiscordBot/Bot/Actions/SettingsConfig.cs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using DiscordBot.Bot.Actions.Extra;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Actions;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Actions;
|
||||||
|
|
||||||
|
public class SettingsConfig: ICommandAction
|
||||||
|
{
|
||||||
|
public string ActionName => "config";
|
||||||
|
public string Description => "Change the settings of the bot";
|
||||||
|
public string Usage => "config <options!>";
|
||||||
|
public IEnumerable<InternalActionOption> ListOfOptions => new List<InternalActionOption>
|
||||||
|
{
|
||||||
|
new InternalActionOption("help", "Displays this message"),
|
||||||
|
new InternalActionOption("set", "Set a setting"),
|
||||||
|
new InternalActionOption("remove", "Remove a setting"),
|
||||||
|
new InternalActionOption("add", "Add a setting")
|
||||||
|
};
|
||||||
|
public InternalActionRunType RunType => InternalActionRunType.ON_CALL;
|
||||||
|
public Task Execute(string[] args)
|
||||||
|
{
|
||||||
|
if (args is null)
|
||||||
|
{
|
||||||
|
foreach (var settings in Config.AppSettings)
|
||||||
|
Console.WriteLine(settings.Key + ": " + settings.Value);
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (args[0])
|
||||||
|
{
|
||||||
|
case "-s":
|
||||||
|
case "set":
|
||||||
|
if (args.Length < 3)
|
||||||
|
return Task.CompletedTask;
|
||||||
|
SettingsConfigExtra.SetSettings(args[1], args[2..]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "-r":
|
||||||
|
case "remove":
|
||||||
|
if (args.Length < 2)
|
||||||
|
return Task.CompletedTask;
|
||||||
|
SettingsConfigExtra.RemoveSettings(args[1]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "-a":
|
||||||
|
case "add":
|
||||||
|
if (args.Length < 3)
|
||||||
|
return Task.CompletedTask;
|
||||||
|
SettingsConfigExtra.AddSettings(args[1], args[2..]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "-h":
|
||||||
|
case "-help":
|
||||||
|
Console.WriteLine("Options:");
|
||||||
|
Console.WriteLine("-s <settingName> <newValue>: Set a setting");
|
||||||
|
Console.WriteLine("-r <settingName>: Remove a setting");
|
||||||
|
Console.WriteLine("-a <settingName> <newValue>: Add a setting");
|
||||||
|
Console.WriteLine("-h: Show this help message");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Invalid option");
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
90
DiscordBot/Bot/Commands/NormalCommands/Help.cs
Normal file
90
DiscordBot/Bot/Commands/NormalCommands/Help.cs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Discord;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Commands;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The help command
|
||||||
|
/// </summary>
|
||||||
|
internal class Help: DBCommand
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Command name
|
||||||
|
/// </summary>
|
||||||
|
public string Command => "help";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command Description
|
||||||
|
/// </summary>
|
||||||
|
public string Description => "This command allows you to check all loaded commands";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command usage
|
||||||
|
/// </summary>
|
||||||
|
public string Usage => "help <command>";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command require administrator to be executed
|
||||||
|
/// </summary>
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The main body of the command
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">The command context</param>
|
||||||
|
public void ExecuteServer(DbCommandExecutingArguments args)
|
||||||
|
{
|
||||||
|
if (args.arguments is not null)
|
||||||
|
{
|
||||||
|
var e = GenerateHelpCommand(args.arguments[0]);
|
||||||
|
if (e is null)
|
||||||
|
args.context.Channel.SendMessageAsync("Unknown Command " + args.arguments[0]);
|
||||||
|
else
|
||||||
|
args.context.Channel.SendMessageAsync(embed: e.Build());
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var embedBuilder = new EmbedBuilder();
|
||||||
|
|
||||||
|
var adminCommands = "";
|
||||||
|
var normalCommands = "";
|
||||||
|
|
||||||
|
foreach (var cmd in PluginLoader.Commands)
|
||||||
|
if (cmd.requireAdmin)
|
||||||
|
adminCommands += cmd.Command + " ";
|
||||||
|
else
|
||||||
|
normalCommands += cmd.Command + " ";
|
||||||
|
|
||||||
|
|
||||||
|
if (adminCommands.Length > 0)
|
||||||
|
embedBuilder.AddField("Admin Commands", adminCommands);
|
||||||
|
if (normalCommands.Length > 0)
|
||||||
|
embedBuilder.AddField("Normal Commands", normalCommands);
|
||||||
|
args.context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private EmbedBuilder GenerateHelpCommand(string command)
|
||||||
|
{
|
||||||
|
var embedBuilder = new EmbedBuilder();
|
||||||
|
var cmd = PluginLoader.Commands.Find(p => p.Command == command ||
|
||||||
|
p.Aliases is not null && p.Aliases.Contains(command)
|
||||||
|
);
|
||||||
|
if (cmd == null) return null;
|
||||||
|
|
||||||
|
embedBuilder.AddField("Usage", Config.AppSettings["prefix"] + cmd.Usage);
|
||||||
|
embedBuilder.AddField("Description", cmd.Description);
|
||||||
|
if (cmd.Aliases is null)
|
||||||
|
return embedBuilder;
|
||||||
|
embedBuilder.AddField("Alias", cmd.Aliases.Count == 0 ? "-" : string.Join(", ", cmd.Aliases));
|
||||||
|
|
||||||
|
return embedBuilder;
|
||||||
|
}
|
||||||
|
}
|
||||||
59
DiscordBot/Bot/Commands/SlashCommands/Help.cs
Normal file
59
DiscordBot/Bot/Commands/SlashCommands/Help.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Discord;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace DiscordBot.Bot.Commands.SlashCommands;
|
||||||
|
|
||||||
|
public class Help: DBSlashCommand
|
||||||
|
{
|
||||||
|
public string Name => "help";
|
||||||
|
public string Description => "This command allows you to check all loaded commands";
|
||||||
|
public bool canUseDM => true;
|
||||||
|
|
||||||
|
public bool HasInteraction => false;
|
||||||
|
|
||||||
|
public List<SlashCommandOptionBuilder> Options =>
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
new SlashCommandOptionBuilder()
|
||||||
|
.WithName("command")
|
||||||
|
.WithDescription("The command you want to get help for")
|
||||||
|
.WithRequired(false)
|
||||||
|
.WithType(ApplicationCommandOptionType.String)
|
||||||
|
};
|
||||||
|
|
||||||
|
public async void ExecuteServer(SocketSlashCommand context)
|
||||||
|
{
|
||||||
|
EmbedBuilder embedBuilder = new();
|
||||||
|
|
||||||
|
embedBuilder.WithTitle("Help Command");
|
||||||
|
embedBuilder.WithColor(Functions.RandomColor);
|
||||||
|
var slashCommands = PluginLoader.SlashCommands;
|
||||||
|
var options = context.Data.Options;
|
||||||
|
|
||||||
|
//Console.WriteLine("Options: " + options.Count);
|
||||||
|
if (options is null || options.Count == 0)
|
||||||
|
foreach (var slashCommand in slashCommands)
|
||||||
|
embedBuilder.AddField(slashCommand.Name, slashCommand.Description);
|
||||||
|
|
||||||
|
if (options.Count > 0)
|
||||||
|
{
|
||||||
|
var commandName = options.First().Value;
|
||||||
|
var slashCommand = slashCommands.FirstOrDefault(x => x.Name.TrimEnd() == commandName.ToString());
|
||||||
|
if (slashCommand is null)
|
||||||
|
{
|
||||||
|
await context.RespondAsync("Unknown Command " + commandName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
embedBuilder.AddField("DM Usable:", slashCommand.canUseDM, true)
|
||||||
|
.WithDescription(slashCommand.Description);
|
||||||
|
}
|
||||||
|
|
||||||
|
await context.RespondAsync(embed: embedBuilder.Build());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Loaders;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace DiscordBot.Discord.Commands;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The help command
|
|
||||||
/// </summary>
|
|
||||||
internal class Help : DBCommand
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Command name
|
|
||||||
/// </summary>
|
|
||||||
public string Command => "help";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command Description
|
|
||||||
/// </summary>
|
|
||||||
public string Description => "This command allows you to check all loadded 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;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command require administrator to be executed
|
|
||||||
/// </summary>
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The main body of the command
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">The command context</param>
|
|
||||||
/// <param name="message">The command message</param>
|
|
||||||
/// <param name="client">The discord bot client</param>
|
|
||||||
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
|
|
||||||
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
var args = Functions.GetArguments(message);
|
|
||||||
if (args.Count != 0)
|
|
||||||
{
|
|
||||||
foreach (var item in args)
|
|
||||||
{
|
|
||||||
var e = GenerateHelpCommand(item);
|
|
||||||
if (e != null)
|
|
||||||
context.Channel.SendMessageAsync(embed: e.Build());
|
|
||||||
else
|
|
||||||
context.Channel.SendMessageAsync("Unknown Command " + item);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var embedBuilder = new EmbedBuilder();
|
|
||||||
|
|
||||||
var adminCommands = "";
|
|
||||||
var normalCommands = "";
|
|
||||||
var DMCommands = "";
|
|
||||||
|
|
||||||
foreach (var cmd in PluginLoader.Commands!)
|
|
||||||
{
|
|
||||||
if (cmd.canUseDM) DMCommands += cmd.Command + " ";
|
|
||||||
if (cmd.requireAdmin)
|
|
||||||
adminCommands += cmd.Command + " ";
|
|
||||||
else if (cmd.canUseServer) normalCommands += cmd.Command + " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
embedBuilder.AddField("Admin Commands", adminCommands);
|
|
||||||
embedBuilder.AddField("Normal Commands", normalCommands);
|
|
||||||
embedBuilder.AddField("DM Commands", DMCommands);
|
|
||||||
context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
|
||||||
}
|
|
||||||
|
|
||||||
private EmbedBuilder GenerateHelpCommand(string command)
|
|
||||||
{
|
|
||||||
var embedBuilder = new EmbedBuilder();
|
|
||||||
var cmd = PluginLoader.Commands.Find(p => p.Command == command);
|
|
||||||
if (cmd == null) return null;
|
|
||||||
|
|
||||||
embedBuilder.AddField("Usage", cmd.Usage);
|
|
||||||
embedBuilder.AddField("Description", cmd.Description);
|
|
||||||
|
|
||||||
return embedBuilder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
using PluginManager.Others.Permissions;
|
|
||||||
using DiscordLibCommands = Discord.Commands;
|
|
||||||
using DiscordLib = Discord;
|
|
||||||
using OperatingSystem = PluginManager.Others.OperatingSystem;
|
|
||||||
|
|
||||||
namespace DiscordBot.Discord.Commands;
|
|
||||||
|
|
||||||
internal class Restart : DBCommand
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Command name
|
|
||||||
/// </summary>
|
|
||||||
public string Command => "restart";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command Description
|
|
||||||
/// </summary>
|
|
||||||
public string Description => "Restart the bot";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command usage
|
|
||||||
/// </summary>
|
|
||||||
public string Usage => "restart [-p | -c | -args | -cmd] <args>";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
|
|
||||||
/// </summary>
|
|
||||||
public bool canUseDM => false;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command can be used in a server
|
|
||||||
/// </summary>
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command require administrator to be executed
|
|
||||||
/// </summary>
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The main body of the command
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">The command context</param>
|
|
||||||
/// <param name="message">The command message</param>
|
|
||||||
/// <param name="client">The discord bot client</param>
|
|
||||||
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
|
|
||||||
public async void Execute(DiscordLibCommands.SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
if (!(message.Author as SocketGuildUser).hasPermission(DiscordLib.GuildPermission.Administrator)) return;
|
|
||||||
var args = Functions.GetArguments(message);
|
|
||||||
var OS = Functions.GetOperatingSystem();
|
|
||||||
if (args.Count == 0)
|
|
||||||
{
|
|
||||||
switch (OS)
|
|
||||||
{
|
|
||||||
case OperatingSystem.WINDOWS:
|
|
||||||
Process.Start("./DiscordBot.exe");
|
|
||||||
break;
|
|
||||||
case OperatingSystem.LINUX:
|
|
||||||
case OperatingSystem.MAC_OS:
|
|
||||||
Process.Start("./DiscordBot");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (args[0])
|
|
||||||
{
|
|
||||||
case "-p":
|
|
||||||
case "-poweroff":
|
|
||||||
case "-c":
|
|
||||||
case "-close":
|
|
||||||
Environment.Exit(0);
|
|
||||||
break;
|
|
||||||
case "-cmd":
|
|
||||||
case "-args":
|
|
||||||
var cmd = "--args";
|
|
||||||
|
|
||||||
if (args.Count > 1)
|
|
||||||
for (var i = 1; i < args.Count; i++)
|
|
||||||
cmd += $" {args[i]}";
|
|
||||||
|
|
||||||
|
|
||||||
switch (OS)
|
|
||||||
{
|
|
||||||
case OperatingSystem.WINDOWS:
|
|
||||||
Functions.WriteLogFile("Restarting the bot with the following arguments: \"" + cmd + "\"");
|
|
||||||
Process.Start("./DiscordBot.exe", cmd);
|
|
||||||
break;
|
|
||||||
case OperatingSystem.LINUX:
|
|
||||||
//case PluginManager.Others.OperatingSystem.MAC_OS: ?? - not tested
|
|
||||||
Process.Start("./DiscordBot", cmd);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Environment.Exit(0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
await context.Channel.SendMessageAsync("Invalid argument. Use `help restart` to see the usage.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace DiscordBot.Discord.Commands;
|
|
||||||
|
|
||||||
internal class Settings : DBCommand
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Command name
|
|
||||||
/// </summary>
|
|
||||||
public string Command => "set";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command Description
|
|
||||||
/// </summary>
|
|
||||||
public string Description => "This command allows you change all settings. Use \"set help\" to show details";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command usage
|
|
||||||
/// </summary>
|
|
||||||
public string Usage => "set [keyword] [new Value]";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
|
|
||||||
/// </summary>
|
|
||||||
public bool canUseDM => true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command can be used in a server
|
|
||||||
/// </summary>
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if the command require administrator to be executed
|
|
||||||
/// </summary>
|
|
||||||
public bool requireAdmin => true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The main body of the command
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">The command context</param>
|
|
||||||
/// <param name="message">The command message</param>
|
|
||||||
/// <param name="client">The discord bot client</param>
|
|
||||||
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
|
|
||||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
var channel = message.Channel;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var content = message.Content;
|
|
||||||
var data = content.Split(' ');
|
|
||||||
var keyword = data[1];
|
|
||||||
if (keyword.ToLower() == "help")
|
|
||||||
{
|
|
||||||
await channel.SendMessageAsync("set token [new value] -- set the value of the new token (require restart)");
|
|
||||||
await channel.SendMessageAsync("set prefix [new value] -- set the value of the new preifx (require restart)");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (keyword.ToLower())
|
|
||||||
{
|
|
||||||
case "token":
|
|
||||||
if (data.Length != 3)
|
|
||||||
{
|
|
||||||
await channel.SendMessageAsync("Invalid token !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Config.SetValue("token", data[2]);
|
|
||||||
break;
|
|
||||||
case "prefix":
|
|
||||||
if (data.Length != 3)
|
|
||||||
{
|
|
||||||
await channel.SendMessageAsync("Invalid token !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Config.SetValue("token", data[2]);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await channel.SendMessageAsync("Restart required ...");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex.Message);
|
|
||||||
await channel.SendMessageAsync("Unknown usage to this command !\nUsage: " + Usage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager;
|
|
||||||
using static PluginManager.Others.Functions;
|
|
||||||
|
|
||||||
namespace DiscordBot.Discord.Core;
|
|
||||||
|
|
||||||
internal class Boot
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The bot prefix
|
|
||||||
/// </summary>
|
|
||||||
public readonly string botPrefix;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The bot token
|
|
||||||
/// </summary>
|
|
||||||
public readonly string botToken;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The bot client
|
|
||||||
/// </summary>
|
|
||||||
public DiscordSocketClient client;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The bot command handler
|
|
||||||
/// </summary>
|
|
||||||
private CommandHandler commandServiceHandler;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The command service
|
|
||||||
/// </summary>
|
|
||||||
private CommandService service;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The main Boot constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="botToken">The bot token</param>
|
|
||||||
/// <param name="botPrefix">The bot prefix</param>
|
|
||||||
public Boot(string botToken, string botPrefix)
|
|
||||||
{
|
|
||||||
this.botPrefix = botPrefix;
|
|
||||||
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();
|
|
||||||
service = new CommandService();
|
|
||||||
|
|
||||||
CommonTasks();
|
|
||||||
|
|
||||||
await client.LoginAsync(TokenType.Bot, botToken);
|
|
||||||
await client.StartAsync();
|
|
||||||
|
|
||||||
commandServiceHandler = new CommandHandler(client, service, botPrefix);
|
|
||||||
await commandServiceHandler.InstallCommandsAsync();
|
|
||||||
|
|
||||||
await Task.Delay(2000);
|
|
||||||
while (!isReady) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CommonTasks()
|
|
||||||
{
|
|
||||||
if (client == null) return;
|
|
||||||
client.LoggedOut += Client_LoggedOut;
|
|
||||||
client.Log += Log;
|
|
||||||
client.LoggedIn += LoggedIn;
|
|
||||||
client.Ready += Ready;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task Client_LoggedOut()
|
|
||||||
{
|
|
||||||
WriteLogFile("Successfully Logged Out");
|
|
||||||
Log(new LogMessage(LogSeverity.Info, "Boot", "Successfully logged out from discord !"));
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task Ready()
|
|
||||||
{
|
|
||||||
Console.Title = "ONLINE";
|
|
||||||
isReady = true;
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task LoggedIn()
|
|
||||||
{
|
|
||||||
Console.Title = "CONNECTED";
|
|
||||||
WriteLogFile("The bot has been logged in at " + DateTime.Now.ToShortDateString() + " (" +
|
|
||||||
DateTime.Now.ToShortTimeString() + ")"
|
|
||||||
);
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task Log(LogMessage message)
|
|
||||||
{
|
|
||||||
switch (message.Severity)
|
|
||||||
{
|
|
||||||
case LogSeverity.Error:
|
|
||||||
case LogSeverity.Critical:
|
|
||||||
WriteErrFile(message.Message);
|
|
||||||
|
|
||||||
Console.ForegroundColor = ConsoleColor.Red;
|
|
||||||
Console.WriteLine("[ERROR] " + message.Message);
|
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LogSeverity.Info:
|
|
||||||
case LogSeverity.Debug:
|
|
||||||
WriteLogFile(message.Message);
|
|
||||||
|
|
||||||
Console.ForegroundColor = ConsoleColor.Cyan;
|
|
||||||
Console.WriteLine("[INFO] " + message.Message);
|
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Loaders;
|
|
||||||
using PluginManager.Others;
|
|
||||||
using PluginManager.Others.Permissions;
|
|
||||||
|
|
||||||
namespace DiscordBot.Discord.Core;
|
|
||||||
|
|
||||||
internal class CommandHandler
|
|
||||||
{
|
|
||||||
private readonly string botPrefix;
|
|
||||||
private readonly DiscordSocketClient client;
|
|
||||||
private readonly CommandService commandService;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command handler constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="client">The discord bot client</param>
|
|
||||||
/// <param name="commandService">The discord bot command service</param>
|
|
||||||
/// <param name="botPrefix">The prefix to watch for</param>
|
|
||||||
public CommandHandler(DiscordSocketClient client, CommandService commandService, string botPrefix)
|
|
||||||
{
|
|
||||||
this.client = client;
|
|
||||||
this.commandService = commandService;
|
|
||||||
this.botPrefix = botPrefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The method to initialize all commands
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task InstallCommandsAsync()
|
|
||||||
{
|
|
||||||
client.MessageReceived += MessageHandler;
|
|
||||||
await commandService.AddModulesAsync(Assembly.GetEntryAssembly(), null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The message handler for the bot
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Message">The message got from the user in discord chat</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private async Task MessageHandler(SocketMessage Message)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Message as SocketUserMessage == null) return;
|
|
||||||
|
|
||||||
var message = Message as SocketUserMessage;
|
|
||||||
|
|
||||||
if (message == null) return;
|
|
||||||
|
|
||||||
if (!message.Content.StartsWith(botPrefix)) return;
|
|
||||||
|
|
||||||
var argPos = 0;
|
|
||||||
|
|
||||||
if (message.HasMentionPrefix(client.CurrentUser, ref argPos))
|
|
||||||
{
|
|
||||||
await message.Channel.SendMessageAsync("Can not exec mentioned commands !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.Author.IsBot) return;
|
|
||||||
|
|
||||||
var context = new SocketCommandContext(client, message);
|
|
||||||
|
|
||||||
await commandService.ExecuteAsync(
|
|
||||||
context,
|
|
||||||
argPos,
|
|
||||||
null
|
|
||||||
);
|
|
||||||
|
|
||||||
var plugin = PluginLoader.Commands!.Where(p => p.Command == message.Content.Split(' ')[0].Substring(botPrefix.Length)).FirstOrDefault();
|
|
||||||
|
|
||||||
|
|
||||||
if (plugin != null)
|
|
||||||
{
|
|
||||||
if (message.Channel == await message.Author.CreateDMChannelAsync())
|
|
||||||
{
|
|
||||||
if (plugin.canUseDM)
|
|
||||||
{
|
|
||||||
if (plugin.requireAdmin)
|
|
||||||
{
|
|
||||||
if (message.Author.isAdmin())
|
|
||||||
{
|
|
||||||
plugin.Execute(context, message, client, true);
|
|
||||||
Functions.WriteLogFile($"[{message.Author.Id}] Executed command (DM) : " + plugin.Command);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await message.Channel.SendMessageAsync("This command is for administrators only !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin.Execute(context, message, client, true);
|
|
||||||
Functions.WriteLogFile($"[{message.Author.Id}] Executed command (DM) : " + plugin.Command);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await message.Channel.SendMessageAsync("This command is not for DMs");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plugin.canUseServer)
|
|
||||||
{
|
|
||||||
if (plugin.requireAdmin)
|
|
||||||
{
|
|
||||||
if (message.Author.isAdmin())
|
|
||||||
{
|
|
||||||
plugin.Execute(context, message, client, false);
|
|
||||||
Functions.WriteLogFile($"[{message.Author.Id}] Executed command : " + plugin.Command);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await message.Channel.SendMessageAsync("This command is for administrators only !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin.Execute(context, message, client, false);
|
|
||||||
Functions.WriteLogFile($"[{message.Author.Id}] Executed command : " + plugin.Command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +1,43 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
<PropertyGroup>
|
<OutputType>Exe</OutputType>
|
||||||
<OutputType>Exe</OutputType>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<Nullable>disable</Nullable>
|
||||||
<Nullable>disable</Nullable>
|
<ApplicationIcon />
|
||||||
<ApplicationIcon />
|
<StartupObject />
|
||||||
<StartupObject />
|
<SignAssembly>False</SignAssembly>
|
||||||
<SignAssembly>False</SignAssembly>
|
<IsPublishable>True</IsPublishable>
|
||||||
<IsPublishable>True</IsPublishable>
|
<AssemblyVersion>1.0.4.0</AssemblyVersion>
|
||||||
<AssemblyVersion>1.0.0.1</AssemblyVersion>
|
<PublishAot>False</PublishAot>
|
||||||
</PropertyGroup>
|
<FileVersion>1.0.4.0</FileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
<DebugType>none</DebugType>
|
<DebugType>none</DebugType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<DebugType>none</DebugType>
|
||||||
<DebugType>none</DebugType>
|
</PropertyGroup>
|
||||||
</PropertyGroup>
|
<ItemGroup>
|
||||||
|
<Compile Remove="Data\**" />
|
||||||
<ItemGroup>
|
<Compile Remove="obj\**" />
|
||||||
<Compile Remove="Data\**" />
|
<Compile Remove="Output\**" />
|
||||||
<Compile Remove="obj\**" />
|
</ItemGroup>
|
||||||
<Compile Remove="Output\**" />
|
<ItemGroup>
|
||||||
</ItemGroup>
|
<EmbeddedResource Remove="Data\**" />
|
||||||
|
<EmbeddedResource Remove="obj\**" />
|
||||||
<ItemGroup>
|
<EmbeddedResource Remove="Output\**" />
|
||||||
<EmbeddedResource Remove="Data\**" />
|
</ItemGroup>
|
||||||
<EmbeddedResource Remove="obj\**" />
|
<ItemGroup>
|
||||||
<EmbeddedResource Remove="Output\**" />
|
<None Remove="Data\**" />
|
||||||
</ItemGroup>
|
<None Remove="obj\**" />
|
||||||
|
<None Remove="Output\**" />
|
||||||
<ItemGroup>
|
<None Remove="builder.bat" />
|
||||||
<None Remove="Data\**" />
|
<None Remove="builder.sh" />
|
||||||
<None Remove="obj\**" />
|
</ItemGroup>
|
||||||
<None Remove="Output\**" />
|
<ItemGroup>
|
||||||
</ItemGroup>
|
<PackageReference Include="Spectre.Console" Version="0.49.1" />
|
||||||
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Discord.Net" Version="3.7.2" />
|
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
53
DiscordBot/Entry.cs
Normal file
53
DiscordBot/Entry.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
|
||||||
|
namespace DiscordBot;
|
||||||
|
|
||||||
|
public static class Entry
|
||||||
|
{
|
||||||
|
private static readonly string logo = @"
|
||||||
|
_____ _ _ _____ _ _ ____ _
|
||||||
|
/ ____| | | | | | __ \(_) | | | _ \ | |
|
||||||
|
| (___ ___| |_| |__ | | | |_ ___ ___ ___ _ __ __| | | |_) | ___ | |_
|
||||||
|
\___ \ / _ \ __| '_ \ | | | | / __|/ __/ _ \| '__/ _` | | _ < / _ \| __|
|
||||||
|
____) | __/ |_| | | | | |__| | \__ \ (_| (_) | | | (_| | | |_) | (_) | |_
|
||||||
|
|_____/ \___|\__|_| |_| |_____/|_|___/\___\___/|_| \__,_| |____/ \___/ \__|
|
||||||
|
|
||||||
|
|
||||||
|
";
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
if (args.Length == 1 && args[0] == "/purge_plugins" )
|
||||||
|
{
|
||||||
|
foreach (var plugin in Directory.GetFiles("./Data/Plugins", "*.dll", SearchOption.AllDirectories))
|
||||||
|
{
|
||||||
|
File.Delete(plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
||||||
|
Console.WriteLine(logo);
|
||||||
|
Console.ResetColor();
|
||||||
|
|
||||||
|
|
||||||
|
var currentDomain = AppDomain.CurrentDomain;
|
||||||
|
currentDomain.AssemblyResolve += LoadFromSameFolder;
|
||||||
|
|
||||||
|
static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
|
||||||
|
{
|
||||||
|
var folderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, "./Libraries");
|
||||||
|
var assemblyPath = Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll");
|
||||||
|
if (!File.Exists(assemblyPath)) return null;
|
||||||
|
var assembly = Assembly.LoadFrom(assemblyPath);
|
||||||
|
|
||||||
|
return assembly;
|
||||||
|
}
|
||||||
|
|
||||||
|
Program.Startup(args);
|
||||||
|
}
|
||||||
|
}
|
||||||
39
DiscordBot/Installer.cs
Normal file
39
DiscordBot/Installer.cs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using PluginManager;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace DiscordBot;
|
||||||
|
|
||||||
|
public static class Installer
|
||||||
|
{
|
||||||
|
private static async Task AskForConfig(string key, string message)
|
||||||
|
{
|
||||||
|
var value = AnsiConsole.Ask<string>($"[green]{message}[/]");
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(value))
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"Invalid {key} !");
|
||||||
|
|
||||||
|
Environment.Exit(-20);
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.AppSettings.Add(key, value);
|
||||||
|
}
|
||||||
|
public static async Task GenerateStartupConfig()
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!Config.AppSettings.ContainsKey("token"))
|
||||||
|
await AskForConfig("token", "Token:");
|
||||||
|
|
||||||
|
if(!Config.AppSettings.ContainsKey("prefix"))
|
||||||
|
await AskForConfig("prefix", "Prefix:");
|
||||||
|
|
||||||
|
if(!Config.AppSettings.ContainsKey("ServerID"))
|
||||||
|
await AskForConfig("ServerID", "Server ID:");
|
||||||
|
|
||||||
|
await Config.AppSettings.SaveToFile();
|
||||||
|
|
||||||
|
Config.Logger.Log("Config Saved", typeof(Installer));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,336 +1,144 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.Loader;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Discord.WebSocket;
|
using DiscordBot.Utilities;
|
||||||
using DiscordBot.Discord.Core;
|
using PluginManager.Bot;
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Items;
|
|
||||||
using PluginManager.Online;
|
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
using PluginManager.Others.Actions;
|
||||||
|
using Spectre.Console;
|
||||||
|
using static PluginManager.Config;
|
||||||
|
|
||||||
namespace DiscordBot;
|
namespace DiscordBot;
|
||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
private static bool loadPluginsOnStartup;
|
public static InternalActionManager internalActionManager;
|
||||||
private static bool listPluginsAtStartup;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main entry point for the application.
|
/// The main entry point for the application.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[STAThread]
|
public static void Startup(string[] args)
|
||||||
[Obsolete]
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory("./Data/Resources");
|
PreLoadComponents(args).Wait();
|
||||||
Directory.CreateDirectory("./Data/Plugins/Commands");
|
|
||||||
Directory.CreateDirectory("./Data/Plugins/Events");
|
|
||||||
PreLoadComponents().Wait();
|
|
||||||
|
|
||||||
if (!Config.ContainsKey("token") || Config.GetValue<string>("token") == null || Config.GetValue<string>("token")?.Length != 70)
|
if (!AppSettings.ContainsKey("ServerID") || !AppSettings.ContainsKey("token") || !AppSettings.ContainsKey("prefix"))
|
||||||
{
|
Installer.GenerateStartupConfig().Wait();
|
||||||
Console.WriteLine("Please insert your token");
|
|
||||||
Console.Write("Token = ");
|
|
||||||
var token = Console.ReadLine();
|
|
||||||
if (token?.Length == 59 || token?.Length == 70)
|
|
||||||
Config.AddValueToVariables("token", token, true);
|
|
||||||
else
|
|
||||||
Console.WriteLine("Invalid token");
|
|
||||||
|
|
||||||
Console.WriteLine("Please insert your prefix (max. 1 character long):");
|
HandleInput().Wait();
|
||||||
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces or numbers allowed");
|
|
||||||
Console.Write("Prefix = ");
|
|
||||||
var prefix = Console.ReadLine()![0];
|
|
||||||
|
|
||||||
if (prefix == ' ' || char.IsDigit(prefix))
|
|
||||||
return;
|
|
||||||
Config.AddValueToVariables("prefix", prefix.ToString(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Config.ContainsKey("prefix") || Config.GetValue<string>("prefix") == default)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Please insert your prefix (max. 1 character long):");
|
|
||||||
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces or numbers allowed");
|
|
||||||
Console.Write("Prefix = ");
|
|
||||||
var prefix = Console.ReadLine()![0];
|
|
||||||
if (prefix == ' ') return;
|
|
||||||
Config.AddValueToVariables("prefix", prefix.ToString(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HandleInput(args).Wait();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main loop for the discord bot
|
/// The main loop for the discord bot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="discordbooter">The discord booter used to start the application</param>
|
private static void NoGUI()
|
||||||
private static void NoGUI(Boot discordbooter)
|
|
||||||
{
|
{
|
||||||
var consoleCommandsHandler = new ConsoleCommandsHandler(discordbooter.client);
|
internalActionManager.Initialize().Wait();
|
||||||
if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp");
|
internalActionManager.Execute("plugin", "load").Wait();
|
||||||
if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs");
|
internalActionManager.Refresh().Wait();
|
||||||
|
|
||||||
Config.SaveConfig();
|
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
var cmd = Console.ReadLine();
|
||||||
|
var args = cmd.Split(' ');
|
||||||
|
var command = args[0];
|
||||||
|
args = args.Skip(1).ToArray();
|
||||||
|
if (args.Length == 0)
|
||||||
|
args = null;
|
||||||
|
|
||||||
#if DEBUG
|
internalActionManager.Execute(command, args).Wait(); // Execute the command
|
||||||
Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false);
|
|
||||||
var cmd = Console.ReadLine();
|
|
||||||
if (!consoleCommandsHandler.HandleCommand(cmd!, false) && cmd.Length > 0)
|
|
||||||
Console.WriteLine("Failed to run command " + cmd);
|
|
||||||
#else
|
|
||||||
Console_Utilities.WriteColorText("&rSethBot &c> ", false);
|
|
||||||
var cmd = Console.ReadLine();
|
|
||||||
if (!consoleCommandsHandler.HandleCommand(cmd!) && cmd.Length > 0)
|
|
||||||
Console.WriteLine("Failed to run command " + cmd);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Start the bot without user interface
|
/// Start the bot without user interface
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Returns the boot loader for the Discord Bot</returns>
|
/// <returns>Returns the bootloader for the Discord Bot</returns>
|
||||||
private static async Task<Boot> StartNoGUI()
|
private static async Task StartNoGui()
|
||||||
{
|
{
|
||||||
Console.Clear();
|
|
||||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
|
||||||
|
|
||||||
List<string> startupMessageList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage");
|
AnsiConsole.MarkupLine($"[yellow]Running on version: {AppSettings["Version"]}[/]");
|
||||||
|
AnsiConsole.MarkupLine("[yellow]Git SethBot: https://github.com/andreitdr/SethDiscordBot [/]");
|
||||||
|
AnsiConsole.MarkupLine("[yellow]Git Plugins: https://github.com/andreitdr/SethPlugins [/]");
|
||||||
|
|
||||||
foreach (var message in startupMessageList)
|
AnsiConsole.MarkupLine("[yellow]Remember to close the bot using the shutdown command ([/][red]exit[/][yellow]) or some settings won't be saved[/]");
|
||||||
Console.WriteLine(message);
|
AnsiConsole.MarkupLine($"[yellow]Running on [/][magenta]{(OperatingSystem.IsWindows() ? "Windows" : "Linux")}[/]");
|
||||||
|
|
||||||
Console.WriteLine($"Running on version: {Config.GetValue<string>("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}");
|
AnsiConsole.MarkupLine("[yellow]===== Seth Discord Bot =====[/]");
|
||||||
Console.WriteLine($"Git URL: {Config.GetValue<string>("GitURL") ?? " Could not find Git URL"}");
|
|
||||||
|
|
||||||
Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n");
|
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
|
||||||
Console.WriteLine($"============================ LOG ============================");
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var token = Config.GetValue<string>("token");
|
var token = AppSettings["token"];
|
||||||
#if DEBUG
|
var prefix = AppSettings["prefix"];
|
||||||
Console.WriteLine("Starting in DEBUG MODE");
|
|
||||||
if (!Directory.Exists("./Data/BetaTest"))
|
|
||||||
Console.WriteLine("Failed to start in debug mode because the folder ./Data/BetaTest does not exist");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
token = File.ReadAllText("./Data/BetaTest/token.txt");
|
|
||||||
|
|
||||||
//Debug mode code...
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
var prefix = Config.GetValue<string>("prefix");
|
|
||||||
|
|
||||||
var discordbooter = new Boot(token, prefix);
|
var discordbooter = new Boot(token, prefix);
|
||||||
await discordbooter.Awake();
|
await discordbooter.Awake();
|
||||||
return discordbooter;
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(ex);
|
Logger.Log(ex.ToString(), typeof(Program), LogType.CRITICAL);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clear folder
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d">Directory path</param>
|
|
||||||
private static Task ClearFolder(string d)
|
|
||||||
{
|
|
||||||
var files = Directory.GetFiles(d);
|
|
||||||
var fileNumb = files.Length;
|
|
||||||
for (var i = 0; i < fileNumb; i++)
|
|
||||||
{
|
|
||||||
File.Delete(files[i]);
|
|
||||||
Console.WriteLine("Deleting : " + files[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handle user input arguments from the startup of the application
|
/// Handle user input arguments from the startup of the application
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="args">The arguments</param>
|
private static async Task HandleInput()
|
||||||
private static async Task HandleInput(string[] args)
|
|
||||||
{
|
{
|
||||||
var len = args.Length;
|
await StartNoGui();
|
||||||
|
try
|
||||||
if (len == 3 && args[0] == "/download")
|
|
||||||
{
|
{
|
||||||
var url = args[1];
|
internalActionManager = new InternalActionManager(AppSettings["PluginFolder"], "*.dll");
|
||||||
var location = args[2];
|
NoGUI();
|
||||||
|
|
||||||
await ServerCom.DownloadFileAsync(url, location);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
catch (IOException ex)
|
||||||
if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage")))
|
|
||||||
{
|
{
|
||||||
if (args.Contains("lp") || args.Contains("loadplugins"))
|
if (ex.Message == "No process is on the other end of the pipe." || (uint)ex.HResult == 0x800700E9)
|
||||||
loadPluginsOnStartup = true;
|
|
||||||
if (args.Contains("listplugs"))
|
|
||||||
listPluginsAtStartup = true;
|
|
||||||
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (len == 0 || (args[0] != "--exec" && args[0] != "--execute"))
|
|
||||||
{
|
|
||||||
var b = await StartNoGUI();
|
|
||||||
|
|
||||||
Thread mainThread = new Thread(() => NoGUI(b));
|
|
||||||
mainThread.Start();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
|
||||||
Console.WriteLine("Execute command interface noGUI\n\n");
|
|
||||||
Console.WriteLine(
|
|
||||||
"\tCommand name\t\t\t\tDescription\n" +
|
|
||||||
"-- help | -help\t\t ------ \tDisplay the help message\n" +
|
|
||||||
"--reset-full\t\t ------ \tReset all files (clear files)\n" +
|
|
||||||
"--reset-logs\t\t ------ \tClear up the output folder\n" +
|
|
||||||
"--start\t\t ------ \tStart the bot\n" +
|
|
||||||
"exit\t\t\t ------ \tClose the application"
|
|
||||||
);
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
|
||||||
Console.Write("> ");
|
|
||||||
var message = Console.ReadLine().Split(' ');
|
|
||||||
|
|
||||||
switch (message[0])
|
|
||||||
{
|
{
|
||||||
case "--help":
|
Logger.Log("An error occured while closing the bot last time. Please consider closing the bot using the &rexit&c method !\n" +
|
||||||
case "-help":
|
"There is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !",
|
||||||
Console.ForegroundColor = ConsoleColor.DarkYellow;
|
typeof(Program), LogType.ERROR
|
||||||
Console.WriteLine("\tCommand name\t\t\t\tDescription\n" + "-- help | -help\t\t ------ \tDisplay the help message\n" + "--reset-full\t\t ------ \tReset all files (clear files)\n" + "--reset-settings\t ------ \tReset only bot settings\n" + "--reset-logs\t\t ------ \tClear up the output folder\n" + "--start\t\t ------ \tStart the bot\n" + "exit\t\t\t ------ \tClose the application");
|
);
|
||||||
break;
|
|
||||||
case "--reset-full":
|
|
||||||
await ClearFolder("./Data/Resources/");
|
|
||||||
await ClearFolder("./Output/Logs/");
|
|
||||||
await ClearFolder("./Output/Errors");
|
|
||||||
await ClearFolder("./Data/Languages/");
|
|
||||||
await ClearFolder("./Data/Plugins/Commands");
|
|
||||||
await ClearFolder("./Data/Plugins/Events");
|
|
||||||
Console.WriteLine("Successfully cleared all folders");
|
|
||||||
break;
|
|
||||||
case "--reset-logs":
|
|
||||||
await ClearFolder("./Output/Logs");
|
|
||||||
await ClearFolder("./Output/Errors");
|
|
||||||
Console.WriteLine("Successfully cleard logs folder");
|
|
||||||
break;
|
|
||||||
case "--exit":
|
|
||||||
case "exit":
|
|
||||||
Environment.Exit(0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Console.WriteLine("Failed to execute command " + message[0]);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task PreLoadComponents()
|
private static async Task PreLoadComponents(string[] args)
|
||||||
{
|
{
|
||||||
await Config.LoadConfig();
|
await Initialize();
|
||||||
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();
|
AppSettings["Version"] = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||||
|
|
||||||
if (!Config.ContainsKey("Version"))
|
PluginManager.Updater.Application.AppUpdater updater = new();
|
||||||
Config.AddValueToVariables("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), false);
|
var update = await updater.CheckForUpdates();
|
||||||
else
|
|
||||||
Config.SetValue("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
|
|
||||||
|
|
||||||
foreach (var key in OnlineDefaultKeys)
|
if (update != PluginManager.Updater.Application.Update.None)
|
||||||
{
|
{
|
||||||
if (key.Length <= 3 || !key.Contains(' ')) continue;
|
Console.WriteLine($"New update available: {update.UpdateVersion}");
|
||||||
string[] s = key.Split(' ');
|
Console.WriteLine($"Download link: {update.UpdateUrl}");
|
||||||
try
|
Console.WriteLine($"Update notes: {update.UpdateNotes}\n\n");
|
||||||
{
|
|
||||||
if (Config.ContainsKey(s[0])) Config.SetValue(s[0], s[1]);
|
Environment.Exit(0);
|
||||||
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");
|
Logger.OnLog += (sender, logMessage) =>
|
||||||
foreach (var key in onlineSettingsList)
|
|
||||||
{
|
{
|
||||||
if (key.Length <= 3 || !key.Contains(' ')) continue;
|
var messageColor = logMessage.Type switch
|
||||||
|
|
||||||
string[] s = key.Split(' ');
|
|
||||||
switch (s[0])
|
|
||||||
{
|
{
|
||||||
case "CurrentVersion":
|
LogType.INFO => "[green]",
|
||||||
string newVersion = s[1];
|
LogType.WARNING => "[yellow]",
|
||||||
if (!newVersion.Equals(Config.GetValue<string>("Version")))
|
LogType.ERROR => "[red]",
|
||||||
{
|
LogType.CRITICAL => "[red]",
|
||||||
Console.WriteLine("A new version has been released on github page.");
|
_ => "[white]"
|
||||||
Console.WriteLine("Download the new version using the following link wrote in yellow");
|
};
|
||||||
Console_Utilities.WriteColorText("&y" + Config.GetValue<string>("GitURL") + "&c");
|
|
||||||
|
|
||||||
Console.WriteLine();
|
if (logMessage.Message.Contains('['))
|
||||||
Console.WriteLine("Your product will work just fine on this outdated version, but an update is recommended.\n" +
|
{
|
||||||
"From now on, this version is no longer supported"
|
Console.WriteLine(logMessage.Message);
|
||||||
);
|
return;
|
||||||
Console_Utilities.WriteColorText("&rUse at your own risk&c");
|
|
||||||
|
|
||||||
Console_Utilities.WriteColorText("&mCurrent Version: " + Config.GetValue<string>("Version") + "&c");
|
|
||||||
Console_Utilities.WriteColorText("&gNew Version: " + newVersion + "&c");
|
|
||||||
|
|
||||||
Console.WriteLine("\n\n");
|
|
||||||
await Task.Delay(1000);
|
|
||||||
|
|
||||||
int waitTime = 20; //wait time to proceed
|
|
||||||
|
|
||||||
Console.Write($"The bot will start in {waitTime} seconds");
|
|
||||||
while (waitTime > 0)
|
|
||||||
{
|
|
||||||
await Task.Delay(1000);
|
|
||||||
waitTime--;
|
|
||||||
Console.SetCursorPosition("The bot will start in ".Length, Console.CursorTop);
|
|
||||||
Console.Write(" ");
|
|
||||||
Console.SetCursorPosition("The bot will start in ".Length, Console.CursorTop);
|
|
||||||
Console.Write(waitTime + " seconds");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Console_Utilities.Initialize();
|
AnsiConsole.MarkupLine($"{messageColor}{logMessage.ThrowTime} {logMessage.Message} [/]");
|
||||||
|
};
|
||||||
Config.SaveConfig();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
31
DiscordBot/Utilities/Console Utilities.cs
Normal file
31
DiscordBot/Utilities/Console Utilities.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace DiscordBot.Utilities;
|
||||||
|
|
||||||
|
public static class ConsoleUtilities
|
||||||
|
{
|
||||||
|
public static async Task<T> ExecuteWithProgressBar<T>(Task<T> function, string message)
|
||||||
|
{
|
||||||
|
T result = default;
|
||||||
|
await AnsiConsole.Progress()
|
||||||
|
.AutoClear(true)
|
||||||
|
.Columns(new TaskDescriptionColumn(), new ProgressBarColumn(), new PercentageColumn())
|
||||||
|
.StartAsync(
|
||||||
|
async ctx =>
|
||||||
|
{
|
||||||
|
var task = ctx.AddTask(message);
|
||||||
|
task.IsIndeterminate = true;
|
||||||
|
result = await function;
|
||||||
|
task.Increment(100);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
56
DiscordBot/Utilities/TableData.cs
Normal file
56
DiscordBot/Utilities/TableData.cs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices.ComTypes;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using PluginManager.Others;
|
||||||
|
using Spectre.Console;
|
||||||
|
using Spectre.Console.Rendering;
|
||||||
|
|
||||||
|
namespace DiscordBot.Utilities
|
||||||
|
{
|
||||||
|
public class TableData
|
||||||
|
{
|
||||||
|
public List<string> Columns;
|
||||||
|
public List<OneOf<string, IRenderable>[]> Rows;
|
||||||
|
|
||||||
|
public TableData()
|
||||||
|
{
|
||||||
|
Columns = new List<string>();
|
||||||
|
Rows = new List<OneOf<string, IRenderable>[]>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TableData(List<string> columns)
|
||||||
|
{
|
||||||
|
Columns = columns;
|
||||||
|
Rows = new List<OneOf<string, IRenderable>[]>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsEmpty => Rows.Count == 0;
|
||||||
|
public bool HasRoundBorders { get; set; } = true;
|
||||||
|
public bool DisplayLinesBetweenRows { get; set; } = false;
|
||||||
|
|
||||||
|
public void AddRow(OneOf<string, IRenderable>[] row)
|
||||||
|
{
|
||||||
|
Rows.Add(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrintTable()
|
||||||
|
{
|
||||||
|
var table = new Table();
|
||||||
|
table.Border(this.HasRoundBorders ? TableBorder.Rounded : TableBorder.Square);
|
||||||
|
table.AddColumns(this.Columns.ToArray());
|
||||||
|
table.ShowRowSeparators = DisplayLinesBetweenRows;
|
||||||
|
foreach (var row in this.Rows)
|
||||||
|
{
|
||||||
|
table.AddRow(row.Select(element => element.Match(
|
||||||
|
(data) => new Markup(data),
|
||||||
|
(data) => data
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
AnsiConsole.Write(table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
DiscordBot/builder.bat
Normal file
35
DiscordBot/builder.bat
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
@echo off
|
||||||
|
echo "Building..."
|
||||||
|
|
||||||
|
echo "Building linux-x64 not self-contained"
|
||||||
|
dotnet publish -r linux-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/linux-x64
|
||||||
|
|
||||||
|
echo "Building win-x64 not self-contained"
|
||||||
|
dotnet publish -r win-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/win-x64
|
||||||
|
|
||||||
|
echo "Building osx-x64 not self-contained"
|
||||||
|
dotnet publish -r osx-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/osx-x64
|
||||||
|
|
||||||
|
|
||||||
|
echo "Building linux-x64 self-contained"
|
||||||
|
dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/linux-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Building win-x64 self-contained"
|
||||||
|
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/win-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Building osx-x64 self-contained"
|
||||||
|
dotnet publish -r osx-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/osx-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Zipping..."
|
||||||
|
mkdir ../publish/zip
|
||||||
|
|
||||||
|
|
||||||
|
zip -r ../publish/zip/linux-x64.zip ../publish/linux-x64
|
||||||
|
zip -r ../publish/zip/win-x64.zip ../publish/win-x64
|
||||||
|
zip -r ../publish/zip/osx-x64.zip ../publish/osx-x64
|
||||||
|
|
||||||
|
zip -r ../publish/zip/linux-x64-selfcontained.zip ../publish/linux-x64-selfcontained
|
||||||
|
zip -r ../publish/zip/win-x64-selfcontained.zip ../publish/win-x64-selfcontained
|
||||||
|
zip -r ../publish/zip/osx-x64-selfcontained.zip ../publish/osx-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Done!"
|
||||||
36
DiscordBot/builder.sh
Normal file
36
DiscordBot/builder.sh
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# All files in this directory will be copied to the root of the container
|
||||||
|
|
||||||
|
echo "Building..."
|
||||||
|
|
||||||
|
echo "Building linux-x64 not self-contained"
|
||||||
|
dotnet publish -r linux-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ./publish/linux-x64
|
||||||
|
|
||||||
|
echo "Building win-x64 not self-contained"
|
||||||
|
dotnet publish -r win-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ./publish/win-x64
|
||||||
|
|
||||||
|
echo "Building osx-x64 not self-contained"
|
||||||
|
dotnet publish -r osx-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ./publish/osx-x64
|
||||||
|
|
||||||
|
#One file per platform
|
||||||
|
echo "Building linux-x64 self-contained"
|
||||||
|
dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ./publish/linux-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Building win-x64 self-contained"
|
||||||
|
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ./publish/win-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Building osx-x64 self-contained"
|
||||||
|
dotnet publish -r osx-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ./publish/osx-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Zipping..."
|
||||||
|
mkdir ./publish/zip
|
||||||
|
|
||||||
|
|
||||||
|
zip -r ./publish/zip/linux-x64.zip ./publish/linux-x64
|
||||||
|
zip -r ./publish/zip/win-x64.zip ./publish/win-x64
|
||||||
|
zip -r ./publish/zip/osx-x64.zip ./publish/osx-x64
|
||||||
|
|
||||||
|
zip -r ./publish/zip/linux-x64-selfcontained.zip ./publish/linux-x64-selfcontained
|
||||||
|
zip -r ./publish/zip/win-x64-selfcontained.zip ./publish/win-x64-selfcontained
|
||||||
|
zip -r ./publish/zip/osx-x64-selfcontained.zip ./publish/osx-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Done!"
|
||||||
454
DiscordBotUI/.gitignore
vendored
Normal file
454
DiscordBotUI/.gitignore
vendored
Normal file
@@ -0,0 +1,454 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# Tye
|
||||||
|
.tye/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
|
|
||||||
|
##
|
||||||
|
## Visual studio for Mac
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
|
# globs
|
||||||
|
Makefile.in
|
||||||
|
*.userprefs
|
||||||
|
*.usertasks
|
||||||
|
config.make
|
||||||
|
config.status
|
||||||
|
aclocal.m4
|
||||||
|
install-sh
|
||||||
|
autom4te.cache/
|
||||||
|
*.tar.gz
|
||||||
|
tarballs/
|
||||||
|
test-results/
|
||||||
|
|
||||||
|
# Mac bundle stuff
|
||||||
|
*.dmg
|
||||||
|
*.app
|
||||||
|
|
||||||
|
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# JetBrains Rider
|
||||||
|
.idea/
|
||||||
|
*.sln.iml
|
||||||
|
|
||||||
|
##
|
||||||
|
## Visual Studio Code
|
||||||
|
##
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<!--If you are willing to use Windows/MacOS native APIs you will need to create 3 projects.
|
||||||
|
One for Windows with net8.0-windows TFM, one for MacOS with net8.0-macos and one with net8.0 TFM for Linux.-->
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Avalonia.Desktop" Version="11.0.10" />
|
||||||
|
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||||
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.10" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\DiscordBotUI\DiscordBotUI.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
25
DiscordBotUI/DiscordBotUI.Desktop/Program.cs
Normal file
25
DiscordBotUI/DiscordBotUI.Desktop/Program.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using Avalonia;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.Desktop
|
||||||
|
{
|
||||||
|
internal sealed class Program
|
||||||
|
{
|
||||||
|
// Initialization code. Don't use any Avalonia, third-party APIs or any
|
||||||
|
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
|
||||||
|
// yet and stuff might break.
|
||||||
|
[STAThread]
|
||||||
|
public static void Main(string[] args) => BuildAvaloniaApp()
|
||||||
|
.StartWithClassicDesktopLifetime(args);
|
||||||
|
|
||||||
|
// Avalonia configuration, don't remove; also used by visual designer.
|
||||||
|
public static AppBuilder BuildAvaloniaApp()
|
||||||
|
=> AppBuilder.Configure<App>()
|
||||||
|
.UsePlatformDetect()
|
||||||
|
.WithInterFont()
|
||||||
|
.LogToTrace()
|
||||||
|
.UseReactiveUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"profiles": {
|
||||||
|
"DiscordBotUI.Desktop": {
|
||||||
|
"commandName": "Project"
|
||||||
|
},
|
||||||
|
"WSL": {
|
||||||
|
"commandName": "WSL2",
|
||||||
|
"distributionName": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
DiscordBotUI/DiscordBotUI.Desktop/app.manifest
Normal file
18
DiscordBotUI/DiscordBotUI.Desktop/app.manifest
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<!-- This manifest is used on Windows only.
|
||||||
|
Don't remove it as it might cause problems with window transparency and embedded controls.
|
||||||
|
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="DiscordBotUI.Desktop"/>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- A list of the Windows versions that this application has been tested on
|
||||||
|
and is designed to work with. Uncomment the appropriate elements
|
||||||
|
and Windows will automatically select the most compatible environment. -->
|
||||||
|
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
</assembly>
|
||||||
35
DiscordBotUI/DiscordBotUI.Desktop/builder.bat
Normal file
35
DiscordBotUI/DiscordBotUI.Desktop/builder.bat
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
@echo off
|
||||||
|
echo "Building..."
|
||||||
|
|
||||||
|
echo "Building linux-x64 not self-contained"
|
||||||
|
dotnet publish -r linux-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/linux-x64
|
||||||
|
|
||||||
|
echo "Building win-x64 not self-contained"
|
||||||
|
dotnet publish -r win-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/win-x64
|
||||||
|
|
||||||
|
echo "Building osx-x64 not self-contained"
|
||||||
|
dotnet publish -r osx-x64 -p:PublishSingleFile=false --self-contained true -c Release -o ../publish/osx-x64
|
||||||
|
|
||||||
|
|
||||||
|
echo "Building linux-x64 self-contained"
|
||||||
|
dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/linux-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Building win-x64 self-contained"
|
||||||
|
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/win-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Building osx-x64 self-contained"
|
||||||
|
dotnet publish -r osx-x64 -p:PublishSingleFile=true --self-contained true -c Release -o ../publish/osx-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Zipping..."
|
||||||
|
mkdir ../publish/zip
|
||||||
|
|
||||||
|
|
||||||
|
zip -r ../publish/zip/linux-x64.zip ../publish/linux-x64
|
||||||
|
zip -r ../publish/zip/win-x64.zip ../publish/win-x64
|
||||||
|
zip -r ../publish/zip/osx-x64.zip ../publish/osx-x64
|
||||||
|
|
||||||
|
zip -r ../publish/zip/linux-x64-selfcontained.zip ../publish/linux-x64-selfcontained
|
||||||
|
zip -r ../publish/zip/win-x64-selfcontained.zip ../publish/win-x64-selfcontained
|
||||||
|
zip -r ../publish/zip/osx-x64-selfcontained.zip ../publish/osx-x64-selfcontained
|
||||||
|
|
||||||
|
echo "Done!"
|
||||||
17
DiscordBotUI/DiscordBotUI/App.axaml
Normal file
17
DiscordBotUI/DiscordBotUI/App.axaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<Application xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="using:DiscordBotUI"
|
||||||
|
x:Class="DiscordBotUI.App"
|
||||||
|
RequestedThemeVariant="Default">
|
||||||
|
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
|
||||||
|
|
||||||
|
<Application.DataTemplates>
|
||||||
|
<local:ViewLocator/>
|
||||||
|
</Application.DataTemplates>
|
||||||
|
|
||||||
|
|
||||||
|
<Application.Styles>
|
||||||
|
<FluentTheme />
|
||||||
|
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
|
||||||
|
</Application.Styles>
|
||||||
|
</Application>
|
||||||
31
DiscordBotUI/DiscordBotUI/App.axaml.cs
Normal file
31
DiscordBotUI/DiscordBotUI/App.axaml.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
|
||||||
|
using DiscordBotUI.ViewModels;
|
||||||
|
using DiscordBotUI.Views;
|
||||||
|
|
||||||
|
namespace DiscordBotUI
|
||||||
|
{
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
AvaloniaXamlLoader.Load(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnFrameworkInitializationCompleted()
|
||||||
|
{
|
||||||
|
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||||
|
{
|
||||||
|
desktop.MainWindow = new HomePage();
|
||||||
|
}
|
||||||
|
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
|
||||||
|
{
|
||||||
|
singleViewPlatform.MainView = new HomePage();
|
||||||
|
}
|
||||||
|
|
||||||
|
base.OnFrameworkInitializationCompleted();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
DiscordBotUI/DiscordBotUI/Assets/avalonia-logo.ico
Normal file
BIN
DiscordBotUI/DiscordBotUI/Assets/avalonia-logo.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 172 KiB |
90
DiscordBotUI/DiscordBotUI/Bot/Commands/Help.cs
Normal file
90
DiscordBotUI/DiscordBotUI/Bot/Commands/Help.cs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Discord;
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.Bot.Commands;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The help command
|
||||||
|
/// </summary>
|
||||||
|
internal class Help: DBCommand
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Command name
|
||||||
|
/// </summary>
|
||||||
|
public string Command => "help";
|
||||||
|
|
||||||
|
public List<string> Aliases => null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command Description
|
||||||
|
/// </summary>
|
||||||
|
public string Description => "This command allows you to check all loaded commands";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command usage
|
||||||
|
/// </summary>
|
||||||
|
public string Usage => "help <command>";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the command require administrator to be executed
|
||||||
|
/// </summary>
|
||||||
|
public bool requireAdmin => false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The main body of the command
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">The command context</param>
|
||||||
|
public void ExecuteServer(DbCommandExecutingArguments args)
|
||||||
|
{
|
||||||
|
if (args.arguments is not null)
|
||||||
|
{
|
||||||
|
var e = GenerateHelpCommand(args.arguments[0]);
|
||||||
|
if (e is null)
|
||||||
|
args.context.Channel.SendMessageAsync("Unknown Command " + args.arguments[0]);
|
||||||
|
else
|
||||||
|
args.context.Channel.SendMessageAsync(embed: e.Build());
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var embedBuilder = new EmbedBuilder();
|
||||||
|
|
||||||
|
var adminCommands = "";
|
||||||
|
var normalCommands = "";
|
||||||
|
|
||||||
|
foreach (var cmd in PluginLoader.Commands)
|
||||||
|
if (cmd.requireAdmin)
|
||||||
|
adminCommands += cmd.Command + " ";
|
||||||
|
else
|
||||||
|
normalCommands += cmd.Command + " ";
|
||||||
|
|
||||||
|
|
||||||
|
if (adminCommands.Length > 0)
|
||||||
|
embedBuilder.AddField("Admin Commands", adminCommands);
|
||||||
|
if (normalCommands.Length > 0)
|
||||||
|
embedBuilder.AddField("Normal Commands", normalCommands);
|
||||||
|
args.context.Channel.SendMessageAsync(embed: embedBuilder.Build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private EmbedBuilder GenerateHelpCommand(string command)
|
||||||
|
{
|
||||||
|
var embedBuilder = new EmbedBuilder();
|
||||||
|
var cmd = PluginLoader.Commands.Find(p => p.Command == command ||
|
||||||
|
p.Aliases is not null && p.Aliases.Contains(command)
|
||||||
|
);
|
||||||
|
if (cmd == null) return null;
|
||||||
|
|
||||||
|
embedBuilder.AddField("Usage", Config.AppSettings["prefix"] + cmd.Usage);
|
||||||
|
embedBuilder.AddField("Description", cmd.Description);
|
||||||
|
if (cmd.Aliases is null)
|
||||||
|
return embedBuilder;
|
||||||
|
embedBuilder.AddField("Alias", cmd.Aliases.Count == 0 ? "-" : string.Join(", ", cmd.Aliases));
|
||||||
|
|
||||||
|
return embedBuilder;
|
||||||
|
}
|
||||||
|
}
|
||||||
83
DiscordBotUI/DiscordBotUI/Bot/DiscordBot.cs
Normal file
83
DiscordBotUI/DiscordBotUI/Bot/DiscordBot.cs
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Interfaces;
|
||||||
|
using PluginManager.Loaders;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.Bot
|
||||||
|
{
|
||||||
|
internal class DiscordBot
|
||||||
|
{
|
||||||
|
private readonly string[] _StartArguments;
|
||||||
|
|
||||||
|
public DiscordBot(string[] args)
|
||||||
|
{
|
||||||
|
this._StartArguments = args;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task InitializeBot()
|
||||||
|
{
|
||||||
|
string token = Config.AppSettings["token"];
|
||||||
|
string prefix = Config.AppSettings["prefix"];
|
||||||
|
PluginManager.Bot.Boot discordBooter = new PluginManager.Bot.Boot(token, prefix);
|
||||||
|
await discordBooter.Awake();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task LoadPlugins()
|
||||||
|
{
|
||||||
|
var loader = new PluginLoader(Config.DiscordBot.Client);
|
||||||
|
|
||||||
|
loader.OnCommandLoaded += (data) =>
|
||||||
|
{
|
||||||
|
if (data.IsSuccess)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully loaded command : " + data.PluginName, typeof(ICommandAction),
|
||||||
|
LogType.INFO
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Failed to load command : " + data.PluginName + " because " + data.ErrorMessage,
|
||||||
|
typeof(ICommandAction), LogType.ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
loader.OnEventLoaded += (data) =>
|
||||||
|
{
|
||||||
|
if (data.IsSuccess)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully loaded event : " + data.PluginName, typeof(ICommandAction),
|
||||||
|
LogType.INFO
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Failed to load event : " + data.PluginName + " because " + data.ErrorMessage,
|
||||||
|
typeof(ICommandAction), LogType.ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
loader.OnSlashCommandLoaded += (data) =>
|
||||||
|
{
|
||||||
|
if (data.IsSuccess)
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully loaded slash command : " + data.PluginName, typeof(ICommandAction),
|
||||||
|
LogType.INFO
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Failed to load slash command : " + data.PluginName + " because " + data.ErrorMessage,
|
||||||
|
typeof(ICommandAction), LogType.ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
await loader.LoadPlugins();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
25
DiscordBotUI/DiscordBotUI/DiscordBotUI.csproj
Normal file
25
DiscordBotUI/DiscordBotUI/DiscordBotUI.csproj
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<AvaloniaResource Include="Assets\**" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Avalonia" Version="11.0.10" />
|
||||||
|
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.10" />
|
||||||
|
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.0.10" />
|
||||||
|
<PackageReference Include="Avalonia.ReactiveUI" Version="11.0.10" />
|
||||||
|
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||||
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.10" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\PluginManager\PluginManager.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
33
DiscordBotUI/DiscordBotUI/ViewLocator.cs
Normal file
33
DiscordBotUI/DiscordBotUI/ViewLocator.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Controls.Templates;
|
||||||
|
|
||||||
|
using DiscordBotUI.ViewModels;
|
||||||
|
|
||||||
|
namespace DiscordBotUI
|
||||||
|
{
|
||||||
|
public class ViewLocator : IDataTemplate
|
||||||
|
{
|
||||||
|
public Control? Build(object? data)
|
||||||
|
{
|
||||||
|
if (data is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var name = data.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
|
||||||
|
var type = Type.GetType(name);
|
||||||
|
|
||||||
|
if (type != null)
|
||||||
|
{
|
||||||
|
return (Control)Activator.CreateInstance(type)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TextBlock { Text = "Not Found: " + name };
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Match(object? data)
|
||||||
|
{
|
||||||
|
return data is ViewModelBase;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
22
DiscordBotUI/DiscordBotUI/ViewModels/OnlinePlugin.cs
Normal file
22
DiscordBotUI/DiscordBotUI/ViewModels/OnlinePlugin.cs
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.ViewModels
|
||||||
|
{
|
||||||
|
public class OnlinePlugin
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public string Version { get; set; }
|
||||||
|
|
||||||
|
public OnlinePlugin(string name, string description, string version) {
|
||||||
|
Name = name;
|
||||||
|
Description = description;
|
||||||
|
Version = version;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
22
DiscordBotUI/DiscordBotUI/ViewModels/Plugin.cs
Normal file
22
DiscordBotUI/DiscordBotUI/ViewModels/Plugin.cs
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.ViewModels
|
||||||
|
{
|
||||||
|
public class Plugin
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Version { get; set; }
|
||||||
|
public bool IsMarkedToUninstall { get; set; }
|
||||||
|
|
||||||
|
public Plugin(string Name, string Version, bool isMarkedToUninstall)
|
||||||
|
{
|
||||||
|
this.Name = Name;
|
||||||
|
this.Version = Version;
|
||||||
|
IsMarkedToUninstall = isMarkedToUninstall;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
DiscordBotUI/DiscordBotUI/ViewModels/ViewModelBase.cs
Normal file
11
DiscordBotUI/DiscordBotUI/ViewModels/ViewModelBase.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
using ReactiveUI;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.ViewModels
|
||||||
|
{
|
||||||
|
public class ViewModelBase : ReactiveObject
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
41
DiscordBotUI/DiscordBotUI/Views/HomePage.axaml
Normal file
41
DiscordBotUI/DiscordBotUI/Views/HomePage.axaml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="DiscordBotUI.Views.HomePage"
|
||||||
|
Title="HomePage" MinWidth="900" MinHeight="500">
|
||||||
|
|
||||||
|
<DockPanel LastChildFill="True">
|
||||||
|
<Menu DockPanel.Dock="Top">
|
||||||
|
<MenuItem Header="Settings" Click="SettingsMenuClick"></MenuItem>
|
||||||
|
<MenuItem Header="Installed Plugins" Click="PluginsMenuClick"></MenuItem>
|
||||||
|
<MenuItem Header="New Plugins" Click="NewPluginsMenuClick"></MenuItem>
|
||||||
|
</Menu>
|
||||||
|
|
||||||
|
<Border Width="500" BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Right">
|
||||||
|
<RelativePanel Margin="10">
|
||||||
|
<Label Content="Bot Token: " Name="labelToken" RelativePanel.AlignTopWithPanel="True"/>
|
||||||
|
<TextBox Name="textBoxToken" Text="" IsReadOnly="True" RelativePanel.AlignRightWithPanel="True" Width="350" />
|
||||||
|
|
||||||
|
<Label Content="Bot Prefix: " Name="labelPrefix" RelativePanel.Below="labelToken" Margin="0,20,0,0"/>
|
||||||
|
<TextBox Name="textBoxPrefix" Text="" RelativePanel.AlignRightWithPanel="True" RelativePanel.Below="textBoxToken"
|
||||||
|
IsReadOnly="True" Margin="0,10,0,0" Width="350" />
|
||||||
|
|
||||||
|
<Label Content="Server Id: " Name="labelServerId" RelativePanel.Below="labelPrefix" Margin="0,20,0,0"/>
|
||||||
|
<TextBox Name="textBoxServerId" Text="" RelativePanel.AlignRightWithPanel="True"
|
||||||
|
IsReadOnly="True" RelativePanel.Below="textBoxPrefix" Margin="0,10,0,0" Width="350" />
|
||||||
|
|
||||||
|
<Button Click="ButtonStartBotClick" Name="buttonStartBot" Content="Start" RelativePanel.AlignBottomWithPanel="True" Margin="0,-100,0,0"
|
||||||
|
Width="120" Height="40" Background="#FF008CFF" Foreground="White" BorderThickness="0" CornerRadius="5" FontWeight="Bold"
|
||||||
|
RelativePanel.AlignHorizontalCenterWithPanel="True" />
|
||||||
|
</RelativePanel>
|
||||||
|
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Background="White" BorderBrush="Black" BorderThickness="1">
|
||||||
|
<TextBlock Name="logTextBlock" Foreground="Black" Text="" />
|
||||||
|
</Border>
|
||||||
|
</DockPanel>
|
||||||
|
|
||||||
|
</Window>
|
||||||
80
DiscordBotUI/DiscordBotUI/Views/HomePage.axaml.cs
Normal file
80
DiscordBotUI/DiscordBotUI/Views/HomePage.axaml.cs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.Threading;
|
||||||
|
|
||||||
|
using DiscordBotUI.Bot;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Others.Logger;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.Views;
|
||||||
|
|
||||||
|
public partial class HomePage : Window
|
||||||
|
{
|
||||||
|
private readonly DiscordBot _DiscordBot;
|
||||||
|
|
||||||
|
public HomePage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
_DiscordBot = new DiscordBot(null!);
|
||||||
|
|
||||||
|
Loaded += HomePage_Loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void HomePage_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
await Config.Initialize();
|
||||||
|
|
||||||
|
if(!Config.AppSettings.ContainsAllKeys("token", "prefix"))
|
||||||
|
{
|
||||||
|
await new SettingsPage().ShowDialog(this);
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(Config.AppSettings["token"]) || string.IsNullOrWhiteSpace(Config.AppSettings["prefix"]))
|
||||||
|
Environment.Exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
textBoxToken.Text = Config.AppSettings["token"];
|
||||||
|
textBoxPrefix.Text = Config.AppSettings["prefix"];
|
||||||
|
textBoxServerId.Text = Config.AppSettings["ServerID"];
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetTextToTB(Log logMessage)
|
||||||
|
{
|
||||||
|
logTextBlock.Text += $"[{logMessage.Type}] [{logMessage.ThrowTime.ToShortTimeString()}] {logMessage.Message}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ButtonStartBotClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
Config.Logger.OnLog += async (sender, logMessage) =>
|
||||||
|
{
|
||||||
|
await Dispatcher.UIThread.InvokeAsync(() => SetTextToTB(logMessage), DispatcherPriority.Background);
|
||||||
|
};
|
||||||
|
|
||||||
|
await _DiscordBot.InitializeBot();
|
||||||
|
|
||||||
|
await _DiscordBot.LoadPlugins();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void SettingsMenuClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
//await new SettingsPage().ShowDialog(this);
|
||||||
|
new SettingsPage().Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void PluginsMenuClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
//await new PluginsPage().ShowDialog(this);
|
||||||
|
new PluginsPage().Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NewPluginsMenuClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
new PluginInstaller().Show();
|
||||||
|
}
|
||||||
|
}
|
||||||
33
DiscordBotUI/DiscordBotUI/Views/PluginInstaller.axaml
Normal file
33
DiscordBotUI/DiscordBotUI/Views/PluginInstaller.axaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:views="clr-namespace:DiscordBotUI.Views;assembly=DiscordBotUI"
|
||||||
|
xmlns:viewmodels="using:DiscordBotUI.ViewModels"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="300"
|
||||||
|
x:Class="DiscordBotUI.Views.PluginInstaller"
|
||||||
|
x:DataType="views:PluginInstaller"
|
||||||
|
Title="PluginInstaller"
|
||||||
|
Name="PluginInstallerWindow"
|
||||||
|
>
|
||||||
|
|
||||||
|
<DataGrid Name="dataGridInstallablePlugins" ItemsSource="{Binding Plugins}">
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTextColumn Header="Plugin Name" Foreground="Aquamarine" Binding="{Binding Name}"/>
|
||||||
|
<DataGridTextColumn Header="Plugin Version" Binding="{Binding Version}"/>
|
||||||
|
<DataGridTextColumn Header="Plugin Description" Binding="{Binding Description}" Width="*"/>
|
||||||
|
|
||||||
|
<DataGridTemplateColumn Header="Download">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate DataType="viewmodels:OnlinePlugin">
|
||||||
|
<Button Content="Download"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
Command="{Binding InstallPlugin, RelativeSource={RelativeSource AncestorType=views:PluginInstaller}}"
|
||||||
|
CommandParameter="{Binding Name}"/>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
</DataGrid.Columns>
|
||||||
|
</DataGrid>
|
||||||
|
</Window>
|
||||||
62
DiscordBotUI/DiscordBotUI/Views/PluginInstaller.axaml.cs
Normal file
62
DiscordBotUI/DiscordBotUI/Views/PluginInstaller.axaml.cs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Input;
|
||||||
|
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Markup.Xaml.Templates;
|
||||||
|
using Avalonia.Media;
|
||||||
|
|
||||||
|
using DiscordBotUI.ViewModels;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
using PluginManager.Plugin;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.Views;
|
||||||
|
|
||||||
|
public partial class PluginInstaller : Window
|
||||||
|
{
|
||||||
|
|
||||||
|
public ObservableCollection<OnlinePlugin> Plugins { get; private set; }
|
||||||
|
|
||||||
|
public PluginInstaller()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
Loaded += OnPageLoaded;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnPageLoaded(object? sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (Config.PluginsManager is null) return;
|
||||||
|
|
||||||
|
List<PluginOnlineInfo>? onlineInfos = await Config.PluginsManager.GetPluginsList();
|
||||||
|
|
||||||
|
if(onlineInfos is null) return;
|
||||||
|
|
||||||
|
List<OnlinePlugin> plugins = new List<OnlinePlugin>();
|
||||||
|
|
||||||
|
foreach(PluginOnlineInfo onlinePlugin in onlineInfos)
|
||||||
|
{
|
||||||
|
plugins.Add(new OnlinePlugin(onlinePlugin.Name, onlinePlugin.Description, onlinePlugin.Version.ToShortString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Plugins = new ObservableCollection<OnlinePlugin>(plugins);
|
||||||
|
|
||||||
|
dataGridInstallablePlugins.ItemsSource = Plugins;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void InstallPlugin(string name)
|
||||||
|
{
|
||||||
|
|
||||||
|
PluginOnlineInfo? info = await Config.PluginsManager.GetPluginDataByName(name);
|
||||||
|
if(info is null) return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
await Config.PluginsManager.InstallPlugin(info, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
25
DiscordBotUI/DiscordBotUI/Views/PluginsPage.axaml
Normal file
25
DiscordBotUI/DiscordBotUI/Views/PluginsPage.axaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
xmlns:model ="clr-namespace:DiscordBotUI.Views;assembly=DiscordBotUI"
|
||||||
|
x:Class="DiscordBotUI.Views.PluginsPage"
|
||||||
|
Title="Plugins Page"
|
||||||
|
x:DataType="model:PluginsPage">
|
||||||
|
|
||||||
|
|
||||||
|
<DataGrid Name="dataGridPlugins" Margin="20" ItemsSource="{Binding Plugins}"
|
||||||
|
IsReadOnly="False"
|
||||||
|
CanUserSortColumns="False"
|
||||||
|
GridLinesVisibility="All"
|
||||||
|
AutoGenerateColumns="False"
|
||||||
|
BorderThickness="1" BorderBrush="Gray">
|
||||||
|
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTextColumn Header="Plugin Name" Foreground="Aquamarine" Binding="{Binding Name}"/>
|
||||||
|
<DataGridTextColumn Header="Plugin Version" Binding="{Binding Version}"/>
|
||||||
|
<DataGridCheckBoxColumn Header="Is Marked for Uninstall" Binding="{Binding IsMarkedToUninstall}"/>
|
||||||
|
</DataGrid.Columns>
|
||||||
|
</DataGrid>
|
||||||
|
</Window>
|
||||||
43
DiscordBotUI/DiscordBotUI/Views/PluginsPage.axaml.cs
Normal file
43
DiscordBotUI/DiscordBotUI/Views/PluginsPage.axaml.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
|
||||||
|
using DiscordBotUI.ViewModels;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.Views;
|
||||||
|
|
||||||
|
|
||||||
|
public partial class PluginsPage: Window
|
||||||
|
{
|
||||||
|
|
||||||
|
public ObservableCollection<Plugin> Plugins { get; private set; }
|
||||||
|
|
||||||
|
public PluginsPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
Loaded += OnPageLoaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void OnPageLoaded(object? sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (Config.PluginsManager is null) return;
|
||||||
|
|
||||||
|
var plugins = await Config.PluginsManager.GetInstalledPlugins();
|
||||||
|
var localList = new List<Plugin>();
|
||||||
|
foreach (var plugin in plugins)
|
||||||
|
{
|
||||||
|
localList.Add(new Plugin(plugin.PluginName, plugin.PluginVersion.ToShortString(), plugin.IsMarkedToUninstall));
|
||||||
|
}
|
||||||
|
|
||||||
|
Plugins = new ObservableCollection<Plugin>(localList);
|
||||||
|
|
||||||
|
|
||||||
|
dataGridPlugins.ItemsSource = Plugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
26
DiscordBotUI/DiscordBotUI/Views/SettingsPage.axaml
Normal file
26
DiscordBotUI/DiscordBotUI/Views/SettingsPage.axaml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="500" d:DesignHeight="200"
|
||||||
|
x:Class="DiscordBotUI.Views.SettingsPage"
|
||||||
|
Title="SettingsPage" Width="500" Height="200" MinWidth="500" MaxWidth="500" MinHeight="200" MaxHeight="200">
|
||||||
|
<RelativePanel Margin="10,10,10,0">
|
||||||
|
<Label Content="Bot Token: " Name="labelToken" RelativePanel.AlignTopWithPanel="True"/>
|
||||||
|
<TextBox Name="textBoxToken" Text="" IsReadOnly="False" RelativePanel.AlignRightWithPanel="True" Width="350" />
|
||||||
|
|
||||||
|
<Label Content="Bot Prefix: " Name="labelPrefix" RelativePanel.Below="labelToken" Margin="0,20,0,0"/>
|
||||||
|
<TextBox Name="textBoxPrefix" Text="" RelativePanel.AlignRightWithPanel="True" RelativePanel.Below="textBoxToken"
|
||||||
|
IsReadOnly="False" Margin="0,10,0,0" Width="350" />
|
||||||
|
|
||||||
|
<Label Content="Server Id: " Name="labelServerId" RelativePanel.Below="labelPrefix" Margin="0,20,0,0"/>
|
||||||
|
<TextBox Name="textBoxServerId" Text="" RelativePanel.AlignRightWithPanel="True"
|
||||||
|
IsReadOnly="False" RelativePanel.Below="textBoxPrefix" Margin="0,10,0,0" Width="350" />
|
||||||
|
|
||||||
|
<Label Name="labelErrorMessage" Foreground="Red" RelativePanel.Below="textBoxServerId" />
|
||||||
|
|
||||||
|
<Button Name="buttonSaveSettings" Click="ButtonSaveSettingsClick" Content="Save" RelativePanel.AlignBottomWithPanel="True" Margin="0,-50,0,0"
|
||||||
|
Width="120" Height="40" Background="#FF008CFF" Foreground="White" BorderThickness="0" CornerRadius="5" FontWeight="Bold"
|
||||||
|
RelativePanel.AlignHorizontalCenterWithPanel="True" />
|
||||||
|
</RelativePanel>
|
||||||
|
</Window>
|
||||||
44
DiscordBotUI/DiscordBotUI/Views/SettingsPage.axaml.cs
Normal file
44
DiscordBotUI/DiscordBotUI/Views/SettingsPage.axaml.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
|
||||||
|
using PluginManager;
|
||||||
|
|
||||||
|
namespace DiscordBotUI.Views;
|
||||||
|
|
||||||
|
public partial class SettingsPage : Window
|
||||||
|
{
|
||||||
|
public SettingsPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ButtonSaveSettingsClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
string token = textBoxToken.Text;
|
||||||
|
string botPrefix = textBoxPrefix.Text;
|
||||||
|
string serverId = textBoxServerId.Text;
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(serverId)) serverId = string.Empty;
|
||||||
|
if (string.IsNullOrWhiteSpace(token))
|
||||||
|
{
|
||||||
|
labelErrorMessage.Content = "The token is invalid";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(string.IsNullOrWhiteSpace(botPrefix) || botPrefix.Length > 1 || botPrefix.Length < 1)
|
||||||
|
{
|
||||||
|
labelErrorMessage.Content = "The prefix is invalid";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.AppSettings.Add("token", token);
|
||||||
|
Config.AppSettings.Add("prefix", botPrefix);
|
||||||
|
Config.AppSettings.Add("ServerID", serverId);
|
||||||
|
|
||||||
|
await Config.AppSettings.SaveToFile();
|
||||||
|
|
||||||
|
Config.Logger.Log("Config Saved");
|
||||||
|
|
||||||
|
Close();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<BaseOutputPath></BaseOutputPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Remove="bin\**" />
|
|
||||||
<EmbeddedResource Remove="bin\**" />
|
|
||||||
<None Remove="bin\**" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
using Discord;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using EVE_LevelingSystem.LevelingSystemCore;
|
|
||||||
using PluginManager;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace EVE_LevelingSystem
|
|
||||||
{
|
|
||||||
internal class Level : DBEvent
|
|
||||||
{
|
|
||||||
public string name => "Leveling System Event Handler";
|
|
||||||
public string description => "The Leveling System Event Handler";
|
|
||||||
|
|
||||||
internal static Settings globalSettings = new();
|
|
||||||
|
|
||||||
|
|
||||||
public async void Start(DiscordSocketClient client)
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory("./Data/Resources/LevelingSystem");
|
|
||||||
if (!Config.ContainsKey("LevelingSystemPath"))
|
|
||||||
Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem", true);
|
|
||||||
if (!Config.ContainsKey("LevelingSystemSettingsFile"))
|
|
||||||
Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt", true);
|
|
||||||
//PluginManager.Config.AddValueToVariables
|
|
||||||
if (!File.Exists(Config.GetValue<string>("LevelingSystemSettingsFile")))
|
|
||||||
{
|
|
||||||
globalSettings = new Settings { TimeToWaitBetweenMessages = 5 };
|
|
||||||
await Functions.SaveToJsonFile<Settings>(Config.GetValue<string>("LevelingSystemSettingsFile"), globalSettings);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
globalSettings = await Functions.ConvertFromJson<Settings>(Config.GetValue<string>("LevelingSystemSettingsFile"));
|
|
||||||
|
|
||||||
// Console.WriteLine(globalSettings.TimeToWaitBetweenMessages);
|
|
||||||
client.MessageReceived += ClientOnMessageReceived;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task ClientOnMessageReceived(SocketMessage arg)
|
|
||||||
{
|
|
||||||
if (arg.Author.IsBot || arg.IsTTS || arg.Content.StartsWith(Config.GetValue<string>("prefix"))) return;
|
|
||||||
string userID = arg.Author.Id.ToString();
|
|
||||||
User user;
|
|
||||||
if (File.Exists($"{Config.GetValue<string>("LevelingSystemPath")}/{userID}.dat"))
|
|
||||||
{
|
|
||||||
user = await Functions.ConvertFromJson<User>(Config.GetValue<string>("LevelingSystemPath")! + $"/{userID}.dat");
|
|
||||||
// Console.WriteLine(Config.GetValue("LevelingSystemPath"));
|
|
||||||
if (user.AddEXP()) await arg.Channel.SendMessageAsync($"{arg.Author.Mention} is now level {user.CurrentLevel}");
|
|
||||||
await Functions.SaveToJsonFile(Config.GetValue<string>("LevelingSystemPath") + $"/{userID}.dat", user);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
user = new User { CurrentEXP = 0, CurrentLevel = 1, RequiredEXPToLevelUp = LevelCalculator.GetNextLevelRequiredEXP(1), user = new DiscordUser { DiscordTag = arg.Author.DiscriminatorValue, userID = arg.Author.Id, Username = arg.Author.Username } };
|
|
||||||
if (user.AddEXP()) await arg.Channel.SendMessageAsync($"{arg.Author.Mention} is now level {user.CurrentLevel}");
|
|
||||||
await Functions.SaveToJsonFile<User>($"{Config.GetValue<string>("LevelingSystemPath")}/{userID}.dat", user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using PluginManager;
|
|
||||||
|
|
||||||
namespace EVE_LevelingSystem.LevelingSystemCore
|
|
||||||
{
|
|
||||||
internal static class LevelCalculator
|
|
||||||
{
|
|
||||||
internal static List<string> OnWaitingList = new();
|
|
||||||
|
|
||||||
internal static Int64 GetNextLevelRequiredEXP(int currentLevel)
|
|
||||||
{
|
|
||||||
return currentLevel * 8 + 24;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void LevelUp(this User user)
|
|
||||||
{
|
|
||||||
user.CurrentEXP = 0;
|
|
||||||
user.RequiredEXPToLevelUp = GetNextLevelRequiredEXP(user.CurrentLevel);
|
|
||||||
user.CurrentLevel++;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static bool AddEXP(this User user)
|
|
||||||
{
|
|
||||||
if (OnWaitingList.Contains(user.user.userID.ToString())) return false;
|
|
||||||
Random r = new Random();
|
|
||||||
int exp = r.Next(2, 12);
|
|
||||||
Int64 userXP = user.CurrentEXP;
|
|
||||||
Int64 reqEXP = user.RequiredEXPToLevelUp;
|
|
||||||
if (userXP + exp >= reqEXP)
|
|
||||||
{
|
|
||||||
user.LevelUp();
|
|
||||||
user.CurrentEXP = exp - (reqEXP - userXP);
|
|
||||||
Console.WriteLine("Level up");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
user.CurrentEXP += exp;
|
|
||||||
|
|
||||||
OnWaitingList.Add(user.user.userID.ToString());
|
|
||||||
|
|
||||||
|
|
||||||
new Thread(() =>
|
|
||||||
{
|
|
||||||
int minutesToWait = Level.globalSettings.TimeToWaitBetweenMessages;
|
|
||||||
Thread.Sleep(60000 * minutesToWait);
|
|
||||||
OnWaitingList.Remove(user.user.userID.ToString());
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
using Discord;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
|
|
||||||
namespace EVE_LevelingSystem.LevelingSystemCore
|
|
||||||
{
|
|
||||||
public class DiscordUser
|
|
||||||
{
|
|
||||||
public string Username { get; set; }
|
|
||||||
public ushort DiscordTag { get; set; }
|
|
||||||
public ulong userID { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class User
|
|
||||||
{
|
|
||||||
public DiscordUser user { get; set; }
|
|
||||||
public int CurrentLevel { get; set; }
|
|
||||||
public long CurrentEXP { get; set; }
|
|
||||||
public long RequiredEXPToLevelUp { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace EVE_LevelingSystem
|
|
||||||
{
|
|
||||||
public class Settings
|
|
||||||
{
|
|
||||||
public int TimeToWaitBetweenMessages { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
using AngleSharp.Dom;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
internal class AudioFile
|
|
||||||
{
|
|
||||||
internal string Name { get; set; }
|
|
||||||
internal string Url { get; set; }
|
|
||||||
|
|
||||||
internal AudioFile(string name, string url)
|
|
||||||
{
|
|
||||||
Name = name;
|
|
||||||
Url = url;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal async Task DownloadAudioFile()
|
|
||||||
{
|
|
||||||
Process proc = new Process();
|
|
||||||
proc.StartInfo.FileName = "MusicDownloader.exe";
|
|
||||||
proc.StartInfo.Arguments = $"{Url},{Name}";
|
|
||||||
proc.StartInfo.UseShellExecute = false;
|
|
||||||
proc.StartInfo.RedirectStandardOutput = true;
|
|
||||||
|
|
||||||
proc.Start();
|
|
||||||
await proc.WaitForExitAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using Discord;
|
|
||||||
using Discord.Audio;
|
|
||||||
|
|
||||||
namespace MusicCommands;
|
|
||||||
|
|
||||||
internal static class Data
|
|
||||||
{
|
|
||||||
internal static IAudioClient audioClient = null;
|
|
||||||
internal static IVoiceChannel voiceChannel = null;
|
|
||||||
|
|
||||||
internal static MusicPlayer MusicPlayer = null;
|
|
||||||
internal static MusicPlaylist Playlist = new();
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace MusicCommands;
|
|
||||||
|
|
||||||
internal 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)
|
|
||||||
{
|
|
||||||
await Data.audioClient.StopAsync();
|
|
||||||
await Data.voiceChannel.DisconnectAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data.Playlist is not null)
|
|
||||||
{
|
|
||||||
Data.Playlist.ClearQueue();
|
|
||||||
Data.Playlist = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data.MusicPlayer is not null)
|
|
||||||
{
|
|
||||||
Data.MusicPlayer.Stop();
|
|
||||||
Data.MusicPlayer = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
|
||||||
<Nullable>warnings</Nullable>
|
|
||||||
<BaseOutputPath>bin\</BaseOutputPath>
|
|
||||||
<AssemblyName>Music Commands</AssemblyName>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
|
||||||
<OutputPath>../BUILDS/</OutputPath>
|
|
||||||
<ErrorReport>none</ErrorReport>
|
|
||||||
<DebugType>none</DebugType>
|
|
||||||
<DebugSymbols>false</DebugSymbols>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\PluginManager\PluginManager.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="YoutubeExplode" Version="6.2.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
using System.IO;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MusicCommands;
|
|
||||||
|
|
||||||
internal class MusicPlayer
|
|
||||||
{
|
|
||||||
private Stream outputStream { get; }
|
|
||||||
|
|
||||||
internal bool isPlaying, isPaused;
|
|
||||||
|
|
||||||
public MusicPlayer(Stream outputChannel)
|
|
||||||
{
|
|
||||||
outputStream = outputChannel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task Play(Stream source, int byteSize)
|
|
||||||
{
|
|
||||||
isPlaying = true;
|
|
||||||
while (isPlaying)
|
|
||||||
{
|
|
||||||
if (isPaused)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var bits = new byte[byteSize];
|
|
||||||
var read = await source.ReadAsync(bits, 0, byteSize);
|
|
||||||
if (read == 0)
|
|
||||||
break;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await outputStream.WriteAsync(bits, 0, read);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
await source.FlushAsync();
|
|
||||||
await source.DisposeAsync();
|
|
||||||
source.Close();
|
|
||||||
await outputStream.FlushAsync();
|
|
||||||
isPlaying = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
isPlaying = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
internal class MusicPlaylist
|
|
||||||
{
|
|
||||||
internal MusicPlaylist()
|
|
||||||
{
|
|
||||||
Console.WriteLine("Initialized playlist.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public Queue<AudioFile> QueueList = new();
|
|
||||||
|
|
||||||
public void Enqueue(AudioFile query) => QueueList.Enqueue(query);
|
|
||||||
public void ClearQueue() => QueueList.Clear();
|
|
||||||
|
|
||||||
public int Count => QueueList.Count;
|
|
||||||
public AudioFile GetNextSong => QueueList.Dequeue();
|
|
||||||
public AudioFile WhatIsNext => QueueList.Peek();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace MusicCommands;
|
|
||||||
|
|
||||||
internal class Pause : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "pause";
|
|
||||||
|
|
||||||
public string Description => "Pause/Unpause the music that is currently running";
|
|
||||||
|
|
||||||
public string Usage => "pause";
|
|
||||||
|
|
||||||
public bool canUseDM => false;
|
|
||||||
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
Data.MusicPlayer.isPaused = !Data.MusicPlayer.isPaused;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using Discord;
|
|
||||||
using Discord.Audio;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
using PluginManager.Others;
|
|
||||||
|
|
||||||
namespace MusicCommands;
|
|
||||||
|
|
||||||
internal class Play : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "play";
|
|
||||||
|
|
||||||
public string Description => "Play music from a file";
|
|
||||||
|
|
||||||
public string Usage => "play [name/url]";
|
|
||||||
|
|
||||||
public bool canUseDM => false;
|
|
||||||
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory("Music");
|
|
||||||
var path = "./Music/";
|
|
||||||
string[] splitted = message.Content.Split(' ');
|
|
||||||
if (splitted.Length < 2)
|
|
||||||
return;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (splitted.Length == 2 && splitted[1].Contains("youtube.com") || splitted[1].Contains("youtu.be"))
|
|
||||||
{
|
|
||||||
var url = splitted[1];
|
|
||||||
path += $"{Functions.CreateMD5(url)}";
|
|
||||||
if (File.Exists(path))
|
|
||||||
{
|
|
||||||
Data.Playlist.Enqueue(new AudioFile(path, null));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var file = new AudioFile(path, url);
|
|
||||||
await file.DownloadAudioFile();
|
|
||||||
Data.Playlist.Enqueue(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var searchString = splitted.MergeStrings(1);
|
|
||||||
path += $"{Functions.CreateMD5(searchString)}";
|
|
||||||
if (File.Exists(path))
|
|
||||||
{
|
|
||||||
Data.Playlist.Enqueue(new AudioFile(path, null));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync("Searching for " + searchString);
|
|
||||||
var file = new AudioFile(path, searchString);
|
|
||||||
await file.DownloadAudioFile();
|
|
||||||
Data.Playlist.Enqueue(file);
|
|
||||||
if (Data.MusicPlayer is null)
|
|
||||||
await context.Channel.SendMessageAsync("Playing: " + searchString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data.MusicPlayer is not null)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync("Enqueued your request");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (false);
|
|
||||||
|
|
||||||
|
|
||||||
Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel;
|
|
||||||
|
|
||||||
if (Data.voiceChannel == null)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data.audioClient is null)
|
|
||||||
{
|
|
||||||
Data.audioClient = await Data.voiceChannel.ConnectAsync(true);
|
|
||||||
Data.MusicPlayer = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
using (var discordChanneAudioOutStream = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
|
||||||
{
|
|
||||||
if (Data.MusicPlayer is null)
|
|
||||||
Data.MusicPlayer = new MusicPlayer(discordChanneAudioOutStream);
|
|
||||||
while (Data.Playlist.Count > 0)
|
|
||||||
{
|
|
||||||
var nowPlaying = Data.Playlist.GetNextSong;
|
|
||||||
using (var ffmpeg = CreateStream(nowPlaying.Name))
|
|
||||||
using (var ffmpegOutputBaseStream = ffmpeg.StandardOutput.BaseStream)
|
|
||||||
{
|
|
||||||
await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024);
|
|
||||||
Console.WriteLine("Finished playing from " + nowPlaying.Url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Data.MusicPlayer = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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,31 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
public class Skip : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "skip";
|
|
||||||
|
|
||||||
public string Description => "skip the music that is currently running";
|
|
||||||
|
|
||||||
public string Usage => "skip";
|
|
||||||
|
|
||||||
public bool canUseDM => false;
|
|
||||||
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
Data.MusicPlayer.isPlaying = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Discord.Commands;
|
|
||||||
using Discord.WebSocket;
|
|
||||||
using PluginManager.Interfaces;
|
|
||||||
|
|
||||||
namespace MusicCommands
|
|
||||||
{
|
|
||||||
public class queue : DBCommand
|
|
||||||
{
|
|
||||||
public string Command => "queue";
|
|
||||||
|
|
||||||
public string Description => "check queue";
|
|
||||||
|
|
||||||
public string Usage => "queue";
|
|
||||||
|
|
||||||
public bool canUseDM => false;
|
|
||||||
|
|
||||||
public bool canUseServer => true;
|
|
||||||
|
|
||||||
public bool requireAdmin => false;
|
|
||||||
|
|
||||||
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
|
|
||||||
{
|
|
||||||
await context.Channel.SendMessageAsync($"You have {Data.Playlist.Count} items in queue");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
153
PluginManager/Bot/Boot.cs
Normal file
153
PluginManager/Bot/Boot.cs
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Discord;
|
||||||
|
using Discord.Commands;
|
||||||
|
using Discord.WebSocket;
|
||||||
|
using PluginManager.Others;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PluginManager.Bot;
|
||||||
|
|
||||||
|
public class Boot
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The bot prefix
|
||||||
|
/// </summary>
|
||||||
|
public readonly string BotPrefix;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The bot token
|
||||||
|
/// </summary>
|
||||||
|
public readonly string BotToken;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The bot client
|
||||||
|
/// </summary>
|
||||||
|
public DiscordSocketClient Client;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The bot command handler
|
||||||
|
/// </summary>
|
||||||
|
private CommandHandler _commandServiceHandler;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The command service
|
||||||
|
/// </summary>
|
||||||
|
private CommandService _service;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The main Boot constructor
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="botToken">The bot token</param>
|
||||||
|
/// <param name="botPrefix">The bot prefix</param>
|
||||||
|
public Boot(string botToken, string botPrefix)
|
||||||
|
{
|
||||||
|
this.BotPrefix = botPrefix;
|
||||||
|
this.BotToken = botToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if the bot is ready
|
||||||
|
/// </summary>
|
||||||
|
/// <value> true if the bot is ready, otherwise false </value>
|
||||||
|
public bool IsReady { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The start method for the bot. This method is used to load the bot
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="config">
|
||||||
|
/// The discord socket config. If null then the default one will be applied (AlwaysDownloadUsers=true,
|
||||||
|
/// UseInteractionSnowflakeDate=false, GatewayIntents=GatewayIntents.All)
|
||||||
|
/// </param>
|
||||||
|
/// <returns>Task</returns>
|
||||||
|
public async Task Awake(DiscordSocketConfig? config = null)
|
||||||
|
{
|
||||||
|
if (config is null)
|
||||||
|
config = new DiscordSocketConfig
|
||||||
|
{
|
||||||
|
AlwaysDownloadUsers = true,
|
||||||
|
|
||||||
|
//Disable system clock checkup (for responses at slash commands)
|
||||||
|
UseInteractionSnowflakeDate = false,
|
||||||
|
GatewayIntents = GatewayIntents.All
|
||||||
|
};
|
||||||
|
|
||||||
|
Client = new DiscordSocketClient(config);
|
||||||
|
_service = new CommandService();
|
||||||
|
|
||||||
|
CommonTasks();
|
||||||
|
|
||||||
|
await Client.LoginAsync(TokenType.Bot, BotToken);
|
||||||
|
|
||||||
|
await Client.StartAsync();
|
||||||
|
|
||||||
|
_commandServiceHandler = new CommandHandler(Client, _service, BotPrefix);
|
||||||
|
|
||||||
|
await _commandServiceHandler.InstallCommandsAsync();
|
||||||
|
|
||||||
|
Config.DiscordBotClient = this;
|
||||||
|
|
||||||
|
while (!IsReady) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void CommonTasks()
|
||||||
|
{
|
||||||
|
if (Client == null) return;
|
||||||
|
Client.LoggedOut += Client_LoggedOut;
|
||||||
|
Client.Log += Log;
|
||||||
|
Client.LoggedIn += LoggedIn;
|
||||||
|
Client.Ready += Ready;
|
||||||
|
Client.Disconnected += Client_Disconnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Client_Disconnected(Exception arg)
|
||||||
|
{
|
||||||
|
if (arg.Message.Contains("401"))
|
||||||
|
{
|
||||||
|
Config.AppSettings.Remove("token");
|
||||||
|
Config.Logger.Log("The token is invalid. Please restart the bot and follow the instructions", typeof(Boot), LogType.CRITICAL);
|
||||||
|
await Config.AppSettings.SaveToFile();
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Client_LoggedOut()
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully Logged Out", typeof(Boot));
|
||||||
|
await Log(new LogMessage(LogSeverity.Info, "Boot", "Successfully logged out from discord !"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task Ready()
|
||||||
|
{
|
||||||
|
IsReady = true;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task LoggedIn()
|
||||||
|
{
|
||||||
|
Config.Logger.Log("Successfully Logged In", typeof(Boot));
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task Log(LogMessage message)
|
||||||
|
{
|
||||||
|
switch (message.Severity)
|
||||||
|
{
|
||||||
|
case LogSeverity.Error:
|
||||||
|
case LogSeverity.Critical:
|
||||||
|
Config.Logger.Log(message.Message, typeof(Boot), LogType.ERROR);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LogSeverity.Info:
|
||||||
|
case LogSeverity.Debug:
|
||||||
|
Config.Logger.Log(message.Message, typeof(Boot), LogType.INFO);
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user