Skip to content

Commit 1b3e043

Browse files
committed
upd
1 parent 772105f commit 1b3e043

File tree

6 files changed

+182
-133
lines changed

6 files changed

+182
-133
lines changed

keywords.txt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
#######################################
88
FastBot KEYWORD1
99

10-
FB_Time LITERAL1
11-
FB_NO_UNICODE LITERAL1
12-
FB_NO_URLENCODE LITERAL1
10+
FB_NO_UNICODE KEYWORD1
11+
FB_NO_URLENCODE KEYWORD1
12+
FB_NO_OTA KEYWORD1
1313

1414
#######################################
1515
# Methods and Functions (KEYWORD2)
@@ -79,15 +79,19 @@ day KEYWORD2
7979
month KEYWORD2
8080
dayWeek KEYWORD2
8181
year KEYWORD2
82-
8382
timeString KEYWORD2
8483
dateString KEYWORD2
8584

8685
FB_unicode KEYWORD2
86+
FB_urlencode KEYWORD2
87+
FB_str64 KEYWORD2
88+
FB_64str KEYWORD2
8789

8890
#######################################
8991
# Constants (LITERAL1)
9092
#######################################
93+
FB_Time LITERAL1
94+
9195
FB_TEXT LITERAL1
9296
FB_MARKDOWN LITERAL1
9397
FB_HTML LITERAL1

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=FastBot
2-
version=2.13
2+
version=2.14
33
author=AlexGyver <[email protected]>
44
maintainer=AlexGyver <[email protected]>
55
sentence=Simple library for Telegram bot (messages and menus)

src/FastBot.h

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@
33
Документация:
44
GitHub: https://github.com/GyverLibs/FastBot
55
Возможности:
6-
- Работает на стандартных библиотеках
7-
- Работает без SSL
8-
- Оптимизирована для большой нагрузки
9-
- Опциональный белый список ID чатов
6+
- Работает на стандартных библиотеках без SSL
7+
- Опциональный "белый список" ID чатов
108
- Проверка обновлений вручную или по таймеру
119
- Отправка/удаление/редактирование/ответ на сообщения
12-
- Отправка стикеров
13-
- Вывод меню и инлайн меню (с поддержкой ссылок)
10+
- Работает (чтение и отправка) в чатах, группах, каналах
1411
- Изменение названия и описания чата
1512
- Закрепление/открепление сообщений
13+
- Отправка стикеров, отправка с форматированием markdown/html
14+
- Вывод обычного и инлайн меню с поддержкой кнопок-ссылок
1615
- Поддержка Unicode (другие языки + эмодзи) для входящих сообщений
1716
- Встроенный urlencode для исходящих сообщений
1817
- Встроенные часы реального времени с синхронизацией от сервера Telegram
19-
- Возможность OTA обновления прошивки файлом из чата Telegram
18+
- Возможность OTA обновления прошивки .bin файлом из чата Telegram
2019
2120
AlexGyver, [email protected]
2221
https://alexgyver.ru/
@@ -80,6 +79,7 @@
8079
- Окончательно убран старый обработчик входящих сообщений
8180
v2.12: поправлены примеры, исправлен парсинг isBot, переделан механизм защиты от длинных сообщений, переделана инициализация
8281
v2.13: Оптимизация памяти. Добавил OTA обновление
82+
v2.14: Улучшен парсинг строки с ID, добавил отключение OTA, добавил парсинг названия группы/канала в username
8383
*/
8484

8585
/*
@@ -107,19 +107,25 @@
107107
#include <Arduino.h>
108108
#include <StreamString.h>
109109
#include "utils.h"
110+
#include "datatypes.h"
110111

111112
#ifdef ESP8266
112113
#include <ESP8266WiFi.h>
113114
#include <ESP8266HTTPClient.h>
115+
#ifndef FB_NO_OTA
114116
#include <ESP8266httpUpdate.h>
117+
#endif
115118
#include <WiFiClientSecure.h>
116119
#include <WiFiClientSecureBearSSL.h>
117120
static BearSSL::WiFiClientSecure _FB_client;
118121
static HTTPClient _FB_http;
119-
#else
122+
123+
#else // ESP32
120124
#include <WiFi.h>
121125
#include <HTTPClient.h>
126+
#ifndef FB_NO_OTA
122127
#include <HTTPUpdate.h>
128+
#endif
123129
#include <WiFiClientSecure.h>
124130
WiFiClientSecure _FB_client;
125131
static HTTPClient _FB_http;
@@ -162,6 +168,10 @@ class FastBot {
162168
void setChatID(const String& chatID) {
163169
chatIDs = chatID;
164170
}
171+
void setChatID(int64_t id) {
172+
if (id) chatIDs = FB_64str(id);
173+
else chatIDs = "";
174+
}
165175

166176
void setToken(const String& token) {
167177
_token = token;
@@ -192,18 +202,21 @@ class FastBot {
192202
uint8_t tickManual() {
193203
if (!*_callback) return 7;
194204
String req;
205+
req.reserve(120);
195206
_addToken(req);
196207
req += F("/getUpdates?limit=");
197208
req += ovfFlag ? 1 : _limit; // берём по 1 сообщению если переполнен
198209
req += F("&offset=");
199210
req += ID;
211+
//req += F("&allowed_updates=[\"update_id\",\"message\",\"edited_message\",\"channel_post\",\"edited_channel_post\",\"callback_query\"]");
200212

201213
if (!_FB_http.begin(_FB_client, req)) return 4; // ошибка подключения
202214
if (_FB_http.GET() != HTTP_CODE_OK) {
203215
_FB_http.end();
204216
return 3; // ошибка сервера телеграм
205217
}
206218

219+
#ifndef FB_NO_OTA
207220
// была попытка OTA обновления. Обновляемся после ответа серверу!
208221
if (OTAstate >= 0) {
209222
String ota;
@@ -214,6 +227,7 @@ class FastBot {
214227
if (OTAstate == 2) ESP.restart();
215228
OTAstate = -1;
216229
}
230+
#endif
217231

218232
int size = _FB_http.getSize();
219233
ovfFlag = size > 25000; // 1 полное сообщение на русском языке или ~5 на английском
@@ -801,11 +815,17 @@ class FastBot {
801815
String chatID;
802816
find(str, chatID, textPos, F("\"chat\":{\"id\":"), ',', IDpos);
803817

818+
if (!first_name.length()) {
819+
int typePos = str.indexOf("\"type\"", textPos);
820+
find(str, first_name, textPos, F("\"title\":\""), '\"', IDpos);
821+
}
822+
804823
if (chatIDs.length() > 0 && chatIDs.indexOf(chatID) < 0) continue; // проверка на ID чата
805824

806825
String date;
807826
find(str, date, textPos, F("\"date\":"), ',', IDpos);
808827

828+
#ifndef FB_NO_OTA
809829
String file;
810830
if (_file_ptr) _file_ptr = nullptr;
811831
if (find(str, file, textPos, F("\"file_name\":\""), '\"', IDpos)) {
@@ -815,6 +835,7 @@ class FastBot {
815835
_otaID = chatID;
816836
}
817837
}
838+
#endif
818839

819840
// удаление сервисных сообщений
820841
if (clrSrv) {
@@ -875,6 +896,7 @@ class FastBot {
875896
_unix = buf.toInt();
876897
_lastUpd = millis();
877898
}
899+
#ifndef FB_NO_OTA
878900
if (find(answ, buf, st, F("\"file_path\":\""), '\"', answ.length())) {
879901
String url(F("https://api.telegram.org/file/bot"));
880902
url += _token;
@@ -890,6 +912,7 @@ class FastBot {
890912
OTAstate = httpUpdate.update(client, url);
891913
#endif
892914
}
915+
#endif
893916
}
894917

895918
void (*_callback)(FB_msg& msg) = nullptr;

src/datatypes.h

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
#pragma once
2+
#include <Arduino.h>
3+
4+
struct FB_msg {
5+
String& userID; // ID юзера
6+
String& username; // ник (в API это first_name)
7+
String& chatID; // ID чата
8+
int32_t messageID; // ID сообщения
9+
String& text; // текст
10+
String& data; // callback дата
11+
bool query; // запрос
12+
bool& edited; // сообщение отредактировано
13+
bool isBot; // сообщение от бота
14+
bool OTA; // запрос на OTA обновление
15+
uint32_t unix; // время сообщения
16+
17+
// legacy
18+
String& usrID; // ID юзера
19+
String& first_name; // имя
20+
String& last_name; // фамилия
21+
int32_t ID; // ID сообщения
22+
23+
// вся информация одной строкой
24+
String toString() {
25+
String s;
26+
s.reserve(200);
27+
s += F("userID: ");
28+
s += userID;
29+
s += F(", username: ");
30+
s += username;
31+
s += '\n';
32+
33+
s += F("chatID: ");
34+
s += chatID;
35+
s += F(", messageID: ");
36+
s += messageID;
37+
s += '\n';
38+
39+
s += F("text: ");
40+
s += text;
41+
s += F(", data: ");
42+
s += data;
43+
s += '\n';
44+
45+
s += F("query: ");
46+
s += query;
47+
s += F(", edited: ");
48+
s += edited;
49+
s += F(", isBot: ");
50+
s += isBot;
51+
s += F(", OTA: ");
52+
s += OTA;
53+
s += F(", unix: ");
54+
s += unix;
55+
s += '\n';
56+
return s;
57+
}
58+
};
59+
60+
struct FB_Time {
61+
FB_Time(uint32_t unix = 0, int16_t gmt = 0) {
62+
if (!unix) return;
63+
if (abs(gmt) <= 12) gmt *= 60;
64+
unix += gmt * 60L;
65+
second = unix % 60ul;
66+
unix /= 60ul;
67+
minute = unix % 60ul;
68+
unix /= 60ul;
69+
hour = unix % 24ul;
70+
unix /= 24ul;
71+
dayWeek = (unix + 4) % 7;
72+
if (!dayWeek) dayWeek = 7;
73+
unix += 719468;
74+
uint8_t era = unix / 146097ul;
75+
uint16_t doe = unix - era * 146097ul;
76+
uint16_t yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
77+
year = yoe + era * 400;
78+
uint16_t doy = doe - (yoe * 365 + yoe / 4 - yoe / 100);
79+
uint16_t mp = (doy * 5 + 2) / 153;
80+
day = doy - (mp * 153 + 2) / 5 + 1;
81+
month = mp + (mp < 10 ? 3 : -9);
82+
year += (month <= 2);
83+
}
84+
85+
uint8_t second = 0;
86+
uint8_t minute = 0;
87+
uint8_t hour = 0;
88+
uint8_t day = 0;
89+
uint8_t month = 0;
90+
uint8_t dayWeek = 0;
91+
uint16_t year = 0;
92+
93+
// получить строку времени формата ЧЧ:ММ:СС
94+
String timeString() {
95+
String str;
96+
if (!year) return str = F("Not sync");
97+
str.reserve(8);
98+
if (hour < 10) str += '0';
99+
str += hour;
100+
str += ':';
101+
if (minute < 10) str += '0';
102+
str += minute;
103+
str += ':';
104+
if (second < 10) str += '0';
105+
str += second;
106+
return str;
107+
}
108+
109+
// получить строку даты формата ДД.ММ.ГГГГ
110+
String dateString() {
111+
String str;
112+
if (!year) return str = F("Not sync");
113+
str.reserve(10);
114+
if (day < 10) str += '0';
115+
str += day;
116+
str += '.';
117+
if (month < 10) str += '0';
118+
str += month;
119+
str += '.';
120+
str += year;
121+
return str;
122+
}
123+
};

src/utils.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
#include "utils.h"
22

3+
int64_t FB_str64(const String &s) {
4+
return atoll(s.c_str());
5+
}
6+
String FB_64str(int64_t id) {
7+
String s;
8+
int32_t s1 = (int64_t)id % 1000000000;
9+
int32_t s2 = (int64_t)id / 1000000000;
10+
if (s2) {
11+
s += s2;
12+
s += abs(s1);
13+
} else {
14+
s += s1;
15+
}
16+
return s;
17+
}
18+
319
// упрощённый urlencode (до 38 ASCII + space)
420
// по хорошему нужно пропускать только a-Z, 0-9 и -_.!~*'()
521
void FB_urlencode(const String& s, String& dest) {

0 commit comments

Comments
 (0)