Browse Source

fix group chat request

pull/18/head
Sun 4 years ago
parent
commit
ac4806f801
  1. 2
      src/apps/domain/rpc.rs
  2. 43
      src/apps/group_chat/layer.rs
  3. 32
      src/apps/group_chat/models/request.rs

2
src/apps/domain/rpc.rs

@ -38,7 +38,7 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -38,7 +38,7 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
let mut results = HandleResult::new();
let db = domain_db(state.layer.read().await.base(), &gid)?;
let mut p = Provider::prepare(provider);
p.insert(&db);
p.insert(&db)?;
add_layer(&mut results, provider, PeerEvent::Check, gid)?;
Ok(results)

43
src/apps/group_chat/layer.rs

@ -1,6 +1,5 @@ @@ -1,6 +1,5 @@
use std::path::PathBuf;
use std::sync::Arc;
use std::time::{SystemTime, UNIX_EPOCH};
use tdn::types::{
group::GroupId,
message::{RecvType, SendType},
@ -517,21 +516,24 @@ async fn handle_event( @@ -517,21 +516,24 @@ async fn handle_event(
}
if group.g_type == GroupType::Open {
let start = SystemTime::now();
let datetime = start
.duration_since(UNIX_EPOCH)
.map(|s| s.as_secs())
.unwrap_or(0) as i64; // safe for all life.
let mut m = Member::new(id, fgid, addr, mname, false, datetime);
let mut m = Member::new_notime(id, fgid, addr, mname, false);
m.insert(&db)?;
// save avatar.
let _ = write_avatar(&base, &ogid, &fgid, &mavatar).await;
let _ = write_avatar(&base, &ogid, &m.m_id, &mavatar).await;
// add_height consensus.
// add consensuse and storage.
let height = layer.write().await.running_mut(&gcd)?.increased();
Consensus::insert(&db, &id, &height, &m.id, &ConsensusType::MemberJoin)?;
GroupChat::add_height(&db, id, height)?;
// self.broadcast_join(&gcd, m, mavatar, results).await?;
// UI: update.
results.rpcs.push(rpc::member_join(fgid, &m));
// broadcast join event.
let event =
Event::MemberJoin(m.m_id, m.m_addr, m.m_name, mavatar, m.datetime);
broadcast(&LayerEvent::Sync(gcd, height, event), layer, &gcd, results)
.await?;
// return join result.
let s = agree(&base, &ogid, &gcd, group, addr).await;
@ -565,15 +567,16 @@ async fn handle_event( @@ -565,15 +567,16 @@ async fn handle_event(
if group.is_need_agree {
let (_inv_id, inv_is_manager) = inv_mid.unwrap();
// only server holder to handle this request.
if !inv_is_manager {
// let mut request = Request::new();
// request.insert().await?;
// self.broadcast_request(
// &gcd,
// request,
// JoinProof::Invite(invite_gid, proof, mname, mavatar),
// results,
// );
let mut req =
Request::new_by_server(id, fgid, addr, mname, invite_gid.to_hex());
req.insert(&db)?;
req.rid = req.id; // not need save. beacuse UI rpc will sended.
if mavatar.len() > 0 {
write_avatar_sync(&base, &ogid, &fgid, mavatar)?;
}
results.rpcs.push(rpc::request_create(ogid, &req));
return Ok(());
}
}

32
src/apps/group_chat/models/request.rs

@ -11,9 +11,9 @@ use super::GroupChatKey; @@ -11,9 +11,9 @@ use super::GroupChatKey;
/// Group Join Request model. include my requests and other requests.
/// When fid is 0, it's my requests.
pub(crate) struct Request {
id: i64,
pub id: i64,
fid: i64,
rid: i64,
pub rid: i64,
pub gid: GroupId,
pub addr: PeerAddr,
pub name: String,
@ -49,6 +49,34 @@ impl Request { @@ -49,6 +49,34 @@ impl Request {
}
}
pub fn new_by_server(
fid: i64,
gid: GroupId,
addr: PeerAddr,
name: String,
remark: String,
) -> Self {
let start = SystemTime::now();
let datetime = start
.duration_since(UNIX_EPOCH)
.map(|s| s.as_secs())
.unwrap_or(0) as i64; // safe for all life.
Self {
fid,
gid,
addr,
name,
remark,
datetime,
key: GroupChatKey(vec![]),
is_ok: false,
is_over: false,
id: 0,
rid: 0,
}
}
pub fn new_by_me(
gid: GroupId,
addr: PeerAddr,

Loading…
Cancel
Save