group-actor/src/main.rs

150 lines
4.1 KiB
Rust
Raw Normal View History

2021-08-21 20:35:01 +00:00
#![deny(unused_must_use)]
extern crate elefren;
2021-08-20 20:59:19 +00:00
#[macro_use]
extern crate log;
#[macro_use]
extern crate serde;
// #[macro_use]
// extern crate smart_default;
#[macro_use]
2021-08-21 20:35:01 +00:00
extern crate thiserror;
2021-08-20 20:59:19 +00:00
use clap::Arg;
use log::LevelFilter;
2021-08-21 20:35:01 +00:00
use crate::store::{NewGroupOptions, StoreOptions};
use crate::utils::acct_to_server;
2021-08-21 20:35:01 +00:00
mod command;
mod error;
2021-10-12 08:38:02 +00:00
#[macro_use]
mod group_handler;
mod store;
mod utils;
2021-08-21 20:35:01 +00:00
2021-10-05 23:09:20 +00:00
#[macro_use]
mod tr;
2021-08-21 20:35:01 +00:00
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let args = clap::App::new("groups")
.arg(
Arg::with_name("verbose")
.short("v")
.multiple(true)
.help("increase logging, can be repeated"),
)
.arg(
Arg::with_name("quiet")
.short("q")
.multiple(true)
.help("decrease logging, can be repeated"),
)
.arg(
Arg::with_name("config")
.short("c")
.long("config")
.takes_value(true)
.help("set custom config directory, defaults to the current folder"),
)
.arg(
Arg::with_name("auth")
.short("a")
.long("auth")
.takes_value(true)
.value_name("HANDLE")
.help("authenticate to a new server (always using https)"),
)
.arg(
Arg::with_name("reauth")
.short("A")
.long("reauth")
.takes_value(true)
.value_name("HANDLE")
.help("authenticate to a new server (always using https)"),
)
.get_matches();
const LEVELS: [LevelFilter; 5] = [
LevelFilter::Error,
LevelFilter::Warn,
LevelFilter::Info,
LevelFilter::Debug,
LevelFilter::Trace,
];
let default_level = 3;
2021-11-02 22:49:00 +00:00
let level = (default_level as isize + args.occurrences_of("verbose") as isize
- args.occurrences_of("quiet") as isize)
.clamp(0, LEVELS.len() as isize) as usize;
2021-08-21 20:35:01 +00:00
env_logger::Builder::new()
.filter_level(LEVELS[level])
2021-08-21 20:35:01 +00:00
.write_style(env_logger::WriteStyle::Always)
.filter_module("rustls", LevelFilter::Warn)
.filter_module("reqwest", LevelFilter::Warn)
.filter_module("tungstenite", LevelFilter::Warn)
.filter_module("tokio_tungstenite", LevelFilter::Warn)
.filter_module("tokio_util", LevelFilter::Warn)
.filter_module("want", LevelFilter::Warn)
.filter_module("mio", LevelFilter::Warn)
2021-08-21 20:35:01 +00:00
.init();
2021-10-05 23:09:20 +00:00
let mut store = store::ConfigStore::load_from_fs(StoreOptions {
store_dir: args.value_of("config").unwrap_or(".").to_string(),
})
.await?;
2021-08-21 20:35:01 +00:00
if let Some(handle) = args.value_of("auth") {
2021-08-26 22:19:43 +00:00
let handle = handle.to_lowercase();
let acct = handle.trim_start_matches('@');
2021-08-26 22:19:43 +00:00
if store.group_exists(acct).await {
anyhow::bail!("Group already exists in config!");
}
if let Some(server) = acct_to_server(acct) {
2021-10-05 23:09:20 +00:00
store
.auth_new_group(NewGroupOptions {
server: format!("https://{}", server),
acct: acct.to_string(),
})
.await?;
2021-10-05 23:09:20 +00:00
eprintln!("New group added to config!");
return Ok(());
} else {
anyhow::bail!("--auth handle must be username@server, got: \"{}\"", handle);
2021-08-21 20:35:01 +00:00
}
}
2021-08-20 20:59:19 +00:00
if let Some(acct) = args.value_of("reauth") {
let acct = acct.trim_start_matches('@');
2021-10-05 23:09:20 +00:00
store.reauth_group(acct).await?;
eprintln!("Group @{} re-authed!", acct);
return Ok(());
}
2021-08-21 20:35:01 +00:00
2021-10-05 23:09:20 +00:00
store.find_locales().await;
// Start
let groups = store.spawn_groups().await?;
2021-08-21 20:35:01 +00:00
let mut handles = vec![];
2021-08-21 20:35:01 +00:00
for mut g in groups {
handles.push(tokio::spawn(async move {
match g.run().await {
Ok(()) => unreachable!(),
Err(e) => error!("GROUP FAILED! {}", e),
}
}));
2021-08-21 20:35:01 +00:00
}
futures::future::join_all(handles).await;
eprintln!("Main loop ended!");
2021-08-20 20:59:19 +00:00
Ok(())
}