2

たとえば、参加する部屋が 20 あります。簡単な解決策は、各ルーム ID に 20 のメッセージを送信することです。パフォーマンスを考えると、これは悪いです。

メッセージを 1 回送信するだけで 20 のルームに参加したいのですが<presence>、どうすればよいですか? <presence>カスタムメッセージをフックするモジュールを作成しますか? しかし、この種のモジュールの書き方がわかりません。

4

1 に答える 1

5

XEP-0045 Multi User Chatでは、1 つのプレゼンス パケットで 20 のチャット ルームに参加する方法が定義されていません。

ただし、他の XMPP 拡張機能をマルチ ユーザー チャットと組み合わせることで、カスタムの ejabberd 拡張機能を作成しなくても、純粋な XMPP で確実にこれを実現できます。

XEP-0033 Extended Stanza Addressingに依存できます。XMPP パケットを複数の受信者に送信できます。このに示すように、プレゼンスでも機能します。

ejabberd 構成

XEP-0033 ejabberd 15.04以降、拡張スタンザ アドレス指定がデフォルトでサポートされています。ejabberd 構成モジュール セクションに mod_multicast を追加して、機能を有効にしていることを確認してください。

modules:
...
  mod_multicast: {}

multicast.example.netサービスが有効になっている場合、機能をサポートするサーバー上に新しいサービス (デフォルトの名前) が必要http://jabber.org/protocol/addressです。

<iq type='get'
    to='multicast.example.net'
    id='info1'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>

応答は次のとおりです。

<iq from="multicast.example.net" type="result" to="test@example.net/laptop" id="info1">
<query xmlns="http://jabber.org/protocol/disco#info">
<identity category="service" type="multicast" name="Multicast"/>
<feature var="http://jabber.org/protocol/disco#info"/>
<feature var="http://jabber.org/protocol/disco#items"/>
<feature var="vcard-temp"/>
<feature var="http://jabber.org/protocol/address"/>
</query>
</iq>

使用法

有効にすると、複数の MUC ルームを対象とするプレゼンス パケットを簡単に送信できます。

<presence to='multicast.example.net'>
    <addresses xmlns='http://jabber.org/protocol/address'>
        <address type='bcc' jid='testroom@conference.example.net/Usernick'/>
        <address type='bcc' jid='testroom2@ conference.example.net/Usernick'/>
    </addresses>
</presence>

したがって、同時に複数の部屋に参加していることがわかります。

問題

XEP-0033 では、そのユース ケースについて特に言及されておらず、モジュールが複数のルームに参加するためのテストを行っていませんでした。この例を書いているときに、接続を切断すると、ユーザーが参加していたルームから適切に退出しないことがわかりました。これは、次の Github の問題が修正されるまで待たなければならないことを意味します:マルチキャスト プレゼンス パケット後のブロードキャスト プレゼンスの変更

于 2015-08-03T08:00:48.330 に答える