use super::MessageV3Event;
use serde_json::Value;
fn prepare_last_post(data: &mut Value) {
for key in ["lastPost", "last_post"] {
if let Some(value) = data.get_mut(key) {
*value = crate::message_summary::prepare_post(value);
}
}
}
pub fn created(mut data: Value) -> Result<MessageV3Event, crate::ImError> {
prepare_last_post(&mut data);
super::encode("im:channel:created", data)
}
pub fn create_failed(
request_id: &str,
reason: &str,
message: &str,
) -> Result<MessageV3Event, crate::ImError> {
super::encode(
"im:channel:create-failed",
serde_json::json!({"requestId":request_id,"reason":reason,"message":message}),
)
}
pub fn members(data: Value) -> Result<MessageV3Event, crate::ImError> {
super::encode("im:channel:members", data)
}
pub fn update(mut data: Value) -> Result<MessageV3Event, crate::ImError> {
prepare_last_post(&mut data);
super::encode("im:channel:update", data)
}
pub fn list(data: Value) -> Result<MessageV3Event, crate::ImError> {
super::encode("im:channel:list", data)
}
pub fn closed(data: Value) -> Result<MessageV3Event, crate::ImError> {
super::encode("im:channel:closed", data)
}
pub fn topic_created(data: Value) -> Result<MessageV3Event, crate::ImError> {
super::encode("im:channel:topic-created", data)
}
pub fn settings_updated(data: Value) -> Result<MessageV3Event, crate::ImError> {
super::encode("im:channel:settings-updated", data)
}
pub fn settings_from_authority(
channel_id: &str,
authority: &Value,
) -> Result<Option<MessageV3Event>, crate::ImError> {
let settings = authority
.get("settings")
.filter(|value| value.is_object())
.unwrap_or(authority);
let Some(version) = authority
.get("settingVersion")
.or_else(|| authority.get("setting_version"))
.or_else(|| settings.get("settingVersion"))
.or_else(|| settings.get("setting_version"))
.cloned()
else {
return Ok(None);
};
let mut data = serde_json::Map::new();
data.insert(
"channelId".to_string(),
Value::String(channel_id.to_string()),
);
data.insert("settingVersion".to_string(), version);
for key in [
"displayName",
"header",
"purpose",
"notice",
"orient",
"module",
"source",
"pictureType",
"picture",
] {
if let Some(value) = settings.get(key) {
data.insert(key.to_string(), value.clone());
}
}
settings_updated(Value::Object(data)).map(Some)
}