Project

General

Profile

Actions

機能 #1200

closed

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

Added by toshi_a 初音 over 6 years ago. Updated over 5 years ago.

Status:
終了
Priority:
通常
Target version:
Start date:
2018-04-05
Due date:
% Done:

0%

プラグイン名:

Description

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

Actions #1

Updated by toshi_a 初音 almost 6 years ago

  • Target version changed from 3.7 to 3.9

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

Actions #2

Updated by toshi_a 初音 over 5 years ago

  • Status changed from 新規 to 実装待ち

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

Actions #3

Updated by toshi_a 初音 over 5 years ago

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

Actions #4

Updated by toshi_a 初音 over 5 years ago

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

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

Actions #5

Updated by toshi_a 初音 over 5 years ago

  • Status changed from 実装待ち to 終了

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

Actions

Also available in: Atom PDF