You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/3.start.md
+10-2Lines changed: 10 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,13 @@
1
1
## Начало работы
2
2
### ESP8266/ESP32
3
3
Библиотека нативно поддерживает МК ESPxx классом `FastBot2`:
4
+
4
5
```cpp
5
6
#include<FastBot2.h>
6
7
FastBot2 bot;
8
+
// FastBot2 bot("токен");
7
9
```
10
+
8
11
Для подключения к WiFi можно использовать типичную конструкцию:
9
12
10
13
```cpp
@@ -22,6 +25,7 @@ void setup() {
22
25
23
26
### Другие платформы
24
27
Библиотека работает напрямую с `Arduino Client` интерфейсом, поэтому можно подключить любую библиотеку, которая предоставляет к нему доступ (для Ethernet, GPRS и так далее). Для этого используется класс `FastBot2Client`:
28
+
25
29
```cpp
26
30
SomeClient client;
27
31
@@ -30,6 +34,7 @@ FastBot2Client bot(client);
30
34
```
31
35
32
36
Пример с [TinyGSM](https://github.com/vshymanskyy/TinyGSM):
37
+
33
38
```cpp
34
39
// обязательно нужен модем с поддержкой HTTPS
35
40
#define TINY_GSM_MODEM_SIM7000SSL
@@ -126,7 +131,7 @@ void setup() {
126
131
127
132
bot.setToken(BOT_TOKEN);
128
133
bot.onUpdate(update);
129
-
// bot.setPollMode(fb::Poll::Long, 30000);
134
+
// bot.setPollMode(fb::Poll::Long, 60000);
130
135
}
131
136
132
137
void loop() {
@@ -139,6 +144,7 @@ void loop() {
139
144
```cpp
140
145
bot.setPollMode(fb::Poll::Sync, 4000);
141
146
```
147
+
142
148
#### Обновление
143
149
Такой же режим, как в первой версии FastBot: библиотека запрашивает обновления и ждёт ответа внутри `tick()`. При плохой связи может "зависать" внутри `tick()` на ощутимое (не дольше таймаута) время. Ставить период меньше `4000` не рекомендуется - сервер Телеграм "накажет" долгим ответом за слишком частый опрос!
Самый правильный способ опроса - асинхронный *long polling*. Период можно ставить побольше - от 20 секунд. Библиотека отправляет запрос и получит ответ либо по указанному таймауту, либо по факту поступления новых сообщений в бота. Таймаут переподключения - по умолчанию 300мс. Это самый быстрый и безопасный способ получения обновлений, сообщения доставляются мгновенно.
Copy file name to clipboardExpand all lines: docs/4.updates.md
+17-15Lines changed: 17 additions & 15 deletions
Original file line number
Diff line number
Diff line change
@@ -1,13 +1,15 @@
1
1
## Разбор обновлений
2
2
Обновления попадают в подключенный обработчик:
3
+
3
4
```cpp
4
5
voidupdate(fb::Update& u) {
5
6
}
6
7
```
7
8
8
-
Каждый вызов этой функции - одно "сообщение" от бота. Здесь `fb::Update` - это класс, в котором удобно доступны самые основные инструменты для работы с ботом и с сообщениями, как в виде значений, так и в виде вложенных классов. В "ручном режиме" разбора JSON библиотека поддерживает весь Telegram Bot API и позволяет получать из обновлений все возможные данные.
9
+
Каждый вызов этой функции - одно "сообщение" от бота. Здесь `fb::Update` - это класс, в котором удобно доступны самые основные инструменты для работы с ботом и с сообщениями, как в виде значений, так и в виде вложенных классов. В "ручном режиме" разбора JSON библиотека поддерживает весь [Telegram Bot API](https://core.telegram.org/bots/api) и позволяет получать из обновлений все возможные данные.
9
10
10
11
Например выведем текст сообщения:
12
+
11
13
```cpp
12
14
void update(fb::Update& u) {
13
15
Serial.println(u.message().text());
@@ -21,7 +23,7 @@ void update(fb::Update& u) {
21
23
- Печататься в любой `Print` (например `Serial`)
22
24
- Сравниваться со строками любого типа
23
25
- Экспортироваться в любой тип данных
24
-
- Имеет встроенный декодер Unicode (для кириллицы и смайликов)
26
+
- Имеет декодер Unicode (для кириллицы и смайликов)
25
27
- Может посчитать свой хэш для быстрого сравнения строк
26
28
27
29
> Это очень мощный инструмент! Рекомендую изучить [полную документацию](https://github.com/GyverLibs/StringUtils?tab=readme-ov-file#sutext), чтобы знать все возможности и разбирать апдейты с удовольствием
@@ -35,9 +37,7 @@ void update(fb::Update& u) {
35
37
36
38
uint32_t id = u.message().id(); // вывод в число
37
39
38
-
// вывод в String с преобразованием юникода (кириллицы)
39
-
String text = u.message().text().decodeUnicode();
40
-
Serial.println(text);
40
+
Serial.println(u.message().text()); // печать
41
41
42
42
// пример с разбором callback query через хэш
43
43
switch (u.query().data().hash()) {
@@ -56,19 +56,16 @@ void update(fb::Update& u) {
56
56
57
57
> В примере с хэшем строка, указанная в `SH`, не существует в программе: вместо этого компилятор подставляет её хэш (число). А в `switch` мы подаём хэш пришедшей строки. Это позволяет максимально быстро, оптимально и очень удобно сравнивать строки в сценариях, когда приходящий текст может иметь известный набор значений. В данном случае - обработка query, очень типовая задача (определение кнопки клавиатуры, на которую нажал юзер).
58
58
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()`
64
60
65
61
### Личка с админом
66
62
Телеграм бот - публичная штука, любой пользователь может найти вашего бота в поиске и взаимодействовать с ним. Чтобы ограничить круг лиц (админов), которые могут работать с ботом (или иметь дополнительные функции), достаточно вручную фильтровать обновления по id юзера. Несколько способов:
63
+
67
64
```cpp
68
65
void update(fb::Update& u) {
69
66
// один админ
70
67
// Если не наш id - выходим
71
-
if (u.message().from().id() != 12345678ll) return;
68
+
if (u.message().from().id() != 12345678LL) return;
0 commit comments