我如何使用 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?.

从技术上讲:

  1. 房间在 OpenFire 4.2.0 中默认创建为 public 且仅限会员。
  2. 所有房间的名称都是由散列字符串中的成员名称定义的 ID,即 XXXXXX029d8c36b62259d0eXXXXXXXX。这意味着用户 A 可以与 B、C 创建一个房间,并获得 groupId 与之前的房间一样,但是用户 B(在另一台设备上)可以尝试创建相同的房间(与用户 A、B、C) ,这将给他相同的 groupId.
  3. 存在像 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;
}

其中 managerMultiUserChatManager managerserviceDomain 只是一个 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;
}

这里有更多信息https://github.com/igniterealtime/Smack/blob/4.3/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java#L809