From 00f025a8c53a4f017f8a6d1f91c50cb583a76eaf Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 13 Dec 2023 14:48:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5peko=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=96=AD=E7=BD=91=E6=97=B6=E8=A2=AB=E8=B8=A2=EF=BC=8C?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=E5=90=8E=E6=9C=AA=E9=80=80=E6=88=BF=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chwl/core/manager/IMNetEaseManager.java | 58 +++++++++++++++++-- .../com/chwl/core/room/model/AvRoomModel.java | 22 +++++++ .../chwl/core/room/model/RoomBaseModel.java | 19 ++++++ .../util/SAdminOptUtil.java | 6 +- 4 files changed, 99 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java index 70895c735..377270ad1 100644 --- a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java +++ b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java @@ -206,6 +206,7 @@ import io.reactivex.SingleSource; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.functions.BiConsumer; +import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import io.reactivex.functions.Predicate; import io.reactivex.processors.PublishProcessor; @@ -232,6 +233,9 @@ public final class IMNetEaseManager { public RoomQueueInfo mCacheRoomQueueInfo; private Disposable datingDisposable; + // 用于网络重连的判断 + private boolean isNetBroken = false; + private IMNetEaseManager() { roomProcessor = PublishProcessor.create(); relationShipProcessor = PublishProcessor.create(); @@ -421,9 +425,20 @@ public final class IMNetEaseManager { }).subscribe(); } - private void registerOnlineStatusChange() { - Observer onlineStatus = (Observer) this::dealChatRoomOnlineStatus; + Observer onlineStatus = chatRoomStatusChangeData -> { + if (chatRoomStatusChangeData.status == StatusCode.NET_BROKEN) { + isNetBroken = true; + } + boolean reconnection = false; + if (chatRoomStatusChangeData.status == StatusCode.LOGINED) { + if (isNetBroken) { + reconnection = true; + } + isNetBroken = false; + } + dealChatRoomOnlineStatus(chatRoomStatusChangeData, reconnection); + }; NIMChatRoomSDK.getChatRoomServiceObserve().observeOnlineStatus(onlineStatus, true); } @@ -481,9 +496,11 @@ public final class IMNetEaseManager { msgStatusObserver, true); } - - private void dealChatRoomOnlineStatus(ChatRoomStatusChangeData chatRoomStatusChangeData) { + private void dealChatRoomOnlineStatus(ChatRoomStatusChangeData chatRoomStatusChangeData, boolean reconnection) { if (filterAnotherChatRoom(chatRoomStatusChangeData)) return; + if (reconnection) { + tryCheckKickState(); + } long currentUid = AuthModel.get().getCurrentUid(); if (chatRoomStatusChangeData.status == StatusCode.CONNECTING) { MLog.info(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_06)); @@ -543,6 +560,38 @@ public final class IMNetEaseManager { } } + /** + * 尝试检测被踢状态(离线时被踢,重连后需要退出) + */ + @SuppressLint("CheckResult") + private void tryCheckKickState() { + String currentUid = AuthModel.get().getCurrentUid() + ""; + if (currentUid.isEmpty() || currentUid.equals("0")) { + return; + } + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return; + } + model.getKickList().subscribe(strings -> { + if (strings.isEmpty()) { + return; + } + RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (currentRoomInfo == null) { + return; + } + long roomUid = currentRoomInfo.getRoomUid(); + for (String uid : strings) { + if (uid != null && uid.equals(currentUid)) { + noticeKickOutChatMember(new ChatRoomKickOutEvent(roomUid + "", ChatRoomKickOutEvent.ChatRoomKickOutReason.KICK_OUT_BY_MANAGER.getValue(), null), currentUid); + // 清空緩存數據 + AvRoomDataManager.get().release(); + return; + } + } + }); + } + private boolean needToHideEnterMessage(ChatRoomMessage chatRoomMessage) { String resource = NobleUtil.getResource(NobleResourceType.KEY_ENTER_HIDE, chatRoomMessage); if (resource.toLowerCase().equals("0")) { @@ -2410,6 +2459,7 @@ public final class IMNetEaseManager { @Override public void onSuccess(Void param) { e.onSuccess("踢人出房間回調成功"); + model.kickUser(account).subscribe(); } @Override diff --git a/core/src/main/java/com/chwl/core/room/model/AvRoomModel.java b/core/src/main/java/com/chwl/core/room/model/AvRoomModel.java index 045ed49b5..ca8fdef36 100644 --- a/core/src/main/java/com/chwl/core/room/model/AvRoomModel.java +++ b/core/src/main/java/com/chwl/core/room/model/AvRoomModel.java @@ -701,4 +701,26 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { } } + + /** + * 获取踢人列表 + * @return + */ + public Single> getKickList() { + return mRoomService.getKickList(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 踢人 + * @param uid + * @return + */ + public Single kickUser(long uid) { + return mRoomService.kickUser(AvRoomDataManager.get().getRoomUid(),uid) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } } diff --git a/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java index f4827f481..d41fba3f9 100644 --- a/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java @@ -1188,6 +1188,25 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { @POST("/roomFirstChargeWindow/update") Single> postFirstCharge(@Field("roomUid") long roomUid); + /** + * 踢人 + * + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("/room/kick/") + Single> kickUser(@Field("roomUid") long roomUid, @Field("uid") long uid); + + /** + * 获取踢人列表 + * + * @param roomUid + * @return + */ + @GET("/room/kick/") + Single>> getKickList(@Query("roomUid") long roomUid); + } } diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java index 8ec3587b3..0d0624547 100644 --- a/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java @@ -107,8 +107,10 @@ public class SAdminOptUtil { } ChatRoomMessage message = SaAttachmentFactory.createBlackOrKickOutChatRoomMsg(kickUid, nick, 3); IMNetEaseManager.get().sendChatRoomMessage(message, false) - .doOnSuccess(chatRoomMessage -> - KickModel.get().onSendRoomMessageSuccess(chatRoomMessage)) + .doOnSuccess(chatRoomMessage ->{ + KickModel.get().onSendRoomMessageSuccess(chatRoomMessage); + AvRoomModel.get().kickUser(JavaUtil.str2long(kickUid)).subscribe(); + }) .subscribe(); return true; }