モルガンの宝具セリフをランダムに返すbot

「宝具」とメッセージするとモルガンの宝具セリフの３パターンからランダムに一つ返すLine BOTの作成について。
## 公式アカウント

https://lin.ee/eTNmSY2

## ツール等
Azure App Service
node.js
VSCode　（ソース作成とAzure AppServiceへのデプロイができます。）

# Reference

Developer Consoleでいろいろ設定します。

https://developers.line.biz/ja/docs/messaging-api/building-bot/#

botアプリを作ります。Azure AppServiceへデプロイします。

https://developers.line.biz/ja/docs/messaging-api/nodejs-sample/

デプロイ方法だけ参照してください。（ExpressアプリでBotを作ったら応答メッセージが受信できませんでしたｔ）

https://learn.microsoft.com/ja-jp/azure/app-service/quickstart-nodejs?tabs=windows&pivots=development-environment-vscode

## コード

```
const https = require("https");
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
const TOKEN = process.env.LINE_ACCESS_TOKEN;

app.use(express.json());
app.use(
  express.urlencoded({
    extended: true,
  })
);

app.get("/", (req, res) => {
  res.sendStatus(200);
});

/*
app.post("/webhook", function (req, res) {
  res.send("HTTP POST request sent to the webhook URL!");
});
*/

app.post("/webhook", function (req, res) {
  res.send("HTTP POST request sent to the webhook URL!");
  
  // ユーザーがボットにメッセージを送った場合、応答メッセージを送る
  if (req.body.events[0].type === "message") {
    //乱数を求める
    function getRandomInt(min, max) {
      min = Math.ceil(min);
      max = Math.floor(max);
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    //乱数から宝具メッセージを作成する
    const msgText = ((rand) => {
      if(req.body.events[0].message.text === "宝具") {
      if(rand > 0 && rand <= 1) {
        return "「慈悲だ。頭を垂れよ。恐怖はない、希望もない、ただ罪人のように死ね。何人も──通るに能わず！」"
      } else if (rand > 1 && rand <= 2){
        return "「そう、いいでしょう。私の足元で許しを請いなさい。聖剣なぞ、この程度！落ちよ──『はや辿り着けぬ理想郷（ロードレス・キャメロット）』!」"
      } else {
        return "「それは絶えず見た滅びの夢──報いはなく、救いはない。最果てにありながら、鳥は明日を歌うでしょう。どうか標に──『はや辿り着けぬ理想郷（ロードレス・キャメロット）』」"
      }
    }
    });

    // APIサーバーに送信する応答トークンとメッセージデータを文字列化する
    const dataString = JSON.stringify({
      // 応答トークンを定義
      replyToken: req.body.events[0].replyToken,
      // 返信するメッセージを定義
      messages: [
      /*
        {
          type: "text",
          text: "Hello, user",
        },
        {
          type: "text",
          text: "May I help you?",
        },
        */
        {
          type: "text",
          text: msgText(getRandomInt(1, 3)),
        },
      ],
    });

    // リクエストヘッダー。仕様についてはMessaging APIリファレンスを参照してください。
    const headers = {
      "Content-Type": "application/json",
      Authorization: "Bearer " + TOKEN,
    };

    // Node.jsドキュメントのhttps.requestメソッドで定義されている仕様に従ったオプションを指定します。
    const webhookOptions = {
      hostname: "api.line.me",
      path: "/v2/bot/message/reply",
      method: "POST",
      headers: headers,
      body: dataString,
    };

    // messageタイプのHTTP POSTリクエストが/webhookエンドポイントに送信された場合、
    // 変数webhookOptionsで定義したhttps://api.line.me/v2/bot/message/replyに対して
    // HTTP POSTリクエストを送信します。

    // リクエストの定義
    const request = https.request(webhookOptions, (res) => {
      res.on("data", (d) => {
        process.stdout.write(d);
      });
    });

    // エラーをハンドリング
    // request.onは、APIサーバーへのリクエスト送信時に
    // エラーが発生した場合にコールバックされる関数です。
    request.on("error", (err) => {
      console.error(err);
    });

    // 最後に、定義したリクエストを送信
    request.write(dataString);
    request.end();
  } else {
    console.log("not message")
  }
});

app.listen(PORT, () => {
  console.log(`Example app listening at http://localhost:${PORT}`);
});

```