久しぶりにディスコードBOTの作り方メモ。
導入までは以前書いた方法でいけるはずです。
定期処理
まずは準備できた状態でステータスや定期メソッドなどを設定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//定期メソッド const mymethod = ()=>{ //APIからのデータなど //定期的に取得しなおす }; client.on('ready', () => { //ステータスの設定 client.user.setPresence({ game: { name: 'BOT作成' }, status: 'online' }); //定期メソッドの設定 mymethod(); setInterval(function(){ mymethod(); }, 60*1000); console.log('準備完了'); }); |
コマンド処理
メッセージに対応して返す時には反応しないパターンと反応するパターンに合わせて書いていく。基本的に正規表現を使うのがいいと思う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
client.on('message', message =>{ //BOT発言には反応しないようにする if(message.author.bot){ return; } //DMに反応しないようにする if(message.channel.type=="dm"){ return; } const content = message.content; //シンプルなコマンド(完全一致) if(content==="./command"){...} //引数なども取れるコマンド(前方一致) if(content.startsWith("./command")){...} //特定の用語に反応するコマンド if(content.indexOf("command") > -1){...} //何にでも対応できるコマンド if(content.match(/正規表現/)){...} }); |
なにかしら送るのは以下のコマンドでできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//返信する( @xxx, text ) message.reply("text"); //投稿する( text ) message.channel.send("text"); //DMを送る( text ) message.author.send("text"); //画像付きにするには第二引数を設定する message.reply("text",{files: [{ attachment: "path", name: "test.png" }]}); //スタンプを付ける message.react(👍); |
textの部分をリッチテキストにすると表現の幅が広がる。
外部APIを使う
通信用のモジュールは色々あるけどデフォルトであるhttpsを使ってみる。
1 2 3 4 5 6 7 8 9 10 |
const https = require ('https'); https.get("https://xxx/api?key=yyy", function(res) { let x=""; res.setEncoding('utf8'); res.on("data", function(chunk) { x+=chunk; }).on("end",function(){ console.log(JSON.parse(x)); }); }); |
通信エラーやパースエラーの処理なんかは書いてないけど簡単に実装できる。
しかし複数のAPIを処理するとなるとこれだと使いにくい。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const getApi = function(){ return new Promise((resolve, reject) => { https.get("https://aaa/bbb/api", function(res) { var x=""; res.setEncoding('utf8'); res.on("data", function(chunk) { x+=chunk; }).on("end",function(){ resolve(JSON.parse(x)); }); }); }); } |
適当にPromiseで包んで関数にしておけば本体でごちゃごちゃせずに済む。
所感
久々にまとめてみるとDiscord.jsってこんなに使いやすかったな?と思える。
実運用になるとまた色々問題があるとは思うので定期的にまとめておきたい。