我如何使用 Smack 查明 MUC 是否存在?
How can I find out if a MUC exists using Smack?
与 Smack 4.3.0 in a Multi User Chat (XEP-0045-1.21) 一起工作 我想知道是否已经创建了一个房间,但我不确定我正在做的事情是否正确。
我搜索过它,最相关的答案是 does MUC exist?.
从技术上讲:
- 房间在 OpenFire 4.2.0 中默认创建为 public 且仅限会员。
- 所有房间的名称都是由散列字符串中的成员名称定义的 ID,即
XXXXXX029d8c36b62259d0eXXXXXXXX
。这意味着用户 A 可以与 B、C 创建一个房间,并获得 groupId
与之前的房间一样,但是用户 B(在另一台设备上)可以尝试创建相同的房间(与用户 A、B、C) ,这将给他相同的 groupId
.
- 存在像 whatsapp 这样的架构层,因此用户可以离开
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
。
所以,问题:这是正确的做法吗?可以改进吗?
本质上是正确的方法。
理想情况下,您只需使用 MulitUserChatManager.getRoomInfo(EntityBareJid)
。如果房间存在,该方法将 return 一个 RoomInfo
,如果不存在则抛出。
您原来的方法也可以通过使用 equals()
而不是 equalsIgnoreCase()
将 'groupId' 的类型更改为 EntityBareJid
来改进。并将您的 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;
}
我认为更简单的方法是获取有关房间的一些信息,例如它的配置形式。如果什么都没有返回则表示房间不存在:
public boolean isGroupChatAlreadyCreated(@NonNull final EntityBareJid groupId)
throws
XMPPErrorException,
NotConnectedException,
InterruptedException,
NoResponseException {
MultiUserChat multiUserChat = MultiUserChatManager.getInstanceFor(connection).getMultiUserChat(groupId);
return multiUserChat.getConfigurationForm() != null;
}
与 Smack 4.3.0 in a Multi User Chat (XEP-0045-1.21) 一起工作 我想知道是否已经创建了一个房间,但我不确定我正在做的事情是否正确。
我搜索过它,最相关的答案是 does MUC exist?.
从技术上讲:
- 房间在 OpenFire 4.2.0 中默认创建为 public 且仅限会员。
- 所有房间的名称都是由散列字符串中的成员名称定义的 ID,即
XXXXXX029d8c36b62259d0eXXXXXXXX
。这意味着用户 A 可以与 B、C 创建一个房间,并获得groupId
与之前的房间一样,但是用户 B(在另一台设备上)可以尝试创建相同的房间(与用户 A、B、C) ,这将给他相同的groupId
. - 存在像 whatsapp 这样的架构层,因此用户可以离开
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
。
所以,问题:这是正确的做法吗?可以改进吗?
本质上是正确的方法。
理想情况下,您只需使用 MulitUserChatManager.getRoomInfo(EntityBareJid)
。如果房间存在,该方法将 return 一个 RoomInfo
,如果不存在则抛出。
您原来的方法也可以通过使用 equals()
而不是 equalsIgnoreCase()
将 'groupId' 的类型更改为 EntityBareJid
来改进。并将您的 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;
}
我认为更简单的方法是获取有关房间的一些信息,例如它的配置形式。如果什么都没有返回则表示房间不存在:
public boolean isGroupChatAlreadyCreated(@NonNull final EntityBareJid groupId)
throws
XMPPErrorException,
NotConnectedException,
InterruptedException,
NoResponseException {
MultiUserChat multiUserChat = MultiUserChatManager.getInstanceFor(connection).getMultiUserChat(groupId);
return multiUserChat.getConfigurationForm() != null;
}