ruby-macrodroid 0.9.2 → 0.9.7
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 +5 -2
- data/lib/ruby-macrodroid/actions.rb +176 -22
- data/lib/ruby-macrodroid/base.rb +100 -3
- data/lib/ruby-macrodroid/constraints.rb +36 -5
- data/lib/ruby-macrodroid/macro.rb +149 -78
- data/lib/ruby-macrodroid/triggers.rb +1 -1
- metadata +2 -2
- 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: 3784001df302ddb9f8389ea019f860925803b96913f4531839df140f48634857
|
4
|
+
data.tar.gz: 686838c12129f1cd329d72745f37a7cb81ed91d98cdea059a5b59938d6d8b9e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 948ceb9a759bf97fd4e4786fe35f95aee1a76d971ced0553c3984a885bae87155a18747a77c27d2daf7e928847cd503e19820e648956b0a93a62ef056a5992a9
|
7
|
+
data.tar.gz: d9ae51714a522375bd2aa92410f4a9412d83903d29ca33892cdd55a61dfab08faf7d02da292bdda2506715ca6948cdd308e0be4a03eb16b8010f5b56dd291ce0
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/ruby-macrodroid.rb
CHANGED
@@ -38,6 +38,7 @@ require 'rxfhelper'
|
|
38
38
|
require 'chronic_cron'
|
39
39
|
|
40
40
|
|
41
|
+
# PASTE_START
|
41
42
|
|
42
43
|
MODEL =<<EOF
|
43
44
|
device
|
@@ -145,8 +146,9 @@ class MacroDroid
|
|
145
146
|
puts 'before RowX.new' if @debug
|
146
147
|
|
147
148
|
s2 = s.gsub(/^g:/,'geofence:').gsub(/^m:/,'macro:')\
|
148
|
-
.gsub(/^
|
149
|
-
.gsub(/^
|
149
|
+
.gsub(/^d:/,'description:').gsub(/^v:/,'variable:')\
|
150
|
+
.gsub(/^t:/,'trigger:').gsub(/^a:/,'action:')\
|
151
|
+
.gsub(/^c:/,'constraint:').gsub(/^#.*/,'')
|
150
152
|
|
151
153
|
a = s2.split(/(?=^macro:)/)
|
152
154
|
|
@@ -577,6 +579,7 @@ class DroidSim
|
|
577
579
|
|
578
580
|
end
|
579
581
|
|
582
|
+
# PASTE_END
|
580
583
|
|
581
584
|
require 'ruby-macrodroid/base'
|
582
585
|
require 'ruby-macrodroid/triggers'
|
@@ -33,7 +33,9 @@
|
|
33
33
|
|
34
34
|
|
35
35
|
class Action < MacroObject
|
36
|
+
using ColouredText
|
36
37
|
using Params
|
38
|
+
include ObjectX
|
37
39
|
|
38
40
|
attr_reader :constraints
|
39
41
|
|
@@ -141,25 +143,39 @@ end
|
|
141
143
|
|
142
144
|
# Category: Applications
|
143
145
|
#
|
146
|
+
|
147
|
+
|
144
148
|
class OpenWebPageAction < ApplicationAction
|
149
|
+
using ColouredText
|
145
150
|
|
146
151
|
def initialize(obj={}, macro=nil)
|
147
|
-
|
148
|
-
|
152
|
+
|
153
|
+
$debug = true
|
154
|
+
puts ('obj: ' + obj.inspect).debug if $debug
|
149
155
|
|
150
156
|
h = if obj.is_a? Hash then
|
151
157
|
|
152
|
-
obj
|
158
|
+
obj.merge({macro: macro})
|
153
159
|
|
154
160
|
elsif obj.is_a? Array
|
155
161
|
|
156
|
-
puts 'obj: ' + obj.inspect if $debug
|
162
|
+
puts ('obj: ' + obj.inspect).debug if $debug
|
157
163
|
e, macro = obj
|
158
164
|
|
159
165
|
a = e.xpath('item/*')
|
160
166
|
|
161
167
|
h2 = if a.any? then
|
162
|
-
|
168
|
+
|
169
|
+
a.map do |node|
|
170
|
+
|
171
|
+
if node.name == 'description' and node.text.to_s =~ /: / then
|
172
|
+
node.text.to_s.split(/: +/,2).map(&:strip)
|
173
|
+
else
|
174
|
+
[node.name.to_sym, node.text.to_s.strip]
|
175
|
+
end
|
176
|
+
|
177
|
+
end.to_h
|
178
|
+
|
163
179
|
else
|
164
180
|
txt = e.text('item/description')
|
165
181
|
{url: (txt || e.text)}
|
@@ -169,7 +185,7 @@ class OpenWebPageAction < ApplicationAction
|
|
169
185
|
|
170
186
|
end
|
171
187
|
|
172
|
-
puts 'h:' + h.inspect if $debug
|
188
|
+
puts ('h:' + h.inspect).debug if $debug
|
173
189
|
|
174
190
|
#h[:url_to_open] = h[:url] if h[:url] and h[:url].length > 1
|
175
191
|
|
@@ -393,6 +409,7 @@ class IfConditionAction < Action
|
|
393
409
|
a: true,
|
394
410
|
constraint_list: []
|
395
411
|
}
|
412
|
+
puts 'obj: ' + obj.inspect if $debug
|
396
413
|
|
397
414
|
if obj.is_a? Hash then
|
398
415
|
|
@@ -402,18 +419,23 @@ class IfConditionAction < Action
|
|
402
419
|
super(h2)
|
403
420
|
|
404
421
|
elsif obj.is_a? Array
|
422
|
+
|
405
423
|
e, macro = obj
|
406
|
-
super()
|
407
|
-
|
424
|
+
super()
|
425
|
+
puts 'e.xml: ' + e.xml if $debug
|
426
|
+
puts 'e.text: ' + e.text.to_s.strip if $debug
|
427
|
+
raw_txt = e.text.to_s.strip[/^if [^$]+/i] || e.text('item/description')
|
408
428
|
puts 'raw_txt: ' + raw_txt.inspect if $debug
|
409
429
|
|
410
|
-
clause = raw_txt[/^
|
430
|
+
clause = raw_txt[/^If (.*)/i,1]
|
431
|
+
puts 'clause: ' + clause.inspect if $debug
|
411
432
|
conditions = clause.split(/\s+\b(?:AND|OR)\b\s+/i)
|
433
|
+
puts 'conditions: ' + conditions.inspect if $debug
|
412
434
|
|
413
435
|
cp = ConstraintsNlp.new
|
414
436
|
|
415
437
|
@constraints = conditions.map do |c|
|
416
|
-
puts 'c: ' + c.inspect
|
438
|
+
puts 'c: ' + c.inspect if $debug
|
417
439
|
r = cp.find_constraint c
|
418
440
|
puts 'found constraint ' + r.inspect if $debug
|
419
441
|
|
@@ -421,7 +443,24 @@ class IfConditionAction < Action
|
|
421
443
|
|
422
444
|
end
|
423
445
|
puts '@constraints: ' + @constraints.inspect if $debug
|
424
|
-
|
446
|
+
|
447
|
+
# find any nested actions
|
448
|
+
item = e.element('item')
|
449
|
+
|
450
|
+
if item then
|
451
|
+
|
452
|
+
ap = ActionsNlp.new
|
453
|
+
obj2 = action_to_object(ap, item, item, macro)
|
454
|
+
puts 'obj2: ' + obj2.inspect if $debug
|
455
|
+
#macro.add obj2
|
456
|
+
|
457
|
+
end
|
458
|
+
|
459
|
+
h = {
|
460
|
+
constraint_list: @constraints.map(&:to_h)
|
461
|
+
}
|
462
|
+
super(h) {}
|
463
|
+
|
425
464
|
else
|
426
465
|
# get the constraints
|
427
466
|
|
@@ -450,21 +489,47 @@ class IfConditionAction < Action
|
|
450
489
|
out << s + constraints
|
451
490
|
out.join("\n")
|
452
491
|
|
453
|
-
end
|
492
|
+
end
|
493
|
+
|
454
494
|
end
|
455
495
|
|
456
496
|
class ElseAction < Action
|
457
497
|
|
458
|
-
def initialize(
|
498
|
+
def initialize(obj=[])
|
459
499
|
|
460
500
|
options = {
|
461
|
-
constraint_list:
|
501
|
+
constraint_list: []
|
462
502
|
}
|
503
|
+
|
504
|
+
if obj.is_a? Hash then
|
505
|
+
|
506
|
+
h = obj
|
463
507
|
|
464
|
-
|
508
|
+
super(options.merge h)
|
509
|
+
|
510
|
+
elsif obj.is_a? Array
|
511
|
+
|
512
|
+
e, macro = obj
|
513
|
+
|
514
|
+
# find any nested actions
|
515
|
+
item = e.element('item')
|
516
|
+
|
517
|
+
if item then
|
518
|
+
|
519
|
+
ap = ActionsNlp.new
|
520
|
+
obj2 = action_to_object(ap, item, item, macro)
|
521
|
+
puts 'obj2: ' + obj2.inspect if $debug
|
522
|
+
#macro.add obj2
|
523
|
+
|
524
|
+
end
|
525
|
+
|
526
|
+
super(options)
|
527
|
+
end
|
528
|
+
|
465
529
|
|
466
530
|
|
467
|
-
|
531
|
+
|
532
|
+
end
|
468
533
|
|
469
534
|
def to_s(colour: false, indent: 0)
|
470
535
|
'Else'
|
@@ -644,6 +709,9 @@ class SetHotspotAction < ConnectivityAction
|
|
644
709
|
|
645
710
|
def initialize(h={})
|
646
711
|
|
712
|
+
# to-do: check when *disable hotspot*, is the
|
713
|
+
# *enable wifi* option selected?
|
714
|
+
|
647
715
|
options = {
|
648
716
|
device_name: "", state: 0, turn_wifi_on: true, use_legacy_mechanism: false, mechanism: 0
|
649
717
|
|
@@ -654,8 +722,15 @@ class SetHotspotAction < ConnectivityAction
|
|
654
722
|
end
|
655
723
|
|
656
724
|
def to_s(colour: false, indent: 0)
|
657
|
-
|
658
|
-
|
725
|
+
|
726
|
+
@s = "%s HotSpot" % [@h[:state] == 0 ? 'Enable' : 'Disable']
|
727
|
+
|
728
|
+
if @h[:state] == 1 then
|
729
|
+
@s += "\n" + (@h[:turn_wifi_on] ? 'Enable WiFi' : 'Don\'t Enable Wifi')
|
730
|
+
end
|
731
|
+
|
732
|
+
super()
|
733
|
+
|
659
734
|
end
|
660
735
|
end
|
661
736
|
|
@@ -1066,7 +1141,17 @@ end
|
|
1066
1141
|
class VibrateAction < DeviceSettingsAction
|
1067
1142
|
|
1068
1143
|
def initialize(h={})
|
1069
|
-
|
1144
|
+
|
1145
|
+
pattern = [
|
1146
|
+
'Blip', 'Short Buzz', 'Long Buzz', 'Rapid', 'Slow', 'Increasing',
|
1147
|
+
'Constant', 'Decreasing', 'Final Fantasy', 'Game Over', 'Star Wars',
|
1148
|
+
'Mini Blip', 'Micro Blip'
|
1149
|
+
]
|
1150
|
+
|
1151
|
+
if h[:pattern] then
|
1152
|
+
h[:vibrate_pattern] = pattern.map(&:downcase).index h[:pattern]
|
1153
|
+
end
|
1154
|
+
|
1070
1155
|
options = {
|
1071
1156
|
vibrate_pattern: 1
|
1072
1157
|
}
|
@@ -1596,6 +1681,7 @@ end
|
|
1596
1681
|
# MacroDroid Specific
|
1597
1682
|
#
|
1598
1683
|
class SetVariableAction < Action
|
1684
|
+
using ColouredText
|
1599
1685
|
|
1600
1686
|
def initialize(obj=nil)
|
1601
1687
|
|
@@ -1604,7 +1690,14 @@ class SetVariableAction < Action
|
|
1604
1690
|
elsif obj.is_a? Array
|
1605
1691
|
e, macro = obj
|
1606
1692
|
node = e.element('item/*')
|
1607
|
-
|
1693
|
+
#puts ("node.name: %s node.value: %s" % [node.name, node.value]).debug
|
1694
|
+
r = macro.set_var node.name, node.value.to_s
|
1695
|
+
puts ('r: ' + r.inspect).debug if $debug
|
1696
|
+
r
|
1697
|
+
if r[:type] == 2 then
|
1698
|
+
{ variable: {name: r[:name], type: r[:type]}, new_string_value: r[:string_value]
|
1699
|
+
}
|
1700
|
+
end
|
1608
1701
|
end
|
1609
1702
|
|
1610
1703
|
options = {
|
@@ -2324,8 +2417,31 @@ end
|
|
2324
2417
|
# Category: Screen
|
2325
2418
|
#
|
2326
2419
|
class ScreenOnAction < ScreenAction
|
2420
|
+
using ColouredText
|
2327
2421
|
|
2328
|
-
def initialize(
|
2422
|
+
def initialize(obj=nil)
|
2423
|
+
|
2424
|
+
debug = false
|
2425
|
+
|
2426
|
+
h = if obj.is_a? Hash then
|
2427
|
+
|
2428
|
+
obj
|
2429
|
+
|
2430
|
+
elsif obj.is_a? Array
|
2431
|
+
=begin
|
2432
|
+
puts 'obj: ' + obj.inspect if debug
|
2433
|
+
e, macro = obj
|
2434
|
+
puts ('e: ' + e.xml.inspect).debug if debug
|
2435
|
+
a = e.xpath('item/*')
|
2436
|
+
|
2437
|
+
txt = e.text.to_s
|
2438
|
+
puts ('txt: ' + txt.inspect).debug if debug
|
2439
|
+
state = txt[/Screen (On|Off)/i,1]
|
2440
|
+
|
2441
|
+
{screen_off: state.downcase == 'off'}
|
2442
|
+
=end
|
2443
|
+
{}
|
2444
|
+
end
|
2329
2445
|
|
2330
2446
|
options = {
|
2331
2447
|
pie_lock_screen: false,
|
@@ -2381,8 +2497,46 @@ end
|
|
2381
2497
|
# disable keep awake => enabled: false
|
2382
2498
|
#
|
2383
2499
|
class KeepAwakeAction < ScreenAction
|
2500
|
+
using ColouredText
|
2384
2501
|
|
2385
|
-
def initialize(
|
2502
|
+
def initialize(obj=nil)
|
2503
|
+
|
2504
|
+
|
2505
|
+
h = if obj.is_a? Hash then
|
2506
|
+
|
2507
|
+
obj
|
2508
|
+
|
2509
|
+
elsif obj.is_a? Array
|
2510
|
+
|
2511
|
+
puts 'obj: ' + obj.inspect if $debug
|
2512
|
+
e, macro = obj
|
2513
|
+
|
2514
|
+
a = e.xpath('item/*')
|
2515
|
+
|
2516
|
+
txt = e.text('item/description')
|
2517
|
+
|
2518
|
+
h2 = if txt then
|
2519
|
+
|
2520
|
+
raw_duration = (txt || e.text).to_s
|
2521
|
+
puts 'raw_duration: ' + raw_duration.inspect if $debug
|
2522
|
+
duration = raw_duration[/Screen On - ([^$]+)/i]
|
2523
|
+
{duration: duration}
|
2524
|
+
|
2525
|
+
elsif a.any? then
|
2526
|
+
a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
|
2527
|
+
end
|
2528
|
+
|
2529
|
+
h2.merge(macro: macro)
|
2530
|
+
|
2531
|
+
end
|
2532
|
+
|
2533
|
+
puts ('h: ' + h.inspect).debug if $debug
|
2534
|
+
|
2535
|
+
if h[:duration] then
|
2536
|
+
|
2537
|
+
h[:seconds_to_stay_awake_for] = Subunit.hms_to_seconds(h[:duration])
|
2538
|
+
|
2539
|
+
end
|
2386
2540
|
|
2387
2541
|
options = {
|
2388
2542
|
enabled: true,
|
data/lib/ruby-macrodroid/base.rb
CHANGED
@@ -7,7 +7,104 @@
|
|
7
7
|
# MacroObject
|
8
8
|
#
|
9
9
|
|
10
|
+
module ObjectX
|
11
|
+
|
12
|
+
|
13
|
+
def action_to_object(ap, e, item, macro)
|
14
|
+
|
15
|
+
debug = false
|
16
|
+
|
17
|
+
puts 'inside action_to_object: item.xml: ' + item.xml if debug
|
18
|
+
|
19
|
+
if item.element('description') then
|
20
|
+
|
21
|
+
item.xpath('description').map do |description|
|
22
|
+
|
23
|
+
inner_lines = description.text.to_s.strip.lines
|
24
|
+
puts 'inner_lines: ' + inner_lines.inspect if debug
|
25
|
+
|
26
|
+
action = if e.text.to_s.strip.empty? then
|
27
|
+
inner_lines.shift.strip
|
28
|
+
else
|
29
|
+
e.text.strip
|
30
|
+
end
|
31
|
+
|
32
|
+
puts 'action: ' + action.inspect if debug
|
33
|
+
|
34
|
+
r = ap.find_action action
|
35
|
+
puts 'r: ' + r.inspect if debug
|
36
|
+
|
37
|
+
if r[1].any? then
|
38
|
+
|
39
|
+
macro.add r[0].new(r[1])
|
40
|
+
|
41
|
+
else
|
42
|
+
|
43
|
+
puts 'description: ' + description.xml.inspect if debug
|
44
|
+
#o = r[0].new([description, self]) if r
|
45
|
+
index = macro.actions.length
|
46
|
+
macro.add Action.new
|
47
|
+
o = object_create(r[0],[description, macro]) if r
|
48
|
+
macro.actions[index] = o
|
49
|
+
puts 'after o' if debug
|
50
|
+
o
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
else
|
56
|
+
|
57
|
+
action = e.text.strip
|
58
|
+
puts 'action: ' + action.inspect if $debug
|
59
|
+
r = ap.find_action action
|
60
|
+
|
61
|
+
a = e.xpath('item/*')
|
62
|
+
|
63
|
+
h = if a.any? then
|
64
|
+
a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
|
65
|
+
else
|
66
|
+
{}
|
67
|
+
end
|
68
|
+
puts 'h: ' + h.inspect if $debug
|
69
|
+
|
70
|
+
#r = ap.find_action action
|
71
|
+
#r[0].new(h.merge(macro: self)) if r
|
72
|
+
o = object_create(r[0], h.merge(macro: macro)) if r
|
73
|
+
macro.add o
|
74
|
+
o
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
end
|
10
80
|
|
81
|
+
def object_create(klass, *args)
|
82
|
+
|
83
|
+
begin
|
84
|
+
klass.new(*args)
|
85
|
+
rescue
|
86
|
+
raise MacroError, klass.to_s + ': ' + ($!).to_s
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def varify(label, value='')
|
91
|
+
|
92
|
+
type = VAR_TYPES[value.class.to_s.to_sym]
|
93
|
+
|
94
|
+
h = {
|
95
|
+
boolean_value: false,
|
96
|
+
decimal_value: 0.0,
|
97
|
+
int_value: 0,
|
98
|
+
name: label,
|
99
|
+
string_value: '',
|
100
|
+
type: type[0]
|
101
|
+
}
|
102
|
+
h[type[1]] = value
|
103
|
+
h
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
11
108
|
|
12
109
|
class MacroObject
|
13
110
|
using ColouredText
|
@@ -97,11 +194,11 @@ class MacroObject
|
|
97
194
|
private
|
98
195
|
|
99
196
|
def hashify(h)
|
100
|
-
|
197
|
+
puts 'h: ' + h.inspect
|
101
198
|
h2 = h.inject({}) do |r,x|
|
102
|
-
puts 'x: ' + x.inspect if $debug
|
199
|
+
puts 'x: ' + x.inspect #if $debug
|
103
200
|
key, value = x
|
104
|
-
puts 'key: ' + key.inspect if $debug
|
201
|
+
puts 'key: ' + key.inspect #if $debug
|
105
202
|
new_key = key.to_s.gsub(/\w_\w/){|x| x[0] + x[-1].upcase}
|
106
203
|
new_key = new_key.prepend 'm_' unless @list.include? new_key
|
107
204
|
new_key = 'm_SIGUID' if new_key == 'm_siguid'
|
@@ -794,6 +794,24 @@ class MacroDroidVariableConstraint < Constraint
|
|
794
794
|
|
795
795
|
def initialize(h={})
|
796
796
|
|
797
|
+
if h[:loperand] then
|
798
|
+
h[:variable] = {}
|
799
|
+
h[:variable][:name] = h[:loperand]
|
800
|
+
h[:variable][:type] = 2
|
801
|
+
|
802
|
+
if h[:roperand] =~ /true|false/i then
|
803
|
+
|
804
|
+
val = h[:roperand].downcase == 'true'
|
805
|
+
h[:boolean_value] = val
|
806
|
+
h[:variable][:type] = 0
|
807
|
+
h[:variable][:boolean_value] = val
|
808
|
+
h[:string_value] = h[:roperand].capitalize
|
809
|
+
else
|
810
|
+
h[:string_value] = h[:roperand]
|
811
|
+
end
|
812
|
+
|
813
|
+
end
|
814
|
+
|
797
815
|
options = {
|
798
816
|
|
799
817
|
:enable_regex=>false,
|
@@ -825,11 +843,24 @@ class MacroDroidVariableConstraint < Constraint
|
|
825
843
|
|
826
844
|
def to_s(colour: false, indent: 0)
|
827
845
|
|
828
|
-
|
829
|
-
|
830
|
-
|
846
|
+
a = [:int_greater_than, :int_less_than, :int_not_equal,
|
847
|
+
:string_equal].zip(['>','<','!=', '='])
|
848
|
+
operator = a.find {|label,_| @h[label]}.last
|
849
|
+
|
850
|
+
var = @h[:variable]
|
851
|
+
|
852
|
+
type = case var[:type]
|
853
|
+
when 0 # boolean
|
854
|
+
:boolean_value
|
855
|
+
when 1 # integer
|
856
|
+
:int_value
|
857
|
+
when 2 # string
|
858
|
+
:string_value
|
859
|
+
when 3 # decimal
|
860
|
+
:decimal_Value
|
861
|
+
end
|
831
862
|
|
832
|
-
@s = "%s %s %s" % [@h[:variable][:name], operator, @h[
|
863
|
+
@s = "%s %s %s" % [@h[:variable][:name], operator, @h[type]]
|
833
864
|
super()
|
834
865
|
end
|
835
866
|
|
@@ -888,7 +919,7 @@ class TriggerThatInvokedConstraint < Constraint
|
|
888
919
|
|
889
920
|
def initialize(h={})
|
890
921
|
|
891
|
-
puts ('h: ' + h.inspect).green
|
922
|
+
puts ('h: ' + h.inspect).green if $debug
|
892
923
|
@trigger = h[:macro].triggers.find {|x| x.siguid == h[:si_guid_that_invoked] }
|
893
924
|
|
894
925
|
options = {
|
@@ -21,8 +21,11 @@ VAR_TYPES = {
|
|
21
21
|
Float: [3, :decimal_value]
|
22
22
|
}
|
23
23
|
|
24
|
+
|
25
|
+
|
24
26
|
class TriggersNlp
|
25
27
|
include AppRoutes
|
28
|
+
using ColouredText
|
26
29
|
|
27
30
|
def initialize(macro=nil)
|
28
31
|
|
@@ -32,8 +35,40 @@ class TriggersNlp
|
|
32
35
|
|
33
36
|
end
|
34
37
|
|
35
|
-
def triggers(params)
|
38
|
+
def triggers(params)
|
39
|
+
|
40
|
+
# -- Battery/Power ---------------------------------------------
|
36
41
|
|
42
|
+
get /^Power Connected: (Wired \([^\)]+\))/i do |s|
|
43
|
+
|
44
|
+
h = {
|
45
|
+
power_connected_options: [true, true, true],
|
46
|
+
has_set_usb_option: true,
|
47
|
+
power_connected: true
|
48
|
+
}
|
49
|
+
|
50
|
+
a = ['Wired (Fast Charge)', 'Wireless', 'Wired (Slow Charge)']
|
51
|
+
|
52
|
+
puts ('s: ' + s.inspect).debug
|
53
|
+
|
54
|
+
options = s.downcase.split(/ \+ /)
|
55
|
+
puts ('options: ' + options.inspect).debug
|
56
|
+
|
57
|
+
h[:power_connected_options] = a.map {|x| options.include? x.downcase }
|
58
|
+
|
59
|
+
[ExternalPowerTrigger, h]
|
60
|
+
end
|
61
|
+
|
62
|
+
get /^Power Connected: Any/i do |s|
|
63
|
+
|
64
|
+
h = {
|
65
|
+
power_connected_options: [true, true, true],
|
66
|
+
has_set_usb_option: true,
|
67
|
+
power_connected: true
|
68
|
+
}
|
69
|
+
|
70
|
+
[ExternalPowerTrigger, h]
|
71
|
+
end
|
37
72
|
# e.g. at 7:30pm daily
|
38
73
|
get /^(?:at )?(\d+:\d+(?:[ap]m)?) daily/i do |time, days|
|
39
74
|
[TimerTrigger, {time: time,
|
@@ -133,13 +168,25 @@ class ActionsNlp
|
|
133
168
|
def initialize(macro=nil)
|
134
169
|
|
135
170
|
super()
|
171
|
+
|
136
172
|
params = {macro: macro}
|
137
173
|
actions(params)
|
138
174
|
|
139
175
|
end
|
140
176
|
|
141
177
|
def actions(params)
|
142
|
-
|
178
|
+
|
179
|
+
# -- Connectivity ------------------------------------------------------
|
180
|
+
|
181
|
+
get /^(Enable|Disable) HotSpot/i do |state|
|
182
|
+
enable, state = if state.downcase == 'enable' then
|
183
|
+
[true, 0]
|
184
|
+
else
|
185
|
+
[false, 1]
|
186
|
+
end
|
187
|
+
[SetHotspotAction, {turn_wifi_on: enable, state: state }]
|
188
|
+
end
|
189
|
+
|
143
190
|
# e.g. message popup: hello world!
|
144
191
|
get /^message popup: (.*)/i do |msg|
|
145
192
|
[ToastAction, {msg: msg}]
|
@@ -192,6 +239,14 @@ class ActionsNlp
|
|
192
239
|
[SpeakTextAction, {}]
|
193
240
|
end
|
194
241
|
|
242
|
+
get /^Vibrate \(([^\)]+)/i do |pattern|
|
243
|
+
[VibrateAction, {pattern: pattern}]
|
244
|
+
end
|
245
|
+
|
246
|
+
get /^Vibrate$/i do |pattern|
|
247
|
+
[VibrateAction, {pattern: 'short buzz'}]
|
248
|
+
end
|
249
|
+
|
195
250
|
# e.g. Display Notification: Hi there: This is the body of the message
|
196
251
|
get /^Display Notification: ([^:]+): [^$]+$/i do |subject, text|
|
197
252
|
[NotificationAction, {subject: subject, text: text}]
|
@@ -246,13 +301,13 @@ class ActionsNlp
|
|
246
301
|
|
247
302
|
#
|
248
303
|
get /^WebHook \(Url\)/i do
|
249
|
-
[OpenWebPageAction,
|
304
|
+
[OpenWebPageAction, {}]
|
250
305
|
end
|
251
306
|
|
252
307
|
# e.g. webhook entered_kitchen
|
253
308
|
#
|
254
309
|
get /^webhook$/i do
|
255
|
-
[OpenWebPageAction, params]
|
310
|
+
[OpenWebPageAction, {}, params[:macro]]
|
256
311
|
end
|
257
312
|
|
258
313
|
# -- Location ---------------------------------------------------------
|
@@ -262,7 +317,7 @@ class ActionsNlp
|
|
262
317
|
end
|
263
318
|
|
264
319
|
get /^Share Location$/i do
|
265
|
-
[ShareLocationAction,
|
320
|
+
[ShareLocationAction, {}]
|
266
321
|
end
|
267
322
|
|
268
323
|
#a: Keep Device Awake Screen On Until Disabled
|
@@ -285,6 +340,10 @@ class ActionsNlp
|
|
285
340
|
[KeepAwakeAction, h]
|
286
341
|
end
|
287
342
|
|
343
|
+
get /Keep Device Awake$/i do
|
344
|
+
[KeepAwakeAction, {}]
|
345
|
+
end
|
346
|
+
|
288
347
|
#a: Disable Keep Awake
|
289
348
|
#
|
290
349
|
get /Disable Keep Awake/i do
|
@@ -297,6 +356,10 @@ class ActionsNlp
|
|
297
356
|
[IfConditionAction, {}]
|
298
357
|
end
|
299
358
|
|
359
|
+
get /else/i do
|
360
|
+
[ElseAction, {}]
|
361
|
+
end
|
362
|
+
|
300
363
|
get /End If/i do
|
301
364
|
[EndIfAction, {}]
|
302
365
|
end
|
@@ -306,6 +369,12 @@ class ActionsNlp
|
|
306
369
|
get /^Set Variable$/i do
|
307
370
|
[SetVariableAction, {}]
|
308
371
|
end
|
372
|
+
|
373
|
+
# -- Screen ------------------------------------------------
|
374
|
+
#
|
375
|
+
get /^Screen (On|Off)$/i do |state|
|
376
|
+
[ScreenOnAction, {screen_off: state.downcase == 'off'}]
|
377
|
+
end
|
309
378
|
|
310
379
|
end
|
311
380
|
|
@@ -326,10 +395,58 @@ class ConstraintsNlp
|
|
326
395
|
end
|
327
396
|
|
328
397
|
def constraints(params)
|
398
|
+
|
399
|
+
# Device State
|
400
|
+
|
401
|
+
get /^Device (locked|unlocked)/i do |state|
|
402
|
+
[DeviceLockedConstraint, {locked: state.downcase == 'locked'}]
|
403
|
+
end
|
329
404
|
|
330
405
|
get /^airplane mode (.*)/i do |state|
|
331
406
|
[AirplaneModeConstraint, {enabled: (state =~ /^enabled|on$/i) == 0}]
|
332
407
|
end
|
408
|
+
|
409
|
+
#
|
410
|
+
|
411
|
+
# -- MacroDroid specific -----------------------------------------------------------------------
|
412
|
+
|
413
|
+
get /^(\w+) (=) (\[?\w+\]?)/i do |loperand, operator, roperand|
|
414
|
+
|
415
|
+
h = {
|
416
|
+
loperand: loperand,
|
417
|
+
operator: operator,
|
418
|
+
roperand: roperand
|
419
|
+
}
|
420
|
+
|
421
|
+
[MacroDroidVariableConstraint, h]
|
422
|
+
|
423
|
+
end
|
424
|
+
|
425
|
+
# -- Sensors -----------------------------------
|
426
|
+
#
|
427
|
+
get /^Light Sensor (Less|Greater) than (50.0)lx/i do |operator, val|
|
428
|
+
|
429
|
+
level, option = operator.downcase == 'less' ? [-1,0] : [1,1]
|
430
|
+
|
431
|
+
h = {
|
432
|
+
light_level: level,
|
433
|
+
light_level_float: val,
|
434
|
+
option: option
|
435
|
+
}
|
436
|
+
|
437
|
+
[LightLevelConstraint, h]
|
438
|
+
end
|
439
|
+
|
440
|
+
get /^Proximity Sensor: (Near|Far)/i do |distance|
|
441
|
+
[ProximitySensorConstraint, {near: distance.downcase == 'near'}]
|
442
|
+
end
|
443
|
+
|
444
|
+
|
445
|
+
# -- Screen and Speaker ---------------------------
|
446
|
+
#
|
447
|
+
get /^Screen (On|Off)/i do |state|
|
448
|
+
[ScreenOnOffConstraint, {screen_on: state.downcase == 'on'}]
|
449
|
+
end
|
333
450
|
|
334
451
|
end
|
335
452
|
|
@@ -344,6 +461,7 @@ end
|
|
344
461
|
class Macro
|
345
462
|
using ColouredText
|
346
463
|
using Params
|
464
|
+
include ObjectX
|
347
465
|
|
348
466
|
attr_reader :local_variables, :triggers, :actions, :constraints,
|
349
467
|
:guid, :deviceid
|
@@ -363,6 +481,8 @@ class Macro
|
|
363
481
|
end
|
364
482
|
|
365
483
|
def add(obj)
|
484
|
+
puts 'inside add; ' + obj.inspect if @debug
|
485
|
+
puts '@actions: ' + @actions.inspect if @debug
|
366
486
|
|
367
487
|
if obj.kind_of? Trigger then
|
368
488
|
|
@@ -523,6 +643,21 @@ class Macro
|
|
523
643
|
|
524
644
|
@title = node.text('macro') || node.attributes[:name]
|
525
645
|
|
646
|
+
d = node.element('description')
|
647
|
+
|
648
|
+
if d then
|
649
|
+
|
650
|
+
desc = []
|
651
|
+
desc << d.text.strip
|
652
|
+
|
653
|
+
if d.element('item/description') then
|
654
|
+
desc << d.text('item/description').strip
|
655
|
+
end
|
656
|
+
|
657
|
+
@description = desc.join("\n")
|
658
|
+
|
659
|
+
end
|
660
|
+
|
526
661
|
node.xpath('variable').each {|e| set_var(*e.text.to_s.split(/: */,2)) }
|
527
662
|
|
528
663
|
#@description = node.attributes[:description]
|
@@ -606,68 +741,25 @@ class Macro
|
|
606
741
|
|
607
742
|
ap = ActionsNlp.new self
|
608
743
|
|
609
|
-
|
744
|
+
node.xpath('action').each do |e|
|
610
745
|
|
611
746
|
puts 'action e: ' + e.xml.inspect if @debug
|
612
747
|
puts 'e.text ' + e.text if @debug
|
613
748
|
|
614
749
|
item = e.element('item')
|
750
|
+
|
615
751
|
if item then
|
616
752
|
|
617
|
-
|
618
|
-
|
619
|
-
item.xpath('description').map do |description|
|
620
|
-
|
621
|
-
inner_lines = description.text.to_s.strip.lines
|
622
|
-
puts 'inner_lines: ' + inner_lines.inspect if @debug
|
623
|
-
|
624
|
-
action = if e.text.to_s.strip.empty? then
|
625
|
-
inner_lines.shift.strip
|
626
|
-
else
|
627
|
-
e.text.strip
|
628
|
-
end
|
629
|
-
|
630
|
-
puts 'action: ' + action.inspect if @debug
|
631
|
-
|
632
|
-
r = ap.find_action action
|
633
|
-
puts 'r: ' + r.inspect if @debug
|
634
|
-
puts 'description: ' + description.xml.inspect if @debug
|
635
|
-
#o = r[0].new([description, self]) if r
|
636
|
-
o = object_create(r[0],[description, self]) if r
|
637
|
-
puts 'after o' if @debug
|
638
|
-
o
|
639
|
-
|
640
|
-
end
|
641
|
-
|
642
|
-
else
|
643
|
-
|
644
|
-
action = e.text.strip
|
645
|
-
puts 'action: ' + action.inspect if @debug
|
646
|
-
r = ap.find_action action
|
647
|
-
|
648
|
-
a = e.xpath('item/*')
|
649
|
-
|
650
|
-
h = if a.any? then
|
651
|
-
a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
|
652
|
-
else
|
653
|
-
{}
|
654
|
-
end
|
655
|
-
puts 'h: ' + h.inspect if @debug
|
656
|
-
|
657
|
-
#r = ap.find_action action
|
658
|
-
#r[0].new(h.merge(macro: self)) if r
|
659
|
-
object_create(r[0], h.merge(macro: self)) if r
|
660
|
-
|
661
|
-
end
|
753
|
+
action_to_object(ap, e, item, self)
|
662
754
|
|
663
755
|
else
|
664
756
|
|
665
757
|
action = e.text.strip
|
666
758
|
r = ap.find_action action
|
667
759
|
#r[0].new(r[1]) if r
|
668
|
-
object_create(r[0]
|
760
|
+
self.add object_create(r[0],*r[1..-1]) if r
|
669
761
|
|
670
|
-
end
|
762
|
+
end
|
671
763
|
|
672
764
|
end
|
673
765
|
|
@@ -741,7 +833,10 @@ class Macro
|
|
741
833
|
if not @local_variables.has_key? label.to_sym then
|
742
834
|
@local_variables.merge!({label.to_sym => value})
|
743
835
|
end
|
744
|
-
|
836
|
+
|
837
|
+
if @debug then
|
838
|
+
puts ("before varify; label: %s value: %s" % [label, value]).debug
|
839
|
+
end
|
745
840
|
varify(label, value)
|
746
841
|
end
|
747
842
|
|
@@ -955,31 +1050,7 @@ EOF
|
|
955
1050
|
|
956
1051
|
end
|
957
1052
|
|
958
|
-
def object_create(klass, *args)
|
959
|
-
|
960
|
-
begin
|
961
|
-
klass.new(*args)
|
962
|
-
rescue
|
963
|
-
raise MacroError, klass.to_s + ': ' + ($!).to_s
|
964
|
-
end
|
965
|
-
end
|
966
|
-
|
967
|
-
def varify(label, value='')
|
968
|
-
|
969
1053
|
|
970
|
-
type = VAR_TYPES[value.class.to_s.to_sym]
|
971
1054
|
|
972
|
-
h = {
|
973
|
-
boolean_value: false,
|
974
|
-
decimal_value: 0.0,
|
975
|
-
int_value: 0,
|
976
|
-
name: label,
|
977
|
-
string_value: '',
|
978
|
-
type: type[0]
|
979
|
-
}
|
980
|
-
h[type[1]] = value
|
981
|
-
h
|
982
|
-
|
983
|
-
end
|
984
1055
|
|
985
1056
|
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.9.
|
4
|
+
version: 0.9.7
|
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-10-
|
38
|
+
date: 2020-10-14 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: glw
|
metadata.gz.sig
CHANGED
Binary file
|