有没有办法确定用户加入了哪些多用户会议(MUCH)?

时间:2012-01-28 01:07:44

标签: xmpp chatroom

我想知道是否有办法查询XMPP服务器(传递用户JID?)以找出该用户当前所在的聊天室?如果没有,我们可以查询jabber服务器以获取所有活动聊天室的列表吗?

顺便说一句,我们正在运行ejabber以启用多用户聊天。使用java库(smack?)的解决方案是理想的。

3 个答案:

答案 0 :(得分:3)

正如Joe Hildebrand所提到的,没有这样的标准功能,因为通过XMPP允许这样做是违反隐私的,所以你不能期望从Smack那样做。也许使用管理员权限,您可以使用自定义协议扩展,但这似乎有风险。

但是,在服务器级别,您应该能够为ejabberd编写一个自定义模块,用于查询或索引用户所在的所有房间。这不是标准模块,并且涉及插件开发。

答案 1 :(得分:2)

有两个(可能是三个)XMPP实体拥有该信息:

  • 提供MUC房间的XMPP MUC组件
  • 用户XMPP客户端(或者更好的是用户使用的XMPP库)
  • 可能是 XMPP服务器(但我们忽略它)

在撰写本文时,没有标准化的方法(就XMPP XEP而言)来查询该信息。正如Joe Hildebrand指出的那样,这会导致信息泄露,这在大多数情况下都不是我们想要的。

但是您可以扩展MUC组件以提供该信息(记住XMPP可以轻松扩展)或XMPP客户端库。通常的方法是通过iq get查询。例如:

<iq type='get' from='juliet@capulet.lit/balcony' to='capulet.lit' id='q1'>
  <query xmlns='http://jabber.org/protocol/muc#joinedrooms'/>
</iq>

支持该查询的实体将报告所请求实体的已连接房间。他们也可以在其服务发现信息中宣布http://jabber.org/protocol/muc#joinedrooms功能。

请注意,这是一个虚构的协议扩展,例如。我从未在实际使用中看到它

如果MUC组件提供此功能,则如果公开此信息,则客户端无法控制它。但是,如果客户端提供此功能,那么他当然可以控制谁可以检索此信息。您可以决定在您的案例中哪种方法更好。

答案 2 :(得分:0)

获取所有聊天室都没问题,只需use this query

似乎已经有一个关于如何用smack检索房间的问题。 Look here