我如何使用Smack找出MUC是否存在?

时间:2018-09-12 15:19:54

标签: xmpp smack multiuserchat


在多用户聊天(Smack 4.3.0)中使用XEP-0045-1.21,我正在尝试查找是否已经创建了一个房间,但是我不确定自己在做什么是否正确办法。 我正在搜索它,而最相关的答案是does MUC exist?

从技术上讲:

  1. 在OpenFire 4.2.0中,默认情况下将房间创建为公共房间和仅限会员。
  2. 所有会议室的名称都是由成员名称在哈希字符串(即XXXXXX029d8c36b62259d0eXXXXXXXX)中定义的ID。这意味着用户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 manager,而serviceDomain只是String

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

1 个答案:

答案 0 :(得分: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;
}