Browse Source

group chat request and handle request

pull/18/head
Sun 4 years ago
parent
commit
6b90fadf61
  1. 16
      lib/apps/group_chat/models.dart
  2. 28
      lib/apps/group_chat/provider.dart
  3. 44
      src/apps/group_chat/layer.rs
  4. 31
      src/apps/group_chat/models.rs
  5. 34
      src/apps/group_chat/rpc.rs
  6. 1
      src/migrate/group_chat.rs

16
lib/apps/group_chat/models.dart

@ -115,6 +115,7 @@ class GroupChat {
class Request { class Request {
int id; int id;
int fid; int fid;
int rid;
String gid; String gid;
String addr; String addr;
String name; String name;
@ -138,13 +139,14 @@ class Request {
Request.fromList(List params) { Request.fromList(List params) {
this.id = params[0]; this.id = params[0];
this.fid = params[1]; this.fid = params[1];
this.gid = params[2]; this.rid = params[2];
this.addr = params[3]; this.gid = params[3];
this.name = params[4]; this.addr = params[4];
this.remark = params[5]; this.name = params[5];
this.ok = params[6]; this.remark = params[6];
this.over = params[7]; this.ok = params[7];
this.time = RelativeTime.fromInt(params[8]); this.over = params[8];
this.time = RelativeTime.fromInt(params[9]);
} }
} }

28
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-detail', _detail, true);
// rpc.addListener('group-chat-update', _update, false); // rpc.addListener('group-chat-update', _update, false);
rpc.addListener('group-chat-join', _join, true); 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-list', _requestList, false);
rpc.addListener('group-chat-request-handle', _requestHandle, false);
rpc.addListener('group-chat-member-join', _memberJoin, false); rpc.addListener('group-chat-member-join', _memberJoin, false);
rpc.addListener('group-chat-member-info', _memberInfo, false); rpc.addListener('group-chat-member-info', _memberInfo, false);
// rpc.addListener('group-chat-member-leave', _memberLeave, 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]); 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) { messageCreate(MessageType mtype, String content) {
final gid = this.activedGroup.gid; final gid = this.activedGroup.gid;
rpc.send('group-chat-message-create', [gid, mtype.toInt(), content]); rpc.send('group-chat-message-create', [gid, mtype.toInt(), content]);
@ -213,22 +220,11 @@ class GroupChatProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
_agree(List params) { _requestHandle(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) {
final id = params[0]; final id = params[0];
final ok = params[1];
if (this.requests.containsKey(id)) { if (this.requests.containsKey(id)) {
this.requests[id].overIt(false); this.requests[id].overIt(ok);
notifyListeners(); notifyListeners();
} }
} }

44
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_did::Proof;
use tdn_storage::local::DStorage; use tdn_storage::local::DStorage;
@ -189,11 +191,11 @@ async fn handle_event(
.prove_addr(&mgid, &addr)?; .prove_addr(&mgid, &addr)?;
add_layer(results, mgid, group_chat_conn(proof, addr, gcd)); add_layer(results, mgid, group_chat_conn(proof, addr, gcd));
} }
LayerEvent::Reject(gcd) => { LayerEvent::Reject(gcd, efficacy) => {
println!("Reject.........."); println!("Reject..........");
let db = group_chat_db(layer.read().await.base(), &mgid)?; let db = group_chat_db(layer.read().await.base(), &mgid)?;
let (rid, _key) = Request::over(&db, &gcd, true)?; 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) => { LayerEvent::MemberOnline(gcd, mid, maddr) => {
let (_sid, gid) = layer.read().await.get_running_remote_id(&mgid, &gcd)?; 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, mgid, gid, gcd, addr, height, from, to, events, base, results,
)?; )?;
} }
LayerEvent::Check => {} // nerver here. LayerEvent::RequestHandle(gcd, rgid, raddr, join_proof, rid, time) => {
LayerEvent::Create(..) => {} // nerver here. let (_sid, gid) = layer.read().await.get_running_remote_id(&mgid, &gcd)?;
LayerEvent::Request(..) => {} // nerver here.
LayerEvent::RequestResult(..) => {} // nerver here. match join_proof {
LayerEvent::SyncReq(..) => {} // Never here. 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(()) Ok(())

31
src/apps/group_chat/models.rs

@ -344,6 +344,7 @@ impl GroupChat {
pub(crate) struct Request { pub(crate) struct Request {
id: i64, id: i64,
fid: i64, fid: i64,
rid: i64,
pub gid: GroupId, pub gid: GroupId,
pub addr: PeerAddr, pub addr: PeerAddr,
pub name: String, pub name: String,
@ -358,6 +359,7 @@ pub(crate) struct Request {
impl Request { impl Request {
pub fn new_by_remote( pub fn new_by_remote(
fid: i64, fid: i64,
rid: i64,
gid: GroupId, gid: GroupId,
addr: PeerAddr, addr: PeerAddr,
name: String, name: String,
@ -366,6 +368,7 @@ impl Request {
) -> Self { ) -> Self {
Self { Self {
fid, fid,
rid,
gid, gid,
addr, addr,
name, name,
@ -403,6 +406,7 @@ impl Request {
is_over: false, is_over: false,
is_deleted: false, is_deleted: false,
fid: 0, fid: 0,
rid: 0,
id: 0, id: 0,
} }
} }
@ -411,6 +415,7 @@ impl Request {
json!([ json!([
self.id, self.id,
self.fid, self.fid,
self.rid,
self.gid.to_hex(), self.gid.to_hex(),
self.addr.to_hex(), self.addr.to_hex(),
self.name, self.name,
@ -438,6 +443,7 @@ impl Request {
name: v.pop().unwrap().as_string(), name: v.pop().unwrap().as_string(),
addr: PeerAddr::from_hex(v.pop().unwrap().as_string()).unwrap_or(Default::default()), 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()), 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(), fid: v.pop().unwrap().as_i64(),
id: 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<Vec<Request>> { pub fn list(db: &DStorage, is_all: bool) -> Result<Vec<Request>> {
let sql = if is_all { 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 { } 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 matrix = db.query(&sql)?;
let mut requests = vec![]; let mut requests = vec![];
@ -458,8 +464,9 @@ impl Request {
} }
pub fn insert(&mut self, db: &DStorage) -> Result<()> { 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.fid,
self.rid,
self.gid.to_hex(), self.gid.to_hex(),
self.addr.to_hex(), self.addr.to_hex(),
self.name, self.name,
@ -474,6 +481,24 @@ impl Request {
Ok(()) Ok(())
} }
pub fn over_rid(db: &DStorage, gcd: &GroupId, rid: &i64, is_ok: bool) -> Result<i64> {
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)> { pub fn over(db: &DStorage, gcd: &GroupId, is_ok: bool) -> Result<(i64, GroupChatKey)> {
let matrix = db.query(&format!( let matrix = db.query(&format!(
"SELECT id, key from requests WHERE gid = '{}' AND is_over = 0 ORDER BY id", "SELECT id, key from requests WHERE gid = '{}' AND is_over = 0 ORDER BY id",

34
src/apps/group_chat/rpc.rs

@ -33,8 +33,18 @@ pub(crate) fn group_agree(mgid: GroupId, rid: i64, group: GroupChat) -> RpcParam
} }
#[inline] #[inline]
pub(crate) fn group_reject(mgid: GroupId, rid: i64) -> RpcParam { pub(crate) fn group_reject(mgid: GroupId, rid: i64, efficacy: bool) -> RpcParam {
rpc_response(0, "group-chat-reject", json!([rid]), mgid) 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] #[inline]
@ -249,6 +259,26 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
}, },
); );
handler.add_method(
"group-chat-request-handle",
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| 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( handler.add_method(
"group-chat-message-create", "group-chat-message-create",
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| async move { |gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| async move {

1
src/migrate/group_chat.rs

@ -18,6 +18,7 @@ pub(super) const GROUP_CHAT_VERSIONS: [&str; 4] = [
"CREATE TABLE IF NOT EXISTS requests( "CREATE TABLE IF NOT EXISTS requests(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
fid INTEGER NOT NULL, fid INTEGER NOT NULL,
rid INTEGER NOT NULL,
gid TEXT NOT NULL, gid TEXT NOT NULL,
addr TEXT NOT NULL, addr TEXT NOT NULL,
name TEXT NOT NULL, name TEXT NOT NULL,

Loading…
Cancel
Save