如何使用Smack查明MUC是否存在?

问题描述 投票:1回答:2

在多用户聊天中使用Smack 4.3.0XEP-0045-1.21)我试图找出是否已经创建了一个房间,但我不确定我所做的是否正确。我找到了它,最相关的答案是does MUC exist?

从技术上讲:

  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;
}

其中managerMultiUserChatManager managerserviceDomain只是一个String

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

xmpp smack multiuserchat
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


1
投票

这基本上是正确的方式。

理想情况下,您只需使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.