ruby-macrodroid 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/ruby-macrodroid.rb +0 -271
- data/lib/ruby-macrodroid/actions.rb +67 -17
- data/lib/ruby-macrodroid/triggers.rb +18 -6
- 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: 37e8014bb2ccd71ffd2da90197a1dd1a89c7e8e6bbbfc7ed88e9cfbff07925a1
|
4
|
+
data.tar.gz: f2d4910bb6893249e33eb7c4326ea733188ecef67ec94f808cd25ef6c97760d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06015fe764a0450838ad49b6dbebba46afc32ec49673dbf4e1bce9b07e04aaea1850153cf2c0b1d56e740dd2cbcf4653f92878ee99680d7c3f2eaacf1fffb69e
|
7
|
+
data.tar.gz: df0c2950bcae690d137b294825c95579f8530fea24cabfe371809efff64343d4e9ffd71b5f2378c7938bc214dfc0e409892947ad03a86ef4438816fafa11000a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/ruby-macrodroid.rb
CHANGED
@@ -44,275 +44,6 @@ device
|
|
44
44
|
airplane_mode is disabled
|
45
45
|
EOF
|
46
46
|
|
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(macro=nil)
|
145
|
-
|
146
|
-
super()
|
147
|
-
params = {macro: macro}
|
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 |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]
|
247
|
-
end
|
248
|
-
|
249
|
-
#a: Keep Device Awake Screen On Until Disabled
|
250
|
-
#
|
251
|
-
get /Keep Device Awake Screen On Until Disabled/i do
|
252
|
-
[KeepAwakeAction, {enabled: true, permanent: true, screen_option: 0}]
|
253
|
-
end
|
254
|
-
|
255
|
-
|
256
|
-
#a: Keep Device Awake Screen On 1h 1m 1s
|
257
|
-
#
|
258
|
-
get /Keep Device Awake Screen On ([^$]+)/i do |duration|
|
259
|
-
|
260
|
-
a = duration.split.map(&:to_i)
|
261
|
-
secs = Subunit.new(units={minutes:60, hours:60, seconds: 60}, a).to_i
|
262
|
-
|
263
|
-
h = {
|
264
|
-
permanent: true, screen_option: 0, seconds_to_stay_awake_for: secs
|
265
|
-
}
|
266
|
-
[KeepAwakeAction, h]
|
267
|
-
end
|
268
|
-
|
269
|
-
#a: Disable Keep Awake
|
270
|
-
#
|
271
|
-
get /Disable Keep Awake/i do
|
272
|
-
[KeepAwakeAction, {enabled: false, screen_option: 0}]
|
273
|
-
end
|
274
|
-
|
275
|
-
#e.g a: if Airplane mode enabled
|
276
|
-
#
|
277
|
-
get /if (.*)/i do
|
278
|
-
[IfConditionAction, {}]
|
279
|
-
end
|
280
|
-
|
281
|
-
get /End If/i do
|
282
|
-
[EndIfAction, {}]
|
283
|
-
end
|
284
|
-
|
285
|
-
end
|
286
|
-
|
287
|
-
alias find_action run_route
|
288
|
-
|
289
|
-
|
290
|
-
end
|
291
|
-
|
292
|
-
class ConstraintsNlp
|
293
|
-
include AppRoutes
|
294
|
-
|
295
|
-
def initialize()
|
296
|
-
|
297
|
-
super()
|
298
|
-
params = {}
|
299
|
-
constraints(params)
|
300
|
-
|
301
|
-
end
|
302
|
-
|
303
|
-
def constraints(params)
|
304
|
-
|
305
|
-
get /^airplane mode (.*)/i do |state|
|
306
|
-
[AirplaneModeConstraint, {enabled: (state =~ /^enabled|on$/i) == 0}]
|
307
|
-
end
|
308
|
-
|
309
|
-
end
|
310
|
-
|
311
|
-
alias find_constraint run_route
|
312
|
-
|
313
|
-
end
|
314
|
-
|
315
|
-
|
316
47
|
module Params
|
317
48
|
|
318
49
|
refine Hash do
|
@@ -368,8 +99,6 @@ end
|
|
368
99
|
|
369
100
|
|
370
101
|
|
371
|
-
|
372
|
-
|
373
102
|
class MacroDroidError < Exception
|
374
103
|
end
|
375
104
|
|
@@ -143,17 +143,32 @@ end
|
|
143
143
|
#
|
144
144
|
class OpenWebPageAction < ApplicationAction
|
145
145
|
|
146
|
-
def initialize(obj={})
|
146
|
+
def initialize(obj={}, macro=nil)
|
147
147
|
|
148
148
|
h = if obj.is_a? Hash then
|
149
|
+
|
149
150
|
obj
|
151
|
+
|
150
152
|
elsif obj.is_a? Array
|
153
|
+
puts 'obj: ' + obj.inspect if @debug
|
151
154
|
e, macro = obj
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
+
|
156
|
+
a = e.xpath('item/*')
|
157
|
+
|
158
|
+
h2 = if a.any? then
|
159
|
+
a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
|
160
|
+
else
|
161
|
+
txt = e.text('item/description')
|
162
|
+
{url: (txt || e.text)}
|
163
|
+
end
|
164
|
+
|
165
|
+
h2.merge(macro: macro)
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
puts 'h:' + h.inspect if @debug
|
155
170
|
|
156
|
-
h[:url_to_open] = h[:url] if h[:url]
|
171
|
+
h[:url_to_open] = h[:url] if h[:url] and h[:url].length > 1
|
157
172
|
|
158
173
|
options = {
|
159
174
|
variable_to_save_response: {:m_stringValue=>"", :m_name=>"",
|
@@ -165,20 +180,35 @@ class OpenWebPageAction < ApplicationAction
|
|
165
180
|
block_next_action: false
|
166
181
|
}
|
167
182
|
|
168
|
-
if h[:macro].remote_url.nil?
|
183
|
+
if h[:macro].remote_url.nil? and (h[:url_to_open].nil? or
|
184
|
+
h[:url_to_open].empty?) then
|
169
185
|
raise OpenWebPageActionError, 'remote_url not found'
|
170
186
|
end
|
171
187
|
|
172
188
|
if (h[:identifier].nil? or h[:identifier].empty?) and
|
173
189
|
(h[:url_to_open].nil? or h[:url_to_open].empty?) then
|
190
|
+
|
174
191
|
h[:url_to_open] = h[:macro].remote_url.sub(/\/$/,'') + '/' +
|
175
192
|
h[:macro].title.downcase.gsub(/ +/,'-')
|
176
|
-
|
193
|
+
|
194
|
+
elsif h2 and h[:macro].remote_url and h[:identifier]
|
195
|
+
|
196
|
+
url = "%s/%s" % [h[:macro].remote_url.sub(/\/$/,''), h[:identifier]]
|
197
|
+
h2.delete :identifier
|
198
|
+
url += '?' + \
|
199
|
+
URI.escape(h2.map {|key,value| "%s=%s" % [key, value]}.join('&'))
|
200
|
+
h[:url_to_open] = url
|
201
|
+
|
202
|
+
end
|
177
203
|
|
178
204
|
super(options.merge h)
|
179
205
|
|
180
206
|
end
|
181
207
|
|
208
|
+
def invoke()
|
209
|
+
super(url: @h[:url_to_open])
|
210
|
+
end
|
211
|
+
|
182
212
|
def to_s(colour: false, indent: 0)
|
183
213
|
@s = "HTTP GET\nurl: " + @h[:url_to_open]
|
184
214
|
super()
|
@@ -355,9 +385,10 @@ class IfConditionAction < Action
|
|
355
385
|
h2 = options.merge(filter(options,h).merge(macro: macro))
|
356
386
|
super(h2)
|
357
387
|
|
358
|
-
elsif obj.is_a?
|
388
|
+
elsif obj.is_a? Array
|
389
|
+
e, macro = obj
|
359
390
|
super()
|
360
|
-
raw_txt =
|
391
|
+
raw_txt = e.text('item/description') || e.text.to_s
|
361
392
|
puts 'raw_txt: ' + raw_txt.inspect if $debug
|
362
393
|
|
363
394
|
clause = raw_txt[/^if (.*)/i,1]
|
@@ -391,7 +422,7 @@ class IfConditionAction < Action
|
|
391
422
|
def to_s(colour: false, indent: 0)
|
392
423
|
|
393
424
|
h = @h.clone
|
394
|
-
h.delete :macro
|
425
|
+
#h.delete :macro
|
395
426
|
@s = 'If '
|
396
427
|
operator = @h[:is_or_condition] ? 'OR' : 'AND'
|
397
428
|
constraints = @constraints.map \
|
@@ -471,6 +502,8 @@ class EndIfAction < Action
|
|
471
502
|
obj
|
472
503
|
elsif obj.is_a? Rexle::Element
|
473
504
|
{}
|
505
|
+
else
|
506
|
+
{}
|
474
507
|
end
|
475
508
|
|
476
509
|
|
@@ -478,7 +511,7 @@ class EndIfAction < Action
|
|
478
511
|
constraint_list: []
|
479
512
|
}
|
480
513
|
|
481
|
-
super(
|
514
|
+
super()
|
482
515
|
|
483
516
|
end
|
484
517
|
|
@@ -723,9 +756,10 @@ class SayTimeAction < DateTimeAction
|
|
723
756
|
end
|
724
757
|
|
725
758
|
def invoke()
|
726
|
-
time = ($env and $env[:time]) ? $env[:time] : Time.now
|
759
|
+
#time = ($env and $env[:time]) ? $env[:time] : Time.now
|
760
|
+
time = Time.now
|
727
761
|
tformat = @h['12_hour'] ? "%-I:%M%P" : "%H:%M"
|
728
|
-
super(time.strftime(tformat))
|
762
|
+
super(txt: time.strftime(tformat))
|
729
763
|
end
|
730
764
|
|
731
765
|
def to_pc()
|
@@ -814,10 +848,18 @@ end
|
|
814
848
|
#
|
815
849
|
class SpeakTextAction < DeviceAction
|
816
850
|
|
817
|
-
def initialize(
|
818
|
-
|
851
|
+
def initialize(obj=nil)
|
852
|
+
|
853
|
+
h = if obj.is_a? Hash then
|
854
|
+
obj
|
855
|
+
elsif obj.is_a? Array
|
856
|
+
e, macro = obj
|
857
|
+
txt = e.text('item/description')
|
858
|
+
{text: (txt || e.text)}
|
859
|
+
end
|
860
|
+
|
819
861
|
options = {
|
820
|
-
text_to_say: '',
|
862
|
+
text_to_say: h[:text] || '',
|
821
863
|
queue: false,
|
822
864
|
read_numbers_individually: false,
|
823
865
|
specify_audio_stream: false,
|
@@ -831,8 +873,13 @@ class SpeakTextAction < DeviceAction
|
|
831
873
|
|
832
874
|
end
|
833
875
|
|
876
|
+
def invoke()
|
877
|
+
super(text: @h[:text_to_say])
|
878
|
+
end
|
879
|
+
|
834
880
|
def to_s(colour: false, indent: 0)
|
835
|
-
"Speak Text (%s)" % @h[:text_to_say]
|
881
|
+
@s = "Speak Text (%s)" % @h[:text_to_say]
|
882
|
+
super()
|
836
883
|
end
|
837
884
|
|
838
885
|
end
|
@@ -984,6 +1031,9 @@ class CameraFlashLightAction < DeviceSettingsAction
|
|
984
1031
|
super(options.merge h)
|
985
1032
|
|
986
1033
|
end
|
1034
|
+
def invoke()
|
1035
|
+
super(state: @h[:state])
|
1036
|
+
end
|
987
1037
|
|
988
1038
|
def to_pc()
|
989
1039
|
['torch :on', 'torch :off', 'torch :toggle'][@h[:state]]
|
@@ -1393,8 +1393,21 @@ end
|
|
1393
1393
|
#
|
1394
1394
|
class ProximityTrigger < SensorsTrigger
|
1395
1395
|
|
1396
|
-
def initialize(
|
1396
|
+
def initialize(obj=nil)
|
1397
1397
|
|
1398
|
+
h = if obj.is_a? Hash then
|
1399
|
+
obj
|
1400
|
+
elsif obj.is_a? Array
|
1401
|
+
e, macro = obj
|
1402
|
+
txt = e.text('item/description')
|
1403
|
+
{option: (txt || e.text), macro: macro}
|
1404
|
+
end
|
1405
|
+
|
1406
|
+
options = {
|
1407
|
+
near: true,
|
1408
|
+
selected_option: 0
|
1409
|
+
}
|
1410
|
+
|
1398
1411
|
if h[:distance] then
|
1399
1412
|
|
1400
1413
|
case h[:distance].to_sym
|
@@ -1403,15 +1416,14 @@ class ProximityTrigger < SensorsTrigger
|
|
1403
1416
|
end
|
1404
1417
|
end
|
1405
1418
|
|
1406
|
-
options = {
|
1407
|
-
near: true,
|
1408
|
-
selected_option: 0
|
1409
|
-
}
|
1410
|
-
|
1411
1419
|
super(options.merge h)
|
1412
1420
|
|
1413
1421
|
end
|
1414
1422
|
|
1423
|
+
def match?(detail={}, model=nil)
|
1424
|
+
@h[:selected_option] == detail[:option].to_i
|
1425
|
+
end
|
1426
|
+
|
1415
1427
|
def to_s(colour: false)
|
1416
1428
|
|
1417
1429
|
distance = if @h[:near] then
|
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.1
|
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-03 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: glw
|
metadata.gz.sig
CHANGED
Binary file
|