boty 0.0.7 → 0.0.9
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 +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
|