ruby-macrodroid 0.8.12 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/ruby-macrodroid.rb +21 -68
- data/lib/ruby-macrodroid/actions.rb +34 -12
- data/lib/ruby-macrodroid/macro.rb +83 -14
- data/lib/ruby-macrodroid/triggers.rb +17 -3
- metadata +10 -10
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f4d8a484f60935d656a2ac7973ca917709201955fe55897ce27d2430cb8ec93
|
4
|
+
data.tar.gz: d886539a6623877a521969d869d8d4b5690191795ffa6710dc0df5149b123707
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d6251c0656a7ff30a252bc3ef38dcdd27da42ef278f34e07d4d03d07a2d11a7bab346e39330d76d17d69dd5f8d2d6091f89a81e691b1c47d7513013781e0524
|
7
|
+
data.tar.gz: bd12b85b6ef51759358f4c7e44e5671a1f69119d156ba25806eeb287e67da4f6cd50aca09940e6b4e5c0e3b9b96475be4dde49ce7f8a01694634e764e45fe343
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/ruby-macrodroid.rb
CHANGED
@@ -141,10 +141,10 @@ end
|
|
141
141
|
class ActionsNlp
|
142
142
|
include AppRoutes
|
143
143
|
|
144
|
-
def initialize()
|
144
|
+
def initialize(macro=nil)
|
145
145
|
|
146
146
|
super()
|
147
|
-
params = {}
|
147
|
+
params = {macro: macro}
|
148
148
|
actions(params)
|
149
149
|
|
150
150
|
end
|
@@ -230,8 +230,20 @@ class ActionsNlp
|
|
230
230
|
|
231
231
|
# e.g. webhook entered_kitchen
|
232
232
|
#
|
233
|
-
get /webhook|HTTP GET
|
234
|
-
|
233
|
+
get /(?:webhook|HTTP GET) ([^$]+)$/i do |s|
|
234
|
+
key = s =~ /^http/ ? :url_to_open : :identifier
|
235
|
+
[OpenWebPageAction, {key => s}]
|
236
|
+
end
|
237
|
+
|
238
|
+
#
|
239
|
+
get /^WebHook \(Url\)/i do
|
240
|
+
[OpenWebPageAction, params]
|
241
|
+
end
|
242
|
+
|
243
|
+
# e.g. webhook entered_kitchen
|
244
|
+
#
|
245
|
+
get /^webhook$/i do
|
246
|
+
[OpenWebPageAction, params]
|
235
247
|
end
|
236
248
|
|
237
249
|
#a: Keep Device Awake Screen On Until Disabled
|
@@ -367,14 +379,14 @@ class MacroDroid
|
|
367
379
|
using Params
|
368
380
|
|
369
381
|
attr_reader :macros, :geofences, :yaml
|
370
|
-
attr_accessor :deviceid
|
382
|
+
attr_accessor :deviceid, :remote_url
|
371
383
|
|
372
384
|
# note: The deviceid can only be found from an existing Webhook trigger,
|
373
385
|
# generated from MacroDroid itself.
|
374
386
|
|
375
|
-
def initialize(obj=nil, deviceid: nil, debug: false)
|
387
|
+
def initialize(obj=nil, deviceid: nil, remote_url: nil, debug: false)
|
376
388
|
|
377
|
-
@deviceid, @debug = deviceid, debug
|
389
|
+
@deviceid, @remote_url, @debug = deviceid, remote_url, debug
|
378
390
|
|
379
391
|
@geofences = {}
|
380
392
|
|
@@ -590,7 +602,7 @@ class MacroDroid
|
|
590
602
|
# puts '@geofences: ' + @geofences.inspect if @debug
|
591
603
|
|
592
604
|
m = Macro.new(geofences: @geofences.map(&:last), deviceid: @deviceid,
|
593
|
-
debug: @debug )
|
605
|
+
remote_url: @remote_url, debug: @debug )
|
594
606
|
m.import_h(macro)
|
595
607
|
m
|
596
608
|
|
@@ -612,7 +624,7 @@ class MacroDroid
|
|
612
624
|
@macros = doc.root.xpath('item').map do |node|
|
613
625
|
puts ('geofences: ' + geofences.inspect).highlight if @debug
|
614
626
|
Macro.new(geofences: geofences.map(&:last), deviceid: @deviceid,
|
615
|
-
debug: @debug).import_xml(node)
|
627
|
+
remote_url: @remote_url, debug: @debug).import_xml(node)
|
616
628
|
|
617
629
|
end
|
618
630
|
|
@@ -835,65 +847,6 @@ class DroidSim
|
|
835
847
|
|
836
848
|
end
|
837
849
|
|
838
|
-
RD_MACROS =<<EOF
|
839
|
-
m: Torch
|
840
|
-
t: webhook
|
841
|
-
a: Torch toggle
|
842
|
-
EOF
|
843
|
-
|
844
|
-
module RemoteDroid
|
845
|
-
|
846
|
-
class Service
|
847
|
-
def initialize(callback)
|
848
|
-
@callback = callback
|
849
|
-
end
|
850
|
-
end
|
851
|
-
|
852
|
-
class Bluetooth
|
853
|
-
def enable()
|
854
|
-
end
|
855
|
-
end
|
856
|
-
|
857
|
-
class Torch < Service
|
858
|
-
|
859
|
-
def toggle()
|
860
|
-
@callback.call :torch
|
861
|
-
end
|
862
|
-
|
863
|
-
end
|
864
|
-
|
865
|
-
class Control
|
866
|
-
|
867
|
-
def initialize(deviceid: nil)
|
868
|
-
@deviceid = deviceid
|
869
|
-
@torch = Torch.new(self)
|
870
|
-
end
|
871
|
-
|
872
|
-
def bluetooth()
|
873
|
-
@bluetooth
|
874
|
-
end
|
875
|
-
|
876
|
-
def call(command)
|
877
|
-
url = "https://trigger.macrodroid.com/%s/%s" % [@deviceid, command]
|
878
|
-
puts 'url: ' + url.inspect
|
879
|
-
s = open(url).read
|
880
|
-
end
|
881
|
-
|
882
|
-
def torch()
|
883
|
-
@torch
|
884
|
-
end
|
885
|
-
|
886
|
-
def write(s)
|
887
|
-
|
888
|
-
MacroDroid.new(RD_MACROS, deviceid: @deviceid).export s
|
889
|
-
|
890
|
-
end
|
891
|
-
|
892
|
-
alias export write
|
893
|
-
|
894
|
-
end
|
895
|
-
|
896
|
-
end
|
897
850
|
|
898
851
|
require 'ruby-macrodroid/base'
|
899
852
|
require 'ruby-macrodroid/triggers'
|
@@ -49,8 +49,8 @@ class Action < MacroObject
|
|
49
49
|
|
50
50
|
end
|
51
51
|
|
52
|
-
def invoke(
|
53
|
-
"%s/%s: %s" % [@group, @type,
|
52
|
+
def invoke(h={})
|
53
|
+
"%s/%s: %s" % [@group, @type, h.to_json]
|
54
54
|
end
|
55
55
|
|
56
56
|
|
@@ -136,23 +136,46 @@ class LaunchShortcutAction < ApplicationAction
|
|
136
136
|
|
137
137
|
end
|
138
138
|
|
139
|
+
class OpenWebPageActionError < Exception
|
140
|
+
end
|
141
|
+
|
139
142
|
# Category: Applications
|
140
143
|
#
|
141
144
|
class OpenWebPageAction < ApplicationAction
|
142
145
|
|
143
|
-
def initialize(
|
146
|
+
def initialize(obj={})
|
147
|
+
|
148
|
+
h = if obj.is_a? Hash then
|
149
|
+
obj
|
150
|
+
elsif obj.is_a? Array
|
151
|
+
e, macro = obj
|
152
|
+
txt = e.text('item/description')
|
153
|
+
{url: (txt || e.text)}
|
154
|
+
end
|
144
155
|
|
145
156
|
h[:url_to_open] = h[:url] if h[:url]
|
146
157
|
|
147
158
|
options = {
|
148
|
-
variable_to_save_response: {:m_stringValue=>"", :m_name=>"",
|
159
|
+
variable_to_save_response: {:m_stringValue=>"", :m_name=>"",
|
160
|
+
m_decimalValue: 0.0, isLocal: true, m_booleanValue: false,
|
161
|
+
excludeFromLog: false, m_intValue: 0, m_type: 2},
|
149
162
|
url_to_open: '',
|
150
163
|
http_get: true,
|
151
164
|
disable_url_encode: false,
|
152
165
|
block_next_action: false
|
153
166
|
}
|
154
|
-
|
155
|
-
|
167
|
+
|
168
|
+
if h[:macro].remote_url.nil? then
|
169
|
+
raise OpenWebPageActionError, 'remote_url not found'
|
170
|
+
end
|
171
|
+
|
172
|
+
if (h[:identifier].nil? or h[:identifier].empty?) and
|
173
|
+
(h[:url_to_open].nil? or h[:url_to_open].empty?) then
|
174
|
+
h[:url_to_open] = h[:macro].remote_url.sub(/\/$/,'') + '/' +
|
175
|
+
h[:macro].title.downcase.gsub(/ +/,'-')
|
176
|
+
end
|
177
|
+
|
178
|
+
super(options.merge h)
|
156
179
|
|
157
180
|
end
|
158
181
|
|
@@ -1971,11 +1994,10 @@ class ToastAction < NotificationsAction
|
|
1971
1994
|
|
1972
1995
|
h = if obj.is_a? Hash then
|
1973
1996
|
obj
|
1974
|
-
elsif obj.is_a?
|
1975
|
-
|
1976
|
-
|
1977
|
-
|
1978
|
-
{msg: obj}
|
1997
|
+
elsif obj.is_a? Array
|
1998
|
+
e, macro = obj
|
1999
|
+
txt = e.text('item/description')
|
2000
|
+
{msg: (txt || e.text)}
|
1979
2001
|
end
|
1980
2002
|
|
1981
2003
|
if h[:msg] then
|
@@ -1999,7 +2021,7 @@ class ToastAction < NotificationsAction
|
|
1999
2021
|
end
|
2000
2022
|
|
2001
2023
|
def invoke()
|
2002
|
-
super(@h[:message_text])
|
2024
|
+
super(msg: @h[:message_text])
|
2003
2025
|
end
|
2004
2026
|
|
2005
2027
|
def to_pc()
|
@@ -24,11 +24,13 @@ class Macro
|
|
24
24
|
|
25
25
|
attr_reader :local_variables, :triggers, :actions, :constraints,
|
26
26
|
:guid, :deviceid
|
27
|
-
attr_accessor :title, :description
|
27
|
+
attr_accessor :title, :description, :remote_url
|
28
28
|
|
29
|
-
def initialize(name=nil, geofences: nil, deviceid: nil,
|
29
|
+
def initialize(name=nil, geofences: nil, deviceid: nil, remote_url: nil,
|
30
|
+
debug: false)
|
30
31
|
|
31
32
|
@title, @geofences, @deviceid, @debug = name, geofences, deviceid, debug
|
33
|
+
@remote_url = remote_url
|
32
34
|
|
33
35
|
puts 'inside Macro#initialize' if @debug
|
34
36
|
|
@@ -195,30 +197,89 @@ class Macro
|
|
195
197
|
@title = node.text('macro') || node.attributes[:name]
|
196
198
|
|
197
199
|
@local_variables = node.xpath('variable').map do |e|
|
198
|
-
|
200
|
+
|
201
|
+
label, v = e.text.to_s.split(/: */,2)
|
202
|
+
|
203
|
+
value = if v.to_f.to_s == v
|
204
|
+
v.to_f
|
205
|
+
elsif v.downcase == 'true'
|
206
|
+
true
|
207
|
+
elsif v.downcase == 'false'
|
208
|
+
false
|
209
|
+
elsif v.to_i.to_s == v
|
210
|
+
v.to_i
|
211
|
+
else
|
212
|
+
v
|
213
|
+
end
|
214
|
+
|
215
|
+
[label, value]
|
199
216
|
end
|
200
217
|
|
201
218
|
#@description = node.attributes[:description]
|
202
219
|
|
203
220
|
tp = TriggersNlp.new(self)
|
204
221
|
|
205
|
-
@triggers = node.xpath('trigger').
|
222
|
+
@triggers = node.xpath('trigger').flat_map do |e|
|
206
223
|
|
207
224
|
r = tp.find_trigger e.text
|
208
225
|
|
209
226
|
puts 'found trigger ' + r.inspect if @debug
|
210
227
|
|
211
|
-
|
212
|
-
|
213
|
-
|
228
|
+
item = e.element('item')
|
229
|
+
if item then
|
230
|
+
|
231
|
+
if item.element('description') then
|
232
|
+
|
233
|
+
item.xpath('description').map do |description|
|
234
|
+
|
235
|
+
inner_lines = description.text.to_s.strip.lines
|
236
|
+
puts 'inner_lines: ' + inner_lines.inspect if @debug
|
237
|
+
|
238
|
+
trigger = if e.text.to_s.strip.empty? then
|
239
|
+
inner_lines.shift.strip
|
240
|
+
else
|
241
|
+
e.text.strip
|
242
|
+
end
|
243
|
+
|
244
|
+
puts 'trigger: ' + trigger.inspect if @debug
|
245
|
+
|
246
|
+
r = tp.find_trigger trigger
|
247
|
+
puts 'r: ' + r.inspect if @debug
|
248
|
+
o = r[0].new([description, self]) if r
|
249
|
+
puts 'after o' if @debug
|
250
|
+
o
|
251
|
+
|
252
|
+
end
|
253
|
+
|
214
254
|
else
|
215
|
-
|
255
|
+
|
256
|
+
trigger = e.text.strip
|
257
|
+
r = tp.find_trigger trigger
|
258
|
+
|
259
|
+
a = e.xpath('item/*')
|
260
|
+
|
261
|
+
h = if a.any? then
|
262
|
+
a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
|
263
|
+
else
|
264
|
+
{}
|
265
|
+
end
|
266
|
+
|
267
|
+
r = tp.find_trigger trigger
|
268
|
+
r[0].new(h) if r
|
269
|
+
|
216
270
|
end
|
271
|
+
|
272
|
+
else
|
273
|
+
|
274
|
+
trigger = e.text.strip
|
275
|
+
r = tp.find_trigger trigger
|
276
|
+
r[0].new(r[1]) if r
|
277
|
+
|
217
278
|
end
|
218
279
|
|
219
280
|
end
|
220
281
|
|
221
|
-
ap = ActionsNlp.new
|
282
|
+
ap = ActionsNlp.new self
|
222
283
|
|
223
284
|
@actions = node.xpath('action').flat_map do |e|
|
224
285
|
|
@@ -245,8 +306,8 @@ class Macro
|
|
245
306
|
|
246
307
|
r = ap.find_action action
|
247
308
|
puts 'r: ' + r.inspect if @debug
|
248
|
-
o = r[0].new(description) if r
|
249
|
-
puts 'after o'
|
309
|
+
o = r[0].new([description, self]) if r
|
310
|
+
puts 'after o' if @debug
|
250
311
|
o
|
251
312
|
|
252
313
|
end
|
@@ -378,13 +439,20 @@ EOF
|
|
378
439
|
puts 'before triggers' if @debug
|
379
440
|
|
380
441
|
a << @triggers.map do |x|
|
442
|
+
|
443
|
+
puts 'x: ' + x.inspect if @debug
|
444
|
+
|
381
445
|
s =-x.to_s(colour: colour)
|
446
|
+
puts 's: ' + s.inspect if @debug
|
382
447
|
|
383
448
|
s2 = if s.lines.length > 1 then
|
384
449
|
"\n" + s.lines.map {|x| x.prepend (' ' * (indent+1)) }.join
|
385
450
|
else
|
386
451
|
' ' + s
|
387
452
|
end
|
453
|
+
|
454
|
+
puts 's2: ' + s2.inspect if @debug
|
455
|
+
|
388
456
|
#s.lines > 1 ? "\n" + x : x
|
389
457
|
(colour ? "t".bg_red.gray.bold : 't') + ":" + s2
|
390
458
|
end.join("\n")
|
@@ -540,10 +608,11 @@ EOF
|
|
540
608
|
|
541
609
|
|
542
610
|
local_variables.map do |key, value|
|
543
|
-
|
544
|
-
|
611
|
+
|
612
|
+
puts 'value ' + value.class.to_s.to_sym.inspect
|
613
|
+
puts 'VAR_TYPES: ' + VAR_TYPES.inspect
|
545
614
|
type = VAR_TYPES[value.class.to_s.to_sym]
|
546
|
-
|
615
|
+
puts 'type: ' + type.inspect
|
547
616
|
h = {
|
548
617
|
boolean_value: false,
|
549
618
|
decimal_value: 0.0,
|
@@ -416,19 +416,33 @@ end
|
|
416
416
|
#
|
417
417
|
class WebHookTrigger < Trigger
|
418
418
|
|
419
|
-
def initialize(
|
419
|
+
def initialize(obj={})
|
420
|
+
|
421
|
+
h = if obj.is_a? Hash then
|
422
|
+
obj
|
423
|
+
elsif obj.is_a? Array
|
424
|
+
e, macro = obj
|
425
|
+
txt = e.text('item/description')
|
426
|
+
{url: (txt || e.text), macro: macro}
|
427
|
+
end
|
428
|
+
|
429
|
+
if h[:url] then
|
430
|
+
h[:identifier] = h[:url][/https:\/\/trigger.macrodroid.com\/(?:\w+\-){4}\w+\/([^$]+)/,1]
|
431
|
+
end
|
432
|
+
|
420
433
|
|
421
434
|
options = {
|
422
435
|
identifier: ''
|
423
436
|
}
|
437
|
+
|
424
438
|
@deviceid = h[:macro].deviceid
|
425
439
|
|
426
440
|
|
427
441
|
if h[:identifier].nil? or h[:identifier].empty? then
|
428
|
-
h[:identifier] = h[:macro].title.downcase
|
442
|
+
h[:identifier] = h[:macro].title.downcase.gsub(/ +/,'-')
|
429
443
|
end
|
430
444
|
|
431
|
-
super(options.merge h)
|
445
|
+
super(options.merge filter(options,h))
|
432
446
|
@list << 'identifier'
|
433
447
|
|
434
448
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-macrodroid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
NZ2kdBIUDnAM24e0/wXdVxg4HnsZbdymxyzMQ4P5pKYcpI6oisBxI37p/Xy+wAg3
|
36
36
|
SBHno3GEuuD8ZWj24IMJpfbp
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2020-
|
38
|
+
date: 2020-10-02 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: glw
|
@@ -81,22 +81,22 @@ dependencies:
|
|
81
81
|
name: rowx
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
84
|
-
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 0.7.0
|
87
84
|
- - "~>"
|
88
85
|
- !ruby/object:Gem::Version
|
89
86
|
version: '0.7'
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.7.3
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 0.7.0
|
97
94
|
- - "~>"
|
98
95
|
- !ruby/object:Gem::Version
|
99
96
|
version: '0.7'
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.7.3
|
100
100
|
- !ruby/object:Gem::Dependency
|
101
101
|
name: subunit
|
102
102
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,7 +146,7 @@ dependencies:
|
|
146
146
|
version: '1.1'
|
147
147
|
- - ">="
|
148
148
|
- !ruby/object:Gem::Version
|
149
|
-
version: 1.1.
|
149
|
+
version: 1.1.3
|
150
150
|
type: :runtime
|
151
151
|
prerelease: false
|
152
152
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -156,7 +156,7 @@ dependencies:
|
|
156
156
|
version: '1.1'
|
157
157
|
- - ">="
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: 1.1.
|
159
|
+
version: 1.1.3
|
160
160
|
- !ruby/object:Gem::Dependency
|
161
161
|
name: chronic_cron
|
162
162
|
requirement: !ruby/object:Gem::Requirement
|
metadata.gz.sig
CHANGED
Binary file
|