boty 0.0.7 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +48 -1
- data/bin/bot +2 -1
- data/lib/boty/action.rb +35 -0
- data/lib/boty/bot.rb +46 -32
- data/lib/boty/session.rb +5 -1
- data/lib/boty/version.rb +1 -1
- data/lib/boty.rb +1 -0
- data/script/knows.rb +10 -0
- data/script/pug.rb +2 -0
- data/template/project/bot.tt +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b15b8096419aa755624c59ba1c22e35d7c62a6e3
|
4
|
+
data.tar.gz: 52b507f57d34b6ed50d838c8cd96ed117e39fc98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d933754cd44b578e03335dd53977748662d2cb893c0ab28e44ec51bd39335116947b79777dca9583deeef63ce8e43bc654170b434ab4f9ac225650464a2bc14
|
7
|
+
data.tar.gz: 961c2bf18e65662c8eb0a3c5cdc02ed3882c52b3b6326f3acc9d31845e0c0ce0e53b5f8823a27955308b7e2fc022cb5367a889b116594f64ea8b3d48d62a7a52
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -131,9 +131,56 @@ Turn on this resource. And done, your bot is up and running!
|
|
131
131
|
|
132
132
|
For now, check the `script/ping.rb` and follow it's leads.
|
133
133
|
|
134
|
+
### Describing script usage
|
135
|
+
|
136
|
+
A bot list all the commands and message handlers that it knows in the moment. If
|
137
|
+
you want to give a nice description and/or a usage tip on command you can use
|
138
|
+
the `desc` method.
|
139
|
+
|
140
|
+
Given that your bot has the following script:
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
desc "pug me", "Send some nice pug in the channel."
|
144
|
+
respond(/pug me/i) do
|
145
|
+
# ...
|
146
|
+
end
|
147
|
+
```
|
148
|
+
|
149
|
+
The follow text will be part of the response for a `@bot: knows` command:
|
150
|
+
|
151
|
+
pug me: Send some nice pug in the channel.
|
152
|
+
|
153
|
+
You can use just the description if you want. In this case the `regex` itself
|
154
|
+
will be used as the command name.
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
desc "Send some nice pug in the channel."
|
158
|
+
respond(/pug me/i) do
|
159
|
+
# ...
|
160
|
+
end
|
161
|
+
```
|
162
|
+
|
163
|
+
valeriano 2:25PM
|
164
|
+
@bot: knows
|
165
|
+
|
166
|
+
bot 2:25PM
|
167
|
+
knows: List all the commands known by this bot.
|
168
|
+
/pug me/i: Send some nice pug in the channel.
|
169
|
+
|
170
|
+
We strongly recommend that you describe all of your scripts. But if you don't,
|
171
|
+
the bot will be capable of tell you what `regexes` are binded to it:
|
172
|
+
|
173
|
+
valeriano 2:47PM
|
174
|
+
@jabberu: knows
|
175
|
+
|
176
|
+
jabberu 2:47PM
|
177
|
+
knows: List all the commands known by this bot.
|
178
|
+
/pug me/i
|
179
|
+
/jabberu, are you there\?/i
|
180
|
+
|
134
181
|
### Testing your own scripts
|
135
182
|
|
136
|
-
**todo: document
|
183
|
+
**todo: document**
|
137
184
|
|
138
185
|
For now, check the `spec/script/ping_spec.rb` and follow it's leads.
|
139
186
|
|
data/bin/bot
CHANGED
@@ -3,7 +3,8 @@ require "./lib/boty"
|
|
3
3
|
|
4
4
|
session = Boty::Session.new
|
5
5
|
session.start do |bot|
|
6
|
-
bot.
|
6
|
+
bot.desc "Responds when someone asks for the #{bot.name} presence."
|
7
|
+
bot.message(/#{bot.name}, are you there\?/i) do |message|
|
7
8
|
next if message.from? self
|
8
9
|
say "Ohay <@#{message.user}>! I'm here, that's for sure."
|
9
10
|
end
|
data/lib/boty/action.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Boty
|
2
|
+
class Action
|
3
|
+
attr_reader :regex, :desc, :action
|
4
|
+
|
5
|
+
class Description
|
6
|
+
attr_reader :command, :description
|
7
|
+
attr_writer :regex
|
8
|
+
|
9
|
+
def initialize(command, description: nil, regex: nil)
|
10
|
+
if description.nil?
|
11
|
+
@description = command
|
12
|
+
else
|
13
|
+
@command, @description = command, description
|
14
|
+
end
|
15
|
+
|
16
|
+
@regex = regex
|
17
|
+
end
|
18
|
+
|
19
|
+
def command
|
20
|
+
return @command if @command
|
21
|
+
|
22
|
+
match = /\?(i?)-(mx|mix):(.*)\)/.match @regex.to_s
|
23
|
+
"/#{match[3]}/#{match[1]}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(regex, desc, &action)
|
28
|
+
desc = Hash(desc)
|
29
|
+
description = Description.new(desc[:command],
|
30
|
+
description: desc[:description],
|
31
|
+
regex: regex)
|
32
|
+
@regex, @desc, @action = regex, description, action
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/boty/bot.rb
CHANGED
@@ -7,6 +7,7 @@ module Boty
|
|
7
7
|
@raw_info, @id, @name = bot_info, bot_info["id"], bot_info["name"]
|
8
8
|
@events = {}
|
9
9
|
load_default_scripts
|
10
|
+
on :message, &method(:message_handler)
|
10
11
|
end
|
11
12
|
|
12
13
|
def event(data)
|
@@ -23,23 +24,13 @@ module Boty
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def message(regex, &block)
|
26
|
-
|
27
|
-
|
28
|
-
regex.match data["text"]
|
29
|
-
end
|
30
|
-
end
|
27
|
+
@handlers ||= []
|
28
|
+
@handlers << create_action(regex, &block)
|
31
29
|
end
|
32
30
|
|
33
31
|
def respond(regex, &block)
|
34
|
-
|
35
|
-
|
36
|
-
# loops.
|
37
|
-
next if message_from_bot_itself? data
|
38
|
-
logger.debug { "message wasn't from bot itself, so continuing..." }
|
39
|
-
yield_message_if_matches(data, block) do
|
40
|
-
has_mention?(data) && regex.match(data["text"])
|
41
|
-
end
|
42
|
-
end
|
32
|
+
@commands ||= []
|
33
|
+
@commands << create_action(regex, &block)
|
43
34
|
end
|
44
35
|
|
45
36
|
def say(message, api_parameters = {})
|
@@ -49,16 +40,27 @@ module Boty
|
|
49
40
|
logger.debug { "post response: #{post_response}" }
|
50
41
|
end
|
51
42
|
|
43
|
+
def desc(command, description = nil)
|
44
|
+
@current_desc = { command: command, description: description }
|
45
|
+
end
|
46
|
+
|
47
|
+
def know_how
|
48
|
+
descriptions = (Array(@commands) + Array(@handlers)).compact.map(&:desc)
|
49
|
+
descriptions.inject({}) { |hsh, desc|
|
50
|
+
hsh.merge!(desc.command => desc.description)
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
52
54
|
private
|
53
55
|
|
54
|
-
def
|
55
|
-
# TODO: guarantee that we not load the same file twice
|
56
|
-
Dir["script/**/*.rb"].each do |file|
|
57
|
-
instance_eval File.read(file), file, 1
|
58
|
-
end
|
56
|
+
def scripts_to_load
|
59
57
|
default_scripts_path = File.expand_path("../../../script", __FILE__)
|
60
|
-
|
61
|
-
|
58
|
+
paths = Dir["script/**/*.rb"] + Dir["#{default_scripts_path}/**/*.rb"]
|
59
|
+
paths.map { |file| File.expand_path file }.uniq
|
60
|
+
end
|
61
|
+
|
62
|
+
def load_default_scripts
|
63
|
+
scripts_to_load.each do |file|
|
62
64
|
instance_eval File.read(file), file, 1
|
63
65
|
end
|
64
66
|
end
|
@@ -73,22 +75,34 @@ module Boty
|
|
73
75
|
type
|
74
76
|
end
|
75
77
|
|
76
|
-
def
|
77
|
-
|
78
|
+
def create_action(regex, &block)
|
79
|
+
Boty::Action.new(regex, @current_desc, &block).tap {
|
80
|
+
@current_desc = nil
|
81
|
+
}
|
78
82
|
end
|
79
83
|
|
80
84
|
def message_from_bot_itself?(data)
|
81
|
-
data["user"] == self.id
|
85
|
+
data["user"] == self.id || data["user"] == self.name
|
86
|
+
end
|
87
|
+
|
88
|
+
def has_valid_mention?(data)
|
89
|
+
return false if message_from_bot_itself? data
|
90
|
+
!!(/(<@#{id}|#{name}>)/ =~ data["text"])
|
91
|
+
end
|
92
|
+
|
93
|
+
def execute_command(command, message)
|
94
|
+
@_message = message
|
95
|
+
instance_exec @_message, &command.action
|
96
|
+
@_message = nil
|
82
97
|
end
|
83
98
|
|
84
|
-
def
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
@_message = nil
|
99
|
+
def message_handler(data)
|
100
|
+
actions = has_valid_mention?(data) ? @commands : @handlers
|
101
|
+
|
102
|
+
Array(actions).each do |command|
|
103
|
+
next unless match = command.regex.match(data["text"])
|
104
|
+
#command.execute(self, match) #=> or something like that...
|
105
|
+
execute_command command, Message.new(data, match: match)
|
92
106
|
end
|
93
107
|
end
|
94
108
|
end
|
data/lib/boty/session.rb
CHANGED
@@ -13,7 +13,11 @@ module Boty
|
|
13
13
|
|
14
14
|
stablish_connection do |ws|
|
15
15
|
ws.on :message do |event|
|
16
|
-
|
16
|
+
begin
|
17
|
+
on_message event, bot
|
18
|
+
rescue StandardError => e
|
19
|
+
logger.error "Message #{event} could not be processed. #{e.message}"
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
data/lib/boty/version.rb
CHANGED
data/lib/boty.rb
CHANGED
data/script/knows.rb
ADDED
data/script/pug.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
desc "Send some nice pug in the channel."
|
1
2
|
respond(/pug me/i) do
|
2
3
|
response = JSON.parse Net::HTTP.get(URI "http://pugme.herokuapp.com/random")
|
3
4
|
say "<#{response["pug"]}>"
|
4
5
|
end
|
5
6
|
|
7
|
+
desc "pug bomb X", "Send X pugs in the channel."
|
6
8
|
respond(/pug bomb( (\d+))?/i) do |message|
|
7
9
|
count = message.match[2] || 5
|
8
10
|
response = JSON.parse Net::HTTP.get(URI "http://pugme.herokuapp.com/bomb?count=#{count}")
|
data/template/project/bot.tt
CHANGED
@@ -3,6 +3,7 @@ require "./<%= bot_name %>"
|
|
3
3
|
|
4
4
|
session = Boty::Session.new
|
5
5
|
session.start do |bot|
|
6
|
+
desc "Responds when the bot name (<%= bot_name %>) is mentioned in a message."
|
6
7
|
bot.message(/<%= bot_name %>/i) do |message|
|
7
8
|
next if message.from? self
|
8
9
|
say "Ohay <@#{message.user}>! I'm here, that's for sure."
|
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.9
|
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-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eventmachine
|
@@ -174,6 +174,7 @@ files:
|
|
174
174
|
- boty.gemspec
|
175
175
|
- exe/boty
|
176
176
|
- lib/boty.rb
|
177
|
+
- lib/boty/action.rb
|
177
178
|
- lib/boty/bot.rb
|
178
179
|
- lib/boty/cli.rb
|
179
180
|
- lib/boty/dsl.rb
|
@@ -187,6 +188,7 @@ files:
|
|
187
188
|
- lib/boty/version.rb
|
188
189
|
- lib/tasks/.keep
|
189
190
|
- log/.keep
|
191
|
+
- script/knows.rb
|
190
192
|
- script/pug.rb
|
191
193
|
- template/project/%bot_name%.rb
|
192
194
|
- template/project/.env.local.tt
|