Качественное выполнение лабораторных работ под заказ от экспертов

Математические дисциплины / Линейное программирование
2024-10-13 19:51:51
-
2024-10-21 23:59:00
Период гарантии:
10 дней
Задание 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" должен добавлять кнопку в конец строки. Так же должно быть возможно напрямую задать: разметку всей клавиатуры через матрицу, присвоив значение пе
Успешно выполнен!
Заказать подобную или другую работу.
Наши авторы имеют обширный опыт в выполнении заказов различных типов и тематики. За годы работы мы успешно справлялись с множеством задач, начиная от написания статей и блогов до создания уникального контента для сайтов и социальных сетей. Каждый проект для нас — это возможность продемонстрировать профессионализм и креативность. Мы понимаем, как важно учитывать индивидуальные требования клиентов, и всегда стремимся превзойти ожидания. Благодаря нашей команде, вы можете быть уверены в высоком качестве и своевременной доставке материалов. Ваш заказ в надежных руках!

Последние отзывы

Фантомас 2024-09-24 01:54:30

Заказал лабораторную по акции и не прогадал. Ребята сделали всё супер быстро и качественно. Теперь только к ним!

Fantasy 2024-09-09 13:39:50

Виктор просто топ! Сделал всё быстро и круто, как всегда. Респект ему за качественный подход и оригинальность!

ГромБог 2024-08-31 14:45:38

Вы лучшие!!!

Атлант 2024-08-29 12:22:06

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

Viburnum 2024-07-26 07:01:07

Заказала лабораторку, и она просто спасение! Ребята, я всем своим подругам порекомендую эту платформу

Зоря 2024-07-11 09:21:03

Заказала лабу тут и была просто в шоке от качества! Ребята реально супер, все сделано на высшем уровне. Не думала, что получится так круто! Сроки тоже уложились, что очень порадовало. Теперь только сюда буду обращаться, потому что это просто находка

Цифра 2024-07-03 04:40:12

Довольна результатом!

Березка 2024-05-10 22:08:46

Супер удобно заказывать! Интерфейс просто подарок, все понятно и быстро. Рекомендую всем

Жанна 2024-05-08 00:09:38

Василий реально порадовал! Заказ был выполнен супер быстро и на высшем уровне. Качество работы просто отличное, все детали учтены. Очень довольна результатом, рекомендую всем, кто ищет надежного исполнителя!

Valkyrie 2024-04-15 02:12:46

Заказала лабораторку, а получила шедевр! Теперь могу спокойно тусить, а не мучиться с формулами!

Захар 2024-04-04 12:18:47

Арина реально замутила крутую работу, ожидал хуже, спасибо!

FairyDust 2024-03-18 13:42:50

Великолепная работа.

Валерий 2024-03-10 04:53:09

Получил отличную лабораторную работу. Качество на высоте, все требования учтены. Доволен результатом и уверен, что обращусь снова, если понадобится помощь

Дарнияда 2024-03-08 02:14:10

Я была в восторге, когда получила работу раньше срока. Чувство облегчения и радости переполняло меня. Качество оказалось выше ожиданий, и я с уверенностью могу рекомендовать эту команду.

MysticNinja 2024-02-27 06:41:10

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

MysticRider 2024-02-26 17:15:03

Матвей просто топ! Работа супер крутая, структура четкая, всё по делу. Респект!

Даниил 2024-01-29 11:51:06

Спасибо вам)

Хамелеон 2024-01-12 22:14:41

Алексей проявил высокий уровень профессионализма и внимательности к деталям. Он тщательно изучил мой запрос и учел все пожелания. Общение прошло легко и продуктивно. Результат работы полностью соответствует ожиданиям. Рекомендую его как надежного исполнителя

Татьяна Михайловна 2023-12-26 23:06:22

Рекомендую

Метеор 2023-12-19 12:29:31

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

Тигрица 2023-12-05 00:29:15

Обслуживание здесь как свежий воздух: легко и приятно работать

Некоторые исполнители

Эль Фаннинг

29
Выполненных
работ
8
Положительных
отзывов

Энид Синклер

64
Выполненных
работ
16
Положительных
отзывов

....

31
Выполненных
работ
6
Положительных
отзывов

viktoriya

2
Выполненных
работ
1
Положительных
отзывов

Планируете самостоятельно выполнить лабораторную по линейному программированию?

Для успешного выполнения задания по реализации 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 с указанием вашего ФИО в заголовке. Убедитесь, что все тесты прошли успешно. Весь процесс может быть сложным, но при достаточном уровне знаний и внимании к деталям вы сможете успешно справиться с этой задачей.
ОДНА ЗАЯВКА -
СОТНИ ИСПОЛНИТЕЛЕЙ
ПРОСТОЙ ПОИСК
ЗАКАЗОВ