Крутые боты для Discord с BJDA


Как все начиналось?

Несколько месяцев назад я начал создавать discord-бота для управления задачами, который предназначен для больших сообществ.

Разработчикам очень тяжело создавать систему обработчиков событий взаимодействия компонентов, особенно разработчикам, которые заботятся о качестве своего кода.

Поэтому я написал фреймворк discord bot на Kotlin, новое решение для создания крутого discord bot.
Он все еще находится в экспериментальной стадии, при обновлении до новой версии все может быть сломано.

Почему BJDA?

BJDA основан на JDA (Java Discord API).

Он предоставляет следующие возможности:

  1. Лучший способ создания и прослушивания Slash-команд.
  2. Модуль пользовательского интерфейса для создания мощного высококачественного пользовательского интерфейса
  3. Динамическое обновление сообщений и управление состоянием, аналогичное React.js.

С этими крутыми функциями вы сможете создать крутого бота еще проще!

На самом деле, для Kotlin у нас есть Kord, который также находится в экспериментальной стадии. BJDA также скоро будет переведена на Kord.

Начало работы

Установите

<dependency>
    <groupId>io.github.sonmoosans</groupId>
    <artifactId>bjda</artifactId>
    <version>4.3.1</version>
</dependency>
Войдите в полноэкранный режим Выйти из полноэкранного режима

Теперь мы можем создать Todo discord bot.
Прежде всего, вам необходимо получить экземпляр JDA

fun main() {
    val jda = JDABuilder.createDefault("token here")
        .build()
        .awaitReady()
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем установите модули с помощью BJDA, выполнив команду BJDA.create(jda).

fun main() {
    val jda = JDABuilder.createDefault("token here")
        .build()
        .awaitReady()

    BJDA.create(jda)
        .install(
            SuperCommandModule( //slash commands
                TodoCommands,
            ),
            UIEventModule() //ui event handlers
        )
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Примечания: SuperCommand означает Slash Command.
UIEventModule всегда должен быть установлен, если ваш бот использует UI слушателей, предоставляемых BJDA.

После этого мы создадим переменную TodoCommands.

val TodoCommands = SuperCommandGroup.create("todo", "Todo Commands",
    CreateTodo()
)
Войти в полноэкранный режим Выйти из полноэкранного режима

и создадим команду /todo create.

val users = UIStore<User>()

private class CreateTodo: SuperCommand(name = "create", description = "Create a Todo List") {
    override val run: CommandHandler = {
        val ui = users.getUI(event.user) {
            UI(
                TodoApp {}
            )
        }

        ui.reply(event) {
            ui.listen(it)
        }
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

UIStore — утилита для хранения экземпляров пользовательского интерфейса, аналогичная HashMap<*, UI>.

Функция run запускается, когда выполняется команда Slash.

Обратите внимание, что ui.listen(it) означает, что поддерживается обновление в реальном времени. Когда ui будет обновлен, все сообщения будут отредактированы.

После объявления команды мы можем начать разработку нашего пользовательского интерфейса!
Импорт:

import bjda.plugins.ui.hook.ButtonClick.Companion.onClick
import bjda.plugins.ui.hook.MenuSelect.Companion.onSelect
import bjda.plugins.ui.modal.Form.Companion.form
import bjda.ui.component.RowLayout
import bjda.ui.component.Text
import bjda.ui.component.TextType
import bjda.ui.component.action.Button
import bjda.ui.component.action.Menu
import bjda.ui.component.action.TextField
import bjda.ui.core.*
import bjda.ui.core.FComponent.Companion.component
import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle
import net.dv8tion.jda.api.interactions.components.selections.SelectOption
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle
Вход в полноэкранный режим Выход из полноэкранного режима

Состояние
Как и в React, вы можете определить prop и state.
В этом примере мы не будем определять prop.

data class State(
    val todos: ArrayList<String> = ArrayList()
)
Вход в полноэкранный режим Выход из полноэкранного режима

Далее мы можем создать наш компонент:

val TodoApp = component {
    val state = useState(State())

    val addForm by form {
        title = "Add Todo"

        onSubmit = { event ->

            state.update(event) {
                todos += event.value("todo")
            }
        }
        render = {
            + row (
                TextField("todo") {
                    label = "TODO"
                    style = TextInputStyle.PARAGRAPH
                }
            )
        }
    }

    val onAddItem by onClick { event ->
        event.replyModal(addForm).queue()
    };

    {
        val (todos) = state.get()

        + Text()..{
            content = "**TODO List**"
            type = TextType.LINE
        }

        + on (todos.isEmpty()) {
            Text()..{
                content = "No Todos"
                type = TextType.CODE_BLOCK
            }
        }

        //Elements Collections will be converted to Fragment
        + todos.mapIndexed { i, todo ->
            TodoItem(i, todo)
        }

        + RowLayout() -{
            + Button(onAddItem) {
                label = "Add"
            }
        }
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

В приведенном выше коде мы сделали:

  1. Модал для добавления дел
  2. Кнопка для открытия модала
  3. блоки кода для списка всех дел.

Вы можете попробовать понять эти коды, запустив приложение и изменив пример.

Протестируйте своего бота

Теперь запустите главную функцию и начните тестирование!

Попробуйте запустить команду /todo create, вы должны увидеть панель.

Нажмите кнопку «Добавить» и добавьте несколько todo.

Продолжайте улучшать
Вы можете добавить кнопку для закрытия панели. Поэтому вы можете уничтожить пользовательский интерфейс и удалить его из UIStore users, чтобы избежать утечки памяти.

Теперь вы только что создали классного todo-бота с помощью BJDA!
Вы можете заглянуть в репозиторий на Github: https://github.com/SonMooSans/bjda.

Оцените статью
devanswers.ru
Добавить комментарий