tgbotapi-framework Help

Множественный выбор

Сделаем бота со множественным выбором, который спрашивает, что надеть.

Готовимся

Типичный гардероб:

@Serializable enum class Clothes { Socks, Shirt, Pants, Hat }

Делаем

Что уже надели, будем хранить в состоянии:

@Serializable data class MultipleChoiceState( val selectedClothes: Set<Clothes> = emptySet(), ) : MessageState

Теперь реализуем блок message для нашего состояния. Если одежда есть в списке выбранных, будем рисовать кнопку с галочкой, иначе – без.

val multipleChoice = inState<DefaultRole, MultipleChoiceState> { message { text("Что наденем?") { Clothes.values().forEach { clothes -> row { if (clothes in state.snapshot.selectedClothes) { actionButton("✅ ${clothes.name}", UnselectAction(clothes)) } else { actionButton(clothes.name, SelectAction(clothes)) } } } } } }

Для кнопок понадобится два типа действий: выбрать и снять выбор.

@Serializable class SelectAction(val clothes: Clothes) : Action @Serializable class UnselectAction(val clothes: Clothes) : Action

По нажатию кнопки с SelectAction будем добавлять одежду во множество выбранных.

on<SelectAction> { state.edit { copy(selectedClothes = selectedClothes + it.clothes) } }

А по нажатию кнопки с UnselectAction – убирать.

on<UnselectAction> { state.edit { copy(selectedClothes = selectedClothes - it.clothes) } }

При вызове state.edit сообщение редактируется автоматически в соответствии с обновлённым состоянием.

Результат

Результат

Полный код

Last modified: 24 August 2023