use kovi::ApiReturn;
use kovi::bot::runtimebot::CanSendApi;
use kovi::bot::{BotInformation, SendApi};
use kovi::event::{Event, InternalEvent};
use kovi::types::ApiAndOptOneshot;
use tokio::sync::mpsc;
#[derive(Debug, Clone)]
pub struct MsgSendFromKoviEvent {
pub event_type: MsgSendFromKoviType,
pub send_api: SendApi,
pub res: Result<ApiReturn, ApiReturn>,
pub api_tx: mpsc::Sender<ApiAndOptOneshot>,
}
#[derive(Debug, Copy, Clone)]
pub enum MsgSendFromKoviType {
SendMsg,
SendPrivateMsg,
SendGroupMsg,
SendForwardMsg,
SendPrivateForwardMsg,
SendGroupForwardMsg,
}
impl TryFrom<String> for MsgSendFromKoviType {
type Error = String;
fn try_from(value: String) -> Result<Self, Self::Error> {
match value.as_str() {
"send_msg" => Ok(MsgSendFromKoviType::SendMsg),
"send_private_msg" => Ok(MsgSendFromKoviType::SendPrivateMsg),
"send_group_msg" => Ok(MsgSendFromKoviType::SendGroupMsg),
"send_forward_msg" => Ok(MsgSendFromKoviType::SendForwardMsg),
"send_private_forward_msg" => Ok(MsgSendFromKoviType::SendPrivateForwardMsg),
"send_group_forward_msg" => Ok(MsgSendFromKoviType::SendGroupForwardMsg),
_ => Err(format!("Invalid MsgSendFromKoviType: {value}")),
}
}
}
impl TryFrom<&str> for MsgSendFromKoviType {
type Error = String;
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value {
"send_msg" => Ok(MsgSendFromKoviType::SendMsg),
"send_private_msg" => Ok(MsgSendFromKoviType::SendPrivateMsg),
"send_group_msg" => Ok(MsgSendFromKoviType::SendGroupMsg),
"send_forward_msg" => Ok(MsgSendFromKoviType::SendForwardMsg),
"send_private_forward_msg" => Ok(MsgSendFromKoviType::SendPrivateForwardMsg),
"send_group_forward_msg" => Ok(MsgSendFromKoviType::SendGroupForwardMsg),
_ => Err(format!("Invalid MsgSendFromKoviType: {value}")),
}
}
}
impl TryFrom<&String> for MsgSendFromKoviType {
type Error = String;
fn try_from(value: &String) -> Result<Self, Self::Error> {
match value.as_str() {
"send_msg" => Ok(MsgSendFromKoviType::SendMsg),
"send_private_msg" => Ok(MsgSendFromKoviType::SendPrivateMsg),
"send_group_msg" => Ok(MsgSendFromKoviType::SendGroupMsg),
"send_forward_msg" => Ok(MsgSendFromKoviType::SendForwardMsg),
"send_private_forward_msg" => Ok(MsgSendFromKoviType::SendPrivateForwardMsg),
"send_group_forward_msg" => Ok(MsgSendFromKoviType::SendGroupForwardMsg),
_ => Err(format!("Invalid MsgSendFromKoviType: {value}")),
}
}
}
impl Event for MsgSendFromKoviEvent {
fn de(
event: &InternalEvent,
_: &BotInformation,
api_tx: &mpsc::Sender<ApiAndOptOneshot>,
) -> Option<Self> {
let InternalEvent::DriverApiEvent((send_api, res)) = event else {
return None;
};
let Ok(event_type) = MsgSendFromKoviType::try_from(&send_api.action) else {
return None;
};
Some(Self::new(
event_type,
send_api.clone(),
res.clone(),
api_tx.clone(),
))
}
}
impl MsgSendFromKoviEvent {
fn new(
event_type: MsgSendFromKoviType,
send_api: SendApi,
res: Result<ApiReturn, ApiReturn>,
api_tx: mpsc::Sender<ApiAndOptOneshot>,
) -> MsgSendFromKoviEvent {
MsgSendFromKoviEvent {
event_type,
send_api,
res,
api_tx,
}
}
}
impl CanSendApi for MsgSendFromKoviEvent {
fn __get_api_tx(&self) -> &tokio::sync::mpsc::Sender<kovi::types::ApiAndOptOneshot> {
&self.api_tx
}
}