kovi_plugin_live_agent/
command.rs1use 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}