ruby-macrodroid 0.9.9 → 0.9.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,252 @@
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 /^Macro Run$/i do
226
+ [ForceMacroRunAction, {}]
227
+ end
228
+
229
+ get /^Run Macro$/i do
230
+ [ForceMacroRunAction, {}]
231
+ end
232
+
233
+ get /^Set Variable$/i do
234
+ [SetVariableAction, {}]
235
+ end
236
+
237
+ get /^wait (\d+) seconds$/i do |seconds|
238
+ [PauseAction, {delay_in_seconds: seconds.to_i}]
239
+ end
240
+
241
+ # -- Screen ------------------------------------------------
242
+ #
243
+ get /^Screen (On|Off)$/i do |state|
244
+ [ScreenOnAction, {screen_off: state.downcase == 'off'}]
245
+ end
246
+
247
+ end
248
+
249
+ alias find_action run_route
250
+
251
+
252
+ end
@@ -34,7 +34,10 @@ module ObjectX
34
34
  r = ap.find_action action
35
35
  puts 'r: ' + r.inspect if debug
36
36
 
37
- if r[1].any? then
37
+ nested = description.element('item/description')
38
+ puts 'nested: ' + nested.inspect if debug
39
+
40
+ if r[1].any? and not nested then
38
41
 
39
42
  macro.add r[0].new(r[1])
40
43
 
@@ -44,7 +47,7 @@ module ObjectX
44
47
  #o = r[0].new([description, self]) if r
45
48
  index = macro.actions.length
46
49
  macro.add Action.new
47
- o = object_create(r[0],[description, macro]) if r
50
+ o = object_create(r[0],[description, macro, r[1]]) if r
48
51
  macro.actions[index] = o
49
52
  puts 'after o' if debug
50
53
  o
@@ -130,7 +133,8 @@ class MacroObject
130
133
  end
131
134
 
132
135
  def to_h()
133
-
136
+
137
+ @h.delete :macro
134
138
  hashify(@h)
135
139
 
136
140
  end
@@ -194,14 +198,15 @@ class MacroObject
194
198
  private
195
199
 
196
200
  def hashify(h)
197
- puts 'h: ' + h.inspect
201
+ #puts 'h: ' + h.inspect
198
202
  h2 = h.inject({}) do |r,x|
199
- puts 'x: ' + x.inspect #if $debug
203
+ #puts 'x: ' + x.inspect #if $debug
200
204
  key, value = x
201
- puts 'key: ' + key.inspect #if $debug
205
+ #puts 'key: ' + key.inspect #if $debug
202
206
  new_key = key.to_s.gsub(/\w_\w/){|x| x[0] + x[-1].upcase}
203
207
  new_key = new_key.prepend 'm_' unless @list.include? new_key
204
208
  new_key = 'm_SIGUID' if new_key == 'm_siguid'
209
+ new_key = 'm_SSIDList' if new_key == 'm_ssidList'
205
210
  new_val = value.is_a?(Hash) ? hashify(value) : value
206
211
  r.merge(new_key => new_val)
207
212
  end
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: constraintsnlp.rb
4
+
5
+
6
+ class ConstraintsNlp
7
+ include AppRoutes
8
+
9
+ def initialize()
10
+
11
+ super()
12
+ params = {}
13
+ constraints(params)
14
+
15
+ end
16
+
17
+ def constraints(params)
18
+
19
+ # Device State
20
+
21
+ get /^Device (locked|unlocked)/i do |state|
22
+ [DeviceLockedConstraint, {locked: state.downcase == 'locked'}]
23
+ end
24
+
25
+ get /^airplane mode (.*)/i do |state|
26
+ [AirplaneModeConstraint, {enabled: (state =~ /^enabled|on$/i) == 0}]
27
+ end
28
+
29
+ #
30
+
31
+ # -- MacroDroid specific -----------------------------------------------------------------------
32
+
33
+ get /^(\w+) (=) (.*)/i do |loperand, operator, roperand|
34
+
35
+ h = {
36
+ loperand: loperand,
37
+ operator: operator,
38
+ roperand: roperand
39
+ }
40
+
41
+ [MacroDroidVariableConstraint, h]
42
+
43
+ end
44
+
45
+ # -- Sensors -----------------------------------
46
+ #
47
+ get /^Light Sensor (Less|Greater) than (50.0)lx/i do |operator, val|
48
+
49
+ level, option = operator.downcase == 'less' ? [-1,0] : [1,1]
50
+
51
+ h = {
52
+ light_level: level,
53
+ light_level_float: val,
54
+ option: option
55
+ }
56
+
57
+ [LightLevelConstraint, h]
58
+ end
59
+
60
+ get /^Proximity Sensor: (Near|Far)/i do |distance|
61
+ [ProximitySensorConstraint, {near: distance.downcase == 'near'}]
62
+ end
63
+
64
+
65
+ # -- Screen and Speaker ---------------------------
66
+ #
67
+ get /^Screen (On|Off)/i do |state|
68
+ [ScreenOnOffConstraint, {screen_on: state.downcase == 'on'}]
69
+ end
70
+
71
+ end
72
+
73
+ alias find_constraint run_route
74
+
75
+ end
@@ -2,17 +2,12 @@
2
2
 
3
3
 
4
4
  # This file contains the following classes:
5
- #
6
- # ## Nlp classes
7
- #
8
- # TriggersNlp ActionsNlp ConstraintsNlp
9
- #
5
+ #
10
6
  # ## Macro class
11
7
  #
12
8
  # Macro
13
9
 
14
10
 
15
-
16
11
  VAR_TYPES = {
17
12
  String: [2, :string_value],
18
13
  TrueClass: [0, :boolean_value],
@@ -22,450 +17,6 @@ VAR_TYPES = {
22
17
  }
23
18
 
24
19
 
25
-
26
- class TriggersNlp
27
- include AppRoutes
28
- using ColouredText
29
-
30
- def initialize(macro=nil)
31
-
32
- super()
33
- params = {macro: macro}
34
- triggers(params)
35
-
36
- end
37
-
38
- def triggers(params)
39
-
40
- # -- Battery/Power ---------------------------------------------
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
72
-
73
- # -- Device Events ----------------------------------------------------
74
-
75
- get /^Screen[ _](On|Off)/i do |state|
76
- [ScreenOnOffTrigger, {screen_on: state.downcase == 'on'}]
77
- end
78
-
79
- # e.g. at 7:30pm daily
80
- get /^(?:at )?(\d+:\d+(?:[ap]m)?) daily/i do |time, days|
81
- [TimerTrigger, {time: time,
82
- days: %w(Mon Tue Wed Thu Fri Sat Sun).join(', ')}]
83
- end
84
-
85
- get /^(?:at )?(\d+:\d+(?:[ap]m)?) (?:on )?(.*)/i do |time, days|
86
- [TimerTrigger, {time: time, days: days}]
87
- end
88
-
89
- # time.is? 'at 18:30pm on Mon or Tue'
90
- get /^time.is\? ['"](?:at )?(\d+:\d+(?:[ap]m)?) (?:on )?(.*)['"]/i do |time, days|
91
- [TimerTrigger, {time: time, days: days.gsub(' or ',', ')}]
92
- end
93
-
94
- get /^shake[ _]device\??$/i do
95
- [ShakeDeviceTrigger, {}]
96
- end
97
-
98
- get /^Flip Device (.*)$/i do |motion|
99
- facedown = motion =~ /Face Up (?:->|to) Face Down/i
100
- [FlipDeviceTrigger, {face_down: facedown }]
101
- end
102
-
103
- get /^flip_device_down\?$/i do
104
- [FlipDeviceTrigger, {face_down: true }]
105
- end
106
-
107
- get /^flip_device_up\?$/i do
108
- [FlipDeviceTrigger, {face_down: false }]
109
- end
110
-
111
- get /^Failed Login Attempt$/i do
112
- [FailedLoginTrigger, {}]
113
- end
114
-
115
- get /^failed_login?$/i do
116
- [FailedLoginTrigger, {}]
117
- end
118
-
119
- get /^Geofence (Entry|Exit) \(([^\)]+)/i do |direction, name|
120
- enter_area = direction.downcase.to_sym == :entry
121
- [GeofenceTrigger, {name: name, enter_area: enter_area}]
122
- end
123
-
124
- get /^location (entered|exited) \(([^\)]+)/i do |direction, name|
125
- enter_area = direction.downcase.to_sym == :entered
126
- [GeofenceTrigger, {name: name, enter_area: enter_area}]
127
- end
128
-
129
- # eg. Proximity Sensor (Near)
130
- #
131
- get /^Proximity Sensor \(([^\)]+)\)/i do |distance|
132
-
133
- [ProximityTrigger, {distance: distance}]
134
- end
135
-
136
- # eg. Proximity near
137
- #
138
- get /^Proximity (near|far|slow wave|fast wave)/i do |distance|
139
-
140
- [ProximityTrigger, {distance: distance}]
141
- end
142
-
143
- get /^WebHook \(Url\)/i do
144
- [WebHookTrigger, params]
145
- end
146
-
147
- get /^WebHook/i do
148
- [WebHookTrigger, params]
149
- end
150
-
151
- get /^wh/i do
152
- [WebHookTrigger, params]
153
- end
154
-
155
- # MacroDroid specific ---------------------------------------------------------------
156
-
157
- get /^EmptyTrigger$/i do
158
- [EmptyTrigger, params]
159
- end
160
-
161
- end
162
-
163
- alias find_trigger run_route
164
-
165
- def to_s(colour: false)
166
- 'TriggersNlp ' + @h.inspect
167
- end
168
-
169
- alias to_summary to_s
170
- end
171
-
172
- class ActionsNlp
173
- include AppRoutes
174
-
175
- def initialize(macro=nil)
176
-
177
- super()
178
-
179
- params = {macro: macro}
180
- actions(params)
181
-
182
- end
183
-
184
- def actions(params)
185
-
186
- # -- Connectivity ------------------------------------------------------
187
-
188
- get /^(Enable|Disable) HotSpot/i do |state|
189
- enable, state = if state.downcase == 'enable' then
190
- [true, 0]
191
- else
192
- [false, 1]
193
- end
194
- [SetHotspotAction, {turn_wifi_on: enable, state: state }]
195
- end
196
-
197
- # e.g. message popup: hello world!
198
- get /^message popup: (.*)/i do |msg|
199
- [ToastAction, {msg: msg}]
200
- end
201
-
202
- # e.g. Popup Message 'hello world!'
203
- get /^Popup[ _]Message ['"]([^'"]+)/i do |msg|
204
- [ToastAction, {msg: msg}]
205
- end
206
-
207
- # e.g. Popup Message\n hello world!
208
- get /^Popup Message\n\s+(.*)/im do |msg|
209
- [ToastAction, {msg: msg}]
210
- end
211
-
212
- # e.g. Popup Message
213
- get /^Popup Message$/i do
214
- [ToastAction, {}]
215
- end
216
-
217
- # e.g. say current time
218
- get /^say current[ _]time/i do
219
- [SayTimeAction, {}]
220
- end
221
-
222
- get /^Torch :?(.*)/i do |onoffstate|
223
- state = %w(on off toggle).index onoffstate.downcase
224
- [CameraFlashLightAction, {state: state}]
225
- end
226
-
227
- get /^Take Picture/i do
228
- [TakePictureAction, {}]
229
- end
230
-
231
- get /^take_picture/i do
232
- [TakePictureAction, {}]
233
- end
234
-
235
- # -- DEVICE ACTIONS ------------------------------------------------------
236
-
237
- get /^Speak text \(([^\)]+)\)/i do |text|
238
- [SpeakTextAction, {text: text}]
239
- end
240
-
241
- get /^Speak text ['"]([^'"]+)/i do |text|
242
- [SpeakTextAction, {text: text}]
243
- end
244
-
245
- get /^Speak text$/i do |text|
246
- [SpeakTextAction, {}]
247
- end
248
-
249
- get /^Vibrate \(([^\)]+)/i do |pattern|
250
- [VibrateAction, {pattern: pattern}]
251
- end
252
-
253
- get /^Vibrate$/i do |pattern|
254
- [VibrateAction, {pattern: 'short buzz'}]
255
- end
256
-
257
- # e.g. Display Notification: Hi there: This is the body of the message
258
- get /^Display Notification: ([^:]+): [^$]+$/i do |subject, text|
259
- [NotificationAction, {subject: subject, text: text}]
260
- end
261
-
262
-
263
- # e.g. Enable Wifi
264
- get /^(Enable|Disable) Wifi$/i do |raw_state|
265
-
266
- state = raw_state.downcase.to_sym == :enable ? 0 : 1
267
- [SetWifiAction, {state: state}]
268
-
269
- end
270
-
271
- # e.g. Play: Altair
272
- get /^Play: (.*)$/i do |name|
273
-
274
- [PlaySoundAction, {file_path: name}]
275
-
276
- end
277
-
278
- # e.g. Launch Settings
279
- get /^Launch (.*)$/i do |application|
280
-
281
- h = {
282
- application_name: application,
283
- package_to_launch: 'com.android.' + application.downcase
284
- }
285
- [LaunchActivityAction, h]
286
-
287
- end
288
-
289
- # e.g. HTTP GET http://someurl.com/something
290
- get /^HTTP GET ([^$]+)$/i do |url|
291
-
292
- [OpenWebPageAction, url_to_open: url]
293
-
294
- end
295
-
296
- get /^HTTP GET$/i do
297
-
298
- [OpenWebPageAction, {}]
299
-
300
- end
301
-
302
- # e.g. webhook entered_kitchen
303
- #
304
- get /(?:webhook|HTTP GET) ([^$]+)$/i do |s|
305
- key = s =~ /^http/ ? :url_to_open : :identifier
306
- [OpenWebPageAction, {key => s}]
307
- end
308
-
309
- #
310
- get /^WebHook \(Url\)/i do
311
- [OpenWebPageAction, {}]
312
- end
313
-
314
- # e.g. webhook entered_kitchen
315
- #
316
- get /^webhook$/i do
317
- [OpenWebPageAction, {}, params[:macro]]
318
- end
319
-
320
- # -- Location ---------------------------------------------------------
321
-
322
- get /^Force Location Update$/i do
323
- [ForceLocationUpdateAction, params]
324
- end
325
-
326
- get /^Share Location$/i do
327
- [ShareLocationAction, {}]
328
- end
329
-
330
- #a: Keep Device Awake Screen On Until Disabled
331
- #
332
- get /Keep Device Awake Screen On Until Disabled/i do
333
- [KeepAwakeAction, {enabled: true, permanent: true, screen_option: 0}]
334
- end
335
-
336
-
337
- #a: Keep Device Awake Screen On 1h 1m 1s
338
- #
339
- get /Keep Device Awake Screen On ([^$]+)/i do |duration|
340
-
341
- a = duration.split.map(&:to_i)
342
- secs = Subunit.new(units={minutes:60, hours:60, seconds: 60}, a).to_i
343
-
344
- h = {
345
- permanent: true, screen_option: 0, seconds_to_stay_awake_for: secs
346
- }
347
- [KeepAwakeAction, h]
348
- end
349
-
350
- get /(?:Keep Device|stay) Awake$/i do
351
- [KeepAwakeAction, {}]
352
- end
353
-
354
- #a: Disable Keep Awake
355
- #
356
- get /Disable Keep Awake|stay awake off/i do
357
- [KeepAwakeAction, {enabled: false, screen_option: 0}]
358
- end
359
-
360
- #e.g a: if Airplane mode enabled
361
- #
362
- get /if (.*)/i do
363
- [IfConditionAction, {}]
364
- end
365
-
366
- get /else/i do
367
- [ElseAction, {}]
368
- end
369
-
370
- get /End If/i do
371
- [EndIfAction, {}]
372
- end
373
-
374
- # -- MacroDroid Specific ------------------------------------------------
375
- #
376
- get /^Set Variable$/i do
377
- [SetVariableAction, {}]
378
- end
379
-
380
- get /^wait (\d+) seconds$/i do |seconds|
381
- [PauseAction, {delay_in_seconds: seconds.to_i}]
382
- end
383
-
384
- # -- Screen ------------------------------------------------
385
- #
386
- get /^Screen (On|Off)$/i do |state|
387
- [ScreenOnAction, {screen_off: state.downcase == 'off'}]
388
- end
389
-
390
- end
391
-
392
- alias find_action run_route
393
-
394
-
395
- end
396
-
397
- class ConstraintsNlp
398
- include AppRoutes
399
-
400
- def initialize()
401
-
402
- super()
403
- params = {}
404
- constraints(params)
405
-
406
- end
407
-
408
- def constraints(params)
409
-
410
- # Device State
411
-
412
- get /^Device (locked|unlocked)/i do |state|
413
- [DeviceLockedConstraint, {locked: state.downcase == 'locked'}]
414
- end
415
-
416
- get /^airplane mode (.*)/i do |state|
417
- [AirplaneModeConstraint, {enabled: (state =~ /^enabled|on$/i) == 0}]
418
- end
419
-
420
- #
421
-
422
- # -- MacroDroid specific -----------------------------------------------------------------------
423
-
424
- get /^(\w+) (=) (\[?\w+\]?)/i do |loperand, operator, roperand|
425
-
426
- h = {
427
- loperand: loperand,
428
- operator: operator,
429
- roperand: roperand
430
- }
431
-
432
- [MacroDroidVariableConstraint, h]
433
-
434
- end
435
-
436
- # -- Sensors -----------------------------------
437
- #
438
- get /^Light Sensor (Less|Greater) than (50.0)lx/i do |operator, val|
439
-
440
- level, option = operator.downcase == 'less' ? [-1,0] : [1,1]
441
-
442
- h = {
443
- light_level: level,
444
- light_level_float: val,
445
- option: option
446
- }
447
-
448
- [LightLevelConstraint, h]
449
- end
450
-
451
- get /^Proximity Sensor: (Near|Far)/i do |distance|
452
- [ProximitySensorConstraint, {near: distance.downcase == 'near'}]
453
- end
454
-
455
-
456
- # -- Screen and Speaker ---------------------------
457
- #
458
- get /^Screen (On|Off)/i do |state|
459
- [ScreenOnOffConstraint, {screen_on: state.downcase == 'on'}]
460
- end
461
-
462
- end
463
-
464
- alias find_constraint run_route
465
-
466
- end
467
-
468
-
469
20
  class MacroError < Exception
470
21
  end
471
22
 
@@ -475,19 +26,21 @@ class Macro
475
26
  include ObjectX
476
27
 
477
28
  attr_reader :local_variables, :triggers, :actions, :constraints,
478
- :guid, :deviceid
29
+ :guid, :deviceid, :parent
479
30
  attr_accessor :title, :description, :remote_url, :picture_path
480
31
 
481
32
  def initialize(name=nil, geofences: nil, deviceid: nil, remote_url: nil, \
482
- picture_path: nil, debug: false)
33
+ picture_path: nil, parent: nil, debug: false)
483
34
 
484
35
  @title, @geofences, @deviceid, @debug = name, geofences, deviceid, debug
485
- @remote_url, @picture_path = remote_url, picture_path
36
+ @remote_url, @picture_path, @parent = remote_url, picture_path, parent
486
37
 
487
38
  puts 'inside Macro#initialize' if @debug
488
39
 
489
40
  @local_variables, @triggers, @actions, @constraints = {}, [], [], []
490
41
  @h = {}
42
+ @guid = generate_guid()
43
+ @enabled = true
491
44
 
492
45
  end
493
46
 
@@ -513,6 +66,18 @@ class Macro
513
66
  end
514
67
 
515
68
  end
69
+
70
+ def disable()
71
+ @enabled = false
72
+ end
73
+
74
+ def enable()
75
+ @enabled = true
76
+ end
77
+
78
+ def enabled?()
79
+ @enabled
80
+ end
516
81
 
517
82
  def to_h()
518
83
 
@@ -529,9 +94,9 @@ class Macro
529
94
  m_description: '',
530
95
  m_name: title(),
531
96
  m_excludeLog: false,
532
- m_GUID: guid(),
97
+ m_GUID: @guid,
533
98
  m_isOrCondition: false,
534
- m_enabled: true,
99
+ m_enabled: @enabled,
535
100
  m_descriptionOpen: false,
536
101
  m_headingColor: 0
537
102
  }
@@ -548,6 +113,7 @@ class Macro
548
113
  puts 'h:' + h.inspect
549
114
  end
550
115
 
116
+ @guid = h[:guid]
551
117
  @category = h[:category]
552
118
  @title = h[:name]
553
119
  @description = h[:description]
@@ -702,7 +268,7 @@ class Macro
702
268
  r = tp.find_trigger trigger
703
269
  puts 'r: ' + r.inspect if @debug
704
270
  #o = r[0].new([description, self]) if r
705
- o = object_create(r[0], [description, self]) if r
271
+ o = object_create(r[0], [description, self, r[1]]) if r
706
272
  puts 'after o' if @debug
707
273
  o
708
274
 
@@ -748,7 +314,6 @@ class Macro
748
314
 
749
315
  end
750
316
 
751
-
752
317
 
753
318
  ap = ActionsNlp.new self
754
319
 
@@ -791,7 +356,7 @@ class Macro
791
356
 
792
357
  end
793
358
 
794
- def match?(triggerx, detail={time: $env[:time]}, model=nil )
359
+ def match?(triggerx, detail={}, model=nil )
795
360
 
796
361
  if @triggers.any? {|x| x.type == triggerx and x.match?(detail, model) } then
797
362
 
@@ -922,8 +487,6 @@ EOF
922
487
  s = x.to_s(colour: colour)
923
488
  #puts 's: ' + s.inspect
924
489
 
925
-
926
-
927
490
  r = if indent <= 0 then
928
491
 
929
492
  lines = s.lines
@@ -976,9 +539,6 @@ EOF
976
539
 
977
540
  end.join("\n")
978
541
 
979
-
980
-
981
-
982
542
  a << actions
983
543
 
984
544
 
@@ -989,10 +549,6 @@ EOF
989
549
  end.join("\n")
990
550
  end
991
551
 
992
-
993
-
994
-
995
-
996
552
  a.join("\n") + "\n"
997
553
 
998
554
  end
@@ -1036,8 +592,8 @@ EOF
1036
592
 
1037
593
  private
1038
594
 
1039
- def guid()
1040
- '-' + rand(1..9).to_s + 18.times.map { rand 9 }.join
595
+ def generate_guid()
596
+ ('-' + rand(1..9).to_s + 18.times.map { rand 9 }.join).to_i
1041
597
  end
1042
598
 
1043
599
  def object(h={})
@@ -1059,9 +615,6 @@ EOF
1059
615
 
1060
616
  end
1061
617
 
1062
- end
1063
-
1064
-
1065
-
618
+ end
1066
619
 
1067
620
  end