lita-sonos-commander 1.1.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/example/{client.rb → 000-client.rb} +3 -5
- data/example/001-install-node-proxy.session +44 -0
- data/lib/lita/commander_middleware.rb +17 -9
- data/lita-sonos-commander.gemspec +3 -1
- data/spec/lita/commander_middleware_spec.rb +4 -0
- data/spec/lita/handlers/sonos_commander_spec.rb +11 -5
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2dc8d0e8503926fc073876b3e4e6170a2c5c3dab
|
4
|
+
data.tar.gz: 7c791e151b947184c84fc31c4a8f86d101c6c24c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 314e394be338f2c76821623f2cdd25c6b175b8a72db53be18157898077e145605ff453a512be73a87176bba51135668acd7b0a3ddbe0083627e8fabb8a5e58d1
|
7
|
+
data.tar.gz: 21678407ad4fcabecd46f02d9b4ac6f4eb0afbfe6f02d0061fb12c2fb6aeb5a1e4634ed5eb4389bb4bd6d5272116d13b2b369331aaf92b6da45d1dd3428fe864
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'faye/websocket'
|
2
2
|
require 'eventmachine'
|
3
3
|
|
4
|
-
EM.run
|
4
|
+
EM.run do
|
5
5
|
ws = Faye::WebSocket::Client.new('ws://localhost:8080/sonos/listen')
|
6
6
|
|
7
7
|
ws.on :open do |event|
|
@@ -9,12 +9,10 @@ EM.run {
|
|
9
9
|
ws.send('Hello, world!')
|
10
10
|
end
|
11
11
|
|
12
|
-
ws.on
|
13
|
-
p [:message, event.data]
|
14
|
-
end
|
12
|
+
ws.on(:message) { |event| p [:message, event.data] }
|
15
13
|
|
16
14
|
ws.on :close do |event|
|
17
15
|
p [:close, event.code, event.reason]
|
18
16
|
ws = nil
|
19
17
|
end
|
20
|
-
|
18
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# download the sonos proxy server
|
2
|
+
$ git clone https://github.com/dpritchett/sonos-proxy-for-lita-with-node.git
|
3
|
+
Cloning into 'sonos-proxy-for-lita-with-node'...
|
4
|
+
remote: Counting objects: 114, done.
|
5
|
+
remote: Compressing objects: 100% (83/83), done.
|
6
|
+
remote: Total 114 (delta 32), reused 111 (delta 30), pack-reused 0
|
7
|
+
Receiving objects: 100% (114/114), 55.91 KiB | 773.00 KiB/s, done.
|
8
|
+
Resolving deltas: 100% (32/32), done.
|
9
|
+
|
10
|
+
$ cd sonos-proxy-for-lita-with-node/
|
11
|
+
|
12
|
+
# install yarn package manager
|
13
|
+
$ npm install -g yarn
|
14
|
+
|
15
|
+
# ask yarn to install all dependencies for this proxy
|
16
|
+
$ yarn
|
17
|
+
yarn install v1.6.0
|
18
|
+
warning package.json: No license field
|
19
|
+
warning sonos_proxy_node@1.0.0: No license field
|
20
|
+
[1/4] Resolving packages...
|
21
|
+
[2/4] Fetching packages...
|
22
|
+
[3/4] Linking dependencies...
|
23
|
+
[4/4] Building fresh packages...
|
24
|
+
Done in 1.47s.
|
25
|
+
|
26
|
+
# start the server
|
27
|
+
$ node ./server.js
|
28
|
+
2018-04-30T12:11:29.284Z INFO Could not find file
|
29
|
+
node_moduels/sonos-http-api/settings.json
|
30
|
+
2018-04-30T12:11:29.505Z INFO Presets loaded: { example:
|
31
|
+
{ players:
|
32
|
+
[ { roomName: 'Bathroom', volume: 10 },
|
33
|
+
{ roomName: 'Kitchen', volume: 10 },
|
34
|
+
{ roomName: 'Office', volume: 10 },
|
35
|
+
{ roomName: 'Bedroom', volume: 10 },
|
36
|
+
{ roomName: 'TV Room', volume: 15 } ],
|
37
|
+
playMode: { shuffle: true, repeat: 'all', crossfade: false },
|
38
|
+
pauseOthers: false,
|
39
|
+
favorite: 'My example favorite' } }
|
40
|
+
Looking for Sonos speakers
|
41
|
+
2018-04-30T12:11:29.554Z INFO http server listening on port 5005
|
42
|
+
close event received
|
43
|
+
Lost contact with server: ws://ad0ede69.ngrok.io/sonos/listen
|
44
|
+
I don't know how to reconnect yet. Please help!
|
@@ -1,4 +1,5 @@
|
|
1
1
|
class Lita::CommanderMiddleware
|
2
|
+
# START:initialize
|
2
3
|
def self.build(open_sockets:)
|
3
4
|
new(open_sockets: open_sockets).build
|
4
5
|
end
|
@@ -8,7 +9,9 @@ class Lita::CommanderMiddleware
|
|
8
9
|
def initialize(open_sockets:)
|
9
10
|
@open_sockets = open_sockets
|
10
11
|
end
|
12
|
+
# END:initialize
|
11
13
|
|
14
|
+
# START:socket_building
|
12
15
|
def build
|
13
16
|
lambda do |env|
|
14
17
|
if Faye::WebSocket.websocket?(env)
|
@@ -26,30 +29,34 @@ class Lita::CommanderMiddleware
|
|
26
29
|
Lita.logger.debug "Sonos client count: #{open_sockets.count}"
|
27
30
|
ws
|
28
31
|
end
|
32
|
+
# END:socket_building
|
29
33
|
|
30
|
-
|
31
|
-
|
32
|
-
Lita
|
33
|
-
|
34
|
-
ws = nil
|
34
|
+
# START:event_handlers
|
35
|
+
def send_welcome_message(ws)
|
36
|
+
payload = { message: 'Welcome to Lita Sonos Commander!', command: 'echo' }
|
37
|
+
ws.send(payload.to_json)
|
35
38
|
end
|
36
39
|
|
37
40
|
def handle_message(ws, event)
|
38
41
|
ws.send({ message: "ACK: #{event.data}" }.to_json)
|
39
42
|
end
|
40
43
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
+
def close_socket(ws, event)
|
45
|
+
open_sockets.delete_if { |s| s == ws }
|
46
|
+
Lita.logger.debug "Sonos client count: #{open_sockets.count}"
|
47
|
+
Lita.logger.debug "Socket close: #{[:close, event.code, event.reason]}"
|
48
|
+
ws = nil
|
44
49
|
end
|
50
|
+
# END:event_handlers
|
45
51
|
|
52
|
+
# START:request_handlers
|
46
53
|
def handle_env_has_socket
|
47
54
|
ws = build_socket(env)
|
48
55
|
|
49
56
|
send_welcome_message(ws)
|
50
57
|
|
51
58
|
ws.on(:message) { |event| handle_message(ws, event) }
|
52
|
-
ws.on(:close) { close_socket(ws, event) }
|
59
|
+
ws.on(:close) { |event| close_socket(ws, event) }
|
53
60
|
|
54
61
|
# Return async Rack response
|
55
62
|
ws.rack_response
|
@@ -62,4 +69,5 @@ class Lita::CommanderMiddleware
|
|
62
69
|
['Hello from a Lita chatbot! Feed me a websocket connection!']
|
63
70
|
]
|
64
71
|
end
|
72
|
+
# END:request_handlers
|
65
73
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'lita-sonos-commander'
|
3
|
-
spec.version = '1.1.
|
3
|
+
spec.version = '1.1.2'
|
4
4
|
spec.authors = ['Daniel J. Pritchett']
|
5
5
|
spec.email = ['dpritchett@gmail.com']
|
6
6
|
spec.description = 'Control your Sonos with Lita chatbot commands'
|
@@ -14,8 +14,10 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
15
|
spec.require_paths = ['lib']
|
16
16
|
|
17
|
+
# START:runtime_dependency
|
17
18
|
spec.add_runtime_dependency 'lita', '>= 4.7'
|
18
19
|
spec.add_runtime_dependency 'faye-websocket', '~> 0.10.7'
|
20
|
+
# END:runtime_dependency
|
19
21
|
|
20
22
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
21
23
|
spec.add_development_dependency 'pry-byebug'
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'ostruct'
|
3
3
|
require 'date'
|
4
4
|
|
5
|
+
# START:lambda_basic
|
5
6
|
describe Lita::CommanderMiddleware do
|
6
7
|
let(:handler) { double 'handler' }
|
7
8
|
let(:result) { subject.build({}) }
|
@@ -14,7 +15,9 @@ describe Lita::CommanderMiddleware do
|
|
14
15
|
result = subject.build
|
15
16
|
expect(result.is_a?(Proc)).to be_truthy
|
16
17
|
end
|
18
|
+
# END:lambda_basic
|
17
19
|
|
20
|
+
# START:add_client
|
18
21
|
context 'adding a new client' do
|
19
22
|
before { Faye::WebSocket.stub(:new).and_return(a_socket) }
|
20
23
|
let(:result) { subject.build_socket(nil) }
|
@@ -27,6 +30,7 @@ describe Lita::CommanderMiddleware do
|
|
27
30
|
expect(open_sockets).to include(result)
|
28
31
|
end
|
29
32
|
end
|
33
|
+
# END:add_client
|
30
34
|
|
31
35
|
context 'client disconnects' do
|
32
36
|
let(:event) { double 'socket event' }
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'pry'
|
3
2
|
require 'date'
|
4
3
|
|
5
4
|
describe Lita::Handlers::SonosCommander, lita_handler: true do
|
@@ -16,15 +15,15 @@ describe Lita::Handlers::SonosCommander, lita_handler: true do
|
|
16
15
|
|
17
16
|
it {
|
18
17
|
is_expected.to(route('Lita play url http://zombo.com')
|
19
|
-
|
18
|
+
.to(:handle_sonos_play_url))
|
20
19
|
}
|
21
20
|
it {
|
22
21
|
is_expected.to(route('Lita play url https://www.youtube.com/watch?v=dQw4w9WgXcQ')
|
23
|
-
|
22
|
+
.to(:handle_sonos_play_url))
|
24
23
|
}
|
25
24
|
it {
|
26
25
|
is_expected.to(route('Lita speak words i like turtles')
|
27
|
-
|
26
|
+
.to(:handle_sonos_say_text))
|
28
27
|
}
|
29
28
|
|
30
29
|
it { is_expected.to route_event(:loaded).to(:register_faye) }
|
@@ -85,6 +84,7 @@ describe Lita::Handlers::SonosCommander, lita_handler: true do
|
|
85
84
|
end
|
86
85
|
end
|
87
86
|
|
87
|
+
# START:faye_hookup
|
88
88
|
describe 'socket middleware registration' do
|
89
89
|
let(:middlewares) { double 'middlewares' }
|
90
90
|
before { subject.stub(:middleware_registry).and_return(middlewares) }
|
@@ -98,17 +98,23 @@ describe Lita::Handlers::SonosCommander, lita_handler: true do
|
|
98
98
|
subject.register_faye(nil)
|
99
99
|
end
|
100
100
|
end
|
101
|
+
# END:faye_hookup
|
101
102
|
|
103
|
+
# START:create_sockets
|
102
104
|
describe ':websocket_creator' do
|
103
105
|
let(:request) { double 'request' }
|
104
106
|
let(:request_env) { double 'request' }
|
105
107
|
let(:middleware) { double 'middleware' }
|
108
|
+
let(:middlewares) { double 'middlewares' }
|
106
109
|
|
107
|
-
before { subject.stub_chain(:middleware_registry
|
110
|
+
before { subject.stub_chain(:middleware_registry).and_return [middlewares] }
|
111
|
+
before { middlewares.stub(:middleware).and_return middleware }
|
108
112
|
before { request.stub(:env).and_return(request_env) }
|
109
113
|
|
110
114
|
it 'passes incoming any request environments to registered middlewares' do
|
115
|
+
expect(middleware).to receive(:call).with(request_env)
|
111
116
|
subject.websocket_creator(request, nil)
|
112
117
|
end
|
113
118
|
end
|
119
|
+
# END:create_sockets
|
114
120
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-sonos-commander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Pritchett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -150,7 +150,8 @@ files:
|
|
150
150
|
- LICENSE
|
151
151
|
- README.md
|
152
152
|
- Rakefile
|
153
|
-
- example/client.rb
|
153
|
+
- example/000-client.rb
|
154
|
+
- example/001-install-node-proxy.session
|
154
155
|
- lib/lita-sonos-commander.rb
|
155
156
|
- lib/lita/commander_middleware.rb
|
156
157
|
- lib/lita/handlers/sonos_commander.rb
|