今回はmikutter 3.3のPostboxのお話です。
3.3では、Postboxに大幅な改修が入りました。
古いAPIで呼び出しても一応、今までどおり動作します。もし動かなければ、mikutter側の不具合として修正される可能性があります。そこは信頼と安心のmikutterなのですが、かといって変更されたということは以前ではいろいろと不便だったわけです。これを機に、新しい使い方を学びましょう。
Postboxとは
Twitterへ投稿するテキストを入力する場所です。ReplyやDirect Messageもこれが使われています。
当然これだけ基本的な機能なので、mikutter最初期からあるコードでもあります。
gtk_postbox.rb:
http://dev.mikutter.hachune.net/projects/mikutter/repository/changes/core/mui/gtk_postbox.rb?rev=master
Postboxを使う
rdocを見れば、Postboxで新しくできるようになったことがなんとなくわかります。今回は従来でも出来たことも合わせて、こいつが何を出来るのか見ていきます。
前例から学ぶ
使い方ですが、Gtk::PostBoxを直接使うのではなく、postbox プラグインDSLメソッドを使います。
実際に
commandプラグインを見てみるのが一番です。リプライを送るためのPostboxを呼び出すために、opt.widget.create_postboxを呼び出しています。ここでopt.widgetは、:timelineロールのコマンドなので、
Plugin::GUI::Timelineのインスタンスです。
Reply
Replyは簡単で、to:に宛先の
Messageを指定するだけでReplyにはなります。しかしTwitterでは実は「@toshi_a」などとScreen Nameを入力しなくてもReplyになってしまいます。とはいえ未だに、Replyは相手のScreen Nameから始めるのが普通なので、最初からこれを入力しておく必要があります。
mikutterでは最初からPostboxに内容を入力しておくためにheader:オプションとfooter:オプションが用意されています。値はStringで、カーソルの前に入れるか、後に入れるかの違いです。Replyでは前に相手のScreen Nameを入れるので、headerを使っています。
最後に、use_blind_footer:というパラメータはtrueかfalseで、設定の「入力>フッタ>リプライの場合はフッタを表示しない」で設定された値を渡しています。これが真になると、設定したフッタが入ります。footer:はプラグインから設定するfooter、use_blind_footer:が指すfooterはユーザが設定するフッタを使うか否か、です。ややこしいですが我慢しましょう(後述)。
Legacy ReTweet
これについては
commandプラグインの60行目あたりにあります。いわゆる非公式リツイートというやつです。古い機能でもはや使われることはありませんが、mikutterは機能の廃止には慎重なので未だに残っています(後述)。
古い機能ですが、これもPostboxの使い方の教材としては未だに現役です。
このコマンドで目新しいのは、先ほど触れたfooter:が実際に使われていることと、to_display_only:オプションです。
Replyをmikutterから入力するとき、Postboxの下に宛先のTweetが表示されますね。これはto:で指定されたMessageが表示されます。つまりto:には2つの機能があることになってしまっているわけです。多くの場合問題ではないのですが、非公式リツイートはReplyにしたくないケースもあるのです。こういう時にはto_display_only:にtrueを指定すると、to:が表示のためだけに使われ、誰にも宛てられていないTweetを投稿できます。
オプション引数の名前がかっこ悪いのは、乱用すべきでないからです。宛先として表示されているTweetがあるのに、投稿すると実際には宛先がないのですから、ユーザを混乱させる可能性があります。使うときは慎重に。
Quoted Tweet
3.3から実装された、俗に言う「コメント付きリツイート」ですね。quoted_messageプラグインがQuoted Tweetに関することを担当しています。もともとサードパーティプラグインだったものが取り込まれたものですが、
このプラグインの30行目あたりにあるquoted_tweetコマンドは、取り込まれるにあたって追加されたものです。
Postboxに大幅な変更が入ったことで、最初からURLを入力した状態のPostboxを出現させることが出来ます。
わざわざ画像まで貼りましたが、ReplyとLegacy ReTweetを見てきたみなさんにとっては、これの実装から今更学ぶことはありません。footerが非公式リツイート形式からURLに変わっただけです。
そういえば先ほど慎重に使えと書いたto_display_onlyがここでも使われています。これはReplyにしたくはないが、下には宛先を表示しておきたいというケースの好例です。
Postboxをとりまく歴史
Postboxは最初からあるので、今まで数々の環境の変化を乗り越えてきたファイルのひとつでもあります。今回のようなAPIの改修が行われた経緯と、古いAPIが構築されてきた経緯を簡単に書いておきます。
非公式ReTweetの終焉
Twitterが「ReTweet」を実装したのはさすがにもう随分前ですが、ReTweetが実装された理由は、皆がつぶやきを共有し始めたからです。その時は「ワロタ RT @toshi_a: 元のTweet」みたいなTweetでReTweetを表現してました。実装されたことで従来の形式は「非公式リツイート」などと呼ばれており、mikutterのコードではLegacy ReTweetと。
「非公式リツイート」は衰退しましたが、ReTweetという基本的な機能はPostboxの中に組み込まれており、mikutterはできるだけ従来の機能を削除することはしないので、この機能は残り続けます。更に悪いことに、ReTweetはユーザが勝手にやっていた頃からこの名前だったため、Postboxには例えばretweetというオプションがありました。ここまで読んでいただいた皆さんはこれの意味を「非公式リツイートかどうかを判別する」ためだということが分かるでしょうが、経緯を知らなければ「なんでリツイートがこんなところに…?」と困惑することになるでしょう。あと、なんでPostboxがそんなことを知らなければならないのだ、という疑問も湧いてきます。
実はheader:とfooter:は、3.3から実装されたオプションです。では今まではどうやってテキストを挿入した状態のPostboxを作っていたのかというと、それはできませんでした。retweet:が真だったらLegacy ReTweetのfooterをつけるといったことを、Postboxが担当していたのです。
Quoted Tweet : 目的から機能に
今回、Quoted Tweetを実装するにあたって、新たにquoted:みたいなオプションも考えましたが、そんなことをしていては今後Poll機能(アンケート機能)などが実装されていくとキリがなくなってきます。また、主にネタツイート系のプラグインから、いきなり投稿するのではなく、Postboxを一度表示して、ユーザに編集や確認をさせたいという要望もありました。プラグイン毎に異なる目的があるなら、従来の「目的を聞くAPI」には限界があります。
そういうわけで、今回からは以上のようなAPIに刷新したわけです。
今後(できないこと)
Postboxの内容を動的に変えることがまだ(素直な方法では)できません。もうみんなやってるし別にいいかなとも思うのですが、抽象的な方法を用意しておくと、例えばgtk3とかに移行するなど、非互換な変更が入った時に、mikutter側で差異を吸収して引き続き使える可能性があるので良さそうです。
まとめ
Postboxを使ってみました。今回の知識を使って、
nominateというプラグインを作りました。ここまで読んだ人はこれから学ぶことは何もないと思いますが、必要な部分だけが切りだされているので、改造するには良いと思います。