スーパーグローバルチャット v2 APIドキュメント

## 概要
スーパーグローバルチャットに参加するBOT間で、チャットに投稿されたメッセージをやり取りするために使用します。
メッセージを受信したBOTは、`#super-global-chat` チャンネルにJSON形式でメッセージを送信します。

## 機能

JSONの先頭に`"type"`キーを使用し、これから送信するJSONがどの機能に該当するかを示します。
機能は以下の通りです。

### Values of "type" key
|Value|[Requirement Levels](#requirement-levels)|Description|
|---|---|---|
|[message](#message)|Must|送信されたメッセージ|
|[delete](#delete)|Should|削除されたメッセージ|
|edit|Should|編集されたメッセージ|
|empty|May|空（送信テスト）|
|(xx-example)|May|独自規格|

### message

|Key|[Requirement Levels](#requirement-levels)|Type|Description|
|---|---|---|---|
|type|Must|string|Valueには`"message"`が入ります。<br>メッセージが送信されたことを示します。|
|[version](#version-types)|Should|string|スーパーグローバルチャットのバージョン<br>どの機能が搭載されているかが分かります。|
|userId|Must|[snowflake](#snowflake)|[`User Object`](https://discord.com/developers/docs/resources/user#user-object)の`id`が入ります。<br>メッセージの送信者のユーザIDです|
|userName|Must|string|[`User Object`](https://discord.com/developers/docs/resources/message#message-object-message-structure)の`username`が入ります。<br>メッセージの送信者の名前です<br>`global_name`ではありません。|
|userDiscriminator|Must|string|[`User Object`](https://discord.com/developers/docs/resources/user#user-object)の`discriminator`が入ります。<br>メッセージの送信者のDiscordタグです|
|userAvatar|Must|[?](#explanation)string|[`author` Field](https://discord.com/developers/docs/resources/message#message-object-message-structure)の[`User Object`](https://discord.com/developers/docs/resources/user#user-object)の`avatar`が入ります。<br>メッセージの送信者のAvaterハッシュです。<br>空の場合は`null`が入ります。|
|isBot|Should|boolean|[`author` Field](https://discord.com/developers/docs/resources/message#message-object-message-structure)の[`User Object`](https://discord.com/developers/docs/resources/user#user-object)の`bot`が入ります。<br>メッセージの送信者がOAuth2アプリケーションに属しているかどうかを示します。|
|guildId|Must|[snowflake](#snowflake)|[`Guild Object`](https://discord.com/developers/docs/resources/guild#guild-object)の`id`が入ります。<br>メッセージが送信されたサーバーのIDです|
|guildName|Must|string|[`Guild Object`](https://discord.com/developers/docs/resources/guild#guild-object)の`name`が入ります。<br>メッセージが送信されたサーバーのIDです|
|guildIcon|Must|[?](#explanation)string|[`Guild Object`](https://discord.com/developers/docs/resources/guild#guild-object)の`icon`が入ります。<br>メッセージが送信されたサーバーのiconハッシュです。<br>空の場合は`null`が入ります。|
|channelId|Should|[snowflake](#snowflake)|[`Channel Object`](https://discord.com/developers/docs/resources/channel#channel-object)の`id`が入ります。<br>メッセージが送信されたチャンネルのIDです|
|channelName|Should|string|[`Channel Object`](https://discord.com/developers/docs/resources/channel#channel-object)の`name`が入ります。<br>メッセージが送信されたチャンネルの名前です|
|messageId|Should|[snowflake](#snowflake)|[`Message Object`](https://discord.com/developers/docs/resources/message#message-object)の`id`が入ります。<br>メッセージのIDです|
|content|Must|string|[`Message Object`](https://discord.com/developers/docs/resources/message#message-object)の`content`が入ります。<br>メッセージの内容です|
|reference[?](#explanation-1)|Should|string|[`Message Reference Object`](https://discord.com/developers/docs/resources/message#message-reference-object)の`message_id`が入ります。<br>返信先メッセージのIDです|
|attachmentsUrl[?](#explanation-1)|Must|array of string|[`Attachment`](https://discord.com/developers/docs/resources/message#attachment-object-attachment-structure)の`url`の配列が入ります。<br>添付ファイルのURLです。<br>空の配列は入らず、添付ファイルが０件の場合はこのキーは使用しません|
|(xx-example)|May|any|独自規格|

#### 例
* 最小パターン
```JSON
{
  "type": "message", 
  "userId": "607645717623996426", 
  "userName": "Tsukikoh", 
  "userDiscriminator": "2710", 
  "userAvatar": "a118cc1ef21fcbac75764483108888fb", 
  "isBot": false, 
  "guildId": "706905953320304772", 
  "guildName": "Super Global Chat関係", 
  "guildIcon": "13e9bceb07fec376de1b1af835aca51a", 
  "channelId": "707158194572623903", 
  "channelName": "kensaku-sgc", 
  "messageId": "799141495155195975", 
  "content": "メッセージ削除の下準備として、検索BOT側で全メッセージに「mID→Message.id」を入れる事にした"
}
```

* 最大パターン
```JSON
{
  "type": "message", 
  "version": "2.1.7", 
  "userId": "607645717623996426",
  "userName": "つきこう",
  "userDiscriminator": "2710",
  "userAvatar": "a118cc1ef21fcbac75764483108888fb",
  "isBot": false,
  "guildId": "706543524958699570",
  "guildName": "Newグローバルチャットサーバー",
  "guildIcon": "db2be882afde5818366405376458a774",
  "channelId": "707158194572623903",
  "channelName": "kensaku-sgc",
  "messageId": "773865745187733514",
  "content": "Hello World",
  "reference": "877075663352389672",
  "attachmentsUrl": [ "https://cdn.discordapp.com/attachments/771644708048470046/771652380143517706/video0.mov", "https://cdn.discordapp.com/attachments/771644708048470046/771652381800398868/video1.mov" ]
}
```

### delete

|Key|[Requirement Levels](#requirement-levels)|Type|Description|
|---|---|---|---|
|type|Must|string|Valueには`"delete"`が入ります。<br>メッセージが削除されたことを示します。|
|messageId|Must|[snowflake](#snowflake)|[`Message Object`](https://discord.com/developers/docs/resources/message#message-object)の`id`が入ります。<br>メッセージのIDです|
|[version](#version-types)|Should|string|スーパーグローバルチャットのバージョン<br>どの機能が搭載されているかが分かります。|
|userId|May|[snowflake](#snowflake)|[`User Object`](https://discord.com/developers/docs/resources/user#user-object)の`id`が入ります。<br>メッセージの送信者のユーザIDです|
|guildId|May|[snowflake](#snowflake)|[`Guild Object`](https://discord.com/developers/docs/resources/guild#guild-object)の`id`が入ります。<br>メッセージが送信されたサーバーのIDです|
|channelId|May|[snowflake](#snowflake)|[`Channel Object`](https://discord.com/developers/docs/resources/channel#channel-object)の`id`が入ります。<br>メッセージが送信されたチャンネルのIDです|
|(xx-example)|May|any|独自規格|
|content|Should **NOT**|string|[`Message Object`](https://discord.com/developers/docs/resources/message#message-object)の`content`が入ります。<br>メッセージの内容です<br>削除内容をログとして残すような実装はセキュリティ上の観点で非推奨です。|

### edit

### empty

## 補足

### Requirement Levels
* Must : 必須。送信する機能を備えなければならず、これを受信した場合は適切に処理しなければならない。
* Should : 推奨。できる限り搭載しなければならず、これを受信した場合はできる限り適切に処理しなければならない。（ただし、どうしても導入が難しい場合は導入しないことも可能）
* May : 任意。必要に応じてその機能を備えることができる。また、このメッセージが送信されることを考慮し、最低限意図しない不具合を発生させないようにする必要がある。

### snowflake
Discordは、IDとして[スノーフレーク形式](https://discord.com/developers/docs/reference#snowflakes)を利用しています。<br>JSONで扱う場合、中身はstring型の数字の羅列です。

### Version Types

|Value|Description|
|---|---|
|1.0|初版。`userId` `userName` `userDiscriminator` `userAvatar` `guildId` `guildName` `guildIcon` `content` `attachmentsUrl` の実装|
|1.1|`isBot` の実装|
|1.2|`channelId` `channelName` の実装|
|1.3|`messageId` の実装|
|1.4|`type` の実装　`type=message`以外を除外<br>（v2.0に即座にアップグレードできないBOT向けに、v2.0以降の新機能との共存対策）|
|1.5|`reference` の実装|
|1.6|`attachmentsUrl` のパーセントエンコーディングの廃止|
|1.7|`userId` `channelId` `messageId` `reference` を string型に変更|
|2.0|`type` `empty` 独自仕様 の実装<br>応答型の独自仕様向けに`query`を追加|
|2.1|`edit` `delete` の実装|
|2.1.5|`reference` の実装|
|2.1.6|`attachmentsUrl` のパーセントエンコーディングの廃止|
|2.1.7|`userId` `channelId` `messageId` `reference` を string型に変更|
|2.2|`auth` `ban` の実装予定|

2.n.x と 1.x は詳細の仕様変更の部分が一致する

### ?explanation
指定された型 OR null
`?string` : string型か、もしくはnullが入ります。

### explanation?
必要なときにのみ使用するキーです。
`attachmentsUrl?` : 添付ファイルが存在するときのみ `attachmentsUrl` キーを使用します。