Как разблокировать пользователя в многопользовательском чате с помощью smack-android: 4.1.4

Я использую smack-android: 4.1.4 для подключения к серверу xmpp и использую этот код для подключения к многопользовательскому чату на этом сервере:

MultiUserChatManager mucManager = MultiUserChatManager.getInstanceFor(connection);
MultiUserChat muc = mucManager.getMultiUserChat(roomName);
muc.join(nickName,password,discussionHistory,timeout);

В этой комнате, если я владелец, я могу выгнать или забанить пользователя, чтобы забанить пользователя:

muc.banUser(userJID, reason);

и я могу получить список забаненных пользователей в этой комнате:

List<Affiliate> bannedList = muc.getOutcasts();

ВОПРОС 1: как разблокировать пользователя из предыдущего списка? проблема в том, что я не смог найти ни одной функции, например:

//muc.unbanUser(String userJID);    // there's nothing close to this

Я прочитал всю документацию, но ни к чему не пришел, так что же мне здесь не хватает?

Я могу получить джид любого забаненного пользователя через список изгоев:

String jid = outcast.getJid();  // where outcast is of type Affiliate

но нет функции использовать этот jid для разбана пользователя.

Вопрос 2: этот вопрос относится к комнатам, а не к проблеме с запрещенным списком, в некоторых комнатах я получаю следующее исключение:

PacketParserUtils? Failed to parse extension packet in Presence packet. Attributes: [email protected]/someUserNickName id=null
org.jivesoftware.smack.SmackException: Caps elment with missing attributes. Attributes: hash=null version=1.0.0.84 node=http://www.google.com/xmpp/client/caps
        at org.jivesoftware.smackx.caps.provider.CapsExtensionProvider.parse(CapsExtensionProvider.java:54)
        at org.jivesoftware.smackx.caps.provider.CapsExtensionProvider.parse(CapsExtensionProvider.java:28)
        at org.jivesoftware.smack.provider.Provider.parse(Provider.java:35)
        at org.jivesoftware.smack.util.PacketParserUtils.parseExtensionElement(PacketParserUtils.java:929)
        at org.jivesoftware.smack.util.PacketParserUtils.addExtensionElement(PacketParserUtils.java:1060)
        at org.jivesoftware.smack.util.PacketParserUtils.parsePresence(PacketParserUtils.java:583)
        at org.jivesoftware.smack.util.PacketParserUtils.parseStanza(PacketParserUtils.java:155)
        at org.jivesoftware.smack.AbstractXMPPConnection.parseAndProcessStanza(AbstractXMPPConnection.java:956)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$500(XMPPTCPConnection.java:140)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:989)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:944)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:959)
        at java.lang.Thread.run(Thread.java:856)

и это относится к некоторому коду внутри классов библиотеки smack, так что это не какое-то неперехваченное исключение внутри моего кода,

в чем причина этого исключения? и нет ли способа обрабатывать такие непроанализированные данные?

Я использую ParsingExceptionCallback в другой части своего приложения:

connection.setParsingExceptionCallback( parsingExceptionCallback ); 

но эта функция не вызывается для этого случая, есть ли аналогичные функции для класса MultiUserChat?


person T-D    schedule 22.12.2015    source источник
comment
Лучше всего задавать эти вопросы на форуме Smack For Android (ну... если он есть).   -  person DevilsHnd    schedule 23.12.2015


Ответы (2)


может быть, создание пользователя удалит джида из списка запрещенных? потому что, согласно xmpp, jid не может быть более чем в одном списке ... как бы то ни было, в xmpp есть пять списков, один для владельцев, администраторов, участников, ни один и запрещенный.

на следующем сайте

http://xmpp.org/extensions/xep-0045.html

читать

4.1 Общие условия

5.2.1 Привилегии

опциональное чтение

  1. Примеры использования администратором
person karrar kazuya    schedule 11.02.2016
comment
Да, вы правы, я так и сделал, но админ не должен быть вынужден сделать забаненного пользователя участником, чтобы удалить его из списка изгоев, вместо этого должен был быть способ сделать забаненного пользователя ни один пользователь. Мое решение состояло в том, чтобы сделать заблокированного пользователя участником, а затем отозвать его / ее членство, чтобы его принадлежность перестала существовать, и он больше не был забанен. Спасибо за ответ в любом случае :) - person T-D; 16.02.2016

Я использую сервер ejabberd с библиотекой smack-android-4.1.9, и приведенный ниже код идеально подходит для меня.

 //remove the user from Group of ejabberd.
//revoke the Ownership,Admin and membership from group of ejabberd.
public void removeUser(String room_jid,RosterVO removeUserRosterVo,boolean isAdmin){
    MultiUserChatManager multichatmanager = MultiUserChatManager.getInstanceFor(connection);
    MultiUserChat chatRoom = multichatmanager.getMultiUserChat(room_jid);

    try {
        if (isAdmin) {
            chatRoom.revokeOwnership(removeUserRosterVo.getJid());
            chatRoom.revokeAdmin(removeUserRosterVo.getJid());
            chatRoom.revokeMembership(removeUserRosterVo.getJid());
        } else {
            chatRoom.revokeMembership(removeUserRosterVo.getJid());
        }
    } catch (SmackException.NotConnectedException e) {
        e.printStackTrace();
    } catch (XMPPException.XMPPErrorException e) {
        e.printStackTrace();
    } catch (SmackException.NoResponseException e) {
        e.printStackTrace();
    }

}
person Sagar Jethva    schedule 05.05.2017