バグ #1082
未完了ダイレクトメッセージを受信した時のシステムメッセージで送受信者アカウントがリンクになっていない
説明
ホームタイムラインでダイレクトメッセージに気づいた時に、「システムメッセージ内のアカウント名をクリックしてユーザータブを開く」→「ダイレクトメッセージタブを開く」操作ができるとやり取りの開始がスムーズかなと思いました(というのを昔に話してチケットに起こすのを忘れたままこんにちに至ってました)。
雑に試した感じ、core/system/message.rbにentity_class Retriever::Entity::ExtendedTwitterEntityを足すと少なくともTwitterアカウントにリンクが着いてやりたいことをやってくれるようでした。
ただ、日本語ハッシュタグだけリンクしてくれないようでした(そこは追っていない)。
diff --git a/core/system/message.rb b/core/system/message.rb index 26c8aadb..2a90dc9e 100644 --- a/core/system/message.rb +++ b/core/system/message.rb @@ -17,6 +17,7 @@ class Mikutter::System::Message < Retriever::Model field.time :modified entity_class Retriever::Entity::URLEntity + entity_class Retriever::Entity::ExtendedTwitterEntity def initialize(value) value[:user] ||= Mikutter::System::User.system
システムメッセージ。日本語ハッシュタグだけリンクされないですが、こういう感じのが欲しいです。
ユーザーのダイレクトメッセージタブで見ると日本語ハッシュタグもリンクされていました。
(ツイッターに投げた同じ内容: https://twitter.com/Akkiesoft/status/929724761420152833 )
ファイル
toshi_a 初音 さんが約7年前に更新
- トラッカー を 機能 から バグ に変更
- 題名 を ダイレクトメッセージを受信した時のシステムメッセージで送受信者アカウントのリンクが欲しい から ダイレクトメッセージを受信した時のシステムメッセージで送受信者アカウントがリンクになっていない に変更
- 開始日 を削除 (
2017-11-12)
これはちょっと難しい問題ですね。
想定外の振る舞いをしているので、バグとして扱います。3.5で対応できるかはわかりませんが。
最終的には、こんな風にスクリーンネームからユーザを開けるようになっているべきです。それを想定して「@<screen name>」の形式で差出人などを本文に書いていました。
mikutter 3.5からは、ActivityやシステムメッセージはTwitter以外の情報も扱うため、TwitterEntityを使わなくなり、「@<screen name>」でTwitterユーザにリンクする機能が失われ、この不具合が発生しています。
Activityタブでやっている対策¶
Activityタブでは、関連ModelとしてDMを受け取ったユーザや送ったユーザのUserオブジェクトが表示されるようになっていて、それをダブルクリックするとそのModelに対してIntentが発行されるため、ユーザのプロフィールを開くといったことが可能です。どのようなModelでも格納できるため、Twitterに依存しません。
Twitterに依存しない安直な対応方法¶
ドメインに依存しない、Modelのパーマリンクで宛先や受取人を書くべきでしょう。具体的には
差出人: https://twitter.com/Akkiesoft 宛先: https://twitter.com/Akkiesoft (本文)
のように表記するということです。こうすれば見た目はともかく、今の実装でもクリックしたらユーザのプロフィールが開きます。
発展的な対応案¶
URLが表示しておしまいというのは、mikutter 3.4以前でできていたことができなくなっているので、対応としては雑だと思います。「@<screen name>」形式でリンクにするための方法を考えるべきなので、思いついたものをメモしておきます。
Entity¶
#1072 で提案しているようなEntityModelを作ると、システムメッセージの特定の位置にリンクを貼るみたいなことができるようになりそうです。ExtendedTweetEntityは、特定の正規表現などにマッチする文字列の範囲を別のModel(URI)にリンクするものですが、「n文字目からm文字目は https://twitter.com/Akkiesoft
にリンクされている」といった指定をMessage(通知)毎に設定してやることは可能です。
Entityには、タイムライン上でリンク文字列とリンク先を分けて設定するような機能があります(twitter.comをクリックした時に開くURLを https://t.co/...
みたいなのにするとか)。
利点¶
- 通知を発生させる側のプラグインが、任意の場所にリンクを挿入することができる
欠点¶
- Entity Modelにどのようなデータを渡すかはまだ決まっていないが、恐らく面倒になる
- activityメソッドはかなり単純に通知を発生させられるのが良いのに、それをスポイルしてしまいかねない
デフォルトのModel Face¶
mikutterは基本パワーユーザが使うので、URLはURLとして見えているべきだと思いますが、それがTwitterユーザのURLで、クリックしてもそのアカウントのプロフィールが表示されるものであれば、URLを表示する必要は無さそうです。
具体的には、Activityのdescriptionには「https://twitter.com/Akkiesoft
」と書いてしまって、Miralce PainterがTLにツイートを表示する時に、「@Akkiesoft」に変換するということです。
利点¶
- 通知を発生させるプラグインは、URIを埋め込めば良いだけなので、Entityを設定しなくて良くて楽
- 各Modelのラベルをどういったものにするかは、Modelを提供するプラグインが決めることになる
- Activity以外の全てのTLに表示されるModelに適用できる
- たとえば、Slack Modelなどで「
https://twitter.com/Akkiesoft
」というURLが含まれている場合でも、「@Akkiesoft」のような、Twitterの場合と同じ人間に理解しやすいテキストを表示できる
- たとえば、Slack Modelなどで「
欠点¶
- Activity以外の全てのTLに表示されるModelに影響してしまう
- Slack Modelの文脈で「@Akkiesoft」と表示されていて、それがTwitterにリンクされるというのは直感的ではない
- 見分けがつくように「@Akkiesoft@twitter」などとすると、多くの自明なケースでうっとおしい
- 柔軟性がない
- 「くわしくはこちら を御覧ください」みたいな、文字列と明らかに関係のないURLへのリンクが出来ない