提案 #1309
未完了汎用load more機能
説明
背景¶
mikutter標準プラグインにはload more機能は無いものの、従来よりその必要性は主張されており、サードパーティプラグインとして開発された り、そちらがメンテナンスされなくなったらforkされて修正が行われた りしてきた、という経過をたどっている。
しかしながら、先述のプラグインではtwitterの特定タイムラインの更新のみに留まっており、抽出タブの遡りや、Worldプラグインの追加を経て広がりを見せている、twitter以外のサービスに対するサードパーティプラグインの遡りに適するものではなかった。
このチケットでは、:gui
プラグインのTimelineが持つDiva::Model
の集合を基礎にした汎用のload more機構である:load_more_timeline
プラグインを提案する。更に、:load_more
プラグインを:load_more_timeline
プラグインに依存する形で(簡易的に)移植した:twitter_load_more
プラグイン、及び、抽出タブの遡り機構である:extract_load_more
プラグインを併せて提案する。また、これらの実装に必要な:gui
プラグインや:gtk
プラグインの拡張を含む。
プラグインの説明¶
:load_more_timeline
¶
:load_more_timeline
イベントと、それを発火するコマンドを定義する。コマンドは:timeline
roleで、起動に使われたTimeline slugがイベントに渡される。遡りを実装するプラグインは、on_load_more_timeline
を実装し、引数のTimleine slugが自プラグインで対応可能だと判断すれば、timeline
DSLを用いてPlugin::GUI::Timeline
のインスタンスを取得して、遡り取得したメッセージを追加できる。このとき、必要に応じてtimeline_max
を拡張するようにすべきである(後述)。
:twitter_load_more
¶
Twitterのタイムラインを遡るプラグイン。:load_more_timeline
イベントに対するハンドラの実装例でもある。
ほとんどの部分は:load_more
プラグインから持ってきている。ただしUserConfig
の類は一旦即値にしてある。
現在不要になっていると思われる部分を削除し、代わりにlistを追加してある。
:extract_load_more
¶
抽出タブの遡り機能を実装する。
抽出タブへのメッセージ追加は:extract_receive_message
イベントによってdatasourceを通じて行われるため、遡りもdatasource経由で、:extract_receive_message
と似たような形式で行えることが望ましい。
そこで、:load_more_timeline
がTimeline slugを引数として渡すのと同様に、datasourceを引数として渡す:extract_load_more_datasource
イベントを定義する。とはいえ、抽出タブに設定されたdatasourceのうち、それぞれの最古のメッセージをTimelineから判定することはできないため、このプラグイン内にHashを持っておき、各datasourceの最古のメッセージも同時にイベントに渡す。また、同じdatasourceを使用する別のタイムラインへの影響を避けるため、Timeline slugも引き回す。
on_extract_load_more_datasource
ではメッセージを取得し、:extract_load_more_messages
イベントで取得したメッセージをdatasourceに追加する。通常の:extract_receive_message
と異なるのは、特定のタイムラインのみに流すためのTimeline slugを受け取ることと、メッセージ数に応じてtimeline_max
を拡大する点。
:gui
, :gtk
¶
現状ではtimeline_maxはGtk::TimeLine
が持っており、:gui
プラグインからは触れないため、アクセサ用のフィルタイベントを:gui
プラグインで定義してPlugin::GUI::Timeline
にメソッドを追加し、:gtk
プラグイン側で実装する。
また、タイムラインが持つメッセージをeach
で処理することもGtk::TimeLine
にしかできないため、このためのフィルタイベントを定義してメソッドを追加し、:gtk
プラグイン側で実装する。ついでなので、利便性のためにinclude Enumerable
もしておく。
他に、:extract_load_more
ではdatasourceごとの最古メッセージを管理する必要があるため、タイムラインからのメッセージ除去時に発生するイベントを新たに追加した。
課題¶
retweetが含まれる場合の挙動が非直感的¶
他の多くのtwitterクライアントとは異なり、retweetを受信した際の挙動がコピーではなくageである以上、仕方ないかもしれない。
timeline_max
が増加した後減らない¶
https://gist.github.com/cobodo/177a59544b5ed9b3d480b4c374014fea のようにスクロール位置で判定して、条件を満たしたら適当に減らしていく方法が考えられるが、他にもアルゴリズムはありうるだろう。
遡り可能かどうか判定する手段が未実装¶
フィルタを追加して、:load_more_timeline
イベントと同様に、各プラグインに表明させる方法が考えられる。
:twitter_load_more
の完成度が低い¶
:load_more
プラグインに元々存在した設定項目の検討が必要¶
補足¶
Mastodonでのテスト¶
Worldonのload_more
ブランチを使えば、Mastodonでも機能の確認ができる。
本体へ導入する必要性¶
実はそれほどない。各プラグインはサードパーティプラグインとして動作可能で、:gui
および:gtk
プラグインと、mui
へのモンキーパッチを入れればよい。
ただ、Plugin::GUI::Timeline
から(:gtk
プラグインに依存せずに)timeline_max
を操作したり、メッセージをeach
したり、あるいはタイムラインからのメッセージ削除時にイベントを発生させたりする、という部分に関しては比較的汎用性がありそうだ。
パッチの分割と依存性¶
このパッチはいくつかのパートに分けられる。
:gui
、:gtk
のAPI拡張
先述の通り、汎用性がありそうに思われる。このパッチ内には依存する機能はなく、単独で導入できる。
:load_more_timeline
:extract_load_more
と:twitter_load_more
に依存される。これ単独でも、Worldonのプロフィールタイムラインの遡りはできる。
:gui
のみに依存しているので、:gtk
以外の:gui
実装を足したくなったとしても、追加されたAPIに対応されていれば問題ない。
:extract_load_more
:gui
と:load_more_timeline
、および標準の:extract
に依存する。ここまでを導入すれば、twitter以外の遡りには支障ない。
:twitter_load_more
多くのプラグインに依存。
どこまで対応するか、であるとか、テストするときにいちいちRate Limitに引っかかって面倒すぎる、とか、そういうことがあり、かなり未完成。
ファイル