mikutter_justsize プラグインが mikutter 3.7.2対応

remain_charcount spellの導入にともない、起動できなくなっていたので修正しました。

また、Twitterが行っているURLの文字数緩和を中途半端に入れているのが不自然だったため撤廃しました。これからは純粋に(Rubyにおける)文字数をカウントして表示します。

twemojiプラグインの対応emoji大幅追加

どうも参照していたtwemojiのバージョンが古く*1、最近のemojiに対応できていなかったようなんですね。

でもtwemojiの正規表現サロゲートペアを復元しながらまたコンバートするのは面倒だったので、今回はFull Emoji List, v11.0https://unicode.org/Public/emoji/11.0/emoji-variation-sequences.txtから自力で正規表現を組むことにしました。

そんなわけでZWJを使った複合emojiや、:thinking_face:のような最近の顔文字も表示できるようになりました。

*1:READMEをちゃんと読めという話

投稿する時のキーによって投稿先を切り替える

例として以下のような挙動を実現する方法を紹介します。

これ以外にも、slackなど任意のWorldを組み合わせることができます。また、Mastodonプラグインとして必ずしもWorldonを使う必要はありません。World対応のプラグインであれば何でもOKです。

手順

  1. あらかじめTwitterアカウントとMastodonアカウントを追加しておきます。
  2. portalプラグインをインストールします。
  3. multiposterプラグインをインストールします。
  4. アカウントを追加する時に"Portal"が選択できるようになっているので、追加します。Primary WorldをMastodonアカウントに、Secondary WorldをTwitterアカウントに設定します。名前は何でもいいのですが、空欄のままはNGです。
  5. 設定>ショートカットキーから「追加」します。"postbox"を展開すると"Secondary Worldにポストする(Portal)"というコマンドがあります。これを選択して、キーバインドAlt+Enterを設定して「OK」します。
  6. 更に「追加」で、"postbox>マルチポストする(Portal)"を選択肢、キーバインドCtrl+Alt+Enterを設定します。

デフォルトでは「投稿する」がCtrl+Enterになっていると思いますので、これで3つのキーバインドができました。

注意しなければならないのは、追加したAlt+EnterCtrl+Alt+Enterでは返信ツリーを繋ぐ形での返信はできない、ということです。返信する際は、Ctrl+Enterを使えば、返信先がMastodonのTootならMastodonアカウントが、TwitterTweetならTwitterアカウントが、自動的に選択されます。

twitter-cardプラグイン

TL;DR

というプラグインを書いたけど、Twitter側はまだいいとして、Worldonと組み合わせてしまうとあまり使い物にはならないね、というだけの話です。

以下、主にプラグイン開発者向けの話。

mikutterにおける引用

↑でも少し触れましたが、mikutter 3.7では引用の処理の仕方が変わったのです。

3.6までは、カスタムModelquoting_messagesというメソッドを定義して、カスタムModelのArrayを返してやれば、それを引用として表示する、というものでした。

この仕様では、自分が書いたプラグインにいろいろ対応させることはできます。実際、WorldonではtweetのURLには特別に対応し、tootの中にtweetのURLが引用されていれば、それを返すようにしていました。そのため、tweetのURLがmastodonで流れてきていれば、それを引用として表示することができていました。

ところが、「自分が書いたプラグインのモデルを、他のプラグインに引用させる」ことはできないのです*1TwitterプラグインのカスタムModelであるPlugin::Twitter::Messageというモデルはquoting_messagesメソッドを実装していましたが、Worldonや、そのカスタムModelであるPlugin::Worldon::Statusというモデルのことは知らないので、Plugin::Twitter::Message#quoting_messagesPlugin::Worldon::Statusを返すことは無いわけです。

西端の放送局、brsywe--mikutterの薄い本制作委員会から参照できる「mikutterの薄い本vol.11」には、intentという機能が紹介されていますが、p.21にhandleというものについて触れられています。これを使うと、URLとカスタムModelを結びつけることができます。

mikutter 3.7では、このhandleで定義されるURLとカスタムModelの紐づけを通じて、引用対象を取得するようになりました。 Plugin::Twitter::Messageには、最初からhandleが定義されていますから、Toot内のTweetは(URLだけ正しくScoreに入れておけば)自動的に引用されるわけです。

Plugin::Worldon::Statusについては、handleを追加する更新を行いました。これにより、Tweet内のTootについても、引用表示されるようになっています。イタコ芸が捗りますね!

これは単にTwitter-Mastodon間の話ではなく、他のあらゆるカスタムModelで、handleを定義して、timeline: trueにしておけば、引用・被引用が自在になるのです。

そういうわけで

被引用だけがされるモデルを作るなら簡単だろう、という目論見で作ったのが冒頭で紹介したtwitter-cardプラグインです。これは、あらゆるURLに反応し、もしそのURLがOpenGraphProtocolやTwitterCardといったメタ情報の提供規格に沿っていれば、それを引用できるようにカスタムModelとして返す、というものです。

TwitterMastodonに限らず、(マイクロ)ブログサービスでURLを貼り付けるのは日常茶飯事です。こういったものが多少詳しめに表示されれば、TwitterCardと同様の恩恵を得ることができます。

だが、幸せは長くは続かなかった……

ところでmastodonもOGPに対応しています。つまり、mastodonのユーザーページや単独Tootのページ、ハッシュタグ検索用のURLなどからHTMLを取得すると、OGPの情報が取得できるので、つまりtwitter-cardプラグインのモデルが取得され、それが引用されます。

これが本当に鬱陶しく、特に、リプライ時にいちいち相手のアカウント情報が出たり、ハッシュタグを複数並べるような場合(特にpawooで絵を上げる場合などによくある)、それぞれのハッシュタグごとにコレが出てしまうわけです。しかも大した情報があるわけでもない。これは厳しい。

Twitter側と同様に、timeline: falseなHashTagのようなモデルを作って返せばいい、はずなのですが、別の問題(https://dev.mikutter.hachune.net/issues/1226)があり、一筋縄ではいかないようです。

*1:もちろんモンキーパッチすればできましたが、Worldonではそれはやりませんでした。

mikutter 3.7とWorldon

出ましたね。いくつか新機能を提案したり実装したりして取り入れてもらえたので、僕としてもうれしいです。

Worldonの方も、developブランチでセコセコ作ってた3.7対応系の機能をmasterに入れました。

今日からは3.7以降でしか動きませんので、注意してください。

カスタム絵文字が出たり、Tweet内のToot URL引用が"ナウい引用"形式で表示されたりする*1のが新しいところだと思います。

*1:逆の、「Toot内のTweet」が表示されるのはできていましたが、Tweet内のTootの表示には、Scoreと、本体付属のsub-parts-quoteの改良が必要でした。

mikutter twemojiプラグイン

mikutterの次期バージョンとなる3.7で追加される新機能、scoreを利用したプラグインを書いてみました。

scoreはオープンソースカンファレンス2018 Nagoya - イベント案内 | 2018-05-19 (土): mikutter 3.7で紹介されるのではないかと思いますので、ここで詳しく書くのはやめておきます。

今までのmikutterではemoji対応のフォントを入れていても

f:id:cobodo:20180427000036p:plain

このような感じだった*1ところ、

f:id:cobodo:20180427000132p:plain

このようにtwemojiを使った表示にすることができます。

twemojiが対応していれば、通常のフォントには含まれていないものも表示することができます。

f:id:cobodo:20180427000309p:plain

楽しみですね!

*1:カラー絵文字を出す方法はあるんでしょうか? 僕は知らないんですが……