feat(plugins): ノート内の絵文字でリアクションする 2 プラグインを追加 - #41
Merged
Conversation
ノート本文と CW に写っている絵文字を拾い、同じ絵文字でリアクションする
note action を追加する。候補が複数あるときは Mk:confirm で 1 件ずつ
確認しながら選べる (プラグインからは選択 UI を出せないため)。
カスタム絵文字は Mk:api("emojis") の一覧と照合し、自鯖に存在する名前だけを
候補にする。:name@host: 表記でも同名が自鯖にあれば :name: に落として使う
(他鯖の絵文字はそのままリアクションに使えないため)。本家には CUSTOM_EMOJIS
変数があるが、NoteDeck に無いため両対応の emojis エンドポイントで取る。
Unicode 絵文字 (Twemoji) は to_unicode_codepoint_arr() でコードポイントに
分解し、書字素のまとまりとして切り出す。AiScript には正規表現も 16 進
リテラルも無いため、範囲は 10 進のテーブルで持ち、ZWJ 連結・肌の色・
VS16・囲みキーキャップ・地域表示記号の対 (国旗) を手で読み進める。
素の数字を 1️⃣ と誤検出しないよう、キーキャップは U+20E3 が続くときのみ
絵文字として扱う。
本家 Misskey Web との互換性:
- Mk:api は失敗時に throw せずエラー値を返すため、emojis / reactions.create
の戻り値を Core:type(res) == "error" でガードする。notes/reactions/create
は成功時 204 (= null) を返すので、既存プラグインの obj 判定では成功を
失敗と誤判定する
- 絵文字一覧が取れないときは警告を出して Unicode 絵文字だけで続行する
- permissions は本家の PermissionKey "write:reactions"、ダイアログ type は
本家 allowlist (info / warning / error) の範囲に収めた
- 多重リアクションは API エラーになるので、myReaction があれば何もせず終わる
aiscript 1.2.1 (本家 frontend と同一) + 本家セマンティクス (エラー値・204・
type allowlist・### metadata の default から組む Plugin:config) のハーネスで、
API 正常時と emojis / reactions.create 各失敗時の全パスを検証済み。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ノートに既に付いているリアクションと同じ絵文字で乗る note action を追加する。 リモートのカスタム絵文字 (:hoge@example.com:) はそのままではリアクションに 使えないため、自鯖に同名の絵文字があるときだけ :hoge: に読み替えて候補にする。 候補は付いている数の多い順で、同じ絵文字でリアクションするプラグインと同じく Mk:confirm で 1 件ずつ確認しながら選べる。 本家 Misskey はローカル絵文字のリアクションキーを :name@.: に正規化するため (ReactionService.convertLegacyReaction)、@ 以降を落として名前を取り出す。 その結果 :hoge@.: と :hoge@a.example: が同じ :hoge: に畳まれるので、 候補は 1 つにまとめて数を合算する。カスタム絵文字として読めないのに コロンを含むキーは壊れているとみなして捨てる。 本家 Misskey Web との互換性 (同じ絵文字でリアクションと同様): - Mk:api の戻り値を Core:type(res) == "error" でガードする (notes/reactions/create は成功時 204 = null なので obj 判定では弾けない) - 絵文字一覧が取れないときは警告を出して Unicode 絵文字だけで続行する - permissions は本家の PermissionKey "write:reactions"、ダイアログ type は 本家 allowlist の範囲に収めた - Unicode 絵文字しか付いていないノートでは emojis を叩かない aiscript 1.2.1 (本家 frontend と同一) + 本家セマンティクスのハーネスで、 :name@.: / :name@host: / Unicode / 壊れたキーの各入力と、API 正常時・ emojis 失敗時・reactions.create 失敗時の全パスを検証済み。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
misstore | f5be22d | Aug 12 2026, 04:32 AM |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (13)
📝 WalkthroughWalkthroughChangesThe registry now includes Emoji reaction plugins
Estimated code review effort: 4 (Complex) | ~45 minutes ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
種別
概要
ノートに写っている絵文字をそのままリアクションに使うプラグインを 2 つ追加します。
プラグインからは選択 UI を出せないため、どちらも候補を
Mk:confirmで 1 件ずつ確認しながら選ぶ形にしています。
same-emoji-react) — 本文と CW に含まれるカスタム絵文字 / Unicode 絵文字 (Twemoji) と同じ絵文字でリアクションする
reaction-piggyback) — 既に付いているリアクションに乗る。リモートのカスタム絵文字は自鯖に同名があれば読み替える
どちらもリモート絵文字はそのままリアクションに使えないため、
Mk:api("emojis")の一覧と照合して自鯖に存在する名前だけを候補にします。
絵文字の切り出し
AiScript には正規表現も 16 進リテラルも無いので、Unicode 絵文字は
to_unicode_codepoint_arr()でコードポイントに分解し、範囲を 10 進テーブルで持って書字素のまとまりを手で読み進めます (ZWJ 連結・肌の色・VS16・
囲みキーキャップ・地域表示記号の対)。素の数字を 1️⃣ と誤検出しないよう、
キーキャップは U+20E3 が続くときのみ絵文字として扱います。
相乗りのほうは、本家がローカル絵文字のリアクションキーを
:name@.:に正規化する (
ReactionService.convertLegacyReaction) ため@以降を落とし、結果として同じ
:hoge:に畳まれる候補は数を合算して 1 件にまとめます。チェックリスト(投稿者)
public/registry/<種別>/<id>/にディレクトリを作り、meta.json(skill は frontmatter)と主ソースを置いたmeta.idを書く場合、ディレクトリ名と完全一致させた(不一致は既存アイテム乗っ取りの温床として CI が reject します)meta.jsonにcreatedAt/updatedAtを書いていない(日付は git 履歴から自動採取されます)pnpm run registry:buildがローカルで成功する権限(plugin / widget / query のみ)
Mk:api("emojis", {})— 自鯖のカスタム絵文字一覧。候補が自鯖で使えるかの照合にのみ使うMk:api("notes/reactions/create", { noteId, reaction })— 選ばれた 1 件にリアクションするMk:dialog/Mk:confirm/Mk:toast— 候補の確認と結果表示permissionsはwrite:reactionsのみ。リアクションの作成に必要な最小権限で、投稿・フォロー・DM・削除は行いません。リアクションは必ず
ユーザーが
Mk:confirmで明示的に承認した 1 件だけを、1 回だけ作成します(承認が無ければ何もしません)。
本家 Misskey Web との互換性
本家のソースを読んで挙動を合わせ、既存プラグインにある誤りを 1 つ避けています。
Mk:apiは失敗時に throw せずvalues.ERROR('request_failed')を返すため、戻り値をガードする。ただし
notes/reactions/createは成功時 204 (=null) を返すので、既存プラグイン (pakuru) の
Core:type(res) == "obj"判定では成功を失敗と誤判定する。本 PR では
Core:type(res) == "error"で判定するtypeは本家の allowlist (info / warning / error) の範囲に収めたpermissionsは本家の PermissionKeywrite:reactionsCUSTOM_EMOJIS変数があるが NoteDeck に無いため、両対応のemojisエンドポイントで取得するmyReactionがあれば何もせず終わる検証
本家 frontend と同じ
@syuilo/aiscript@1.2.1に、本家セマンティクス(エラー値・204・ダイアログ type allowlist・
### metadataのdefaultから組むPlugin:config) を再現したモック env を渡すハーネスで、両プラグイン計 36 ケースを実行して全通しを確認しました。
:name@host:/:name@.:/ Unicode 絵文字 (ZWJ 連結・国旗・キーキャップ・肌の色・VS16) / 壊れたリアクションキー / 本文空 /
reactionsキー欠落 / リアクション済みemojis失敗時、notes/reactions/create失敗時の全パス実サーバーでの実機確認は行っていません(ソース読解 + AiScript 実行での検証まで)。
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Registry Updates