Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/undr/walle
Simple DSL for building Slack bots.
https://github.com/undr/walle
Last synced: about 1 month ago
JSON representation
Simple DSL for building Slack bots.
- Host: GitHub
- URL: https://github.com/undr/walle
- Owner: undr
- License: mit
- Created: 2016-09-25T18:23:05.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2016-09-26T17:05:30.000Z (about 8 years ago)
- Last Synced: 2024-10-18T03:09:40.478Z (2 months ago)
- Language: Ruby
- Size: 20.5 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# Walle
[![Build Status](https://travis-ci.org/undr/walle.svg?branch=master)](https://travis-ci.org/undr/walle)
Simple DSL for building Slack bots.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'walle'
```And then execute:
```
$ bundle
```Or install it yourself as:
```
$ gem install walle
```## Usage
Example bot class:
```ruby
class Robot < Walle::Robot
# Use middleware for all events
use Walle::Middlewares::Logger, Slack.config.logger# catch `hello` events
hello { |env| }# catch `start` events
start { |env| }# catch `message` events
message { |env| }# catch `close` events
close { |env| }# catch `closed` events
closed { |env| }routes do
# Use middleware ONLY for routes
use SomeCustomMidleware, 'arg1', 'arg2'# Equals to match(/(?convert|c)\s+(?\d+)\s*(?[A-Z]{3})\s+into\s+(?[A-Z]{3})/, controller: CurrencyConvertor)
command 'convert', 'c', amount: /\d+/, from: /[A-Z]{3}/, into: 'into', to: /[A-Z]{3}/, delimiter: /\s+/, controller: CurrencyConvertor# Prefix all matches with bot name, eg. <@U2EU6KZDW>
direct do
# Matches string like "<@U2EU6KZDW> convert 10000 RUB into EUR"
match /convert\s+(?\d+)\s*(?[A-Z]{3})\s+into\s+(?[A-Z]{3})/ do |env|
# env.event - :message
# env.client - Slack::RealTime::Client
# env.data - Event data (it can contain extra data that can be added in middlewares)
# - type: "message"
# - channel: "V2T4X87M5"
# - user: "Z005UR62C"
# - text: "<@U2EU6KZDW> convert 10000 RUB into EUR"
# - ts: "1474580776.000003"
# - team: "T020WVADD"
# - ...
# env.matches - MatchData object with captured values:
# - amount: 10000
# - from: RUB
# - to: EUR
end
end# Add prefix to all routes
prefix 'Hi (?\w+),\s+' do
# Matches string like "Hi Dave, blah blah blah" and "Dave" will be captured in env.matches[:name]
match /.*/, controller: GreetingsController
end
end
end
```Configure Slack client:
```ruby
Slack.configure do |c|
c.token = 'xxxx-9295867...'
c.logger = Logger.new(STDOUT)
c.logger.level = Logger::INFO
end
```And run the bot: `Robot.run`, `Robot.run(async: true)`.
Also you can manually create the bot and give to him a prepared client:
```ruby
client = Slack::RealTime::Client.new(options)
robot = Robot.new(client, async: true)
robot.run
```### Routes
There are three methods for creating routes: `match`, `command` and `default`:
- `match(regexp, options, &block)` - Add route based on regular expression.
- `regexp` - Regular expression.
- `options` - Options that adjust route behavior.
- `prefix` - Add prefix for regular expression, default: `/.*/`. If you want to delete prefix you should use `prefix: false`. `prefix: nil` resets prefix to default value.
- `direct` - Uses to create direct route. This’s route that directly address to bot. Messages without `<@botname>` at the start of command will be rejected.
- `controller` - Any class or object that has `call` method. It can be instance or class method.
- `block` - It will be used as controller when block is defined.- `command(*commands, options, block)` - Construct a regular expression using command names and add route using `match`. Check examples.
```ruby
# Equals to: match(/(?convert|c)\s+(?\d+)\s*(?[A-Z]{3})\s+into\s+(?[A-Z]{3})/) { |env| }
command 'convert', 'c', amount: /\d+/, from: /[A-Z]{3}/, into: 'into', to: /[A-Z]{3}/, delimiter: /\s+/ do |env|
# "convert 10000 RUB into EUR"
# `env.matches` is:
# - command: "convert"
# - amount: 10000
# - from: "RUB"
# - to: "EUR"
end
```Example:
```ruby
command 'add', 'subtract', 'multiply', 'divide', first: /\d+/, second: /\d+/ do |env|
result = case env.matches[:command]
when 'add'
env.matches[:first].to_i + env.matches[:second].to_i
when 'subtract'
env.matches[:first].to_i - env.matches[:second].to_i
when 'multiply'
env.matches[:first].to_i * env.matches[:second].to_i
when 'divide'
env.matches[:first].to_i / env.matches[:second].to_i
endenv.client.message(channel: env.data.channel, text: result.to_s)
end
```- `default(options, block)` - Create default route. It will be used if no one route was matched.
### Controllers
TODO:
### Inheritance
All routes and event handlers from parent class and subclass will be merged when we inherit one bot from another one.
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/undr/walle.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).