プロジェクト

全般

プロフィール

バグ #1082

ダイレクトメッセージを受信した時のシステムメッセージで送受信者アカウントがリンクになっていない

Akira Ouchi5ヶ月前に追加. 5ヶ月前に更新.

ステータス:
新規
優先度:
低め
担当者:
-
対象バージョン:
プラグイン名:
ブランチ:
クラッシュする:
いいえ

説明

ホームタイムラインでダイレクトメッセージに気づいた時に、「システムメッセージ内のアカウント名をクリックしてユーザータブを開く」→「ダイレクトメッセージタブを開く」操作ができるとやり取りの開始がスムーズかなと思いました(というのを昔に話してチケットに起こすのを忘れたままこんにちに至ってました)。

雑に試した感じ、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 )

sysmsg.png (16.8 KB) sysmsg.png Akira Ouchi, 2017-11-13 00:08
usertab-dm.png (13.8 KB) usertab-dm.png Akira Ouchi, 2017-11-13 00:08

履歴

#1 toshi_a 初音5ヶ月前に更新

  • トラッカー機能 から バグ に変更
  • 題名ダイレクトメッセージを受信した時のシステムメッセージで送受信者アカウントのリンクが欲しい から ダイレクトメッセージを受信した時のシステムメッセージで送受信者アカウントがリンクになっていない に変更
  • 開始日 を削除 (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の場合と同じ人間に理解しやすいテキストを表示できる

欠点

  • Activity以外の全てのTLに表示されるModelに影響してしまう
    • Slack Modelの文脈で「@Akkiesoft」と表示されていて、それがTwitterにリンクされるというのは直感的ではない
    • 見分けがつくように「@Akkiesoft@twitter」などとすると、多くの自明なケースでうっとおしい
  • 柔軟性がない
    • 「くわしくはこちら を御覧ください」みたいな、文字列と明らかに関係のないURLへのリンクが出来ない

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