#[macro_use] extern crate log; #[macro_use] extern crate wisp; extern crate chrono; extern crate fern; extern crate kankyo; use fern::colors::{Color, ColoredLevelConfig}; use wisp::WispClient; fn main() { kankyo::load().expect("Failed to load .env file."); fern_setup().expect("Failed to apply Fern settings."); let mut client = WispClient::new(); check_error!(client.start()); } fn fern_setup() -> Result<(), log::SetLoggerError> { let colours = ColoredLevelConfig::new() .trace(Color::Magenta) .debug(Color::Cyan) .info(Color::Green) .warn(Color::Yellow) .error(Color::Red); let term_out = fern::Dispatch::new() .format(move |out, message, record| { out.finish(format_args!( "{time} {level:level_width$}{target:target_width$}> {msg}", time = chrono::Utc::now().format("%F %T"), level = colours.color(record.level()), target = format!("{}:{}", record.target(), record.line().unwrap_or(0)), msg = message, level_width = 8, target_width = 60 )) }) .chain(std::io::stdout()) .into_shared(); let file_out = fern::Dispatch::new() .format(|out, message, record| { out.finish(format_args!( "{time} {level:level_width$}{target:target_width$}> {msg}", time = chrono::Utc::now().format("%F %T"), level = record.level(), target = format!("{}:{}", record.target(), record.line().unwrap_or(0)), msg = message, level_width = 8, target_width = 60 )) }) .chain(fern::log_file("output.log").expect("Failed to load log file.")) .into_shared(); fern::Dispatch::new() .level(log::LevelFilter::Info) .level_for("serenity", log::LevelFilter::Debug) .level_for("wisp", log::LevelFilter::Debug) .chain(term_out) .chain(file_out) .apply() }