GitHub Pagesを使ってMisskeyのPluginやThemeを配布する

# はじめに
想定する読者層

* GitHub/GitHub Pagesを使える
* Misskey Plugin/Themeを作ったことがある
* Misskey Plugin/Themeの配布を検討している
* 自分でサーバーを持つ気がない

https://misskey-hub.net/ja/docs/for-developers/publish-on-your-website/

https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages

# メリット
まず初めに、この手法を使った場合のメリットを明らかにしていきます。

**製作者のメリット**
1. サーバーを自分で用意する必要がない
1. 専門的な知識がそれほど必要ない
1. 無料

**ユーザーのメリット**
1. インストールが簡単になる

# 手順
## 前提
以下の環境が整っていることを前提とします。

* GitHubアカウントを持っている
* Misskey PluginまたはThemeの**ソースファイル**がある
* 改行コードが`LF`(`\n`)である

また、以下の環境があることを推奨します。

* パソコンからもろもろの作業ができる

ただ、一応スマホからでもできないことはないと思います。

## ソースファイルからhash値の計算
ソースファイルのハッシュ値を計算しましょう。`sha512sum`コマンドであればターミナルからhash値を計算できます。
```
$ sha512sum {FILE_NAME}
{HASH}  {FILE_NAME}
```
コマンドを実行した結果はhash値と入力したファイル名が出力されます。
ここで出力されたhash値はファイルの整合性チェックに使います。

## JSONの用意
```json
{
    "type": "{TYPE}",
    "data": "{CODE}"
}
```

`{TYPE}`は`plugin`か`theme`のいずれかです。適当な方を選びましょう。
`{CODE}`はリソースのソースコードを**文字列**で入力します。このとき、改行(`\n`)やダブルクオーテーション(`"`)、バックスラッシュ(`\`)などは適当な形でエスケープする必要があります。

## GitHub PagesにJSONをあげる
前章で作ったJSONをGitHub Pagesにあげましょう。
GitHub PagesにJSONをあげると以下のような形式のリンクでJSONにアクセスできるようになります。
```url
https://{USERNAME}.github.io/{REPOSITORY_NAME}/{FILE_PATH}
```
`{USERNAME}`はGitHubでのユーザーネームが、`{REPOSITORY_NAME}`はリポジトリの名前が、`{FILE_PATH}`はGitHubのリポジトリ上でのファイルパスが入ります。
ファイルパスがわからない場合は、GitHub上でファイルパスを確認したいファイルへと移動して三点リーダー(`…`)から`Copy path`でパスのコピーができます。
URLができたら上のリンクに一度アクセスし、適当なJSONが返ってくることを確認してみましょう。

## 配布用URLの作成
配布リンクは以下のような形式になります。
```url
https://{HOST}/install-extentions?url=https://{USERNAME}.github.io/{REPOSITORY_NAME}/{FILE_PATH}&hash={HASH}
```
`{HOST}`はMisskeyサーバーのホストドメインです。他のホルダーにはそれぞれ適当な値を入れてください。

# 例
ここでは一例として`flexible_user_mute_plugin`を載せます。`{HOST}`は適当に編集してください。
GitHubのリポジトリ: https://github.com/saranann/MisskeyPlugins
```url
https://{HOST}/install-extentions?url=https://saranann.github.io/MisskeyPlugins/json/flexible_user_mute_plugin.is.json&hash=dbdf80635d40f7387d93d307368c3a2d92c0c0e08e2a0f4f8509a065eb8d8b9fc8ed542758215ac750a700a21f24fdc33a88a494085323a7748bed90f9d4c34e
```

# 注意点
GitHub Pagesには回数制限があります。

# 付録：インストール時のエラー
> **パラメータが不足しています**
> 外部サイトからデータを取得するために必要な情報が不足しています。URLをお確かめください。

このエラーが出る場合には要因が二つ考えられます。
一つはURLのパラメーターが不正な場合です。URLの`?`移行に書かれたパラメーターに`url`と`hash`の両方があるか確認してください。
もう一つは、**URLを「ウィンドウで開く」で開いている場合**です。これはMisskey側の仕様なので、「ページで表示」をするようにしましょう。

> **この外部リソースには対応していません**
> この外部サイトから取得したリソースの種別には対応していません。サイト管理者にお問い合わせください。

(未検証)

> **データの取得に失敗しました**
> 外部サイトとの通信に失敗しました。もう一度試しても改善しない場合、サイト管理者にお問い合わせください。

`url={API_URL}`の項目が不正なリンクになっているか、JSONを返していません。確認してみましょう。

> **データの取得に失敗しました**
> 外部サイトから取得したデータが読み取れませんでした。サイト管理者にお問い合わせください。

(未検証)

> **正しいデータが取得できませんでした**
> 提供されたデータの整合性の確認に失敗しました。セキュリティ上、インストールは続行できません。サイト管理者にお問い合わせください。

hash値が不正です。正しくhash値が計算されていないか、ファイルかhash値の値が改竄されています。

> **AiScript エラー**
> データは取得できたものの、AiScriptの解析時にエラーがあったため読み込めませんでした。プラグインの作者にお問い合わせください。エラーの詳細はJavascriptコンソールをご確認ください。

Ai Scriptの解析エラーです。

> **プラグインのインストールに失敗しました**
> プラグインのインストール中に問題が発生しました。もう一度お試しください。エラーの詳細はJavascriptコンソールをご覧ください。

(未検証)

> **テーマ解析エラー**
> データは取得できたものの、テーマファイルの解析時にエラーがあったため読み込めませんでした。テーマの作者にお問い合わせください。エラーの詳細はJavascriptコンソールをご確認ください。

Themeの解析エラーです。

> **テーマのインストールに失敗しました**
> テーマのインストール中に問題が発生しました。もう一度お試しください。エラーの詳細はJavascriptコンソールをご覧ください。

(未検証)