Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed May 17, 2022
1 parent 772105f commit 1b3e043
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 133 deletions.
12 changes: 8 additions & 4 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
#######################################
FastBot KEYWORD1

FB_Time LITERAL1
FB_NO_UNICODE LITERAL1
FB_NO_URLENCODE LITERAL1
FB_NO_UNICODE KEYWORD1
FB_NO_URLENCODE KEYWORD1
FB_NO_OTA KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
Expand Down Expand Up @@ -79,15 +79,19 @@ day KEYWORD2
month KEYWORD2
dayWeek KEYWORD2
year KEYWORD2

timeString KEYWORD2
dateString KEYWORD2

FB_unicode KEYWORD2
FB_urlencode KEYWORD2
FB_str64 KEYWORD2
FB_64str KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################
FB_Time LITERAL1

FB_TEXT LITERAL1
FB_MARKDOWN LITERAL1
FB_HTML LITERAL1
Expand Down
2 changes: 1 addition & 1 deletion library.properties
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)
Expand Down
39 changes: 31 additions & 8 deletions src/FastBot.h
Original file line number Diff line number Diff line change
Expand Up @@ -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/
Expand Down Expand Up @@ -80,6 +79,7 @@
- Окончательно убран старый обработчик входящих сообщений
v2.12: поправлены примеры, исправлен парсинг isBot, переделан механизм защиты от длинных сообщений, переделана инициализация
v2.13: Оптимизация памяти. Добавил OTA обновление
v2.14: Улучшен парсинг строки с ID, добавил отключение OTA, добавил парсинг названия группы/канала в username
*/

/*
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -214,6 +227,7 @@ class FastBot {
if (OTAstate == 2) ESP.restart();
OTAstate = -1;
}
#endif

int size = _FB_http.getSize();
ovfFlag = size > 25000; // 1 полное сообщение на русском языке или ~5 на английском
Expand Down Expand Up @@ -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)) {
Expand All @@ -815,6 +835,7 @@ class FastBot {
_otaID = chatID;
}
}
#endif

// удаление сервисных сообщений
if (clrSrv) {
Expand Down Expand Up @@ -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;
Expand All @@ -890,6 +912,7 @@ class FastBot {
OTAstate = httpUpdate.update(client, url);
#endif
}
#endif
}

void (*_callback)(FB_msg& msg) = nullptr;
Expand Down
123 changes: 123 additions & 0 deletions src/datatypes.h
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;
}
};
16 changes: 16 additions & 0 deletions src/utils.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
#include "utils.h"

int64_t FB_str64(const String &s) {
return atoll(s.c_str());
}
String FB_64str(int64_t id) {
String s;
int32_t s1 = (int64_t)id % 1000000000;
int32_t s2 = (int64_t)id / 1000000000;
if (s2) {
s += s2;
s += abs(s1);
} else {
s += s1;
}
return s;
}

// упрощённый urlencode (до 38 ASCII + space)
// по хорошему нужно пропускать только a-Z, 0-9 и -_.!~*'()
void FB_urlencode(const String& s, String& dest) {
Expand Down
Loading

0 comments on commit 1b3e043

Please sign in to comment.