Как я могу узнать, существует ли MUC с помощью Smack? - PullRequest
0 голосов
/ 12 сентября 2018


Работа с Smack 4.3.0 в многопользовательском чате ( XEP-0045-1.21 ) Я пытаюсь выяснить, была ли комната уже создана илинет, но я не уверен, что то, что я делаю, - правильный путь.У меня есть поиск, и самый относительный ответ на него был существует ли MUC? .

Технически говоря:

  1. Комнаты по умолчанию создаются как общедоступные и только для членов в OpenFire 4.2.0.
  2. Все имена комнат - это идентификаторы, определяемые именами участников в хеш-строке, то есть 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;
}

, где manager - MultiUserChatManager manager, а serviceDomain - просто String.

итак, вопросы : это правильный способ сделать это?это может быть улучшено?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я считаю, что проще всего получить информацию о комнате, например, форму конфигурации. Если ничего не будет возвращено, значит номер не существует:

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

0 голосов
/ 12 сентября 2018

Это, по сути, правильный путь.

В идеале вы просто используете MulitUserChatManager.getRoomInfo(EntityBareJid). Метод вернет RoomInfo, если комната существует, или метод throw, если его нет.

Ваш оригинальный подход также можно улучшить, изменив тип 'groupId' на EntityBareJid, используя equals() вместо equalsIgnoreCase(). И поместите ваш groupId как Localpart адреса MUC. Таким образом, ваша функция становится:

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