## Twitter bot in ruby using xmpp4r-simple (Jabber).
## Erik Kastner <kastner@gmail.com>

## twitter_bot.rb
#!/usr/bin/env ruby

require 'rubygems'
require 'xmpp4r-simple'
require 'twitter'
require 'syslog'

class TwitterBot < Jabber::Simple

TWITTER_JABBER = "twitter@twitter.com"

def self.log(message)
Syslog.open($0, Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.warning message }
end

def initialize(twitter_username, twitter_password, jabber_account, jabber_password)
@twitter = Twitter::Base.new(twitter_username, twitter_password)
super(jabber_account, jabber_password)
end

def log(message)
TwitterBot.log(message)
end

def say(message)
deliver(TWITTER_JABBER, message)
end

def direct_message(to, message)
deliver(TWITTER_JABBER, "d #{to} #{message}")
end

def user(id_or_screen_name)
@twitter.user(id_or_screen_name)
end
end

## my_bot.rb
#!/usr/bin/env ruby

$:.unshift("../")
require 'rubygems'
require 'simple-daemon'
require 'lib/twitter_bot'
require 'activerecord'
require "yaml"

# require 'ruby-debug'

WORKING_DIR = "/tmp/bingo-bot/"
DEBUG = true

class MyBot < TwitterBot
def initialize(twitter_username, twitter_password, jabber_account, jabber_password)
super
@bot_name = twitter_username
end

def go
received_messages { |message| deal_with(message.body) }
end

def deal_with(message)
log(message) if DEBUG
case message
when /^(.*):\s*@#{@bot_name}:?\s*(.*)\s*$/i # @ reply
user, command = $1, $2
log("@reply from #{user} / #{command}") if DEBUG
handle_reply(user, command)
when /Direct from (.*):\n([^\n]+)\n/
user, command = $1, $2
log("#{user} / #{command}") if DEBUG
handle_dm(user, command)
end
end

def end
disconnect
end
end

class BotRunner < SimpleDaemon::Base
`mkdir -p #{WORKING_DIR}` # just make sure the working dir exists
SimpleDaemon::WORKING_DIRECTORY = WORKING_DIR

def self.start
TwitterBot.log("start up") if DEBUG
initialize_envrionment

@bot = MyBot.new(@bot_settings["twitter_user"], @bot_settings["twitter_pass"], @bot_settings["jabber_acct"], @bot_settings["jabber_pass"])
loop do
begin
@bot.go
rescue => e
TwitterBot.log(e.inspect) if DEBUG
end
sleep(2)
end
end

def self.stop
@bingo.end
end
end

def initialize_envrionment
raise "Missing file #{ENV["HOME"]}/bot.yml" unless File.exists?("#{ENV["HOME"]}/bot.yml")

@bot_settings = YAML::load_file("#{ENV["HOME"]}/bot.yml")
end

BotRunner.daemonize