在多用户聊天中使用Smack 4.3.0(XEP-0045-1.21)我试图找出是否已经创建了一个房间,但我不确定我所做的是否正确。我找到了它,最相关的答案是does MUC exist?。
从技术上讲:
XXXXXX029d8c36b62259d0eXXXXXXXX
。这意味着用户A可以创建一个带有B,C的房间并获得与前一个类似的groupId
,但是然后用户B(在另一个设备中)可以尝试创建相同的房间(用户A,B,C),这将是给他同样的groupId
。Group Chat
并重新加入。我现在在做什么:
@WorkerThread
public boolean isGroupChatAlreadyCreated(@NonNull final String groupId)
throws
XmppStringprepException,
XMPPException.XMPPErrorException,
MultiUserChatException.NotAMucServiceException,
SmackException.NotConnectedException,
InterruptedException,
SmackException.NoResponseException {
List<HostedRoom> hostedRooms = manager.getHostedRooms(JidCreate.domainBareFrom(serviceDomain));
for (HostedRoom hostedRoom : hostedRooms) {
if (hostedRoom.getName().equalsIgnoreCase(groupId)) {
return true;
}
}
return false;
}
其中manager
是MultiUserChatManager manager
而serviceDomain
只是一个String
。
所以,问题:这是正确的方法吗?可以改进吗?
我相信更简单的方法是获取有关房间的一些信息,例如其配置表格。如果没有任何东西将返回,那么这意味着房间不存在:
public boolean isGroupChatAlreadyCreated(@NonNull final EntityBareJid groupId)
throws
XMPPErrorException,
NotConnectedException,
InterruptedException,
NoResponseException {
MultiUserChat multiUserChat = MultiUserChatManager.getInstanceFor(connection).getMultiUserChat(groupId);
return multiUserChat.getConfigurationForm() != null;
}
这基本上是正确的方式。
理想情况下,您只需使用MulitUserChatManager.getRoomInfo(EntityBareJid)
。如果房间存在,该方法将返回RoomInfo
,如果不存在则返回。
通过使用EntityBareJid
而不是equals()
将'groupId'的类型更改为equalsIgnoreCase()
,也可以改进原始方法。并将您的groupId作为MUC地址的Localpart。所以你的功能变成了:
public boolean isGroupChatAlreadyCreated(@NonNull final EntityBareJid groupId)
throws
XmppStringprepException,
XMPPErrorException,
NotAMucServiceException,
NotConnectedException,
InterruptedException,
NoResponseException {
List<HostedRoom> hostedRooms = manager.getHostedRooms(JidCreate.domainBareFrom(serviceDomain));
for (HostedRoom hostedRoom : hostedRooms) {
if (hostedRoom.getJid().equals(groupId)) {
return true;
}
}
return false;
}