Node.js
AzureWebApps
discord

DiscordBOTをケチケチ仕様で動かす:その2

前回作ったBOTの構成がとてもイケてないので、構成を改めた。

WebApps単体で動く様にしてある。

DiscordAppの追加

1. ここでNewApp追加
2. 入力パラメータは以下の通り

1 2
Name なんでもいい(ここで入れた名前がチャンネルのところで出る)
RedirectURI WebAppsのURI

3. TokenとClientIDを控えておく

WebAppsの作成

1. 作成後、Kudu(高度なツール)からDebug Console(CMD)を開き、で下記コマンドを実行する。

npm install request
npm install eris

2. DocumentRootにweb.configを配置する。

web.config
<configuration>
  <system.webServer>
    <handlers>
      <add name="iisnode" path="bot.js" verb="*" modules="iisnode" />
    </handlers>
    <rewrite>
      <rules>
        <rule name="StaticContent">
          <action type="Rewrite" url="public{REQUEST_URI}" />
        </rule>
        <rule name="DynamicContent">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" />
          </conditions>
          <action type="Rewrite" url="bot.js" />
        </rule>
      </rules>
    </rewrite>
    <security>
      <requestFiltering>
        <hiddenSegments>
          <add segment="node_modules" />
        </hiddenSegments>
      </requestFiltering>
    </security>    
  </system.webServer>
</configuration>

3. DocumentRootにindex.jsを配置する。

index.js
var http = require('http');

var server = http.createServer(function(request, response) {

    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("Discord Bot Activated.This page can close.");

});

var port = process.env.PORT || 1337;
server.listen(port);

const Eris = require("eris");
var bot = new Eris("DiscordBOTトークン");

bot.on("ready", () => {
    console.log("Ready!");
});

bot.on("messageCreate", (msg) => {
    if(msg.content === "!timer10") {
        var return_message = "[@益@]< " + msg.member.username + "さん、オッケーっス。8分後と10分後にお知らせするッス!)" 
        bot.createMessage(msg.channel.id, return_message);
        //8分後に発射
        setTimeout(function(){
            bot.createMessage(msg.channel.id, "[@益@]<あと2分ぞなもし)");},480000)
        //10分後に発射
        setTimeout(function(){
            bot.createMessage(msg.channel.id, "[@益@]<終わりだよ!!!)");},600000)
    } else if(msg.content === "!timer60") {
        var return_message = "[@益@]< " + msg.member.username + "さん、オッケーっス。55分後と60分後にお知らせするッス!)" 
        bot.createMessage(msg.channel.id, return_message);
        //55分後に発射
        setTimeout(function(){
            bot.createMessage(msg.channel.id, "[@益@]<あと2分ぞなもし)");},3300000)
        //60分後に発射
        setTimeout(function(){
            bot.createMessage(msg.channel.id, "[@益@]<終わりだよ!!!)");},3600000)
    }else if(msg.content === "死んだ?"){
        bot.createMessage(msg.channel.id, "[@益@]<生きてるよ!ピキピキ)");
    }else if(msg.content === "!howto"){
        bot.createMessage(msg.channel.id, "[@益@]< 今の所使えるコマンドは以下の通り  )");
        bot.createMessage(msg.channel.id, "[@益@]< !timer10  )");
        bot.createMessage(msg.channel.id, "[@益@]< !timer60  )");
        bot.createMessage(msg.channel.id, "[@益@]< 死んだ?  )");
    } 
});

// Discord に接続します。
bot.connect();

4. WebAppsのURIにアクセスする。Webページが見えればOK

チャンネルへのBOT追加

1. 以下の<CLIENTID>部分を控えた内容と置き換えてアクセスする。
https://discordapp.com/oauth2/authorize?&client_id=<CLIENTID>&scope=bot&permissions=0

2. BOTを追加し、メンバーリストに載る事を確認する。
3. BOTがオンラインになっている事を確認する。
4. もしオフラインの場合は、WebAppsのindex.jsへトークンIDを記入しているか確認する。また、WebAppsのURLに再アクセスする。

WebApps Freeプラン対策

1. Automationを作成し、空のRunbookを追加する。
2. Powershellで以下コードを追加。

urlknock.ps1
$ProgressPreference="SilentlyContinue"
$request = Invoke-WebRequest -Uri "https://WebAppsのURL/" -UseBasicParsing

3.20分で落とされる事を考慮し、開始時間が15分ずれたスケジュールを4つ作成してリンクさせる。

あとやるとしたら・懸念事項

1. リソース足らなくなったらFreeのWebAppsを西日本に増やしてTrafficManagerでぶら下げてみる
2. 60分バージョンはCPUのクォータに引っかかりそうな予感
3. 音鳴らしたい

※18/04/11追記
 複数サーバで使ったらわかりませんが、1つのサーバで使う分には思ったほどリソース使いませんでした。
 

ソースコード

GitHub:obird-rive/discord_bot-forWebApps