Skip to content

# Opportunities out of the box

There are several important opportunities out of the box:

- Database access
- Config access
- Bot setup
- Json format
- Bot itself

## Database access

You may access database in your plugin via koin in `setupBotPlugin` or as parameter in `setupDI`:

    object YourPlugin : Plugin {
        // ...
        override fun Module.setupDI(
            database: Database, // database
            params: JsonObject
        ) {
            // ...
        }
    }

It is simple Exposed database and you may use it in your tables.

## Config access

As you may see, in the `setupDI` function we also have `params` parameter with source configuration json. In case you wish to declare and work with your own config in plugin, you may use next snippet:

    object YourPlugin : Plugin {
        @Serializable
        data class MyConfig(
            val param1: String,
            val param2: Int,
        )
        // ...
        override fun Module.setupDI(
            database: Database, // database
            params: JsonObject
        ) {
            single {
                get<Json>().decodeFromJsonElement(MyConfig.serializer(), params) // register from root (1)
            }
            // OR
            single {
                get<Json>().decodeFromJsonElement(MyConfig.serializer(), params["yourplugin"]!!) // register from field "yourplugin" (2)
            }
            // ...
        }

        override suspend fun BehaviourContext.setupBotPlugin(
            koin: Koin
        ) {
            koin.get<MyConfig>() // getting of registered config
        }
    }

1. In this case your config will looks like:

       {
         "params1": "SomeString",
         "params2": 42
       }

2. In this case your config will looks like:

       {
         "yourplugin": {
           "params1": "SomeString",
           "params2": 42
         }
       }

## Bot setup

Out of the box you may setup several things in bot:

- `StatesManager<State>` (1)
- `DefaultStatesManagerRepo<State>` (2)
- Any amount of `OnStartContextsConflictResolver` (3)
- Any amount of `OnUpdateContextsConflictResolver` (4)
- `StateHandlingErrorHandler<State>` (5)

1. For this use next code in `setupDI`:

       // Your plugin
           override fun Module.setupDI(database: Database, params: JsonObject) {
               single<StatesManager<State>> {
                   // Your StatesManager<State> initialization
               }
           }

2. For this use next code in `setupDI`:

       // Your plugin
           override fun Module.setupDI(database: Database, params: JsonObject) {
               single<DefaultStatesManagerRepo<State>> {
                   // Your DefaultStatesManagerRepo<State> initialization
               }
           }

3. You may declare any amount of `OnStartContextsConflictResolver`. `PlaguBot` will take first non-null result of resolvers from DI and use in default states manager. To declare, use next snippet:

       // Your plugin
           override fun Module.setupDI(database: Database, params: JsonObject) {
               singleWithRandomQualifier<OnStartContextsConflictResolver> {
                   OnStartContextsConflictResolver { old, new ->
                       // null|true|false
                   }
               }
           }

4. You may declare any amount of `OnUpdateContextsConflictResolver`. `PlaguBot` will take first non-null result of resolvers from DI and use in default states manager. To declare, use next snippet:

       // Your plugin
           override fun Module.setupDI(database: Database, params: JsonObject) {
               singleWithRandomQualifier<OnUpdateContextsConflictResolver> {
                   OnUpdateContextsConflictResolver { old, new, currentStateOnContext ->
                       // null|true|false
                   }
               }
           }

5. You may declare only one `StateHandlingErrorHandler<State>`. This handler will be called each time when some state will be handled with exception and may return `null` or new state instead old one:

       // Your plugin
           override fun Module.setupDI(database: Database, params: JsonObject) {
               single<StateHandlingErrorHandler<State>> {
                   StateHandlingErrorHandler<State> { state, throwable ->
                       // null or State
                   }
               }
           }