From 06ad29fa129febe53d409ef79da961de2dc828c5 Mon Sep 17 00:00:00 2001 From: Sun Date: Thu, 3 Jun 2021 14:42:07 +0800 Subject: [PATCH] add message type in group chat --- lib/apps/group_chat/detail.dart | 13 ++++--- src/apps/group_chat/models.rs | 62 ++++++++++++++++++++++++++++++--- src/apps/group_chat/rpc.rs | 3 +- 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/lib/apps/group_chat/detail.dart b/lib/apps/group_chat/detail.dart index ec36a1b..a302809 100644 --- a/lib/apps/group_chat/detail.dart +++ b/lib/apps/group_chat/detail.dart @@ -97,7 +97,7 @@ class _GroupChatDetailState extends State { void _sendImage() async { final image = await pickImage(); if (image != null) { - //context.read().messageCreate(Message(group.id, MessageType.Image, image)); + context.read().messageCreate(MessageType.Image, image); } setState(() { textFocus.requestFocus(); @@ -111,7 +111,7 @@ class _GroupChatDetailState extends State { void _sendFile() async { final file = await pickFile(); if (file != null) { - //context.read().messageCreate(Message(group.id, MessageType.File, file)); + context.read().messageCreate(MessageType.File, file); } setState(() { textFocus.requestFocus(); @@ -124,8 +124,9 @@ class _GroupChatDetailState extends State { void _sendRecord(int time) async { final raw = BaseMessage.rawRecordName(time, _recordName); - //context.read().messageCreate(Message(group.id, MessageType.Record, raw)); - + if (raw != null) { + context.read().messageCreate(MessageType.Record, raw); + } setState(() { textFocus.requestFocus(); emojiShow = false; @@ -136,7 +137,9 @@ class _GroupChatDetailState extends State { } _callback(int id) { - context.read().messageCreate(MessageType.Contact, "${id}"); + if (id != null) { + context.read().messageCreate(MessageType.Contact, "${id}"); + } setState(() { textFocus.requestFocus(); emojiShow = false; diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index 37fcdeb..3d3a5f0 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -10,10 +10,11 @@ use tdn_storage::local::{DStorage, DsValue}; use group_chat_types::{GroupInfo, GroupType, NetworkMessage}; -use crate::apps::chat::MessageType; +use crate::apps::chat::{Friend, MessageType}; use crate::session::{Session, SessionType}; use crate::storage::{ - group_chat_db, write_avatar_sync, write_file_sync, write_image_sync, write_record_sync, + chat_db, group_chat_db, read_avatar, read_file, read_record, write_avatar_sync, + write_file_sync, write_image_sync, write_record_sync, }; pub(crate) struct GroupChatKey(Vec); @@ -808,8 +809,10 @@ impl Message { } } -pub(super) fn to_network_message( - _mtype: MessageType, +pub(super) async fn to_network_message( + base: &PathBuf, + gid: &GroupId, + mtype: MessageType, content: &str, ) -> Result<(NetworkMessage, i64)> { let start = SystemTime::now(); @@ -818,7 +821,56 @@ pub(super) fn to_network_message( .map(|s| s.as_secs()) .unwrap_or(0) as i64; // safe for all life. - Ok((NetworkMessage::String(content.to_owned()), datetime)) + let nmsg = match mtype { + MessageType::String => NetworkMessage::String(content.to_owned()), + MessageType::Image => { + let bytes = read_file(&PathBuf::from(content)).await?; + NetworkMessage::Image(bytes) + } + MessageType::File => { + let file_path = PathBuf::from(content); + let bytes = read_file(&file_path).await?; + let old_name = file_path + .file_name() + .and_then(|s| s.to_str()) + .unwrap_or("") + .to_owned(); + NetworkMessage::File(old_name, bytes) + } + MessageType::Contact => { + let cid: i64 = content.parse().map_err(|_e| new_io_error("id error"))?; + let db = chat_db(base, gid)?; + let contact = Friend::get_id(&db, cid)?.ok_or(new_io_error("contact missind"))?; + drop(db); + let avatar_bytes = read_avatar(base, &gid, &contact.gid).await?; + NetworkMessage::Contact(contact.name, contact.gid, contact.addr, avatar_bytes) + } + MessageType::Record => { + let (bytes, time) = if let Some(i) = content.find('-') { + let time = content[0..i].parse().unwrap_or(0); + let bytes = read_record(base, &gid, &content[i + 1..]).await?; + (bytes, time) + } else { + (vec![], 0) + }; + NetworkMessage::Record(bytes, time) + } + MessageType::Emoji => { + // TODO + NetworkMessage::Emoji + } + MessageType::Phone => { + // TODO + NetworkMessage::Phone + } + MessageType::Video => { + // TODO + NetworkMessage::Video + } + MessageType::Invite => NetworkMessage::Invite(content.to_owned()), + }; + + Ok((nmsg, datetime)) } pub(super) fn from_network_message( diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index 552d753..7d6d257 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -394,7 +394,8 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { let addr = state.layer.read().await.running(&gid)?.online(&gcd)?; let mut results = HandleResult::new(); - let (nmsg, datetime) = to_network_message(m_type, m_content)?; + let base = state.group.read().await.base().clone(); + let (nmsg, datetime) = to_network_message(&base, &gid, m_type, m_content).await?; let event = Event::MessageCreate(gid, nmsg, datetime); let data = postcard::to_allocvec(&LayerEvent::Sync(gcd, 0, event)).unwrap_or(vec![]); let msg = SendType::Event(0, addr, data);