首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby XMPP4R机器人和线程-麻烦

Ruby XMPP4R机器人和线程-麻烦
EN

Stack Overflow用户
提问于 2010-12-24 00:05:47
回答 1查看 974关注 0票数 1

我希望我的机器人在并行线程中发送和接收消息。我也希望我的机器人发送消息回用户时,从用户收到任何消息。但现在他每隔5秒就会把它发回给用户。我知道这是因为我使用了"loop do“,但如果没有无限循环,我就不能使用回调。那么如何在并行线程中发送和接收消息呢?如何克服接收消息时的“循环问题”?

代码语言:javascript
运行
复制
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 }
EN

回答 1

Stack Overflow用户

发布于 2010-12-30 20:47:07

日安。你可以在没有循环的情况下使用回调,参见示例。例如:在initialize中添加

代码语言:javascript
运行
复制
@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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4520421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档