# PlaguBot

## For users

Template: [![Use template](badges/use_template.svg)](https://github.com/InsanusMokrassar/PlaguBotBotTemplate/generate)

You can create your bot using
[this template](https://insanusmokrassar.github.io/PlaguBotBotTemplate/) by following of its instructions

## For developers

| Template: | [![Use template](badges/use_template.svg)](https://github.com/InsanusMokrassar/PlaguBotPluginTemplate/generate) |
|-----------|-----------------------------------------------------------------------------------------------------------------|
| Bot version: | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/plagubot.bot/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/plagubot.bot) |
| Plugin version: | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/plagubot.plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/plagubot.plugin) |

That is a set of libraries for plagubots. Look at the
[PlaguBot Plugin template](https://insanusmokrassar.github.io/PlaguBotPluginTemplate/) to find how to create your bot.

### Technical help

#### FSM

In this bot has been used variant with FSM. That means that you may use all the [Behaviour Builder with FSM](https://bookstack.inmo.dev/books/telegrambotapi/page/behaviour-builder-with-fsm) functionality. In case you wish to setup states repo, you should use the next code in the `setupDI` of your plugin:

```kotlin
single<StatesManager<State>> {
    // setup your manager and return here
    // Default is:
    DefaultStatesManager(
        InMemoryDefaultStatesManagerRepo()
    )
}
```

Besides, you may setup handling errors lambda in the same function:

```kotlin
single<StateHandlingErrorHandler<State>> {
    { state, e ->
        logger.eS(e) { "Unable to handle state $state" } // logging by default
        null // you should return new state or null, default callback will return null
    }
}
```

#### Subcontext initial actions

Bot will take all the `CombinedSubcontextInitialAction.SubItem`s from `Koin` to include it in root of
`behaviourBuilder`. To create your own subitem:

```kotlin
singleWithRandomQualifier<CombinedSubcontextInitialAction.SubItem> {
    CombinedSubcontextInitialAction.SubItem {
        // do some action or throw error to rerun on next round
    }
}
```