ニコ生アラート作成に向けたGrowl for Windowsとruby_gntpの使い方調査

目標

  • 自分用のニコ生アラートの作成
    • 以前からニコ生アラート(βα)がCPUを1つ占有しアラートを再起動せざるを得なくなったり最近ではニコ生アラート(本家)が気づくと落ちていたりしたことがあったのがその理由

ニコ生アラートの基本機能

  1. アラートサーバから配信情報を受信
  2. デスクトップ上に通知を表示
  3. 通知をクリックし配信をブラウザで開く

付加的な(欲しい)機能

  • βαにあったような配信毎のレベル分け
    • 通知が表示されるだけだったり音が鳴ったり自動で配信を開いたり
  • 通知するのに本家アラートのようにコミュに入る必要がない
    • 加入コミュニティ一覧とは別管理にすることで実現

省略可能な機能

  • キーワード検索機能
    • ニコ生の配信検索ページで代用可能と判断
  • ON AIR情報の管理
    • βαの場合RSS情報を使ってON AIR情報を管理しているようだ
      • 終了後の配信についてON AIRのままとなったりすることがある
      • 番組終了を検知できずリストが膨大になると処理が重くなるらしい
    • ON AIRかそうでないかは番組URLを開けば分かるので省略可と判断

改善したい機能

  • アラート(本家)では公式配信がすべて通知されてしまう
    • 取捨選択できるような機能が欲しい
  • ユーザIDでのアラート
    • サブコミュでの配信も通知されるように

新たに欲しい機能

  • メモ機能
    • 簡単なメモをコミュIDあるいはユーザID毎に付けられるようにする

使うもの

基本機能の実現

  1. アラートサーバから配信情報を受信
    • libnama/alertapi.rbを手直しして利用予定
  2. デスクトップ上に通知を表示
  3. 通知をクリックし配信をブラウザで開く
    • 同一マシン上でアラートとGrowlを動かす場合はcallbackを設定しruby_gntpで通知してやればよい
    • 異なるマシン上からアラート情報を飛ばす場合はruby_gntpではできない(ようだ)
      • 私の理解ではcallbackはあくまでも情報を送った方が処理するためのものなので
    • GNTPには通知クリック時にデフォルトブラウザを開くことのできるURL Callback機能がある
      • 調べ方が悪いだけかもしれないがどうもruby_gntpでは扱えないように見受けられた

ruby_gntpでURL Callback機能を使うための修正

  • urlを引数に加えNotification-Callback-Targetヘッダを追加することでうまく通知できるようだ
*** /var/lib/gems/1.9.1/gems/ruby_gntp-0.3.4/lib/ruby_gntp.rb   2010-10-11 01:33:52.000000000 +0900
--- ruby_gntp.rb       2010-10-24 14:35:12.000000000 +0900
***************
*** 101,106 ****
--- 101,107 ----
      text   = params[:text]
      icon   = params[:icon] || get_notification_icon(name)
      sticky = params[:sticky]
+     url    = params[:url]
      callback_context = params[:callback_context]
      callback_context_type = params[:callback_context_type]

***************
*** 108,114 ****

      @binaries = []

!     message = notify_header(app_name, name, title, text, sticky, icon)
      message << output_origin_headers
      if callback || callback_context
        message << "Notification-Callback-Context: #{callback_context || '(none)'}\r\n"
--- 109,115 ----

      @binaries = []

!     message = notify_header(app_name, name, title, text, sticky, icon, url)
      message << output_origin_headers
      if callback || callback_context
        message << "Notification-Callback-Context: #{callback_context || '(none)'}\r\n"
***************
*** 204,210 ****
    #
    # outputs the notification header
    #
!   def notify_header(app_name, name, title, text, sticky, icon)
      message =  "#{get_gntp_header_start('NOTIFY')}\r\n"
      message << "Application-Name: #{@app_name}\r\n"
      message << "Notification-Name: #{name}\r\n"
--- 205,211 ----
    #
    # outputs the notification header
    #
!   def notify_header(app_name, name, title, text, sticky, icon, url)
      message =  "#{get_gntp_header_start('NOTIFY')}\r\n"
      message << "Application-Name: #{@app_name}\r\n"
      message << "Notification-Name: #{name}\r\n"
***************
*** 212,217 ****
--- 213,219 ----
      message << "Notification-Text: #{text}\r\n"            if text
      message << "Notification-Sticky: #{sticky}\r\n"        if sticky
      message << "#{handle_icon(icon, 'Notification')}\r\n"  if icon
+     message << "Notification-Callback-Target: #{url}\r\n"  if url
      message
    end

進捗状況

  • 鋭意作成中
  • 最終的にはnamarecoとcielchanとアラートを統合したものが出来上がる予定
    • 以下のファイルを中心に結構大規模に書き換え中とあらかじめ予告
      • namareco/scripts/{commandline.rb,scheduler.rb}, libnama/alertapi.rb
      • もしも何らかのパッチを作成していただいている方がいらっしゃったら申し訳ないので