From 2eec5d29823f98bca14d4c4ca6d4ca65a6b3e800 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 9 May 2024 14:39:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=88=D0=B8=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=20Telegram?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/Telegram_v2/Telegram_v2.cpp | 103 ++++++++++++------- src/modules/exec/Telegram_v2/modinfo.json | 18 ++-- 2 files changed, 73 insertions(+), 48 deletions(-) diff --git a/src/modules/exec/Telegram_v2/Telegram_v2.cpp b/src/modules/exec/Telegram_v2/Telegram_v2.cpp index 83532fa0..46b2d95d 100644 --- a/src/modules/exec/Telegram_v2/Telegram_v2.cpp +++ b/src/modules/exec/Telegram_v2/Telegram_v2.cpp @@ -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::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::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); } diff --git a/src/modules/exec/Telegram_v2/modinfo.json b/src/modules/exec/Telegram_v2/modinfo.json index 905663bd..a3693e42 100644 --- a/src/modules/exec/Telegram_v2/modinfo.json +++ b/src/modules/exec/Telegram_v2/modinfo.json @@ -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": [] } ]