From f93506af1f8dc68dbb9cf8653c800eac9f18a818 Mon Sep 17 00:00:00 2001 From: Sun Date: Mon, 2 Aug 2021 22:56:14 +0800 Subject: [PATCH] add create group chat in local --- lib/apps/group_chat/add.dart | 22 +++++++------- src/apps/group_chat/models.rs | 3 +- src/apps/group_chat/rpc.rs | 54 ++++++++++++++++++++++++----------- src/rpc.rs | 4 +++ 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/lib/apps/group_chat/add.dart b/lib/apps/group_chat/add.dart index 8108a01..0371869 100644 --- a/lib/apps/group_chat/add.dart +++ b/lib/apps/group_chat/add.dart @@ -51,7 +51,7 @@ class _GroupAddPageState extends State { FocusNode _createKeyFocus = FocusNode(); Uint8List _createAvatarBytes; - int _groupAddr = 0; + int _groupLocation = 0; int _groupType = 1; bool _groupNeedAgree = false; bool _addrOnline = false; @@ -60,18 +60,18 @@ class _GroupAddPageState extends State { bool _requestsLoadMore = true; - // 0 => encrypted, 1 => common, 2 => open. - Widget _groupAddrWidget(String text, int value, ColorScheme color, bool disabled) { + // 0 => remote, 1 => local. + Widget _groupLocationWidget(String text, int value, ColorScheme color, bool disabled) { return Row( children: [ Radio( value: value, - groupValue: _groupAddr, + groupValue: _groupLocation, onChanged: disabled ? null : (n) => setState(() { - _groupAddr = n; + _groupLocation = n; }), ), - _groupAddr == value + _groupLocation == value ? Text(text, style: TextStyle(color: color.primary)) : (disabled ? Text(text, style: TextStyle(color: Color(0xFFADB0BB))) : Text(text)), @@ -149,13 +149,13 @@ class _GroupAddPageState extends State { _create() { var addr = _createAddrController.text.trim(); // if has 0x, need remove - if (addr.substring(0, 2) == '0x') { + if (addr.length > 2 && addr.substring(0, 2) == '0x') { addr = addr.substring(2); } final name = _createNameController.text.trim(); final bio = _createBioController.text.trim(); final avatar = _createAvatarBytes != null ? base64.encode(_createAvatarBytes) : ""; - rpc.send('group-chat-create', [_groupType, _myName, addr, name, bio, _groupNeedAgree, avatar]); + rpc.send('group-chat-create', [_groupLocation, _groupType, _myName, addr, name, bio, _groupNeedAgree, avatar]); setState(() { _createNameController.text = ''; _createBioController.text = ''; @@ -332,12 +332,12 @@ class _GroupAddPageState extends State { mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - _groupAddrWidget(lang.deviceRemote, 0, color, false), - _groupAddrWidget(lang.deviceLocal, 1, color, true), + _groupLocationWidget(lang.deviceRemote, 0, color, false), + _groupLocationWidget(lang.deviceLocal, 1, color, false), ] ) ), - if (_groupAddr == 0) + if (_groupLocation == 0) Container( height: 50.0, width: 600.0, diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index c856e16..119b9fe 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -95,6 +95,7 @@ impl GroupChat { g_name: String, g_bio: String, is_need_agree: bool, + is_ok: bool, ) -> Self { let g_id = GroupId(rand::thread_rng().gen::<[u8; 32]>()); @@ -116,9 +117,9 @@ impl GroupChat { is_need_agree, key, datetime, + is_ok, id: 0, height: 0, - is_ok: false, is_closed: false, is_deleted: false, } diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index 211f0a4..faa1154 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -7,10 +7,10 @@ use tdn::types::{ }; use tdn_did::Proof; -use group_chat_types::{CheckType, Event, GroupType, JoinProof, LayerEvent}; +use group_chat_types::{CheckType, Event, GroupLocation, GroupType, JoinProof, LayerEvent}; use crate::apps::chat::{Friend, MessageType}; -use crate::rpc::{session_close, session_delete, session_last, RpcState}; +use crate::rpc::{session_close, session_create, session_delete, session_last, RpcState}; use crate::session::{Session, SessionType}; use crate::storage::{chat_db, group_chat_db, read_avatar, session_db, write_avatar}; @@ -174,18 +174,30 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { handler.add_method( "group-chat-create", |gid: GroupId, params: Vec, state: Arc| async move { - let gtype = GroupType::from_u32(params[0].as_i64()? as u32); - let my_name = params[1].as_str()?.to_owned(); - let addr = PeerAddr::from_hex(params[2].as_str()?)?; - let name = params[3].as_str()?.to_owned(); - let bio = params[4].as_str()?.to_owned(); - let need_agree = params[5].as_bool()?; - let avatar = params[6].as_str()?; + let glocation = GroupLocation::from_u32(params[0].as_i64()? as u32); + let gtype = GroupType::from_u32(params[1].as_i64()? as u32); + let my_name = params[2].as_str()?.to_owned(); + let name = params[4].as_str()?.to_owned(); + let bio = params[5].as_str()?.to_owned(); + let need_agree = params[6].as_bool()?; + let avatar = params[7].as_str()?; let avatar_bytes = base64::decode(avatar).unwrap_or(vec![]); let base = state.layer.read().await.base().clone(); let db = group_chat_db(&base, &gid)?; - let mut gc = GroupChat::new(gid, gtype, addr, name, bio, need_agree); + let addr = match glocation { + GroupLocation::Remote => PeerAddr::from_hex(params[3].as_str()?)?, + GroupLocation::Local => state.layer.read().await.addr.clone(), + }; + let mut gc = GroupChat::new( + gid, + gtype, + addr, + name, + bio, + need_agree, + glocation == GroupLocation::Local, + ); let gcd = gc.g_id; // save db @@ -199,14 +211,24 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { let mut results = HandleResult::new(); // add to rpcs. results.rpcs.push(json!(gc.to_rpc())); - let info = gc.to_group_info(my_name, avatar_bytes, me.avatar); - // TODO create proof. - let proof: Proof = Default::default(); + if glocation == GroupLocation::Remote { + let info = gc.to_group_info(my_name, avatar_bytes, me.avatar); + // TODO create proof. + let proof: Proof = Default::default(); + + let data = + postcard::to_allocvec(&LayerEvent::Create(info, proof)).unwrap_or(vec![]); + let s = SendType::Event(0, addr, data); + add_layer(&mut results, gid, s); + } else { + // ADD NEW SESSION. + let s_db = session_db(state.layer.read().await.base(), &gid)?; + let mut session = gc.to_session(); + session.insert(&s_db)?; + results.rpcs.push(session_create(gid, &session)); + } - let data = postcard::to_allocvec(&LayerEvent::Create(info, proof)).unwrap_or(vec![]); - let s = SendType::Event(0, addr, data); - add_layer(&mut results, gid, s); Ok(results) }, ); diff --git a/src/rpc.rs b/src/rpc.rs index e53e590..e93d8ed 100644 --- a/src/rpc.rs +++ b/src/rpc.rs @@ -492,6 +492,10 @@ fn new_rpc_handler( let s = Session::get(&db, &id)?; drop(db); + if s.addr == state.layer.read().await.addr { + return Ok(HandleResult::rpc(json!([id, s.addr.to_hex()]))); + } + let mut results = HandleResult::new(); match s.s_type { SessionType::Chat => {