Http client tests. Telegram entities started.

This commit is contained in:
Pavel Kachalouski
2018-05-10 07:47:07 +02:00
parent 8b705c8f77
commit 60eeb30e14
6 changed files with 126 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ import akka.actor.Actor
class DialogActor extends Actor {
private val dialogId = UUID.randomUUID()
private var userId: Option[Int] = None
override def receive: Receive = {
case 1 =>
@@ -13,5 +14,5 @@ class DialogActor extends Actor {
}
object DialogActor {
}
case class Start()
}

View File

@@ -0,0 +1,76 @@
package eu.xeppaka.bot1
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.{Route, RouteResult}
import akka.stream.ActorMaterializer
import scala.concurrent.{ExecutionContextExecutor, Future}
import scala.io.StdIn
import TelegramEntities._
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import akka.http.scaladsl.model.{HttpRequest, StatusCodes}
import akka.http.scaladsl.server.directives.LoggingMagnet
import akka.http.scaladsl.unmarshalling.Unmarshal
import spray.json._
import scala.util.{Failure, Success}
trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
implicit object getMeFormat extends RootJsonFormat[GetMe] {
override def write(obj: GetMe): JsValue = ???
override def read(json: JsValue): GetMe =
json.asJsObject.getFields("id", "is_bot", "first_name", "username") match {
case Seq(JsNumber(id), JsBoolean(isBot), JsString(firstName), JsString(userName)) => GetMe(id.toInt, isBot, firstName, userName)
case _ => throw new DeserializationException("GetMe deserialize error")
}
}
implicit val responseFormat = jsonFormat2(Response[GetMe])
}
class TelegramBot extends JsonSupport {
def run(): Unit = {
implicit val actorSystem: ActorSystem = ActorSystem("telegram-bot")
implicit val materializer: ActorMaterializer = ActorMaterializer()
implicit val executionContext: ExecutionContextExecutor = actorSystem.dispatcher
val bindingFuture = Http().bindAndHandle(botRoutes(), "localhost", 8080)
StdIn.readLine()
bindingFuture
.flatMap(_.unbind())
.onComplete(_ => actorSystem.terminate())
}
def printRequestMethodAndResponseStatus(req: HttpRequest)(res: RouteResult): Unit = {
println(req)
println(res)
}
def botRoutes()(implicit actorSystem: ActorSystem, materializer: ActorMaterializer, executionContext: ExecutionContextExecutor): Route = {
path("test") {
get {
logRequestResult(LoggingMagnet(_ => printRequestMethodAndResponseStatus)) {
onComplete(getBotInfo()) {
case Success(res) => complete(res.ok.toString)
case Failure(ex) => complete(StatusCodes.InternalServerError, "Boooom!")
}
}
}
}
}
def getBotInfo()(implicit actorSystem: ActorSystem, materializer: ActorMaterializer, executionContext: ExecutionContextExecutor): Future[Response[GetMe]] = {
Http().singleRequest(HttpRequest(uri = "https://api.telegram.org/bot570855144:AAEv7b817cuq2JJI9f2kG5B9G3zW1x-btz4/getMe")).flatMap(Unmarshal(_).to[Response[GetMe]])
}
}
object TelegramBot {
def main(args: Array[String]): Unit = {
new TelegramBot().run()
}
}

View File

@@ -0,0 +1,43 @@
package eu.xeppaka.bot1
object TelegramEntities {
case class Response[T](ok: Boolean,
// description: Option[String],
// errorCode: Option[Int],
result: T)
case class GetMe(id: Int, isBot: Boolean, firstName: String, userName: String)
case class Update(updateId: Int,
message: Option[Message],
editedMessage: Option[Message],
channelPost: Option[Message],
editedChannelPost: Option[Message])
case class User(id: Int,
isBot: Boolean,
firstName: String,
lastName: Option[String],
userName: Option[String],
languageCode: Option[String])
case class Message()
case class ChatPhoto(smallFileId: String, bigFileId: String)
case class Chat(id: Int,
chatType: String,
title: Option[String],
userName: Option[String],
firstName: Option[String],
lastName: Option[String],
allMembersAreAdministrators: Option[Boolean],
photo: Option[ChatPhoto],
description: Option[String],
inviteLink: Option[String],
pinnedMessage: Option[Message],
stickerSetName: Option[String],
canSetStickerSet: Option[Boolean]
)
}