izzilis/src/main.rs

70 lines
2.1 KiB
Rust

use std::{error::Error, process, thread, time::Duration};
use chrono::Local;
use rand::Rng;
use crate::{
bot::IzzilisBot, generator::Generator, publish::FediversePublisher, selection::ConsoleSelector,
};
mod bot;
mod config;
mod generator;
mod model;
mod publish;
mod selection;
const CONFIG_PATH: &str = "bot_config.json";
fn main() -> Result<(), Box<dyn Error>> {
let cfg = match config::Config::from(CONFIG_PATH.to_string()) {
Ok(cfg) => cfg,
Err(_) => {
println!(
"Failed reading config at [{}], writing default",
CONFIG_PATH
);
match config::Config::default().save(CONFIG_PATH.to_string()) {
Some(err) => println!("Failed writing file to {}: {}", CONFIG_PATH, err),
None => (),
}
process::exit(1);
}
};
let gpt_model = model::GPTSampleModel::new(
cfg.python_path(),
cfg.gpt_code_path(),
vec![
"generate_unconditional_samples.py".to_string(),
"--model_name".to_string(),
cfg.model_name(),
"--temperature".to_string(),
cfg.temperature(),
"--top_k".to_string(),
cfg.top_k(),
"--nsamples".to_string(),
"1".to_string(),
],
);
let publisher = FediversePublisher::new(cfg.fediverse_base_url())?;
// let publisher = ConsolePublisher::new();
let gen = Generator::new(gpt_model);
let console_selector = ConsoleSelector::new();
let mut bot = IzzilisBot::new(gen, publisher, console_selector);
bot.generate_samples();
let cfg_interval = cfg.interval_seconds();
loop {
let wait_seconds = rand::thread_rng().gen_range(cfg_interval.min()..cfg_interval.max());
let wait_time = Duration::from_secs(wait_seconds);
let now = Local::now();
println!("[{}] Next post is in [{}] seconds", now, wait_seconds);
thread::sleep(wait_time);
match bot.publish() {
Some(err) => println!("Got error from publish: [{}]; continuing", err),
None => println!("publish() call successful"),
}
}
}