Перейти к содержанию
Реальный заказ · №6039

Программирование на языке kotlin

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

Лабораторная Линейное программирование
3отклика на заявку
13просмотров заказа
13 октября 2024дата размещения
01

Информация о заказе

Основные параметры работы.

Вид работы Лабораторная
Предмет Линейное программирование
Срок в заявке 21 октября 2024
Оригинальность не указана
02

Описание заказа

Тема и требования к работе.

Задание 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

Опишите задание, выберите исполнителя и общайтесь с ним в заказе.

RuStud · новая заявка защищено

ШАГ 1 ИЗ 4

Опишите задание Для старта достаточно темы и срока
Программирование на языке kotlin
Вид работыЛабораторная
СрокУказать в заявке
Получить предложения
Заявка опубликованаИсполнители видят задание
Новая

ПРЕДЛОЖЕНИЯ

Выберите исполнителя
Есть отклики
A1
Исполнитель★ 4,9
ОткликВыбрать
A2
Исполнитель★ 5,0
ОткликВыбрать
A3
Исполнитель★ 4,8
ОткликВыбрать
Добавьте требования к заказу

ШАГ 3 ИЗ 4

Передайте методичкуФайл останется внутри заказа
Выбрать файлPDF, DOCX или изображение
ПроводникДокументы › Учёба
PDFМетодичка.pdfТребования · 2,4 МБ
A2
ИсполнительВыбран для заказа
Заказ
PDF
Методичка.pdf2,4 МБ

Требования посмотрел.

Хорошо, спасибо.

DOCX
Работа_на_проверку.docx2,8 МБ
Скачать
ЗадачаИсполнительМетодичкаРезультат
03

Другие работы на близкие темы.

04

Как подготовить такую работу

Основные этапы и полезные ориентиры.

План работы Тема: Программирование на языке kotlin

Для успешного выполнения задания по реализации 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.

5,0

Рекомендую

user8708
Лабораторная
5,0

Работа сделана в полном объеме со всеми требованиями к выполнению, на связи были все время, мне понравилось!!!

user7573
Лабораторная
5,0

Хорошая оперативная работа

user7252
Лабораторная
5,0

Очень быстро, понятно, а главное вежливо и конструктивно!!!

user5397
Лабораторная
5,0

Обратился со срочным заказом. Работа выполнена досрочно, все четко. Отдельное спасибо за объяснение некоторых моментов!

user5374
Лабораторная
5,0

сделано вовремя и качественно

user1045
Лабораторная
Есть похожая тема?

Не подстраивайте своё задание под чужое

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

Похожая тема?Разместите свою заявку