-
Notifications
You must be signed in to change notification settings - Fork 31
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
182 additions
and
133 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
name=FastBot | ||
version=2.13 | ||
version=2.14 | ||
author=AlexGyver <[email protected]> | ||
maintainer=AlexGyver <[email protected]> | ||
sentence=Simple library for Telegram bot (messages and menus) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,20 +3,19 @@ | |
Документация: | ||
GitHub: https://github.com/GyverLibs/FastBot | ||
Возможности: | ||
- Работает на стандартных библиотеках | ||
- Работает без SSL | ||
- Оптимизирована для большой нагрузки | ||
- Опциональный белый список ID чатов | ||
- Работает на стандартных библиотеках без SSL | ||
- Опциональный "белый список" ID чатов | ||
- Проверка обновлений вручную или по таймеру | ||
- Отправка/удаление/редактирование/ответ на сообщения | ||
- Отправка стикеров | ||
- Вывод меню и инлайн меню (с поддержкой ссылок) | ||
- Работает (чтение и отправка) в чатах, группах, каналах | ||
- Изменение названия и описания чата | ||
- Закрепление/открепление сообщений | ||
- Отправка стикеров, отправка с форматированием markdown/html | ||
- Вывод обычного и инлайн меню с поддержкой кнопок-ссылок | ||
- Поддержка Unicode (другие языки + эмодзи) для входящих сообщений | ||
- Встроенный urlencode для исходящих сообщений | ||
- Встроенные часы реального времени с синхронизацией от сервера Telegram | ||
- Возможность OTA обновления прошивки файлом из чата Telegram | ||
- Возможность OTA обновления прошивки .bin файлом из чата Telegram | ||
AlexGyver, [email protected] | ||
https://alexgyver.ru/ | ||
|
@@ -80,6 +79,7 @@ | |
- Окончательно убран старый обработчик входящих сообщений | ||
v2.12: поправлены примеры, исправлен парсинг isBot, переделан механизм защиты от длинных сообщений, переделана инициализация | ||
v2.13: Оптимизация памяти. Добавил OTA обновление | ||
v2.14: Улучшен парсинг строки с ID, добавил отключение OTA, добавил парсинг названия группы/канала в username | ||
*/ | ||
|
||
/* | ||
|
@@ -107,19 +107,25 @@ | |
#include <Arduino.h> | ||
#include <StreamString.h> | ||
#include "utils.h" | ||
#include "datatypes.h" | ||
|
||
#ifdef ESP8266 | ||
#include <ESP8266WiFi.h> | ||
#include <ESP8266HTTPClient.h> | ||
#ifndef FB_NO_OTA | ||
#include <ESP8266httpUpdate.h> | ||
#endif | ||
#include <WiFiClientSecure.h> | ||
#include <WiFiClientSecureBearSSL.h> | ||
static BearSSL::WiFiClientSecure _FB_client; | ||
static HTTPClient _FB_http; | ||
#else | ||
|
||
#else // ESP32 | ||
#include <WiFi.h> | ||
#include <HTTPClient.h> | ||
#ifndef FB_NO_OTA | ||
#include <HTTPUpdate.h> | ||
#endif | ||
#include <WiFiClientSecure.h> | ||
WiFiClientSecure _FB_client; | ||
static HTTPClient _FB_http; | ||
|
@@ -162,6 +168,10 @@ class FastBot { | |
void setChatID(const String& chatID) { | ||
chatIDs = chatID; | ||
} | ||
void setChatID(int64_t id) { | ||
if (id) chatIDs = FB_64str(id); | ||
else chatIDs = ""; | ||
} | ||
|
||
void setToken(const String& token) { | ||
_token = token; | ||
|
@@ -192,18 +202,21 @@ class FastBot { | |
uint8_t tickManual() { | ||
if (!*_callback) return 7; | ||
String req; | ||
req.reserve(120); | ||
_addToken(req); | ||
req += F("/getUpdates?limit="); | ||
req += ovfFlag ? 1 : _limit; // берём по 1 сообщению если переполнен | ||
req += F("&offset="); | ||
req += ID; | ||
//req += F("&allowed_updates=[\"update_id\",\"message\",\"edited_message\",\"channel_post\",\"edited_channel_post\",\"callback_query\"]"); | ||
|
||
if (!_FB_http.begin(_FB_client, req)) return 4; // ошибка подключения | ||
if (_FB_http.GET() != HTTP_CODE_OK) { | ||
_FB_http.end(); | ||
return 3; // ошибка сервера телеграм | ||
} | ||
|
||
#ifndef FB_NO_OTA | ||
// была попытка OTA обновления. Обновляемся после ответа серверу! | ||
if (OTAstate >= 0) { | ||
String ota; | ||
|
@@ -214,6 +227,7 @@ class FastBot { | |
if (OTAstate == 2) ESP.restart(); | ||
OTAstate = -1; | ||
} | ||
#endif | ||
|
||
int size = _FB_http.getSize(); | ||
ovfFlag = size > 25000; // 1 полное сообщение на русском языке или ~5 на английском | ||
|
@@ -801,11 +815,17 @@ class FastBot { | |
String chatID; | ||
find(str, chatID, textPos, F("\"chat\":{\"id\":"), ',', IDpos); | ||
|
||
if (!first_name.length()) { | ||
int typePos = str.indexOf("\"type\"", textPos); | ||
find(str, first_name, textPos, F("\"title\":\""), '\"', IDpos); | ||
} | ||
|
||
if (chatIDs.length() > 0 && chatIDs.indexOf(chatID) < 0) continue; // проверка на ID чата | ||
|
||
String date; | ||
find(str, date, textPos, F("\"date\":"), ',', IDpos); | ||
|
||
#ifndef FB_NO_OTA | ||
String file; | ||
if (_file_ptr) _file_ptr = nullptr; | ||
if (find(str, file, textPos, F("\"file_name\":\""), '\"', IDpos)) { | ||
|
@@ -815,6 +835,7 @@ class FastBot { | |
_otaID = chatID; | ||
} | ||
} | ||
#endif | ||
|
||
// удаление сервисных сообщений | ||
if (clrSrv) { | ||
|
@@ -875,6 +896,7 @@ class FastBot { | |
_unix = buf.toInt(); | ||
_lastUpd = millis(); | ||
} | ||
#ifndef FB_NO_OTA | ||
if (find(answ, buf, st, F("\"file_path\":\""), '\"', answ.length())) { | ||
String url(F("https://api.telegram.org/file/bot")); | ||
url += _token; | ||
|
@@ -890,6 +912,7 @@ class FastBot { | |
OTAstate = httpUpdate.update(client, url); | ||
#endif | ||
} | ||
#endif | ||
} | ||
|
||
void (*_callback)(FB_msg& msg) = nullptr; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
#pragma once | ||
#include <Arduino.h> | ||
|
||
struct FB_msg { | ||
String& userID; // ID юзера | ||
String& username; // ник (в API это first_name) | ||
String& chatID; // ID чата | ||
int32_t messageID; // ID сообщения | ||
String& text; // текст | ||
String& data; // callback дата | ||
bool query; // запрос | ||
bool& edited; // сообщение отредактировано | ||
bool isBot; // сообщение от бота | ||
bool OTA; // запрос на OTA обновление | ||
uint32_t unix; // время сообщения | ||
|
||
// legacy | ||
String& usrID; // ID юзера | ||
String& first_name; // имя | ||
String& last_name; // фамилия | ||
int32_t ID; // ID сообщения | ||
|
||
// вся информация одной строкой | ||
String toString() { | ||
String s; | ||
s.reserve(200); | ||
s += F("userID: "); | ||
s += userID; | ||
s += F(", username: "); | ||
s += username; | ||
s += '\n'; | ||
|
||
s += F("chatID: "); | ||
s += chatID; | ||
s += F(", messageID: "); | ||
s += messageID; | ||
s += '\n'; | ||
|
||
s += F("text: "); | ||
s += text; | ||
s += F(", data: "); | ||
s += data; | ||
s += '\n'; | ||
|
||
s += F("query: "); | ||
s += query; | ||
s += F(", edited: "); | ||
s += edited; | ||
s += F(", isBot: "); | ||
s += isBot; | ||
s += F(", OTA: "); | ||
s += OTA; | ||
s += F(", unix: "); | ||
s += unix; | ||
s += '\n'; | ||
return s; | ||
} | ||
}; | ||
|
||
struct FB_Time { | ||
FB_Time(uint32_t unix = 0, int16_t gmt = 0) { | ||
if (!unix) return; | ||
if (abs(gmt) <= 12) gmt *= 60; | ||
unix += gmt * 60L; | ||
second = unix % 60ul; | ||
unix /= 60ul; | ||
minute = unix % 60ul; | ||
unix /= 60ul; | ||
hour = unix % 24ul; | ||
unix /= 24ul; | ||
dayWeek = (unix + 4) % 7; | ||
if (!dayWeek) dayWeek = 7; | ||
unix += 719468; | ||
uint8_t era = unix / 146097ul; | ||
uint16_t doe = unix - era * 146097ul; | ||
uint16_t yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; | ||
year = yoe + era * 400; | ||
uint16_t doy = doe - (yoe * 365 + yoe / 4 - yoe / 100); | ||
uint16_t mp = (doy * 5 + 2) / 153; | ||
day = doy - (mp * 153 + 2) / 5 + 1; | ||
month = mp + (mp < 10 ? 3 : -9); | ||
year += (month <= 2); | ||
} | ||
|
||
uint8_t second = 0; | ||
uint8_t minute = 0; | ||
uint8_t hour = 0; | ||
uint8_t day = 0; | ||
uint8_t month = 0; | ||
uint8_t dayWeek = 0; | ||
uint16_t year = 0; | ||
|
||
// получить строку времени формата ЧЧ:ММ:СС | ||
String timeString() { | ||
String str; | ||
if (!year) return str = F("Not sync"); | ||
str.reserve(8); | ||
if (hour < 10) str += '0'; | ||
str += hour; | ||
str += ':'; | ||
if (minute < 10) str += '0'; | ||
str += minute; | ||
str += ':'; | ||
if (second < 10) str += '0'; | ||
str += second; | ||
return str; | ||
} | ||
|
||
// получить строку даты формата ДД.ММ.ГГГГ | ||
String dateString() { | ||
String str; | ||
if (!year) return str = F("Not sync"); | ||
str.reserve(10); | ||
if (day < 10) str += '0'; | ||
str += day; | ||
str += '.'; | ||
if (month < 10) str += '0'; | ||
str += month; | ||
str += '.'; | ||
str += year; | ||
return str; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.