Browse Source

[GroupChat] fix member leave

pull/18/head
Sun 5 years ago
parent
commit
5e239fcbec
  1. 5
      lib/apps/group_chat/detail.dart
  2. 10
      lib/apps/group_chat/provider.dart
  3. 38
      src/apps/group_chat/layer.rs
  4. 5
      src/apps/group_chat/models.rs
  5. 10
      src/apps/group_chat/rpc.rs

5
lib/apps/group_chat/detail.dart

@ -9,6 +9,7 @@ import 'package:esse/utils/toast.dart';
import 'package:esse/utils/pick_image.dart'; import 'package:esse/utils/pick_image.dart';
import 'package:esse/utils/pick_file.dart'; import 'package:esse/utils/pick_file.dart';
import 'package:esse/l10n/localizations.dart'; import 'package:esse/l10n/localizations.dart';
import 'package:esse/widgets/avatar.dart';
import 'package:esse/widgets/emoji.dart'; import 'package:esse/widgets/emoji.dart';
import 'package:esse/widgets/shadow_dialog.dart'; import 'package:esse/widgets/shadow_dialog.dart';
import 'package:esse/widgets/audio_recorder.dart'; import 'package:esse/widgets/audio_recorder.dart';
@ -305,6 +306,9 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
context.read<AccountProvider>().clearActivedSession( context.read<AccountProvider>().clearActivedSession(
SessionType.Group SessionType.Group
); );
if (!isDesktop) {
Navigator.pop(context);
}
}, },
), ),
] ]
@ -336,6 +340,7 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
final member = members[message.mid]; final member = members[message.mid];
return member == null ? ChatMessage( return member == null ? ChatMessage(
fgid: "", fgid: "",
avatar: Avatar(name: lang.delete),
name: lang.delete, name: lang.delete,
message: message, message: message,
) : ChatMessage( ) : ChatMessage(

10
lib/apps/group_chat/provider.dart

@ -81,7 +81,7 @@ class GroupChatProvider extends ChangeNotifier {
rpc.addListener('group-chat-request-handle', _requestHandle, 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);
rpc.addListener('group-chat-member-online', _memberOnline, false); rpc.addListener('group-chat-member-online', _memberOnline, false);
rpc.addListener('group-chat-member-offline', _memberOffline, false); rpc.addListener('group-chat-member-offline', _memberOffline, false);
rpc.addListener('group-chat-message-create', _messageCreate, true); rpc.addListener('group-chat-message-create', _messageCreate, true);
@ -259,6 +259,14 @@ class GroupChatProvider extends ChangeNotifier {
} }
} }
_memberLeave(List params) {
final id = params[0];
if (this.activedMembers.containsKey(id)) {
this.activedMembers.remove(id);
notifyListeners();
}
}
_memberInfo(List params) { _memberInfo(List params) {
final id = params[0]; final id = params[0];
if (this.activedMembers.containsKey(id)) { if (this.activedMembers.containsKey(id)) {

38
src/apps/group_chat/layer.rs

@ -15,10 +15,11 @@ use group_chat_types::{
use tdn_did::Proof; use tdn_did::Proof;
use tdn_storage::local::DStorage; use tdn_storage::local::DStorage;
use crate::apps::chat::Friend;
use crate::layer::{Layer, Online}; use crate::layer::{Layer, Online};
use crate::rpc::{session_connect, session_create, session_last, session_lost, session_suspend}; use crate::rpc::{session_connect, session_create, session_last, session_lost, session_suspend};
use crate::session::{connect_session, Session, SessionType}; use crate::session::{connect_session, Session, SessionType};
use crate::storage::{group_chat_db, session_db, write_avatar_sync}; use crate::storage::{chat_db, delete_avatar, group_chat_db, session_db, write_avatar_sync};
use super::models::{from_network_message, GroupChat, Member, Request}; use super::models::{from_network_message, GroupChat, Member, Request};
use super::{add_layer, rpc}; use super::{add_layer, rpc};
@ -243,14 +244,25 @@ async fn handle_event(
results.rpcs.push(rpc::member_info(mgid, id, maddr, mname)); results.rpcs.push(rpc::member_info(mgid, id, maddr, mname));
} }
Event::MemberJoin(mid, maddr, mname, mavatar, mtime) => { Event::MemberJoin(mid, maddr, mname, mavatar, mtime) => {
let mut member = Member::new(gid, mid, maddr, mname, false, mtime); if Member::get_id(&db, &gid, &mid).is_err() {
member.insert(&db)?; let mut member = Member::new(gid, mid, maddr, mname, false, mtime);
if mavatar.len() > 0 { member.insert(&db)?;
write_avatar_sync(&base, &mgid, &mid, mavatar)?; if mavatar.len() > 0 {
write_avatar_sync(&base, &mgid, &mid, mavatar)?;
}
results.rpcs.push(rpc::member_join(mgid, member));
} }
results.rpcs.push(rpc::member_join(mgid, member));
} }
Event::MemberLeave(_mid) => {} Event::MemberLeave(mid) => {
let id = Member::get_id(&db, &gid, &mid)?;
Member::leave(&db, &id)?;
// check mid is my chat friend. if not, delete avatar.
let s_db = chat_db(&base, &mgid)?;
if Friend::get(&s_db, &mid)?.is_none() {
let _ = delete_avatar(&base, &mgid, &mid).await;
}
results.rpcs.push(rpc::member_leave(mgid, id));
}
Event::MessageCreate(mid, nmsg, mtime) => { Event::MessageCreate(mid, nmsg, mtime) => {
println!("Sync: create message start"); println!("Sync: create message start");
let base = layer.read().await.base.clone(); let base = layer.read().await.base.clone();
@ -447,12 +459,14 @@ fn handle_sync_event(
None None
} }
PackedEvent::MemberJoin(mid, maddr, mname, mavatar, mtime) => { PackedEvent::MemberJoin(mid, maddr, mname, mavatar, mtime) => {
if mavatar.len() > 0 { if Member::get_id(db, fid, &mid).is_err() {
write_avatar_sync(&base, &mgid, &mid, mavatar)?; if mavatar.len() > 0 {
write_avatar_sync(&base, &mgid, &mid, mavatar)?;
}
let mut member = Member::new(*fid, mid, maddr, mname, false, mtime);
member.insert(&db)?;
results.rpcs.push(rpc::member_join(*mgid, member));
} }
let mut member = Member::new(*fid, mid, maddr, mname, false, mtime);
member.insert(&db)?;
results.rpcs.push(rpc::member_join(*mgid, member));
None None
} }
PackedEvent::MemberLeave(_mid) => { PackedEvent::MemberLeave(_mid) => {

5
src/apps/group_chat/models.rs

@ -714,6 +714,11 @@ impl Member {
db.update(&sql) db.update(&sql)
} }
pub fn leave(db: &DStorage, id: &i64) -> Result<usize> {
let sql = format!("UPDATE members SET is_deleted = 1 WHERE id = {}", id);
db.update(&sql)
}
pub fn block(db: &DStorage, id: &i64, block: bool) -> Result<usize> { pub fn block(db: &DStorage, id: &i64, block: bool) -> Result<usize> {
let sql = format!("UPDATE members SET is_block={} WHERE id = {}", block, id,); let sql = format!("UPDATE members SET is_block={} WHERE id = {}", block, id,);
db.update(&sql) db.update(&sql)

10
src/apps/group_chat/rpc.rs

@ -48,6 +48,11 @@ pub(crate) fn member_join(mgid: GroupId, member: Member) -> RpcParam {
rpc_response(0, "group-chat-member-join", json!(member.to_rpc()), mgid) rpc_response(0, "group-chat-member-join", json!(member.to_rpc()), mgid)
} }
#[inline]
pub(crate) fn member_leave(mgid: GroupId, id: i64) -> RpcParam {
rpc_response(0, "group-chat-member-leave", json!([id]), mgid)
}
#[inline] #[inline]
pub(crate) fn member_info(mgid: GroupId, id: i64, addr: PeerAddr, name: String) -> RpcParam { pub(crate) fn member_info(mgid: GroupId, id: i64, addr: PeerAddr, name: String) -> RpcParam {
rpc_response( rpc_response(
@ -298,7 +303,6 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
.filter_map(|v| v.as_i64()) .filter_map(|v| v.as_i64())
.collect(); .collect();
//
let group_lock = state.group.read().await; let group_lock = state.group.read().await;
let base = group_lock.base().clone(); let base = group_lock.base().clone();
@ -306,8 +310,8 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
let group_db = group_chat_db(&base, &gid)?; let group_db = group_chat_db(&base, &gid)?;
let mut invites = vec![]; let mut invites = vec![];
for id in ids { for fid in ids {
let friend = Friend::get_id(&chat, id)??; let friend = Friend::get_id(&chat, fid)??;
if Member::get_id(&group_db, &id, &friend.gid).is_err() { if Member::get_id(&group_db, &id, &friend.gid).is_err() {
let proof = group_lock.prove_addr(&gid, &friend.gid.into())?; let proof = group_lock.prove_addr(&gid, &friend.gid.into())?;
invites.push((friend.id, friend.gid, friend.addr, proof)); invites.push((friend.id, friend.gid, friend.addr, proof));

Loading…
Cancel
Save