Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed Sep 29, 2022
1 parent bbcfb13 commit dc3a155
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 6 deletions.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -763,7 +764,9 @@ void loop() {
}
```
### Пропуск "пропущенных" сообщений
### Пропуск "пропущенных" сообщений на основе времени
В библиотеке есть функция skipUpdates, позволяющая пропустить все непрочитанные сообщения. Но иногда бывает удобно ориентироваться по времени.
Если нужно проигнорировать сообщения, отправленные юзером в то время как бот был оффлайн (или выключен), то можно поступить так:
- Запомнить unix-время, когда бот вышел в онлайн
- Сравнивать время текущего сообщения с ним. Если оно меньше - игнорировать сообщение
Expand Down Expand Up @@ -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 - пропуск непрочитанных сообщений

<a id="feedback"></a>
## Баги и обратная связь
Expand Down
1 change: 1 addition & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ FB_DYNAMIC KEYWORD1
setChatID KEYWORD2
setPeriod KEYWORD2
setLimit KEYWORD2
skipUpdates KEYWORD2
attach KEYWORD2
detach KEYWORD2
tickManual KEYWORD2
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=FastBot
version=2.24
version=2.25
author=AlexGyver <[email protected]>
maintainer=AlexGyver <[email protected]>
sentence=Fast ESP8266/ESP32 library for Telegram bot (messages, menus, time sync, OTA update + SPIFFS, files upload and download)
Expand Down
18 changes: 15 additions & 3 deletions src/FastBot.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
v2.22: мелкая оптимизация, исправил ошибку компиляции при дефайне FB_NO_OTA
v2.23: пофиксил источник реального времени на editMessage
v2.24: фикс отправки больших файлов https://github.com/GyverLibs/FastBot/pull/17
v2.25: добавил skipUpdates - пропуск непрочитанных сообщений
*/

/*
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit dc3a155

Please sign in to comment.