もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

mikutter Advent Calendar 7日目 プラグイン書くの楽しいです( º﹃º` )

mikutter Advent Calendar 2013(http://www.adventar.org/calendars/120)7日目でございます。

早いもので、後少し寝れば 年末の納期がぁぁ!あの機能まだ人のアサイン決まって無いprz... 2013年も終わりですね。


思い返せば、2013年も色々ありました。

  • MacBook Air買ってmikutterを動かしたら組織から命を狙われたり。
  • 仕事の合間を縫ってOSCに薄い本を買いに行くも京都駅で遭難して夢潰えたり。
  • mikutterのプラグインを猿の様に書きまくったり。


こんな充実した(?)mikutterライフの結果、僕の愛娘は現在こんな感じになってます。

f:id:moguno:20131207004651p:plain:w250

はい、「シンプル」の意味を完全に取り違えてます。我ながらておいっす。

今回はこんな重病に至る過程で見つけた、ちょっとしたプラグイン作成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]
  }

ステータスバーにボタンを追加する

バージョンアップの度に季節感のあるメッセージが表示されるステータスバー。
実はここ。ツールバーになっていて、デフォルトのネギレンチの他にもボタンを追加する事が出来ます。

f:id:moguno:20131207093523p:plain


やり方は簡単。
 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]

      # 後はお好きに。

さいごに

ここで紹介したTipsを使った拙作プラグインはGitHubに置いてあります。
活用頂けたら幸いです。

https://github.com/moguno