プロジェクト

全般

プロフィール

機能 #1200

完了

mikutter CommandのEventオブジェクトにWorldなどをもたせる

toshi_a 初音 さんが約6年前に追加. 5年以上前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2018-04-05
期日:
進捗率:

0%

プラグイン名:

説明

現在、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プラグインのモジュール空間に他のプラグインからアクセスするというダーティな方法を取らなくて良くなる。

toshi_a 初音 さんが5年以上前に更新

  • 対象バージョン3.7 から 3.9 に変更

opt.world みたいに書いたら対象のWorldにアクセスできると良さそう

toshi_a 初音 さんが5年以上前に更新

  • ステータス新規 から 実装待ち に変更

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の条件を書かなくて良くなる。

toshi_a 初音 さんが5年以上前に更新

あっ =Plugin::Command::Condition= も =opt.world= みるようにしないと…

toshi_a 初音 さんが5年以上前に更新

優先順位をつけてまとめる。

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個にできるメリットや、ほんの少しパフォーマンスが上がるかもしれない程度だと思うと、実はやらないほうがよいかもしれない。

toshi_a 初音 さんが5年以上前に更新

  • ステータス実装待ち から 終了 に変更

多分動くと思うからmergeした

他の形式にエクスポート: Atom PDF