Edit me

Command

Сообщение и запрос

Command отправляется сервисом пользователю. Более подробная информация содержится в разделе Как это работает. Полный список поддерживаемых команд и их свойств можно найти в описании Сервис-платформы

Команду можно отправить двумя способами:

  • не ожидая ответа от пользователя
  • ожидая ответ от пользователя

В первом случае отправляется простое текстовое сообщение

sendMessage("Hello from demo service")

Использование в сценарии:

@Scenario(DemoDispatcher::class, "/start", "start")
class StartScenario(
        dispatcher: DemoDispatcher
) : SessionAwareOperations(dispatcher), ScenarioEntryPoint {

    override suspend fun start(update: Update) {
        sendMessage("Hello from demo service")
    }
}

Во втором случае отправляется запрос на ввод данных. В этом случае необходимо использовать метод sendRequest

sendRequest(SendMessage(recipient = Peer(Peer.Type.USER, messengerId), content = "Enter text")) {}

Использование в сценарии:

@Scenario(DemoDispatcher::class, "/sendResponseMessage", "sendResponseMessage")
class SendResponseMessageScenario(
        dispatcher: DemoDispatcher
) : SessionAwareOperations(dispatcher), ScenarioEntryPoint {

    override suspend fun start(update: Update) {
        sendRequest(SendMessage(recipient = Peer(Peer.Type.USER, messengerId), content = "Enter text")) {
            sendMessage("Sent: ${(it as Message).content}")
        }
    }
}

Обработка ответа

Ответ на запрос приходит в виде объекта Update и обрабатывается в responseExtractor. Передать responseExtractor в метод sendRequest можно, заключив код в фигурные скобки, следующие после параметров метода:

sendRequest(SendMessage(recipient = Peer(Peer.Type.USER, messengerId), content = "Enter text")) {
    sendMessage("Sent: ${(it as Message).content}")
}

Использование в сценарии:

@Scenario(DemoDispatcher::class, "/sendResponseMessage", "sendResponseMessage")
class SendResponseMessageScenario(
        dispatcher: DemoDispatcher
) : SessionAwareOperations(dispatcher), ScenarioEntryPoint {

    override suspend fun start(update: Update) {
        sendRequest(SendMessage(recipient = Peer(Peer.Type.USER, messengerId), content = "Enter text")) {
            sendMessage("Sent: ${(it as Message).content}")
        }
    }
}

Возвращаемое значение responseExtractor используется в качестве возвращаемого значения метода sendRequest

@Scenario(DemoDispatcher::class, "/simpleResponseExtractor", "simpleResponseExtractor")
class SimpleResponseExtractorScenario(
        dispatcher: DemoDispatcher
) : SessionAwareOperations(dispatcher), ScenarioEntryPoint {

    override suspend fun start(update: Update) {
        val response = sendRequest(SendMessage(recipient = Peer(Peer.Type.USER, messengerId), 
                                    content = "Enter text")) { it }
        sendMessage(response.toString())
    }
}

В данном случае, response будет инициализирован объектом Update ответа пользователя на запрос

Обработка некорректного ввода

В случае необходимости валидации ввода пользователя, необходимо передать validationErrorMessage в метод sendRequest. Текст валидационного сообщения будет отправлен пользователю в случае возникновения ошибки в блоке обработки ответа responseExtractor

@Scenario(DemoDispatcher::class, "/validationMessage", "validationMessage")
class ValidationErrorMessageScenario(
        dispatcher: DemoDispatcher
) : SessionAwareOperations(dispatcher), ScenarioEntryPoint {

    val DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("d.MM.yyyy")

    override suspend fun start(update: Update) {
        sendRequest(SendMessage(recipient = Peer(Peer.Type.USER, messengerId), 
                                content = "Enter date in format dd.mm.yyyy"),
                    validationErrorMessage = "Please, enter valid date in format dd.mm.yyyy") {
            if (it is Message) {
                val date = LocalDate.parse(it.content, DATE_TIME_FORMATTER)
                sendMessage("Entered: ${date.format(DATE_TIME_FORMATTER)}")
            } else {
                throw UnsupportedOperationException()
            }
        }
    }
}