Discord APIの新しいWebhookエンドポイント(EditとDelete)

# はじめに
この記事はなんとなく[Discord Bot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/discordbot)の14日目を埋めるという動機で書かれました。
なので、クオリティはお察しです(20分で書いたのでと23時40分に書きました。あと20分で書き上がるのか?)。

さて、discord/discord-api-docsを眺めていたらおもしろいものを見つけたので紹介しておきます。(discord/discord-api-docsを眺めるのは割と楽しいですよ。おすすめです。)

ほんとはSlash Commandsのことをやりたかったんですがまだリリースされていないのでどこかでやります。(Gatewayの方はどうせすぐ開発者が飛びつくのでOutgoing WebhookとCloud Functionsとこの記事で紹介するWebhookで遊ぶ。みたいなやつをやりたいと思います。)

# discord/discord-api-docs
[Discord APIのドキュメント(Discord Developer Portal — Documentation)](https://discord.com/developers/docs)は[GitHubのdiscord/discord-api-docs](https://github.com/discord/discord-api-docs)というRepositoryで管理されています。

このRepositoryのCommitやPRを眺めることで新しく実装される機能やAPIの変更点などを[ドキュメントのChange Log](https://discord.com/developers/docs/change-log)を見るよりも早く、正確に知ることができます。
また、PRではAPIやDiscordの方針についての議論がされていることもあります。



# 新しいWebhookエンドポイント

これが[Commit](https://github.com/discord/discord-api-docs/commit/8f5aa7beb66f14be3c7b1e4dc9a2d5f73d1c5937)です。どうやら、EditとDeleteが可能になったようです。まだ[ドキュメント](https://discord.com/developers/docs/resources/webhook)には反映されていないように見えますが叩いてみましょう。

あまりにも時間に余裕がないので以下に示すブラウザ拡張のREST Clientを使うことにします。
(私だってほんとはかっこよくcurlとかInvoke-WebRequestとか使いたいんです)
[RESTClient, a debugger for RESTful web services.](https://addons.mozilla.org/ja/firefox/addon/restclient/)

## セキュリティ上の警告
使用中のWebhook URLをむやみにこの記事のように公開することは避けてください。
(私はこの記事を書き終わったあとWebhook URLを削除するつもりです)

## Webhookを作成する
新機能でもなんでもないので説明はしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131375/0b1d52d6-26e4-f6a5-1cb5-f3b1316f7612.png)

## メッセージを作成する
新機能でもなんでもないので説明はしませんといきたいのですがメッセージIDが今後必要なので説明してしまいます。

メッセージIDを取得するためにwaitパラメータを指定します。
URLは以下のようになります。

```
https://discord.com/api/webhooks/788055101943185408/o3JsFvBMZNaxUqitnRYKWqIrB-iM6YGbgldh_cAuP4GIT-mcsw6yLcnE1VyZ28QnRkIq?wait=true
```

メソッドをPOSTにし、ヘッダーに`Content-Type: application/json`を指定し実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131375/54b126cd-9eb4-7d85-72d0-e9546b369b0f.png)

無事に投稿が完了したようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131375/136300ad-c4a5-1f31-ca4d-4a475b3e7e7f.png)

また、次のようなレスポンスが返却されます。

```json
{
   "id":"788056956375007262",
   "type":0,
   "content":"あと5分とか無理ゲーでしょ",
   "channel_id":"788055071027101716",
   "author":{
      "bot":true,
      "id":"788055101943185408",
      "username":"edit hook",
      "avatar":null,
      "discriminator":"0000"
   },
   "attachments":[
      
   ],
   "embeds":[
      
   ],
   "mentions":[
      
   ],
   "mention_roles":[
      
   ],
   "pinned":false,
   "mention_everyone":false,
   "tts":false,
   "timestamp":"2020-12-14T14:56:59.790000+00:00",
   "edited_timestamp":null,
   "flags":0,
   "webhook_id":"788055101943185408"
}
```

ここで0時になりました。(やはり間に合いませんでした)

## メッセージの編集
URLは[Commit](https://github.com/discord/discord-api-docs/commit/8f5aa7beb66f14be3c7b1e4dc9a2d5f73d1c5937)に従い、レスポンスで得られたMessage Idを`${Webhook token}/messages/`の後ろにつけて次のようになります。(waitパラメータなしでも結果が帰ってくるようです)

```
https://discord.com/api/webhooks/788055101943185408/o3JsFvBMZNaxUqitnRYKWqIrB-iM6YGbgldh_cAuP4GIT-mcsw6yLcnE1VyZ28QnRkIq/messages/788056956375007262
```
画像のようにメソッドをPATCHに変更しリクエストをなげます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131375/01399158-3624-5230-a606-3ae8c50cd519.png)

Discordクライアントで確認すると更新されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131375/423ab7f5-7173-59ff-58e6-5cc77a78e9f1.png)
また、ステータスコード200で次のようなレスポンスが返却されました。

```json
{
  "id": "788056956375007262",
  "type": 0,
  "content": "もう0時まわりましたけど?",
  "channel_id": "788055071027101716",
  "author": {
    "bot": true,
    "id": "788055101943185408",
    "username": "edit hook",
    "avatar": null,
    "discriminator": "0000"
  },
  "attachments": [],
  "embeds": [],
  "mentions": [],
  "mention_roles": [],
  "pinned": false,
  "mention_everyone": false,
  "tts": false,
  "timestamp": "2020-12-14T14:56:59.790000+00:00",
  "edited_timestamp": "2020-12-14T15:10:27.056358+00:00",
  "flags": 0,
  "webhook_id": "788055101943185408"
}
```

## メッセージの削除

編集と同じURLへDELETEを発行するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131375/9bb586a3-9381-c674-94fd-9bb0597237e3.png)
メッセージが存在する場合は204が、削除済みの場合は404が返却されます。

# 感想
どんなに頑張っても1時間はかかってしまいますね。
以下に示すやらかしがなくても間に合いませんでした。
Slash CommandsとOutgoing WebhookとCloud FunctionsとWebhookで遊ぶ記事は面白そうなので書きたいと思います。

# やらかし
messagesをつけ忘れて記事の成立が危うくなった人の図を示しておきます。

URLは[Commit](https://github.com/discord/discord-api-docs/commit/8f5aa7beb66f14be3c7b1e4dc9a2d5f73d1c5937)に従い、レスポンスで得られたMessage IdをWebhook tokenの後ろにつけて次のようになります。

```
https://discord.com/api/webhooks/788055101943185408/o3JsFvBMZNaxUqitnRYKWqIrB-iM6YGbgldh_cAuP4GIT-mcsw6yLcnE1VyZ28QnRkIq/788056956375007262?wait=true
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131375/d6b21f36-cc0d-fe05-caa7-bf343992f6cf.png)

画像のようにメソッドをPATCHに変更し…405 Method Not Allowed…あ、まだリリースされてなかったみたいですね。