操作
バグ #830
完了User.new_ifnecessary がメインスレッド以外から呼ばれた時にクラッシュすることがある
プラグイン名:
ブランチ:
クラッシュする:
説明
#781 より
問題¶
source:core/user.rb では、 Retriever.new_ifnecessary を User.new_ifnecessary がオーバライドしていて、その中で User.findbyidname を呼んでいる。findbyidname はメインスレッドで呼ぶことはできないので、User.new_ifnecessaryがメインスレッドでは呼べないようになっている。
解決方法¶
User.new_ifnecessaryをやめる¶
そもそもRetriever.new_ifnecessaryは十分な機能をもっていて、Messageではオーバライドせずに使えている。こういうことをしているのはidnameでも引いてこれるようにしようとしているからだが、現状それは正しく動いていないので、他のRetriever同様、idのみでマッチングを行えば良い。
Retrieverの@storage相当のものをUserにもたせる¶
idnameで一意にUserのインスタンスが決まるのはUserだけなので、Retrieverがやっているのと全く同じようにインスタンス変数に保持する。
関連するチケット
toshi_a 初音 さんが8年以上前に更新
idnameだけでもUserを取得可能になっているのは、Twitter API v1の頃の検索APIが、userのscreen_nameだけを返し、idを返さない仕様になっていたため、screen_nameのみによるuserの推定が必要になったことが原因らしい。
現在では少なくとも標準プラグインではこの挙動を期待したコードは残っていないように見える。これを消したときのサードパーティプラグインの影響だけが気になるところ。
恐らく別のサービスに対応するプラグインくらいしかこのメソッドを利用しないと思うので、影響はないんじゃないかな(願望)
操作