diff --git a/watchtower/README.md b/watchtower/README.md index 85f5a4c344..af2ce97706 100644 --- a/watchtower/README.md +++ b/watchtower/README.md @@ -21,9 +21,15 @@ the following fields: ### Sanity failure push notification -To receive a Slack and/or Discord notification on sanity failure, define one or -both of these environment variables before running `solana-watchtower`: +To receive a Slack, Discord and/or Telgram notification on sanity failure, +define environment variables before running `solana-watchtower`: ``` export SLACK_WEBHOOK=... export DISCORD_WEBHOOK=... ``` + +Telgram requires the following two variables: +``` +export TELEGRAM_BOT_TOKEN=... +export TELEGRAM_CHAT_ID=... +``` diff --git a/watchtower/src/notifier.rs b/watchtower/src/notifier.rs index fec44fdb65..167745e333 100644 --- a/watchtower/src/notifier.rs +++ b/watchtower/src/notifier.rs @@ -3,28 +3,44 @@ use reqwest::Client; use serde_json::json; use std::env; +struct TelegramWebHook { + bot_token: String, + chat_id: String, +} + pub struct Notifier { client: Client, discord_webhook: Option, slack_webhook: Option, + telegram_webhook: Option, } impl Notifier { pub fn new() -> Self { let discord_webhook = env::var("DISCORD_WEBHOOK") .map_err(|_| { - warn!("Discord notifications disabled"); + info!("Discord notifications disabled"); }) .ok(); let slack_webhook = env::var("SLACK_WEBHOOK") .map_err(|_| { - warn!("Slack notifications disabled"); + info!("Slack notifications disabled"); }) .ok(); + let telegram_webhook = if let (Ok(bot_token), Ok(chat_id)) = + (env::var("TELEGRAM_BOT_TOKEN"), env::var("TELEGRAM_CHAT_ID")) + { + Some(TelegramWebHook { bot_token, chat_id }) + } else { + info!("Telegram notifications disabled"); + None + }; + Notifier { client: Client::new(), discord_webhook, slack_webhook, + telegram_webhook, } } @@ -42,5 +58,14 @@ impl Notifier { warn!("Failed to send Slack message: {:?}", err); } } + + if let Some(TelegramWebHook { chat_id, bot_token }) = &self.telegram_webhook { + let data = json!({ "chat_id": chat_id, "text": msg }); + let url = format!("https://api.telegram.org/bot{}/sendMessage", bot_token); + + if let Err(err) = self.client.post(&url).json(&data).send() { + warn!("Failed to send Telegram message: {:?}", err); + } + } } }