bobot 2.6.2 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/bobot/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Bobot
2
2
  class Version
3
- MAJOR = 2
4
- MINOR = 6
5
- PATCH = 2
3
+ MAJOR = 3
4
+ MINOR = 0
5
+ PATCH = 1
6
6
  PRE = nil
7
7
 
8
8
  class << self
@@ -13,13 +13,11 @@ module Bobot
13
13
  desc 'Bobot install'
14
14
 
15
15
  def install
16
+ remove_file 'config/initializers/bobot.rb'
16
17
  namespace = ask_for('Where do you want to mount bobot?', 'bot', _namespace)
17
- create_file 'config/routes.rb'
18
- gsub_file 'config/routes.rb', %r{mount Bobot::Engine => \'\/.+\'(, as: \'bot\')?}, ''
19
18
  route("mount Bobot::Engine => '/#{namespace}', as: 'bot'")
20
19
  template 'config/initializers/bobot.rb', 'config/initializers/bobot.rb'
21
20
  template 'app/bobot/workflow.rb', 'app/bobot/workflow.rb'
22
- copy_file 'config/bobot.yml', 'config/bobot.yml'
23
21
  copy_file 'config/locales/bobot.en.yml', 'config/locales/bobot.en.yml'
24
22
  copy_file 'config/locales/bobot.fr.yml', 'config/locales/bobot.fr.yml'
25
23
  display 'Installation done', :green
@@ -1,5 +1,5 @@
1
- bobot_config_path = Rails.root.join("config", "bobot.yml")
2
- bobot_config = YAML.safe_load(ERB.new(File.read(bobot_config_path)).result, [], [], true)[Rails.env]
1
+ bobot_config_path = Rails.root.join("config", "secrets.yml")
2
+ bobot_config = YAML.safe_load(ERB.new(File.read(bobot_config_path)).result, [], [], true)[Rails.env]["bobot"]
3
3
 
4
4
  if bobot_config.present?
5
5
  unless bobot_config.key?("pages")
@@ -10,14 +10,13 @@ if bobot_config.present?
10
10
  config.app_secret = bobot_config["app_secret"],
11
11
  config.verify_token = bobot_config["verify_token"],
12
12
  config.domains = bobot_config["domains"],
13
- config.debug_log = bobot_config["debug_log"],
14
13
  config.async = bobot_config["async"],
15
14
  bobot_config["pages"].each do |page|
16
- config.pages << Bobot::Configuration::Page.new(
15
+ config.pages << Bobot::Page.new(
17
16
  slug: page["slug"],
18
17
  language: page["language"],
19
- page_access_token: page["page_access_token"],
20
18
  page_id: page["page_id"],
19
+ page_access_token: page["page_access_token"],
21
20
  get_started_payload: page["get_started_payload"],
22
21
  )
23
22
  end
@@ -10,17 +10,17 @@ en:
10
10
  persistent_menu:
11
11
  composer_input_disabled: false
12
12
  call_to_actions:
13
- - title: "My Account"
14
- type: "nested"
13
+ - type: "nested"
14
+ title: "My Account"
15
15
  call_to_actions:
16
- - title: "What is a chatbot?"
17
- type: "postback"
16
+ - type: "postback"
17
+ title: "What is a chatbot?"
18
18
  payload: "WHAT_IS_A_CHATBOT"
19
- - title: "History"
20
- type: "postback"
19
+ - type: "postback"
20
+ title: "History"
21
21
  payload: "HISTORY_PAYLOAD"
22
- - title: "Contact Info"
23
- type: "postback"
22
+ - type: "postback"
23
+ title: "Contact Info"
24
24
  payload: "CONTACT_INFO_PAYLOAD"
25
25
  - type: "web_url"
26
26
  title: "Get some help"
@@ -9,17 +9,17 @@ fr:
9
9
  persistent_menu:
10
10
  composer_input_disabled: false
11
11
  call_to_actions:
12
- - title: "Mon compte"
13
- type: "nested"
12
+ - type: "nested"
13
+ title: "Mon compte"
14
14
  call_to_actions:
15
- - title: "C'est quoi un chatbot ?"
16
- type: "postback"
15
+ - type: "postback"
16
+ title: "C'est quoi un chatbot ?"
17
17
  payload: "WHAT_IS_A_CHATBOT"
18
- - title: "Historique"
19
- type: "postback"
18
+ - type: "postback"
19
+ title: "Historique"
20
20
  payload: "HISTORY_PAYLOAD"
21
- - title: "Contact Info"
22
- type: "postback"
21
+ - type: "postback"
22
+ title: "Contact Info"
23
23
  payload: "CONTACT_INFO_PAYLOAD"
24
24
  - type: "web_url"
25
25
  title: "Obtenir de l'aide"
@@ -15,7 +15,6 @@ module Bobot
15
15
  gsub_file 'config/routes.rb', %r{mount Bobot::Engine => \'\/.+\'(, as: \'bot\')?}, ''
16
16
  remove_file 'config/initializers/bobot.rb'
17
17
  remove_file 'app/bobot/workflow.rb'
18
- remove_file 'config/bobot.yml'
19
18
  remove_file 'config/locales/bobot.en.yml'
20
19
  remove_file 'config/locales/bobot.fr.yml'
21
20
  display 'Done! Bobot has been uninstalled.'
@@ -7,9 +7,9 @@ RSpec.describe Bobot do
7
7
  config.app_id = 'app_id'
8
8
  config.app_secret = 'app_secret'
9
9
  config.verify_token = 'verify_token'
10
- config.debug_log = true
10
+ config.domains = " test.ltd, domain.ltd "
11
11
  config.async = true
12
- config.pages << Bobot::Configuration::Page.new(
12
+ config.pages << Bobot::Page.new(
13
13
  slug: 'slug',
14
14
  language: 'language',
15
15
  page_access_token: 'page_access_token',
@@ -20,7 +20,7 @@ RSpec.describe Bobot do
20
20
  expect(Bobot.config.app_id).to eql('app_id')
21
21
  expect(Bobot.config.app_secret).to eql('app_secret')
22
22
  expect(Bobot.config.verify_token).to eql('verify_token')
23
- expect(Bobot.config.debug_log).to eql(true)
23
+ expect(Bobot.config.domains).to eql(["test.ltd", "domain.ltd"])
24
24
  expect(Bobot.config.async).to eql(true)
25
25
  expect(Bobot.config.pages[0].slug).to eql('slug')
26
26
  expect(Bobot.config.pages[0].language).to eql('language')
@@ -37,7 +37,8 @@ RSpec.describe Bobot::Dummy do
37
37
  let(:access_token) { 'access_token' }
38
38
 
39
39
  before do
40
- Bobot.config.pages << Bobot::Configuration::Page.new(
40
+ Bobot.config.pages << Bobot::Page.new(
41
+ page_id: payload["recipient"]["id"],
41
42
  page_access_token: access_token,
42
43
  )
43
44
  end
@@ -64,14 +65,16 @@ RSpec.describe Bobot::Dummy do
64
65
 
65
66
  describe '.show_typing' do
66
67
  it 'sends a typing on indicator to the sender' do
67
- expect(subject).to receive(:deliver).with(
68
- payload_template: { sender_action: 'typing_on' }
68
+ expect(subject.page).to receive(:deliver).with(
69
+ payload_template: { sender_action: 'typing_on' },
70
+ to: payload['recipient']['id'],
69
71
  )
70
72
  subject.show_typing(state: true)
71
73
  end
72
74
  it 'sends a typing on indicator to the sender' do
73
- expect(subject).to receive(:deliver).with(
74
- payload_template: { sender_action: 'typing_off' }
75
+ expect(subject.page).to receive(:deliver).with(
76
+ payload_template: { sender_action: 'typing_off' },
77
+ to: payload['recipient']['id'],
75
78
  )
76
79
  subject.show_typing(state: false)
77
80
  end
@@ -79,8 +82,9 @@ RSpec.describe Bobot::Dummy do
79
82
 
80
83
  describe '.mark_as_seen' do
81
84
  it 'sends a typing off indicator to the sender' do
82
- expect(subject).to receive(:deliver).with(
83
- payload_template: { sender_action: 'mark_seen' }
85
+ expect(subject.page).to receive(:deliver).with(
86
+ payload_template: { sender_action: 'mark_seen' },
87
+ to: payload['recipient']['id'],
84
88
  )
85
89
  subject.mark_as_seen
86
90
  end
@@ -88,8 +92,9 @@ RSpec.describe Bobot::Dummy do
88
92
 
89
93
  describe '.reply_with_text' do
90
94
  it 'replies to the sender' do
91
- expect(subject).to receive(:deliver).with(
92
- payload_template: { message: { text: 'Hello, human' } }
95
+ expect(subject.page).to receive(:deliver).with(
96
+ payload_template: { message: { text: 'Hello, human' } },
97
+ to: payload['recipient']['id'],
93
98
  )
94
99
  subject.reply_with_text(text: 'Hello, human')
95
100
  end
@@ -97,7 +102,7 @@ RSpec.describe Bobot::Dummy do
97
102
 
98
103
  describe '.reply_with_image' do
99
104
  it 'replies to the sender' do
100
- expect(subject).to receive(:deliver).with(
105
+ expect(subject.page).to receive(:deliver).with(
101
106
  payload_template: {
102
107
  message: {
103
108
  attachment: {
@@ -109,6 +114,7 @@ RSpec.describe Bobot::Dummy do
109
114
  },
110
115
  },
111
116
  },
117
+ to: payload['recipient']['id'],
112
118
  )
113
119
  subject.reply_with_image(url: 'https://www.foo.bar/image.jpg')
114
120
  end
@@ -116,7 +122,7 @@ RSpec.describe Bobot::Dummy do
116
122
 
117
123
  describe '.reply_with_audio' do
118
124
  it 'replies to the sender' do
119
- expect(subject).to receive(:deliver).with(
125
+ expect(subject.page).to receive(:deliver).with(
120
126
  payload_template: {
121
127
  message: {
122
128
  attachment: {
@@ -127,6 +133,7 @@ RSpec.describe Bobot::Dummy do
127
133
  },
128
134
  },
129
135
  },
136
+ to: payload['recipient']['id'],
130
137
  )
131
138
  subject.reply_with_audio(url: 'https://www.foo.bar/audio.mp3')
132
139
  end
@@ -134,7 +141,7 @@ RSpec.describe Bobot::Dummy do
134
141
 
135
142
  describe '.reply_with_video' do
136
143
  it 'replies to the sender' do
137
- expect(subject).to receive(:deliver).with(
144
+ expect(subject.page).to receive(:deliver).with(
138
145
  payload_template: {
139
146
  message: {
140
147
  attachment: {
@@ -145,6 +152,7 @@ RSpec.describe Bobot::Dummy do
145
152
  },
146
153
  },
147
154
  },
155
+ to: payload['recipient']['id'],
148
156
  )
149
157
  subject.reply_with_video(url: 'https://www.foo.bar/video.mp4')
150
158
  end
@@ -152,7 +160,7 @@ RSpec.describe Bobot::Dummy do
152
160
 
153
161
  describe '.reply_with_file' do
154
162
  it 'replies to the sender' do
155
- expect(subject).to receive(:deliver).with(
163
+ expect(subject.page).to receive(:deliver).with(
156
164
  payload_template: {
157
165
  message: {
158
166
  attachment: {
@@ -163,6 +171,7 @@ RSpec.describe Bobot::Dummy do
163
171
  },
164
172
  },
165
173
  },
174
+ to: payload['recipient']['id'],
166
175
  )
167
176
  subject.reply_with_file(url: 'https://www.foo.bar/file.zip')
168
177
  end
@@ -170,7 +179,7 @@ RSpec.describe Bobot::Dummy do
170
179
 
171
180
  describe '.reply_with_quick_replies' do
172
181
  it 'replies to the sender' do
173
- expect(subject).to receive(:deliver).with(
182
+ expect(subject.page).to receive(:deliver).with(
174
183
  payload_template: {
175
184
  message: {
176
185
  text: 'Pick a color:',
@@ -189,6 +198,7 @@ RSpec.describe Bobot::Dummy do
189
198
  ]
190
199
  },
191
200
  },
201
+ to: payload['recipient']['id'],
192
202
  )
193
203
  subject.reply_with_quick_replies(
194
204
  text: 'Pick a color:',
@@ -208,7 +218,7 @@ RSpec.describe Bobot::Dummy do
208
218
  )
209
219
  end
210
220
  it 'asks the location to the sender' do
211
- expect(subject).to receive(:deliver).with(
221
+ expect(subject.page).to receive(:deliver).with(
212
222
  payload_template: {
213
223
  message: {
214
224
  text: 'Where are you',
@@ -220,6 +230,7 @@ RSpec.describe Bobot::Dummy do
220
230
  ]
221
231
  },
222
232
  },
233
+ to: payload['recipient']['id'],
223
234
  )
224
235
  subject.reply_with_quick_replies(
225
236
  text: 'Where are you',
@@ -232,7 +243,7 @@ RSpec.describe Bobot::Dummy do
232
243
 
233
244
  describe '.reply_with_buttons' do
234
245
  it 'replies to the sender' do
235
- expect(subject).to receive(:deliver).with(
246
+ expect(subject.page).to receive(:deliver).with(
236
247
  payload_template: {
237
248
  message: {
238
249
  attachment: {
@@ -248,6 +259,7 @@ RSpec.describe Bobot::Dummy do
248
259
  }
249
260
  },
250
261
  },
262
+ to: payload['recipient']['id'],
251
263
  )
252
264
  subject.reply_with_buttons(
253
265
  text: 'Human, do you like me?',
@@ -0,0 +1,61 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Bobot::Page do
4
+ before do
5
+ Bobot.configure do |config|
6
+ config.pages << Bobot::Page.new(
7
+ slug: 'slug_1',
8
+ language: 'language',
9
+ page_access_token: 'page_access_token',
10
+ page_id: '123',
11
+ get_started_payload: 'get_started_payload',
12
+ )
13
+ config.pages << Bobot::Page.new(
14
+ slug: 'slug_2',
15
+ language: 'language',
16
+ page_access_token: 'page_access_token',
17
+ page_id: '456',
18
+ get_started_payload: 'get_started_payload',
19
+ )
20
+ end
21
+ end
22
+
23
+ describe '#find' do
24
+ it 'find page in the config' do
25
+ expect(Bobot::Page.find("123").page_id).to eq("123")
26
+ expect(Bobot::Page.find(123).page_id).to eq("123")
27
+ expect(Bobot::Page.find("456").page_id).to eq("456")
28
+ expect(Bobot::Page.find(456).page_id).to eq("456")
29
+ end
30
+ it 'not find page in the config' do
31
+ expect(Bobot::Page.find("1664")).to eq(nil)
32
+ expect(Bobot::Page.find(1664)).to eq(nil)
33
+ end
34
+ end
35
+
36
+ describe '#find_by_slug' do
37
+ it 'find page in the config' do
38
+ expect(Bobot::Page.find_by_slug("slug_1").slug).to eq("slug_1")
39
+ expect(Bobot::Page.find_by_slug("slug_2").slug).to eq("slug_2")
40
+ end
41
+ it 'not find page in the config' do
42
+ expect(Bobot::Page.find_by_slug("slug_unknown")).to eq(nil)
43
+ end
44
+ end
45
+
46
+ describe '#[]' do
47
+ it 'find page in the config' do
48
+ expect(Bobot::Page["123"].page_id).to eq("123")
49
+ expect(Bobot::Page[123].page_id).to eq("123")
50
+ expect(Bobot::Page["456"].page_id).to eq("456")
51
+ expect(Bobot::Page[456].page_id).to eq("456")
52
+ expect(Bobot::Page["slug_1"].slug).to eq("slug_1")
53
+ expect(Bobot::Page["slug_2"].slug).to eq("slug_2")
54
+ end
55
+ it 'not find page in the config' do
56
+ expect(Bobot::Page["1664"]).to eq(nil)
57
+ expect(Bobot::Page[1664]).to eq(nil)
58
+ expect(Bobot::Page["slug_unknown"]).to eq(nil)
59
+ end
60
+ end
61
+ end
@@ -13,7 +13,7 @@ RSpec.describe Bobot::Profile do
13
13
  end
14
14
 
15
15
  before do
16
- Bobot.config.pages << Bobot::Configuration::Page.new(
16
+ Bobot.config.pages << Bobot::Page.new(
17
17
  page_access_token: access_token,
18
18
  )
19
19
  end
@@ -15,7 +15,7 @@ RSpec.describe Bobot::Subscription do
15
15
  end
16
16
 
17
17
  before do
18
- Bobot.config.pages << Bobot::Configuration::Page.new(
18
+ Bobot.config.pages << Bobot::Page.new(
19
19
  page_access_token: access_token,
20
20
  page_id: page_id,
21
21
  )
@@ -16,7 +16,7 @@ RSpec.describe Bobot::User do
16
16
  end
17
17
 
18
18
  before do
19
- Bobot.config.pages << Bobot::Configuration::Page.new(
19
+ Bobot.config.pages << Bobot::Page.new(
20
20
  page_access_token: access_token,
21
21
  page_id: page_id,
22
22
  )
@@ -0,0 +1,45 @@
1
+ Started GET "/" for 127.0.0.1 at 2017-11-24 11:59:04 +0100
2
+ Processing by Rails::WelcomeController#index as HTML
3
+ Rendering /Users/navid/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb
4
+ Rendered /Users/navid/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb (4.7ms)
5
+ Completed 200 OK in 15ms (Views: 12.0ms)
6
+
7
+
8
+ Started GET "/favicon.ico" for 127.0.0.1 at 2017-11-24 11:59:04 +0100
9
+
10
+ ActionController::RoutingError (No route matches [GET] "/favicon.ico"):
11
+
12
+ actionpack (5.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:63:in `call'
13
+ actionpack (5.1.4) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
14
+ railties (5.1.4) lib/rails/rack/logger.rb:36:in `call_app'
15
+ railties (5.1.4) lib/rails/rack/logger.rb:24:in `block in call'
16
+ activesupport (5.1.4) lib/active_support/tagged_logging.rb:69:in `block in tagged'
17
+ activesupport (5.1.4) lib/active_support/tagged_logging.rb:26:in `tagged'
18
+ activesupport (5.1.4) lib/active_support/tagged_logging.rb:69:in `tagged'
19
+ railties (5.1.4) lib/rails/rack/logger.rb:24:in `call'
20
+ actionpack (5.1.4) lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
21
+ actionpack (5.1.4) lib/action_dispatch/middleware/request_id.rb:25:in `call'
22
+ rack (2.0.3) lib/rack/runtime.rb:22:in `call'
23
+ activesupport (5.1.4) lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
24
+ actionpack (5.1.4) lib/action_dispatch/middleware/executor.rb:12:in `call'
25
+ actionpack (5.1.4) lib/action_dispatch/middleware/static.rb:125:in `call'
26
+ rack (2.0.3) lib/rack/sendfile.rb:111:in `call'
27
+ railties (5.1.4) lib/rails/engine.rb:522:in `call'
28
+ rack (2.0.3) lib/rack/handler/webrick.rb:86:in `service'
29
+ /Users/navid/.rbenv/versions/2.3.1/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
30
+ /Users/navid/.rbenv/versions/2.3.1/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
31
+ /Users/navid/.rbenv/versions/2.3.1/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'
32
+ Started GET "/" for 127.0.0.1 at 2017-11-24 12:00:32 +0100
33
+ Processing by Rails::WelcomeController#index as HTML
34
+ Rendering /Users/navid/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb
35
+ Rendered /Users/navid/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb (4.7ms)
36
+ Completed 200 OK in 13ms (Views: 10.1ms)
37
+
38
+
39
+ Started GET "/" for 127.0.0.1 at 2017-11-24 12:00:33 +0100
40
+ Processing by Rails::WelcomeController#index as HTML
41
+ Rendering /Users/navid/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb
42
+ Rendered /Users/navid/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb (3.5ms)
43
+ Completed 200 OK in 8ms (Views: 5.7ms)
44
+
45
+
@@ -2,3 +2,27 @@
2
2
  [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: e295aa69-c9c8-4900-8409-e43a19b6a500) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
3
3
  [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 733fbfda-cfcb-4da4-8a4d-5dcd99bf7ad0) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
4
4
  [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: abbfb628-82bd-4d48-a102-8720e8fbed91) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
5
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 7e146540-8a7e-4822-8d43-ac07d533e5a9) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
6
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: bb8a0a3f-490a-4427-be91-0c005255d863) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
7
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: e6ad52a0-39eb-47cc-9fad-3177e6f08833) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
8
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 45596508-c8d8-4181-97c7-b8466c788043) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
9
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: f47b59b3-4367-4166-b743-2aa15a158ec1) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
10
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 1bb7fe50-e654-4b7c-aeaa-f4065e9a2cd7) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
11
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: f44a9cce-d7eb-4673-86c1-1314c6779dfe) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
12
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: c90b3096-6f7f-4bc8-9002-19106f3b4df5) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
13
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 974e35d5-7956-453d-9872-d932a4efadfa) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
14
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: d04a2166-9022-438f-b0b6-ecfb156421e0) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
15
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: b82a84cf-78a0-4002-8653-997b81ae9eae) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
16
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 8112f073-6061-428b-9a45-bb6c95b78e03) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
17
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 2140517c-8166-4449-96a0-8c1075712bd1) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
18
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 838d432d-13e4-4449-916c-6bd78c2b19b6) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
19
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 91632611-04b4-4939-bfec-226ed9d46b35) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
20
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: bba22f37-1aca-477b-b7b3-bbaa2886be74) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
21
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: b5aa5a5f-acbe-4cdc-a420-754b65fa0514) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
22
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 9dee2915-2aa3-49c0-a163-0fb1babce1ae) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
23
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 031757ed-ca82-4581-869c-810c286de6f0) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
24
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 1c0de02e-7761-480b-a8ac-87d1613a948b) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
25
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: ce0ebceb-aeea-44d1-b425-7cb3e627c9eb) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
26
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: e1b4f1e1-13d8-4243-948c-c2bbdab9f212) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
27
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 1c5e3b4b-4ae4-4213-bafb-4164a16a0a4c) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}
28
+ [ActiveJob] Enqueued Bobot::CommanderJob (Job ID: 56732598-6966-4ce2-b00c-0b7632f4a14b) to Test(default) with arguments: {"sender"=>{"id"=>"2"}, "recipient"=>{"id"=>"3"}, "timestamp"=>1457764197627, "message"=>{"mid"=>"mid.1457764197618:41d102a3e1ae206a38", "seq"=>73, "text"=>"Hello, bot!"}}