Browse Source

[GroupChat] fix member leave

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

10
lib/apps/group_chat/provider.dart

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

38
src/apps/group_chat/layer.rs

@ -15,10 +15,11 @@ use group_chat_types::{ @@ -15,10 +15,11 @@ use group_chat_types::{
use tdn_did::Proof;
use tdn_storage::local::DStorage;
use crate::apps::chat::Friend;
use crate::layer::{Layer, Online};
use crate::rpc::{session_connect, session_create, session_last, session_lost, session_suspend};
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::{add_layer, rpc};
@ -243,14 +244,25 @@ async fn handle_event( @@ -243,14 +244,25 @@ async fn handle_event(
results.rpcs.push(rpc::member_info(mgid, id, maddr, mname));
}
Event::MemberJoin(mid, maddr, mname, mavatar, mtime) => {
let mut member = Member::new(gid, mid, maddr, mname, false, mtime);
member.insert(&db)?;
if mavatar.len() > 0 {
write_avatar_sync(&base, &mgid, &mid, mavatar)?;
if Member::get_id(&db, &gid, &mid).is_err() {
let mut member = Member::new(gid, mid, maddr, mname, false, mtime);
member.insert(&db)?;
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) => {
println!("Sync: create message start");
let base = layer.read().await.base.clone();
@ -447,12 +459,14 @@ fn handle_sync_event( @@ -447,12 +459,14 @@ fn handle_sync_event(
None
}
PackedEvent::MemberJoin(mid, maddr, mname, mavatar, mtime) => {
if mavatar.len() > 0 {
write_avatar_sync(&base, &mgid, &mid, mavatar)?;
if Member::get_id(db, fid, &mid).is_err() {
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
}
PackedEvent::MemberLeave(_mid) => {

5
src/apps/group_chat/models.rs

@ -714,6 +714,11 @@ impl Member { @@ -714,6 +714,11 @@ impl Member {
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> {
let sql = format!("UPDATE members SET is_block={} WHERE id = {}", block, id,);
db.update(&sql)

10
src/apps/group_chat/rpc.rs

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

Loading…
Cancel
Save