Skip to content

Instantly share code, notes, and snippets.

@yuroyoro
Created April 24, 2009 06:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuroyoro/100995 to your computer and use it in GitHub Desktop.
Save yuroyoro/100995 to your computer and use it in GitHub Desktop.
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