たとえば、参加する部屋が 20 あります。簡単な解決策は、各ルーム ID に 20 のメッセージを送信することです。パフォーマンスを考えると、これは悪いです。
メッセージを 1 回送信するだけで 20 のルームに参加したいのですが<presence>
、どうすればよいですか? <presence>
カスタムメッセージをフックするモジュールを作成しますか? しかし、この種のモジュールの書き方がわかりません。
たとえば、参加する部屋が 20 あります。簡単な解決策は、各ルーム ID に 20 のメッセージを送信することです。パフォーマンスを考えると、これは悪いです。
メッセージを 1 回送信するだけで 20 のルームに参加したいのですが<presence>
、どうすればよいですか? <presence>
カスタムメッセージをフックするモジュールを作成しますか? しかし、この種のモジュールの書き方がわかりません。
XEP-0045 Multi User Chatでは、1 つのプレゼンス パケットで 20 のチャット ルームに参加する方法が定義されていません。
ただし、他の XMPP 拡張機能をマルチ ユーザー チャットと組み合わせることで、カスタムの ejabberd 拡張機能を作成しなくても、純粋な XMPP で確実にこれを実現できます。
XEP-0033 Extended Stanza Addressingに依存できます。XMPP パケットを複数の受信者に送信できます。この例に示すように、プレゼンスでも機能します。
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 の問題が修正されるまで待たなければならないことを意味します:マルチキャスト プレゼンス パケット後のブロードキャスト プレゼンスの変更。