機能 #1200
完了
mikutter CommandのEventオブジェクトにWorldなどをもたせる
toshi_a 初音 さんが6年以上前に追加.
ほぼ6年前に更新.
説明
現在、mikutter Commandを呼び出す時には、 command
イベントフィルタでmikutter Commandのリストを得て、Commandに与えるパラメータをまとめた Plugin::GUI::Event
オブジェクトを引数にCommandを呼ぶ。
Plugin::GUI::Event
をModelとして提供し、新たに呼び出し時に注目しているWorldをEventのプロパティに含めるようにすることで、以下の問題の解決を図る。
- Commandのcondition呼び出し時と本体呼び出し時でCurrent Worldが異なる場合、conditionが成立しないときに本体を呼び出してしまう可能性がある
- 注目すべきWorldが通知されないために、ほとんどのCommandはCurrent Worldを参照している
Commandの呼び出し側が注目すべきWorldを指定する場合、呼び出し側がCurrent Worldを参照することになり、CommandがCurrent Worldに依存する必要が無くなる。
また、コマンドを呼び出すプラグインは Plugin::GUI::Event
のインスタンスを作る必要があるが、これをModelにすることで、GUIプラグインのモジュール空間に他のプラグインからアクセスするというダーティな方法を取らなくて良くなる。
opt.world
みたいに書いたら対象のWorldにアクセスできると良さそう
post_itイベントはpostboxの内容を投稿するが、postboxは常にcurrent worldに作用するようになっているので手を入れる必要がある。
また、対応していない、そもそもWorldを選ぶことに意味がないcommandについてもWorldの選択ウィジェットが表示されるので、対策する必要がある。
A) specファイルのバージョンを見る¶
commandを定義したプラグインがmikutter 3.9以上の場合だけWorldを選べるようにする。
ただし、この仕様にした場合は =opt.world= が存在しないバージョンならcurrent worldを使うといった実装ができなくなる(mikutter 3.9以上をspecファイルで要求すると、3.8以前ではプラグインがロードできなくなるため)。
B) world_filterオプション¶
今はすべてのWorldが選択肢として表示されているが、候補となるWorldをフィルタする条件をcommand DSLのオプションで指定する。
command(:post_it,
world_filter: ->w{ w.is_a? Plugin::Twitter::World },
Worldのリストに対してselect(&world_filter)し、残ったWorldをユーザに提示する。
ここに、 =:never= とか入れておくとそもそもWorldをキーコンフィグで設定できないようにすると良さそう。
また、conditionよりも高速であることが期待できるので、 =world_filter === world && condition === Event.new(...)= のような条件にすることもできそう。この挙動を前提にすると、プラグインがconditionにWorldの条件を書かなくて良くなる。
あっ =Plugin::Command::Condition= も =opt.world= みるようにしないと…
優先順位をつけてまとめる。
post_itイベントはpostboxの内容を投稿するが、postboxは常にcurrent worldに作用するようになっているので手を入れる必要がある。
done. pushした。
あっ Plugin::Command::Conditionも opt.world
みるようにしないと…
やらずに、今Plugin::Command::Conditionを使っている部分をその場で実装する形に置き換える。
まず、Plugin::Command::Conditionの実装を変更すると、 condition:
は opt.world
を見ているのにブロックは :world_current
を見ていることになるので、古いプラグインを使っているユーザにとっては混乱の元になる。
加えて、せっかくなのでPlugin::Command::Conditionをすべてdeprecateにする。
A) specファイルのバージョンを見る
一旦保留。やるかも
B) world_filterオプション
本来はspellが対応するWorldをふるいにかけるために定義してほしいが、特定のslugを持つWorldを指定するのが横行しそう(Twitter専用、とか)。
せいぜい5,6個しかないWorldを1,2個にできるメリットや、ほんの少しパフォーマンスが上がるかもしれない程度だと思うと、実はやらないほうがよいかもしれない。
他の形式にエクスポート: Atom
PDF