1


在多用户聊天 ( XEP-0045-1.21 ) 中 使用Smack 4.3.0我试图确定一个房间是否已经创建,但我不确定我在做什么是正确的方法. 我已经搜索过它,最相关的答案是MUC 存在吗?.

从技术上讲:

  1. 在 OpenFire 4.2.0 中,房间默认创建为公共和仅限成员。
  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;
}

where manageris MultiUserChatManager managerand serviceDomainis just a String.

所以,问题是:这是正确的方法吗?可以改进吗?

4

2 回答 2

2

我相信更简单的方法是获取一些关于房间的信息,例如它的配置表格。如果什么都不返回,则表示房间不存在:

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

于 2018-09-14T12:04:29.440 回答
1

这基本上是正确的方法。

理想情况下,您只需使用MulitUserChatManager.getRoomInfo(EntityBareJid). 如果房间存在,该方法将返回 a RoomInfo,如果不存在则抛出。

您的原始方法也可以通过将 'groupId' 的类型更改为EntityBareJidusingequals()而不是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;
}
于 2018-09-12T17:36:37.093 回答