soup-sdk 0.3.4

채팅 이벤트 수신 SDK
Documentation
use crate::chat::{
    ChatEvent,
    constants::chat_message_fields,
    events::EventMeta,
    parser::{
        raw::{ParseResult, RawMessage},
        user::parse_user_status,
        util::normalize_user_id,
    },
    types::{ChatType, User, UserSubscribe},
};

pub fn parse_chat_event(raw: RawMessage) -> ParseResult<ChatEvent> {
    let sub = parse_subscribe(&raw);

    Ok(ChatEvent {
        meta: EventMeta {
            received_time: raw.received_time,
        },
        chat_type: ChatType::Common,
        comment: raw.field(chat_message_fields::CONTENT)?.replace("\r", ""),
        user: User {
            id: normalize_user_id(raw.field(chat_message_fields::USER_ID)?),
            label: raw.field_string(chat_message_fields::USER_NICK)?,
            status: parse_user_status(raw.field(chat_message_fields::FLAGS)?),
            subscribe: Some(sub),
        },
        is_admin: false,
        emoticon: None,
    })
}

pub fn parse_manager_chat_event(raw: RawMessage) -> ParseResult<ChatEvent> {
    Ok(ChatEvent {
        meta: EventMeta {
            received_time: raw.received_time,
        },
        chat_type: ChatType::Manager,
        comment: raw.field(chat_message_fields::CONTENT)?.replace("\r", ""),
        user: User {
            id: normalize_user_id(raw.field(chat_message_fields::USER_ID)?),
            label: raw.field_string(4)?,
            status: parse_user_status(raw.field(5)?),
            subscribe: None,
        },
        emoticon: None,
        is_admin: raw.field(2)? == "1",
    })
}

fn parse_subscribe(raw: &RawMessage) -> UserSubscribe {
    UserSubscribe {
        acc: raw.parse_u32_or_default(chat_message_fields::ACC_SUBSCRIBE, 0),
        current: raw.parse_u32_or_default(chat_message_fields::SUBSCRIBE, 0),
    }
}