Mount event listener only if message was sent out successfully #42

Merged
laurynas-karvelis merged 1 commits from master into master 2018-03-21 12:31:09 +00:00

View File

@ -25,7 +25,7 @@ export default class Base extends EventEmitter {
* gets the Update object containing message * gets the Update object containing message
* *
* @param {object} bot * @param {object} bot
* @return {promise} returns a promise, resolved with message:answer * @return {Promise} returns a promise, resolved with message:answer
*/ */
send(bot) { send(bot) {
if (this._keyboard) { if (this._keyboard) {
@ -33,46 +33,47 @@ export default class Base extends EventEmitter {
this.properties.reply_markup = replyMarkup; this.properties.reply_markup = replyMarkup;
} }
let messageId;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this._apiSend(bot) this._apiSend(bot)
.then(response => { .then(response => {
messageId = response.result.message_id;
this.emit('message:sent', response); this.emit('message:sent', response);
return response.result.message_id;
}) })
.catch(reject); .then(messageId => {
const chat = this.properties.chat_id;
let answers = 0;
if (this._keyboard.one_time_keyboard) { bot.on('update', function listener(result) {
this._keyboard.replyMarkup = ''; answers += result.length;
}
const chat = this.properties.chat_id; const update = result.find(({ message }) => {
let answers = 0; // if in a group, there will be a reply to this message
if (chat < 0) {
return message.chat.id === chat
&& message.reply_to_message
&& message.reply_to_message.message_id === messageId;
}
bot.on('update', function listener(result) { return message && message.chat.id === chat;
answers += result.length; });
const update = result.find(({ message }) => { if (update) {
// if in a group, there will be a reply to this message resolve(update.message);
if (chat < 0) { this.emit('message:answer', update.message);
return message.chat.id === chat bot.removeListener('update', listener);
&& message.reply_to_message }
&& message.reply_to_message.message_id === messageId;
if (answers >= ANSWER_THRESHOLD) {
bot.removeListener('update', listener);
}
});
})
.catch(reject)
.finally(() => {
if (this._keyboard.one_time_keyboard) {
this._keyboard.replyMarkup = '';
} }
return message && message.chat.id === chat;
}); });
if (update) {
resolve(update.message);
this.emit('message:answer', update.message);
bot.removeListener('update', listener);
}
if (answers >= ANSWER_THRESHOLD) {
bot.removeListener('update', listener);
}
});
}); });
} }