Copiei o código do repositório telegram/bot4s, coloquei parte do código em "object Main extends App", criei o arquivo sbt e instalei as bibliotecas.
import cats.instances.future._
import cats.syntax.functor._
import com.bot4s.telegram.api.RequestHandler
import com.bot4s.telegram.api.declarative.Commands
import com.bot4s.telegram.clients.{FutureSttpClient, ScalajHttpClient}
import com.bot4s.telegram.future.{Polling, TelegramBot}
import com.bot4s.telegram.methods.SendDice
import scala.util.Try
import scala.concurrent.Future
/** Generates random values.
*/
class RandomBot(val token: String) extends TelegramBot
with Polling
with Commands[Future] {
//LoggerConfig.factory = PrintLoggerFactory()
// set log level, e.g. to TRACE
//LoggerConfig.level = LogLevel.TRACE
// Use sttp-based backend
implicit val backend = SttpBackends.default
override val client: RequestHandler[Future] = new FutureSttpClient(token)
// Or just the scalaj-http backend
// override val client: RequestHandler[Future] = new ScalajHttpClient(token)
val rng = new scala.util.Random(System.currentTimeMillis())
onCommand("coin" or "flip") { implicit msg =>
reply(if (rng.nextBoolean()) "Head!" else "Tail!").void
}
onCommand("real" | "double" | "float") { implicit msg =>
reply(rng.nextDouble().toString).void
}
onCommand("/die" | "roll") { implicit msg =>
reply("⚀⚁⚂⚃⚄⚅" (rng.nextInt(6)).toString).void
}
onCommand("random" or "rnd") { implicit msg =>
withArgs {
case Seq(Int(n)) if n > 0 =>
reply(rng.nextInt(n).toString).void
case _ => reply("Invalid argumentヽ(ಠ_ಠ)ノ").void
}
}
onCommand("choose" | "pick" | "select") { implicit msg =>
withArgs { args =>
replyMd(if (args.isEmpty) "No arguments provided." else args(rng.nextInt(args.size))).void
}
}
onCommand("auto") { implicit msg =>
request(SendDice(msg.chat.id)).void
}
// Extractor
object Int {
def unapply(s: String): Option[Int] = Try(s.toInt).toOption
}
}
object Main extends App {
val bot = new RandomBot("tokenhere")
val eol = bot.run()
println("Press [ENTER] to shutdown the bot, it may take a few seconds...")
scala.io.StdIn.readLine()
bot.shutdown() // initiate shutdown
// Wait for the bot end-of-life
Await.result(eol, Duration.Inf)
}
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / scalaVersion := "2.13.16"
lazy val root = (project in file("."))
.settings(
name := "Meower"
)
// Core with minimal dependencies, enough to spawn your first bot.
libraryDependencies += "com.bot4s" %% "telegram-core" % "5.8.4"
// Extra goodies: Webhooks, support for games, bindings for actors.
libraryDependencies += "com.bot4s" %% "telegram-akka" % "5.8.4"
mas depois disso falhei na construção com:
C:\Usuários\днс\Music\play-samples-3.0.x\Meower\src\main\scala\Main.scala:25:26 não encontrado: valor SttpBackends val implícito backend = SttpBackends.default
C:\Users\днс\Music\play-samples-3.0.x\Meower\src\main\scala\Main.scala:26:49 não foi possível encontrar o valor implícito para o parâmetro backend: sttp.client3.SttpBackend[scala.concurrent.Future,Any] Ocorreu um erro em um aplicativo envolvendo argumentos padrão. override val client: RequestHandler[Future] = new FutureSttpClient(token)
C:\Usuários\днс\Music\play-samples-3.0.x\Meower\src\main\scala\Main.scala:71:3 não encontrado: valor Await Await.result(eol, Duration.Inf)
C:\Usuários\днс\Music\play-samples-3.0.x\Meower\src\main\scala\Main.scala:71:21 não encontrado: valor Duration Await.result(eol, Duration.Inf)
O que preciso fazer para corrigir esses problemas?
Pesquisei "Não é possível encontrar SttpBackends + "Ocorreu um erro em um aplicativo envolvendo argumentos padrão." e tentei corrigir meu código, mas não obtive sucesso...
Primeiro você precisa adicionar dois
import
s para resolverAwait
eDuration
não encontrar. Então, apenas adicionar o seguinte resolverá esse problemaEntão você tem que decidir qual backend dos backends suportados por sttp você quer usar
Digamos que escolhemos OkHttpFutureBackend .
Então, tudo o que você precisa fazer é adicionar a seguinte dependência em seu
build.sbt
E então na sua
RandomBot
aula você tem que substituir a linhapara este outro
Se você quiser ter sua própria classe
SttpBackends
para não substituir a linha mencionada anteriormente, você pode criá-la como mostrado em bot4s/telegram - exemplos - jvm - SttpBackends - v5.8.4