termtter から growl に通知する の続き

引き続きtwitter、というかtermtterの話。
termtter から growl に通知する - Learning to be Me の続き。growlで通知するとこまではできたのだが、ユーザのアイコンが表示できていなかった。url指定しても、うまくいったり行かなかったりなので、結局一度ダウンロードして、画像を表示することにした。

~/sketch/ruby/growl-send.rb とかそんな感じの適当なファイルに、

require 'meow'
require 'uri'

def get_icon(s)
  cache_file = "#{Termtter::CACHE_DIR}/#{s.user_id}"
  unless File.exist? cache_file
    buf = ""
    open(URI.encode(s.user_profile_image_url)) do |r|
      buf = r.read
    end
    open(cache_file,"w") do |r|
      r.write(buf)
    end
  end
  return OSX::NSImage.alloc.initWithContentsOfFile(cache_file)
end

Termtter::Client.add_hook do |statuses, event|
  if !statuses.empty? && event == :update_friends_timeline
    growl = Meow.new("Termtter")
    statuses.reverse.each do |s|
      screen_name = s.user_screen_name
      text = s.text.gsub("\n",'')
      icon = get_icon(s)
      growl.notify(screen_name,text,:icon=>icon)
    end
  end
end

を保存してあげて、

.termtter を、

module Termtter

  CACHE_DIR = '/tmp/termtter-icon-cache-dir'

  class Status
    %w(
      id text created_at truncated in_reply_to_status_id in_reply_to_user_id
      user_id user_name user_screen_name user_profile_image_url
    ).each do |attr|
      attr_accessor attr.to_sym
    end
  end

  class Client
    def get_timeline(uri, update_since_id = false)
      doc = Nokogiri::XML(open(uri, :http_basic_authentication => [@user_name, @password]))
      statuses = []
      doc.xpath('//status').each do |node|
        status = Status.new
        %w(
          id text created_at truncated in_reply_to_status_id in_reply_to_user_id
          user/id user/name user/screen_name user/profile_image_url
        ).each do |key|
          method = "#{key.gsub('/', '_')}=".to_sym
          status.send(method, node.xpath(key).text)
        end
        status.created_at = Time.utc(*ParseDate::parsedate(status.created_at)).localtime
        statuses << status
      end

      if update_since_id && !statuses.empty?
        @since_id = statuses[0].id
      end

      return statuses
    end

  end

end

Dir.mkdir(Termtter::CACHE_DIR) unless File.exist?(Termtter::CACHE_DIR)
require File.expand_path('~/sketch/ruby/growl-send.rb')
configatron.user_name = 'ユーザ名'
configatron.password = 'パスワード'

という感じにしてあげれば、アイコン付きで、termtterからgrowlに通知がいく、はず。