NinjaSlayer (xyttr Advent Calendar 11日目)

この記事はxyttr Advent Calendar 2011の記事です。

世界全土を電子ネットワークが覆いつくし、サイバネティック技術が普遍化した未来。宇宙殖民など稚気じみた夢。人々は灰色のメガロシティに棲み、夜な夜なサイバースペースへ逃避する。政府よりも力を持つメガコーポ群が、国家を背後から操作する。ここはネオサイタマ。鎖国体制を敷く日本の中心地だ。
−「メリークリスマス・ネオサイタマ」より

今回は、全米を震撼させているサイバーパンクニンジャ活劇小説「ニンジャスレイヤー」の公式日本語翻訳チームアカウント@NJSLYRと、実況用ハッシュタグ#njslyrを快適に鑑賞するためのコマンドを紹介します。
ニンジャスレイヤーをご存知ない方は日本語版公式ファンサイトの紹介をご覧ください。

2画面モード

ワイドディスプレイを使用しているなら、xyzzyのwindowを縦に分割して翻訳公式アカウントと実況タグを表示すると見やすいです。
http://gyazo.com/629369d6758f25099bb218a66f3f0c19.png

;;; ~/.xyttr/config.l とかに書く
(in-package :xyttr)

(defun njslyr ()
  (interactive)
  (let ((*frame-name* "njslyr"))
    (select-pseudo-frame
     (or (find-pseudo-frame *frame-name*)
         (new-pseudo-frame *frame-name*)))
    (when (= (count-windows) 1)
      (split-window-vertically))
    (user::xyttr-user "NJSLYR")
    (other-window)
    (user::xyttr-search "#NJSLYR -RT")))

;; 任意のタイムラインバッファからNキーで呼び出せるようにする
(define-key *xyttr-timeline-keymap* #\N 'njslyr)

公式側のウィンドウでカーソルをバッファ先頭に置いてから実況用タグ側をアクティブにすると公式側は自動リロード時にスクロールするようになります。

define-keyを使用しない場合、M-x xyttr::njslyr で起動するか、global-set-keyで好きなキーに'xyttr::njslyrを割り当てます。

なおこのコマンドは密かにNetInstallerで配布されているファイルのconfig.lサンプルファイルに入れてあります。
https://github.com/youz/xyttr/blob/master/.xyttr/config.l#L15

1画面モード

今年始めくらいまでは単純に"NJSLYR -RT"と検索するだけで公式と実況を一本化して表示できていたみたいですが、NinjaHeadsが増えてきたせいか検索の仕様変更のせいか、抜けが多くなって使いにくくなってます。
そこでuser-timelineとsearchを一本化するapi関数を作り、このapiを使ってタイムライン表示コマンドを作成します。

(defun api-njslyr-async (&key since_id max_id count include_rts
                              onsuccess onfailure)
  (let ((tweets1 nil)
        (done nil))
    (labels
        ((cb (tweets)
           (if done
               (funcall onsuccess (sort (append tweets1 tweets) #'>
                                        :key #'(lambda (e) (json-value e id))))
             (setq tweets1 tweets done t))))
      (values
       (api-user-timeline-async
        :screen_name "NJSLYR"
        :since_id since_id :max_id max_id :count count :include_rts include_rts
        :onsuccess #'cb :onfailure onfailure)
       (api-search-async
        :q "#NJSLYR -RT" :lang "ja" :rpp count
        :onsuccess #'cb :onfailure onfailure)))))

;; コマンド定義 (起動は M-x xyttr-njslyr)
(define-tl-command xyttr-njslyr ()
  :buffer-name "*NJSLYR*"
  :api-func #'api-njslyr-async
  :api-params (:count 50 :include_rts t))

http://gyazo.com/883cd56cad85bfc54a405cb440161a2b.png

define-tl-commandマクロはまた後日説明しようと思いますが、api-home-timelineなどのタイムライン系api関数と互換のある関数からタイムライン表示コマンドを生成できます。
本当はdefine-tl-commandの"@NJSLYR"に色付けができると良いのですが現在define-tl-commandのhookパラメータの処理にバグがあるみたいでうまく行きません… 早めに直そう。

過去ログ鑑賞

xyttrから過去のエピソードに簡単にアクセスする方法は今の所良いアイディアがありません。
@alohakunさんの素晴らしいまとめ記事がありますのでこちらを利用しましょう。
ニンジャスレイヤー「はじめての皆さんへ」 (まとめ・リンク集)



以上ニンジャスレイヤーコマンドの紹介でした。