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 { @@ -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 { @@ -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]);
}
}

28
lib/apps/group_chat/provider.dart

@ -62,9 +62,8 @@ class GroupChatProvider extends ChangeNotifier { @@ -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 { @@ -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 { @@ -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();
}
}

44
src/apps/group_chat/layer.rs

@ -9,7 +9,9 @@ use tdn::{ @@ -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( @@ -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( @@ -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(())

31
src/apps/group_chat/models.rs

@ -344,6 +344,7 @@ impl GroupChat { @@ -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 { @@ -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 { @@ -366,6 +368,7 @@ impl Request {
) -> Self {
Self {
fid,
rid,
gid,
addr,
name,
@ -403,6 +406,7 @@ impl Request { @@ -403,6 +406,7 @@ impl Request {
is_over: false,
is_deleted: false,
fid: 0,
rid: 0,
id: 0,
}
}
@ -411,6 +415,7 @@ impl Request { @@ -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 { @@ -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 { @@ -445,9 +451,9 @@ impl Request {
pub fn list(db: &DStorage, is_all: bool) -> Result<Vec<Request>> {
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 { @@ -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 { @@ -474,6 +481,24 @@ impl Request {
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)> {
let matrix = db.query(&format!(
"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 @@ -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<RpcState>) { @@ -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(
"group-chat-message-create",
|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] = [ @@ -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,

Loading…
Cancel
Save