Sleekxmpp:使用多个自定义节
Posted
技术标签:
【中文标题】Sleekxmpp:使用多个自定义节【英文标题】:Sleekxmpp: Working with more than one custom stanza 【发布时间】:2012-06-26 15:17:30 【问题描述】:我正在为 xmpp 客户端创建一个测试,并且在此过程中我需要使用不同的自定义节。我有两个问题想知道你们是否可以帮助我:
-
正如我所提到的,我将使用多个名称相同但名称空间不同的节。此节也可以是两级或更多,这里是一个例子:
第 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
第 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:如何创建两个以上级别的节?
如您所见,我的节具有相同的名称但更改了命名空间,这给我带来了一些麻烦,因为我创建了诸如 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()
这会注册两个节,但只在最后一个(stanza_rooms)中执行操作
问题2:如何分开处理?
在 python 上工作。任何帮助表示赞赏!
最好的问候,
【问题讨论】:
【参考方案1】:对于您关于具有相同名称的多个节的问题,plugin_attrib
值很重要,因为它将区分您的两个节。现在看起来你已经为两个节的plugin_attrib
使用了'aa'
,这会导致冲突并且最后注册的节获胜。
通常,我们在这些情况下使用命名空间的一部分。例如,对于迪斯科,有两个 query
元素的命名空间为 http://jabber.org/protocol/disco#info
和 http://jabber.org/protocol/disco#items
。所以这两个节具有相同的name
,不同的namespace
值,并且分别具有'disco_info'
和'disco_items'
的plugin_attrib
值。
您似乎可以使用名称 aa_profile
和 aa_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,首先,感谢您提供的所有帮助。如您所见,我已经加入了slickxmpp会议室,但我们似乎处于不同的时区,因此很难沟通。在您提供的帮助以及您和 Nathanial 创建的一些示例 (github.com/fritzy/SleekXMPP/wiki/Stanza-Objects) 下,我已经能够创建一个节,但是我们的自定义节变得越来越棘手,我不太明白. 这是帖子的续篇:在这里,我给你留下一个我创建的自定义节,我不知道我是否做得对。这是我在您的帮助下所理解的。如果看起来一团糟,我提前道歉:friendpaste.com/3C3JbrHvNfHDdRUZ38aMZG 再次感谢。 是的,我注意到时区差异是一个问题。我已经用 cmets 修改了你的示例,说明了我所做的更改以及更改的原因:friendpaste.com/5OGWZfDN96mjkqrhzAOnLK 简而言之,主要问题只是接口解析中的冲突,以及节注册调用的语法。以上是关于Sleekxmpp:使用多个自定义节的主要内容,如果未能解决你的问题,请参考以下文章
四大组件之ContentProvider-轻轻松松自定义ContentProvider
SpringBoot2 @validated 自定义效验类型