boty 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile.lock +4 -1
- data/boty +0 -11
- data/boty.gemspec +4 -2
- data/exe/boty +5 -0
- data/lib/boty/bot.rb +31 -11
- data/lib/boty/cli.rb +34 -0
- data/lib/boty/session.rb +28 -14
- data/lib/boty/version.rb +1 -1
- data/script/pug.rb +10 -0
- data/template/project/%bot_name%.rb +6 -0
- data/template/project/.env.local.tt +2 -0
- data/template/project/Gemfile +4 -0
- data/template/project/Procfile.tt +1 -0
- data/{lib/assets/.keep → template/project/README.md} +0 -0
- data/{vendor/assets/javascripts/.keep → template/project/app/.empty} +0 -0
- data/template/project/bot.tt +12 -0
- data/template/project/script/ping.rb +11 -0
- data/{vendor/assets/stylesheets/.keep → template/project/spec/.empty} +0 -0
- metadata +43 -10
- data/.rspec +0 -3
- data/script/boty/pug.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 748d4a310415b259aa1f4bc59de28841bf526146
|
4
|
+
data.tar.gz: df5b63db2607e615c5ed70ed55f032de33abfefb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64b8378c295747a414308b0f360bad3606c74bad7648693947394fa91de4d5fc6155ab1b6075d69c40e0d366a03150eb8ddfa777f038de546540fe77747a530a
|
7
|
+
data.tar.gz: 849a9ca497b019181b738a8a6138d8c57e08be2c3e498d6d3e01d68f55f12b5770c3c7549266e9701e5ab8eeed4ca225c2d291e19492b881556bb8e921c9ca72
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
boty (0.0.
|
4
|
+
boty (0.0.2)
|
5
5
|
eventmachine
|
6
6
|
faye-websocket
|
7
|
+
thor
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
@@ -12,6 +13,7 @@ GEM
|
|
12
13
|
diff-lcs (1.2.5)
|
13
14
|
dotenv (2.0.2)
|
14
15
|
eventmachine (1.0.8)
|
16
|
+
fakefs (0.6.7)
|
15
17
|
faye-websocket (0.10.1)
|
16
18
|
eventmachine (>= 0.12.0)
|
17
19
|
websocket-driver (>= 0.5.1)
|
@@ -44,6 +46,7 @@ DEPENDENCIES
|
|
44
46
|
bundler (~> 1.10)
|
45
47
|
byebug
|
46
48
|
dotenv
|
49
|
+
fakefs
|
47
50
|
foreman
|
48
51
|
rake (~> 10.0)
|
49
52
|
rspec
|
data/boty
CHANGED
@@ -9,15 +9,4 @@ session.start do |bot|
|
|
9
9
|
next if message.from? self
|
10
10
|
say "Ohay <@#{message.user}>! Ainda não sei o que fazer aqui. Sorry."
|
11
11
|
end
|
12
|
-
|
13
|
-
bot.respond(/pug me/i) do
|
14
|
-
response = JSON.parse Net::HTTP.get(URI "http://pugme.herokuapp.com/random")
|
15
|
-
say "<#{response["pug"]}>"
|
16
|
-
end
|
17
|
-
|
18
|
-
bot.respond(/pug bomb( (\d+))?/i) do |message|
|
19
|
-
count = message.match[2] || 5
|
20
|
-
response = JSON.parse Net::HTTP.get(URI "http://pugme.herokuapp.com/bomb?count=#{count}")
|
21
|
-
response["pugs"].each do |pug| say "<#{pug}>" end
|
22
|
-
end
|
23
12
|
end
|
data/boty.gemspec
CHANGED
@@ -15,14 +15,15 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir = "
|
19
|
-
spec.executables = spec.files.grep(%r{^
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
spec.required_ruby_version = "~>2.0"
|
23
23
|
|
24
24
|
spec.add_runtime_dependency "eventmachine"
|
25
25
|
spec.add_runtime_dependency "faye-websocket"
|
26
|
+
spec.add_runtime_dependency "thor"
|
26
27
|
|
27
28
|
spec.add_development_dependency "bundler", "~> 1.10"
|
28
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
@@ -30,4 +31,5 @@ Gem::Specification.new do |spec|
|
|
30
31
|
spec.add_development_dependency "byebug"
|
31
32
|
spec.add_development_dependency "rspec"
|
32
33
|
spec.add_development_dependency "dotenv"
|
34
|
+
spec.add_development_dependency "fakefs"
|
33
35
|
end
|
data/exe/boty
ADDED
data/lib/boty/bot.rb
CHANGED
@@ -4,20 +4,14 @@ module Boty
|
|
4
4
|
attr_reader :id, :name
|
5
5
|
|
6
6
|
def initialize(bot_info, session)
|
7
|
-
@raw_info = bot_info
|
8
|
-
@id = bot_info["id"]
|
9
|
-
@name = bot_info["name"]
|
7
|
+
@raw_info, @id, @name = bot_info, bot_info["id"], bot_info["name"]
|
10
8
|
@verbose = false
|
11
9
|
@events = {}
|
10
|
+
load_default_scripts
|
12
11
|
end
|
13
12
|
|
14
13
|
def event(data)
|
15
|
-
type = data
|
16
|
-
debug "bot specifc event[#{type}] arrived", data
|
17
|
-
unless @events[type]
|
18
|
-
debug "no action binded to #{type}"
|
19
|
-
return
|
20
|
-
end
|
14
|
+
return unless type = event_type(data)
|
21
15
|
|
22
16
|
@events[type].each do |action|
|
23
17
|
action.call data
|
@@ -41,7 +35,7 @@ module Boty
|
|
41
35
|
on :message do |data|
|
42
36
|
# ignores if the mentions was sent by the bot itself, avoid infinite
|
43
37
|
# loops.
|
44
|
-
next if data
|
38
|
+
next if message_from_bot_itself? data
|
45
39
|
debug "message wasn't from bot itself, so continuing..."
|
46
40
|
yield_message_if_matches(data, block) do
|
47
41
|
has_mention?(data) && regex.match(data["text"])
|
@@ -50,7 +44,7 @@ module Boty
|
|
50
44
|
end
|
51
45
|
|
52
46
|
def say(message)
|
53
|
-
channel = (@_message
|
47
|
+
channel = (@_message && @_message.channel) || "general"
|
54
48
|
uri = URI("https://slack.com/api/chat.postMessage?" +
|
55
49
|
"token=#{ENV['SLACK_BOT_API_TOKEN']}&as_user=true&channel=#{channel}&" +
|
56
50
|
"text=#{URI.encode message}")
|
@@ -71,10 +65,36 @@ module Boty
|
|
71
65
|
stuff.each do |printable| talker.call printable end
|
72
66
|
end
|
73
67
|
|
68
|
+
def load_default_scripts
|
69
|
+
# TODO: guarantee that we not load the same file twice
|
70
|
+
Dir["script/**/*.rb"].each do |file|
|
71
|
+
instance_eval File.read(file), file, 1
|
72
|
+
end
|
73
|
+
default_scripts_path = File.expand_path("../../../script", __FILE__)
|
74
|
+
# also loads the default scripts:
|
75
|
+
Dir["#{default_scripts_path}/**/*.rb"].each do |file|
|
76
|
+
instance_eval File.read(file), file, 1
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def event_type(data)
|
81
|
+
type = data["type"].to_sym
|
82
|
+
debug "bot specifc event[#{type}] arrived", data
|
83
|
+
unless @events[type]
|
84
|
+
debug "no action binded to #{type}"
|
85
|
+
return
|
86
|
+
end
|
87
|
+
type
|
88
|
+
end
|
89
|
+
|
74
90
|
def has_mention?(data)
|
75
91
|
/<@#{name}>|<@#{id}>/ =~ data["text"]
|
76
92
|
end
|
77
93
|
|
94
|
+
def message_from_bot_itself?(data)
|
95
|
+
data["user"] == self.id
|
96
|
+
end
|
97
|
+
|
78
98
|
def yield_message_if_matches(data, message_block)
|
79
99
|
match = yield
|
80
100
|
if match
|
data/lib/boty/cli.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "thor"
|
2
|
+
|
3
|
+
module Boty
|
4
|
+
class CLI < Thor
|
5
|
+
include Thor::Actions
|
6
|
+
class_option :verbose, type: :boolean
|
7
|
+
|
8
|
+
attr_reader :bot_name, :company, :api_key
|
9
|
+
|
10
|
+
source_root File.expand_path("../../../template", __FILE__)
|
11
|
+
|
12
|
+
desc "new [BOT_NAME]",
|
13
|
+
"Creates a BOT_NAME dir with your new bot structure."
|
14
|
+
def new(bot_name)
|
15
|
+
@bot_name = bot_name
|
16
|
+
acquire_bot_info bot_name
|
17
|
+
directory "project", bot_name, verbose: verbose
|
18
|
+
inside bot_name do
|
19
|
+
run "chmod +x bot"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def verbose
|
26
|
+
options[:verbose]
|
27
|
+
end
|
28
|
+
|
29
|
+
def acquire_bot_info(bot_name)
|
30
|
+
@company = ask("What is your Slack company name?") || "acme"
|
31
|
+
@api_key = ask("What is the #{@bot_name} api key?") || "omg-lol-bbq"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/boty/session.rb
CHANGED
@@ -20,20 +20,12 @@ module Boty
|
|
20
20
|
def start(&block)
|
21
21
|
EM.run do
|
22
22
|
login
|
23
|
-
bot =
|
24
|
-
block.call bot if block_given?
|
25
|
-
debug "bot is configured and ready to go!"
|
26
|
-
|
27
|
-
debug "starting to listen on #{@session_url}"
|
28
|
-
@ws = Faye::WebSocket::Client.new @session_url
|
29
|
-
|
30
|
-
@ws.on :message do |event|
|
31
|
-
debug "message arrived", event.data
|
32
|
-
bot.event JSON.parse(event.data)
|
33
|
-
end
|
23
|
+
bot = initialize_bot(&block)
|
34
24
|
|
35
|
-
|
36
|
-
|
25
|
+
stablish_connection do |ws|
|
26
|
+
ws.on :message do |event|
|
27
|
+
on_message event, bot
|
28
|
+
end
|
37
29
|
end
|
38
30
|
end
|
39
31
|
end
|
@@ -54,7 +46,29 @@ module Boty
|
|
54
46
|
@slack_info = JSON.parse Net::HTTP.get(URI @rtm_start_url)
|
55
47
|
debug "yep! logged in!"
|
56
48
|
@session_url = @slack_info["url"]
|
57
|
-
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize_bot(&block)
|
52
|
+
Bot.new(@slack_info["self"], self).tap { |bot|
|
53
|
+
block.call bot if block_given?
|
54
|
+
debug "bot is configured and ready to go!"
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def on_message(event, bot)
|
59
|
+
debug "message arrived", event.data
|
60
|
+
bot.event JSON.parse(event.data)
|
61
|
+
end
|
62
|
+
|
63
|
+
def on_close
|
64
|
+
debug "bye byeb."
|
65
|
+
end
|
66
|
+
|
67
|
+
def stablish_connection
|
68
|
+
debug "starting to listen on #{@session_url}"
|
69
|
+
ws = Faye::WebSocket::Client.new @session_url
|
70
|
+
ws.on :close do on_close end
|
71
|
+
yield ws if block_given?
|
58
72
|
end
|
59
73
|
end
|
60
74
|
end
|
data/lib/boty/version.rb
CHANGED
data/script/pug.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
respond(/pug me/i) do
|
2
|
+
response = JSON.parse Net::HTTP.get(URI "http://pugme.herokuapp.com/random")
|
3
|
+
say "<#{response["pug"]}>"
|
4
|
+
end
|
5
|
+
|
6
|
+
respond(/pug bomb( (\d+))?/i) do |message|
|
7
|
+
count = message.match[2] || 5
|
8
|
+
response = JSON.parse Net::HTTP.get(URI "http://pugme.herokuapp.com/bomb?count=#{count}")
|
9
|
+
response["pugs"].each do |pug| say "<#{pug}>" end
|
10
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%=bot_name%>: bundle exec ./bot
|
File without changes
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "./<%= bot_name %>"
|
3
|
+
|
4
|
+
session = Boty::Session.new
|
5
|
+
session.verbose = true
|
6
|
+
session.start do |bot|
|
7
|
+
bot.verbose = true
|
8
|
+
bot.message(/<%= bot_name %>/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
|
File without changes
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ricardo Valeriano
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: thor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,19 +136,31 @@ dependencies:
|
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: fakefs
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
125
153
|
description: Boty is intendted to be a framework for construction of automated Slack
|
126
154
|
Bots for your needs.
|
127
155
|
email:
|
128
156
|
- ricardo.valeriano@gmail.com
|
129
157
|
executables:
|
130
|
-
-
|
131
|
-
- setup
|
158
|
+
- boty
|
132
159
|
extensions: []
|
133
160
|
extra_rdoc_files: []
|
134
161
|
files:
|
135
162
|
- ".env"
|
136
163
|
- ".gitignore"
|
137
|
-
- ".rspec"
|
138
164
|
- CODE_OF_CONDUCT.md
|
139
165
|
- Gemfile
|
140
166
|
- Gemfile.lock
|
@@ -146,18 +172,26 @@ files:
|
|
146
172
|
- bin/setup
|
147
173
|
- boty
|
148
174
|
- boty.gemspec
|
149
|
-
-
|
175
|
+
- exe/boty
|
150
176
|
- lib/boty.rb
|
151
177
|
- lib/boty/bot.rb
|
178
|
+
- lib/boty/cli.rb
|
152
179
|
- lib/boty/dsl.rb
|
153
180
|
- lib/boty/message.rb
|
154
181
|
- lib/boty/session.rb
|
155
182
|
- lib/boty/version.rb
|
156
183
|
- lib/tasks/.keep
|
157
184
|
- log/.keep
|
158
|
-
- script/
|
159
|
-
-
|
160
|
-
-
|
185
|
+
- script/pug.rb
|
186
|
+
- template/project/%bot_name%.rb
|
187
|
+
- template/project/.env.local.tt
|
188
|
+
- template/project/Gemfile
|
189
|
+
- template/project/Procfile.tt
|
190
|
+
- template/project/README.md
|
191
|
+
- template/project/app/.empty
|
192
|
+
- template/project/bot.tt
|
193
|
+
- template/project/script/ping.rb
|
194
|
+
- template/project/spec/.empty
|
161
195
|
homepage: http://github.com/ricardovaleriano/boty
|
162
196
|
licenses:
|
163
197
|
- MIT
|
@@ -183,4 +217,3 @@ signing_key:
|
|
183
217
|
specification_version: 4
|
184
218
|
summary: Boty is a pretty bot specially tailored for Slack.
|
185
219
|
test_files: []
|
186
|
-
has_rdoc:
|
data/.rspec
DELETED
data/script/boty/pug.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
respond(/pug me/i) do |jabber, message|
|
2
|
-
response = JSON.parse Net::HTTP.get URI("http://pugme.herokuapp.com/random")
|
3
|
-
jabber.say "<#{response["pug"]}>", message.channel
|
4
|
-
end
|
5
|
-
|
6
|
-
respond(/pug bomb( (\d+))?/i) do |jabber, message|
|
7
|
-
count = message.match[2] || 5
|
8
|
-
response = JSON.parse Net::HTTP.get URI("http://pugme.herokuapp.com/bomb?count=#{count}")
|
9
|
-
response["pugs"].each do |pug| jabber.say "<#{pug}>", message.channel end
|
10
|
-
end
|