Как получить сообщение от метода - PullRequest
1 голос
/ 20 апреля 2019

Я хочу переписать консольное приложение ввода-вывода (подсчет суммы) в messenger-bot.StdIn.readLine() позволяет мне получить следующий входной номер в рекурсии.

object HelloCountBot extends TelegramBot with Polling with Commands {
  def go(number: Long, chatId: Long): IO[Long] =
    for {
      input <- ??? /*here I need get the next number*/
      acc <- input.toLong match {
        case 0L => sendMessageMethodIO(chatId, "The sum is:") *> IO(0L)
        case _ => go(number + 1, chatId)
      }
      acc <- IO(acc + input.toLong)
    } yield acc

  /*input point for every new message*/
  override def onMessage(message: Message) = message.text match {
    case Some(text) if text == "start" => go(1, message.chat.id)
      .unsafeRunSync
  }

  def main(args: Array[String]): Unit = HelloCountBot.run()
}

Как организовать код для получения следующего сообщения внутри рекурсии из метода onMessage с возвратом модуля.

1 Ответ

0 голосов
/ 27 апреля 2019

Я не нашел в https://github.com/bot4s/telegram каких-либо способов получения сообщений так, как вы хотите.Поэтому я думаю, что лучшим вариантом является создание бота с состоянием, как показано в этом примере: https://github.com/bot4s/telegram/blob/master/examples/src/StatefulBot.scala.

Так что, если я правильно понимаю ваш код, его можно реорганизовать следующим образом (черта PerChatState взята изссылка выше):

object HelloCountBot
  extends TelegramBot
    with Polling
    with Commands
    with PerChatState[Long] {

  override def onMessage(message: Message): Future[Unit] = {

    implicit val msg = message

    message.text match {
      case Some(text) if text == "start" =>
        Future {
          setChatState(0L)
        }
      case Some(value) if value == "0" =>
        withChatState {
          sum =>
            reply(s"The sum is ${sum.getOrElse(0L)}")
              .map(_ => clearChatState)
        }

      case Some(value) =>
        withChatState {
          mayBeSum =>
            Future {
              mayBeSum.foreach(
                sum => setChatState(sum + value.toLong)
              )
            }
        }
    }
  }

  def main(args: Array[String]): Unit = HelloCountBot.run()
}

Он использует Futures, но вы можете переписать его в IO, если хотите.

...