ruby/xmpp/examples/basic/mucsimplebot.rb
#!/usr/bin/env ruby
$:.unshift '../../../../../lib/'
require 'xmpp4r'
require 'xmpp4r/muc/helper/simplemucclient'


if ARGV.size != 3
  puts "Usage: #{$0} <jid> <password> <room@conference/nick>"
  exit
end

# Print a line formatted depending on time.nil?
def print_line(time, line)
  if time.nil?
    puts line
  else
    puts "#{time.strftime('%I:%M')} #{line}"
  end
end


#Jabber::debug = true
cl = Jabber::Client.new(Jabber::JID.new(ARGV[0]))
cl.connect
cl.auth(ARGV[1])

# For waking up...
mainthread = Thread.current

# This is the SimpleMUCClient helper!
m = Jabber::MUC::SimpleMUCClient.new(cl)

# SimpleMUCClient callback-blocks

m.on_join { |time,nick|
  print_line time, "#{nick} has joined!"
  puts "Users: " + m.roster.keys.join(', ')
}
m.on_leave { |time,nick|
  print_line time, "#{nick} has left!"
}

m.on_message { |time,nick,text|
  print_line time, "<#{nick}> #{text}"

  # Avoid reacting on messaged delivered as room history
  unless time
    # Bot: invite astro@spaceboyz.net
    if text.strip =~ /^(.+?): invite (.+)$/
      jid = $2
      if $1.downcase == m.jid.resource.downcase
        m.invite(jid => "Inviting you on behalf of #{nick}")
        m.say("Inviting #{jid}...")
      end
    # Bot: subject This is room is powered by XMPP4R
    elsif text.strip =~ /^(.+?): subject (.+)$/
      if $1.downcase == m.jid.resource.downcase
        m.subject = $2
      end
    # Bot: exit please
    elsif text.strip =~ /^(.+?): exit please$/
      if $1.downcase == m.jid.resource.downcase
        puts "exiting"
        m.exit "Exiting on behalf of #{nick}"
        mainthread.wakeup
      end
    end
  end
}
m.on_room_message { |time,text|
  print_line time, "- #{text}"
}
m.on_subject { |time,nick,subject|
  print_line time, "*** (#{nick}) #{subject}"
}

m.join(ARGV[2])

# Wait for being waken up by m.on_message
Thread.stop

cl.close
