去掉发房间自定义消息的扩展字段(看注释是贵族使用的,会导致云信消息超长发送失败)

This commit is contained in:
huangjian
2021-02-22 10:46:12 +08:00
parent cdb4dba2e1
commit 1a6e8ba54f

View File

@@ -2591,102 +2591,26 @@ public final class IMNetEaseManager {
if (chatRoomMessage == null) {
throw new IllegalArgumentException("ChatRoomMessage can't be null!");
}
// 设置聊天室的贵族信息字段(包括发的人和麦上的所有人)
final List<String> accounts = new ArrayList<>();
final List<ChatRoomMember> chatRoomMembers = new ArrayList<>();
return Single.create((SingleOnSubscribe<List<ChatRoomMember>>) e -> {
// 发的人
ChatRoomMember roomMember = AvRoomDataManager.get().getChatRoomMember(chatRoomMessage.getFromAccount());
if (roomMember != null && roomMember.getExtension() != null) {
chatRoomMembers.add(roomMember);
} else {
accounts.add(chatRoomMessage.getFromAccount());
}
//只有自定义消息的时候才传坑上的人的ext信息
if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) {
// 麦上的人
SparseArray<RoomQueueInfo> mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap;
for (int i = 0; i < mMicQueueMemberMap.size(); i++) {
int key = mMicQueueMemberMap.keyAt(i);
RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(key);
if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) continue;
// 有拓展字段
if (roomQueueInfo.mChatRoomMember.getExtension() != null) {
MicMemberInfo micMemberInfo = roomQueueInfo.mChatRoomMember;
ChatRoomMember chatRoomMember = new ChatRoomMember();
chatRoomMember.setAccount(micMemberInfo.getAccount());
chatRoomMember.setAvatar(micMemberInfo.getAvatar());
chatRoomMember.setNick(micMemberInfo.getNick());
chatRoomMember.setExtension(micMemberInfo.getExtension());
chatRoomMembers.add(chatRoomMember);
return Single.create((SingleOnSubscribe<ChatRoomMessage>) e -> {
NIMChatRoomSDK.getChatRoomService().sendMessage(chatRoomMessage, resend)
.setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
e.onSuccess(chatRoomMessage);
}
} else {
// 用于重新获取拓展字段
accounts.add(roomQueueInfo.mChatRoomMember.getAccount());
}
}
}
e.onSuccess(chatRoomMembers);
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).flatMap(chatRoomMembers1 -> {
if (!ListUtils.isListEmpty(accounts)) {
return fetchRoomMembersByIds(accounts);
} else {
return Single.just(chatRoomMembers1);
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).flatMap(roomMembers -> {
// 旧版的人上麦可能并没有extension字段
chatRoomMembers.addAll(roomMembers);
Map<String, Object> map = new HashMap<>(chatRoomMembers.size());
for (int i = 0; i < chatRoomMembers.size(); i++) {
Map<String, Object> extension = chatRoomMembers.get(i).getExtension();
if (extension == null || extension.get(chatRoomMembers.get(i).getAccount()) == null)
continue;
//去掉一些不需要的东西长度超过4096 会导致发消息失败。
Map<String, Object> tmp = new HashMap<>();
tmp.putAll((Map<? extends String, ?>) extension.get(chatRoomMembers.get(i).getAccount()));
tmp.remove("banner");
tmp.remove("open_effect");
tmp.remove("halo");
tmp.remove("headwear");
tmp.remove("recommend");
tmp.remove("pic");
tmp.remove("cardbg");
tmp.remove("zonebg");
tmp.remove("newUser");
tmp.remove("official");
tmp.remove("defUser");
tmp.remove("hasPrettyErbanNo");
tmp.remove("officialAnchorCertificationName");
tmp.remove("officialAnchorCertificationIcon");
tmp.remove("inRoomNameplateWord");
tmp.remove("inRoomNameplatePic");
map.put(chatRoomMembers.get(i).getAccount(), tmp);
}
chatRoomMessage.setLocalExtension(map);
chatRoomMessage.setRemoteExtension(map);
return Single.create((SingleOnSubscribe<ChatRoomMessage>) e -> {
NIMChatRoomSDK.getChatRoomService().sendMessage(
chatRoomMessage,
resend
)
.setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
e.onSuccess(chatRoomMessage);
}
@Override
public void onFailed(int code) {
e.onError(new Exception("错误码: " + code));
}
@Override
public void onFailed(int code) {
e.onError(new Exception("错误码: " + code));
}
@Override
public void onException(Throwable exception) {
e.onError(exception);
}
});
});
@Override
public void onException(Throwable exception) {
e.onError(exception);
}
});
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
public boolean isExitRoom() {