2015-07-28 5 views
2

Я использую ejabberd в качестве чат-сервера. Когда я посылаю запросЗакладки ejabberd, заменяющие предыдущие закладки

(пример из http://xmpp.org/extensions/xep-0048.html#storage-pubsub-upload)

<iq from='[email protected]/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='[email protected]'> 
      <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». Любые идеи о том, как хранить несколько конференций?

+0

Не могли бы вы рассказать нам, какую версию ejabberd вы используете, и как настроить pubsub? –

+0

версия 15.06, и я просто обновил вопрос с конфигурацией pubsub. Имейте в виду, что pubsub работает отлично. Проблема в том, что я могу хранить только одну конференцию. Интересно, есть ли что-нибудь, что мне нужно изменить по каждому запросу, чтобы добавить конференцию? – nhenrique

ответ

1

Спецификация Закладок использует протокол Personal Eventing Protocol. Предположение, которое мы сделали для PEP в ejabberd с конфигурацией по умолчанию, - это количество сохраненных элементов на этих специальных узлах PubSub - «1».

Вы можете проверить это, отправив следующий запрос конфигурации узла:

<iq type='get' 
    id='config1'> 
    <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'> 
    <configure node='storage:bookmarks'/> 
    </pubsub> 
</iq> 

Вы увидите, что ответ показывает, что максимальное количество элементов является «1»:

<iq from="[email protected]" type="result" to="[email protected]/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='[email protected]'> 
      <nick>Mynick1</nick> 
      </conference> 
      <conference name='Bookmark2' 
         autojoin='true' 
         jid='[email protected]'> 
      <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="[email protected]" type="result" to="[email protected]/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="[email protected]" type="result" to="[email protected]/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="[email protected]"> 
      <nick>Mynick1</nick> 
      </conference> 
      <conference name="Bookmark2" autojoin="true" jid="[email protected]"> 
      <nick>Mynick2</nick> 
      </conference> 
     </storage> 
     </item> 
</items> 
</pubsub> 
</iq> 

Вы можете сохранить несколько закладок в одном наборе. Просто загрузите все из них сразу. Итак, чтобы обновить набор закладок, вы должны сначала его прочитать, а затем сохранить обновленную версию, а не отправлять инкрементные изменения.

Тем не менее, я несколько раз читал спецификацию (XEP-0048 Bookmarks и XEP-0163 PEP). Я не вижу примера или ссылки на количество элементов на узле PEP. Все примеры показывают только один элемент. Цель PEP - трансляция обновлений состояния. Предположение в большинстве спецификаций состоит в том, что имеется только один элемент (один аватар, один геолокатор и т. Д.). Тем не менее, мы будем рады пересмотреть наше предположение, если мы сможем найти явный элемент в спецификации о количестве элементов, которые могут быть использованы.

+0

Здравствуйте! Спасибо за ответ. Я попробую это как можно скорее, чтобы убедиться, что это работает. Я просто вижу, что это может сработать, потому что вы сохраняете закладку с двумя конференциями. В моем конкретном случае я сохраняю первый, но сохраняя второй (запрос только с одной конференцией), он заменяет предыдущий. – nhenrique

+0

Чтобы обновить набор закладок, вы должны сначала прочитать его, а затем сохранить обновленную версию, а не отправлять инкрементные изменения. Обновлен мой ответ, чтобы отразить этот комментарий. –

+0

это именно моя проблема, я понятия не имел, что инкрементные изменения не работают, большое спасибо! – nhenrique

Смежные вопросы