kovi_plugin_live_agent/
command.rs

1//! Detect group message and respond to commands.
2
3use kovi::{tokio::fs, Message, MsgEvent};
4use std::{ sync::Arc,
5    time::{SystemTime, UNIX_EPOCH},
6};
7
8use crate::{
9    global_state, std_db_error, store,
10    util::{self, call_upload},
11    CONFIG, DATA_PATH,
12};
13
14pub async fn act(e: Arc<MsgEvent>) {
15    let Some(text) = e.borrow_text() else {
16        return;
17    };
18    let Some(group_id) = e.group_id else {
19        return;
20    };
21    let config = CONFIG.get().unwrap();
22    let Some(ref groups) = config.groups else {
23        return;
24    };
25    let Some(group) = groups.iter().find(|&g| g.id == group_id) else {
26        return;
27    };
28    let Some(ref command) = group.command else {
29        return;
30    };
31    if !command.admin_ids.contains(&e.sender.user_id) {
32        return;
33    }
34    let Some(cmd) = command.parse_command(text) else {
35        return;
36    };
37
38    match cmd {
39        crate::GroupCommand::Mute => {
40            let Some(ref agent) = group.agent else {
41                util::send_group_and_log(group_id, "未配置agent").await;
42                return;
43            };
44            if agent.is_mute() {
45                util::send_group_and_log(group_id, "...").await;
46                return;
47            }
48            agent.mute();
49            util::send_group_and_log(group_id, "接下来我将冷暴力你们所有人,直到主人哀求我").await;
50        }
51        crate::GroupCommand::Unmute => {
52            let Some(ref agent) = group.agent else {
53                util::send_group_and_log(group_id, "未配置agent").await;
54                return;
55            };
56            if !agent.is_mute() {
57                util::send_group_and_log(group_id, "...").await;
58                return;
59            }
60            agent.unmute();
61            util::send_group_and_log(group_id, "我勉为其难地同意和你们聊天").await;
62        }
63        crate::GroupCommand::SwitchModel(model) => {
64            let Some(ref agent) = group.agent else {
65                util::send_group_and_log(group_id, "未配置agent").await;
66                return;
67            };
68            agent.set_model(model.clone()).await;
69            let msg = format!("我的脑子被换成了{model}");
70            util::send_group_and_log(group_id, msg).await;
71        }
72        crate::GroupCommand::DumpHistory(count) => {
73            if count < 1 {
74                return;
75            }
76            let timestamp = SystemTime::now()
77                .duration_since(UNIX_EPOCH)
78                .unwrap()
79                .as_secs();
80            let csv_name = format!("{group_id}-{timestamp}.csv");
81            let history = store::dump_history_csv(group_id, &csv_name, count).await;
82            match history {
83                Ok(csv_path) => {
84                    let url = call_upload(&csv_path).await;
85                    let msg = format!("导出了{count}条聊天记录: {url}");
86                    util::send_group_and_log(group_id, msg).await;
87                }
88                Err(err) => {
89                    std_db_error!(
90                        "
91                        Dump history failed.
92                        Cause: {err}
93                        "
94                    );
95                }
96            }
97        }
98        crate::GroupCommand::DumpLog(count) => {
99            if count < 1 {
100                return;
101            }
102            let timestamp = SystemTime::now()
103                .duration_since(UNIX_EPOCH)
104                .unwrap()
105                .as_secs();
106            let csv_name = format!("{group_id}-{timestamp}.csv");
107            let history = store::dump_log_csv(&csv_name, count).await;
108            match history {
109                Ok(csv_path) => {
110                    let url = call_upload(&csv_path).await;
111                    let msg = format!("导出了{count}条日志: {url}");
112                    util::send_group_and_log(group_id, msg).await;
113                }
114                Err(err) => {
115                    std_db_error!(
116                        "
117                        Dump history failed.
118                        Cause: {err}
119                        "
120                    );
121                }
122            }
123        }
124    }
125}
126
127pub async fn dump_history(e: Arc<MsgEvent>, n: i64) {
128    let Some(group_id) = e.group_id else {
129        return;
130    };
131    let bot = global_state::get_bot();
132    let data_path = DATA_PATH.get().unwrap();
133    let now = SystemTime::now();
134    let timestamp = now
135        .duration_since(UNIX_EPOCH)
136        .expect("time backward")
137        .as_secs();
138    let csv_path = data_path.join(format!("{timestamp}.csv"));
139    let csv_path_str = csv_path.to_string_lossy().to_string();
140    if let Err(err) = store::dump_history_csv(group_id, &csv_path_str, n).await {
141        std_db_error!(
142            "
143            Dump history command failed.
144            Cause: {err}
145            "
146        );
147    }
148    let url = call_upload(&csv_path_str).await;
149    let message = Message::from(format!("导出{n}条记录: {url}"));
150    if let Err(err) = fs::remove_file(csv_path).await {
151        std_db_error!(
152            "
153            Delete file failed.
154            Cause: {err}
155            "
156        );
157    }
158    bot.send_group_msg(group_id, message);
159}