Browse Source

add create group chat in local

pull/18/head
Sun 4 years ago
parent
commit
f93506af1f
  1. 22
      lib/apps/group_chat/add.dart
  2. 3
      src/apps/group_chat/models.rs
  3. 54
      src/apps/group_chat/rpc.rs
  4. 4
      src/rpc.rs

22
lib/apps/group_chat/add.dart

@ -51,7 +51,7 @@ class _GroupAddPageState extends State<GroupAddPage> { @@ -51,7 +51,7 @@ class _GroupAddPageState extends State<GroupAddPage> {
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<GroupAddPage> { @@ -60,18 +60,18 @@ class _GroupAddPageState extends State<GroupAddPage> {
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<GroupAddPage> { @@ -149,13 +149,13 @@ class _GroupAddPageState extends State<GroupAddPage> {
_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<GroupAddPage> { @@ -332,12 +332,12 @@ class _GroupAddPageState extends State<GroupAddPage> {
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,

3
src/apps/group_chat/models.rs

@ -95,6 +95,7 @@ impl GroupChat { @@ -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 { @@ -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,
}

54
src/apps/group_chat/rpc.rs

@ -7,10 +7,10 @@ use tdn::types::{ @@ -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<RpcState>) { @@ -174,18 +174,30 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
handler.add_method(
"group-chat-create",
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| 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<RpcState>) { @@ -199,14 +211,24 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
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)
},
);

4
src/rpc.rs

@ -492,6 +492,10 @@ fn new_rpc_handler( @@ -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 => {

Loading…
Cancel
Save