2009-11-08 4 views
2

저는 XMPP와 xmpp4r 라이브러리가 처음이에요. 분명히 어딘가에 분명하게 문서화되어 있다면 제 멍청한 질문을 용서해주십시오.xmpp4r Ruby gem을 사용하면 연락처가 온라인 상태인지를 동 기적으로 발견 할 수 있습니까?

동기식으로 주어진 JID가 온라인 상태인지 확인하는 가장 간단한 방법은 무엇입니까? (나는 is_online 뭔가를 호출 할 수 있도록 (JID) if 문에?)

내 세부 정보 :

나는 경우 특정 사용자에게 메시지 전송을 시도하는시나 응용 프로그램을 쓰고 있어요 url은 웹 서버에서 요청을 받지만 해당 사용자가 현재 온라인 상태 인 경우에만 사용자에게 메시지를 보내야합니다. 주어진 JID가 온라인인지 알아내는 것이 나의 문제입니다.

이제 모든 초기 존재 프로브 응답이 수위 도우미에게 돌아올 때까지 몇 초 기다렸다가 기다리면 내 수양자 목록에서 해당 존재를 검사하고 #online을 호출 할 수 있습니다. 올바른 값을 얻기 위해 그러나 모든 현재 상태 업데이트가 전송 된 시점을 알 수 없으므로 경쟁 조건이 있으며 때로는 해당 존재 프로브 응답을 아직받지 못한 경우 내 로스터의 현재 상태에서 #online?을 호출하면 false가 반환됩니다.

현재 나의 생각은 누군가 온라인 상태인지를 알아내는 가장 직접적인 방법은 type : 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?

+1

사용자가 온라인 상태인지 테스트하기 전에 헤드 라인 유형의 메시지를 직접 보내지 않는 이유는 무엇입니까? XMPP에서 연락처를 사용할 수 없다는 오류를 반환하도록합니다. 그리고 그것은 하나의 메시지입니다. – cstar

+0

죄송합니다. 단어를 잊어 버렸습니다 : "XMPP * 서버가 * 오류를 반환하도록하려면 연락 할 수 없습니다." – cstar

답변

1

밝혀진 바와 같이 동기 JID의 존재를 묻는 방법. 방금 원하는 것을 물어보고 응답이 도착하면 응답 핸들러가 실행될 때까지 기다려야합니다.

+0

샘플 코드를 게시 할 수 있습니까? 존재 여부 및 헤드 라인 유형의 메시지로 시도해 보았습니다. 현재 상태가 중단되고 헤드 라인이 실제로 온라인 상태 인 경우 사용자에게 메시지를 전달하여 사용 사례가 중단됩니다. – johnnygoodman

+0

죄송합니다, @ johnnygoodman,하지만이 코드는 더 이상 쓸모가 없습니다. –

관련 문제