コンテキストを提供するために、ここに私が解決しようとしている問題があります:
友達とのカジュアルなグループ チャット用に giphy ボットを作成しました。メッセージを入力/giphy [terms]
すると、 の上位の結果が自動的に投稿され[terms]
ます。私の友人は、彼らがそうであるように、やんちゃな嫌いな人であり、すぐにそれを悪用してグループチャットをスパムし始めました. これを防ぐために私がしたいことは、postMessage
関数が 1 分に 1 回しか呼び出されないようにすることです。
私が試したこと:
- を使用
setTimeout()
すると、引数で指定された時間が経過した後にのみ関数が呼び出されるため、私が望むことは正確には行われません。私が知る限り、これにより、ボットが呼び出された時点からメッセージに遅延が発生しますが、実際には、ボットがpostMessage()
その間に新しい呼び出しを受け入れるのを妨げることはありません. - を使用
setInterval()
すると、関数が特定の間隔で永久に呼び出されます。
私がうまくいくと思うもの:
現在、2 つの .js ファイルを使用しています。
Index.js
var http, director, cool, bot, router, server, port;
http = require('http');
director = require('director');
bot = require('./bot.js');
router = new director.http.Router({
'/' : {
post: bot.respond,
get: ping
}
});
server = http.createServer(function (req, res) {
req.chunks = [];
req.on('data', function (chunk) {
req.chunks.push(chunk.toString());
});
router.dispatch(req, res, function(err) {
res.writeHead(err.status, {"Content-Type": "text/plain"});
res.end(err.message);
});
});
port = Number(process.env.PORT || 5000);
server.listen(port);
function ping() {
this.res.writeHead(200);
this.res.end("This is my giphy side project!");
}
Bot.js
var HTTPS = require('https');
var botID = process.env.BOT_ID;
var giphy = require('giphy-api')();
function respond() {
var request = JSON.parse(this.req.chunks[0]);
var giphyRegex = /^\/giphy (.*)$/;
var botMessage = giphyRegex.exec(request.text);
var offset = Math.floor(Math.random() * 10);
if(request.text && giphyRegex.test(request.text) && botMessage != null) {
this.res.writeHead(200);
giphy.search({
q: botMessage[1],
rating: 'pg-13'
}, function (err, res) {
try {
postMessage(res.data[offset].images.downsized.url);
} catch (err) {
postMessage("There is no gif of that.");
}
});
this.res.end();
} else {
this.res.writeHead(200);
this.res.end();
}
function postMessage(phrase) {
var botResponse, options, body, botReq;
botResponse = phrase;
options = {
hostname: 'api.groupme.com',
path: '/v3/bots/post',
method: 'POST'
};
body = {
"bot_id" : botID,
"text" : botResponse
};
botReq = HTTPS.request(options, function(res) {
if(res.statusCode == 202) {
} else {
console.log('Rejecting bad status code: ' + res.statusCode);
}
});
botReq.on('error', function(err) {
console.log('Error posting message: ' + JSON.stringify(err));
});
botReq.on('timeout', function(err) {
console.log('Timeout posting message: ' + JSON.stringify(err));
});
botReq.end(JSON.stringify(body));
}
exports.respond = respond;
基本的に、私が思い描いているタイマーを実装するのに理想的な場所はどこだろうと思っています。/giphy [terms]
投稿するのに1分待つのではなく、1分後に聞くだけにしたいようです。
私の質問:
これを行う最善の方法は、関数にタイマーを設定する
response()
ことでしょうか?実際には、着信情報は 1 分に 1 回しか解析されませんか? これを置くよりエレガントな場所はありますか?タイマーはその機能でどのように機能する必要がありますか? 1 分に 1 回だけ実行できるとは思えません。これ
response()
は、GroupMe API からの受信 json を 1 分に 1 回しか解析しないように思われるため、取得したい受信メッセージを見逃す可能性があるためです。