kovi-onebot 0.13.0

OneBot V11 protocol driver for Kovi bot framework
Documentation
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;

/// 此事件会监听以下消息发送
///
/// "send_msg" => MsgSendFromKoviType::SendMsg
/// "send_private_msg" => MsgSendFromKoviType::SendPrivateMsg
/// "send_group_msg" => MsgSendFromKoviType::SendGroupMsg
/// "send_forward_msg" => MsgSendFromKoviType::SendForwardMsg
/// "send_private_forward_msg" => MsgSendFromKoviType::SendPrivateForwardMsg
/// "send_group_forward_msg" => MsgSendFromKoviType::SendGroupForwardMsg
#[derive(Debug, Clone)]
pub struct MsgSendFromKoviEvent {
    /// 事件类型
    pub event_type: MsgSendFromKoviType,
    /// 发送消息的API内容
    pub send_api: SendApi,
    /// 发送消息的API响应结果
    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
    }
}