Ruby XMPP4R бот и темы - проблема - PullRequest
1 голос
/ 23 декабря 2010

Я хочу, чтобы мой бот отправлял и получал сообщения в параллельных потоках. Я также хочу, чтобы мой бот отправлял сообщение пользователю, когда получает какое-либо сообщение от пользователя. Но теперь он отправляет его пользователю каждые 5 секунд. Я понимаю, что это потому, что я использовал "цикл до", но без бесконечного цикла я не могу использовать обратные вызовы. Итак, как отправлять и получать сообщения в параллельных потоках? А как побороть мою "проблему петли" при получении сообщений?

require 'xmpp4r'

class Bot
    include Jabber

    def initialize jid,jpassword
        @jid = jid
        @jpassword = jpassword

        @client = Client.new(JID::new(@jid))
        @client.connect
        @client.auth(@jpassword)
        @client.send(Presence.new.set_type(:available))
    end

    def wait4msg
        loop do
            @client.add_message_callback do |msg|               
                send_message(msg.from,msg.body)
                sleep 5
            end
        end
    end 

    def send_message to,message
        msg = Message::new(to,message)
        msg.type = :chat
        @client.send(msg)
    end

    def add_user jid
        adding = Presence.new.set_type(:subscribe).set_to(jid)
        @client.send(adding)
    end
end

bot = Bot.new('from@example.xmpp','123456')
t1 = Thread.new do
    bot.wait4msg
end

t2 = Thread.new do
    bot.send_message('to@example.xmpp',Random.new.rand(100).to_s)
end

Thread.list.each { |t| t.join if t != Thread.main }

1 Ответ

0 голосов
/ 30 декабря 2010

Добрый день.Вы можете использовать обратные вызовы без цикла, см. Примеры.Например: в initialize добавить

@client.add_message_callback do |m|
  if m.type != :error
    m2 = Message.new(m.from, "You sent: #{m.body}")
    m2.type = m.type
    @client.send(m2)
  end
end
...