прошивка в Telegram

This commit is contained in:
Mit4el
2024-05-09 14:39:59 +03:00
parent ac20905220
commit 2eec5d2982
2 changed files with 73 additions and 48 deletions

View File

@@ -56,6 +56,7 @@ private:
bool _receiveMsg;
String _prevMsg = "";
bool _useLed = false;
uint8_t _textMode = 0;
public:
Telegram_v2(String parameters) : IoTItem(parameters)
@@ -66,9 +67,10 @@ public:
_resolveOTA = 0;
jsonRead(parameters, "receiveMsg", _receiveMsg);
jsonRead(parameters, "chatID", _chatID);
_textMode = jsonReadInt(parameters, "textMode");
fl_rollback = false;
instanceBot();
// _myBot->setTextMode(FB_MARKDOWN);
_myBot->setTextMode(_textMode);
_myBot->attach(telegramMsgParse);
#ifdef ESP32
@@ -358,7 +360,7 @@ public:
}
// -------------- Обработка сообщения об откате --------------
// -------------------------------------------------------------------------
if (msg.text.indexOf("rollback") != -1 && msg.chatID == _chatID)
if (msg.text.indexOf("/rollback") != -1 && msg.chatID == _chatID)
{
_myBot->inlineMenu("Вы уверены, что хотите откатить прошивку? " + jsonReadStr(settingsFlashJson, F("name")) + " \n OTA_roll", F("Rollback \t Cancel"));
}
@@ -430,7 +432,37 @@ public:
OTAfilepath = "";
typeOTA = 0;
}
// -------------- обработка файлов загруженных пользователем --------------
// -------------------------------------------------------------------------
else if (msg.isFile)
{
if (msg.fileName.endsWith(F(".tft")) && msg.chatID == _chatID)
{
OTAfilepath = msg.fileUrl;
_myBot->inlineMenu("Хотите прошить экран Nextion? На esp " + jsonReadStr(settingsFlashJson, F("name")) + "\n Next_firmware", F("Firmware \t Cancel"));
}
else if (msg.text.indexOf("download") != -1 && msg.chatID == _chatID)
{
downloadFile(msg);
}
else if (msg.text.indexOf("Next_firmware") != -1)
{
// удаляем последнее сообщение от бота
_myBot->deleteMessage(_myBot->lastBotMsg());
if (msg.data.indexOf("Firmware") != -1)
{
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it)
{
if ((*it)->getSubtype() == "NextionUpload" || (*it)->getSubtype() == "Nextion")
{
_myBot->sendMessage("Nextion firmware ...", _chatID);
(*it)->uploadNextionTlgrm(OTAfilepath);
}
}
OTAfilepath = "";
}
}
}
// -------------- Обработка кнопок меню созданного в сценарии --------------
// -------------------------------------------------------------------------
else if (auto search = mapBtnMenu.find(msg.text); search != mapBtnMenu.end())
@@ -553,7 +585,7 @@ public:
}
// -------------- вывод инлайн меню всех юнитов --------------
// -------------------------------------------------------------------------
else if (msg.text.indexOf("all") != -1)
else if (msg.text.indexOf("/all") != -1)
{
// String list = returnListOfParams();
String out;
@@ -582,7 +614,7 @@ public:
}
// -------------- обработка команды /set_ID_VALUE --------------
// -------------------------------------------------------------------------
else if (msg.text.indexOf("set") != -1)
else if (msg.text.indexOf("/set") != -1)
{
msg.text = deleteBeforeDelimiter(msg.text, "_");
generateOrder(selectToMarker(msg.text, "_"), selectToMarkerLast(msg.text, "_"));
@@ -591,7 +623,7 @@ public:
}
// -------------- обработка команды /get_ID --------------
// -------------------------------------------------------------------------
else if (msg.text.indexOf("get") != -1)
else if (msg.text.indexOf("/get") != -1)
{
msg.text = deleteBeforeDelimiter(msg.text, "_");
IoTItem *item = findIoTItem(msg.text);
@@ -603,52 +635,43 @@ public:
}
// -------------- обработка запроса пользователя на скачивание файла --------------
// -------------------------------------------------------------------------
else if (msg.text.indexOf("file") != -1 && msg.chatID == _chatID)
else if (msg.text.indexOf("/file") != -1 && msg.chatID == _chatID)
{
msg.text = deleteBeforeDelimiter(msg.text, "_");
SerialPrint("i", F("Telegram"), "chat ID: " + _chatID + ", get file: " + String(msg.text));
auto file = FileFS.open(selectToMarker(msg.text, "_"), FILE_READ); // /test.png
if (!file)
if (msg.text.indexOf("file_type") != -1)
{
SerialPrint("E", F("Telegram"), "Fail send file: " + selectToMarker(msg.text, "_"));
return;
_myBot->sendMessage("Support file type download: \n 0-foto \n 1-audio \n 2-doc \n 3-video \n 4-gif \n 5-voice", _chatID);
}
int type = atoi(selectToMarkerLast(msg.text, "_").c_str());
_myBot->sendFile(file, (FB_FileType)type, selectToMarker(msg.text, "_"), _chatID);
file.close();
}
// -------------- обработка файлов загруженных пользователем --------------
// -------------------------------------------------------------------------
else if (msg.isFile)
{
if (msg.text.indexOf("download") != -1 && msg.chatID == _chatID)
else
{
downloadFile(msg);
}
else if (msg.text.indexOf("nextion") != -1 && msg.chatID == _chatID)
{
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it)
msg.text = deleteBeforeDelimiter(msg.text, "_");
SerialPrint("i", F("Telegram"), "chat ID: " + _chatID + ", get file: " + String(msg.text));
auto file = FileFS.open(selectToMarker(msg.text, "_"), FILE_READ); // /test.png
if (!file)
{
if ((*it)->getSubtype() == "NextionUpload" || (*it)->getSubtype() == "Nextion")
{
(*it)->uploadNextionTlgrm(msg.fileUrl);
}
SerialPrint("E", F("Telegram"), "Fail send file: " + selectToMarker(msg.text, "_"));
return;
}
int type = atoi(selectToMarkerLast(msg.text, "_").c_str());
_myBot->sendFile(file, (FB_FileType)type, selectToMarker(msg.text, "_"), _chatID);
file.close();
}
}
// -------------- обработка остальных команд --------------
// -------------------------------------------------------------------------
else if (msg.text.indexOf("help") != -1)
else if (msg.text.indexOf("/help") != -1)
{
_myBot->sendMessage("ID: " + chipId, _chatID);
_myBot->sendMessage("chatID: " + _chatID, _chatID);
_myBot->sendMessage("Command: /help - this text \n /all - inline menu get all values \n /allMenu - bottom menu get all values \n /menu - bottom USER menu from scenario \n /get_id - get value by ID \n /set_id_value - set value in ID \n /file_name_type - take file from esp \n /file_type - support file type \n send file and write download - \"download\" file to esp \n send tft file and write \"nextion\" - flash file.tft to Nextion", _chatID);
if (msg.text.indexOf("/helpDebug") != -1)
{
_myBot->sendMessage("В папке toolchchain с которым собирались (Для esp32 например %%USERPROFILE%/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin) из командной строки Windows (cmd) запустить файл xtensa-esp32-elf-addr2line.exe \nС параметрами -pfiaC -e Путь_к_файлу/firmware.elf Стэк_адресов", _chatID);
}
else
{
_myBot->sendMessage("ID: " + chipId, _chatID);
_myBot->sendMessage("chatID: " + _chatID, _chatID);
_myBot->sendMessage("Command: /help - this text \n /all - inline menu get all values \n /allMenu - bottom menu get all values \n /menu - bottom USER menu from scenario \n /get_id - get value by ID \n /set_id_value - set value in ID \n /file_name_type - take file from esp \n /file_type - support file type \n send file and write download - \"download\" file to esp \n send tft file and write \"nextion\" - flash file.tft to Nextion", _chatID);
}
}
else if (msg.text.indexOf("file_type") != -1)
{
_myBot->sendMessage("Support file type download: \n 0-foto \n 1-audio \n 2-doc \n 3-video \n 4-gif \n 5-voice", _chatID);
}
else
else if (msg.text.indexOf("/") != -1)
{
_myBot->sendMessage("Wrong order, use /help", _chatID);
}

View File

@@ -12,9 +12,10 @@
"descr": "",
"int": 10,
"token": "",
"chatID": "",
"autos": 1,
"receiveMsg": 1,
"chatID": "",
"textMode":"0",
"OTA": 0
}],
@@ -36,7 +37,8 @@
"autos": "Автоматически(1) или нет(0) запоминать ChatID по входящим сообщениям. Т.е. бот будет информировать тех, кто последний прислал сообщение.",
"receiveMsg": "Обрабатывать(1) или нет(0) входящие сообщения.",
"chatID": "ИД диалога с контактом. Необходим для отправки сообщений именно вам.",
"OTA": "Разрешена(1) или запрещена(0) прошивка через чат бота. Если разрешена, то файл принимается только от пользователя прописанного в chatID или от всех если autos=1"
"OTA": "Разрешена(1) или запрещена(0) прошивка через чат бота. Если разрешена, то файл принимается только от пользователя прописанного в chatID или от всех если autos=1",
"textMode": "Разметка оформления сообщения в сообщениях. 0-без оформления, 1-разметка Markdown v2, 2-разметка HTML"
},
"funcInfo": [
{
@@ -76,12 +78,12 @@
},
{
"name": "btnMenu",
"descr": "Описание кнопки меню выводит запросит значение ID и выведит сообщение => Произвольное сообщение(message): значение. Пример: btnMenu(Темп.Дома, Текущая температура, IDbme280)",
"descr": "Описание кнопки меню. По нажатию запросит значение ID и отправит сообщение. ID УКАЗЫВАТЬ В КАВЫЧКАХ! Пример: btnMenu(Темп.Дома, Текущая температура, IDbme280)",
"params": ["Name - название кнопки отображается ботом", "message - Произвольное сообщения присылается в ответ на кнопку", "Id - Вернет значение элемента"]
},
{
"name": "btnMenu",
"descr": "Описание кнопки меню выводит запросит значение getID,установит значение value в setID и выведит сообщение => Произвольное сообщение(message): значение, IDrele=1. ВСЁ УКАЗЫВАТЬ В КАВЫЧКАХ, значение не обязательно! Пример: btnMenu(\"Обогрев\", \"Текущая температура\", \"IDbme280\", \"IDrele\", 1), btnMenu(Свет, Вклбчил свет, \"\", IDrele, 1)",
"descr": "Описание кнопки меню. Установит значение value в setID. При необходимости запросит значение getID и отправит сообщение. ID УКАЗЫВАТЬ В КАВЫЧКАХ! Пример: btnMenu(\"Обогрев\", \"Текущая температура\", \"IDbme280\", \"IDrele\", 1), btnMenu(Свет, Вклбчил свет, \"\", IDrele, 1)",
"params": ["Name - название кнопки отображается ботом", "message - Произвольное сообщения присылается в ответ на кнопку", "getId - Вернет значение элемента", "setId - Установит значение элементу", "value - Устанавливаемое значение"]
},
{
@@ -96,12 +98,12 @@
},
{
"name": "btnInline",
"descr": "Описание кнопки встроенного (inline) меню выводит запросит значение ID и выведит сообщение => Произвольное сообщение(message): значение. Пример: btnMenu(Темп.Дома, Текущая температура, IDbme280)",
"descr": "Описание кнопки встроенного (inline) меню. Запросит значение ID и отправит сообщение. ID УКАЗЫВАТЬ В КАВЫЧКАХ! Пример: btnInline(Темп.Дома, Текущая температура, IDbme280)",
"params": ["Name - название кнопки отображается ботом", "message - Произвольное сообщения присылается в ответ на кнопку", "Id - Вернет значение элемента"]
},
{
"name": "btnInline",
"descr": "Описание кнопки встроенного (inline) меню выводит запросит значение getID,установит значение value в setID и выведит сообщение => Произвольное сообщение(message): значение, IDrele=1. ВСЁ УКАЗЫВАТЬ В КАВЫЧКАХ, значение не обязательно! Пример: btnMenu(\"Обогрев\", \"Текущая температура\", \"IDbme280\", \"IDrele\", 1), btnMenu(Свет, Вклбчил свет, \"\", IDrele, 1)",
"descr": "Описание кнопки встроенного (inline) меню выводит. Установит значение value в setID. Запросит значение getID (если указан) и отправит сообщение. ID УКАЗЫВАТЬ В КАВЫЧКАХ! Пример: btnInline(\"Обогрев\", \"Текущая температура\", \"IDbme280\", \"IDrele\", 1), btnMenu(Свет, Вклбчил свет, \"\", IDrele, 1)",
"params": ["Name - название кнопки отображается ботом", "message - Произвольное сообщения присылается в ответ на кнопку", "getId - Вернет значение элемента", "setId - Установит значение элементу", "value - Устанавливаемое значение"]
},
{
@@ -111,12 +113,12 @@
},
{
"name": "clearInline",
"descr": "Очистить встроенное (inline) меню, вызвать перед для язменения, перед созданием новых кнопок",
"descr": "Очистить встроенное (inline) меню, вызвать для изменения, перед созданием новых кнопок",
"params": []
},
{
"name": "clearMenu",
"descr": "Очистить меню, вызвать перед для язменения, перед созданием новых кнопок",
"descr": "Очистить меню, вызвать для изменения, перед созданием новых кнопок",
"params": []
}
]