use std::{fs::File, io::BufWriter}; use log::{info, warn, error}; use serde::{Deserialize, Serialize}; use std::io::BufReader; #[derive(Debug, Deserialize, Serialize)] pub struct Configuration { server_ip: String, server_port: String, username_prefix: String, count: i32, proxy_url: String, reco_words: Vec, login_commands: Vec, spam_file: String, spam_delay_ms: i32, random_prefix: bool, pub worker_threads: i32, pub use_thread_pool: bool, pub update_worker_threads: i32 } impl Configuration { pub fn new(filename: &str) -> Self { let file = File::open(filename); match file { Ok(file) => { let reader = BufReader::new(file); match serde_json::from_reader::<_,Configuration>(reader) { // serde可以直接解析出实现了Deserialize trait的类型 就很不错 Ok(config) => { info!("Server IP: {}", config.server_ip); info!("Server Port: {}", config.server_port); info!("Username Prefix: {}", config.username_prefix); info!("Bot Count: {}", config.count); info!("Proxy URL: {}", config.proxy_url); config } Err(error) => { error!("Error parsing config file: {}", error); Self::default() } } } Err(error) => { warn!("Unable to read config file, will use default values: {}", error); let file = File::create_new(filename).unwrap(); let writer = BufWriter::new(file); let mut serializer = serde_json::Serializer::pretty(writer); Self::default().serialize(&mut serializer).unwrap(); warn!("A configure file with default values is created."); Self::default() } } } fn default() -> Self { Configuration { server_ip: "m.earthvillage.top".to_string(), server_port: "33009".to_string(), username_prefix: "".to_string(), count: 300, proxy_url: "http://uu-proxy.com/api/get_proxies?id=RZ7GS5ZYTA&size=1&schemes=socks5&support_https=false&format=json".to_string(), reco_words: vec!["AntiAttack".to_string()], login_commands: vec![], spam_file: "".to_string(), spam_delay_ms: 0, random_prefix: false, worker_threads: 100, use_thread_pool: true, update_worker_threads: 100, } } // 下面是getter一堆 pub fn server_ip(&self) -> &str { self.server_ip.as_str() } pub fn server_port(&self) -> &str { self.server_port.as_str() } pub fn username_prefix(&self) -> &str { self.username_prefix.as_str() } pub fn count(&self) -> i32 { self.count } pub fn proxy_url(&self) -> &str { self.proxy_url.as_str() } pub fn reco_words(&self) -> &Vec { &self.reco_words } pub fn login_commands(&self) -> &Vec { &self.login_commands } pub fn spam_file(&self) -> &str { self.spam_file.as_str() } pub fn spam_delay_ms(&self) -> i32 { self.spam_delay_ms } pub fn random_prefix(&self) -> bool { self.random_prefix } } // impl Clone for Configuration { // fn clone(&self) -> Self { // Configuration { // server_ip: self.server_ip.clone(), // server_port: self.server_port.clone(), // username_prefix: self.username_prefix.clone(), // count: self.count, // proxy_url: self.proxy_url.clone(), // reco_words: self.reco_words.clone(), // login_commands:self.login_commands.clone(), // random_prefix: self.random_prefix, // spam_file: self.spam_file.clone(), // spam_delay_ms: self.spam_delay_ms, // } // } // }