diff --git a/lib/apps/group_chat/models.dart b/lib/apps/group_chat/models.dart index 098ff1f..7bcac1d 100644 --- a/lib/apps/group_chat/models.dart +++ b/lib/apps/group_chat/models.dart @@ -115,6 +115,7 @@ class GroupChat { class Request { int id; int fid; + int rid; String gid; String addr; String name; @@ -138,13 +139,14 @@ class Request { Request.fromList(List params) { this.id = params[0]; this.fid = params[1]; - this.gid = params[2]; - this.addr = params[3]; - this.name = params[4]; - this.remark = params[5]; - this.ok = params[6]; - this.over = params[7]; - this.time = RelativeTime.fromInt(params[8]); + this.rid = params[2]; + this.gid = params[3]; + this.addr = params[4]; + this.name = params[5]; + this.remark = params[6]; + this.ok = params[7]; + this.over = params[8]; + this.time = RelativeTime.fromInt(params[9]); } } diff --git a/lib/apps/group_chat/provider.dart b/lib/apps/group_chat/provider.dart index 149d61c..483394f 100644 --- a/lib/apps/group_chat/provider.dart +++ b/lib/apps/group_chat/provider.dart @@ -62,9 +62,8 @@ class GroupChatProvider extends ChangeNotifier { rpc.addListener('group-chat-detail', _detail, true); // rpc.addListener('group-chat-update', _update, false); rpc.addListener('group-chat-join', _join, true); - rpc.addListener('group-chat-agree', _agree, true); - rpc.addListener('group-chat-reject', _reject, false); rpc.addListener('group-chat-request-list', _requestList, false); + rpc.addListener('group-chat-request-handle', _requestHandle, false); rpc.addListener('group-chat-member-join', _memberJoin, false); rpc.addListener('group-chat-member-info', _memberInfo, false); // rpc.addListener('group-chat-member-leave', _memberLeave, false); @@ -117,6 +116,14 @@ class GroupChatProvider extends ChangeNotifier { rpc.send('group-chat-join', [gid, gaddr, name, remark, key]); } + requestHandle(String gid, int id, int rid, bool ok) { + rpc.send('group-chat-request-handle', [gid, id, rid, ok]); + } + + requestBlock(String gid, String rgid) { + rpc.send('group-chat-request-block', [gid, rgid]); + } + messageCreate(MessageType mtype, String content) { final gid = this.activedGroup.gid; rpc.send('group-chat-message-create', [gid, mtype.toInt(), content]); @@ -213,22 +220,11 @@ class GroupChatProvider extends ChangeNotifier { notifyListeners(); } - _agree(List params) { - final id = params[0]; - if (this.requests.containsKey(id)) { - this.requests[id].overIt(false); - } - - final gc = GroupChat.fromList(params[1]); - this.orderKeys.add(gc.id); - this.groups[gc.id] = gc; - notifyListeners(); - } - - _reject(List params) { + _requestHandle(List params) { final id = params[0]; + final ok = params[1]; if (this.requests.containsKey(id)) { - this.requests[id].overIt(false); + this.requests[id].overIt(ok); notifyListeners(); } } diff --git a/src/apps/group_chat/layer.rs b/src/apps/group_chat/layer.rs index 71b48ee..cf67463 100644 --- a/src/apps/group_chat/layer.rs +++ b/src/apps/group_chat/layer.rs @@ -9,7 +9,9 @@ use tdn::{ }, }; -use group_chat_types::{ConnectProof, Event, LayerConnect, LayerEvent, LayerResult, PackedEvent}; +use group_chat_types::{ + ConnectProof, Event, JoinProof, LayerConnect, LayerEvent, LayerResult, PackedEvent, +}; use tdn_did::Proof; use tdn_storage::local::DStorage; @@ -189,11 +191,11 @@ async fn handle_event( .prove_addr(&mgid, &addr)?; add_layer(results, mgid, group_chat_conn(proof, addr, gcd)); } - LayerEvent::Reject(gcd) => { + LayerEvent::Reject(gcd, efficacy) => { println!("Reject.........."); let db = group_chat_db(layer.read().await.base(), &mgid)?; let (rid, _key) = Request::over(&db, &gcd, true)?; - results.rpcs.push(rpc::group_reject(mgid, rid)); + results.rpcs.push(rpc::group_reject(mgid, rid, efficacy)); } LayerEvent::MemberOnline(gcd, mid, maddr) => { let (_sid, gid) = layer.read().await.get_running_remote_id(&mgid, &gcd)?; @@ -259,11 +261,37 @@ async fn handle_event( mgid, gid, gcd, addr, height, from, to, events, base, results, )?; } - LayerEvent::Check => {} // nerver here. - LayerEvent::Create(..) => {} // nerver here. - LayerEvent::Request(..) => {} // nerver here. - LayerEvent::RequestResult(..) => {} // nerver here. - LayerEvent::SyncReq(..) => {} // Never here. + LayerEvent::RequestHandle(gcd, rgid, raddr, join_proof, rid, time) => { + let (_sid, gid) = layer.read().await.get_running_remote_id(&mgid, &gcd)?; + + match join_proof { + JoinProof::Invite(i, _proof, mname, mavatar) => { + let mut req = + Request::new_by_remote(gid, rid, rgid, raddr, mname, i.to_hex(), time); + let base = layer.read().await.base().clone(); + let db = group_chat_db(&base, &mgid)?; + req.insert(&db)?; + if mavatar.len() > 0 { + write_avatar_sync(&base, &mgid, &rgid, mavatar)?; + } + results.rpcs.push(rpc::request_create(mgid, &req)); + } + JoinProof::Zkp(_proof) => { + // + } + JoinProof::Open(..) => {} // nerver here. + } + } + LayerEvent::RequestResult(gcd, rid, ok) => { + let (_sid, _gid) = layer.read().await.get_running_remote_id(&mgid, &gcd)?; + let db = group_chat_db(layer.read().await.base(), &mgid)?; + let id = Request::over_rid(&db, &gcd, &rid, ok)?; + results.rpcs.push(rpc::request_handle(mgid, id, ok)); + } + LayerEvent::Request(..) => {} // nerver here. + LayerEvent::Check => {} // nerver here. + LayerEvent::Create(..) => {} // nerver here. + LayerEvent::SyncReq(..) => {} // Nerver here. } Ok(()) diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index 23456a2..f492142 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -344,6 +344,7 @@ impl GroupChat { pub(crate) struct Request { id: i64, fid: i64, + rid: i64, pub gid: GroupId, pub addr: PeerAddr, pub name: String, @@ -358,6 +359,7 @@ pub(crate) struct Request { impl Request { pub fn new_by_remote( fid: i64, + rid: i64, gid: GroupId, addr: PeerAddr, name: String, @@ -366,6 +368,7 @@ impl Request { ) -> Self { Self { fid, + rid, gid, addr, name, @@ -403,6 +406,7 @@ impl Request { is_over: false, is_deleted: false, fid: 0, + rid: 0, id: 0, } } @@ -411,6 +415,7 @@ impl Request { json!([ self.id, self.fid, + self.rid, self.gid.to_hex(), self.addr.to_hex(), self.name, @@ -438,6 +443,7 @@ impl Request { name: v.pop().unwrap().as_string(), addr: PeerAddr::from_hex(v.pop().unwrap().as_string()).unwrap_or(Default::default()), gid: GroupId::from_hex(v.pop().unwrap().as_string()).unwrap_or(Default::default()), + rid: v.pop().unwrap().as_i64(), fid: v.pop().unwrap().as_i64(), id: v.pop().unwrap().as_i64(), } @@ -445,9 +451,9 @@ impl Request { pub fn list(db: &DStorage, is_all: bool) -> Result> { let sql = if is_all { - format!("SELECT id, fid, gid, addr, name, remark, is_ok, is_over, datetime FROM requests WHERE is_deleted = false") + format!("SELECT id, fid, rid, gid, addr, name, remark, is_ok, is_over, datetime FROM requests WHERE is_deleted = false") } else { - format!("SELECT id, fid, gid, addr, name, remark, is_ok, is_over, datetime FROM requests WHERE is_deleted = false AND is_over = 0") + format!("SELECT id, fid, rid, gid, addr, name, remark, is_ok, is_over, datetime FROM requests WHERE is_deleted = false AND is_over = 0") }; let matrix = db.query(&sql)?; let mut requests = vec![]; @@ -458,8 +464,9 @@ impl Request { } pub fn insert(&mut self, db: &DStorage) -> Result<()> { - let sql = format!("INSERT INTO requests (fid, gid, addr, name, remark, key, is_ok, is_over, datetime, is_deleted) VALUES ({}, '{}', '{}', '{}', '{}', '{}', {}, {}, {}, false)", + let sql = format!("INSERT INTO requests (fid, rid, gid, addr, name, remark, key, is_ok, is_over, datetime, is_deleted) VALUES ({}, {}, '{}', '{}', '{}', '{}', '{}', {}, {}, {}, false)", self.fid, + self.rid, self.gid.to_hex(), self.addr.to_hex(), self.name, @@ -474,6 +481,24 @@ impl Request { Ok(()) } + pub fn over_rid(db: &DStorage, gcd: &GroupId, rid: &i64, is_ok: bool) -> Result { + let mut matrix = db.query(&format!( + "SELECT id from requests WHERE gid = '{}' AND rid = {} AND is_over = 0", + gcd.to_hex(), + rid + ))?; + if matrix.len() == 0 { + return Err(new_io_error("request is missing")); + } + let id = matrix.pop().unwrap().pop().unwrap().as_i64(); // safe. + let sql = format!( + "UPDATE requests SET is_ok={}, is_over=1 WHERE id = {}", + is_ok, id, + ); + db.update(&sql)?; + Ok(id) + } + pub fn over(db: &DStorage, gcd: &GroupId, is_ok: bool) -> Result<(i64, GroupChatKey)> { let matrix = db.query(&format!( "SELECT id, key from requests WHERE gid = '{}' AND is_over = 0 ORDER BY id", diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index c009988..f126175 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -33,8 +33,18 @@ pub(crate) fn group_agree(mgid: GroupId, rid: i64, group: GroupChat) -> RpcParam } #[inline] -pub(crate) fn group_reject(mgid: GroupId, rid: i64) -> RpcParam { - rpc_response(0, "group-chat-reject", json!([rid]), mgid) +pub(crate) fn group_reject(mgid: GroupId, rid: i64, efficacy: bool) -> RpcParam { + rpc_response(0, "group-chat-reject", json!([rid, efficacy]), mgid) +} + +#[inline] +pub(crate) fn request_create(mgid: GroupId, req: &Request) -> RpcParam { + rpc_response(0, "group-chat-join", json!(req.to_rpc()), mgid) +} + +#[inline] +pub(crate) fn request_handle(mgid: GroupId, id: i64, ok: bool) -> RpcParam { + rpc_response(0, "group-chat-join-handle", json!([id, ok]), mgid) } #[inline] @@ -249,6 +259,26 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { }, ); + handler.add_method( + "group-chat-request-handle", + |gid: GroupId, params: Vec, state: Arc| async move { + let gcd = GroupId::from_hex(params[0].as_str()?)?; + let id = params[1].as_i64()?; + let rid = params[2].as_i64()?; + let ok = params[3].as_bool()?; + + let db = group_chat_db(state.layer.read().await.base(), &gid)?; + let gc = GroupChat::get_id(&db, &id)??; + + let mut results = HandleResult::new(); + let data = + postcard::to_allocvec(&LayerEvent::RequestResult(gcd, rid, ok)).unwrap_or(vec![]); + let s = SendType::Event(0, gc.g_addr, data); + add_layer(&mut results, gid, s); + Ok(results) + }, + ); + handler.add_method( "group-chat-message-create", |gid: GroupId, params: Vec, state: Arc| async move { diff --git a/src/migrate/group_chat.rs b/src/migrate/group_chat.rs index 54b28c6..cbc4d2e 100644 --- a/src/migrate/group_chat.rs +++ b/src/migrate/group_chat.rs @@ -18,6 +18,7 @@ pub(super) const GROUP_CHAT_VERSIONS: [&str; 4] = [ "CREATE TABLE IF NOT EXISTS requests( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, fid INTEGER NOT NULL, + rid INTEGER NOT NULL, gid TEXT NOT NULL, addr TEXT NOT NULL, name TEXT NOT NULL,