boty 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +125 -13
- data/bin/bot +12 -0
- data/lib/boty.rb +2 -1
- data/lib/boty/bot.rb +3 -5
- data/lib/boty/cli.rb +2 -1
- data/lib/boty/rspec.rb +8 -5
- data/lib/boty/session.rb +2 -9
- data/lib/boty/slack.rb +12 -0
- data/lib/boty/slack/chat.rb +17 -0
- data/lib/boty/slack/rtm.rb +14 -0
- data/lib/boty/slack/url.rb +28 -0
- data/lib/boty/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c95fa76730f4a41c13d06ff314d53c0a9ee1f1c
|
4
|
+
data.tar.gz: 22567a320540d0fb327cdf9a0c863a10da787b82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a44d246026394e6d097e83d8405d1fdfcd73bed586790dd807fa975da6a330b548b8b85a3840b2d27c0da2b166e673d623b27524db02ee89504c4ec4d7fdfd2a
|
7
|
+
data.tar.gz: e82866d26ad78cc4de3cd4f875d4a52fa59208f745823a0172142a3e8e4cb4e63931c67dd33cd4d340495d349d518c145e1f513f6e86d694d08561a18699696f
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,28 +1,141 @@
|
|
1
1
|
# Boty
|
2
2
|
|
3
|
-
|
3
|
+
`Boty` is a utilitary to create bots (at this time, specificaly Slack bots).
|
4
4
|
|
5
|
-
|
5
|
+
A bot is this context is a ordinary ruby application, that knows how to receive
|
6
|
+
messages. Boty will give you a nice way to bind your own logic to specific
|
7
|
+
messages of your own interest.
|
6
8
|
|
7
|
-
##
|
9
|
+
## Slack Bot Integration<a id="integration" />
|
8
10
|
|
9
|
-
|
11
|
+
The first thing to do is to create a Slack Bot integration.
|
12
|
+
Go to `http://[your-company-name].slack.com/services` to add a new one.
|
13
|
+
In the process an `API Token` will be generated. That will be used in the [next
|
14
|
+
step](#installation).
|
10
15
|
|
11
|
-
|
12
|
-
|
16
|
+
## Installation<a id="installation" />
|
17
|
+
|
18
|
+
Now you can install `Boty`:
|
19
|
+
|
20
|
+
```sh
|
21
|
+
$ gem install boty
|
22
|
+
```
|
23
|
+
|
24
|
+
This will give you an executable `boty`, which ships with a command `help` so
|
25
|
+
you can know all the stuff that it can do. But the main one is to [create your
|
26
|
+
new shiny bot](#usage).
|
27
|
+
|
28
|
+
## Usage<a id="usage" />
|
29
|
+
|
30
|
+
In this section you will learn how to create a custom bot application for your
|
31
|
+
needs, how to configure it to allow the bot say stuff in your slack channels and
|
32
|
+
finally, will see how to run the bot properly.
|
33
|
+
|
34
|
+
### Creating a new bot
|
35
|
+
|
36
|
+
To create a new bot, execute:
|
37
|
+
|
38
|
+
```sh
|
39
|
+
$ boty new jeeba
|
40
|
+
```
|
41
|
+
|
42
|
+
Where `jeeba` will be the nickname you give your bot in the [Slack
|
43
|
+
integration](#integration).
|
44
|
+
|
45
|
+
The command will create a new directory after your bot name (`jeeba` in my
|
46
|
+
example). Your _bot application_ will live in this directory. Feel free to check
|
47
|
+
the directory, it will have some ruby files, some directories... it's just an
|
48
|
+
ordinary ruby application.
|
49
|
+
|
50
|
+
But first, let's see something about the [configurations](#configuration).
|
51
|
+
|
52
|
+
### Configuration<a id="configuration" />
|
53
|
+
|
54
|
+
When executing the `boty new` command, you will be prompted for the
|
55
|
+
*company name* and the *bot api key*.
|
56
|
+
|
57
|
+
The information that you enter will be used only locally, so you can experiment
|
58
|
+
and test (we will see more about the automated ones in this *README*) while
|
59
|
+
developing your bot. This will be stored in the `.env.local` file on the
|
60
|
+
recently created dir.
|
61
|
+
|
62
|
+
If you want to understand how this configuration is managed locally, you can
|
63
|
+
check de [`Dotenv` gem documentation](https://github.com/bkeepers/dotenv), but
|
64
|
+
you don't need to worry about it.
|
65
|
+
|
66
|
+
### Running locally<a id="running" />
|
67
|
+
|
68
|
+
After create the new _bot application_ and give the *bot api key*, you can just
|
69
|
+
enter the new dir and run
|
70
|
+
|
71
|
+
```sh
|
72
|
+
$ ./bot
|
13
73
|
```
|
14
74
|
|
15
|
-
|
75
|
+
Done! Your bot will be connected to your company Slack through the nickname that
|
76
|
+
you provided in the [integration](#integration) step.
|
77
|
+
To see if it's working properly, just go the the slack, in the general channel
|
78
|
+
(or any other where the bot was invited) and type:
|
16
79
|
|
17
|
-
|
80
|
+
```sh
|
81
|
+
@jeeba: ping
|
82
|
+
```
|
83
|
+
|
84
|
+
It will respond to you: `pong`. IT'S ALIVE.
|
85
|
+
|
86
|
+
### Deploy on heroku
|
87
|
+
|
88
|
+
But probably what you want is to have your bot running in a server, not in your
|
89
|
+
machine, right?
|
90
|
+
|
91
|
+
Your bot is created with an example `Procfile` to make it easy to run it on
|
92
|
+
[Heroku](http://heroku.com) (to give an example).
|
93
|
+
|
94
|
+
Create a new project on Heroku, following their instructions, until they ask you
|
95
|
+
to do the "deploy" (the `git push heroku master`).
|
96
|
+
|
97
|
+
#### configure the api key
|
98
|
+
|
99
|
+
Now you need to add the configurations that are localy stored on `.env.local`.
|
100
|
+
The two environment variables on that file are:
|
101
|
+
|
102
|
+
SLACK_COMPANY
|
103
|
+
SLACK_BOT_API_TOKEN
|
104
|
+
|
105
|
+
The *Heroku* command line tool offers a way to create environment vars in the
|
106
|
+
server, check
|
107
|
+
[their documentation](https://devcenter.heroku.com/articles/config-vars).
|
108
|
+
Today, when as I'm writing the readme, you can use the following commands to set
|
109
|
+
those two environment variables:
|
18
110
|
|
19
|
-
|
111
|
+
$ heroku config:set SLACK_COMPANY=your-company-name
|
112
|
+
$ heroku config:set SLACK_BOT_API_TOKEN=your-bot-integration-api-token
|
20
113
|
|
21
|
-
|
114
|
+
#### allow process to run
|
22
115
|
|
23
|
-
|
116
|
+
Heroku will not detect a web application in your bot, so you need to tell them
|
117
|
+
to run your application as a, well... as a "normal" application.
|
118
|
+
Go to your heroku dashboard (https://dashboard.heroku.com/apps), find the
|
119
|
+
application that you have created to your bot.
|
120
|
+
On the tab _Resources_, find a line with the information:
|
24
121
|
|
25
|
-
|
122
|
+
your-bot-name bundle exec ./bot
|
123
|
+
|
124
|
+
|
125
|
+
Turn on this resource. And done, your bot is up and running!
|
126
|
+
|
127
|
+
|
128
|
+
## Adding custom scripts
|
129
|
+
|
130
|
+
**todo: document**
|
131
|
+
|
132
|
+
For now, check the `script/ping.rb` and follow it's leads.
|
133
|
+
|
134
|
+
### Testing your own scripts
|
135
|
+
|
136
|
+
**todo: document**`
|
137
|
+
|
138
|
+
For now, check the `spec/script/ping_spec.rb` and follow it's leads.
|
26
139
|
|
27
140
|
## Development
|
28
141
|
|
@@ -38,4 +151,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/ricard
|
|
38
151
|
## License
|
39
152
|
|
40
153
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
41
|
-
|
data/bin/bot
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "./lib/boty"
|
3
|
+
|
4
|
+
session = Boty::Session.new
|
5
|
+
session.verbose = true
|
6
|
+
session.start do |bot|
|
7
|
+
bot.verbose = true
|
8
|
+
bot.message(/are you there\?/i) do |message|
|
9
|
+
next if message.from? self
|
10
|
+
say "Ohay <@#{message.user}>! I'm here, that's for sure."
|
11
|
+
end
|
12
|
+
end
|
data/lib/boty.rb
CHANGED
@@ -13,9 +13,10 @@ require "faye/websocket"
|
|
13
13
|
|
14
14
|
$:.unshift File.expand_path("../../lib", __FILE__)
|
15
15
|
require "boty/version"
|
16
|
+
require "boty/slack"
|
16
17
|
require "boty/session"
|
17
|
-
require "boty/bot"
|
18
18
|
require "boty/message"
|
19
|
+
require "boty/bot"
|
19
20
|
|
20
21
|
module Boty
|
21
22
|
end
|
data/lib/boty/bot.rb
CHANGED
@@ -43,12 +43,10 @@ module Boty
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
def say(message)
|
46
|
+
def say(message, api_parameters = {})
|
47
47
|
channel = (@_message && @_message.channel) || "general"
|
48
|
-
|
49
|
-
|
50
|
-
"text=#{URI.encode message}")
|
51
|
-
post_response = Net::HTTP.get uri
|
48
|
+
options = { channel: channel }.merge api_parameters
|
49
|
+
post_response = Slack.chat.post_message message, options
|
52
50
|
debug nil, post_response
|
53
51
|
end
|
54
52
|
|
data/lib/boty/cli.rb
CHANGED
@@ -3,7 +3,7 @@ require "thor"
|
|
3
3
|
module Boty
|
4
4
|
class CLI < Thor
|
5
5
|
include Thor::Actions
|
6
|
-
class_option :verbose, type: :boolean
|
6
|
+
class_option :verbose, type: :boolean, default: true
|
7
7
|
|
8
8
|
attr_reader :bot_name, :company, :api_key
|
9
9
|
|
@@ -19,6 +19,7 @@ module Boty
|
|
19
19
|
# for some reason the example .rspec isn't been copied
|
20
20
|
create_file ".rspec", "--require=spec_helper"
|
21
21
|
run "chmod +x bot"
|
22
|
+
run "bundle install"
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
data/lib/boty/rspec.rb
CHANGED
@@ -4,10 +4,8 @@ module Boty
|
|
4
4
|
def self.included(base)
|
5
5
|
base.instance_eval do
|
6
6
|
let(:bot) {
|
7
|
-
bot = Boty::Bot.new(
|
8
|
-
|
9
|
-
Boty::Session.new(ENV["SLACK_COMPANY"] || "acme")
|
10
|
-
)
|
7
|
+
bot = Boty::Bot.new({"id" => "1234", "name" => "bot"},
|
8
|
+
Boty::Session.new)
|
11
9
|
|
12
10
|
class << bot
|
13
11
|
attr_accessor :_response
|
@@ -22,12 +20,17 @@ module Boty
|
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
23
|
+
def event(options)
|
24
|
+
bot.event({ "type" => "message" }.merge options)
|
25
|
+
end
|
26
|
+
|
25
27
|
def message_event(text)
|
26
|
-
|
28
|
+
event "text" => text
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
30
32
|
::RSpec::Matchers.define :have_responded do |expected|
|
33
|
+
# TODO: add proper messages for failures.
|
31
34
|
match do |bot|
|
32
35
|
response = bot._response
|
33
36
|
bot._response = nil
|
data/lib/boty/session.rb
CHANGED
@@ -3,17 +3,10 @@ require "net/http"
|
|
3
3
|
|
4
4
|
module Boty
|
5
5
|
class Session
|
6
|
-
SLACK_RTM_START_URL = "https://%{domain}.slack.com/api/rtm.start?"+
|
7
|
-
"token=%{token}&"+
|
8
|
-
"simple_latest=true&no_unreads=true"
|
9
|
-
private_constant :SLACK_RTM_START_URL
|
10
|
-
|
11
6
|
attr_reader :bot
|
12
7
|
attr_writer :verbose
|
13
8
|
|
14
|
-
def initialize(
|
15
|
-
@rtm_start_url = SLACK_RTM_START_URL.sub "%{domain}", slack_domain
|
16
|
-
@rtm_start_url = @rtm_start_url.sub "%{token}", ENV["SLACK_BOT_API_TOKEN"]
|
9
|
+
def initialize(verbose: false)
|
17
10
|
@verbose = verbose
|
18
11
|
end
|
19
12
|
|
@@ -43,7 +36,7 @@ module Boty
|
|
43
36
|
|
44
37
|
def login
|
45
38
|
debug "logging in against slack right now"
|
46
|
-
@slack_info =
|
39
|
+
@slack_info = Slack.rtm.start
|
47
40
|
debug "yep! logged in!"
|
48
41
|
@session_url = @slack_info["url"]
|
49
42
|
end
|
data/lib/boty/slack.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Boty
|
2
|
+
module Slack
|
3
|
+
class Chat
|
4
|
+
include Slack::URL
|
5
|
+
url "https://slack.com/api/chat.postMessage"
|
6
|
+
|
7
|
+
def post_message(message, parameters = {})
|
8
|
+
defaults = {
|
9
|
+
as_user: true,
|
10
|
+
channel: "general",
|
11
|
+
text: message
|
12
|
+
}
|
13
|
+
URL.get parameterize(defaults.merge parameters)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Boty
|
2
|
+
module Slack
|
3
|
+
class RTM
|
4
|
+
include Slack::URL
|
5
|
+
url "https://#{ENV["SLACK_COMPANY"]}.slack.com/api/"
|
6
|
+
|
7
|
+
def start(parameters = {})
|
8
|
+
defaults = { simple_latest: true, no_unreads: true }
|
9
|
+
url = parameterize defaults.merge(parameters), path: "rtm.start"
|
10
|
+
URL.get url
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Boty
|
2
|
+
module Slack
|
3
|
+
module URL
|
4
|
+
def self.included(base)
|
5
|
+
base.instance_eval do
|
6
|
+
def url(url); @_url = url end
|
7
|
+
def _url; @_url end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.get(url)
|
12
|
+
JSON.parse Net::HTTP.get(URI(url)) || "{}"
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def parameterize(user_parameters, path: nil)
|
18
|
+
url = path ? self.class._url + path : self.class._url
|
19
|
+
parameters = {token: ENV["SLACK_BOT_API_TOKEN"]}.merge user_parameters
|
20
|
+
parameters.reduce(url + "?") { |_url, param|
|
21
|
+
parameter = param[0]
|
22
|
+
value = URI.encode param[1].to_s
|
23
|
+
"#{_url}#{parameter}=#{value}&"
|
24
|
+
}.gsub(/&$/, "")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/boty/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: boty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ricardo Valeriano
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eventmachine
|
@@ -168,6 +168,7 @@ files:
|
|
168
168
|
- Procfile
|
169
169
|
- README.md
|
170
170
|
- Rakefile
|
171
|
+
- bin/bot
|
171
172
|
- bin/console
|
172
173
|
- bin/setup
|
173
174
|
- boty.gemspec
|
@@ -179,6 +180,10 @@ files:
|
|
179
180
|
- lib/boty/message.rb
|
180
181
|
- lib/boty/rspec.rb
|
181
182
|
- lib/boty/session.rb
|
183
|
+
- lib/boty/slack.rb
|
184
|
+
- lib/boty/slack/chat.rb
|
185
|
+
- lib/boty/slack/rtm.rb
|
186
|
+
- lib/boty/slack/url.rb
|
182
187
|
- lib/boty/version.rb
|
183
188
|
- lib/tasks/.keep
|
184
189
|
- log/.keep
|
@@ -220,4 +225,3 @@ signing_key:
|
|
220
225
|
specification_version: 4
|
221
226
|
summary: Boty is a pretty bot specially tailored for Slack.
|
222
227
|
test_files: []
|
223
|
-
has_rdoc:
|