RubyCocoa で Ruby/twitter ライブラリに GUI を付けてみた

とりあえず何かに GUI を被せることから始めるのが簡単そうだったのでやってみた。
RubyCocoa 入門を2度ほどやってみて、なんとなく理解した。
sender が何なのか分かりづらい場合は

p sender

でクラスを見てやると良いかも。
Interface Builder での delegate とか dataSource はまだよく分かっていないorz
についてはこちらを見ると良い => http://journal.mycom.co.jp/column/objc/066/index.html


post でメッセージ投稿、update でtwitt を取りに行く(だけ)。
Interface Builder でボタンを作って、それに ruby の method を紐付けて起動させるイメージ。

#
#  AppController.rb
#  hajimete1
#
#  Created by mako on 07/12/11.
#  Copyright (c) 2007 __MyCompanyName__. All rights reserved.
#

# 参考にしたサイト
# http://limechat.net/rubycocoa/tutorial/
# http://mono.kmc.gr.jp/~yhara/d/?date=20071215#p02
# http://exdesign.jp/wordpress/?p=89
# http://www.namaraii.com/rubytips/?%C6%FC%C9%D5%A4%C8%BB%FE%B9%EF
# 参考になるサイト
# http://mono.kmc.gr.jp/~yhara/w/?RubyTwitterJa
# http://cureblack.com/20071120.html

# To do
#1. 保持してるデータから時刻を判定して新しいものだけ取ってくる
#2. @items に直接ではなくて、sqlite にデータと時刻をしまっておいて、activerecord で取り出す

require 'osx/cocoa'
require 'rubygems'
require 'twitter'
require 'kconv'   
require 'parsedate'

$KCODE = 'u'

class AppController < OSX::NSObject
  ib_outlet :window, :message, :table

  include OSX
  
  def initialize
    @items = []
    # @last_updated = Time.now とかでいつか作る
    @twit = Twitter::Base.new("Twitter に登録したメールアドレス", "パスワード")
  end
  
  def awakeFromNib
    @window.alphaValue = 1.0
  end
  
  # Update your twitt
  ib_action :post
  def post(sender)
    @twit.update(@message.stringValue.to_s)
  end
  
  def decode_utf(str)
    str.gsub(/&#([\d]{4,5});/){ [$1.to_i].pack "U" }
  end
  
  def string_to_time_obj(string)
    # string => "Fri Jan 04 12:09:20 +0000 2008"
    ary = ParseDate::parsedate(string)
    t = Time::local(*ary[0..-3])
  end

  ib_action :update
  def update(sender)
    ret = []
    @twit.timeline(:friends).sort{|a,b| string_to_time_obj(b.created_at) <=> string_to_time_obj(a.created_at)}.each do |s|
      ret << [s.user.screen_name, decode_utf(s.text), s.created_at]
    end
    @items = ret
    @table.reloadData
  end

  # NSTableView dataSource
  def numberOfRowsInTableView(sender)
    @items.length if @items
  end

  def tableView_objectValueForTableColumn_row(sender, col, row)
    case col
    when @table.tableColumns.to_a[0]
      @items[row][0]
    when @table.tableColumns.to_a[1]
      @items[row][1]
    when @table.tableColumns.to_a[2]
      @items[row][2]
    end
  end
end

あ、とりあえずの練習として作ったのものなので To do とかは実装する予定ないです。。