diff --git a/README.md b/README.md index e1a801b..619177f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,75 @@ -# PlaguBot Plugin Template +# PlaguBotCommandsPlugin -1. Override project name in [settings.gradle](https://github.com/InsanusMokrassar/PlaguBotPluginTemplate/blob/master/settings.gradle) -2. Change your [package](https://github.com/InsanusMokrassar/PlaguBotPluginTemplate/blob/master/src/main/kotlin) -3. Rename your [plugin](https://github.com/InsanusMokrassar/PlaguBotPluginTemplate/blob/master/src/main/kotlin/plagubot_plugin/Plugin.kt) -4. Fill your [plugin logic](https://github.com/InsanusMokrassar/PlaguBotPluginTemplate/blob/master/src/main/kotlin/plagubot_plugin/Plugin.kt#L18) +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/plagubot.plugins.commands/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/plagubot.plugins.commands) + +This plugin has been created for centralized work with commands in your plugins. + +## How to use + +End user should include in his plugins section next line: + +```json +... +"plugins": [ + ..., + "dev.inmo.plagubot.plugins.commands.CommandsPlugin" +], +... +``` + +Then, in your plugin you should register your commands. Just pass them inside `setupDI` as `BotCommandFullInfo`: + +```kotlin +// ... Your plugin code + override fun Module.setupDI(database: Database, params: JsonObject) { + // ... + single { BotCommand("commandExample", "Command description").full() } + // ... + } +// ... +``` + +You may pass info `full` extension: + +* Any [BotCommandScope](https://tgbotapi.inmo.dev/docs/dev.inmo.tgbotapi.types.commands/-bot-command-scope/index.html) +* Some language code as `String` OR: +* Any [IetfLanguageCode](https://microutils.inmo.dev/micro_utils.dokka/dev.inmo.micro_utils.language_codes/%5Bcommon%5D-ietf-language-code/index.html) + +### Runtime commands changing + +In runtime you may change the commands of bot using `CommandsKeeper`. The instance of `CommandsKeeper` can be +retrieved from `koin` via simple `koin.get()` or `koin.commandsKeeper`: + +```kotlin +// ... + override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) { + val commandsKeeper = koin.commandsKeeper + // ... Some your code + commandsKeeper.addCommand(BotCommand("commandExample", "Command description")) + // ... Some your code + } +// ... +``` + +Just as in the code above (in `setupDI`) you may pass all the command environment and it will be automatically updated +for bot. + +## How to include + +Add dependency: + +Gradle: + +```groovy +api "dev.inmo:plagubot.plugins.commands:$commands_version" +``` + +Maven: + +```xml + + dev.inmo + plagubot.plugins.commands + ${$commands_version} + +``` diff --git a/src/main/kotlin/CommandsPlugin.kt b/src/main/kotlin/CommandsPlugin.kt index 210e733..e0aed0a 100644 --- a/src/main/kotlin/CommandsPlugin.kt +++ b/src/main/kotlin/CommandsPlugin.kt @@ -34,7 +34,7 @@ class CommandsPlugin : Plugin { runCatchingSafely { commands ?.let { setMyCommands( - commands, + commands.distinctBy { it.command }, key.scope, key.languageCode ) @@ -58,7 +58,7 @@ class CommandsPlugin : Plugin { * take all the available keys in the [CommandsKeeper] and set commands for each key */ override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) { - val commandsKeeper = koin.get() + val commandsKeeper = koin.commandsKeeper log.d { "Subscribe to scopes changed flow" } commandsKeeper.onScopeChanged.subscribeSafelyWithoutExceptions(scope) { diff --git a/src/main/kotlin/KoinCommandKeeperGetters.kt b/src/main/kotlin/KoinCommandKeeperGetters.kt new file mode 100644 index 0000000..0e29d9f --- /dev/null +++ b/src/main/kotlin/KoinCommandKeeperGetters.kt @@ -0,0 +1,10 @@ +package dev.inmo.plagubot.plugins.commands + +import org.koin.core.Koin +import org.koin.core.scope.Scope + +val Scope.commandsKeeper + get() = get() + +val Koin.commandsKeeper + get() = get()