use std::fs;
use std::time::{SystemTime, UNIX_EPOCH};
use serde::{Deserialize, Serialize};
use anyhow::Result;
use crate::{crypto, fs_util};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Bot {
pub id: String,
pub secret: String,
pub create_time: u64,
}
impl Bot {
pub fn new(id: String, secret: String) -> Self {
let create_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
Self {
id,
secret,
create_time,
}
}
}
pub fn get_bot_info() -> Option<Bot> {
let data = fs::read(bot_info_path()).ok()?;
crypto::try_decrypt_data(&data).ok()
}
pub fn set_bot_info(bot: &Bot) -> Result<()> {
let key = crypto::load_existing_key().unwrap_or_else(|| {
let k = crypto::generate_random_key();
tracing::info!("已生成新的加密密钥");
k
});
crypto::save_key(&key)?;
let encrypted = crypto::encrypt_data(bot, &key)?;
let path = bot_info_path();
fs_util::atomic_write(&path, &encrypted, Some(0o600))?;
tracing::info!("企业微信机器人信息已保存到 {}", path.display());
Ok(())
}
pub fn clear_bot_info() {
let path = bot_info_path();
if path.exists() {
let _ = fs::remove_file(&path);
tracing::info!("机器人信息已删除:{}", path.display());
}
}
fn bot_info_path() -> std::path::PathBuf {
crate::constants::config_dir().join("bot.enc")
}