Наличие бота XMPP4r - случайно появляется в автономном режиме до перезагрузки? - PullRequest
0 голосов
/ 06 июня 2011

У меня есть несколько ботов, собранных с XMPP4r, и я вижу странную проблему, когда они некоторое время появляются в автономном режиме.(без установленного количества времени)

Однажды вечером я увижу их в своем списке, а на следующее утро я проснусь на следующее утро и обнаружу, что они появляются в автономном режиме.Я могу отправить им сообщение, и они ответят нормально, они просто появляются в автономном режиме.

Если я перезапущу их, они сразу же снова появятся в моем списке.Это происходит с несколькими клиентами XMPP (iChat, Adium, Meebo) и несколькими отдельными ботами, поэтому я не думаю, что это случайность.

Любые рекомендации о том, где я должен начать искать?Я использую свой собственный сервер Prosody, поэтому я знаю, что это не перезагрузка.Может ли это быть проблема повторного подключения без вывода сообщений?

1 Ответ

1 голос
/ 03 августа 2012

Внезапно наш дружественный jabber-бот по имени Bender перестал работать, я обнаружил, что главная проблема в том, что сервер отправляет пинг, как показано ниже:

<iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='s2c1' type='get'>
  <ping xmlns='urn:xmpp:ping'/>
</iq>

И клиент должен ответить так:

<iq from='juliet@capulet.lit/balcony' to='capulet.lit' id='s2c1' type='result'/>

Больше информации на http://xmpp.org/extensions/xep-0199.html#s2c

Это случилось со мной при попытке подключиться к серверу сообщений Mountain Lion Server (возможно, другие серверы имеют такое же требование).

Друг нашел простой способ решить эту проблему:

#!/usr/bin/env ruby
require 'rubygems'
require 'xmpp4r'
require 'xmpp4r/roster'
require 'xmpp4r/client'
require 'xmpp4r/muc'

Jabber::debug = true
client = Jabber::Client.new(Jabber::JID.new('user@macbook.local'))
client.connect
client.auth('password')
muc = Jabber::MUC::MUCClient.new(client)
muc.join(Jabber::JID::new('chatroom@conference.macbook.local' + client.jid.node))

# add the callback to respond to server ping
client.add_iq_callback do |iq_received|
  if iq_received.type == :get
    if iq_received.queryns.to_s != 'http://jabber.org/protocol/disco#info'
      iq = Jabber::Iq.new(:result, client.jid.node)
      iq.id = iq_received.id
      iq.from = iq_received.to
      iq.to = iq_received.from
      client.send(iq)
    end
  end
end

Надеюсь, этот код поможет кому-то еще.

Поздравления Эдуардо

...