如何在Strophe中路由群聊消息

时间:2012-12-04 19:19:48

标签: routes xmpp ejabberd strophe

我收到的消息看起来像这样......

<message 
    from='pinza@some.com' 
    to='tulyar@some.com' 
    type='groupchat' 
    xmlns='jabber:message:group_chat_test'>

    <body>Here is my message.</body>
</message>

在我的routes.js文件中,我正在尝试根据正文内容之外的其他内容路由消息 - 特别是我想根据自定义命名空间路由它(所以我可以使用不同的groupchat消息类型由不同的控制器处理)所以我试试这个...

bind.query('message[type="groupchat"][xmlns="jabber:message:group_chat_test"]')
  .to(SD.Messenger.Room, "groupchat_test");

但是消息进入以太,而不是到达group_chat_test控制器。我们使用&lt; iq&gt;来做类似的事情,但它似乎不适用于群聊消息。

我错过了什么吗?我应该能够以这种方式查询群聊消息吗?还有其他方法可以做到吗?

仅供参考,我目前的解决方法是这个黑客...

bind.query('message[type="groupchat"]').to(SD.Messenger.Room, "all_groupchat_msgs");

在controllers.js中使用此功能

SD.Messenger.Room.prototype.all_groupchat_msgs = function() {
   // test the body of the incoming stanza and 
   // based on it's contents do different things...
};

(使用Ejabberd,Bosh,Stroph)

2 个答案:

答案 0 :(得分:1)

您无法更改主XMPP节消息,iq和状态的命名空间。您只能在子元素上拥有自定义命名空间。

当您的IQ工作时,您可能在其中一个子元素中有自定义命名空间。

的示例:

<iq type='get' id='1' to='user@server.com/resource'>
   <query xmlns='my-custom-ns'>
      payload
   </query>
</iq>


<message type='groupchat' to='room@muc.server.com'>
   <x xmlns='my-custom-ns'>
      payload
   </x>
</message>

答案 1 :(得分:1)

这是有效的方法...... 添加自定义属性...

<message 
    from='pinza@some.com' 
    to='tulyar@some.com' 
    type='groupchat' 
    custom_subtype='my_custom_type'>

    <body>Here is my message.</body>
</message>

创建一个在该自定义属性

上的文件管理器的路径
bind.query('message[type="groupchat"][custom_subtype="my_custom_type"]')
  .to(Room, "controller_for_my_custom_type");