use super::{build_temp_message_event_matcher, Handler, Matcher};
use crate::event::MessageEvent;
use crate::ApiChannelItem;
use async_trait::async_trait;
use colored::*;
use tracing::{event, Level};
impl Matcher<MessageEvent> {
pub async fn send_text(&self, msg: &str) {
let msg = crate::message::Message::Text {
text: msg.to_string(),
};
self.send(vec![msg]).await;
}
pub async fn set_temp_message_event_matcher<H>(&self, event: &MessageEvent, handler: H)
where
H: Handler<MessageEvent> + Send + Sync + 'static,
{
self.set_message_matcher(build_temp_message_event_matcher(event, handler))
.await;
}
pub async fn request_message(
&self,
event: Option<&MessageEvent>,
msg: Option<&str>,
) -> Option<String> {
if let Some(event) = event {
let raw_message = event.get_raw_message();
if !raw_message.is_empty() {
return Some(crate::utils::remove_space(raw_message));
}
}
struct Temp;
#[async_trait]
impl Handler<MessageEvent> for Temp {
crate::on_match_all!();
async fn handle(&self, event: MessageEvent, matcher: Matcher<MessageEvent>) {
matcher
.bot
.clone()
.unwrap()
.api_sender
.send(ApiChannelItem::MessageEvent(event))
.await
.unwrap();
}
fn timeout_drop(&self, matcher: &Matcher<MessageEvent>) {
let sender = matcher.bot.clone().unwrap().api_sender;
tokio::spawn(async move { sender.send(ApiChannelItem::TimeOut).await.unwrap() });
}
}
let (sender, mut receiver) = tokio::sync::mpsc::channel::<ApiChannelItem>(4);
let event = self.event.clone().unwrap();
let mut m = build_temp_message_event_matcher(&event, Temp);
let bot = crate::bot::Bot::new(
"Temp".to_string(),
crate::config::BotConfig::default(),
sender,
self.bot.clone().unwrap().action_sender.clone(),
self.bot.clone().unwrap().api_resp_watcher.clone(),
);
m.bot = Some(bot);
self.set_message_matcher(m).await;
if let Some(msg) = msg {
self.send_text(msg).await;
}
while let Some(data) = receiver.recv().await {
match data {
ApiChannelItem::MessageEvent(event) => {
let msg = crate::utils::remove_space(event.get_raw_message());
if msg.is_empty() {
return None;
} else {
return Some(msg);
}
}
ApiChannelItem::TimeOut => {
event!(Level::DEBUG, "Temp Matcher TimeOut");
return None;
}
_ => {
event!(
Level::WARN,
"{}",
"Temp Matcher接受端接收到错误Api或Action消息".bright_red()
);
} }
}
None
}
pub async fn send(&self, msg: Vec<crate::message::Message>) {
if let (Some(bot), Some(event)) = (&self.bot, &self.event) {
bot.send_by_message_event(&event, msg).await;
} else {
event!(
Level::ERROR,
"{}",
"Sending msg with unbuilt matcher!".red()
);
}
}
}