Skip to content

Commit 326969d

Browse files
committed
upd
1 parent 7f4ef23 commit 326969d

File tree

13 files changed

+177
-72
lines changed

13 files changed

+177
-72
lines changed

docs/1.main.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,24 @@ fb::Result sendFile(const fb::File& m, bool wait = true);
143143
// редактировать файл
144144
fb::Result editFile(const fb::FileEdit& m, bool wait = true);
145145
146-
// скачать файл
146+
// получить прямую ссылку на файл
147+
String getFileLink(Text fileID);
148+
149+
// получить путь к файлу относительно корня api
150+
String getFilePath(Text fileID);
151+
152+
// обновить прошивку из файла, указать id юзера для отправки уведомления
153+
void updateFlash(fb::DocumentRead document, Text user_id = "");
154+
155+
// обновить FS из файла, указать id юзера для отправки уведомления
156+
void updateFS(fb::DocumentRead document, Text user_id = "");
157+
158+
// скачать файл по id
147159
fb::Fetcher downloadFile(const Text& fileID);
148160
161+
// скачать файл
162+
fb::Fetcher downloadFile(fb::DocumentRead document);
163+
149164
// ============================== SET ==============================
150165
151166
// отправить статус "набирает сообщение" на 5 секунд

docs/3.start.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,15 @@ void loop() {
9090
}
9191
```
9292
93-
> Разбор обновлений описан в следующей главе документации
93+
Подробнее разбор обновлений описан в следующей главе документации
94+
95+
> Указатель на текущий объект FastBot (тот, который вызвал коллбэк) можно получить из переменной `fb::Core* fb::thisBot`. Кастовать его в нужный класс и использовать:
96+
97+
```cpp
98+
void update(fb::Update& u) {
99+
static_cast<FastBot2*>(fb::thisBot)->sendMessage(...);
100+
}
101+
```
94102

95103
### Минимальный код (для esp)
96104
```cpp

docs/4.updates.md

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,6 @@ void update(fb::Update& u) {
1414
}
1515
```
1616

17-
> Указатель на текущий объект FastBot (тот, который вызвал коллбэк) можно получить из переменной `fb::Core* fb::thisBot`. Кастовать его в нужный класс и использовать:
18-
19-
```cpp
20-
void update(fb::Update& u) {
21-
static_cast<FastBot2*>(fb::thisBot)->sendMessage(...);
22-
}
23-
```
24-
2517
Отличие FastBot2 состоит в том, что библиотека не разбирает пакет обновления по отдельным переменным: данные извлекаются в момент обращения к ним. Это сильно быстрее и расходует в сотни раз меньше памяти.
2618

2719
### Тип данных Text
@@ -49,20 +41,20 @@ void update(fb::Update& u) {
4941

5042
// пример с разбором callback query через хэш
5143
switch (u.query().data().hash()) {
52-
case su::SH("abc123"):
44+
case SH("abc123"):
5345
// ....
5446
break;
55-
case su::SH("hfghfgh"):
47+
case SH("hfghfgh"):
5648
// ....
5749
break;
58-
case su::SH("test222"):
50+
case SH("test222"):
5951
// ....
6052
break;
6153
}
6254
}
6355
```
6456
65-
> В примере с хэшем строка, указанная в `su::SH`, не существует в программе: вместо этого компилятор подставляет её хэш (число). А в `switch` мы подаём хэш пришедшей строки. Это позволяет максимально быстро, оптимально и очень удобно сравнивать строки в сценариях, когда приходящий текст может иметь известный набор значений. В данном случае - обработка query, очень типовая задача (определение кнопки клавиатуры, на которую нажал юзер).
57+
> В примере с хэшем строка, указанная в `SH`, не существует в программе: вместо этого компилятор подставляет её хэш (число). А в `switch` мы подаём хэш пришедшей строки. Это позволяет максимально быстро, оптимально и очень удобно сравнивать строки в сценариях, когда приходящий текст может иметь известный набор значений. В данном случае - обработка query, очень типовая задача (определение кнопки клавиатуры, на которую нажал юзер).
6658
6759
### Личка с админом
6860
Телеграм бот - публичная штука, любой пользователь может найти вашего бота в поиске и взаимодействовать с ним. Чтобы ограничить круг лиц (админов), которые могут работать с ботом (или иметь дополнительные функции), достаточно вручную фильтровать обновления по id юзера. Несколько способов:

docs/6.menu.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ void update(fb::Update& u) {
8989
9090
// быстрое "сравнение" строк и поиск нужной даты
9191
switch (u.query().data().hash()) {
92-
case su::SH("data1"):
92+
case SH("data1"):
9393
// ...
9494
break;
95-
case su::SH("data2"):
95+
case SH("data2"):
9696
// ...
9797
break;
98-
case su::SH("data3"):
98+
case SH("data3"):
9999
// ...
100100
break;
101101
}

docs/7.files.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ void update(fb::Update& u) {
5353
```
5454
> После успешного OTA обновления МК дождётся следующего Update обновления от сервера, принудительно пропустит сообщение с файлом прошивки и сам перезагрузится!
5555
56+
### OTA обновление
57+
Есть второй способ OTA обновления, менее требовательный к памяти. Описанный выше способ вызывает обновление из обработчика, а лучше делать это из loop. При получении файла с обновлением нужно вызвать `updateFlash` или `updateFS` (для файловой системы), передав файл из сообщения и по желанию ID юзера, которому будет отправлено уведомление об окончании обновления. Это может быть тот же юзер, который отправил файл, например:
58+
59+
```cpp
60+
void updateh(fb::Update& u) {
61+
if (u.message().hasDocument() && u.message().document().name().endsWith(".bin")) {
62+
bot.updateFlash(u.message().document(), u.message().chat().id());
63+
}
64+
}
65+
```
66+
67+
Библиотека запомнит файл и запустит обновление из следующего вызова tick, указанный юзер получит сообщение, а после успешного обновления esp автоматически перезагрузится.
68+
5669
### Отправка файлов
5770
Файл можно отправить 4-мя способами:
5871
- Из файла файловой системы (esp8266/esp32)

examples/test/test.ino

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void handleCommand(fb::Update& u) {
5858
Text chat_id = u.message().chat().id();
5959

6060
switch (u.message().text().hash()) {
61-
case su::SH("/start"): {
61+
case SH("/start"): {
6262
// установить команды
6363
// в конструкторе
6464
fb::MyCommands commands("help;settings", "Помощь;Настройки");
@@ -94,7 +94,7 @@ void handleCommand(fb::Update& u) {
9494
bot.sendMessage(msg);
9595
} break;
9696

97-
case su::SH("/send_msg"): {
97+
case SH("/send_msg"): {
9898
// вариант 1
9999
bot.sendMessage(fb::Message("Some text", chat_id));
100100

@@ -105,7 +105,7 @@ void handleCommand(fb::Update& u) {
105105
// bot.sendMessage(msg);
106106
} break;
107107

108-
case su::SH("/send_menu"): {
108+
case SH("/send_menu"): {
109109
fb::Message msg("Send menu", chat_id);
110110

111111
// меню, вариант 1
@@ -124,7 +124,7 @@ void handleCommand(fb::Update& u) {
124124
bot.sendMessage(msg);
125125
} break;
126126

127-
case su::SH("/send_inline_menu"): {
127+
case SH("/send_inline_menu"): {
128128
fb::Message msg("Send inline menu", chat_id);
129129

130130
// inline menu, вариант 1
@@ -145,7 +145,7 @@ void handleCommand(fb::Update& u) {
145145
bot.sendMessage(msg);
146146
} break;
147147

148-
case su::SH("/file_txt"): {
148+
case SH("/file_txt"): {
149149
char str[] = "hello text v1";
150150
fb::File f("file.txt", fb::File::Type::document, (uint8_t*)str, strlen(str));
151151
f.chatID = chat_id;
@@ -160,7 +160,7 @@ void handleCommand(fb::Update& u) {
160160
// }
161161
} break;
162162

163-
case su::SH("/file_txt_p"): {
163+
case SH("/file_txt_p"): {
164164
fb::File f("file.txt", fb::File::Type::document, (const uint8_t*)lorem_p, sizeof(lorem_p), true);
165165
f.chatID = chat_id;
166166
loopStart();
@@ -176,7 +176,7 @@ void handleCommand(fb::Update& u) {
176176
// }
177177
} break;
178178

179-
case su::SH("/file_txt_file_1kb"): {
179+
case SH("/file_txt_file_1kb"): {
180180
File file = LittleFS.open("/lorem_1kb.txt", "r");
181181
fb::File f("file_1kb.txt", fb::File::Type::document, file);
182182
f.chatID = chat_id;
@@ -185,7 +185,7 @@ void handleCommand(fb::Update& u) {
185185
loopPrint();
186186
} break;
187187

188-
case su::SH("/file_txt_file_50kb"): {
188+
case SH("/file_txt_file_50kb"): {
189189
File file = LittleFS.open("/lorem_50kb.txt", "r");
190190
fb::File f("file_50kb.txt", fb::File::Type::document, file);
191191
f.chatID = chat_id;
@@ -194,15 +194,15 @@ void handleCommand(fb::Update& u) {
194194
loopPrint();
195195
} break;
196196

197-
case su::SH("/file_img_p"): {
197+
case SH("/file_img_p"): {
198198
fb::File f("bot.png", fb::File::Type::photo, image_p, sizeof(image_p), true);
199199
f.chatID = chat_id;
200200
loopStart();
201201
bot.sendFile(f, false);
202202
loopPrint();
203203
} break;
204204

205-
case su::SH("/file_img_url"): {
205+
case SH("/file_img_url"): {
206206
fb::File f("file.txt", fb::File::Type::document, "https://upload.wikimedia.org/wikipedia/ru/6/61/Rickrolling.gif");
207207
f.chatID = chat_id;
208208
loopStart();
@@ -264,15 +264,19 @@ void handleDocument(fb::Update& u) {
264264
bot.sendMessage(fb::Message("OTA begin", u.message().chat().id()), true);
265265

266266
// между downloadFile и updateFlash/updateFS/writeTo не должно быть отправки сообщений!
267-
fb::Fetcher fetch = bot.downloadFile(u.message().document().id());
268-
if (fetch) {
269-
if (fetch.updateFlash()) {
270-
Serial.println("OTA done");
271-
bot.sendMessage(fb::Message("OTA done", u.message().chat().id()), true);
272-
} else {
273-
Serial.println("OTA error");
274-
bot.sendMessage(fb::Message("OTA error", u.message().chat().id()), true);
275-
}
267+
// OTA обновление тип 1
268+
bot.updateFlash(u.message().document(), u.message().chat().id());
269+
270+
// OTA обновление тип 2
271+
// fb::Fetcher fetch = bot.downloadFile(u.message().document().id());
272+
// if (fetch) {
273+
// if (fetch.updateFlash()) {
274+
// Serial.println("OTA done");
275+
// bot.sendMessage(fb::Message("OTA done", u.message().chat().id()), true);
276+
// } else {
277+
// Serial.println("OTA error");
278+
// bot.sendMessage(fb::Message("OTA error", u.message().chat().id()), true);
279+
// }
276280
}
277281
} else {
278282
// это просто файл, выведем содержимое

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=FastBot2
2-
version=1.0.4
2+
version=1.0.5
33
author=AlexGyver <[email protected]>
44
maintainer=AlexGyver <[email protected]>
55
sentence=Fast and universal Arduino/ESP8266/ESP32 library for Telegram bot

src/FastBot2Client.h

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -66,32 +66,26 @@ class FastBot2Client : public fb::Core {
6666
return sendPacket(p, wait);
6767
}
6868

69+
// обновить прошивку из файла, указать id юзера для отправки уведомления
70+
void updateFlash(fb::DocumentRead document, Text user_id = "") {
71+
_ota = ota_t::Flash;
72+
document.id().toString(_ota_id);
73+
user_id.toString(_ota_user);
74+
}
75+
76+
// обновить FS из файла, указать id юзера для отправки уведомления
77+
void updateFS(fb::DocumentRead document, Text user_id = "") {
78+
_ota = ota_t::FS;
79+
document.id().toString(_ota_id);
80+
user_id.toString(_ota_user);
81+
}
82+
6983
// скачать файл
70-
fb::Fetcher downloadFile(const Text& fileID) {
71-
FB_ESP_YIELD();
72-
StreamReader reader;
73-
String path;
74-
path.reserve(30);
75-
{
76-
FB_LOG("getFile");
77-
fb::Packet p(tg_cmd::getFile, _token);
78-
p[tg_api::file_id] = fileID;
79-
80-
fb::Result res = sendPacket(p, true);
81-
FB_ESP_YIELD();
82-
if (res.has(tg_apih::file_id) && res[tg_apih::file_id] == fileID) {
83-
res[tg_apih::file_path].toString(path);
84-
}
85-
}
86-
87-
if (path.length()) {
88-
FB_LOG("download file");
89-
fb::Packet p(path, _token);
90-
reader = sendPacket(p, true).getReader();
91-
FB_ESP_YIELD();
92-
}
93-
return fb::Fetcher(&_reboot, reader);
84+
fb::Fetcher downloadFile(fb::DocumentRead document) {
85+
return fb::Core::downloadFile(document.id());
9486
}
87+
88+
using fb::Core::downloadFile;
9589
#endif
9690

9791
// ============================== SET ==============================

src/core/api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#define FB_BOT_API_VERSION "7.4"
66

7-
#define FB_MAKE_HASH(x) constexpr size_t x = su::SH(#x);
7+
#define FB_MAKE_HASH(x) constexpr size_t x = SH(#x);
88
#define FB_MAKE_EXTERN(x) extern const __FlashStringHelper* x;
99

1010
namespace tg_api {

0 commit comments

Comments
 (0)