lita-sonos-commander 1.1.1 → 1.1.2
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/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
|