= Robut
The friendly plugin-enabled HipChat bot.
== Installation and usage
Robut can be installed by running gem install robut. This
installs the +robut+ binary. When run, +robut+ reads a Chatfile,
connects to the specified HipChat server and chatroom, and feeds every
line said in the chatroom through the plugins configured by the
Chatfile.
Once robut is running, the plugins listen to what's being said in the
chatroom. Most plugins listen for @replies to robut:
@robut lunch? # => "Banh Mi!"
@robut calc 1 + 1 # => 2
Others listen to everything, and don't require an @reply.
Some of the included plugins require extra gems to be installed:
[Robut::Plugin::TWSS] requires the twss gem
[Robut::Plugin::Meme] requires the meme_generator gem
[Robut::Plugin::Calc] requires the calc gem
[Robut::Plugin::Rdio] requires the rdio and sinatra gems
== The Chatfile
When the +robut+ command runs, it looks for and evals ruby code in a
file called +Chatfile+ in the current directory. You can override the
configuration file by passing +robut+ a path to a Chatfile as the
first parameter:
robut /path/to/Chatfile
The Chatfile is just ruby code. A simple example can be found here: Chatfile[https://github.com/justinweiss/robut/blob/master/examples/Chatfile]
=== Adding and configuring plugins
Plugins are ruby classes, so enabling a plugin just requires requiring
the plugin file, optionally configuring the plugin class, and adding
the class to the global plugin list:
require 'robut/plugin/lunch'
Robut::Plugin::Lunch.places = ["Banh Mi", "Mad Oven", "Mod Pizza", "Taphouse"]
Robut::Plugin.plugins << Robut::Plugin::Lunch
Each plugin can be configured differently, or not at all. It's best to
look at the docs for the plugins you want to use to figure out what
kind of configuration they support.
Some plugins might require storage (like the `lunch` plugin). You can
configure the type of storage you want to use based on the need for
persistence. The default is the HashStore which is in-memory only. Below
is an example of using the YamlStore.
Robut::Connection.configure do |config|
# ...
Robut::Storage::YamlStore.file = "~/.robut_store"
config.store = Robut::Storage::YamlStore
end
=== Configuring the HipChat connection
The Chatfile also configures the HipChat connection. This is done in a
Robut::Connection.configure block:
# Configure the robut jabber connection and you're good to go!
Robut::Connection.configure do |config|
config.jid = '...@chat.hipchat.com/bot'
config.password = 'password'
config.nick = 'My Nick'
config.room = '...@conf.hipchat.com'
# Example of the YamlStore which uses a yaml file for persistence
Robut::Storage::YamlStore.file = "~/.robut_store"
config.store = Robut::Storage::YamlStore
# Add a logger if you want to debug the connection
# config.logger = Logger.new(STDOUT)
end
This block usually goes at the end of the Chatfile.
== Built-in plugins
Robut includes a few plugins that we've found useful:
[Robut::Plugin::Calc] a simple calculator.
Example: @robut calc 1 + 1 # => 2
[Robut::Plugin::Lunch] a random decider for lunch locations.
Example: @robut lunch? # => "Banh Mi!"
[Robut::Plugin::Meme] an interface to memegenerator.net.
Example: @robut meme Y_U_NO FIX THE BUILD?
[Robut::Plugin::Sayings] a simple regex listener and responder.
Example: You're the worst robot ever, @robut. # => I know.
[Robut::Plugin::TWSS] an interface to the TWSS gem. Listens to anything said in the chat room and responds "That's what she said!" where appropriate.
Example: well hurry up, you're not going fast enough # => "That's what she said!"
[Robut::Plugin::Echo] echo back whatever it gets.
Example: @robut echo hello word
[Robut::Plugin::Say] invokes the "say" command (text-to-speech).
Example: @robut say this rocks
[Robut::Plugin::Ping] responds with "pong".
Example: @robut ping
[Robut::Plugin::Later] performs the given command after waiting an arbitrary amount of time.
Example: @robut in 5 minutes echo @justin wake up!
[Robut::Plugin::Rdio] uses the Rdio[http://www.rdio.com] API and a simple web server to queue and play songs on Rdio.
Example: @robut play ok computer
== Writing custom plugins
You can supply your own plugins to Robut. To create a plugin, subclass
Robut::Plugin::Base and implement the handle(time, sender_nick,
message) to perform any plugin-specific logic.
Robut::Plugin::Base provides a few helper methods that are documented
in its class definition.
== Contributing
Once you've made your great commits:
1. Fork robut
2. Create a topic branch - git checkout -b my_branch
3. Push to your branch - git push origin my_branch
4. Send me a pull request
5. That's it!
== Todo
* Support connections to multiple rooms
* More plugins!