frc/src/main.rs

90 lines
2.5 KiB
Rust

mod botdriver;
mod browser;
mod chromedriver;
mod webserve;
use std::io::{self, Write};
use botdriver::BotDriver;
use browser::BrowserSession;
use chromedriver::Driver;
use serde::{Deserialize, Serialize};
use signal_hook::iterator::Signals;
const STATIC_ADDR: &str = "127.0.0.1:8010";
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let mut cfg: FRCConfig = confy::load_path(CFG_NAME)?;
if cfg.username == None || cfg.token == None {
cfg = create_config()?;
confy::store_path(CFG_NAME, cfg.clone())?;
}
let username = cfg.username.unwrap();
let static_handle = webserve::start_server(STATIC_ADDR.to_string()).await?;
println!("Starting frc with username to listen to: {}", username);
let mut chr = Driver::new()?;
let driver = BrowserSession::new().await?;
let browser = driver.handle();
let mut bot = BotDriver::new(cfg.token.unwrap(), username);
browser.start(STATIC_ADDR).await?;
println!("################");
println!("# starting frc #");
println!("################");
tokio::spawn(async move {
let mut signals =
Signals::new(&[signal_hook::consts::SIGINT, signal_hook::consts::SIGTERM])
.expect("could not init listen signals");
for _ in signals.forever() {
println!();
println!("closing down");
static_handle.abort();
driver.stop().await.expect("failed killing browser");
chr.exit().expect("failed killing chromedriver");
break;
}
std::process::exit(0);
});
bot.listen_and_paste(browser).await.unwrap();
Ok(())
}
const CFG_NAME: &str = "frc.toml";
#[derive(Serialize, Deserialize, Clone, Debug)]
struct FRCConfig {
username: Option<String>,
token: Option<String>,
}
impl ::std::default::Default for FRCConfig {
fn default() -> Self {
Self {
username: None,
token: None,
}
}
}
fn create_config() -> Result<FRCConfig, anyhow::Error> {
let username = get_config_from_user("Enter username to listen to:")?;
let token = get_config_from_user("Enter telegram bot token:")?;
Ok(FRCConfig {
username: Some(username),
token: Some(token),
})
}
fn get_config_from_user(prompt: &str) -> Result<String, anyhow::Error> {
print!("{} ", prompt);
io::stdout().flush()?;
let mut value = String::new();
io::stdin().read_line(&mut value)?;
Ok(value.trim().to_string())
}