2

私は XMPP と xmpp4r ライブラリを初めて使用するので、これが明らかにどこかに文書化されている場合は、初心者の質問を許してください。

特定の JID がオンラインかどうかを同期的に確認する最も簡単な方法は何ですか? (if ステートメントで is_online?(jid) のようなものを呼び出せるようにするため)

私の詳細:

Web サーバーで特定の URL が要求されたときにユーザーにメッセージを送信しようとする Sinatra アプリを作成していますが、そのユーザーが現在オンラインである場合にのみユーザーにメッセージを送信しようとする必要があります。特定の JID がオンラインかどうかを判断するのが私の問題です。

ここで、接続してすべての最初のプレゼンス プローブ応答が Roster ヘルパーに返されるまで数秒待つと、Roster からそれらのプレゼンスを調べて #online? を呼び出すことができることがわかりました。それらで正しい値を取得します。しかし、すべてのプレゼンス アップデートがいつ送信されたかはわかりません。そのため、競合状態が発生#online?し、ロスターからプレゼンスを呼び出すと、そのプレゼンス プローブ応答をまだ受信していない場合に false が返されることがあります。

したがって、私の現在の考えでは、誰かがオンラインかどうかを調べる最も簡単な方法は、タイプ :probe の新しいプレゼンス メッセージを作成し、それを関心のある JID に送信することです。これが私が行っている方法です。たった今:

#jabber is the result of Client::new
#email is the jid I'm interested in polling
def is_online?(jabber, email)
      online = false
      p = Presence.new
      p.set_to(email)
      p.set_from(jabber.jid)
      p.set_type(:probe)
      pres = jabber.send(p) do |returned_presence|
        online = returned_presence.nil?
      end

     return online
end

現在、これはユーザーが実際にオンラインである場合に機能しますが、ユーザーがオフラインの場合、返されたプレゼンス プローブ メッセージが、presence_callbackそれをどう処理すればよいかわからない他のハンドラーによってキャッチされているように見えます。is_online?関数は値を返すことを決して終了しません。

簡単な例 is_online を提供することで、誰かが私を助けることができますか? または、プレゼンスをチェックする前に、名簿がすべての初期プレゼンス更新の取得を完了したことを検出する方法について、正しい方向に向けてください。#online?

4

1 に答える 1

1

結局のところ、JID の存在を要求する同期的な方法はありません。必要なものを要求し、応答が到着したときに応答ハンドラーが起動するのを待つだけです。

于 2010-03-17T21:54:27.650 に答える