Created
April 24, 2009 06:50
-
-
Save yuroyoro/100995 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import scala.actors._ | |
import java.lang.Thread | |
import java.net.{Authenticator, PasswordAuthentication} | |
import java.net.{URL, HttpURLConnection,URLEncoder} | |
import java.text.SimpleDateFormat | |
import java.util.Locale | |
import java.util.Calendar | |
import scala.xml.XML | |
import scala.util.matching._ | |
object SayBot extends Application{ | |
// Replyを取得する間隔(millsec) | |
val INTERVAL:Long = 60 * 1000 | |
val twitterId = "saybot" | |
val twitterPass = "***" | |
// Sayコマンドを実行するActor | |
object SayActor extends Actor{ | |
// sayコマンドを実行する | |
def act ={ | |
Actor.loop{ | |
react { | |
case message :String => | |
var rt:Runtime = Runtime.getRuntime | |
rt.exec( "say " + message) | |
// とりあえず文字数×0.5secだけsleep | |
Thread.sleep( message.length * 500) | |
} | |
} | |
} | |
} | |
// Replyを取得するActor | |
object RepliesActor extends Actor{ | |
val url = "http://twitter.com/statuses/replies.xml" | |
Authenticator.setDefault( | |
new Authenticator { | |
override def getPasswordAuthentication = { | |
new PasswordAuthentication(twitterId, twitterPass.toCharArray); | |
} | |
} | |
) | |
// 前回Replyを取得した時刻 | |
var cl:Calendar = Calendar.getInstance | |
cl.add(Calendar.HOUR_OF_DAY , -9) | |
var lastTime = cl.getTimeInMillis | |
def act = { | |
Actor.loop{ | |
receive { | |
case interval: Long => | |
gerReplies | |
Thread.sleep(interval) | |
this ! interval | |
} | |
} | |
} | |
def gerReplies(){ | |
// Replyを取得する | |
val df = new SimpleDateFormat("EEE MMM dd HH:mm:ss +0000 yyyy", Locale.US) | |
println( "getReplies " + lastTime + ":" + df.format(lastTime)) | |
val urlConn = new URL(url).openConnection.asInstanceOf[HttpURLConnection] | |
urlConn.connect(); | |
urlConn.getResponseCode | |
for (s <- XML.load(urlConn.getInputStream) \ "status" reverse ; | |
created_at = s \ "created_at" text ; | |
time = df.parse(created_at).getTime if(time>lastTime)) { | |
var (text, user_name) = (s \ "text" text, s \ "user" \ "name" text) | |
println( user_name + ":" + text ) | |
lastTime = time | |
val r = new Regex("@" + twitterId + "\\s(.+)$") | |
r.findAllIn(text).matchData.foreach( i=>{ | |
ReadingActor ! i.group(1) | |
}) | |
} | |
} | |
} | |
// 日本語のよみに変換するActor | |
object ReadingActor extends Actor{ | |
val apiKey = "****" | |
val url = "http://jlp.yahooapis.jp/DAService/V1/parse?appid=" + apiKey + "&sentence=" | |
def act = { | |
Actor.loop { | |
react { | |
case message :String => | |
var res = reading( message ) | |
println( res ) | |
SayActor ! message | |
} | |
} | |
} | |
def reading(message:String) :String = { | |
val urlConn = new URL(url + urlEncode(message)).openConnection.asInstanceOf[HttpURLConnection] | |
println( url + urlEncode(message) ) | |
urlConn.connect(); | |
urlConn.getResponseCode | |
var result = "" | |
XML.load(urlConn.getInputStream) \ "Result" \ "ChunkList" \ "Chunk" \ "MorphemList" \ "Morphem" foreach{ | |
reading => result += convert( reading \ "Surface" text , reading \ "Reading" text) | |
} | |
return result | |
} | |
def urlEncode(in:String) = URLEncoder.encode(in, "UTF-8") | |
def convert(surf:String,read:String):String = { | |
return read | |
} | |
def convert( str:String):String ={ | |
return str; | |
} | |
} | |
RepliesActor.start | |
ReadingActor.start | |
SayActor.start | |
RepliesActor ! INTERVAL | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment