Browse Source

add message type in group chat

pull/18/head
Sun 4 years ago
parent
commit
06ad29fa12
  1. 13
      lib/apps/group_chat/detail.dart
  2. 62
      src/apps/group_chat/models.rs
  3. 3
      src/apps/group_chat/rpc.rs

13
lib/apps/group_chat/detail.dart

@ -97,7 +97,7 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
void _sendImage() async { void _sendImage() async {
final image = await pickImage(); final image = await pickImage();
if (image != null) { if (image != null) {
//context.read<GroupChatProvider>().messageCreate(Message(group.id, MessageType.Image, image)); context.read<GroupChatProvider>().messageCreate(MessageType.Image, image);
} }
setState(() { setState(() {
textFocus.requestFocus(); textFocus.requestFocus();
@ -111,7 +111,7 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
void _sendFile() async { void _sendFile() async {
final file = await pickFile(); final file = await pickFile();
if (file != null) { if (file != null) {
//context.read<GroupChatProvider>().messageCreate(Message(group.id, MessageType.File, file)); context.read<GroupChatProvider>().messageCreate(MessageType.File, file);
} }
setState(() { setState(() {
textFocus.requestFocus(); textFocus.requestFocus();
@ -124,8 +124,9 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
void _sendRecord(int time) async { void _sendRecord(int time) async {
final raw = BaseMessage.rawRecordName(time, _recordName); final raw = BaseMessage.rawRecordName(time, _recordName);
//context.read<GroupChatProvider>().messageCreate(Message(group.id, MessageType.Record, raw)); if (raw != null) {
context.read<GroupChatProvider>().messageCreate(MessageType.Record, raw);
}
setState(() { setState(() {
textFocus.requestFocus(); textFocus.requestFocus();
emojiShow = false; emojiShow = false;
@ -136,7 +137,9 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
} }
_callback(int id) { _callback(int id) {
context.read<GroupChatProvider>().messageCreate(MessageType.Contact, "${id}"); if (id != null) {
context.read<GroupChatProvider>().messageCreate(MessageType.Contact, "${id}");
}
setState(() { setState(() {
textFocus.requestFocus(); textFocus.requestFocus();
emojiShow = false; emojiShow = false;

62
src/apps/group_chat/models.rs

@ -10,10 +10,11 @@ use tdn_storage::local::{DStorage, DsValue};
use group_chat_types::{GroupInfo, GroupType, NetworkMessage}; 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::session::{Session, SessionType};
use crate::storage::{ 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<u8>); pub(crate) struct GroupChatKey(Vec<u8>);
@ -808,8 +809,10 @@ impl Message {
} }
} }
pub(super) fn to_network_message( pub(super) async fn to_network_message(
_mtype: MessageType, base: &PathBuf,
gid: &GroupId,
mtype: MessageType,
content: &str, content: &str,
) -> Result<(NetworkMessage, i64)> { ) -> Result<(NetworkMessage, i64)> {
let start = SystemTime::now(); let start = SystemTime::now();
@ -818,7 +821,56 @@ pub(super) fn to_network_message(
.map(|s| s.as_secs()) .map(|s| s.as_secs())
.unwrap_or(0) as i64; // safe for all life. .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( pub(super) fn from_network_message(

3
src/apps/group_chat/rpc.rs

@ -394,7 +394,8 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
let addr = state.layer.read().await.running(&gid)?.online(&gcd)?; let addr = state.layer.read().await.running(&gid)?.online(&gcd)?;
let mut results = HandleResult::new(); 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 event = Event::MessageCreate(gid, nmsg, datetime);
let data = postcard::to_allocvec(&LayerEvent::Sync(gcd, 0, event)).unwrap_or(vec![]); let data = postcard::to_allocvec(&LayerEvent::Sync(gcd, 0, event)).unwrap_or(vec![]);
let msg = SendType::Event(0, addr, data); let msg = SendType::Event(0, addr, data);

Loading…
Cancel
Save