2010-12-23 63 views
1

我想讓我的機器人在並行線程中發送和接收消息。我也希望我的機器人在收到用戶的任何消息時將消息發回給用戶。但現在他每5秒發回一次。我明白,這是因爲我用「循環做」,但沒有無限循環,我不能使用回調。 那麼如何在並行線程中發送和接收消息呢?如何在接收消息時克服我的「循環問題」?Ruby XMPP4R機器人和線程 - 麻煩

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('[email protected]','123456') 
t1 = Thread.new do 
    bot.wait4msg 
end 

t2 = Thread.new do 
    bot.send_message('[email protected]',Random.new.rand(100).to_s) 
end 

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

回答

0

美好的一天。你可以使用沒有循環的回調函數,參見一個例子。例如:在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