焼け石に肉

新米プログラマの学習記録日記です。Scalaに興味があるので、ScalaとPlay Frameworkの勉強メモを残していこうと思います。

【Scala】Scala&Play FrameworkでTwitter4jをいじってみる Part5【Twitter4j】

前回の続きです。今回で完成させていきます。

routes

GET     /                           controllers.HomeController.index
GET     /search                     controllers.SearchTweetsController.search

ルーティングは上記のとおりになっています。
HomeControllerは初期画面表示を行い、SearchTweetsControllerはTweetの検索処理と検索結果画面表示を行います。

Controllers

HomeController
package controllers

import javax.inject._

import forms.SearchTweets
import play.api.data.Form
import play.api.data.Forms._
import play.api.i18n.{ I18nSupport, MessagesApi }
import play.api.mvc._
import play.api.data.format.Formats._

@Singleton
class HomeController @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport {

  private val searchTweetsForm: Form[SearchTweets] = Form {
    mapping(
      "lat"     -> of[Double],
      "lng"     -> of[Double],
      "range"   -> of[Double],
      "keyword" -> nonEmptyText
    )(SearchTweets.apply)(SearchTweets.unapply)
  }

  def index = Action { implicit request =>
    Ok(views.html.index(searchTweetsForm, Nil))
  }

}

こちらの、HomeControllerは、初期画面表示を行います。
searchTweetsFormをマッピングしています。
indexメソッドで、初期画面表示を行っています。

SearchTweetsController
package controllers

import javax.inject.{ Inject, Singleton }

import forms.SearchTweets
import models.Tweet
import play.api.data.Form
import play.api.data.Forms._
import play.api.i18n.{ I18nSupport, MessagesApi }
import play.api.mvc.{ Action, AnyContent, Controller }
import twitter4j._
import play.api.data.format.Formats._

@Singleton
class SearchTweetsController @Inject()(
    val messagesApi: MessagesApi,
) extends Controller
    with I18nSupport {

  private val searchTweetsForm: Form[SearchTweets] = Form {
    mapping(
      "lat"     -> of[Double],
      "lng"     -> of[Double],
      "range"   -> of[Double],
      "keyword" -> nonEmptyText
    )(SearchTweets.apply)(SearchTweets.unapply)
  }

  def search(): Action[AnyContent] = Action { implicit request =>
    val twitter = new TwitterFactory().getInstance()

    val query = new Query()

    val form = searchTweetsForm.bindFromRequest.get

    val geo = new GeoLocation(form.lat, form.lng)
    query.setGeoCode(geo, form.range, Query.KILOMETERS)

    query.setQuery(form.keyword)
    query.setCount(100)

    var result: QueryResult = null

    try {
      result = twitter.search(query)
    } catch {
      case e: TwitterException => println("error")
    }

    val itr = result.getTweets().iterator()

    var tweetList: List[Tweet] = Nil
    while (itr.hasNext()) {
      val status = itr.next()
      val tweet  = new Tweet(status.getText, status.getUser.getProfileImageURL)
      tweetList = tweetList.::(tweet)
    }

    Ok(views.html.index(searchTweetsForm, tweetList))
  }

}

こちらは、Tweetの検索処理を行います。
twitter4jの使い方などは、そこらじゅうに情報が転がっているので、説明はしません。

まとめ

とりあえず、ScalaとPlay Frameworkを使って、簡単なアプリを作ってみました。
さらなる学習のために、このアプリをより多機能にしたりしていきたいとおもいます。