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),
}
}