use crate::cli::TelegramCmd;
pub(crate) async fn telegram(url: &str, cmd: TelegramCmd) -> anyhow::Result<()> {
match cmd {
TelegramCmd::Pair => telegram_pair(url).await,
TelegramCmd::Status => telegram_status(url).await,
TelegramCmd::Start {
url: start_url,
token,
alert_chat_id,
allowed_user_id,
check,
} => {
let token = token.or_else(|| trusty_mpm::telegram::resolve_token("TELEGRAM_BOT_TOKEN"));
let options = trusty_mpm::telegram::BotOptions {
allowed_user_id,
alert_chat_id,
};
trusty_mpm::telegram::run(start_url, token, check, options).await
}
TelegramCmd::Stop => telegram_stop(),
}
}
async fn telegram_pair(url: &str) -> anyhow::Result<()> {
use trusty_mpm::client::{CommandExecutor, CommandResult};
let executor = CommandExecutor::new(url.to_string());
match executor.pair_request().await {
CommandResult::PairCode {
code,
expires_in_seconds,
} => {
println!("Pairing code: {code}");
println!("Expires in: {} minutes", expires_in_seconds / 60);
println!();
println!("In Telegram, send to your bot:");
println!(" /pair {code}");
println!();
println!("Or click: https://t.me/trusty_mpm_bot?start={code}");
}
CommandResult::Error(msg) => eprintln!("pairing failed: {msg}"),
other => eprintln!("unexpected pairing result: {other:?}"),
}
Ok(())
}
async fn telegram_status(url: &str) -> anyhow::Result<()> {
use trusty_mpm::client::DaemonClient;
let client = DaemonClient::new(url.to_string());
match client.pair_status().await {
Ok(status) if status.paired => match status.chat_id {
Some(chat_id) => println!("Telegram: paired (chat_id: {chat_id})"),
None => println!("Telegram: paired"),
},
Ok(_) => println!("Telegram: unpaired — run `tm telegram pair` to begin"),
Err(e) => eprintln!("daemon unreachable: {e}"),
}
Ok(())
}
fn telegram_stop() -> anyhow::Result<()> {
let status = std::process::Command::new("pkill")
.args(["-f", "telegram start"])
.status();
match status {
Ok(s) if s.success() => println!("Telegram bot stopped"),
Ok(_) => println!("no Telegram bot process found"),
Err(e) => eprintln!("failed to stop Telegram bot: {e}"),
}
Ok(())
}