diff --git a/build.sbt b/build.sbt index b2edd24..d2eba4d 100644 --- a/build.sbt +++ b/build.sbt @@ -12,6 +12,7 @@ lazy val root = (project in file(".")). scalaTest % Test, akka, akkaHttp, + akkaHttpSprayJson, akkaStream, vkapi ) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 5ae9dd1..d61a7ea 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -4,6 +4,7 @@ object Dependencies { lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.5" lazy val akka = "com.typesafe.akka" %% "akka-actor" % "2.5.12" lazy val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.1.1" + lazy val akkaHttpSprayJson = "com.typesafe.akka" %% "akka-http-spray-json" % "10.1.1" lazy val akkaStream = "com.typesafe.akka" %% "akka-stream" % "2.5.12" lazy val vkapi = "com.vk.api" % "sdk" % "0.5.12" } diff --git a/src/main/scala/eu/xeppaka/bot1/DialogActor.scala b/src/main/scala/eu/xeppaka/bot1/DialogActor.scala index ec3f0df..c1556c6 100644 --- a/src/main/scala/eu/xeppaka/bot1/DialogActor.scala +++ b/src/main/scala/eu/xeppaka/bot1/DialogActor.scala @@ -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 { - -} \ No newline at end of file + case class Start() +} diff --git a/src/main/scala/eu/xeppaka/bot1/TelegramBot.scala b/src/main/scala/eu/xeppaka/bot1/TelegramBot.scala new file mode 100644 index 0000000..3bccab2 --- /dev/null +++ b/src/main/scala/eu/xeppaka/bot1/TelegramBot.scala @@ -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() + } +} diff --git a/src/main/scala/eu/xeppaka/bot1/TelegramEntities.scala b/src/main/scala/eu/xeppaka/bot1/TelegramEntities.scala new file mode 100644 index 0000000..2f9a544 --- /dev/null +++ b/src/main/scala/eu/xeppaka/bot1/TelegramEntities.scala @@ -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] + ) +} diff --git a/urls.txt b/urls.txt index 8c1307e..7877b97 100644 --- a/urls.txt +++ b/urls.txt @@ -1,2 +1,3 @@ https://oauth.vk.com/authorize?client_id=6472591&scope=friends&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&v=5.74&response_type=token -https://oauth.vk.com/authorize?client_id=6472591&scope=friends&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&v=5.74&response_type=code \ No newline at end of file +https://oauth.vk.com/authorize?client_id=6472591&scope=friends&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&v=5.74&response_type=code +https://api.telegram.org/bot570855144:AAEv7b817cuq2JJI9f2kG5B9G3zW1x-btz4/getMe