SleekXMPP不处理标题类型消息(openfire)

时间:2014-11-21 12:58:55

标签: xmpp openfire

我正在尝试使用以下处理程序处理SleekXMPP客户端(来自openfire)收到的所有消息

 self.add_event_handler("message", self.onmessage)

方法

def onmessage(self,msg):

打印('我在onmessages .. !!') if msg ['type'] in('error','headline','groupchat'): 打印“%s”%msg

我可以打印“groupchat”类型的消息,但是当我收到“标题”类型的消息时,我没有收到任何消息。

我已通过启用DBUG模式验证我的连接是否正在接收这些消息。

为什么我的消息处理程序没有处理标题消息的任何想法?

EX. groupchat message i got (which is successfully processed by the handler)


<message to="13260827@chat/resource" type="groupchat" id="m_444"
 from="beach@resource/Chatadmin1 HOST"><body>user06</body>
 <html xmlns=""><body xmlns="">user06</body></html></message>"

EX. headline message I want to process with the same handler (which is not working ATM)

<message to="13260827@chat/resource" type="headline" from="chat">
<x xmlns="domain:mute">
<mute duration="5" reasonCode="mute.reason.swearing" expiryTime="1416483206670" />
</x></message>

非常感谢提供解释/解决方案;)

2 个答案:

答案 0 :(得分:1)

此处解释了上述问题的答案(类似示例): https://github.com/fritzy/SleekXMPP/tree/develop/examples/custom_stanzas

基本上我需要注册一个自定义节,因为我们在stanza中包含了非常特定于我们域的名称空间。

<message type="headline" from="chat" to="13269603@chat/resource">
    <comp xmlns="xxxx:comp" type="currency">
        <currency xmlns="xxxx:currency">
            <amount>1.00</amount>
            <iso-code>GBP</iso-code>
        </currency>
    </comp>
</message>

第1步:创建如下的类

class Currency(ElementBase):
    namespace = 'xxxx:currency'
    name = 'currency'
    plugin_attrib = 'currency'
    interfaces = set(('amount', 'iso-code'))
    sub_interfaces = interfaces


class Comp(ElementBase):
    namespace = 'xxxx:comp'
    name = 'comp'
    plugin_attrib = 'comp'
    interfaces = set(('type', 'currency'))
    sub_interfaces = interfaces
    subitem = (Currency,)

def getCurrency(self):
    currency = {}
    for cur in self.xml.findall('{%s}currency' % Currency.namespace):
        cur = Currency(cur)
        currency[cur['amount']] = cur['iso-code']
    return currency

您可以根据需要使用更多的util方法

第2步:

如下所示注册节(这应该在客户端类中完成(参见示例))

register_stanza_plugin(Message, Comp)

第3步:注册活动

self.registerHandler(
        Callback('Comp Message', StanzaPath('{%s}message/{%s}comp' % (self.default_ns,self.default_ns)),self.oncomp))

def oncomp(self, msg):
    self.event('custom_action', msg)

第4步:处理事件

self.add_event_handler('custom_action',
                           self.handle_action_event)

def handle_action_event(self, msg):
    print("I am in handle_action_event***************")
    print(msg)

答案 1 :(得分:0)

原因可能是;您应该对openfire源代码进行一些更改。

  1. 您输入了openfire-> src-> java
  2. 输入软件包org.jivesoftware.openfire;
  3. 输入了OfflineMessageStore.java
  4. 找到480 510行,如果标题返回false,则应更改 真正。