【问题标题】:ejabberd bookmarks replacing previous bookmarksejabberd 书签替换以前的书签
【发布时间】:2015-10-19 05:40:14
【问题描述】:

我使用 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&apos;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 吗?如果您配置了 pubsub,该怎么做?
  • 版本是 15.06,我刚刚用 pubsub 配置更新了问题。请记住,pubsub 工作得很好。问题是我只能存储一个会议。我想知道添加会议的每个请求是否需要更改任何内容

标签: xmpp publish-subscribe ejabberd bookmarks


【解决方案1】:

书签规范正在利用个人事件协议。我们在 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 BookmarksXEP-0163 PEP)。我没有看到有关 PEP 节点上项目数量的示例或参考。所有示例仅显示一项。 PEP 的目标是广播状态更新。大多数规范中的假设是只涉及一个项目(一个头像、一个 geoloc 等)。但是,如果我们可以在规范中找到关于可以使用的项目数量的明确元素,我们将很乐意修改我们的假设。

【讨论】:

  • 您好!谢谢你的回答。我会尽快尝试一下,看看它是否有效。从外观上我可以看出它可能会起作用,因为您正在存储一个带有 2 个会议的书签。在我的特殊情况下,我存储了第一个,但存储了第二个(只有 1 个会议的请求)它正在替换前一个。
  • 要更新书签集:您应该先阅读它,然后存储更新的版本,而不是发送增量更改。更新了我的答案以反映此评论。
  • 这正是我的问题,我不知道增量更改不起作用,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多