From dc3a155365c0f6bb237fa15203f9f88a9554766d Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 29 Sep 2022 20:20:21 +0300 Subject: [PATCH] upd --- README.md | 8 ++++++-- keywords.txt | 1 + library.properties | 2 +- src/FastBot.h | 18 +++++++++++++++--- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8fa7a7e..3ae707f 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,8 @@ void setChatID(int64_t id); // то же самое, но в void setPeriod(int period); // период опроса в мс (по умолч. 3500) void setLimit(int limit); // кол-во сообщений, которое обрабатывается за один запрос, 1..100. (по умолч. 10) void setBufferSizes(uint16_t rx, uint16_t tx); // установить размеры буфера на приём и отправку, по умолч. 512 и 512 байт (только для esp8266) - +void skipUpdates(); // пропустить непрочитанные сообщения + void setTextMode(uint8_t mode); // режим текста "для отправки": FB_TEXT, FB_MARKDOWN, FB_HTML (см. пример textMode) void notify(bool mode); // true/false вкл/выкл уведомления от сообщений бота (по умолч. вкл) void clearServiceMessages(bool state); // удалять из чата сервисные сообщения о смене названия и закреплении сообщений (умолч. false) @@ -763,7 +764,9 @@ void loop() { } ``` -### Пропуск "пропущенных" сообщений +### Пропуск "пропущенных" сообщений на основе времени +В библиотеке есть функция skipUpdates, позволяющая пропустить все непрочитанные сообщения. Но иногда бывает удобно ориентироваться по времени. + Если нужно проигнорировать сообщения, отправленные юзером в то время как бот был оффлайн (или выключен), то можно поступить так: - Запомнить unix-время, когда бот вышел в онлайн - Сравнивать время текущего сообщения с ним. Если оно меньше - игнорировать сообщение @@ -864,6 +867,7 @@ void newMsg(FB_msg& msg) { - v2.22: мелкая оптимизация, исправил ошибку компиляции при дефайне FB_NO_OTA - v2.23: пофиксил источник реального времени на editMessage - v2.24: фикс отправки больших файлов https://github.com/GyverLibs/FastBot/pull/17 +- v2.25: добавил skipUpdates - пропуск непрочитанных сообщений ## Баги и обратная связь diff --git a/keywords.txt b/keywords.txt index 5e85108..5ca7a59 100644 --- a/keywords.txt +++ b/keywords.txt @@ -19,6 +19,7 @@ FB_DYNAMIC KEYWORD1 setChatID KEYWORD2 setPeriod KEYWORD2 setLimit KEYWORD2 +skipUpdates KEYWORD2 attach KEYWORD2 detach KEYWORD2 tickManual KEYWORD2 diff --git a/library.properties b/library.properties index cf60bf8..a08ac26 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=FastBot -version=2.24 +version=2.25 author=AlexGyver maintainer=AlexGyver sentence=Fast ESP8266/ESP32 library for Telegram bot (messages, menus, time sync, OTA update + SPIFFS, files upload and download) diff --git a/src/FastBot.h b/src/FastBot.h index a9274a7..3d1e235 100644 --- a/src/FastBot.h +++ b/src/FastBot.h @@ -97,6 +97,7 @@ v2.22: мелкая оптимизация, исправил ошибку компиляции при дефайне FB_NO_OTA v2.23: пофиксил источник реального времени на editMessage v2.24: фикс отправки больших файлов https://github.com/GyverLibs/FastBot/pull/17 + v2.25: добавил skipUpdates - пропуск непрочитанных сообщений */ /* @@ -199,9 +200,15 @@ class FastBot { else chatIDs = ""; } + // установить токен void setToken(const String& token) { _token = token; } + + // пропустить непрочитанные сообщения + void skipUpdates() { + ID = -1; + } // подключение обработчика сообщений void attach(void (*handler)(FB_msg& msg)) { @@ -1109,16 +1116,21 @@ class FastBot { uint8_t parseMessages(const String& str) { if (!str.startsWith(F("{\"ok\":true"))) return 3; // ошибка запроса (неправильный токен итд) int16_t IDpos = str.indexOf(F("{\"update_id\":"), 0); // первая позиция ключа update_id - + if (IDpos < 0) { + if (ID < 0) ID = 0; + return 1; + } int16_t counter = 0; while (true) { if (IDpos < 0 || IDpos == (int16_t)str.length()) break; - if (ID == 0) ID = str.substring(IDpos + 13, str.indexOf(',', IDpos)).toInt() + 1; // холодный запуск, ищем ID - else counter++; // иначе считаем пакеты + bool skip = (ID == -1); + if (!counter) ID = str.substring(IDpos + 13, str.indexOf(',', IDpos)).toInt() + 1; + else counter++; // иначе считаем пакеты int16_t textPos = IDpos; // стартовая позиция для поиска IDpos = str.indexOf(F("{\"update_id\":"), IDpos + 1); // позиция id СЛЕДУЮЩЕГО обновления (мы всегда на шаг впереди) if (IDpos < 0) IDpos = str.length(); // если конец пакета - для удобства считаем что позиция ID в конце + if (skip) continue; String query; int16_t queryEnd = 0;