botcat-capoo 1.0.3

A NapCat based QQ bot implemented in Rust
Documentation
use serde::{Deserialize, Serialize};

use crate::model::message::GroupMessageSender;

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct GroupMessageEvent {
    pub sub_type: GroupMessageType,
    pub message_id: u64,
    pub user_id: u64,
    pub group_id: u64,
    pub message: Vec<crate::model::message::segment::MessageSegment>,
    pub sender: GroupMessageSender,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum GroupMessageType {
    Normal,
    Anonymous,
    Notice,
}

#[cfg(test)]
mod tests {
    use crate::model::{
        event::{BotEvent, GroupMessageType, MessageEvent, PostEvent},
        message::segment::MessageSegment,
    };

    #[test]
    fn test_deserialize_group_message_event() {
        let json = r#"{"self_id":1796626362,"user_id":46595749,"time":1757679986,"message_id":434374353,"message_seq":434374353,"real_id":434374353,"real_seq":"9635","message_type":"group","sender":{"user_id":46595749,"nickname":"cc","card":"","role":"admin"},"raw_message":"[CQ:reply,id=1319395129][CQ:at,qq=3552586437] awien[CQ:at,qq=3552586437] this is so[CQ:image,file=A77A80E0DBF6A73387AEF190D7C1D449.png,sub_type=0,url=https://multimedia.nt.qq.com.cn/download?appid=1407&amp;fileid=EhSWQKnNsZw62WxE3e06_g2FOTLzMhi1TSD_Ciid5biZnNOPAzIEcHJvZFCAvaMBWhDu6vYT0HHKmBmI5fcYnxxMegJz3YIBAmd6&amp;rkey=CAQSMJskH7OvWAf5THIthpOJiC7-5xpK-c_vVUgMbde7dji8rjxdui9q1zQrlOd80pE_hQ,file_size=9909]me test [CQ:at,qq=1796626362] [CQ:image,file=F0C83EF6E2FE6B69CD7624F679783519.png,sub_type=0,url=https://multimedia.nt.qq.com.cn/download?appid=1407&amp;fileid=EhQj6-w8uY-4c7R-64HHnWi-e7lMTxi6hQIg_wooie63mZzTjwMyBHByb2RQgL2jAVoQRzVWZ63jQK9D3N40-hwnPXoCTJSCAQJneg&amp;rkey=CAQSMJskH7OvWAf5THIthpOJiC7-5xpK-c_vVUgMbde7dji8rjxdui9q1zQrlOd80pE_hQ,file_size=33466]","font":14,"sub_type":"normal","message":[{"type":"reply","data":{"id":"1319395129"}},{"type":"at","data":{"qq":"3552586437"}},{"type":"text","data":{"text":" awien"}},{"type":"at","data":{"qq":"3552586437"}},{"type":"text","data":{"text":" this is so"}},{"type":"image","data":{"summary":"","file":"A77A80E0DBF6A73387AEF190D7C1D449.png","sub_type":0,"url":"https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=EhSWQKnNsZw62WxE3e06_g2FOTLzMhi1TSD_Ciid5biZnNOPAzIEcHJvZFCAvaMBWhDu6vYT0HHKmBmI5fcYnxxMegJz3YIBAmd6&rkey=CAQSMJskH7OvWAf5THIthpOJiC7-5xpK-c_vVUgMbde7dji8rjxdui9q1zQrlOd80pE_hQ","file_size":"9909"}},{"type":"text","data":{"text":"me test "}},{"type":"at","data":{"qq":"1796626362"}},{"type":"text","data":{"text":" "}},{"type":"image","data":{"summary":"","file":"F0C83EF6E2FE6B69CD7624F679783519.png","sub_type":0,"url":"https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=EhQj6-w8uY-4c7R-64HHnWi-e7lMTxi6hQIg_wooie63mZzTjwMyBHByb2RQgL2jAVoQRzVWZ63jQK9D3N40-hwnPXoCTJSCAQJneg&rkey=CAQSMJskH7OvWAf5THIthpOJiC7-5xpK-c_vVUgMbde7dji8rjxdui9q1zQrlOd80pE_hQ","file_size":"33466"}}],"message_format":"array","post_type":"message","group_id":738943282,"group_name":"入机研究中心"}"#;
        let bot_event: BotEvent = serde_json::from_str(json).expect("Failed to deserialize JSON");

        match bot_event.post_type {
            PostEvent::Message(message_event) => match message_event {
                MessageEvent::Group(group_msg) => {
                    assert_eq!(group_msg.group_id, 738943282);
                    assert_eq!(group_msg.user_id, 46595749);
                    let GroupMessageType::Normal = group_msg.sub_type else {
                        panic!("Expected Normal sub_type");
                    };
                    assert_eq!(group_msg.message_id, 434374353);
                    assert_eq!(
                        group_msg.message,
                        vec![
                            MessageSegment::Reply {
                                id: "1319395129".to_string()
                            },
                            MessageSegment::At {
                                qq: "3552586437".to_string()
                            },
                            MessageSegment::Text {
                                text: " awien".to_string()
                            },
                            MessageSegment::At {
                                qq: "3552586437".to_string()
                            },
                            MessageSegment::Text {
                                text: " this is so".to_string()
                            },
                            MessageSegment::Image {
                                file: "A77A80E0DBF6A73387AEF190D7C1D449.png".to_string(),
                                url: Some("https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=EhSWQKnNsZw62WxE3e06_g2FOTLzMhi1TSD_Ciid5biZnNOPAzIEcHJvZFCAvaMBWhDu6vYT0HHKmBmI5fcYnxxMegJz3YIBAmd6&rkey=CAQSMJskH7OvWAf5THIthpOJiC7-5xpK-c_vVUgMbde7dji8rjxdui9q1zQrlOd80pE_hQ".to_string()),
                                summary: Some("".to_string()),
                                sub_type: Some(0),
                                file_size: Some("9909".to_string()),
                                key: None,
                                emoji_id: None,
                                emoji_package_id: None,
                            },
                            MessageSegment::Text {
                                text: "me test ".to_string()
                            },
                            MessageSegment::At {
                                qq: "1796626362".to_string()
                            },
                            MessageSegment::Text {
                                text: " ".to_string()
                            },
                            MessageSegment::Image {
                                file: "F0C83EF6E2FE6B69CD7624F679783519.png".to_string(),
                                url: Some("https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=EhQj6-w8uY-4c7R-64HHnWi-e7lMTxi6hQIg_wooie63mZzTjwMyBHByb2RQgL2jAVoQRzVWZ63jQK9D3N40-hwnPXoCTJSCAQJneg&rkey=CAQSMJskH7OvWAf5THIthpOJiC7-5xpK-c_vVUgMbde7dji8rjxdui9q1zQrlOd80pE_hQ".to_string()),
                                summary: Some("".to_string()),
                                sub_type: Some(0),
                                file_size: Some("33466".to_string()),
                                key: None,
                                emoji_id: None,
                                emoji_package_id: None,
                            },
                        ]
                    );
                }
                _ => panic!("Expected GroupMessage event"),
            },
            _ => panic!("Expected Message event"),
        }
    }
}