プロジェクト

全般

プロフィール

提案 #1309

未完了

汎用load more機能

cob odo さんが約5年前に追加. ほぼ5年前に更新.

ステータス:
分類待ち
優先度:
通常
担当者:
-
対象バージョン:
-
プラグイン名:
ブランチ:

説明

背景

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に引っかかって面倒すぎる、とか、そういうことがあり、かなり未完成。


ファイル

cob odo さんが約5年前に更新

  • トラッカー機能 から 提案 に変更
  • ステータス新規 から 分類待ち に変更
  • 開始日 を削除 (2018-12-31)

cob odo さんがほぼ5年前に更新

twitterのユーザーTLの遡りに不具合があったので修正パッチを上げます。

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