Skip to content

Commit 2967df2

Browse files
committed
upd
1 parent 299f7c8 commit 2967df2

32 files changed

+2740
-2124
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
Любые Arduino
2222

2323
### Зависимости
24-
- [GSON](https://github.com/GyverLibs/GSON) v1.5+
25-
- [StringUtils](https://github.com/GyverLibs/StringUtils) v1.4.14+
26-
- [GyverHTTP](https://github.com/GyverLibs/GyverHTTP) v1.0.2+
27-
- [GTL](https://github.com/GyverLibs/GTL) v1.1.7+
24+
- [GSON](https://github.com/GyverLibs/GSON) v1.8.0+
25+
- [StringUtils](https://github.com/GyverLibs/StringUtils) v1.5.0+
26+
- [GyverHTTP](https://github.com/GyverLibs/GyverHTTP) v1.0.27+
27+
- [GTL](https://github.com/GyverLibs/GTL) v1.3.1+
2828

2929
## Содержание
3030
- [Документация](#docs)

docs/1.main.md

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ void setTimeout(uint16_t timeout);
3737
3838
// ============================== SYSTEM ==============================
3939
40+
// автоматически декодировать юникод в тексте (умолч. true)
41+
void decodeUCN(bool decode);
42+
4043
// установить токен
4144
void setToken(const String& token);
4245
@@ -331,7 +334,7 @@ Text id();
331334
Text threadID();
332335

333336
// сообщение отправлено в топик форума
334-
Text isTopic();
337+
bool isTopic();
335338

336339
// дата отправки или пересылки сообщения
337340
Text date();
@@ -419,6 +422,12 @@ ChatRead chat();
419422
```cpp
420423
// наследует gson::Entry
421424

425+
enum class Type {
426+
Empty,
427+
OK,
428+
Error,
429+
};
430+
422431
// освободить память
423432
void reset();
424433

@@ -427,6 +436,21 @@ StreamReader& getReader();
427436

428437
// получить скачанный json пакет как Text
429438
Text getRaw();
439+
440+
// тип результата
441+
Type type();
442+
443+
// результат - ошибка
444+
bool isError();
445+
446+
// результат пуст
447+
bool isEmpty();
448+
449+
// получить текст ошибки
450+
Text getError();
451+
452+
// получить код ошибки
453+
Text getErrorCode();
430454
```
431455
</details>
432456
<details>
@@ -485,7 +509,7 @@ Text lastName();
485509
Text description();
486510

487511
// в supergroup включены темы
488-
Text isForum();
512+
bool isForum();
489513
```
490514
</details>
491515
<details>
@@ -539,7 +563,7 @@ Text proximityAlertRadius();
539563
Text id();
540564

541565
// бот или нет
542-
Text isBot();
566+
bool isBot();
543567

544568
// имя
545569
Text firstName();
@@ -554,7 +578,7 @@ Text username();
554578
Text languageCode();
555579

556580
// true - премиум юзер
557-
Text isPremium();
581+
bool isPremium();
558582
```
559583
</details>
560584
<details>
@@ -590,7 +614,7 @@ Message();
590614
Message(const String& text, Value chatID);
591615

592616
// для ручного добавления тех параметров, которых нет в классе!
593-
gson::string json;
617+
gson::Str json;
594618

595619
// текст сообщения
596620
String text;
@@ -684,7 +708,7 @@ bool notification = Message::notificationDefault;
684708
bool protect = Message::protectDefault;
685709

686710
// для ручного добавления тех параметров, которых нет в классе!
687-
gson::string json;
711+
gson::Str json;
688712
```
689713
</details>
690714
<details>

docs/3.start.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
## Начало работы
22
### ESP8266/ESP32
33
Библиотека нативно поддерживает МК ESPxx классом `FastBot2`:
4+
45
```cpp
56
#include <FastBot2.h>
67
FastBot2 bot;
8+
// FastBot2 bot("токен");
79
```
10+
811
Для подключения к WiFi можно использовать типичную конструкцию:
912

1013
```cpp
@@ -22,6 +25,7 @@ void setup() {
2225

2326
### Другие платформы
2427
Библиотека работает напрямую с `Arduino Client` интерфейсом, поэтому можно подключить любую библиотеку, которая предоставляет к нему доступ (для Ethernet, GPRS и так далее). Для этого используется класс `FastBot2Client`:
28+
2529
```cpp
2630
SomeClient client;
2731

@@ -30,6 +34,7 @@ FastBot2Client bot(client);
3034
```
3135
3236
Пример с [TinyGSM](https://github.com/vshymanskyy/TinyGSM):
37+
3338
```cpp
3439
// обязательно нужен модем с поддержкой HTTPS
3540
#define TINY_GSM_MODEM_SIM7000SSL
@@ -126,7 +131,7 @@ void setup() {
126131

127132
bot.setToken(BOT_TOKEN);
128133
bot.onUpdate(update);
129-
// bot.setPollMode(fb::Poll::Long, 30000);
134+
// bot.setPollMode(fb::Poll::Long, 60000);
130135
}
131136

132137
void loop() {
@@ -139,6 +144,7 @@ void loop() {
139144
```cpp
140145
bot.setPollMode(fb::Poll::Sync, 4000);
141146
```
147+
142148
#### Обновление
143149
Такой же режим, как в первой версии FastBot: библиотека запрашивает обновления и ждёт ответа внутри `tick()`. При плохой связи может "зависать" внутри `tick()` на ощутимое (не дольше таймаута) время. Ставить период меньше `4000` не рекомендуется - сервер Телеграм "накажет" долгим ответом за слишком частый опрос!
144150

@@ -149,6 +155,7 @@ bot.setPollMode(fb::Poll::Sync, 4000);
149155
```cpp
150156
bot.setPollMode(fb::Poll::Async, 4000);
151157
```
158+
152159
#### Обновление
153160
"Асинхронный" режим - библиотека запросит обновления и обработает ответ, когда он придёт. Период опроса - такая же особенность, как в `Sync`.
154161

@@ -157,8 +164,9 @@ bot.setPollMode(fb::Poll::Async, 4000);
157164

158165
### `Long`
159166
```cpp
160-
bot.setPollMode(fb::Poll::Long, 30000);
167+
bot.setPollMode(fb::Poll::Long, 60000);
161168
```
169+
162170
#### Обновление
163171
Самый правильный способ опроса - асинхронный *long polling*. Период можно ставить побольше - от 20 секунд. Библиотека отправляет запрос и получит ответ либо по указанному таймауту, либо по факту поступления новых сообщений в бота. Таймаут переподключения - по умолчанию 300мс. Это самый быстрый и безопасный способ получения обновлений, сообщения доставляются мгновенно.
164172

docs/4.updates.md

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
## Разбор обновлений
22
Обновления попадают в подключенный обработчик:
3+
34
```cpp
45
void update(fb::Update& u) {
56
}
67
```
78
8-
Каждый вызов этой функции - одно "сообщение" от бота. Здесь `fb::Update` - это класс, в котором удобно доступны самые основные инструменты для работы с ботом и с сообщениями, как в виде значений, так и в виде вложенных классов. В "ручном режиме" разбора JSON библиотека поддерживает весь Telegram Bot API и позволяет получать из обновлений все возможные данные.
9+
Каждый вызов этой функции - одно "сообщение" от бота. Здесь `fb::Update` - это класс, в котором удобно доступны самые основные инструменты для работы с ботом и с сообщениями, как в виде значений, так и в виде вложенных классов. В "ручном режиме" разбора JSON библиотека поддерживает весь [Telegram Bot API](https://core.telegram.org/bots/api) и позволяет получать из обновлений все возможные данные.
910
1011
Например выведем текст сообщения:
12+
1113
```cpp
1214
void update(fb::Update& u) {
1315
Serial.println(u.message().text());
@@ -21,7 +23,7 @@ void update(fb::Update& u) {
2123
- Печататься в любой `Print` (например `Serial`)
2224
- Сравниваться со строками любого типа
2325
- Экспортироваться в любой тип данных
24-
- Имеет встроенный декодер Unicode (для кириллицы и смайликов)
26+
- Имеет декодер Unicode (для кириллицы и смайликов)
2527
- Может посчитать свой хэш для быстрого сравнения строк
2628

2729
> Это очень мощный инструмент! Рекомендую изучить [полную документацию](https://github.com/GyverLibs/StringUtils?tab=readme-ov-file#sutext), чтобы знать все возможности и разбирать апдейты с удовольствием
@@ -35,9 +37,7 @@ void update(fb::Update& u) {
3537

3638
uint32_t id = u.message().id(); // вывод в число
3739

38-
// вывод в String с преобразованием юникода (кириллицы)
39-
String text = u.message().text().decodeUnicode();
40-
Serial.println(text);
40+
Serial.println(u.message().text()); // печать
4141

4242
// пример с разбором callback query через хэш
4343
switch (u.query().data().hash()) {
@@ -56,19 +56,16 @@ void update(fb::Update& u) {
5656
5757
> В примере с хэшем строка, указанная в `SH`, не существует в программе: вместо этого компилятор подставляет её хэш (число). А в `switch` мы подаём хэш пришедшей строки. Это позволяет максимально быстро, оптимально и очень удобно сравнивать строки в сценариях, когда приходящий текст может иметь известный набор значений. В данном случае - обработка query, очень типовая задача (определение кнопки клавиатуры, на которую нажал юзер).
5858
59-
Удобного получения хэша сообщения с кириллицей не предусмотрено, можно получить его так:
60-
61-
```cpp
62-
size_t hash = SH(u.message().text().decodeUnicode().c_str()); // раскодировать и передать в хэш-функцию
63-
```
59+
> Начиная с версии `1.2.0` библиотека сама декодирует юникод (UCN). Если в каком-то стандартном поле остался юникод (текст вида `\uabcd` - пишите мне на почту, добавлю обработку). В остальных случаях декодировать юникод можно как `u.foo().decodeUnicode()`
6460
6561
### Личка с админом
6662
Телеграм бот - публичная штука, любой пользователь может найти вашего бота в поиске и взаимодействовать с ним. Чтобы ограничить круг лиц (админов), которые могут работать с ботом (или иметь дополнительные функции), достаточно вручную фильтровать обновления по id юзера. Несколько способов:
63+
6764
```cpp
6865
void update(fb::Update& u) {
6966
// один админ
7067
// Если не наш id - выходим
71-
if (u.message().from().id() != 12345678ll) return;
68+
if (u.message().from().id() != 12345678LL) return;
7269
7370
// несколько админов
7471
switch (u.message().from().id().toInt64()) {
@@ -189,13 +186,18 @@ void update(fb::Update& u) {
189186
void update(fb::Update& u) {
190187
Serial.println(u[tg_apih::text]);
191188
// "изнутри" этот код аналогичен u.message().text()
189+
190+
Serial.println(u[tg_apih::from][tg_apih::username]);
192191
}
193192
```
194193
194+
> Для корректного получения `bool` данных из `Text` нужно сравнивать его с `bool`, например `u[tg_apih::from][tg_apih::is_bot] == true`
195+
195196
Тип текущего обновления парсится библиотекой, его можно разобрать так:
196197
197198
```cpp
198199
void update(fb::Update& u) {
200+
// встроенные типы
199201
switch (u.type()) {
200202
case fb::Update::Type::Message:
201203
break;
@@ -206,7 +208,7 @@ void update(fb::Update& u) {
206208
// и так далее
207209
}
208210
209-
// или
211+
// или из hash api
210212
211213
switch ((size_t)u.type()) {
212214
case tg_apih::message:
@@ -251,7 +253,7 @@ void update(fb::Update& u) {
251253
u[tg_apih::text] == "1234";
252254

253255
// конвертация
254-
float v = u[tg_apih::text];
256+
float f = u[tg_apih::text];
255257

256258
// и так далее
257259
}
@@ -262,9 +264,9 @@ void update(fb::Update& u) {
262264
263265
```cpp
264266
void update(fb::Update& u) {
265-
Serial.println(u.message()[tg_apih::text]);
267+
Serial.println(u.message().chat()[tg_apih::id]);
266268
267269
// или получить значения, для которых в библиотеке не предусмотрено функций
268-
Serial.println(u.message()[tg_apih::is_from_offline]);
270+
Serial.println(u[tg_apih::is_from_offline]);
269271
}
270272
```

0 commit comments

Comments
 (0)