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/4.updates.md
+90-9Lines changed: 90 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -56,6 +56,12 @@ 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
+
```
64
+
59
65
### Личка с админом
60
66
Телеграм бот - публичная штука, любой пользователь может найти вашего бота в поиске и взаимодействовать с ним. Чтобы ограничить круг лиц (админов), которые могут работать с ботом (или иметь дополнительные функции), достаточно вручную фильтровать обновления по id юзера. Несколько способов:
61
67
```cpp
@@ -94,6 +100,7 @@ void update(fb::Update& u) {
94
100
95
101
### Переполнение стека
96
102
При создании больших программ с большим количеством кода внутри обработчика обновлений на esp8266 можно столкнуться с исключением (перезагрузка МК) по причине `core panic` или `stack smashed`, это происходит по причине переполнения стека памяти (на esp32 он выделен в два раза больше и получить это исключение практически невозможно). Проблема особенно хорошо проявляется при скачивании файлов внутри обработчика обновлений и наличии большого количества другого кода. Для избежания случайных перезагрузок рекомендуется разделять обработчик на несколько функций, это также позволит лучше структурировать программу и разделять на файлы/блоки:
103
+
97
104
```cpp
98
105
// обработка сообщений
99
106
void uMessage(fb::Update& u) {
@@ -119,51 +126,125 @@ void setup() {
119
126
}
120
127
```
121
128
129
+
Также можно разбить функцию разбора обновлений на лямбды:
130
+
131
+
```cpp
132
+
voidupdate(fb::Update& u) {
133
+
[&](){
134
+
// блок 1
135
+
}();
136
+
137
+
[&](){
138
+
// блок 2
139
+
}();
140
+
}
141
+
```
142
+
143
+
Или использовать встроенный макрос:
144
+
145
+
```cpp
146
+
void update(fb::Update& u) {
147
+
FB_SUB_BEGIN
148
+
// блок 1
149
+
150
+
FB_SUB_NEXT
151
+
// блок 2
152
+
153
+
FB_SUB_NEXT
154
+
// блок 3
155
+
156
+
FB_SUB_END
157
+
}
158
+
```
159
+
122
160
## Разбор вручную
123
161
Для работы напрямую с API Telegram вам понадобится [официальная документация](https://core.telegram.org/bots/api).
124
162
125
-
Класс `Update`, а также все вложенные классы (`User`, `Message`...) имеют доступ к `gson::Entry` пакета (документация [здесь](https://github.com/GyverLibs/GSON?tab=readme-ov-file#gsonentry)), который представляет собой распарсенный JSON пакет с хэшированными ключами. FastBot2 в свою очередь хранит хэши всех команд API Telegram (имеют префикс `tg_apih`). Поэтому для получения доступа ко всему содержимому нужно обратиться к объекту через квадратные скобки с хэшем. Например, для получения текста сообщения код будет такой:
163
+
Класс `Update`, а также все вложенные классы (`User`, `Message`...) имеют доступ к `gson::Entry` пакета (документация [здесь](https://github.com/GyverLibs/GSON?tab=readme-ov-file#gsonentry)), который представляет собой распарсенный JSON пакет с хэшированными ключами. FastBot2 в свою очередь хранит хэши всех команд API Telegram (имеют префикс `tg_apih`).
164
+
165
+
Объект класса `Update` является JSON объектом, который содержит непосредственно данные обновления. То есть для апдейта типа `"message"` это будет его содержимое, например (ответ сервера Telegram):
166
+
167
+
```json
168
+
{
169
+
"ok": true,
170
+
"result": [
171
+
{
172
+
"update_id": 1234653458,
173
+
"message": { <- вот это Update
174
+
"message_id": 178,
175
+
"from": {
176
+
},
177
+
"chat": {
178
+
},
179
+
"text": "123321"
180
+
}
181
+
}
182
+
]
183
+
}
184
+
```
185
+
186
+
Для получения доступа к содержимому нужно обратиться к объекту через квадратные скобки с хэшем. Например, для получения текста сообщения код будет такой:
// "изнутри" этот код аналогичен u.message().text()
130
192
}
131
193
```
132
194
195
+
Тип текущего обновления парсится библиотекой, его можно разобрать так:
196
+
197
+
```cpp
198
+
void update(fb::Update& u) {
199
+
switch (u.type()) {
200
+
case fb::Update::Type::Message:
201
+
break;
202
+
203
+
case fb::Update::Type::ChannelPost:
204
+
break;
205
+
206
+
// и так далее
207
+
}
208
+
}
209
+
```
210
+
133
211
Для проверки наличия в текущем обновлении или вложенном объекте нужно информации нужно использовать `has`, чтобы обезопасить программу от чтения несуществующих данных:
0 commit comments