Misskey Remote Renote Plugin

# Misskey Remote Renote Plugin
## 注意事項
:::note warn
アクセストークンを利用する関係上、最悪の場合に他人に好き勝手にノートされる可能性があります。そのような場合は、アクセストークンを削除しましょう。
また、このプラグインの使用を一切合切やめる場合もアクセストークンを削除しましょう。使用されていないアクセストークンを放置するのは悪用の危険性があります。
:::

## これは何？
これはMisskey系サーバーでのサーバーを跨いだリノートを容易にするプラグインです。
Misskey系サーバーでリノートをするためには、「ノートURLの取得→照会→リノート」のようにページを跨いだ操作が必要になります。
このような不便を解消する目的で作成されました。

## コード
各々のバージョンにあったものを選択してください。
AiScriptのバージョンなんかはコンソールで`<: Core:v`することで確認できます。

<details>
<summary>@ 0.16.0(新しいバージョン)</summary>

```aiscript
/// @ 0.16.0
### {
    name: "Misskey Remote Renote"
    id: "9ca5b819-3769-4a5e-ab2c-604cfcc1f93c"
    version: "1.0.0"
    author: "@yamada_20020924@voskey.icalo.net"
    description: "MisskeyのRemoteRenoteを実現するプラグイン"
    permissions: []
    config: {
        targetServers: {
            type: "string"
            label: "targets"
            description: "host: リノートしたいサーバー、token: アクセストークン。JSON形式で記述"
            default: '[{"host": "https://misskey.io/", "token": ""}]'
        }
    }
}

@showError(error){
    if (error.info.code=="RATE_LIMIT_EXCEEDED") {
        Mk:dialog("リノートしすぎ" "しばらく時間をおいてください。")
    }
    elif (error.info.code=="AUTHENTICATION_FAILED") {
        Mk:dialog("アクセストークンエラー" "アクセストークンに誤りがあるか、あるいは権限が適切ではありません。")
    }
    elif (error.info.code=="INTERNAL_ERROR") {
        Mk:dialog("内部エラー" "連合オフなどによってアクセスできていない可能性があります。")
    }
    else {
        Mk:dialog("原因不明！" "とりあえずエラーコードを添えて @yamada_20020924@voskey.icalo.net に連絡して！")
        Mk:dialog(error.name Json:stringify(error.info))
    }
}

@remoteRenote(note, pair){
    //照会
    let noteData = Mk:apiExternal(pair.host "ap/show" {uri: `{SERVER_URL}/notes/{note.id}`} pair.token)
    if (Core:type(noteData)=="error") {
        showError(noteData)
    }
    else {
        //リノート
        let result = Mk:apiExternal(pair.host "notes/create" {renoteId: noteData.object.id} pair.token)
        if (Core:type(result)=="error") {
            showError(result)
        }
        else {
            Mk:dialog("完了通知" "リノートに成功しました。")
        }
    }
}

let targetServers = Json:parse(Plugin:config.targetServers)
each let pair targetServers {
    Plugin:register_note_action(`Renote to {pair.host}` @(note){remoteRenote(note, pair)})
}
```

</details>

<details>
<summary>@ 0.13.0(古いバージョン向け)</summary>

```aiscript
/// @ 0.13.0
### {
    name: "Misskey Remote Renote"
    id: "9ca5b819-3769-4a5e-ab2c-604cfcc1f93c"
    version: "1.0.0"
    author: "@yamada_20020924@voskey.icalo.net"
    description: "MisskeyのRemoteRenoteを実現するプラグイン(AiScriptが古い鯖向け)"
    permissions: []
    config: {
        targetServers: {
            type: "string"
            label: "targets"
            description: "host: リノートしたいサーバー、token: アクセストークン。JSON形式で記述"
            default: '[{"host": "https://misskey.io/", "token": ""}]'
        }
    }
}

let SERVER_URL = Mk:api("meta" {}).uri

@showError(error){
    if (error.info.code=="RATE_LIMIT_EXCEEDED") {
        Mk:dialog("リノートしすぎ" "しばらく時間をおいてください。")
    }
    elif (error.info.code=="AUTHENTICATION_FAILED") {
        Mk:dialog("アクセストークンエラー" "アクセストークンに誤りがあるか、あるいは権限が適切ではありません。")
    }
    elif (error.info.code=="INTERNAL_ERROR") {
        Mk:dialog("内部エラー" "連合オフなどによってアクセスできていない可能性があります。")
    }
    else {
        Mk:dialog("原因不明！" "とりあえずエラーコードを添えて @yamada_20020924@voskey.icalo.net に連絡して！")
        Mk:dialog(error.name Json:stringify(error.info))
    }
}

@remoteRenote(note, pair){
    //照会
    let noteData = Mk:api(`{pair.host}api/ap/show` {uri: `{SERVER_URL}/notes/{note.id}`} pair.token)
    if (Core:type(noteData)=="error") {
        showError(noteData)
    }
    else {
        //リノート
        let result = Mk:api(`{pair.host}api/notes/create` {renoteId: noteData.object.id} pair.token)
        if (Core:type(result)=="error") {
            showError(result)
        }
        else {
            Mk:dialog("完了通知" "リノートに成功しました。")
        }
    }
}

let targetServers = Json:parse(Plugin:config.targetServers)
each let pair targetServers {
    Plugin:register_note_action(`Renote to {pair.host}` @(note){remoteRenote(note, pair)})
}
```

</details>

<details>
<summary>@ 0.11.0(Firefish向け)</summary>

```aiscript
/// @ 0.11.0
### {
    name: "Misskey Remote Renote"
    id: "9ca5b819-3769-4a5e-ab2c-604cfcc1f93c"
    version: "1.0.1"
    author: "@yamada_20020924@voskey.icalo.net"
    description: "MisskeyのRemoteRenoteを実現するプラグイン"
    permissions: []
    config: {
        targetServers: {
            type: "string"
            label: "targets"
            description: "host: リノートしたいサーバー、token: アクセストークン。JSON形式で記述"
            default: "[{\"host\": \"https://misskey.io/\", \"token\": \"\"}]"
        }
    }
}

#metaData = Mk:api("meta" {})
#SERVER_URL = metaData.uri

@remoteRenote(note, pair){
    #noteData = Mk:api(`{pair.host}api/ap/show` {uri: `{SERVER_URL}/notes/{note.id}`} pair.token)
    ? (Core:type(noteData)="error") {
        Mk:dialog(_ "error")
    }
    . {
        #result = Mk:api(`{pair.host}api/notes/create` {renoteId: noteData.object.id} pair.token)
        ? (Core:type(result)="error") {
            Mk:dialog(_ "error")
        }
        . {
            Mk:dialog("完了通知" "リノートに成功しました。")
        }
    }
}

#targetServers = Json:parse(Plugin:config.targetServers)
~~ #pair targetServers {
    Plugin:register_note_action(`Renote to {pair.host}` @(note){remoteRenote(note, pair)})
}
```

</details>

## 使い方
### プラグインを導入する
プラグインの導入は以下の手順で行います。

1. 「設定」を開く。
2. "クライアント設定"の項目にある「プラグイン」を開く。
3. 「プラグインをインストール」を開く。
4. 上記のコードをコピーアンドペーストして、「インストール」を押す。

以上で完了です。

### サーバーとアクセストークンを設定する
:::note alert
アクセストークンは絶対に他人に公開しないでください。
:::
プラグインの「管理」に"Misskey Remote Renote"という名前でプラグインが追加されていると思います。
そのプラグインの 「設定」を押すと、targetsという名前のテキスト入力欄が出現すると思います。
ここで、リノートしたいサーバーとアクセストークンを設定していきます。
```json
[{"host": "https://misskey.io/", "token": "BU8BUI3uuiIUu8UBisctykK2boOI3bui"}, {"host": "https://misskey.backspace.fm/", "token": "cbiuIU9UBIbde8bjBIV9gdbIbijbdei7"}]
```
このようにJSON形式でサーバーを設定していきます。

#### アクセストークンを生成する
先ほど指定したサーバーに対して、リノートを行うためにはトークンを設定する必要があります。
プラグインの導入は以下の手順で行います。

1. 「設定」を開く。
2. "その他の設定"の項目にある「API」を開く。
3. 「アクセストークンの発行」を開く。
4. 名前を「Misskey Remote Renote Token」に設定する。
5. 「ノートを作成・削除する」を有効にする。
6. ✅を押す。
7. 確認コードが表示されるので、それを以下のように設定する。

```json
[{"host": "https://misskey.io/", "token": "BU8BUI3uuiIUu8UBisctykK2boOI3bui"}, {"host": "https://misskey.backspace.fm/", "token": "cbiuIU9UBIbde8bjBIV9gdbIbijbdei7"}]
```

### リノートする
リノートしたいノート下部の3点リーダー（…）をクリック、通報の下にRenote to ~~みたいなのが出るので、それを押すと、「完了通知」がくるか、それ以外のダイアログが出るはずです。

## FAQ
### うんともすんとも言わない
以下の要因が考えられます。
- apiExternalが使えるバージョンではない。
  →`@ 0.13.0`のものを使いましょう。
- JSONの形式が間違っている
  →直しましょう。

### MisskeyからFirefishでのRNの呼び出しはできる？
Misskey APIを使っている場合はできると思います。

### Firefishでも使える？
Firefish同士だとうまく行ったりしますが、Misskeyとだとうまくいかなかったりします。