telebot
Version:
The easy way to write Telegram bots.
151 lines (116 loc) • 4.34 kB
JavaScript
// Command regexp
const REGEXP_COMMAND = /^\/([0-9а-я\w\d_-]+)/;
// Message types
const MESSAGE_TYPES = [
'new_chat_members', 'left_chat_member', 'new_chat_title',
'new_chat_photo', 'delete_chat_photo', 'group_chat_created',
'supergroup_chat_created', 'channel_chat_created', 'migrate_to_chat_id',
'migrate_from_chat_id', 'pinned_message', 'edit_date', 'forward_date',
'text', 'audio', 'voice', 'document', 'photo', 'sticker', 'video', 'video_note', 'animation',
'contact', 'location', 'venue', 'game', 'invoice', 'successful_payment', 'passport_data', 'reply_markup'
];
const SHORTCUTS = {
edit_date: 'edit',
video_note: 'videoNote',
forward_date: 'forward',
new_chat_members: 'newChatMembers',
left_chat_member: 'leftChatMember',
new_chat_title: 'newChatTitle',
new_chat_photo: 'newChatPhoto',
delete_chat_photo: 'deleteChatPhoto',
pinned_message: 'pinnedMessage',
group_chat_created: 'groupChatCreated',
channel_chat_created: 'channelChatCreated',
supergroup_chat_created: 'supergroupChatCreated',
migrate_to_chat_id: 'migrateToChat',
migrate_from_chat_id: 'migrateFromChat',
successful_payment: 'successfulPayment',
passport_data: 'passportData',
};
// Update type functions
const updateFunctions = {
// Message
message(update, props) {
// Any event status: ['*', '/*']
let anyEventFlags = [false, false];
let promise = Promise.resolve();
let mod = this.modRun('message', {message: update, props});
update = mod.message;
props = mod.props;
promise = promise.then(() => mod.promise);
for (let type of MESSAGE_TYPES) {
// Check for Telegram API documented types
if (!(type in update)) continue;
// Shortcut
if (SHORTCUTS[type]) type = SHORTCUTS[type];
// Set message type
props.type = type;
// Run message type mod
mod = this.modRun(type, {message: update, props});
update = mod.message;
props = mod.props;
promise = promise.then(() => mod.promise);
const eventList = [type];
if (!anyEventFlags[0]) {
eventList.push('*');
anyEventFlags[0] = true;
}
promise = promise.then(() => {
return this.event(eventList, update, props);
});
// Check for command
if (type === 'text') {
const match = REGEXP_COMMAND.exec(update.text);
if (!match) continue;
// Command found
props.type = 'command';
const eventList = ['/' + match[1]];
if (!anyEventFlags[1]) {
eventList.push(['/*']);
anyEventFlags[1] = true;
}
promise = promise.then(() => {
return this.event(eventList, update, props);
});
}
break;
}
return promise;
},
// Channel post
channel_post(update, props) {
return updateFunctions.message.call(this, update, props);
},
// Edited hannel post
edited_channel_post(update, props) {
return updateFunctions.message.call(this, update, props);
},
// Edited message
edited_message(update, props) {
return updateFunctions.message.call(this, update, props);
},
// Inline query
inline_query(update, props) {
props.type = 'inlineQuery';
return this.event('inlineQuery', update, props);
},
// Inline choice
chosen_inline_result(update, props) {
props.type = 'chosenInlineResult';
return this.event([props.type, 'inlineChoice'], update, props);
},
// Callback query
callback_query(update, props) {
props.type = 'callbackQuery';
return this.event('callbackQuery', update, props);
},
shipping_query(update, props) {
props.type = 'shippingQuery';
return this.event('shippingQuery', update, props);
},
pre_checkout_query(update, props) {
props.type = 'preShippingQuery';
return this.event('preShippingQuery', update, props);
}
};
module.exports = updateFunctions;