ejabberd 书签替换以前的书签
ejabberd bookmarks replacing previous bookmarks
我正在使用 ejabberd 作为聊天服务器。当我发送请求时
(示例来自 http://xmpp.org/extensions/xep-0048.html#storage-pubsub-upload)
<iq from='juliet@capulet.lit/balcony' type='set' id='pip1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='storage:bookmarks'>
<item id='current'>
<storage xmlns='storage:bookmarks'>
<conference name='The Play's the Thing'
autojoin='true'
jid='theplay@conference.shakespeare.lit'>
<nick>JC</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns='jabber:x:data' type='submit'>
<field var='FORM_TYPE' type='hidden'>
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var='pubsub#persist_items'>
<value>true</value>
</field>
<field var='pubsub#access_model'>
<value>whitelist</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
PubSub 配置:
mod_pubsub:
db_type: odbc
access_createnode: pubsub_createnode
## reduces resource comsumption, but XEP incompliant
ignore_pep_from_offline: true
## XEP compliant, but increases resource comsumption
## ignore_pep_from_offline: false
last_item_cache: false
plugins:
- "flat"
- "hometree"
- "pep" # pep requires mod_caps
它工作正常。但是,如果我发送类似的请求来存储不同的聊天室,它会替换这个。即使我更改项目 "id"。关于如何存储多个会议有什么想法吗?
书签规范正在利用个人事件协议。我们在默认配置下为 ejabberd 中的 PEP 所做的假设是那些特殊 PubSub 节点上保留的项目数为“1”。
您可以通过发送以下节点配置请求来检查:
<iq type='get'
id='config1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
<configure node='storage:bookmarks'/>
</pubsub>
</iq>
您会看到回复显示最大项目数为“1”:
<iq from="mremond@localhost" type="result" to="mremond@localhost/MacBook-Pro-de-Mickael" id="config1">
<pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
<configure node="storage:bookmarks">
<x xmlns="jabber:x:data" type="form">
...
<field type="text-single" label="Max # of items to persist" var="pubsub#max_items">
<value>1</value>
</field>
...
</x>
</configure>
</pubsub>
</iq>
这确实意味着您应该只有一个书签集。但是,这并不妨碍您将多个书签存储在同一个集合中,如下所示:
<iq type='set' id='pip1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='storage:bookmarks'>
<item id='current'>
<storage xmlns='storage:bookmarks'>
<conference name='Bookmark1'
autojoin='false'
jid='room1@conference.shakespeare.lit'>
<nick>Mynick1</nick>
</conference>
<conference name='Bookmark2'
autojoin='true'
jid='room2@conference.shakespeare.lit'>
<nick>Mynick2</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns='jabber:x:data' type='submit'>
<field var='FORM_TYPE' type='hidden'>
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var='pubsub#persist_items'>
<value>true</value>
</field>
<field var='pubsub#access_model'>
<value>whitelist</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
ejabberd 会回复成功:
<iq from="mremond@localhost" type="result" to="mremond@localhost/MacBook-Pro-de-Mickael" id="pip1">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<publish node="storage:bookmarks">
<item id="current"/>
</publish>
</pubsub>
</iq>
然后您可以查询您的书签并检查您在该书签集中是否有两个书签:
<iq type='get' id='retrieve1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<items node='storage:bookmarks'/>
</pubsub>
</iq>
响应是:
<iq from="mremond@localhost" type="result" to="mremond@localhost/MacBook-Pro-de-Mickael" id="retrieve1">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<items node="storage:bookmarks">
<item id="current">
<storage xmlns="storage:bookmarks">
<conference name="Bookmark1" autojoin="false" jid="room1@conference.shakespeare.lit">
<nick>Mynick1</nick>
</conference>
<conference name="Bookmark2" autojoin="true" jid="room2@conference.shakespeare.lit">
<nick>Mynick2</nick>
</conference>
</storage>
</item>
</items>
</pubsub>
</iq>
您可以在同一组中存储多个书签。只需一次上传所有这些。因此,要更新书签集,您应该先读取它然后存储更新版本,而不是发送增量更改。
就是说,我读了好几遍规范 (XEP-0048 Bookmarks and XEP-0163 PEP)。我没有看到关于 PEP 节点上项目数量的示例或参考。所有示例仅显示一项。 PEP 的目标是广播状态更新。大多数规范中的假设是只涉及一个项目(一个头像,一个 geoloc 等)。但是,如果我们可以在规范中找到关于可以使用的项目数量的明确元素,我们很乐意修改我们的假设。
我正在使用 ejabberd 作为聊天服务器。当我发送请求时
(示例来自 http://xmpp.org/extensions/xep-0048.html#storage-pubsub-upload)
<iq from='juliet@capulet.lit/balcony' type='set' id='pip1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='storage:bookmarks'>
<item id='current'>
<storage xmlns='storage:bookmarks'>
<conference name='The Play's the Thing'
autojoin='true'
jid='theplay@conference.shakespeare.lit'>
<nick>JC</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns='jabber:x:data' type='submit'>
<field var='FORM_TYPE' type='hidden'>
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var='pubsub#persist_items'>
<value>true</value>
</field>
<field var='pubsub#access_model'>
<value>whitelist</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
PubSub 配置:
mod_pubsub:
db_type: odbc
access_createnode: pubsub_createnode
## reduces resource comsumption, but XEP incompliant
ignore_pep_from_offline: true
## XEP compliant, but increases resource comsumption
## ignore_pep_from_offline: false
last_item_cache: false
plugins:
- "flat"
- "hometree"
- "pep" # pep requires mod_caps
它工作正常。但是,如果我发送类似的请求来存储不同的聊天室,它会替换这个。即使我更改项目 "id"。关于如何存储多个会议有什么想法吗?
书签规范正在利用个人事件协议。我们在默认配置下为 ejabberd 中的 PEP 所做的假设是那些特殊 PubSub 节点上保留的项目数为“1”。
您可以通过发送以下节点配置请求来检查:
<iq type='get'
id='config1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
<configure node='storage:bookmarks'/>
</pubsub>
</iq>
您会看到回复显示最大项目数为“1”:
<iq from="mremond@localhost" type="result" to="mremond@localhost/MacBook-Pro-de-Mickael" id="config1">
<pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
<configure node="storage:bookmarks">
<x xmlns="jabber:x:data" type="form">
...
<field type="text-single" label="Max # of items to persist" var="pubsub#max_items">
<value>1</value>
</field>
...
</x>
</configure>
</pubsub>
</iq>
这确实意味着您应该只有一个书签集。但是,这并不妨碍您将多个书签存储在同一个集合中,如下所示:
<iq type='set' id='pip1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='storage:bookmarks'>
<item id='current'>
<storage xmlns='storage:bookmarks'>
<conference name='Bookmark1'
autojoin='false'
jid='room1@conference.shakespeare.lit'>
<nick>Mynick1</nick>
</conference>
<conference name='Bookmark2'
autojoin='true'
jid='room2@conference.shakespeare.lit'>
<nick>Mynick2</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns='jabber:x:data' type='submit'>
<field var='FORM_TYPE' type='hidden'>
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var='pubsub#persist_items'>
<value>true</value>
</field>
<field var='pubsub#access_model'>
<value>whitelist</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
ejabberd 会回复成功:
<iq from="mremond@localhost" type="result" to="mremond@localhost/MacBook-Pro-de-Mickael" id="pip1">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<publish node="storage:bookmarks">
<item id="current"/>
</publish>
</pubsub>
</iq>
然后您可以查询您的书签并检查您在该书签集中是否有两个书签:
<iq type='get' id='retrieve1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<items node='storage:bookmarks'/>
</pubsub>
</iq>
响应是:
<iq from="mremond@localhost" type="result" to="mremond@localhost/MacBook-Pro-de-Mickael" id="retrieve1">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<items node="storage:bookmarks">
<item id="current">
<storage xmlns="storage:bookmarks">
<conference name="Bookmark1" autojoin="false" jid="room1@conference.shakespeare.lit">
<nick>Mynick1</nick>
</conference>
<conference name="Bookmark2" autojoin="true" jid="room2@conference.shakespeare.lit">
<nick>Mynick2</nick>
</conference>
</storage>
</item>
</items>
</pubsub>
</iq>
您可以在同一组中存储多个书签。只需一次上传所有这些。因此,要更新书签集,您应该先读取它然后存储更新版本,而不是发送增量更改。
就是说,我读了好几遍规范 (XEP-0048 Bookmarks and XEP-0163 PEP)。我没有看到关于 PEP 节点上项目数量的示例或参考。所有示例仅显示一项。 PEP 的目标是广播状态更新。大多数规范中的假设是只涉及一个项目(一个头像,一个 geoloc 等)。但是,如果我们可以在规范中找到关于可以使用的项目数量的明确元素,我们很乐意修改我们的假设。