mikutter Advent Calendar 7日目 プラグイン書くの楽しいです( º﹃º` )
mikutter Advent Calendar 2013(http://www.adventar.org/calendars/120)7日目でございます。
早いもので、後少し寝れば 年末の納期がぁぁ!あの機能まだ人のアサイン決まって無いprz... 2013年も終わりですね。
思い返せば、2013年も色々ありました。
- MacBook Air買ってmikutterを動かしたら組織から命を狙われたり。
- 仕事の合間を縫ってOSCに薄い本を買いに行くも京都駅で遭難して夢潰えたり。
- mikutterのプラグインを猿の様に書きまくったり。
こんな充実した(?)mikutterライフの結果、僕の愛娘は現在こんな感じになってます。

はい、「シンプル」の意味を完全に取り違えてます。我ながらておいっす。
今回はこんな重病に至る過程で見つけた、ちょっとしたプラグイン作成Tipsをご紹介します。
メッセージをageる。
Messageにはcreatedとmodifiedって言う2つの日時を格納するフィールドがあります。
createdは投稿日時表示に使われる物で、modifiedはメッセージの並びを制御する物になります。
このmodifiedにnowを設定すると、メッセージをTLの一番上に持ってくる事が出来ます。
modifiedには未来の日時を設定する事も出来ます。
この場合は、TL上部にメッセージを一定時間張り付ける事が出来ます。
通知領域みたいに使えますね。
def pin(msg, pinning)
if pinning then
# メッセージを5分間TL上部に張り付ける
msg[:modified] = Time.new + 5 * 60
msg[:pinned] = "pinned" # (※1)
else
msg[:modified] = Time.new
msg[:pinned] = nil
end
# メッセージ変更をコアに通知する。
Plugin::call(:message_modified, msg)
msg
endちなみに、Messageには任意のフィールドを追加する事が出来ます(※1)
後続のフィルタで自プラグインが処理したメッセージの背景色を変えたいときとかの目印に使えて便利です。
filter_message_background_color { |message, color|
if message.message[:pinned] then # ※1のフィールドが存在するなら背景色変更
color = UserConfig[:gosunkugi_background_color]
end
[message, color]
}
ステータスバーにボタンを追加する
バージョンアップの度に季節感のあるメッセージが表示されるステータスバー。
実はここ。ツールバーになっていて、デフォルトのネギレンチの他にもボタンを追加する事が出来ます。

やり方は簡単。
roleが:windowなCommandを作るだけです。
command(:open_my_profile,
name: 'プロフィール',
condition: lambda{ |opt| true },
visible: true,
icon: Service.primary.user_obj[:profile_image_url],
role: :window) do |opt|
Plugin.call(:show_profile, Service.primary, Service.primary.user_obj) end
GTKプラグインを操作する。
mikutterは0.2辺りからUIとコア部分の明確な分離が提唱されました。
それにより、UIプラグインの実装はコアから隠匿され、コアとUIは抽象化されたAPIで会話するようになりました。
その結果、標準のGTKプラグイン以外のUIプラグインが生まれてきました。
現在ではmikutter デーモンモードの様なUI不要な使い方や、Luna等の今となっては非力なワークステーションでも動作するCUIなインターフェースなどが登場しています。
一方、別のプラグインがGTKプラグインのオブジェクトを直接操作する事は出来なくなった・・・と思ってたら、ひっそりとインターフェースが存在してました。
:gui_get_gtk_widgetフィルタを使えば、抽象化GUIオブジェクトi_window、i_tab、i_timelineなどを引数にして、対応したGTKオブジェクトが取得出来ます。
on_window_created do |i_window|
begin
# メインウインドウを取得
window_tmp = Plugin.filtering(:gui_get_gtk_widget,i_window)
if (window_tmp == nil) || (window_tmp[0] == nil) then
next
end
# windowはGtk::Windowのインスタンス
window = window_tmp[0]
# 後はお好きに。