# safubot - an evented chatbot framework for Ruby
## Overview
Safubot is a chatbot framework for Twitter and XMPP which aims to abstract away the idiosyncracies of the underlying APIs, allowing you to focus on writing request-processing logic. Of course, if you want to use service-specific features (such as responding to timeline tweets) it lets you do that too!
## Installation
gem install safubot
## Requirements
Safubot uses [MongoDB](http://www.mongodb.org) for storage. It's [easy to install](http://www.mongodb.org/display/DOCS/Quickstart+Unix) and pretty awesome!
## Documentation
[http://rdoc.info/gems/safubot](http://rdoc.info/gems/safubot)
## Sample Usage
require 'safubot'
class NiftyBot < Safubot::Bot
def initialize
# Check the MongoMapper docs (http://www.mongomapper.com/documentation/) if you want
# to do something more sophisticated than an authless localhost connection.
super(:database => "niftybot")
# To access the underlying delegation targets:
# Safubot::Twitter::Bot bot.twitter
# ::Twitter::Client bot.twitter.client
# ::TweetStream::Client bot.twitter.stream
enable_twitter({
:username => "niftybot",
:consumer_key => CONSUMER_KEY,
:consumer_secret => CONSUMER_SECRET,
:oauth_token => OAUTH_TOKEN,
:oauth_token_secret => OAUTH_TOKEN_SECRET
})
# Similarly, for XMPP:
# Safubot::XMPP::Bot bot.xmpp
# ::Blather::Client bot.xmpp.client
enable_xmpp({
:jid => "niftybot@jabber.org/niftyhost",
:password => JABBER_PASSWORD
})
# A Request can be sourced from a:
# * Twitter mention
# * Twitter DM
# * XMPP chat message
# The "respond" method will reply using the appropriate medium.
on(:request) do |req|
if req.text.match /nifty/i
respond req, "Yep, I'm a nifty bot! :3"
else
raise ArgumentError, "This isn't nifty at all! :("
end
end
# Any unhandled errors encountered during request processing
# will come through here.
on(:request_error) do |req, e|
respond req, "#{e}"
end
end
end
# You can run this from inside another EventMachine loop if
# you don't want it to block indefinitely.
NiftyBot.new.run
## Specific Examples
### Find the last processed request from a user
on(:request) do |req|
req.user.requests.where(:processed => true).sort(:created_at.desc).first
end
### Update our twitter account
@twitter.client.update("Hello there, wonderful, scary world of Twitter! I am so *not* a spambot.")
### Reply to a non-request timeline tweet
@twitter.on(:timeline) do |tweet|
if tweet.raw['user']['screen_name'] == "unnali"
@twitter.reply tweet, "Is HaeSeun OSS yet? :O"
end
end
### Start an unprompted conversation with an XMPP user.
@xmpp.on(:ready) do
@xmpp.tell('^_^@jabber.org', "You'd best be maintaining safubot!")
end