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

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

金具✅: "確かに他のプラグインから使うことを考えるとphoto modelを受け取るcompose spel…" - 金具 *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を厳しくしすぎてる? タイトル記法で"とか出てしまうのはMastodon側がおかしいっぽいけどこれも弊インスタンスだけのような気がする……

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

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