| //+------------------------------------------------------------------+
|
| //| Events.mqh |
|
| //| Copyright 2026, Niquel Mendoza. |
|
| //| https://www.mql5.com |
|
| //+------------------------------------------------------------------+
|
| #property copyright "Copyright 2026, Niquel Mendoza."
|
| #property link "https://www.mql5.com"
|
| #property strict
|
|
|
|
|
| #ifndef TELEGRAMBYLEO_SRC_EVENTS_EVENTS_MQH
|
| #define TELEGRAMBYLEO_SRC_EVENTS_EVENTS_MQH
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| #include "Def.mqh"
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| namespace TSN
|
| {
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| class CTelegramBotUpdater
|
| {
|
| private:
|
| //---
|
| CJsonBuilder m_js_builder;
|
| CJsonParser m_json;
|
|
|
| //--- token/url propios (independiente de CTelegramBot)
|
| string m_token;
|
| string m_url_method;
|
|
|
| //---
|
| int m_timeout;
|
| long m_update_id;
|
|
|
| //---
|
| int m_last_res_web;
|
| ENUM_TELEGRAMBYLEO_ERR m_last_err;
|
|
|
| //---
|
| JsonBuilderSnapshot m_update_snap;
|
|
|
| //--- Handlers: array de punteros + size explicito, uno por evento
|
| CTelegramHandler* m_on_message[];
|
| int m_on_message_size;
|
|
|
| CTelegramHandler* m_on_edited_message[];
|
| int m_on_edited_message_size;
|
|
|
| CTelegramHandler* m_on_channel_post[];
|
| int m_on_channel_post_size;
|
|
|
| CTelegramHandler* m_on_edited_channel_post[];
|
| int m_on_edited_channel_post_size;
|
|
|
| CTelegramHandler* m_on_business_connection[];
|
| int m_on_business_connection_size;
|
|
|
| CTelegramHandler* m_on_business_message[];
|
| int m_on_business_message_size;
|
|
|
| CTelegramHandler* m_on_edited_business_message[];
|
| int m_on_edited_business_message_size;
|
|
|
| CTelegramHandler* m_on_deleted_business_messages[];
|
| int m_on_deleted_business_messages_size;
|
|
|
| CTelegramHandler* m_on_guest_message[];
|
| int m_on_guest_message_size;
|
|
|
| CTelegramHandler* m_on_message_reaction[];
|
| int m_on_message_reaction_size;
|
|
|
| CTelegramHandler* m_on_message_reaction_count[];
|
| int m_on_message_reaction_count_size;
|
|
|
| CTelegramHandler* m_on_inline_query[];
|
| int m_on_inline_query_size;
|
|
|
| CTelegramHandler* m_on_chosen_inline_result[];
|
| int m_on_chosen_inline_result_size;
|
|
|
| CTelegramHandler* m_on_callback_query[];
|
| int m_on_callback_query_size;
|
|
|
| CTelegramHandler* m_on_shipping_query[];
|
| int m_on_shipping_query_size;
|
|
|
| CTelegramHandler* m_on_pre_checkout_query[];
|
| int m_on_pre_checkout_query_size;
|
|
|
| CTelegramHandler* m_on_purchased_paid_media[];
|
| int m_on_purchased_paid_media_size;
|
|
|
| CTelegramHandler* m_on_poll[];
|
| int m_on_poll_size;
|
|
|
| CTelegramHandler* m_on_poll_answer[];
|
| int m_on_poll_answer_size;
|
|
|
| CTelegramHandler* m_on_my_chat_member[];
|
| int m_on_my_chat_member_size;
|
|
|
| CTelegramHandler* m_on_chat_member[];
|
| int m_on_chat_member_size;
|
|
|
| CTelegramHandler* m_on_chat_join_request[];
|
| int m_on_chat_join_request_size;
|
|
|
| CTelegramHandler* m_on_chat_boost[];
|
| int m_on_chat_boost_size;
|
|
|
| CTelegramHandler* m_on_removed_chat_boost[];
|
| int m_on_removed_chat_boost_size;
|
|
|
| CTelegramHandler* m_on_managed_bot[];
|
| int m_on_managed_bot_size;
|
|
|
| CTelegramHandler* m_on_subscription[];
|
| int m_on_subscription_size;
|
|
|
| CTelegramHandler* m_on_stopped_message_generation[];
|
| int m_on_stopped_message_generation_size;
|
|
|
| //--- Helper compartido por Unregister*
|
| void RemoveFromArrayFast(CTelegramHandler* &array[], int &size, CTelegramHandler* &ptr);
|
|
|
| //---
|
| ulong m_next_events_f;
|
| void ApplyFlags();
|
|
|
| //---
|
| int m_timeout_long;
|
|
|
| public:
|
| CTelegramBotUpdater(void);
|
| ~CTelegramBotUpdater(void) {}
|
|
|
| //--- token
|
| bool Token(string _token);
|
| __forceinline string Token() const { return m_token; }
|
|
|
| //--- Init
|
| // 0 quiere decir auto
|
| __forceinline void AllowedUpdates(ulong flags = 0);
|
| void Init(int timeout_long = -1, bool start_with_clean_chat = true);
|
|
|
| //--- Last
|
| __forceinline ENUM_TELEGRAMBYLEO_ERR LastErr() const { return m_last_err; }
|
| int LastResHttp() const { return m_last_res_web; }
|
|
|
| //--- Timeout
|
| __forceinline int Timeout() const { return m_timeout; }
|
| void Timeout(int v) { m_timeout = v; }
|
|
|
| //--- Registro / de-registro
|
| void RegisterEvents(CTelegramHandler* ptr, uint flags);
|
| void UnregisterEvents(CTelegramHandler* ptr, uint flags);
|
| void RegisterEvent(CTelegramHandler* ptr, const ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE event);
|
| void UnregisterEvent(CTelegramHandler* ptr, const ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE event);
|
|
|
| //--- polling
|
| bool GetUpdates();
|
| };
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| CTelegramBotUpdater::CTelegramBotUpdater()
|
| // reservamos solo 48 chars mas que sufiente no hace falta 1000+ defualt que noramlte se ahce..
|
| : m_token(NULL), m_js_builder(48), m_update_id(-1), m_timeout(5000), m_last_err(TELEGRAMBYLEO_ERR_NOT), m_timeout_long(-1),
|
|
|
| //--- ahora los size
|
| m_on_message_size(0), m_on_edited_message_size(0), m_on_channel_post_size(0), m_on_edited_channel_post_size(0),
|
| m_on_business_connection_size(0), m_on_business_message_size(0), m_on_edited_business_message_size(0),
|
| m_on_deleted_business_messages_size(0), m_on_guest_message_size(0), m_on_message_reaction_size(0),
|
| m_on_message_reaction_count_size(0), m_on_inline_query_size(0), m_on_chosen_inline_result_size(0),
|
| m_on_callback_query_size(0), m_on_shipping_query_size(0), m_on_pre_checkout_query_size(0),
|
| m_on_purchased_paid_media_size(0), m_on_poll_size(0), m_on_poll_answer_size(0), m_on_my_chat_member_size(0),
|
| m_on_chat_member_size(0), m_on_chat_join_request_size(0), m_on_chat_boost_size(0), m_on_removed_chat_boost_size(0),
|
| m_on_managed_bot_size(0), m_on_subscription_size(0), m_on_stopped_message_generation_size(0)
|
| {
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| bool CTelegramBotUpdater::Token(string _token)
|
| {
|
| //---
|
| StringTrimRight(_token);
|
| StringTrimLeft(_token);
|
| if(_token == "")
|
| {
|
| m_last_err = TELEGRAMBYLEO_ERR_TOKEN_EMPTY;
|
| return false;
|
| }
|
|
|
| //---
|
| m_token = _token;
|
| m_url_method = TELEGRAMBYLEO_BASE_URL + "/bot" + m_token + "/" + TELEGRAMBYLEO_ENDPOINT_GETUPDATES;
|
| return true;
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::Init(int timeout_long = -1, bool start_with_clean_chat = true)
|
| {
|
| //--- long poll por ahora no inicialemnte.. solo llenamos
|
| m_timeout_long = timeout_long;
|
| //---
|
| m_update_id = -1;
|
|
|
| //---
|
| m_js_builder.Clear();
|
| m_js_builder.Obj();
|
|
|
| //--
|
| if(start_with_clean_chat)
|
| {
|
| m_js_builder.KeyWV("offset").Val(-1);
|
| m_js_builder.KeyWV("limit").Val(1);
|
| }
|
| else
|
| {
|
| m_js_builder.KeyWV("offset").Val(0);
|
| }
|
|
|
| //---
|
| m_js_builder.EndObj();
|
| m_js_builder.Truncate();
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::ApplyFlags(void)
|
| {
|
| //---
|
| m_js_builder.Clear();
|
| m_js_builder.Obj();
|
|
|
| //---
|
| if(m_timeout_long != -1)
|
| m_js_builder.KeyWV("timeout").Val(m_timeout_long);
|
|
|
| //---
|
| m_js_builder.KeyWV("allowed_updates").Arr();
|
| while(m_next_events_f)
|
| {
|
| const ulong flag = TSNTABLES_BIT_DEJAR_SOLO_MINUS_SIG_BYTE(m_next_events_f);
|
| const char pos = TSNTABLES_CTZ_64_GET_BIT(flag);
|
| m_js_builder.ValSWV(g_tlgbyleo_getupt_kstr[pos]);
|
| m_next_events_f &= (m_next_events_f - 1);
|
| }
|
| m_js_builder.EndArr();
|
| m_js_builder.KeyWV("offset");
|
| m_js_builder.GetSnapshot(m_update_snap);
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::AllowedUpdates(ulong flags)
|
| {
|
| //--- calculo
|
| if(flags)
|
| m_next_events_f = flags;
|
| else
|
| {
|
| // Aqui repasamos: solo pedimos los eventos que tengan al menos un handler registrado
|
| m_next_events_f |= m_on_message_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_MESSAGE : 0;
|
| m_next_events_f |= m_on_edited_message_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_EDITED_MESSAGE : 0;
|
| m_next_events_f |= m_on_channel_post_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_CHANNEL_POST : 0;
|
| m_next_events_f |= m_on_edited_channel_post_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_EDITED_CHANNEL_POST : 0;
|
| m_next_events_f |= m_on_business_connection_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_BUSINESS_CONNECTION : 0;
|
| m_next_events_f |= m_on_business_message_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_BUSINESS_MESSAGE : 0;
|
| m_next_events_f |= m_on_edited_business_message_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_EDITED_BUSINESS_MESSAGE : 0;
|
| m_next_events_f |= m_on_deleted_business_messages_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_DELETED_BUSINESS_MESSAGES : 0;
|
| m_next_events_f |= m_on_guest_message_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_GUEST_MESSAGE : 0;
|
| m_next_events_f |= m_on_message_reaction_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_MESSAGE_REACTION : 0;
|
| m_next_events_f |= m_on_message_reaction_count_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_MESSAGE_REACTION_COUNT : 0;
|
| m_next_events_f |= m_on_inline_query_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_INLINE_QUERY : 0;
|
| m_next_events_f |= m_on_chosen_inline_result_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_CHOSEN_INLINE_RESULT : 0;
|
| m_next_events_f |= m_on_callback_query_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_CALLBACK_QUERY : 0;
|
| m_next_events_f |= m_on_shipping_query_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_SHIPPING_QUERY : 0;
|
| m_next_events_f |= m_on_pre_checkout_query_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_PRE_CHECKOUT_QUERY : 0;
|
| m_next_events_f |= m_on_purchased_paid_media_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_PURCHASED_PAID_MEDIA : 0;
|
| m_next_events_f |= m_on_poll_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_POLL : 0;
|
| m_next_events_f |= m_on_poll_answer_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_POLL_ANSWER : 0;
|
| m_next_events_f |= m_on_my_chat_member_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_MY_CHAT_MEMBER : 0;
|
| m_next_events_f |= m_on_chat_member_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_CHAT_MEMBER : 0;
|
| m_next_events_f |= m_on_chat_join_request_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_CHAT_JOIN_REQUEST : 0;
|
| m_next_events_f |= m_on_chat_boost_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_CHAT_BOOST : 0;
|
| m_next_events_f |= m_on_removed_chat_boost_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_REMOVED_CHAT_BOOST : 0;
|
| m_next_events_f |= m_on_managed_bot_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_MANAGED_BOT : 0;
|
| m_next_events_f |= m_on_subscription_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_SUBSCRIPTION : 0;
|
| m_next_events_f |= m_on_stopped_message_generation_size > 0 ? TELEGRAMBYLEO_REG_FLAG_ON_STOPPED_MESSAGE_GENERATION : 0;
|
| }
|
|
|
| //---
|
| if(m_update_id == -1) // aun no comenzo asi que es seugor
|
| return;
|
| ApplyFlags();
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Registro |
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::RegisterEvents(CTelegramHandler* ptr, uint flags)
|
| {
|
| while(flags)
|
| {
|
| const uint flag_real = TSNTABLES_BIT_DEJAR_SOLO_MINUS_SIG_BYTE(flags);
|
| const ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE event = (ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE)TSNTABLES_CTZ_32_GET_BIT(flag_real);
|
| RegisterEvent(ptr, event);
|
| flags &= ~flag_real;
|
| }
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::RegisterEvent(CTelegramHandler* ptr, const ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE event)
|
| {
|
| switch(event)
|
| {
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_message, m_on_message_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_MESSAGE:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_edited_message, m_on_edited_message_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_CHANNEL_POST:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_channel_post, m_on_channel_post_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_CHANNEL_POST:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_edited_channel_post, m_on_edited_channel_post_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_BUSINESS_CONNECTION:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_business_connection, m_on_business_connection_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_BUSINESS_MESSAGE:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_business_message, m_on_business_message_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_BUSINESS_MESSAGE:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_edited_business_message, m_on_edited_business_message_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_DELETED_BUSINESS_MESSAGES:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_deleted_business_messages, m_on_deleted_business_messages_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_GUEST_MESSAGE:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_guest_message, m_on_guest_message_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE_REACTION:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_message_reaction, m_on_message_reaction_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE_REACTION_COUNT:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_message_reaction_count, m_on_message_reaction_count_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_INLINE_QUERY:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_inline_query, m_on_inline_query_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_CHOSEN_INLINE_RESULT:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_chosen_inline_result, m_on_chosen_inline_result_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_CALLBACK_QUERY:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_callback_query, m_on_callback_query_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_SHIPPING_QUERY:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_shipping_query, m_on_shipping_query_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_PRE_CHECKOUT_QUERY:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_pre_checkout_query, m_on_pre_checkout_query_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_PURCHASED_PAID_MEDIA:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_purchased_paid_media, m_on_purchased_paid_media_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_POLL:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_poll, m_on_poll_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_POLL_ANSWER:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_poll_answer, m_on_poll_answer_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_MY_CHAT_MEMBER:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_my_chat_member, m_on_my_chat_member_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_MEMBER:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_chat_member, m_on_chat_member_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_JOIN_REQUEST:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_chat_join_request, m_on_chat_join_request_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_BOOST:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_chat_boost, m_on_chat_boost_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_REMOVED_CHAT_BOOST:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_removed_chat_boost, m_on_removed_chat_boost_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_MANAGED_BOT:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_managed_bot, m_on_managed_bot_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_SUBSCRIPTION:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_subscription, m_on_subscription_size, ptr)
|
| break;
|
| }
|
| case TELEGRAMBYLEO_GETUPT_K_STOPPED_MESSAGE_GENERATION:
|
| {
|
| TELEGRAMBYLEO_EVENTS_ADD_NEWEL(m_on_stopped_message_generation, m_on_stopped_message_generation_size, ptr)
|
| break;
|
| }
|
|
|
| //---
|
| default:
|
| break;
|
| }
|
| }
|
|
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::UnregisterEvents(CTelegramHandler* ptr, uint flags)
|
| {
|
| while(flags)
|
| {
|
| const uint flag_real = TSNTABLES_BIT_DEJAR_SOLO_MINUS_SIG_BYTE(flags);
|
| const ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE event = (ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE)TSNTABLES_CTZ_32_GET_BIT(flag_real);
|
| UnregisterEvent(ptr, event);
|
| flags &= ~flag_real;
|
| }
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::UnregisterEvent(CTelegramHandler* ptr, const ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE event)
|
| {
|
| switch(event)
|
| {
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE:
|
| RemoveFromArrayFast(m_on_message, m_on_message_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_MESSAGE:
|
| RemoveFromArrayFast(m_on_edited_message, m_on_edited_message_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHANNEL_POST:
|
| RemoveFromArrayFast(m_on_channel_post, m_on_channel_post_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_CHANNEL_POST:
|
| RemoveFromArrayFast(m_on_edited_channel_post, m_on_edited_channel_post_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_BUSINESS_CONNECTION:
|
| RemoveFromArrayFast(m_on_business_connection, m_on_business_connection_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_BUSINESS_MESSAGE:
|
| RemoveFromArrayFast(m_on_business_message, m_on_business_message_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_BUSINESS_MESSAGE:
|
| RemoveFromArrayFast(m_on_edited_business_message, m_on_edited_business_message_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_DELETED_BUSINESS_MESSAGES:
|
| RemoveFromArrayFast(m_on_deleted_business_messages, m_on_deleted_business_messages_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_GUEST_MESSAGE:
|
| RemoveFromArrayFast(m_on_guest_message, m_on_guest_message_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE_REACTION:
|
| RemoveFromArrayFast(m_on_message_reaction, m_on_message_reaction_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE_REACTION_COUNT:
|
| RemoveFromArrayFast(m_on_message_reaction_count, m_on_message_reaction_count_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_INLINE_QUERY:
|
| RemoveFromArrayFast(m_on_inline_query, m_on_inline_query_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHOSEN_INLINE_RESULT:
|
| RemoveFromArrayFast(m_on_chosen_inline_result, m_on_chosen_inline_result_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CALLBACK_QUERY:
|
| RemoveFromArrayFast(m_on_callback_query, m_on_callback_query_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_SHIPPING_QUERY:
|
| RemoveFromArrayFast(m_on_shipping_query, m_on_shipping_query_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_PRE_CHECKOUT_QUERY:
|
| RemoveFromArrayFast(m_on_pre_checkout_query, m_on_pre_checkout_query_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_PURCHASED_PAID_MEDIA:
|
| RemoveFromArrayFast(m_on_purchased_paid_media, m_on_purchased_paid_media_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_POLL:
|
| RemoveFromArrayFast(m_on_poll, m_on_poll_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_POLL_ANSWER:
|
| RemoveFromArrayFast(m_on_poll_answer, m_on_poll_answer_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MY_CHAT_MEMBER:
|
| RemoveFromArrayFast(m_on_my_chat_member, m_on_my_chat_member_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_MEMBER:
|
| RemoveFromArrayFast(m_on_chat_member, m_on_chat_member_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_JOIN_REQUEST:
|
| RemoveFromArrayFast(m_on_chat_join_request, m_on_chat_join_request_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_BOOST:
|
| RemoveFromArrayFast(m_on_chat_boost, m_on_chat_boost_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_REMOVED_CHAT_BOOST:
|
| RemoveFromArrayFast(m_on_removed_chat_boost, m_on_removed_chat_boost_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MANAGED_BOT:
|
| RemoveFromArrayFast(m_on_managed_bot, m_on_managed_bot_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_SUBSCRIPTION:
|
| RemoveFromArrayFast(m_on_subscription, m_on_subscription_size, ptr);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_STOPPED_MESSAGE_GENERATION:
|
| RemoveFromArrayFast(m_on_stopped_message_generation, m_on_stopped_message_generation_size, ptr);
|
| break;
|
|
|
| //---
|
| default:
|
| break;
|
| }
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Funcion de utildiad para remover |
|
| //+------------------------------------------------------------------+
|
| void CTelegramBotUpdater::RemoveFromArrayFast(CTelegramHandler* &array[], int &size, CTelegramHandler* &ptr)
|
| {
|
| for(int i = 0; i < size; i++)
|
| {
|
| if(array[i] == ptr)
|
| {
|
| array[i] = array[size - 1];
|
| ArrayResize(array, (--size));
|
| return;
|
| }
|
| }
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| bool CTelegramBotUpdater::GetUpdates(void)
|
| {
|
| //--- Get
|
| static string result_headers;
|
|
|
| //---
|
| #ifdef TELEGRAMBYLEO_EVENTS_DEBUG_PRINT
|
| Print("send: ");
|
| Print(CharArrayToString(m_js_builder.m_buf, 0, m_js_builder.m_pos));
|
| #endif // TELEGRAMBYLEO_EVENTS_DEBUG_PRINT
|
| m_last_res_web = WebRequest("POST", m_url_method, "Content-Type: application/json\r\n", m_timeout,
|
| m_js_builder.m_buf, m_json.m_raw, result_headers);
|
| if(m_last_res_web != 200)
|
| {
|
| m_last_err = TELEGRAMBYLEO_ERR_WEB_REQ;
|
| return false;
|
| }
|
|
|
| #ifdef TELEGRAMBYLEO_EVENTS_DEBUG_PRINT
|
| Print("recv: ");
|
| Print(CharArrayToString(m_json.m_raw, 0, ArraySize(m_json.m_raw)));
|
| #endif // TELEGRAMBYLEO_EVENTS_DEBUG_PRINT
|
|
|
| //--- Parsing
|
| m_json.CalcLen();
|
| m_json.CorrectPadding();
|
| if(!m_json.Parse())
|
| {
|
| m_last_err = TELEGRAMBYLEO_ERR_JSON_PARSING;
|
| return false;
|
| }
|
|
|
| //---
|
| CJsonNode root = m_json.GetRoot();
|
| if(!root["ok"].ToBool(false))
|
| {
|
| m_last_err = TELEGRAMBYLEO_ERR_JSON_NOT_OK;
|
| return false;
|
| }
|
| const int res_size = root["result"].Size();
|
|
|
| //---
|
| if(m_update_id == -1) // aun nada primer get que hacemos
|
| {
|
| //--- tratamos de obtener...
|
| if(res_size > 0) // solo si es 0 obtemoes..
|
| m_update_id = root["result"].At(0)["update_id"].ToInt(-1);
|
|
|
| //---
|
| // si no tiene valor tendra un valor de -1 luego se incremnte a 0
|
|
|
| //--- json inicial
|
| ApplyFlags();
|
| }
|
| else
|
| {
|
| //---
|
| if(res_size < 1)
|
| return true; // nada, minimo un valor para poder iterar
|
|
|
| //--- caso ya comun
|
| CJsonIteratorArray it = root["result"].BeginArr();
|
|
|
| //---
|
| //m_json.PrintCintaTypes(0, WHOLE_ARRAY);
|
|
|
| //---
|
| // ya caliente
|
| while(it.IsValid()) // iteramos por cada Update
|
| {
|
| CJsonIteratorObj val = it.Val().BeginObj();
|
| // En cada objeto Update iteramos por cada par key-value
|
| while(val.IsValid())
|
| {
|
| //---
|
| ulong h;
|
| if(!val.Key().KeyHashFVN1A64(h)) // falo al obtener, continuamso
|
| {
|
| val.Next();
|
| continue;
|
| }
|
| const ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE idx = CEnumRegTlgLeo::GetValH<ENUM_TELEGRAMBYLEO_GETUPT_KEYVALUE>(h, WRONG_VALUE); // perfect hash
|
|
|
| //---
|
| CJsonNode obj_val = val.Val();
|
| switch(idx)
|
| {
|
| case TELEGRAMBYLEO_GETUPT_K_UPDATEID:
|
| m_update_id = obj_val.ToInt(0);
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_message, m_on_message_size, OnMessage, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_MESSAGE:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_edited_message, m_on_edited_message_size, OnEditedMessage, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHANNEL_POST:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_channel_post, m_on_channel_post_size, OnChannelPost, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_CHANNEL_POST:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_edited_channel_post, m_on_edited_channel_post_size, OnEditedChannelPost, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_BUSINESS_CONNECTION:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_business_connection, m_on_business_connection_size, OnBusinessConnection, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_BUSINESS_MESSAGE:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_business_message, m_on_business_message_size, OnBusinessMessage, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_EDITED_BUSINESS_MESSAGE:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_edited_business_message, m_on_edited_business_message_size, OnEditedBusinessMessage, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_DELETED_BUSINESS_MESSAGES:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_deleted_business_messages, m_on_deleted_business_messages_size, OnDeletedBusinessMessages, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_GUEST_MESSAGE:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_guest_message, m_on_guest_message_size, OnGuestMessage, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE_REACTION:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_message_reaction, m_on_message_reaction_size, OnMessageReaction, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MESSAGE_REACTION_COUNT:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_message_reaction_count, m_on_message_reaction_count_size, OnMessageReactionCount, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_INLINE_QUERY:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_inline_query, m_on_inline_query_size, OnInlineQuery, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHOSEN_INLINE_RESULT:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_chosen_inline_result, m_on_chosen_inline_result_size, OnChosenInlineResult, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CALLBACK_QUERY:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_callback_query, m_on_callback_query_size, OnCallbackQuery, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_SHIPPING_QUERY:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_shipping_query, m_on_shipping_query_size, OnShippingQuery, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_PRE_CHECKOUT_QUERY:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_pre_checkout_query, m_on_pre_checkout_query_size, OnPreCheckoutQuery, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_PURCHASED_PAID_MEDIA:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_purchased_paid_media, m_on_purchased_paid_media_size, OnPurchasedPaidMedia, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_POLL:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_poll, m_on_poll_size, OnPoll, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_POLL_ANSWER:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_poll_answer, m_on_poll_answer_size, OnPollAnswer, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MY_CHAT_MEMBER:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_my_chat_member, m_on_my_chat_member_size, OnMyChatMember, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_MEMBER:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_chat_member, m_on_chat_member_size, OnChatMember, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_JOIN_REQUEST:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_chat_join_request, m_on_chat_join_request_size, OnChatJoinRequest, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_CHAT_BOOST:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_chat_boost, m_on_chat_boost_size, OnChatBoost, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_REMOVED_CHAT_BOOST:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_removed_chat_boost, m_on_removed_chat_boost_size, OnRemovedChatBoost, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_MANAGED_BOT:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_managed_bot, m_on_managed_bot_size, OnManagedBot, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_SUBSCRIPTION:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_subscription, m_on_subscription_size, OnSubscription, obj_val)
|
| break;
|
| case TELEGRAMBYLEO_GETUPT_K_STOPPED_MESSAGE_GENERATION:
|
| TELEGRAMBYLEO_EVENTS_NOTIFY(m_on_stopped_message_generation, m_on_stopped_message_generation_size, OnStoppedMessageGeneration, obj_val)
|
| break;
|
|
|
| //---
|
| default:
|
| break;
|
| }
|
|
|
| //---
|
| val.Next();
|
| }
|
|
|
| //---
|
| it.Next();
|
| }
|
|
|
| //--- rollback
|
| m_js_builder.ApplySnapshot(m_update_snap);
|
| }
|
|
|
| //---
|
| m_update_id++;
|
|
|
| //---
|
| m_js_builder.Val(m_update_id);
|
| m_js_builder.EndObj();
|
| m_js_builder.Truncate();
|
|
|
| //---
|
| return true;
|
| }
|
| }
|
| //+------------------------------------------------------------------+
|
| #endif // TELEGRAMBYLEO_SRC_EVENTS_EVENTS_MQH
|