An event-driven, lua-scriptable chatops automation framework for Slack in Go. (phew)
The prototypical IRC bot responds to text. Generally, the pattern is you provide a regex to match on, and some code to run when someone says something in chat that matches your regular expression. Your plugin runs when a pattern match happens, and then returns.
Your Lazlo module, by comparison is started at runtime and stays resident in memory. Outwardly, Lazlo acts like a bot, but internally Lazlo works as an event broker. Your module registers for callbacks -- you can tell Lazlo what sorts of events your module finds interesting. For each callback your module registers, Lazlo will hand back a channel. Your module can block on the channel, waiting for something to happen, or it can register more callbacks (as many as you have memory for), and select between them in a loop. Throughout its lifetime, your Module can de-register the callbacks it doesn't need anymore, and ask for new ones as circumstances demand.
Currently there are five different kinds of callbacks you can ask for.
- Message callbacks specify regex you want to listen for and respond to.
- Event callbacks specify slack api events you want to listen for and respond to.
- Timer Callbacks start a (possibly reoccuring) timer (in cron syntax), and notify you when it runs down
- Link Callbacks create a URL that users can click on. When they do, their GET request is brokered back to your module. (Post and Put support coming soon)
- Question Callbacks make it easy to ask users a question, and capture their response.
Your module can register for all or none of these, as many times as it likes during the lifetime of the bot. Lazlo makes it easier to write modules that carry out common chat-ops patterns. For example, you can pretty easily write a module that:
- registers for a message callback for
bot deploy (\w+)
- blocks waiting for that command to be executed
- when executed, registers for a message callback that matches the specific user that asked for the deploy with the regex: 'authenticate '
- DM's that user prompting for a password
- registers a timer callback that expires in 3 minutes
- Blocks waiting for either the password or the timer
- Authenticates the user, and runs the CM tool of the week to perform the deploy
- Captures output from that tool and presents it back to the user
- de-registers the timer and password callbacks
That's an oversimplified example, but I hope you get the idea. Check out the Modules directory for working examples that use the various callbacks.
Lazlo's event-driven framework is quite flexible. You can use it to write some pretty powerful modules in Go. For example, I implemented a module that embeds a lua state machine which makes it possible to extend Lazlo by write simple plugins that use hubot-like syntax in lua
Lazlo is basically working and basically documented. All callback types are implemented and functional and there are several included modules of varying degress of complexity that should help get you started writing your own.
Todo's in order of when I'll probably get to them:
- Plugin to keep lazlo metadata in synch with Slack
- Leader-elections for HA bots. (moved up because heroku changing it's dyno pricing)
- Godoc, Documentation Documentation and Documentation
- Lua support is new and only includes support for message callbacks (hear respond and reply). I'd like you to be able to get timers and links via lua as well.
- More included plugins