mikutter blog

mikutterのアナウンスなど

PluginTag(プラグインオブジェクト)

mikutterの内部の話をするブログを作ってみた飽きたらやめる
基本的にRubyを知ってる人に対して書いてます。へんなことかいてたらごめん

プラグインの作成方法基本編です。

まず、mikutter.rbのあるディレクトリのplugin/以下に、なんとか.rbというファイルを作成します。すると起動時に勝手に読み込まれます。ここにrubyでゴリゴリプラグインを実装していきます。

一番キーになるのがPluginTagクラス。でも実際は、Plugin.createを使ってプラグインを作るので、PluginTagという名前はあまり使わないかも。詳しくはRDocをみてね。

http://mikutter.hachune.net/rdoc/classes/Plugin/PluginTag.html

まず、騙されたと思ってPluginTagのインスタンスを得ます。Plugin.createにはプラグインのファイル名の拡張子の前をSymbolで渡してあげればいいと思います。同じシンボルを渡せば同じインスタンスを返しますが、長ったらしいので変数に退避するのが望ましいです。
あと、関数のスコープが別のプラグインとぶつかるのが嫌なので、無名モジュールで囲ったりしてます

Module.new do
plugin = Plugin.create(:myplugin)
end

mikutterの中では、TLにつぶやきが流れてきたりするたびに「イベント」が発生します。このイベントを投げる/受けることで、プラグインはコアや別のプラグインとコミュニケーションをとってるんです。
例えばフォローしてる人がつぶやいたらupdateイベントが呼ばれ、そのイベントをlistenしているプラグインが起動されると。
ごたくはともかく例。

Module.new do
plugin = Plugin.create(:myplugin)
plugin.add_event(:update){ |service, messages|
messages.each{ |m|
puts m.to_s
}
}
end

イベントをリスンするにはPluginTag#add_eventを使います。詳しい使い方はRDocにかいてあるけれど見たとおりで、updateイベントが発生するとブロックが実行されます(イベントのコールバック)。
イベントごとにブロックの引数が決まっています。それも上のリンク先に書いてありますが、updateイベントの場合はPostクラスとMessageクラスの配列を引数に与えられることになっています。
Messageクラスはつぶやき1件を表現するクラスなので、これだけでTLをターミナルに書き出すプラグインの出来上がりです!短い!
ひとつのプラグインにいくつでもイベントをリスンさせることもできます。リプライも表示させるならこんな感じ

Module.new do
plugin = Plugin.create(:myplugin)
plugin.add_event(:update){ |service, messages|
messages.each{ |m|
puts m.to_s
}
}
plugin.add_event(:mention){ |service, messages|
messages.each{ |m|
puts m.to_s
}
}
end

ね、簡単でしょう?思いついたとおりに描いていけばいいんです。

大事なことは、イベントは必ずメインスレッドで実行されるということです。mikutterはメインスレッド以外でGtkを叩いてはいけないことになっています。だからイベントのコールバック内ならGtk関連の操作をしてもOK。ただし、あまりにも時間のかかる処理をここでしてしまうとmikutter全体のレスポンスが悪くなりますね

イベントの概念は、Twitterに例えたら、自分がPluginTagのインスタンスで、イベント(updateとか)が他人のアカウントで、add_eventとかでフォローする感じ。解りやすいかと思ったけど文字にしたら解り難かった。

まああれだGtkで言うところのシグナルですふつうに

まとめ

mikutterプラグインの根幹となる概念「イベント」についてちょっと触れました。短縮URLなど一部のプラグインを除けばほとんどのプラグインがこのイベントを使っています。
毎回こんな感じで書いていって、あとからマニュアルみたいに使えたらいいなってだったらちゃんとかけよおれ

きょうはなんかちょっと冷たいものが歯にしみたので歯をよく磨いて寝ます。時間も遅いから校正はやめとく おやすみ