151 lines
4.2 KiB
JavaScript
151 lines
4.2 KiB
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;
|