ruby-macrodroid 0.9.8 → 0.9.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f79a66c628c78bab4c858805ac6486083331723153022cb23030485701b16eea
4
- data.tar.gz: d2bf06bef9e246852f4ec40a31f267ce2f94b66293318fb82ea864a4d5c15e0e
3
+ metadata.gz: 0c63b70d5cc34184d15c46395e1add89a6c8999163d4fb1e9362aa80a568dba4
4
+ data.tar.gz: 797fab9bff840db398067dc5b99ac53bb3d3129668573728c31aa0883a28d792
5
5
  SHA512:
6
- metadata.gz: 00ab9a577c80b81d017ebbb35d3e8a746d1d78ddde05473dd87be5c6a5365a3d7ed83e3501cf0402e3b2919be7dff1fe59f1e12c2f309649b69e3fd99e19824d
7
- data.tar.gz: fa4786c3f3bc343b6e242f5c8abfb6a438edae01df19b623b3d7b27fb610bc4c56f323071ea76890700b6493ede5df714a55f9b2ef619f1c37104832a59d75f8
6
+ metadata.gz: 2bbf5ca42c6fe1be4eeeda1ba597bc4be3f0944e7a871785b629d5344268bd65d3c560fcf65de0e5b0a619c075a31f6f61eea1d8eefbd29d066777f9fb414584
7
+ data.tar.gz: 139c4462602b86d49d87d9b2e73873354550b67c8bc435bfed41d6fe6434419d4cbdfef375efdc659978e012bbb8bb9d685a08d1d75f63ae0a403a6796295da7
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -122,6 +122,7 @@ class MacroDroid
122
122
  @picture_path = picture_path
123
123
 
124
124
  @geofences = {}
125
+ @macros = []
125
126
 
126
127
  if obj then
127
128
 
@@ -145,34 +146,7 @@ class MacroDroid
145
146
 
146
147
  if s =~ /m(?:acro)?:\s/ then
147
148
 
148
- puts 'before RowX.new' if @debug
149
-
150
- s2 = s.gsub(/^g:/,'geofence:').gsub(/^m:/,'macro:')\
151
- .gsub(/^d:/,'description:').gsub(/^v:/,'variable:')\
152
- .gsub(/^t:/,'trigger:').gsub(/^a:/,'action:')\
153
- .gsub(/^c:/,'constraint:').gsub(/^#.*/,'')
154
-
155
- a = s2.split(/(?=^macro:)/)
156
-
157
- raw_geofences = a.shift if a.first =~ /^geofence/
158
- raw_macros = a.join
159
- #raw_macros, raw_geofences .reverse
160
-
161
- puts 'raw_macros: ' + raw_macros.inspect if @debug
162
-
163
- if raw_geofences then
164
-
165
- geoxml = RowX.new(raw_geofences).to_xml
166
-
167
- geodoc = Rexle.new(geoxml)
168
- geofences = geodoc.root.xpath('item/geofence')
169
- @geofences = fetch_geofences(geofences) if geofences.any?
170
-
171
- end
172
-
173
- xml = RowX.new(raw_macros, allow_lonely_keyfield: true).to_xml
174
- puts 'xml: ' + xml if @debug
175
- import_rowxml(xml)
149
+ import_txt(s)
176
150
 
177
151
  elsif s =~ /^# /
178
152
  xml = pc_to_xml(s)
@@ -229,6 +203,10 @@ class MacroDroid
229
203
  def export(filepath)
230
204
  FileX.write filepath, to_json
231
205
  end
206
+
207
+ def import(s)
208
+ import_txt(s)
209
+ end
232
210
 
233
211
  def to_json()
234
212
 
@@ -337,7 +315,7 @@ class MacroDroid
337
315
 
338
316
  m = Macro.new(geofences: @geofences.map(&:last), deviceid: @deviceid,
339
317
  remote_url: @remote_url, picture_path: @picture_path,
340
- debug: @debug )
318
+ parent: self, debug: @debug )
341
319
  m.import_h(macro)
342
320
  m
343
321
 
@@ -356,15 +334,50 @@ class MacroDroid
356
334
  puts 'import_rowxml: @geofences: ' + @geofences.inspect if @debug
357
335
  geofences = @geofences
358
336
 
359
- @macros = doc.root.xpath('item').map do |node|
337
+ a = doc.root.xpath('item').map do |node|
360
338
  puts ('geofences: ' + geofences.inspect).highlight if @debug
361
339
  Macro.new(geofences: geofences.map(&:last), deviceid: @deviceid,
362
340
  remote_url: @remote_url, picture_path: @picture_path,
363
- debug: @debug).import_xml(node)
341
+ parent: self, debug: @debug).import_xml(node)
364
342
 
365
343
  end
344
+
345
+ @macros.concat a
366
346
 
367
- end
347
+ end
348
+
349
+ def import_txt(s)
350
+
351
+ puts 'before RowX.new' if @debug
352
+
353
+ s2 = s.gsub(/^g:/,'geofence:').gsub(/^m:/,'macro:')\
354
+ .gsub(/^d:/,'description:').gsub(/^v:/,'variable:')\
355
+ .gsub(/^t:/,'trigger:').gsub(/^a:/,'action:')\
356
+ .gsub(/^c:/,'constraint:').gsub(/^#.*/,'')
357
+
358
+ a = s2.split(/(?=^macro:)/)
359
+
360
+ raw_geofences = a.shift if a.first =~ /^geofence/
361
+ raw_macros = a.join
362
+ #raw_macros, raw_geofences .reverse
363
+
364
+ puts 'raw_macros: ' + raw_macros.inspect if @debug
365
+
366
+ if raw_geofences then
367
+
368
+ geoxml = RowX.new(raw_geofences).to_xml
369
+
370
+ geodoc = Rexle.new(geoxml)
371
+ geofences = geodoc.root.xpath('item/geofence')
372
+ @geofences = fetch_geofences(geofences) if geofences.any?
373
+
374
+ end
375
+
376
+ xml = RowX.new(raw_macros, allow_lonely_keyfield: true).to_xml
377
+ puts 'xml: ' + xml if @debug
378
+ import_rowxml(xml)
379
+
380
+ end
368
381
 
369
382
  def import_xml(raws)
370
383
 
@@ -384,7 +397,8 @@ class MacroDroid
384
397
  @macros = doc.root.xpath('macro').map do |node|
385
398
  puts 'node: ' + node.inspect if @debug
386
399
  Macro.new(geofences: @geofences.map(&:last), deviceid: @deviceid,
387
- picture_path: @picture_path, debug: @debug).import_xml(node)
400
+ picture_path: @picture_path, parent: self, debug: @debug)\
401
+ .import_xml(node)
388
402
 
389
403
  end
390
404
  end
@@ -589,4 +603,7 @@ require 'ruby-macrodroid/base'
589
603
  require 'ruby-macrodroid/triggers'
590
604
  require 'ruby-macrodroid/actions'
591
605
  require 'ruby-macrodroid/constraints'
606
+ require 'ruby-macrodroid/triggersnlp'
607
+ require 'ruby-macrodroid/actionsnlp'
608
+ require 'ruby-macrodroid/constraintsnlp'
592
609
  require 'ruby-macrodroid/macro'
@@ -150,7 +150,7 @@ class OpenWebPageAction < ApplicationAction
150
150
 
151
151
  def initialize(obj={}, macro=nil)
152
152
 
153
- $debug = true
153
+ $debug = false
154
154
  puts ('obj: ' + obj.inspect).debug if $debug
155
155
 
156
156
  h = if obj.is_a? Hash then
@@ -190,9 +190,9 @@ class OpenWebPageAction < ApplicationAction
190
190
  #h[:url_to_open] = h[:url] if h[:url] and h[:url].length > 1
191
191
 
192
192
  options = {
193
- variable_to_save_response: {:string_value=>"", :name=>"coords",
194
- decimal_value: 0.0, isLocal: true, m_boolean_value: false,
195
- excludeFromLog: false, int_value: 0, type: 2},
193
+ #variable_to_save_response: {:string_value=>"", :name=>"coords",
194
+ #decimal_value: 0.0, isLocal: true, m_boolean_value: false,
195
+ #excludeFromLog: false, int_value: 0, type: 2},
196
196
  url_to_open: '',
197
197
  http_get: true,
198
198
  disable_url_encode: false,
@@ -298,7 +298,7 @@ class TakePictureAction < CameraAction
298
298
 
299
299
  e, macro = obj
300
300
 
301
- puts 'e: ' + e.xml.inspect
301
+ #puts 'e: ' + e.xml.inspect
302
302
 
303
303
  a = e.xpath('item/*')
304
304
 
@@ -312,7 +312,7 @@ class TakePictureAction < CameraAction
312
312
 
313
313
  desc = h2[:description]
314
314
  h2.delete :description
315
- puts 'desc: ' + desc.inspect
315
+ #puts 'desc: ' + desc.inspect
316
316
 
317
317
  if desc.length > 1 then
318
318
 
@@ -469,10 +469,14 @@ end
469
469
 
470
470
  # Conditions/Loops
471
471
  #
472
- class IfConditionAction < Action
473
472
 
473
+ class IfAction < Action
474
+ using ColouredText
475
+
474
476
  def initialize(obj=nil)
475
-
477
+
478
+ $debug = false
479
+
476
480
  options = {
477
481
  a: true,
478
482
  constraint_list: []
@@ -492,10 +496,10 @@ class IfConditionAction < Action
492
496
  super()
493
497
  puts 'e.xml: ' + e.xml if $debug
494
498
  puts 'e.text: ' + e.text.to_s.strip if $debug
495
- raw_txt = e.text.to_s.strip[/^if [^$]+/i] || e.text('item/description')
499
+ raw_txt = e.text.to_s.strip[/^#{@label}[^$]+/i] || e.text('item/description')
496
500
  puts 'raw_txt: ' + raw_txt.inspect if $debug
497
501
 
498
- clause = raw_txt[/^If (.*)/i,1]
502
+ clause = raw_txt[/^#{@label}(.*)/i,1]
499
503
  puts 'clause: ' + clause.inspect if $debug
500
504
  conditions = clause.split(/\s+\b(?:AND|OR)\b\s+/i)
501
505
  puts 'conditions: ' + conditions.inspect if $debug
@@ -514,6 +518,7 @@ class IfConditionAction < Action
514
518
 
515
519
  # find any nested actions
516
520
  item = e.element('item')
521
+ #puts ('item: ' + item.xml.inspect).debug if $debug
517
522
 
518
523
  if item then
519
524
 
@@ -534,19 +539,13 @@ class IfConditionAction < Action
534
539
 
535
540
  end
536
541
 
537
-
538
-
539
-
540
-
541
- @label = 'If '
542
-
543
542
  end
544
-
543
+
545
544
  def to_s(colour: false, indent: 0)
546
545
 
547
546
  h = @h.clone
548
547
  #h.delete :macro
549
- @s = 'If '
548
+ @s = @label
550
549
  operator = @h[:is_or_condition] ? 'OR' : 'AND'
551
550
  constraints = @constraints.map \
552
551
  {|x| ' ' * indent + x.to_summary(colour: colour)}.join(" %s " % operator)
@@ -557,7 +556,18 @@ class IfConditionAction < Action
557
556
  out << s + constraints
558
557
  out.join("\n")
559
558
 
560
- end
559
+ end
560
+
561
+ end
562
+
563
+ class IfConditionAction < IfAction
564
+
565
+ def initialize(obj=nil)
566
+
567
+ @label = 'If '
568
+ super(obj)
569
+
570
+ end
561
571
 
562
572
  end
563
573
 
@@ -605,41 +615,15 @@ class ElseAction < Action
605
615
 
606
616
  end
607
617
 
608
- class ElseIfConditionAction < Action
618
+ class ElseIfConditionAction < IfAction
609
619
 
610
- def initialize(h={})
611
-
612
- options = {
613
- constraint_list: ''
614
- }
615
-
616
- super(options.merge h)
617
- @label = 'Else If '
620
+ def initialize(obj=nil)
618
621
 
619
- end
620
-
621
- def to_s(colour: false, indent: 0)
622
-
623
- h = @h.clone
624
- h.delete :macro
625
- @s = 'Else If '
626
- operator = @h[:is_or_condition] ? 'OR' : 'AND'
627
- constraints = @constraints.map \
628
- {|x| ' ' * indent + x.to_summary(colour: colour)}.join(" %s " % operator)
629
-
630
- out = []
631
- out << "; %s" % @h[:comment] if @h[:comment]
632
- s = @s.lines.map {|x| (' ' * indent) + x}.join
633
- out << s + constraints
634
- out.join("\n")
622
+ @label = 'Else If '
623
+ super(obj)
635
624
 
636
- end
637
-
638
- def to_summary(colour: false)
639
- 'foo'
640
625
  end
641
-
642
-
626
+
643
627
  end
644
628
 
645
629
 
@@ -904,8 +888,17 @@ end
904
888
  #
905
889
  class SayTimeAction < DateTimeAction
906
890
 
907
- def initialize(h={})
908
-
891
+ def initialize(obj=nil)
892
+
893
+ h = if obj.is_a? Hash then
894
+ obj
895
+ elsif obj.is_a? Array
896
+
897
+ e, macro = obj
898
+ {:'12_hour' => e.text('item/description').to_s[/^\d+/] == '12'}
899
+
900
+ end
901
+
909
902
  options = {
910
903
  :'12_hour' => true
911
904
  }
@@ -926,7 +919,9 @@ class SayTimeAction < DateTimeAction
926
919
  end
927
920
 
928
921
  def to_s(colour: false, indent: 0)
929
- 'Say Current Time'
922
+ @s = 'Say Current Time'
923
+ @s += "\n%s hour clock" % (@h[:'12_hour'] ? '12' : '24')
924
+ super()
930
925
  end
931
926
 
932
927
  end
@@ -1722,6 +1717,51 @@ class ConfirmNextAction < Action
1722
1717
 
1723
1718
  end
1724
1719
 
1720
+ class DisableMacroAction < Action
1721
+
1722
+ def initialize(obj=nil)
1723
+
1724
+ h = if obj.is_a? Hash then
1725
+
1726
+ obj
1727
+
1728
+ elsif obj.is_a? Array
1729
+
1730
+ e, macro, h2 = obj
1731
+
1732
+ # find the macro guid for the given name
1733
+ name = e.text('item/description').to_s
1734
+ found = macro.parent.macros.find {|macro| macro.title =~ /#{name}/ }
1735
+
1736
+ h3 = if found then
1737
+ {macro_name: found.title, GUID: found.guid}
1738
+ else
1739
+ {macro_name: name}
1740
+ end
1741
+
1742
+ h3.merge h2
1743
+
1744
+ end
1745
+
1746
+ # state: 0 = enable, 1 = disable, 2 = toggle
1747
+
1748
+ options = {macro_name: "Change brightness", state: 1, GUID: nil}
1749
+ super(options.merge h)
1750
+
1751
+ end
1752
+
1753
+ def to_s(colour: false, indent: 0)
1754
+
1755
+ state = %w(Enable Disable Toggle)[@h[:state]]
1756
+ @s = state + ' macro'# + @h.inspect
1757
+ @s += "\n" + @h[:macro_name]
1758
+ super()
1759
+
1760
+ end
1761
+
1762
+ alias to_summary to_s
1763
+ end
1764
+
1725
1765
  # MacroDroid Specific
1726
1766
  #
1727
1767
  class ExportMacrosAction < Action
@@ -1888,7 +1928,7 @@ class PauseAction < Action
1888
1928
  options = {
1889
1929
  delay_in_milli_seconds: 0, delay_in_seconds: 1, use_alarm: false
1890
1930
  }
1891
- super(h)
1931
+ super(options.merge h)
1892
1932
 
1893
1933
  end
1894
1934
 
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: actionsnlp.rb
4
+
5
+
6
+ class ActionsNlp
7
+ include AppRoutes
8
+
9
+ def initialize(macro=nil)
10
+
11
+ super()
12
+
13
+ params = {macro: macro}
14
+ actions(params)
15
+
16
+ end
17
+
18
+ def actions(params)
19
+
20
+ # -- Conditions/Loops ---------------------------------------------
21
+ #
22
+
23
+ get /else if (.*)/i do
24
+ [ElseIfConditionAction, {}]
25
+ end
26
+
27
+ #e.g a: if Airplane mode enabled
28
+ #
29
+ get /if (.*)/i do
30
+ [IfConditionAction, {}]
31
+ end
32
+
33
+ get /else/i do
34
+ [ElseAction, {}]
35
+ end
36
+
37
+ get /End If/i do
38
+ [EndIfAction, {}]
39
+ end
40
+
41
+
42
+ # -- Connectivity ------------------------------------------------------
43
+
44
+ get /^(Enable|Disable) HotSpot/i do |state|
45
+ enable, state = if state.downcase == 'enable' then
46
+ [true, 0]
47
+ else
48
+ [false, 1]
49
+ end
50
+ [SetHotspotAction, {turn_wifi_on: enable, state: state }]
51
+ end
52
+
53
+ # e.g. message popup: hello world!
54
+ get /^(?:message popup|popup message): (.*)/i do |msg|
55
+ [ToastAction, {msg: msg}]
56
+ end
57
+
58
+ # e.g. Popup Message 'hello world!'
59
+ get /^Popup[ _]Message ['"]([^'"]+)/i do |msg|
60
+ [ToastAction, {msg: msg}]
61
+ end
62
+
63
+ # e.g. Popup Message\n hello world!
64
+ get /^Popup Message\n\s+(.*)/im do |msg|
65
+ [ToastAction, {msg: msg}]
66
+ end
67
+
68
+ # e.g. Popup Message
69
+ get /^Popup Message$/i do
70
+ [ToastAction, {}]
71
+ end
72
+
73
+ # e.g. say current time
74
+ get /^say current[ _]time/i do
75
+ [SayTimeAction, {}]
76
+ end
77
+
78
+ get /^Torch :?(.*)/i do |onoffstate|
79
+ state = %w(on off toggle).index onoffstate.downcase
80
+ [CameraFlashLightAction, {state: state}]
81
+ end
82
+
83
+ get /^Take Picture/i do
84
+ [TakePictureAction, {}]
85
+ end
86
+
87
+ get /^take_picture/i do
88
+ [TakePictureAction, {}]
89
+ end
90
+
91
+ # -- DEVICE ACTIONS ------------------------------------------------------
92
+
93
+ get /^Speak text \(([^\)]+)\)/i do |text|
94
+ [SpeakTextAction, {text: text}]
95
+ end
96
+
97
+ get /^Speak text ['"]([^'"]+)/i do |text|
98
+ [SpeakTextAction, {text: text}]
99
+ end
100
+
101
+ get /^Speak text$/i do |text|
102
+ [SpeakTextAction, {}]
103
+ end
104
+
105
+ get /^Vibrate \(([^\)]+)/i do |pattern|
106
+ [VibrateAction, {pattern: pattern}]
107
+ end
108
+
109
+ get /^Vibrate$/i do |pattern|
110
+ [VibrateAction, {pattern: 'short buzz'}]
111
+ end
112
+
113
+ # e.g. Display Notification: Hi there: This is the body of the message
114
+ get /^Display Notification: ([^:]+): [^$]+$/i do |subject, text|
115
+ [NotificationAction, {subject: subject, text: text}]
116
+ end
117
+
118
+
119
+ # e.g. Enable Wifi
120
+ get /^(Enable|Disable) Wifi$/i do |raw_state|
121
+
122
+ state = raw_state.downcase.to_sym == :enable ? 0 : 1
123
+ [SetWifiAction, {state: state}]
124
+
125
+ end
126
+
127
+ # e.g. Play: Altair
128
+ get /^Play: (.*)$/i do |name|
129
+
130
+ [PlaySoundAction, {file_path: name}]
131
+
132
+ end
133
+
134
+ # e.g. Launch Settings
135
+ get /^Launch (.*)$/i do |application|
136
+
137
+ h = {
138
+ application_name: application,
139
+ package_to_launch: 'com.android.' + application.downcase
140
+ }
141
+ [LaunchActivityAction, h]
142
+
143
+ end
144
+
145
+ # e.g. HTTP GET http://someurl.com/something
146
+ get /^HTTP GET ([^$]+)$/i do |url|
147
+
148
+ [OpenWebPageAction, url_to_open: url]
149
+
150
+ end
151
+
152
+ get /^HTTP GET$/i do
153
+
154
+ [OpenWebPageAction, {}]
155
+
156
+ end
157
+
158
+ # e.g. webhook entered_kitchen
159
+ #
160
+ get /(?:webhook|HTTP GET) ([^$]+)$/i do |s|
161
+ key = s =~ /^http/ ? :url_to_open : :identifier
162
+ [OpenWebPageAction, {key => s}]
163
+ end
164
+
165
+ #
166
+ get /^WebHook \(Url\)/i do
167
+ [OpenWebPageAction, {}]
168
+ end
169
+
170
+ # e.g. webhook entered_kitchen
171
+ #
172
+ get /^webhook$/i do
173
+ [OpenWebPageAction, {}, params[:macro]]
174
+ end
175
+
176
+ # -- Location ---------------------------------------------------------
177
+
178
+ get /^Force Location Update$/i do
179
+ [ForceLocationUpdateAction, params]
180
+ end
181
+
182
+ get /^Share Location$/i do
183
+ [ShareLocationAction, {}]
184
+ end
185
+
186
+ #a: Keep Device Awake Screen On Until Disabled
187
+ #
188
+ get /Keep Device Awake Screen On Until Disabled/i do
189
+ [KeepAwakeAction, {enabled: true, permanent: true, screen_option: 0}]
190
+ end
191
+
192
+
193
+ #a: Keep Device Awake Screen On 1h 1m 1s
194
+ #
195
+ get /Keep Device Awake Screen On ([^$]+)/i do |duration|
196
+
197
+ a = duration.split.map(&:to_i)
198
+ secs = Subunit.new(units={minutes:60, hours:60, seconds: 60}, a).to_i
199
+
200
+ h = {
201
+ permanent: true, screen_option: 0, seconds_to_stay_awake_for: secs
202
+ }
203
+ [KeepAwakeAction, h]
204
+ end
205
+
206
+ get /(?:Keep Device|stay) Awake$/i do
207
+ [KeepAwakeAction, {}]
208
+ end
209
+
210
+ #a: Disable Keep Awake
211
+ #
212
+ get /Disable Keep Awake|stay awake off/i do
213
+ [KeepAwakeAction, {enabled: false, screen_option: 0}]
214
+ end
215
+
216
+
217
+ # -- MacroDroid Specific ------------------------------------------------
218
+ #
219
+
220
+ get /^((?:En|Dis)able) Macro$/i do |rawstate|
221
+ state = %w(enable disable toggle).index(rawstate.downcase)
222
+ [DisableMacroAction, {state: state}]
223
+ end
224
+
225
+ get /^Set Variable$/i do
226
+ [SetVariableAction, {}]
227
+ end
228
+
229
+ get /^wait (\d+) seconds$/i do |seconds|
230
+ [PauseAction, {delay_in_seconds: seconds.to_i}]
231
+ end
232
+
233
+ # -- Screen ------------------------------------------------
234
+ #
235
+ get /^Screen (On|Off)$/i do |state|
236
+ [ScreenOnAction, {screen_off: state.downcase == 'off'}]
237
+ end
238
+
239
+ end
240
+
241
+ alias find_action run_route
242
+
243
+
244
+ end