coolq-sdk-rust 0.1.21

A sdk for coolq
use std::os::raw::c_char;

use crate::{
    api::{Convert, Flag},
    targets::{
        Anonymous,
        group::Group,
        message::{Message, SendMessage},
        user::User,
    },
};
use crate::api::get_group_member_info_v2;
use crate::targets::group::GroupMember;

#[derive(Debug, Clone)]
pub struct GroupMessageEvent {
    pub sub_type: i32,
    pub anonymous_flag: Flag,
    pub msg: Message,
    pub font: i32,
    pub group: Group,
    pub user: User,
}

impl GroupMessageEvent {
    pub fn new(
        sub_type: i32, msg_id: i32, group_id: i64, user_id: i64, anonymous_flag: *const c_char,
        msg: *const c_char, font: i32,
    ) -> Self {
        GroupMessageEvent {
            sub_type,
            anonymous_flag: Convert::from(anonymous_flag).into(),
            msg: Message::new(msg, msg_id),
            font,
            group: Group::new(group_id),
            user: {
                let mut user = User::new(user_id);
                if let Ok(gm) = get_group_member_info_v2(group_id, user_id, false) {
                    user.set_authority(gm.try_to::<GroupMember>().unwrap().authority);
                }
                user
            },
        }
    }

    pub fn get_message(&self) -> &Message {
        &self.msg
    }

    pub fn is_anonymous(&self) -> bool {
        !self.anonymous_flag.is_empty()
    }

    pub fn get_anonymous(&self) -> std::io::Result<Anonymous> {
        if self.is_anonymous() {
            Anonymous::decode(self.anonymous_flag.as_bytes(), self.group.group_id)
        } else {
            Ok(Anonymous::default())
        }
    }

    pub fn reply(&self, msg: impl ToString) -> crate::api::Result<i32> {
        self.group.send_message(msg)
    }

    pub fn reply_at(&self, msg: impl ToString) -> crate::api::Result<i32> {
        self.group.at(self.user.user_id, msg)
    }
}