增加房间内超管权限处理

This commit is contained in:
huangjian
2021-09-02 16:19:22 +08:00
parent 66d2df5fc3
commit 1d8ab811bf
11 changed files with 165 additions and 56 deletions

View File

@@ -120,13 +120,15 @@ public class ButtonItemFactory {
boolean no_mark_manager = false;
//黑名单
boolean mart_black = false;
boolean isTargetRoomAdmin = AvRoomDataManager.get().isRoomAdmin(account);
boolean isTargetRoomOwner = AvRoomDataManager.get().isRoomOwner(account);
boolean isTargetSuperAdmin = AvRoomDataManager.get().isSuperAdmin(account);
//资料卡片需要房间操作的按钮,不去判断是否在房间内
if (AvRoomDataManager.get().isRoomOwner()) {
if (AvRoomDataManager.get().isRoomOwner() || AvRoomDataManager.get().isSuperAdmin()) {
//房主操作
//点击不是自己
if (isNeedRoomItem) {
if (isNeedRoomItem && !isTargetSuperAdmin) {
//提出房间
kickOutRoom = true;
//管理员
@@ -142,7 +144,7 @@ public class ButtonItemFactory {
} else if (AvRoomDataManager.get().isRoomAdmin()) {
//管理员操作
//不是自己
if (!isTargetRoomAdmin && !isTargetRoomOwner) {
if (!isTargetRoomAdmin && !isTargetRoomOwner && !isTargetSuperAdmin) {
//非房主或管理员
if (isNeedRoomItem) {
//踢出房间
@@ -151,10 +153,8 @@ public class ButtonItemFactory {
mart_black = true;
}
}
} else {
//游客操作
//不是自己
}
if (gift) {
if (!SuperAdminUtil.isSuperAdmin()) {
buttonItems.add(createSendGiftItem(context, uid, isInRoom, listener));
@@ -165,10 +165,7 @@ public class ButtonItemFactory {
}
// 私聊
buttonItems.add(createPrivateChatItem(context, account, isInRoom));
//装扮
/* if (!SuperAdminUtil.isSuperAdmin()) {
buttonItems.add(createSendDecorationItem(context, uid));
}*/
//关注
buttonItems.add(createAttentItem());
@@ -408,7 +405,12 @@ public class ButtonItemFactory {
if (mark) {
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.data_card_set_admin_click, "资料卡片-设置管理员");
}
IMNetEaseManager.get().markManagerListBySdk(roomId, account, mark, null);
if (AvRoomDataManager.get().isSuperAdmin()) {
AvRoomModel.get().markManager(Long.parseLong(account), mark).subscribe();
} else {
IMNetEaseManager.get().markManagerListBySdk(roomId, account, mark, null);
}
});
}
@@ -426,7 +428,7 @@ public class ButtonItemFactory {
() -> {
Single<String> single;
if (SuperAdminUtil.isSuperAdmin()) {
if (SuperAdminUtil.isSuperAdmin() || AvRoomDataManager.get().isSuperAdmin()) {
//超管拉黑
single = AvRoomModel.get().markBlack(JavaUtil.str2long(account));
SuperAdminModel superAdminModel = new SuperAdminModel();

View File

@@ -1138,6 +1138,7 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
addRoomFragment(false);
//获取管理员
getMvpPresenter().getNormalChatMember();
getMvpPresenter().getSuperAdminList();
dismissLoadingDialog();
}

View File

@@ -79,7 +79,7 @@ public class RoomManagerListActivity extends BaseMvpActivity<IRoomManagerView, R
public void onOk() {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo != null) {
getMvpPresenter().markManagerList(roomInfo.getRoomId(), chatRoomMember.getAccount(), false);
getMvpPresenter().removeManagerList(roomInfo.getRoomId(), chatRoomMember.getAccount());
}
}
});

View File

@@ -3,7 +3,9 @@ package com.yizhuan.erban.avroom.activity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.TextUtils;
@@ -98,7 +100,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_room_setting);
binding = DataBindingUtil.setContentView(this, R.layout.activity_room_setting);
initWhiteTitleBar(getString(R.string.room_setting));
binding.setClick(this);
EventBus.getDefault().register(this);
@@ -111,7 +113,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
initLeaveMode();
getMvpPresenter().requestRoomInfo(roomInfo.getUid());
mRoomBgLayout.setVisibility(View.GONE);
if (!AvRoomDataManager.get().isRoomOwner(String.valueOf(AuthModel.get().getCurrentUid()))) {
if (!AvRoomDataManager.get().isRoomOwner() && !AvRoomDataManager.get().isSuperAdmin()) {
managerLayout.setVisibility(View.GONE);
} else {
managerLayout.setVisibility(View.VISIBLE);
@@ -147,7 +149,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
binding.switchAudio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
if (isChecked) {
getDialogManager().showOkCancelWithTitleDialog("提示",
new SpannableString("开启高品质音效效果将导致声音较大延迟,请慎重选择"),
"确定", "取消", new DialogManager.OkCancelDialogListener() {
@@ -224,11 +226,12 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
/**
* 保存用户信息不需要改动的传null
* @param name 房间名字
* @param pwd 房间密码
* @param label 房间标签
*
* @param name 房间名字
* @param pwd 房间密码
* @param label 房间标签
* @param isUpdateGiftEffect 是否改动了礼物特效
* @param giftEffect 是否开启礼物特效
* @param giftEffect 是否开启礼物特效
*/
private void save(final String name, final String pwd, String label, boolean isUpdateGiftEffect,
boolean giftEffect) {
@@ -261,7 +264,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
AuthModel.get().getTicket(),
giftEffect,
binding.switchAudio.isChecked() ? 2 : 1,
roomInfo.getLimitType(),roomInfo.isPureMode())
roomInfo.getLimitType(), roomInfo.isPureMode())
.compose(bindToLifecycle())
.subscribe(observer);
StatisticManager.Instance().sortLogFileByLastModified();

View File

@@ -31,6 +31,8 @@ import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.EngineType;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RoomEvent;
import com.yizhuan.xchat_android_core.module_hall.hall.HallModel;
import com.yizhuan.xchat_android_core.module_hall.hall.bean.SuperAdminInfo;
import com.yizhuan.xchat_android_core.monsterhunting.bean.MonsterInfo;
import com.yizhuan.xchat_android_core.monsterhunting.model.MonsterHuntingModel;
import com.yizhuan.xchat_android_core.patriarch.exception.PmRoomLimitException;
@@ -57,6 +59,7 @@ import com.yizhuan.xchat_android_library.threadmgr.ThreadPoolManager;
import com.yizhuan.xchat_android_library.utils.ListUtils;
import org.greenrobot.eventbus.EventBus;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
@@ -98,6 +101,7 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
/**
* 进入云信聊天室回调
*/
@SuppressLint("CheckResult")
public void enterRoom(RoomInfo roomInfo, int fromType, String fromNick, String fromUid) {
if (roomInfo == null) {
if (getMvpView() != null)
@@ -132,16 +136,15 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_LIST_TYPE,
"区分房间类型:" + roomInfo.getRoomTypeLable());
Observable<EnterChatRoomResultData> enterRoomObservable = mAvRoomModel.enterRoom(roomInfo.getRoomId(), 3, fromType, fromNick, fromUid);
Disposable subscribe = enterRoomObservable.flatMap(this::dealServerMicInfo)
mAvRoomModel.enterRoom(roomInfo.getRoomId(), 3, fromType, fromNick, fromUid)
.flatMap(this::dealServerMicInfo)
.map(this::dealMicMemberFromIMNet)
.flatMap(this::dealMicChatRoomMemberFromIMNet)
.compose(bindUntilEvent(PresenterEvent.DESTROY))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(roomQueueInfoSparseArray -> {
long uid = AuthModel.get().getCurrentUid();
AudioEngineManager.get().startRtcEngine(uid,roomInfo.getAudioSdkType());
AudioEngineManager.get().startRtcEngine(uid, roomInfo.getAudioSdkType());
if (getMvpView() != null) {
getMvpView().enterRoomSuccess();
}
@@ -429,6 +432,31 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
mAvRoomModel.getNormalChatMember(String.valueOf(roomInfo.getRoomId()), currentUid);
}
/**
* 获取房间内固定成员列表
*/
@SuppressLint("CheckResult")
public void getSuperAdminList() {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo == null) {
return;
}
HallModel.get().getRoomSuperAdminList(roomInfo.getUid())
.compose(bindToLifecycle())
.toObservable()
.flatMap(Observable::fromIterable)
.map(superAdminInfo -> {
ChatRoomMember chatRoomMember = new ChatRoomMember();
chatRoomMember.setAccount(String.valueOf(superAdminInfo.getUid()));
chatRoomMember.setAvatar(superAdminInfo.getAvatar());
chatRoomMember.setNick(superAdminInfo.getNick());
return chatRoomMember;
})
.toList()
.subscribe(chatRoomMembers -> AvRoomDataManager.get().setAllRoomSuperAdminList(chatRoomMembers));
}
private void startGetOnlineMemberNumberJob() {
Observable.interval(1, 10, TimeUnit.SECONDS, Schedulers.from(ThreadPoolManager.instance().getScheduleExecutor()))
.subscribe(new Observer<Long>() {

View File

@@ -3,10 +3,13 @@ package com.yizhuan.erban.avroom.presenter;
import android.annotation.SuppressLint;
import android.text.TextUtils;
import com.netease.nim.uikit.common.util.C;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember;
import com.yizhuan.erban.avroom.view.IRoomManagerView;
import com.yizhuan.erban.base.BaseMvpPresenter;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.room.model.AvRoomModel;
import com.yizhuan.xchat_android_core.room.model.RoomBaseModel;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.user.bean.UserInfo;
@@ -22,6 +25,7 @@ import java.util.Map;
import io.reactivex.Single;
import io.reactivex.SingleSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
@@ -62,6 +66,9 @@ public class RoomManagerPresenter extends BaseMvpPresenter<IRoomManagerView> {
if (info != null && info.isSuperAdmin()) {
map.put(String.valueOf(info.getUid()), true);
}
if (info != null && AvRoomDataManager.get().isSuperAdmin(String.valueOf(info.getUid()))) {
map.put(String.valueOf(info.getUid()), true);
}
}
Iterator<ChatRoomMember> iterator = paramList.iterator();
while (iterator.hasNext()) {
@@ -78,7 +85,6 @@ public class RoomManagerPresenter extends BaseMvpPresenter<IRoomManagerView> {
.observeOn(AndroidSchedulers.mainThread())
.compose(this.bindUntilEvent(PresenterEvent.DESTROY))
.subscribe(chatRoomMemberList -> {
AvRoomDataManager.get().mRoomManagerList = chatRoomMemberList;
if (getMvpView() != null) {
getMvpView().queryManagerListSuccess(chatRoomMemberList);
}
@@ -95,23 +101,41 @@ public class RoomManagerPresenter extends BaseMvpPresenter<IRoomManagerView> {
*
* @param roomId
* @param account
* @param mark true:设置管理员 ,false移除管理员
*/
public void markManagerList(long roomId, String account, boolean mark) {
mRoomBaseModel.markManagerList(roomId, account, mark, new CallBack<ChatRoomMember>() {
@Override
public void onSuccess(ChatRoomMember data) {
if (getMvpView() != null) {
getMvpView().markManagerListSuccess(data);
@SuppressLint("CheckResult")
public void removeManagerList(long roomId, String account) {
if (AvRoomDataManager.get().isSuperAdmin()) {
AvRoomModel.get().markManager(Long.parseLong(account),false).subscribe(
s -> {
if (getMvpView() != null) {
ChatRoomMember chatRoomMember = new ChatRoomMember();
chatRoomMember.setAccount(account);
getMvpView().markManagerListSuccess(chatRoomMember);
}
},
e -> {
if (getMvpView() != null) {
getMvpView().markManagerListFail(-1, e.getMessage());
}
}
);
} else {
mRoomBaseModel.markManagerList(roomId, account, false, new CallBack<ChatRoomMember>() {
@Override
public void onSuccess(ChatRoomMember data) {
if (getMvpView() != null) {
getMvpView().markManagerListSuccess(data);
}
}
}
@Override
public void onFail(int code, String error) {
if (getMvpView() != null) {
getMvpView().markManagerListFail(code, error);
@Override
public void onFail(int code, String error) {
if (getMvpView() != null) {
getMvpView().markManagerListFail(code, error);
}
}
}
});
});
}
}
}

View File

@@ -7,6 +7,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.netease.nimlib.sdk.NIMChatRoomSDK;
@@ -90,6 +91,12 @@ public final class AvRoomDataManager {
* 房间所有人员
*/
public List<ChatRoomMember> mRoomAllMemberList;
/**
* 房间所有超管
*/
@NonNull
public final List<ChatRoomMember> roomSuperAdminList = new ArrayList<>();
/**
* 麦序位置信息:对应的位置,坑位信息(用户成员,坑位状态)
*/
@@ -655,6 +662,47 @@ public final class AvRoomDataManager {
return isRoomAdmin(account) || isRoomOwner(account);
}
public void setAllRoomSuperAdminList(List<ChatRoomMember> data) {
roomSuperAdminList.clear();
roomSuperAdminList.addAll(data);
}
public void addRoomSuperAdmin(ChatRoomMember member) {
roomSuperAdminList.add(member);
}
public void removeRoomSuperAdmin(String account) {
for (int i = 0; i < roomSuperAdminList.size(); i++) {
ChatRoomMember chatRoomMember = roomSuperAdminList.get(i);
if (chatRoomMember.getAccount().equals(account)) {
roomSuperAdminList.remove(i);
break;
}
}
}
/**
* 自己是否是房间超管
*
* @return -
*/
public boolean isSuperAdmin() {
return isSuperAdmin(String.valueOf(AuthModel.get().getCurrentUid()));
}
/**
* 是否是房间超管
*
* @return -
*/
public boolean isSuperAdmin(String account) {
if (roomSuperAdminList.isEmpty()) return false;
for (ChatRoomMember chatRoomMember : roomSuperAdminList) {
if (chatRoomMember.getAccount().equals(account)) return true;
}
return false;
}
/**
* 判断坑位是否被锁了
*/
@@ -842,7 +890,7 @@ public final class AvRoomDataManager {
* @return
*/
public boolean isQueuingMicro() {
return isRoomInQueuingMicMode(mCurrentRoomInfo);
return isRoomInQueuingMicMode(mCurrentRoomInfo);
}
/**
@@ -854,7 +902,7 @@ public final class AvRoomDataManager {
public boolean isRoomInQueuingMicMode(RoomInfo roomInfo) {
if (roomInfo == null) return false;
return roomInfo.getRoomModeType() == RoomModeType.OPEN_MICRO_MODE
||roomInfo.getRoomModeType() == RoomModeType.OPEN_DATING_MODE;
|| roomInfo.getRoomModeType() == RoomModeType.OPEN_DATING_MODE;
}
public void addManagerMember(ChatRoomMember member) {

View File

@@ -444,9 +444,9 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel {
/**
* 该接口每次最多返回200个数据,房间黑名单过多会导致200个不够用,做个分页加载(云信房间固定成员最多为1000个)
*
* @param roomId 房间id
* @param roomId 房间id
* @param currentUid 当前用户id
* @param time 固定成员列表用updateTime
* @param time 固定成员列表用updateTime
*/
private void loadNormalChatMember(String roomId, final long currentUid, long time) {
NIMChatRoomSDK.getChatRoomService()
@@ -540,9 +540,9 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel {
* 设置管理员/拉黑
* 1: 设置为管理员;2:设置普通等级用户;-1:设为黑名单用户;-2:设为禁言用户
*/
private Single<String> setRole(long targetUid, int opt, String notifyExt) {
private Single<String> setRole(long targetUid, int opt, boolean isSet, String notifyExt) {
return mRoomService.setChatRoomRole(AvRoomDataManager.get().getRoomUid(),
targetUid, opt, notifyExt)
targetUid, opt, isSet, notifyExt)
.compose(RxHelper.handleIgnoreData());
}
@@ -556,12 +556,7 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel {
KickOutExtBean bean = new KickOutExtBean();
bean.setRole(1);
bean.setHandleUid(String.valueOf(AuthModel.get().getCurrentUid()));
return setRole(targetUid, -1, new Gson().toJson(bean));
}
@Override
public Single<String> markManager(long targetUid) {
return setRole(targetUid, 1, null);
return setRole(targetUid, -1, true, new Gson().toJson(bean));
}
/**
@@ -571,9 +566,15 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel {
*/
@Override
public Single<String> removeBlack(long targetUid) {
return setRole(targetUid, 2, null);
return setRole(targetUid, 1, false, null);
}
@Override
public Single<String> markManager(long targetUid,boolean isSet) {
return setRole(targetUid, 1, isSet, null);
}
@Override
public Single<ServiceResult<List<SimplePartyRoomInfo>>> getPartyRoomList(long uid) {
return mRoomService.getPartyRoomList(uid).compose(RxHelper.handleSchedulers());

View File

@@ -1011,6 +1011,7 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel {
Single<ServiceResult<JsonElement>> setChatRoomRole(@Query("roomUid") long roomUid,
@Query("targetUid") long targetUid,
@Query("opt") int opt,
@Query("isSet") boolean isSet,
@Query("notifyExt") String notifyExt);
/**

View File

@@ -115,8 +115,9 @@ public interface IAvRoomModel extends IModel {
/**
* 通过服务器接口设置为管理员
* @param targetUid 被拉黑的uid
* @param isSet true 设置管理, false 取消管理
*/
Single<String> markManager(long targetUid);
Single<String> markManager(long targetUid,boolean isSet);
/**
* 通过服务器接口移除拉黑

View File

@@ -56,7 +56,7 @@ public class SAdminOptUtil {
Single<String> single;
if (!AvRoomDataManager.get().isRoomAdmin()) {
//将超管设置为房间管理员
single = AvRoomModel.get().markManager(AuthModel.get().getCurrentUid());
single = AvRoomModel.get().markManager(AuthModel.get().getCurrentUid(),true);
} else {
single = Single.just("");
}
@@ -91,7 +91,7 @@ public class SAdminOptUtil {
* @return -
*/
public static boolean kickOutRoomAdmin(String kickUid, String nick) {
if (!SuperAdminUtil.isSuperAdmin()) {
if (!SuperAdminUtil.isSuperAdmin() && !AvRoomDataManager.get().isSuperAdmin()) {
return false;
}
if (!AvRoomDataManager.get().isRoomAdmin(kickUid)) {