@ -17,6 +17,7 @@ use crate::layer::{Layer, Online};
@@ -17,6 +17,7 @@ use crate::layer::{Layer, Online};
use crate ::migrate ::consensus ::{ FRIEND_TABLE_PATH , MESSAGE_TABLE_PATH , REQUEST_TABLE_PATH } ;
use crate ::rpc ::{
notice_menu , session_connect , session_create , session_last , session_lost , session_suspend ,
session_update_name ,
} ;
use crate ::session ::{ connect_session , Session , SessionType } ;
use crate ::storage ::{ account_db , chat_db , session_db , write_avatar_sync } ;
@ -38,10 +39,12 @@ pub(crate) enum LayerEvent {
@@ -38,10 +39,12 @@ pub(crate) enum LayerEvent {
Suspend ( GroupId ) ,
/// actived. extend BaseLayerEvent.
Actived ( GroupId ) ,
/// make friendship request. user is simple.
Request ( User , String ) ,
/// agree friendship request. user is simple.
Agree ( User , Proof ) ,
/// make friendship request.
/// params is name, remark, proof.
Request ( String , String , Proof ) ,
/// agree friendship request.
/// params is gid.
Agree ( Proof ) ,
/// reject friendship request.
Reject ,
/// receiver gid, sender gid, message.
@ -199,7 +202,6 @@ impl LayerEvent {
@@ -199,7 +202,6 @@ impl LayerEvent {
bytes : Vec < u8 > ,
) -> Result < HandleResult > {
let event : LayerEvent = bincode ::deserialize ( & bytes ) ? ;
let mut results = HandleResult ::new ( ) ;
match event {
@ -219,77 +221,44 @@ impl LayerEvent {
@@ -219,77 +221,44 @@ impl LayerEvent {
let _ = layer . running_mut ( & mgid ) ? . active ( & fgid , false ) ;
results . rpcs . push ( session_connect ( mgid , & sid , & addr ) ) ;
}
LayerEvent ::Request ( remote , remark ) = > {
LayerEvent ::Request ( name , remark , proof ) = > {
// 1. check verify.
proof . verify ( & fgid , & addr , & layer . addr ) ? ;
if load_friend ( & layer . base , & mgid , & fgid ) . is_err ( ) {
// check if exist request.
let db = chat_db ( & layer . base , & mgid ) ? ;
if let Ok ( req ) = Request ::get_id ( & db , & remote . id ) {
if let Ok ( req ) = Request ::get_id ( & db , & fg id) {
Request ::delete ( & db , & req . id ) ? ; // delete the old request.
results . rpcs . push ( rpc ::request_delete ( mgid , req . id ) ) ;
}
let mut request = Request ::new (
remote . id ,
addr ,
remote . name . clone ( ) ,
remark . clone ( ) ,
false ,
true ,
) ;
let mut request = Request ::new ( fgid , addr , name , remark , false , true ) ;
// save to db.
request . insert ( & db ) ? ;
drop ( db ) ;
// save the avatar.
write_avatar_sync ( & layer . base , & mgid , & request . gid , remote . avatar . clone ( ) ) ? ;
layer . group . write ( ) . await . broadcast (
& mgid ,
InnerEvent ::SessionRequestCreate ( false , remote , remark ) ,
REQUEST_TABLE_PATH ,
request . id ,
& mut results ,
) ? ;
results . rpcs . push ( rpc ::request_create ( mgid , & request ) ) ;
results . rpcs . push ( notice_menu ( mgid , & SessionType ::Chat ) ) ;
return Ok ( results ) ;
} else {
let group_lock = layer . group . read ( ) . await ;
let me = group_lock . clone_user ( & mgid ) ? ;
let proof = group_lock . prove_addr ( & mgid , & addr ) ? ;
drop ( group_lock ) ;
let msg = agree_message ( proof , me , addr ) ? ;
let proof = layer . group . read ( ) . await . prove_addr ( & mgid , & addr ) ? ;
let msg = agree_message ( proof , addr ) ? ;
results . layers . push ( ( mgid , fgid , msg ) ) ;
}
}
LayerEvent ::Agree ( remote , proof ) = > {
LayerEvent ::Agree ( proof ) = > {
// 0. check verify.
proof . verify ( & fgid , & addr , & layer . addr ) ? ;
// 1. check friendship.
if load_friend ( & layer . base , & mgid , & fgid ) . is_err ( ) {
// agree request for friend.
// 2. agree request for friend.
let db = chat_db ( & layer . base , & mgid ) ? ;
if let Ok ( mut request ) = Request ::get_id ( & db , & remote . id ) {
layer . group . write ( ) . await . broadcast (
& mgid ,
InnerEvent ::SessionRequestHandle (
request . gid ,
true ,
remote . avatar . clone ( ) ,
) ,
REQUEST_TABLE_PATH ,
request . id ,
& mut results ,
) ? ;
request . is_over = true ;
request . is_ok = true ;
request . update ( & db ) ? ;
let request_id = request . id ;
let friend =
Friend ::from_remote ( & db , remote . id , remote . name , addr , remote . wallet ) ? ;
write_avatar_sync ( & layer . base , & mgid , & remote . id , remote . avatar ) ? ;
results
. rpcs
. push ( rpc ::request_agree ( mgid , request_id , & friend ) ) ;
if let Ok ( mut r ) = Request ::get_id ( & db , & fgid ) {
r . is_over = true ;
r . is_ok = true ;
r . update ( & db ) ? ;
let friend = Friend ::from_remote ( & db , fgid , r . name , addr , "" . to_owned ( ) ) ? ;
results . rpcs . push ( rpc ::request_agree ( mgid , r . id , & friend ) ) ;
// ADD NEW SESSION.
let s_db = session_db ( & layer . base , & mgid ) ? ;
@ -361,17 +330,20 @@ impl LayerEvent {
@@ -361,17 +330,20 @@ impl LayerEvent {
}
}
LayerEvent ::InfoRes ( remote ) = > {
let ( _ sid, fid ) = layer . get_running_remote_id ( & mgid , & fgid ) ? ;
let ( sid , fid ) = layer . get_running_remote_id ( & mgid , & fgid ) ? ;
let avatar = remote . avatar . clone ( ) ;
let db = chat_db ( & layer . base , & mgid ) ? ;
let mut f = Friend ::get ( & db , & fid ) ? ;
let name = remote . name . clone ( ) ;
f . name = remote . name ;
f . addr = remote . addr ;
f . wallet = remote . wallet ;
f . height = remote . height ;
f . remote_update ( & db ) ? ;
drop ( db ) ;
write_avatar_sync ( & layer . base , & mgid , & remote . id , remote . avatar ) ? ;
results . rpcs . push ( rpc ::friend_info ( mgid , & f ) ) ;
let _ = Session ::update_name ( & session_db ( & layer . base , & mgid ) ? , & sid , & name ) ;
results . rpcs . push ( session_update_name ( mgid , & sid , & name ) ) ;
layer . group . write ( ) . await . broadcast (
& mgid ,
@ -380,7 +352,6 @@ impl LayerEvent {
@@ -380,7 +352,6 @@ impl LayerEvent {
f . id ,
& mut results ,
) ? ;
results . rpcs . push ( rpc ::friend_info ( mgid , & f ) ) ;
}
LayerEvent ::Close = > {
let ( _sid , fid ) = layer . get_running_remote_id ( & mgid , & fgid ) ? ;
@ -440,24 +411,25 @@ fn update_friend(base: &PathBuf, mgid: &GroupId, fgid: &GroupId, addr: &PeerId)
@@ -440,24 +411,25 @@ fn update_friend(base: &PathBuf, mgid: &GroupId, fgid: &GroupId, addr: &PeerId)
Ok ( friend )
}
pub ( super ) fn req_message ( layer : & mut Layer , me : User , request : Request ) -> SendType {
pub ( super ) fn req_message (
layer : & mut Layer ,
gid : GroupId ,
name : String ,
proof : Proof ,
request : Request ,
) -> SendType {
// update delivery.
let uid = layer . delivery . len ( ) as u64 + 1 ;
layer . delivery . insert ( uid , ( me . id , request . id ) ) ;
let req = LayerEvent ::Request ( me , request . remark ) ;
layer . delivery . insert ( uid , ( g id, request . id ) ) ;
let req = LayerEvent ::Request ( na me, request . remark , proof ) ;
let data = bincode ::serialize ( & req ) . unwrap_or ( vec! [ ] ) ;
SendType ::Event ( uid , request . addr , data )
}
pub ( super ) fn reject_message (
layer : & mut Layer ,
tid : i64 ,
addr : PeerId ,
me_id : GroupId ,
) -> SendType {
pub ( super ) fn reject_message ( layer : & mut Layer , tid : i64 , addr : PeerId , gid : GroupId ) -> SendType {
let data = bincode ::serialize ( & LayerEvent ::Reject ) . unwrap_or ( vec! [ ] ) ;
let uid = layer . delivery . len ( ) as u64 + 1 ;
layer . delivery . insert ( uid , ( me_ id, tid ) ) ;
layer . delivery . insert ( uid , ( gid , tid ) ) ;
SendType ::Event ( uid , addr , data )
}
@ -479,8 +451,8 @@ pub(crate) fn chat_conn(proof: Proof, addr: Peer) -> SendType {
@@ -479,8 +451,8 @@ pub(crate) fn chat_conn(proof: Proof, addr: Peer) -> SendType {
SendType ::Connect ( 0 , addr , data )
}
pub ( super ) fn agree_message ( proof : Proof , me : User , addr : PeerId ) -> Result < SendType > {
let data = bincode ::serialize ( & LayerEvent ::Agree ( me , proof ) ) . unwrap_or ( vec! [ ] ) ;
pub ( super ) fn agree_message ( proof : Proof , addr : PeerId ) -> Result < SendType > {
let data = bincode ::serialize ( & LayerEvent ::Agree ( proof ) ) . unwrap_or ( vec! [ ] ) ;
Ok ( SendType ::Event ( 0 , addr , data ) )
}