Sleekxmpp:使用多个自定义节

时间:2012-06-26 15:17:30

标签: python xmpp

我正在为xmpp客户端创建测试,我需要在此过程中使用不同的自定义节。我有两个问题,我想知道你们是否可以帮助我:

  1. 正如我所提到的,我将使用几个名称相同但命名空间不同的节。这个节也可以是两个级别或更多,这是一个例子:
  2. STANZA 1

    <iq type='result' to= 'chat.com'  id='id1'>
           <aa xmlns='http://mysite.com/profile' >
              <name>My name as included in sent mails<name>
              <lang>en</lang>
              <mail>My mail as included in sent mails</mail>
              <fbuserid>46736473231<fbuserid>
              <fbaccesstoken>AAAAA84257YTRRIXTEQITXXTCMTVBTTBXU<fbaccesstoken>
              <photo_url>http://pic.facebook.com/photo.jpg</photo_url>
          </aa>
    </iq>
    

    我创建了自定义节,如下所示:

    name = 'aa'
    namespace = 'http://mysite.com/profile'
    plugin_attrib = 'aa'
    interfaces = set(('name', 'lang', 'mail', 'fbuserid', 'fbaccesstoken', 'photo_url'))
    sub_interfaces = interfaces
    

    STANZA 2

    <iq type='set' to= 'roomname@conference.chat.come'  id='id1'>
     <aa xmlns='http://mysite.com/muc#share'>
       <item name='Falda tubo' thumbnail='http://webpage.info/falda_tn.jpg' id='itemid1' action='add' url='http://webpage.info/falda.html’>
          <metadata  path=' ' />
       </item>
     </aa>
    </iq>
    

    问题1:如何创建超过两个级别的节?

    1. 正如你所看到的,我的节有相同的名字,但更改了命名空间,这给了我一些麻烦,因为我创建了get_ *和set_ *等方法来处理信息,但它正在执行:

      register_stanza_plugin(Iq, stanza_profile)
      register_stanza_plugin(Iq, stanza_rooms)
      
      def start(self, event):
          self.send_presence()
          self.get_parameters()
          self.set_parameters()
      
    2. 这会记录两个节,但仅在最后一个节点执行操作(stanza_rooms)

      问题2:我如何单独处理?

      使用python。任何帮助表示赞赏!

      致以最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

对于有关同名的多个节的问题,plugin_attrib值很重要,因为这将区分您的两个节。现在看起来你已经使用'aa'用于两个stanza的plugin_attrib导致冲突并且最后一个注册的节获胜。

通常,我们在这些情况下使用命名空间的一部分。例如,对于disco,有两个query元素,其名称空间为http://jabber.org/protocol/disco#infohttp://jabber.org/protocol/disco#items。因此,这两个节具有相同的name,不同的namespace值,并且plugin_attrib值分别为'disco_info''disco_items'

看起来您可以使用名称aa_profileaa_muc_share或类似名称来解决问题。

对于您的其他问题,看起来您想要的是更多的节对象。一个提供外层容器节,另一个管理一个单独的子项。您可以使用以下方法完成此工作:

class InnerStanza(ElementBase):
    name = 'inner'
    namespace = 'example'
    plugin_attrib = 'inner'
    plugin_multi_attrib = 'inner_items'
    ...

register_stanza_plugin(OuterStanza, InnerStanza, iterable=True)

通过上述内容,您可以访问outer['inner_items']以获取与InnerStanza类匹配的内部实体列表(因为plugin_multi_attrib值)。

- Lance