2024-01-24 18:14:50 +08:00
|
|
|
use std::env;
|
|
|
|
use std::fs;
|
|
|
|
|
2024-08-02 19:25:39 +08:00
|
|
|
use colored::Colorize;
|
2024-01-24 18:14:50 +08:00
|
|
|
use serde::Deserialize;
|
2024-02-20 17:15:14 +08:00
|
|
|
use toml::from_str;
|
2024-03-13 01:17:50 +08:00
|
|
|
use tracing::warn;
|
2024-01-24 18:14:50 +08:00
|
|
|
|
2024-03-30 14:24:19 +08:00
|
|
|
use crate::data_struct::{ica, tailchat};
|
|
|
|
|
2024-02-18 22:43:54 +08:00
|
|
|
/// Icalingua bot 的配置
|
2024-02-20 17:47:45 +08:00
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
2024-01-24 18:14:50 +08:00
|
|
|
pub struct IcaConfig {
|
|
|
|
/// icalingua 私钥
|
|
|
|
pub private_key: String,
|
|
|
|
/// icalingua 服务器地址
|
|
|
|
pub host: String,
|
|
|
|
/// bot 的 qq
|
2024-03-30 14:24:19 +08:00
|
|
|
pub self_id: ica::UserId,
|
2024-01-24 18:14:50 +08:00
|
|
|
/// 提醒的房间
|
2024-03-30 14:24:19 +08:00
|
|
|
pub notice_room: Vec<ica::RoomId>,
|
2024-01-24 18:14:50 +08:00
|
|
|
/// 是否提醒
|
2024-02-20 18:22:59 +08:00
|
|
|
pub notice_start: bool,
|
|
|
|
/// 管理员列表
|
2024-03-30 14:24:19 +08:00
|
|
|
pub admin_list: Vec<ica::UserId>,
|
2024-02-22 23:17:20 +08:00
|
|
|
/// 过滤列表
|
2024-03-30 14:24:19 +08:00
|
|
|
pub filter_list: Vec<ica::UserId>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
|
|
pub struct TailchatConfig {
|
|
|
|
/// 服务器地址
|
|
|
|
pub host: String,
|
|
|
|
/// 机器人 App ID
|
|
|
|
pub app_id: String,
|
|
|
|
/// 机器人 App Secret
|
|
|
|
pub app_secret: String,
|
|
|
|
/// 提醒的房间
|
|
|
|
pub notice_room: Vec<(tailchat::GroupId, tailchat::ConverseId)>,
|
|
|
|
/// 是否提醒
|
|
|
|
pub notice_start: bool,
|
|
|
|
/// 管理员列表
|
|
|
|
pub admin_list: Vec<tailchat::UserId>,
|
|
|
|
/// 过滤列表
|
|
|
|
pub filter_list: Vec<tailchat::UserId>,
|
2024-03-12 00:16:12 +08:00
|
|
|
}
|
|
|
|
|
2024-03-15 00:40:22 +08:00
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
|
|
pub struct PyConfig {
|
|
|
|
/// 插件路径
|
|
|
|
pub plugin_path: String,
|
|
|
|
/// 配置文件路径
|
|
|
|
pub config_path: String,
|
|
|
|
}
|
|
|
|
|
2024-03-12 00:16:12 +08:00
|
|
|
/// 主配置
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
|
|
pub struct BotConfig {
|
2024-03-12 00:47:00 +08:00
|
|
|
/// 是否启用 icalingua
|
2024-03-13 01:17:50 +08:00
|
|
|
pub enable_ica: Option<bool>,
|
2024-03-12 00:16:12 +08:00
|
|
|
/// Ica 配置
|
|
|
|
pub ica: Option<IcaConfig>,
|
2024-03-29 02:03:27 +08:00
|
|
|
|
2024-03-30 14:24:19 +08:00
|
|
|
/// 是否启用 Tailchat
|
|
|
|
pub enable_tailchat: Option<bool>,
|
|
|
|
/// Tailchat 配置
|
|
|
|
pub tailchat: Option<TailchatConfig>,
|
|
|
|
|
2024-03-15 00:40:22 +08:00
|
|
|
/// 是否启用 Python 插件
|
|
|
|
pub enable_py: Option<bool>,
|
|
|
|
/// Python 插件配置
|
|
|
|
pub py: Option<PyConfig>,
|
2024-01-24 18:14:50 +08:00
|
|
|
}
|
|
|
|
|
2024-03-12 00:16:12 +08:00
|
|
|
impl BotConfig {
|
2024-01-24 18:14:50 +08:00
|
|
|
pub fn new_from_path(config_file_path: String) -> Self {
|
|
|
|
// try read config from file
|
|
|
|
let config = fs::read_to_string(&config_file_path).expect("Failed to read config file");
|
2024-08-02 21:34:28 +08:00
|
|
|
let ret: Self = from_str(&config).unwrap_or_else(|e| {
|
|
|
|
panic!("Failed to parse config file {}\ne:{:?}", &config_file_path, e)
|
|
|
|
});
|
2024-01-24 18:14:50 +08:00
|
|
|
ret
|
|
|
|
}
|
|
|
|
pub fn new_from_cli() -> Self {
|
2024-03-16 14:04:30 +08:00
|
|
|
// let config_file_path = env::args().nth(1).expect("No config path given");
|
|
|
|
// -c <config_file_path>
|
|
|
|
let mut config_file_path = String::new();
|
|
|
|
let mut args = env::args();
|
|
|
|
while let Some(arg) = args.next() {
|
|
|
|
if arg == "-c" {
|
2024-08-02 19:25:39 +08:00
|
|
|
config_file_path = args.next().expect(&format!(
|
|
|
|
"{}",
|
|
|
|
"No config path given\nUsage: -c <config_file_path>".red()
|
|
|
|
));
|
2024-03-16 14:04:30 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2024-01-24 18:14:50 +08:00
|
|
|
Self::new_from_path(config_file_path)
|
|
|
|
}
|
2024-03-12 00:16:12 +08:00
|
|
|
|
2024-03-13 01:17:50 +08:00
|
|
|
/// 检查是否启用 ica
|
|
|
|
pub fn check_ica(&self) -> bool {
|
|
|
|
match self.enable_ica {
|
|
|
|
Some(enable) => {
|
2024-03-14 01:12:08 +08:00
|
|
|
if enable && self.ica.is_none() {
|
|
|
|
warn!("enable_ica 为 true 但未填写 [ica] 配置\n将不启用 ica");
|
2024-03-13 01:17:50 +08:00
|
|
|
false
|
2024-03-14 01:12:08 +08:00
|
|
|
} else {
|
2024-05-26 01:08:48 +08:00
|
|
|
enable
|
2024-03-13 01:17:50 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
None => {
|
2024-03-13 01:20:41 +08:00
|
|
|
if self.ica.is_some() {
|
2024-03-13 01:17:50 +08:00
|
|
|
warn!("未填写 enable_ica 但填写了 [ica] 配置\n将不启用 ica");
|
|
|
|
}
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-30 16:59:06 +08:00
|
|
|
/// 检查是否启用 Tailchat
|
|
|
|
pub fn check_tailchat(&self) -> bool {
|
|
|
|
match self.enable_tailchat {
|
|
|
|
Some(enable) => {
|
|
|
|
if enable && self.tailchat.is_none() {
|
|
|
|
warn!("enable_tailchat 为 true 但未填写 [tailchat] 配置\n将不启用 Tailchat");
|
|
|
|
false
|
|
|
|
} else {
|
2024-05-26 01:08:48 +08:00
|
|
|
enable
|
2024-03-30 16:59:06 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
None => {
|
|
|
|
if self.tailchat.is_some() {
|
|
|
|
warn!("未填写 enable_tailchat 但填写了 [tailchat] 配置\n将不启用 Tailchat");
|
|
|
|
}
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-15 00:40:22 +08:00
|
|
|
/// 检查是否启用 Python 插件
|
|
|
|
pub fn check_py(&self) -> bool {
|
|
|
|
match self.enable_py {
|
|
|
|
Some(enable) => {
|
|
|
|
if enable && self.py.is_none() {
|
|
|
|
warn!("enable_py 为 true 但未填写 [py] 配置\n将不启用 Python 插件");
|
|
|
|
false
|
|
|
|
} else {
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
None => {
|
|
|
|
if self.py.is_some() {
|
|
|
|
warn!("未填写 enable_py 但填写了 [py] 配置\n将不启用 Python 插件");
|
|
|
|
}
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-12 00:16:12 +08:00
|
|
|
pub fn ica(&self) -> IcaConfig { self.ica.clone().expect("No ica config found") }
|
2024-03-30 18:30:43 +08:00
|
|
|
pub fn tailchat(&self) -> TailchatConfig {
|
|
|
|
self.tailchat.clone().expect("No tailchat config found")
|
|
|
|
}
|
2024-03-15 00:40:22 +08:00
|
|
|
pub fn py(&self) -> PyConfig { self.py.clone().expect("No py config found") }
|
2024-01-24 18:14:50 +08:00
|
|
|
}
|