ruby-macrodroid 0.8.11 → 0.9.3

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: 378a54305a1bfcce6433d130a154765550e7c19f547e19897fffe48c4ee5abf2
4
- data.tar.gz: dc2374f5fe37dbf9e011a62272874b6e6b80be87c5dcb6479a253d033a0f3b26
3
+ metadata.gz: 73bd85e05b55cb8139d501f96e7f0692a052d4544dcd518b73e4e1168ffcb0dd
4
+ data.tar.gz: 92d7670d08882e34f16085ca22da3a5affc8aa84c3eb89b3f6ec2800c4172501
5
5
  SHA512:
6
- metadata.gz: 52222f8794ae92cdae799a5309dcb387c8e6e587a9d36fbbc429f636730c57610f4b9e20f9cf65f60989a843aaa1cfa96696954142dc98bb0c162bd737cb49cb
7
- data.tar.gz: 9db28bc4773d3e8daff58a75244b1506a2885fd70da22136e10baa4c5f9d008a37e45538320c2ad4831412857aa4fd68a50d13dd6a9f4518744d700cc5521d1b
6
+ metadata.gz: 7361a05b044e4d759728a91d86952f6273a8bfbfc72ff1ac9965f97cd858dd8ad3902cb4cb72f4e0557a291627a631a75d7f4ef0a04481969b8ac91bcd3eb48e
7
+ data.tar.gz: b7ef1815fe2b3e4ff42de13e34c8a663e58a55681aba9e38533c5175ab9a9b197755205175abfe2a013331150bb2f19d4949e41de4f9e3874ea6a4a3981172e2
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -38,269 +38,14 @@ require 'rxfhelper'
38
38
  require 'chronic_cron'
39
39
 
40
40
 
41
+ # PASTE_START
42
+
41
43
  MODEL =<<EOF
42
44
  device
43
45
  connectivity
44
46
  airplane_mode is disabled
45
47
  EOF
46
48
 
47
- class TriggersNlp
48
- include AppRoutes
49
-
50
- def initialize(macro=nil)
51
-
52
- super()
53
- params = {macro: macro}
54
- triggers(params)
55
-
56
- end
57
-
58
- def triggers(params)
59
-
60
- # e.g. at 7:30pm daily
61
- get /^(?:at )?(\d+:\d+(?:[ap]m)?) daily/i do |time, days|
62
- [TimerTrigger, {time: time,
63
- days: %w(Mon Tue Wed Thu Fri Sat Sun).join(', ')}]
64
- end
65
-
66
- get /^(?:at )?(\d+:\d+(?:[ap]m)?) (?:on )?(.*)/i do |time, days|
67
- [TimerTrigger, {time: time, days: days}]
68
- end
69
-
70
- # time.is? 'at 18:30pm on Mon or Tue'
71
- get /^time.is\? ['"](?:at )?(\d+:\d+(?:[ap]m)?) (?:on )?(.*)['"]/i do |time, days|
72
- [TimerTrigger, {time: time, days: days.gsub(' or ',', ')}]
73
- end
74
-
75
- get /^shake[ _]device\??$/i do
76
- [ShakeDeviceTrigger, {}]
77
- end
78
-
79
- get /^Flip Device (.*)$/i do |motion|
80
- facedown = motion =~ /Face Up (?:->|to) Face Down/i
81
- [FlipDeviceTrigger, {face_down: facedown }]
82
- end
83
-
84
- get /^flip_device_down\?$/i do
85
- [FlipDeviceTrigger, {face_down: true }]
86
- end
87
-
88
- get /^flip_device_up\?$/i do
89
- [FlipDeviceTrigger, {face_down: false }]
90
- end
91
-
92
- get /^Failed Login Attempt$/i do
93
- [FailedLoginTrigger, {}]
94
- end
95
-
96
- get /^failed_login?$/i do
97
- [FailedLoginTrigger, {}]
98
- end
99
-
100
- get /^Geofence (Entry|Exit) \(([^\)]+)/i do |direction, name|
101
- enter_area = direction.downcase.to_sym == :entry
102
- [GeofenceTrigger, {name: name, enter_area: enter_area}]
103
- end
104
-
105
- get /^location (entered|exited) \(([^\)]+)/i do |direction, name|
106
- enter_area = direction.downcase.to_sym == :entered
107
- [GeofenceTrigger, {name: name, enter_area: enter_area}]
108
- end
109
-
110
- # eg. Proximity Sensor (Near)
111
- #
112
- get /^Proximity Sensor \(([^\)]+)\)/i do |distance|
113
-
114
- [ProximityTrigger, {distance: distance}]
115
- end
116
-
117
- get /^WebHook \(Url\)/i do
118
- [WebHookTrigger, params]
119
- end
120
-
121
- get /^WebHook/i do
122
- [WebHookTrigger, params]
123
- end
124
-
125
- get /^wh/i do
126
- [WebHookTrigger, params]
127
- end
128
-
129
-
130
- end
131
-
132
- alias find_trigger run_route
133
-
134
- def to_s(colour: false)
135
- 'TriggersNlp ' + @h.inspect
136
- end
137
-
138
- alias to_summary to_s
139
- end
140
-
141
- class ActionsNlp
142
- include AppRoutes
143
-
144
- def initialize()
145
-
146
- super()
147
- params = {}
148
- actions(params)
149
-
150
- end
151
-
152
- def actions(params)
153
-
154
- # e.g. message popup: hello world!
155
- get /^message popup: (.*)/i do |msg|
156
- [ToastAction, {msg: msg}]
157
- end
158
-
159
- # e.g. Popup Message 'hello world!'
160
- get /^Popup[ _]Message ['"]([^'"]+)/i do |msg|
161
- [ToastAction, {msg: msg}]
162
- end
163
-
164
- # e.g. Popup Message\n hello world!
165
- get /^Popup Message\n\s+(.*)/im do |msg|
166
- [ToastAction, {msg: msg}]
167
- end
168
-
169
- # e.g. Popup Message
170
- get /^Popup Message$/i do
171
- [ToastAction, {}]
172
- end
173
-
174
- # e.g. say current time
175
- get /^say current[ _]time/i do
176
- [SayTimeAction, {}]
177
- end
178
-
179
- get /^Torch :?(.*)/i do |onoffstate|
180
- state = %w(on off toggle).index onoffstate.downcase
181
- [CameraFlashLightAction, {state: state}]
182
- end
183
-
184
- get /^Take Picture/i do
185
- [TakePictureAction, {}]
186
- end
187
-
188
- get /^take_picture/i do
189
- [TakePictureAction, {}]
190
- end
191
-
192
- # e.g. Display Notification: Hi there: This is the body of the message
193
- get /^Display Notification: ([^:]+): [^$]+$/i do |subject, text|
194
- [NotificationAction, {subject: subject, text: text}]
195
- end
196
-
197
-
198
- # e.g. Enable Wifi
199
- get /^(Enable|Disable) Wifi$/i do |raw_state|
200
-
201
- state = raw_state.downcase.to_sym == :enable ? 0 : 1
202
- [SetWifiAction, {state: state}]
203
-
204
- end
205
-
206
- # e.g. Play: Altair
207
- get /^Play: (.*)$/i do |name|
208
-
209
- [PlaySoundAction, {file_path: name}]
210
-
211
- end
212
-
213
- # e.g. Launch Settings
214
- get /^Launch (.*)$/i do |application|
215
-
216
- h = {
217
- application_name: application,
218
- package_to_launch: 'com.android.' + application.downcase
219
- }
220
- [LaunchActivityAction, h]
221
-
222
- end
223
-
224
- # e.g. HTTP GET http://someurl.com/something
225
- get /^HTTP GET ([^$]+)$/i do |url|
226
-
227
- [OpenWebPageAction, url_to_open: url]
228
-
229
- end
230
-
231
- # e.g. webhook entered_kitchen
232
- #
233
- get /webhook|HTTP GET/i do
234
- [OpenWebPageAction, {}]
235
- end
236
-
237
- #a: Keep Device Awake Screen On Until Disabled
238
- #
239
- get /Keep Device Awake Screen On Until Disabled/i do
240
- [KeepAwakeAction, {enabled: true, permanent: true, screen_option: 0}]
241
- end
242
-
243
-
244
- #a: Keep Device Awake Screen On 1h 1m 1s
245
- #
246
- get /Keep Device Awake Screen On ([^$]+)/i do |duration|
247
-
248
- a = duration.split.map(&:to_i)
249
- secs = Subunit.new(units={minutes:60, hours:60, seconds: 60}, a).to_i
250
-
251
- h = {
252
- permanent: true, screen_option: 0, seconds_to_stay_awake_for: secs
253
- }
254
- [KeepAwakeAction, h]
255
- end
256
-
257
- #a: Disable Keep Awake
258
- #
259
- get /Disable Keep Awake/i do
260
- [KeepAwakeAction, {enabled: false, screen_option: 0}]
261
- end
262
-
263
- #e.g a: if Airplane mode enabled
264
- #
265
- get /if (.*)/i do
266
- [IfConditionAction, {}]
267
- end
268
-
269
- get /End If/i do
270
- [EndIfAction, {}]
271
- end
272
-
273
- end
274
-
275
- alias find_action run_route
276
-
277
-
278
- end
279
-
280
- class ConstraintsNlp
281
- include AppRoutes
282
-
283
- def initialize()
284
-
285
- super()
286
- params = {}
287
- constraints(params)
288
-
289
- end
290
-
291
- def constraints(params)
292
-
293
- get /^airplane mode (.*)/i do |state|
294
- [AirplaneModeConstraint, {enabled: (state =~ /^enabled|on$/i) == 0}]
295
- end
296
-
297
- end
298
-
299
- alias find_constraint run_route
300
-
301
- end
302
-
303
-
304
49
  module Params
305
50
 
306
51
  refine Hash do
@@ -330,16 +75,16 @@ module Params
330
75
  end
331
76
 
332
77
  # turns keys from snake_case to CamelCase
333
- def to_camel_case(h=self)
78
+ def to_camelcase(h=self)
334
79
 
335
80
  h.inject({}) do |r,x|
336
81
 
337
82
  key, value = x
338
83
 
339
84
  val = if value.is_a?(Hash) then
340
- to_camel_case(value)
85
+ to_camelcase(value)
341
86
  elsif value.is_a?(Array) and value.first.is_a? Hash
342
- value.map {|row| to_camel_case(row)}
87
+ value.map {|row| to_camelcase(row)}
343
88
  else
344
89
  value
345
90
  end
@@ -356,8 +101,6 @@ end
356
101
 
357
102
 
358
103
 
359
-
360
-
361
104
  class MacroDroidError < Exception
362
105
  end
363
106
 
@@ -367,14 +110,14 @@ class MacroDroid
367
110
  using Params
368
111
 
369
112
  attr_reader :macros, :geofences, :yaml
370
- attr_accessor :deviceid
113
+ attr_accessor :deviceid, :remote_url
371
114
 
372
115
  # note: The deviceid can only be found from an existing Webhook trigger,
373
116
  # generated from MacroDroid itself.
374
117
 
375
- def initialize(obj=nil, deviceid: nil, debug: false)
118
+ def initialize(obj=nil, deviceid: nil, remote_url: nil, debug: false)
376
119
 
377
- @deviceid, @debug = deviceid, debug
120
+ @deviceid, @remote_url, @debug = deviceid, remote_url, debug
378
121
 
379
122
  @geofences = {}
380
123
 
@@ -403,8 +146,9 @@ class MacroDroid
403
146
  puts 'before RowX.new' if @debug
404
147
 
405
148
  s2 = s.gsub(/^g:/,'geofence:').gsub(/^m:/,'macro:')\
406
- .gsub(/^v:/,'variable:').gsub(/^t:/,'trigger:')\
407
- .gsub(/^a:/,'action:').gsub(/^c:/,'constraint:').gsub(/^#.*/,'')
149
+ .gsub(/^d:/,'description:').gsub(/^v:/,'variable:')\
150
+ .gsub(/^t:/,'trigger:').gsub(/^a:/,'action:')\
151
+ .gsub(/^c:/,'constraint:').gsub(/^#.*/,'')
408
152
 
409
153
  a = s2.split(/(?=^macro:)/)
410
154
 
@@ -424,7 +168,7 @@ class MacroDroid
424
168
 
425
169
  end
426
170
 
427
- xml = RowX.new(raw_macros).to_xml
171
+ xml = RowX.new(raw_macros, allow_lonely_keyfield: true).to_xml
428
172
  puts 'xml: ' + xml if @debug
429
173
  import_rowxml(xml)
430
174
 
@@ -499,7 +243,7 @@ class MacroDroid
499
243
  },
500
244
  macro_list: @macros.map(&:to_h)
501
245
  }
502
- @h.merge(h).to_camel_case
246
+ @h.merge(h).to_camelcase
503
247
 
504
248
  end
505
249
 
@@ -590,7 +334,7 @@ class MacroDroid
590
334
  # puts '@geofences: ' + @geofences.inspect if @debug
591
335
 
592
336
  m = Macro.new(geofences: @geofences.map(&:last), deviceid: @deviceid,
593
- debug: @debug )
337
+ remote_url: @remote_url, debug: @debug )
594
338
  m.import_h(macro)
595
339
  m
596
340
 
@@ -612,7 +356,7 @@ class MacroDroid
612
356
  @macros = doc.root.xpath('item').map do |node|
613
357
  puts ('geofences: ' + geofences.inspect).highlight if @debug
614
358
  Macro.new(geofences: geofences.map(&:last), deviceid: @deviceid,
615
- debug: @debug).import_xml(node)
359
+ remote_url: @remote_url, debug: @debug).import_xml(node)
616
360
 
617
361
  end
618
362
 
@@ -835,65 +579,7 @@ class DroidSim
835
579
 
836
580
  end
837
581
 
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
582
+ # PASTE_END
897
583
 
898
584
  require 'ruby-macrodroid/base'
899
585
  require 'ruby-macrodroid/triggers'
@@ -49,8 +49,8 @@ class Action < MacroObject
49
49
 
50
50
  end
51
51
 
52
- def invoke(s='')
53
- "%s/%s: %s" % [@group, @type, s]
52
+ def invoke(h={})
53
+ "%s/%s: %s" % [@group, @type, h.to_json]
54
54
  end
55
55
 
56
56
 
@@ -136,26 +136,95 @@ 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(h={})
146
+ def initialize(obj={}, macro=nil)
147
+
148
+ # puts 'obj: ' + obj[0].xml.inspect
149
+
150
+ h = if obj.is_a? Hash then
151
+
152
+ obj
153
+
154
+ elsif obj.is_a? Array
155
+
156
+ puts 'obj: ' + obj.inspect if $debug
157
+ e, macro = obj
158
+
159
+ a = e.xpath('item/*')
160
+
161
+ h2 = if a.any? then
162
+ a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
163
+ else
164
+ txt = e.text('item/description')
165
+ {url: (txt || e.text)}
166
+ end
167
+
168
+ h2.merge(macro: macro)
169
+
170
+ end
171
+
172
+ puts 'h:' + h.inspect if $debug
144
173
 
145
- h[:url_to_open] = h[:url] if h[:url]
174
+ #h[:url_to_open] = h[:url] if h[:url] and h[:url].length > 1
146
175
 
147
176
  options = {
148
- variable_to_save_response: {:m_stringValue=>"", :m_name=>"", :m_decimalValue=>0.0, :isLocal=>true, :m_booleanValue=>false, :excludeFromLog=>false, :m_intValue=>0, :m_type=>2},
177
+ variable_to_save_response: {:string_value=>"", :name=>"coords",
178
+ decimal_value: 0.0, isLocal: true, m_boolean_value: false,
179
+ excludeFromLog: false, int_value: 0, type: 2},
149
180
  url_to_open: '',
150
181
  http_get: true,
151
182
  disable_url_encode: false,
152
183
  block_next_action: false
153
184
  }
185
+
186
+ return super(options.merge h) if h[:url_to_open]
187
+
188
+ if h[:macro].remote_url.nil? and (h[:url].nil? or h[:url].empty?) then
189
+ raise OpenWebPageActionError, 'remote_url not found'
190
+ end
191
+
192
+ url = if h[:url] and h[:url].length > 1 then
193
+
194
+ h[:url]
154
195
 
155
- super(options.merge filter(options,h))
196
+ elsif h2 and h[:macro].remote_url and h[:identifier]
197
+
198
+ "%s/%s" % [h[:macro].remote_url.sub(/\/$/,''), h[:identifier]]
199
+
200
+ elsif (h[:identifier].nil? or h[:identifier].empty?)
201
+
202
+ h[:url_to_open] = h[:macro].remote_url.sub(/\/$/,'') + '/' +
203
+ h[:macro].title.downcase.gsub(/ +/,'-')
204
+
205
+ end
206
+
207
+ if h2 then
208
+
209
+ h2.delete :identifier
210
+ h2.delete :url
211
+
212
+ if h2.any? then
213
+ url += '?' + \
214
+ URI.escape(h2.map {|key,value| "%s=%s" % [key, value]}.join('&'))
215
+ end
216
+
217
+ end
218
+
219
+ h[:url_to_open] = url
220
+ super(options.merge h)
156
221
 
157
222
  end
158
223
 
224
+ def invoke()
225
+ super(url: @h[:url_to_open])
226
+ end
227
+
159
228
  def to_s(colour: false, indent: 0)
160
229
  @s = "HTTP GET\nurl: " + @h[:url_to_open]
161
230
  super()
@@ -332,9 +401,10 @@ class IfConditionAction < Action
332
401
  h2 = options.merge(filter(options,h).merge(macro: macro))
333
402
  super(h2)
334
403
 
335
- elsif obj.is_a? Rexle::Element
404
+ elsif obj.is_a? Array
405
+ e, macro = obj
336
406
  super()
337
- raw_txt = obj.text('item/description') || obj.text.to_s
407
+ raw_txt = e.text('item/description') || e.text.to_s
338
408
  puts 'raw_txt: ' + raw_txt.inspect if $debug
339
409
 
340
410
  clause = raw_txt[/^if (.*)/i,1]
@@ -368,7 +438,7 @@ class IfConditionAction < Action
368
438
  def to_s(colour: false, indent: 0)
369
439
 
370
440
  h = @h.clone
371
- h.delete :macro
441
+ #h.delete :macro
372
442
  @s = 'If '
373
443
  operator = @h[:is_or_condition] ? 'OR' : 'AND'
374
444
  constraints = @constraints.map \
@@ -448,6 +518,8 @@ class EndIfAction < Action
448
518
  obj
449
519
  elsif obj.is_a? Rexle::Element
450
520
  {}
521
+ else
522
+ {}
451
523
  end
452
524
 
453
525
 
@@ -455,7 +527,7 @@ class EndIfAction < Action
455
527
  constraint_list: []
456
528
  }
457
529
 
458
- super(options.merge h)
530
+ super()
459
531
 
460
532
  end
461
533
 
@@ -700,9 +772,10 @@ class SayTimeAction < DateTimeAction
700
772
  end
701
773
 
702
774
  def invoke()
703
- time = ($env and $env[:time]) ? $env[:time] : Time.now
775
+ #time = ($env and $env[:time]) ? $env[:time] : Time.now
776
+ time = Time.now
704
777
  tformat = @h['12_hour'] ? "%-I:%M%P" : "%H:%M"
705
- super(time.strftime(tformat))
778
+ super(txt: time.strftime(tformat))
706
779
  end
707
780
 
708
781
  def to_pc()
@@ -791,10 +864,18 @@ end
791
864
  #
792
865
  class SpeakTextAction < DeviceAction
793
866
 
794
- def initialize(h={})
795
-
867
+ def initialize(obj=nil)
868
+
869
+ h = if obj.is_a? Hash then
870
+ obj
871
+ elsif obj.is_a? Array
872
+ e, macro = obj
873
+ txt = e.text('item/description')
874
+ {text: (txt || e.text)}
875
+ end
876
+
796
877
  options = {
797
- text_to_say: '',
878
+ text_to_say: h[:text] || '',
798
879
  queue: false,
799
880
  read_numbers_individually: false,
800
881
  specify_audio_stream: false,
@@ -808,8 +889,13 @@ class SpeakTextAction < DeviceAction
808
889
 
809
890
  end
810
891
 
892
+ def invoke()
893
+ super(text: @h[:text_to_say])
894
+ end
895
+
811
896
  def to_s(colour: false, indent: 0)
812
- "Speak Text (%s)" % @h[:text_to_say]
897
+ @s = "Speak Text (%s)" % @h[:text_to_say]
898
+ super()
813
899
  end
814
900
 
815
901
  end
@@ -961,6 +1047,9 @@ class CameraFlashLightAction < DeviceSettingsAction
961
1047
  super(options.merge h)
962
1048
 
963
1049
  end
1050
+ def invoke()
1051
+ super(state: @h[:state])
1052
+ end
964
1053
 
965
1054
  def to_pc()
966
1055
  ['torch :on', 'torch :off', 'torch :toggle'][@h[:state]]
@@ -977,7 +1066,17 @@ end
977
1066
  class VibrateAction < DeviceSettingsAction
978
1067
 
979
1068
  def initialize(h={})
980
-
1069
+
1070
+ pattern = [
1071
+ 'Blip', 'Short Buzz', 'Long Buzz', 'Rapid', 'Slow', 'Increasing',
1072
+ 'Constant', 'Decreasing', 'Final Fantasy', 'Game Over', 'Star Wars',
1073
+ 'Mini Blip', 'Micro Blip'
1074
+ ]
1075
+
1076
+ if h[:pattern] then
1077
+ h[:vibrate_pattern] = pattern.map(&:downcase).index h[:pattern]
1078
+ end
1079
+
981
1080
  options = {
982
1081
  vibrate_pattern: 1
983
1082
  }
@@ -1265,7 +1364,7 @@ class ForceLocationUpdateAction < LocationAction
1265
1364
  end
1266
1365
 
1267
1366
  def to_s(colour: false, indent: 0)
1268
- 'ForceLocationUpdateAction ' + @h.inspect
1367
+ 'Force Location Update' #+ @h.inspect
1269
1368
  end
1270
1369
 
1271
1370
  alias to_summary to_s
@@ -1286,26 +1385,34 @@ end
1286
1385
  #
1287
1386
  class ShareLocationAction < LocationAction
1288
1387
 
1289
- def initialize(h={})
1388
+ def initialize(obj=nil)
1290
1389
 
1291
- super()
1390
+ h = if obj.is_a? Hash then
1391
+ obj
1392
+ elsif obj.is_a? Array
1393
+ e, macro = obj
1394
+ {variable: macro.set_var(e.text('item/description').to_s)}
1395
+
1396
+ end
1397
+
1398
+ #super()
1292
1399
 
1293
1400
  options = {
1294
1401
  email: '',
1295
- variable: {:m_stringValue=>"", :m_name=>"",
1296
- :m_decimalValue=>0.0, :isLocal=>true, :m_booleanValue=>false,
1297
- :excludeFromLog=>false, :m_intValue=>0, :m_type=>2},
1402
+ variable: {:string_value=>"", :name=>"",
1403
+ :decimal_value=>0.0, :is_local=>true, :boolean_value=>false,
1404
+ :exclude_from_log=>false, :int_value=>0, :type=>2},
1298
1405
  sim_id: 0,
1299
1406
  output_channel: 5,
1300
1407
  old_variable_format: true
1301
1408
  }
1302
-
1409
+ #options[:variable].merge! h
1303
1410
  super(options.merge h)
1304
1411
 
1305
1412
  end
1306
1413
 
1307
1414
  def to_s(colour: false, indent: 0)
1308
- @s = 'Share Location' + "\nGPS" # + @h.inspect
1415
+ @s = 'Share Location' + "\n" + @h[:variable][:name] # + @h.inspect
1309
1416
  super()
1310
1417
  end
1311
1418
 
@@ -1500,7 +1607,15 @@ end
1500
1607
  #
1501
1608
  class SetVariableAction < Action
1502
1609
 
1503
- def initialize(h={})
1610
+ def initialize(obj=nil)
1611
+
1612
+ h = if obj.is_a? Hash then
1613
+ obj
1614
+ elsif obj.is_a? Array
1615
+ e, macro = obj
1616
+ node = e.element('item/*')
1617
+ macro.set_var node.name, node.value.to_s
1618
+ end
1504
1619
 
1505
1620
  options = {
1506
1621
  :user_prompt=>true,
@@ -1508,9 +1623,21 @@ class SetVariableAction < Action
1508
1623
  :user_prompt_show_cancel=>true,
1509
1624
  :user_prompt_stop_after_cancel=>true,
1510
1625
  :user_prompt_title=>"Word reverse",
1511
- :name => 'word'
1626
+ :name => 'word',
1627
+ :false_label=>"False", :int_expression=>false, :int_random=>false,
1628
+ :int_random_max=>0, :int_random_min=>0, :int_value_decrement=>false,
1629
+ :int_value_increment=>false, :new_boolean_value=>false,
1630
+ :new_double_value=>0.0, :new_int_value=>0,
1631
+ :new_string_value=>"[battery]", :true_label=>"True",
1632
+ :user_prompt=>false, :user_prompt_show_cancel=>true,
1633
+ :user_prompt_stop_after_cancel=>true,
1634
+ :variable=>{
1635
+ :exclude_from_log=>false, :is_local=>true,
1636
+ :boolean_value=>false, :decimal_value=>0.0,
1637
+ :int_value=>0, :name=>"foo", :string_value=>"52", :type=>2
1638
+ }
1512
1639
  }
1513
- super(h)
1640
+ super(options.merge h)
1514
1641
 
1515
1642
  end
1516
1643
 
@@ -1971,11 +2098,10 @@ class ToastAction < NotificationsAction
1971
2098
 
1972
2099
  h = if obj.is_a? Hash then
1973
2100
  obj
1974
- elsif obj.is_a? Rexle::Element
1975
- txt = obj.text('item/description')
1976
- {msg: (txt || obj.text)}
1977
- else
1978
- {msg: obj}
2101
+ elsif obj.is_a? Array
2102
+ e, macro = obj
2103
+ txt = e.text('item/description')
2104
+ {msg: (txt || e.text)}
1979
2105
  end
1980
2106
 
1981
2107
  if h[:msg] then
@@ -1999,7 +2125,7 @@ class ToastAction < NotificationsAction
1999
2125
  end
2000
2126
 
2001
2127
  def invoke()
2002
- super(@h[:message_text])
2128
+ super(msg: @h[:message_text])
2003
2129
  end
2004
2130
 
2005
2131
  def to_pc()
@@ -2265,8 +2391,46 @@ end
2265
2391
  # disable keep awake => enabled: false
2266
2392
  #
2267
2393
  class KeepAwakeAction < ScreenAction
2394
+ using ColouredText
2268
2395
 
2269
- def initialize(h={})
2396
+ def initialize(obj=nil)
2397
+
2398
+
2399
+ h = if obj.is_a? Hash then
2400
+
2401
+ obj
2402
+
2403
+ elsif obj.is_a? Array
2404
+
2405
+ puts 'obj: ' + obj.inspect if $debug
2406
+ e, macro = obj
2407
+
2408
+ a = e.xpath('item/*')
2409
+
2410
+ txt = e.text('item/description')
2411
+
2412
+ h2 = if txt then
2413
+
2414
+ raw_duration = (txt || e.text).to_s
2415
+ puts 'raw_duration: ' + raw_duration.inspect
2416
+ duration = raw_duration[/Screen On - ([^$]+)/i]
2417
+ {duration: duration}
2418
+
2419
+ elsif a.any? then
2420
+ a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
2421
+ end
2422
+
2423
+ h2.merge(macro: macro)
2424
+
2425
+ end
2426
+
2427
+ puts ('h: ' + h.inspect).debug #if $debug
2428
+
2429
+ if h[:duration] then
2430
+
2431
+ h[:seconds_to_stay_awake_for] = Subunit.hms_to_seconds(h[:duration])
2432
+
2433
+ end
2270
2434
 
2271
2435
  options = {
2272
2436
  enabled: true,