マルチポストプラグインがportalに対応

mikutter マルチポストプラグイン - cobodoのブログ

GitHub - cobodo/mikutter-multiposter

portalを選択している場合、ダイアログを出さずにportalのPrimaryとSecondaryに投稿するコマンドを追加しました。

また、Secondaryのみに投稿するコマンドも追加しました。Alt+EnterでSecondaryに、Ctrl+Alt+Enterで両方に投稿するようにショートカットキーを設定すると、デフォルトのCtrl+Enterでの投稿と合わせて、わりと直感的に投稿先を切り替えられるようになります。

xkcdの画像をPhotoModelで開けるようにするプラグイン

  defimageopener('xkcd', %r<\Ahttps?://xkcd\.com/[0-9]+>) do |display_url|
    connection = HTTPClient.new
    page = connection.get_content(display_url)
    next nil if page.empty?
    doc = Nokogiri::HTML(page)
    result = doc.css('#comic > img').first
    src = result.attribute('srcset').to_s.split(' ').first
    if src.start_with?('//')
      src = Diva::URI.new(display_url).scheme + ':' + src
    end
    open(src)
  end

Worldon: Photo Modelを引数に取るcompose spellを追加

↓こういう話があったので

金具✅: &quot;確かに他のプラグインから使うことを考えるとphoto modelを受け取るcompose spel…&quot; - 金具 *1

↓こういったものを追加した。

具体的に何をしようとしているのかわからないけど、もしかしたら、Plugin::Worldon::API.call()の引数で直接PhotoModelを受け取りたいということなのかもしれない。

API.call()MikuTwitter::ApiCallSupportとは違い、httpclientの薄いラッパとして作っている*2*3。PhotoModelを受け取る場合、file_keysの処理を拡張するのがいいかもしれない。つまりパラメータに普通にPhotoModelのオブジェクトを入れてもらって、特別扱いする。

この❝特別扱い❞にはいくつかやり方が考えられる。

httpclientのドキュメントには、

When the given method is 'POST' and the given body contains a file as a value, it will be posted as a multipart/form-data. www.rubydoc.info

とあるので、Photo Modelが持っているキャッシュファイルが取り出せるなら、その方がよさそう。

実は'file'ではなくIOが要件であるなら、photo.blobStringIOか何かでwrapしてしまうという手もある。

httpclientで明示的にmultipart/form-dataを指定できるなら、それをやった上で、そのキーにphoto.blobを渡してやればよい。

今回のspellでは、core/plugin/libnotify/notify-send.rbで行われているように、mikutterのTMPDIRに一旦書き出してから渡すという方法をパクっとっている。これをAPI.call()側でやればいいじゃないか、とも思う。

別の話題として、Mastodonは4つまで画像を添付できるので、spellも複数のPhoto Modelを受け取れるべきかもしれない。しかし、spellの引数はmodel slugのみをSetに入れて比較するようなので、複数個指定しても1個のものと区別できない気がする。:photo_model_listみたいな名前のPhoto Modelを複数内包するモデルを作って、それを引数に取るとか、あるいはspellの判定の方を拡張してdefspellで[:photo]と渡されたら:photoArrayであると認識するようにするとか、そういうことがあるなら話は別だけど、いずれもコアプラグインの範疇なので、こちらだけで考えていても仕方ない。

適当に実装してしまったけど、Worldon内部では使わない機能なので、もうちょっと詳しく話を聞いたり仕様を考えたりした方がよかったかもしれない。

*1:なんか知らんけど弊インスタンスの埋め込み型のアレが動いていない。CSPを厳しくしすぎてる? タイトル記法で&quot;とか出てしまうのはMastodon側がおかしいっぽいけどこれも弊インスタンスだけのような気がする……

*2:元々はnet/httpを使っていたのでこの表現は多少問題がある。

*3:脚注の中でbackquote使えないんかい。脚注があるだけマシだけど。

imgur.com の画像をPhotoModelで開けるようにするプラグイン

Plugin.create(:imgur) do
  defimageopener('imgur', %r<\Ahttps?://imgur\.com/[a-zA-Z0-9]+>) do |display_url|
    connection = HTTPClient.new
    page = connection.get_content(display_url)
    next nil if page.empty?
    doc = Nokogiri::HTML(page)
    result = doc.css('link[rel="image_src"]').first
    open(result.attribute('href').to_s)
  end
end

WSLで通知を出すメモ

about_Execution_Policies

> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Feature Request: Desktop Notifications · Issue #2466 · Microsoft/WSL · GitHub

> Install-Module -Name BurntToast
$ powershell.exe -command New-BurntToastNotification -Text ふぁぼっ # Windowsから通知が出る

BurntToastのオプションを調べて core/plugin/libnotify/notify-send.rb を改造する。 GitHub - Windos/BurntToast: Module for creating and displaying Toast Notifications on Microsoft Windows 10.

worldonに非互換な変更

どうやらWorldクラスのslugはそのプラグインのslugと一致していなければならなかったらしく、その修正が入りました。

world slugはplugin slugと一致していなければならない · Issue #15 · cobodo/mikutter-worldon · GitHub

この影響で、現在のmasterは過去にmikutterへ登録したアカウント情報と互換性がなくなっており、プラグインを更新してからmikutterを起動すると、登録されていたアカウントが除去されます*1。この場合、再度mikutter上でアカウント登録してください。datasource slug等はそのままなので、抽出タブの再設定などは必要ありません。アカウントを登録し直すだけでOKのはずです。

今までも微妙に非互換な変更は入れていましたが、アカウントが消えるというのは大きいと思ったので、こういった大きな変更があった時はGitHub wikiに更新履歴を記録することにしました。

Home · cobodo/mikutter-worldon Wiki · GitHub

細かい変更までいちいち書くことはしないので、気になる場合はコミットログを参照してください。

このことで困る人は現状ではほとんどいないと思います。思います。