Программирование на языке kotlin
Посмотрите тему, параметры и описание реального заказа. Если у вас похожее задание, разместите собственную заявку.
Информация о заказе
Основные параметры работы.
Описание заказа
Тема и требования к работе.
Задание 4. Chat bot DSL Вам необходимо реализовать DSL для декларативного описания функциональности чат ботов (в Telegram, VK или других мессенджерах).
Вам дано базовое api для работы с ботом (пакет chatbot.api):
Интерфейс Client, скрывающий детали взаимодействия с api мессенджеров Интерфейс ChatContextsManager, хранит внутри состояние определенного чата. Например, пользователь выбрал какой-то пункт меню и теперь должен нажать какую-то кнопку подменю. Также дана базовая реализация чат-бота в пакете chatbot.bot:
MessageProcessor - лямбда функция-обработчик сообщения; MessageHandler - класс с полями predicete - условие, при котором нужно выполнить обработчик, processor - обработчик, который нужно выполнить, если предикат выполняется; Bot - класс, реализующий интерфейс ChatBot и принимающий список MessageHandler При обработке сообщения выбирается первый подходящий обработчик, а все последующие должны игнорироваться. Реализуйте DSL по заданию ниже в пакете chatbot.dsl.
Решение можно проверить с помощью тестов, которые запускаются в интерфейсе Intellij Idea или через консоль ./gradlew test (*Nix) или .\gradlew test (Windows).
Готовое решение добавьте в ветку solution. Убедитесь, что ваш код корректно отформатирован через ./gradlew ktlintCheck (*Nix) или .\gradlew ktlintCheck (Windows). Создайте pull request с этой веткой, в качестве заголовка pull request обязательно укажите свое ФИО. После создания PR убедитесь, что тесты прошли.
Базовая настройка Создайте конструкцию chatBot(client: Client) для определения бота. Функция должна создавать реализацию интерфейса ChatBot на основе класса Bot.
Внутри chatBot добавьте возможность настраивать уровень логирования
через конструкцию use (use(LogLevel.Error)); через унарный плюс (+LogLevel.Error). По умолчанию должен использоваться LogLevel.Error. val bot = chatBot(testClient) { use(LogLevel.INFO) } или
val bot = chatBot(testClient) { +LogLevel.INFO } Базовое поведение Внутри chatBot реализуйте конструкцию behaviour для определения поведения бота. Определенные ниже конструкции далее будем называть обработчиками.
конструкция onCommand(command: String) определяет поведение бота при получении сообщения, содержащего /${command} в качестве первого слова в сообщении; конструкция onMessage(predicate: ChatBot.(Message) -> Bool) определяет поведения бота при получении сообщения, удовлетворяющего предикату; конструкции onMessagePrefix(preffix: String), onMessageContains(text: String) и onMessage(messageTextExactly: String) определяют поведение бота при получении сообщения, текст которого соответствует критерию; конструкцию onMessage для определения поведения бота при получении любого сообщения.
В качестве функции для обработки соответствующих событий используйте функцию с типом MessageProcessor.
val bot = chatBot(testClient) { use(LogLevel.INFO)
behaviour { onCommand("help") { client.sendMessage(message.chatId, "How can i help you?") }
onMessage("ping") { client.sendMessage(message.chatId, "pong", replyMessageId = message.id) } } } Контексты внутри чатов Разработайте возможность для каждого чата с ботом хранить некоторый контекст. Это полезно при обработке последовательности сообщений от пользователя.
Пример использования:
Person: /generateDogMeme <ChatContext>: DogMeme(breed=null, text=null) Bot: What breed should a dog be? Perosn: Corgi <ChatContext>: DogMeme(breed=Corgi, text=null) Bot: What text should be in picture?
Person: Kotlin programming is easy <ChatContext>: DogMeme(breed=Corgi, text=Kotlin programming is easy) Bot: <picture with meme> <ChatContext>: null Внутри chatBot поддержите возможность подключения менеджера контекстов пользователей бота (объекта интерфейса ChatContextsManager)через оператор присваивания (contextManager = anyContextManager); через конструкцию use (use(otherContextManager)). Внутри behaviour поддержите возможность объявлять некоторые обработчики, которые должны срабатывать только, если чат имеет определенный контекст
для всех контекстов определенного типа SomeChatContext через конструкцию into<SomeChatContext> (into<SomeChatContext> { ... }) для конкретного экземпляра контекста через конструкцию T.into (someChatContextInstance.into { ... }), в этом случае следует проверять текущий контекст на равенство someChatContextInstance. Примечание: для проверки типа контекста нельзя использовать java или kotlin reflection, примените для этого механизм для работы с generic, встроенный в kotlin.
object AskNameContext : ChatContext class WithNameContext(val name: String) : ChatContext
val bot = chatBot { use(testClient)
behaviour { into<NamedUserContext> { onMessage { client.sendMessage(message.chatId, "Hello, ${this.context.name}!") } }
AskNameContext.into { onMessage { client.sendMessage(message.chatId, "ok") setContext(NamedUserContext(message.text)) } }
onCommand("start") { client.sendMessage(message.chatId, "Hello! Say your name!") setContext(AskNameContext) } } } Билдер сообщений Так же требуется поддержать DSL для отправки сообщения, с поддержкой кнопок.
Для работы с клавиатурой необходимо использовать параметр keyboard при отправке сообщения.
Клавиатуру можно убрать, отправив Keyboard.Remove; Клавиатура можно настроить с помощью Keyboard.Markup. В рамках dsl необходимо подержать:
блок sendMessage(chatId: ChatId.Id) {} в котором настраивается сообщение; внутри блока sendMessage вызов removeKeyboard() должен устанавливать клавиатуру в значение Keyboard.Remove при отправке; внутри блока sendMessage вызов withKeyboard {} должен настраивать клавиатуру и устанавливать её в соответсвующее значение Keyboard.Markup при отправке; блок row {} внутри withKeyboard должен добавлять новую строку в конец клавиатуры; вызов button(text = "text") внутри row {} должен добавлять кнопку в конец строки; вызов - "text" должен добавлять кнопку в конец строки. Так же должно быть возможно напрямую задать:
разметку всей клавиатуры через матрицу, присвоив значение переменной keyboard; разметку строки, добавив её в массив в переменной keyboard. Пустые сообщения (с пустым текстом и без клавиатуры или с пустой клавиатурой) должны игнорироваться и не отправляться.
val bot = chatBot(testClient) { behaviour { onCommand("help") { sendMessage(message.chatId) { text = "How can i help you?" // "" by default replyTo = message.id // must be available
removeKeyboard() // will send Keyboard.Remove // or withKeyboard { oneTime = true // false by default
keyboard = mutableListOf(mutableListOf(Keyboard.Button(text = "1:1"), Keyboard.Button(text = "1:2"))) keyboard.add(mutableListOf(Keyboard.Button(text = "2:1"), Keyboard.Button(text = "2:2")))через оператор присваивания (contextManager = anyContextManager); через конструкцию use (use(otherContextManager)). Внутри behaviour поддержите возможность объявлять некоторые обработчики, которые должны срабатывать только, если чат имеет определенный контекст
для всех контекстов определенного типа SomeChatContext через конструкцию into<SomeChatContext> (into<SomeChatContext> { ... }) для конкретного экземпляра контекста через конструкцию T.into (someChatContextInstance.into { ... }), в этом случае следует проверять текущий контекст на равенство someChatContextInstance. Примечание: для проверки типа контекста нельзя использовать java или kotlin reflection, примените для этого механизм для работы с generic, встроенный в kotlin.
object AskNameContext : ChatContext class WithNameContext(val name: String) : ChatContext
val bot = chatBot { use(testClient)
behaviour { into<NamedUserContext> { onMessage { client.sendMessage(message.chatId, "Hello, ${this.context.name}!") } }
AskNameContext.into { onMessage { client.sendMessage(message.chatId, "ok") setContext(NamedUserContext(message.text)) } }
onCommand("start") { client.sendMessage(message.chatId, "Hello! Say your name!") setContext(AskNameContext) } } } Билдер сообщений Так же требуется поддержать DSL для отправки сообщения, с поддержкой кнопок.
Для работы с клавиатурой необходимо использовать параметр keyboard при отправке сообщения.
Клавиатуру можно убрать, отправив Keyboard.Remove; Клавиатура можно настроить с помощью Keyboard.Markup. В рамках dsl необходимо подержать:
блок sendMessage(chatId: ChatId.Id) {} в котором настраивается сообщение; внутри блока sendMessage вызов removeKeyboard() должен устанавливать клавиатуру в значение Keyboard.Remove при отправке; внутри блока sendMessage вызов withKeyboard {} должен настраивать клавиатуру и устанавливать её в соответсвующее значение Keyboard.Markup при отправке; блок row {} внутри withKeyboard должен добавлять новую строку в конец клавиатуры; вызов button(text = "text") внутри row {} должен добавлять кнопку в конец строки; вызов - "text" должен добавлять кнопку в конец строки. Так же должно быть возможно напрямую задать:
разметку всей клавиатуры через матрицу, присвоив значение пе
Как проходит заказ на RuStud
Опишите задание, выберите исполнителя и общайтесь с ним в заказе.
Похожие заказы
Другие работы на близкие темы.
Как подготовить такую работу
Основные этапы и полезные ориентиры.
Для успешного выполнения задания по реализации DSL для чат-ботов на языке Kotlin, вам потребуется следовать нескольким ключевым шагам. Во-первых, убедитесь, что у вас есть достаточные знания в области программирования на Kotlin и основ линейного программирования, так как это поможет вам лучше понять структуру и логику, необходимую для создания DSL.
Начните с изучения предоставленного API для работы с ботом. Ознакомьтесь с интерфейсами `Client`, `ChatContextsManager` и классами, такими как `MessageProcessor` и `MessageHandler`. Понимание этих компонентов поможет вам в дальнейшем проектировании DSL. Важно четко понимать, как обрабатываются сообщения и как бот взаимодействует с пользователем.
Следующий шаг — создание основной конструкции `chatBot(client: Client)`. В этой функции вы будете реализовывать интерфейс `ChatBot`, используя класс `Bot`. Позаботьтесь о том, чтобы правильно настроить уровень логирования через конструкции `use` и унарный плюс. Это обеспечит вам гибкость в управлении логами.
Далее, вам нужно будет реализовать конструкцию `behaviour`, чтобы определить поведение бота. Используйте конструкции `onCommand`, `onMessage`, `onMessagePrefix`, `onMessageContains` и `onMessage` для обработки различных типов сообщений от пользователей. Обратите внимание на использование функции `MessageProcessor` для обработки событий.
Не забудьте про контексты. Реализуйте возможность хранения контекста для каждого чата, что позволит вашему боту отслеживать последовательность сообщений. Используйте интерфейс `ChatContextsManager` для управления контекстами и убедитесь, что обработчики срабатывают только при наличии определенного контекста.
Также важно реализовать DSL для отправки сообщений с поддержкой кнопок. Вам нужно будет создать блок `sendMessage(chatId: ChatId.Id)`, в котором вы сможете настраивать текст сообщения и клавиатуру. Используйте методы `removeKeyboard()` и `withKeyboard {}` для управления клавиатурой.
После завершения разработки не забудьте протестировать ваше решение. Запустите тесты через интерфейс IntelliJ IDEA или консоль, как указано в задании. Убедитесь, что ваш код правильно отформатирован с помощью `ktlintCheck`.
Наконец, добавьте ваше решение в ветку `solution` и создайте pull request с указанием вашего ФИО в заголовке. Убедитесь, что все тесты прошли успешно. Весь процесс может быть сложным, но при достаточном уровне знаний и внимании к деталям вы сможете успешно справиться с этой задачей.
Перед началом уточните требования преподавателя и сверьтесь с методическими указаниями.
Отзывы студентов
Отзывы о выполненных заказах на RuStud.
Рекомендую
Работа сделана в полном объеме со всеми требованиями к выполнению, на связи были все время, мне понравилось!!!
Хорошая оперативная работа
Очень быстро, понятно, а главное вежливо и конструктивно!!!
Обратился со срочным заказом. Работа выполнена досрочно, все четко. Отдельное спасибо за объяснение некоторых моментов!
сделано вовремя и качественно
Не подстраивайте своё задание под чужое
Разместите собственные требования — тему, срок, методичку и нужный состав результата.