witnessmenow / Universal-Arduino-Telegram-Bot

Use Telegram on your Arduino (ESP8266 or Wifi-101 boards)
MIT License
1.12k stars 306 forks source link

Add multiple User_ID #310

Closed DrSaad77 closed 1 year ago

DrSaad77 commented 1 year ago

Hello, it is more a help requested than an issue. Can somebody please let me know how to add another User_ID at line #36 ?? there: #define CHAT_ID "XXXXXXXXXX"

I want to add more than 1 Telegram number/ User_ID, meaning, being able to receive notification from Arduino to multiple devices. Should I maybe repeat this line with the others ID ??

Thx guys

Capture d’écran 2022-11-25 012421

Esque123 commented 1 year ago
  1. You can create a list with the user ID's. eg. const String authorized_chat_ids[] = { "3333333", "4444444" };

  2. Then you need to be able to get the dynamic size of the list, so that the bot can latter iterate through the ID's. const int numberUsers = sizeof(authorized_chat_ids) / sizeof(authorized_chat_ids[0]);

  3. Then create a check function to verify new messages from users against the list that you created in step 1. bool isValidUser(String chat_id, String from_name) { for (int i = 0; i < numberUsers; i++) { if (authorized_chat_ids[i] == (chat_id)) { Serial.println(from_name + " is a valid user"); return true; break; } } Serial.println(from_name + " is NOT a valid User!"); return false; }

  4. Lastly under the "void handleNewMessages()" function, send messages to all authotized users.

    for (int i = 0; i < numNewMessages; i++) { String chat_id = bot.messages[i].chat_id; String from_name = bot.messages[i].from_name; if (isValidUser(chat_id, from_name)) {

        String text = bot.messages[i].text;

Hope this helps!

DrSaad77 commented 1 year ago

3. bool isValidUser(String chat_id, String from_name) { for (int i = 0; i < numberUsers; i++) { if (authorized_chat_ids[i] == (chat_id)) { Serial.println(from_name + " is a valid user"); return true; break; } } Serial.println(from_name + " is NOT a valid User!"); return false; }

Thx you very much fror your support. I wish to make a bot on ESP8622 connected to main GRID Power and get notificated when it is available on more than 1 device through Telegram. I am a novice at coding or arduino script... Anyway, I tried to follow your help, but could not apply point 4, under the "void handleNewMessages()" function, could not find it.

This is what I came out as a script:

include

include

include

include

// Wifi network station credentials

define WIFI_SSID "MYWIFI"

define WIFI_PASSWORD "xxxxxxxxxx"

// Telegram BOT Token (Get from Botfather)

define BOT_TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

// Use @myidbot (IDBot) to find out the chat ID of an individual or a group // Also note that you need to click "start" on a bot before it can // message you

const String authorized_chat_ids[] = { "11111111", "22222222" };

const int numberUsers = sizeof(authorized_chat_ids) / sizeof(authorized_chat_ids[0]);

bool isValidUser(String chat_id, String from_name) { for (int i = 0; i < numberUsers; i++) { if (authorized_chat_ids[i] == (chat_id)) { Serial.println(from_name + " is a valid user"); return true; break; } } Serial.println(from_name + " is NOT a valid User!"); return false; }

X509List cert(TELEGRAM_CERTIFICATE_ROOT); WiFiClientSecure secured_client; UniversalTelegramBot bot(BOT_TOKEN, secured_client);

void setup() { Serial.begin(115200); Serial.println();

// attempt to connect to Wifi network: Serial.print("Connecting to Wifi SSID "); Serial.print(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.print("\nWiFi connected. IP address: "); Serial.println(WiFi.localIP());

Serial.print("Retrieving time: "); configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP time_t now = time(nullptr); while (now < 24 * 3600) { Serial.print("."); delay(100); now = time(nullptr); } Serial.println(now);

bot.sendMessage(CHAT_ID, "Bot started up", ""); delay(15000); bot.sendMessage(CHAT_ID, "GRID is available !", ""); }

void loop() {

}

I tried to compile the code without point 4, and get this error: "CHAT_ID' was not declared in this scope"

Can you please take a look at the script and correct stuff, to be able to use it with 2 user_ID, and this way , I would be able to replicate it for 3 or more user. Thx you very much.

witnessmenow commented 1 year ago

This is a user level thing

const String authorized_chat_ids[] = { "11111111", "22222222" };
const int num_chat_ids = 2;

...
...

bool sendToAllUsers(String message){
    bool allResponse = true;
    for(int i =0; i< num_chat_ids ; i++){
        allResponse = bot.sendMessage(authorized_chat_ids[i], message, "") && allResponse; //if one fails, all response will be false
    }
    return false;
}