remotedroid 0.4.4 → 0.5.4

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: 4599f668ded4ccead69bcab55ac94e081027b1054b4053ee2cb2f142303a7b01
4
- data.tar.gz: cdbcb98bab0dd3df0d8252892ce5c44c7ed26332803a89292357b04f2f26a9e4
3
+ metadata.gz: 667844020454a5bcfa4e47c7db865a9e1cfc70364da42840c8f6d4d1a6d4b021
4
+ data.tar.gz: 9058f9b6b4206cbf42e8c10ebdba4825bab4c1dcc9da477120bd6e09758af97c
5
5
  SHA512:
6
- metadata.gz: 636856536a64d87445c01d3e2b320ccf0fbfed713a6ba4384a19947b182f33bee281a6ae1e191237ed5f74e0995c6460f21108cb4a578b6ea406ecab0921b0c9
7
- data.tar.gz: a650ca4d116ccba5251cd1e9f489587d8ebd5f33c7e8c106a8e59c0817187511d26d2d01aac92d88b27ee0efb07b9cad9eb4a6d7da0abace184f174550a3762e
6
+ metadata.gz: 116782fbe0c6da9a938e3eeb59961189893fe6221bbdf7fd77d626ab374ab786480c977e0c6b847652e1f1e47b9300c160275cdec8241686209c7a10e190a7ea
7
+ data.tar.gz: 3521f559ef0febc0f37ce17aa174900ed8697dea131cbfec68db40fa6841d075930c972dfb33f2f4b8cd951d24054a3c7660c5daea5e54d0f38978444872630b
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -8,20 +8,36 @@ require 'app-routes'
8
8
  require 'sps-sub'
9
9
  require 'ruby-macrodroid'
10
10
 
11
+ # PASTE_START
11
12
 
12
13
  # Here's what's available so far:
13
14
  #
14
15
  # # Triggers
15
16
  #
17
+ # ## Battery/Power
18
+ #
19
+ # * Power button toggle
20
+ #
21
+ # ## Connectivity
22
+ #
23
+ # ### Wifi State Change
24
+ #
25
+ # * Connected to Network
26
+ #
16
27
  # ## Device Events
17
28
  #
18
29
  # * screen on
19
30
  #
20
31
  # ## Sensors
21
- #
32
+ #
33
+ # * Activity Recognition
22
34
  # * proximity (near)
23
35
  # * shake device
24
36
  #
37
+ # ## User Input
38
+ #
39
+ # * Swipe Screen
40
+ #
25
41
  # ------------------------------------
26
42
  #
27
43
  # # Actions
@@ -48,6 +64,10 @@ require 'ruby-macrodroid'
48
64
  #
49
65
  # * Share Location
50
66
  #
67
+ # ## MacroDroid specific
68
+ #
69
+ # * Disable Macro
70
+ #
51
71
  # ## Media
52
72
  #
53
73
  # * Play sound (Doda)
@@ -177,6 +197,66 @@ m: stay awake off
177
197
  t: webhook
178
198
  a: stay awake off
179
199
 
200
+ m: Launch Google Play Music
201
+ t: webhook
202
+ a: Launch Google Play Music
203
+
204
+
205
+ m: Media Next
206
+ t: webhook
207
+ a:
208
+ Media Next
209
+ Simulate Media Button (Google Play Music)
210
+
211
+ m: Media Pause
212
+ t: webhook
213
+ a:
214
+ Media Pause
215
+ Simulate Media Button (Google Play Music)
216
+
217
+ m: Media Play
218
+ t: webhook
219
+ a:
220
+ Media Play
221
+ Simulate Media Button (Google Play Music)
222
+
223
+ m: Media Play Pause
224
+ t: webhook
225
+ a:
226
+ Media Play/Pause
227
+ Simulate Media Button (Google Play Music)
228
+
229
+ m: Media Previous
230
+ t: webhook
231
+ a:
232
+ Media Previous
233
+ Simulate Media Button (Google Play Music)
234
+
235
+ m: Media Stop
236
+ t: webhook
237
+ a:
238
+ Media Stop
239
+ Simulate Media Button (Google Play Music)
240
+
241
+ m: Open website
242
+ v: url
243
+ t: webhook
244
+ a: goto [lv=url]
245
+
246
+ m: Fill clipboard
247
+ v: clipboard
248
+ t: webhook
249
+ a:
250
+ Fill Clipboard
251
+ [lv=clipboard]
252
+
253
+ m: click text content
254
+ v: content
255
+ t: webhook
256
+ a:
257
+ UI Interaction
258
+ Click [[lv=content]]
259
+
180
260
  m: Share location
181
261
  t:
182
262
  WebHook
@@ -189,7 +269,16 @@ a:
189
269
  HTTP GET
190
270
  identifier: location
191
271
  coords: [lv=coords]
272
+ cell: [cell_id]
273
+ ssid: [ssid]
274
+ alt: [last_loc_alt]
275
+ time: [last_loc_age_timestamp]
276
+ mph: [last_loc_speed_mph]
277
+ kph: [last_loc_speed_kmh]
278
+ device: [device_model]
279
+ battery: [battery]
192
280
  type: query
281
+
193
282
 
194
283
  m: query
195
284
  t: WebHook
@@ -247,613 +336,157 @@ m: Power connected
247
336
  t: Power Connected: Any
248
337
  a: webhook
249
338
 
250
- m: screen on off
339
+ m: Screen on
251
340
  t: screen on
252
- a: webhook
253
-
254
- EOF
255
-
256
- =begin
257
- m: Screen
258
- v: on: true
259
- t: WebHook
260
341
  a:
261
- If on = true
262
- Screen On
263
- Else
264
- Screen Off
265
- End If
266
-
267
- =end
268
-
269
- module RemoteDroid
270
-
271
- class Model
272
- include AppRoutes
273
-
274
- def initialize(obj=nil, root: 'device1', debug: false)
275
-
276
- super()
277
- @root, @debug = root, debug
278
- @location = nil
279
-
280
- if obj then
281
-
282
- s = obj.strip
283
-
284
- puts 's: ' + s.inspect if @debug
285
-
286
- if s[0] == '<' or s.lines[1][0..1] == ' ' then
287
-
288
- puts 'before easydom' if @debug
289
-
290
- s2 = if s.lines[1][0..1] == ' ' then
291
-
292
- lines = s.lines.map do |line|
293
- line.sub(/(\w+) +is +(\w+)$/) {|x| "#{$1} {switch: #{$2}}" }
294
- end
295
-
296
- lines.join
297
-
298
- else
299
- s
300
- end
301
-
302
- @ed = EasyDom.new(s2)
303
- else
304
- build(s, root: root)
305
- end
306
-
307
- end
308
-
309
- end
310
-
311
- def build(raw_requests, root: @root)
312
-
313
- @ed = EasyDom.new(debug: false, root: root)
314
- raw_requests.lines.each {|line| request(line) }
315
-
316
- end
317
-
318
-
319
- def get_thing(h)
320
-
321
- h[:thing].gsub!(/ /,'_')
322
-
323
- if not h.has_key? :location then
324
- location = false
325
- h[:location] = find_path(h[:thing])
326
- else
327
- location = true
328
- end
329
-
330
- puts 'h: ' + h.inspect if @debug
331
-
332
- a = []
333
- a += h[:location].split(/ /)
334
- a << h[:thing]
335
- status = a.inject(@ed) {|r,x| r.send(x)}.send(h[:action])
336
-
337
- if location then
338
- "The %s %s is %s." % [h[:location], h[:thing], status]
339
- else
340
- "%s is %s." % [h[:thing].capitalize, status]
341
- end
342
-
343
- end
344
-
345
- # Object Property (op)
346
- # Helpful for accessing properites in dot notation
347
- # e.g. op.livingroom.light.switch = 'off'
348
- #
349
- def op()
350
- @ed
351
- end
352
-
353
- def query(s)
354
- @ed.e.element(s)
355
- end
356
-
357
- # request accepts a string in plain english
358
- # e.g. request 'switch the livingroom light on'
359
- #
360
- def request(s)
361
-
362
- params = {request: s}
363
- requests(params)
364
- h = find_request(s)
365
-
366
- method(h.first[-1]).call(h).gsub(/_/,' ')
367
-
368
- end
369
-
370
- def set_thing(h)
371
-
372
- h[:thing].gsub!(/ /,'_')
373
- h[:location] = find_path(h[:thing]) unless h.has_key? :location
374
-
375
- a = []
376
- a += h[:location].split(/ /)
377
- a << h[:thing]
378
-
379
- a.inject(@ed) {|r,x| r.send(x)}.send(h[:action], h[:value])
380
-
381
- end
382
-
383
- def to_sliml(level: 0)
384
-
385
- s = @ed.to_sliml
386
-
387
- return s if level.to_i > 0
388
-
389
- lines = s.lines.map do |line|
390
-
391
- line.sub(/\{[^\}]+\}/) do |x|
392
-
393
- a = x.scan(/\w+: +[^ ]+/)
394
- if a.length == 1 and x[/switch:/] then
395
-
396
- val = x[/(?<=switch: ) *["']([^"']+)/,1]
397
- 'is ' + val
398
- else
399
- x
400
- end
401
-
402
- end
403
- end
404
-
405
- lines.join
406
-
407
- end
408
-
409
- def to_xml(options=nil)
410
- @ed.xml(pretty: true).gsub(' style=\'\'','')
411
- end
412
-
413
- alias xml to_xml
414
-
415
- # to_xml() is the preferred method
416
-
417
- protected
418
-
419
- def requests(params)
420
-
421
- # e.g. switch the livingroom gas_fire off
422
- #
423
- get /(?:switch|turn) the ([^ ]+) +([^ ]+) +(on|off)$/ do |location, device, onoff|
424
- {type: :set_thing, action: 'switch=', location: location, thing: device, value: onoff}
425
- end
426
-
427
- # e.g. switch the gas _fire off
428
- #
429
- get /(?:switch|turn) the ([^ ]+) +(on|off)$/ do |device, onoff|
430
- {type: :set_thing, action: 'switch=', thing: device, value: onoff}
431
- end
432
-
433
- # e.g. is the livingroom gas_fire on?
434
- #
435
- get /is the ([^ ]+) +([^ ]+) +(?:on|off)\??$/ do |location, device|
436
- {type: :get_thing, action: 'switch', location: location, thing: device}
437
- end
438
-
439
- # e.g. enable airplane mode
440
- #
441
- get /((?:dis|en)able) ([^$]+)$/ do |state, service|
442
- {type: :set_thing, action: 'switch=', thing: service, value: state + 'd'}
443
- end
444
-
445
- # e.g. switch airplane mode off
446
- #
447
- get /switch (.*) (on|off)/ do |service, rawstate|
448
-
449
- state = rawstate == 'on' ? 'enabled' : 'disabled'
450
- {type: :set_thing, action: 'switch=', thing: service, value: state}
451
-
452
- end
453
-
454
- # e.g. is airplane mode enabed?
455
- #
456
- get /is (.*) +(?:(?:dis|en)abled)\??$/ do |service|
457
- {type: :get_thing, action: 'switch', thing: service.gsub(/ /,'_')}
458
- end
459
-
460
- # e.g. is the gas_fire on?
461
- #
462
- get /is the ([^ ]+) +(?:on|off)\??$/ do |device|
463
- location = find_path(device)
464
- {type: :get_thing, action: 'switch', location: location, thing: device}
465
- end
466
-
467
- # e.g. fetch the livingroom temperature reading
468
- #
469
- get /fetch the ([^ ]+) +([^ ]+) +(?:reading)$/ do |location, device|
470
- {type: :get_thing, action: 'reading', location: location, thing: device}
471
- end
472
-
473
- # e.g. fetch the temperature reading
474
- #
475
- get /fetch the ([^ ]+) +(?:reading)$/ do |device|
476
- location = find_path(device)
477
- {type: :get_thing, action: 'reading', location: location, thing: device}
478
- end
479
-
480
- end
481
-
482
- private
483
-
484
- def find_path(s)
485
- puts 'find_path s: ' + s.inspect if @debug
486
- found = query('//'+ s)
487
- return unless found
488
- a = found.backtrack.to_xpath.split('/')
489
- a[1..-2].join(' ')
490
- end
491
-
492
- alias find_request run_route
493
-
494
- end
495
-
496
- class Controller
497
-
498
- attr_reader :model, :control
499
- attr_accessor :title, :macros, :store
500
-
501
- def initialize(mcs, model=MODEL, deviceid: nil, debug: false)
502
-
503
- @debug = debug
504
- @syslog = []
505
-
506
- @control = Control.new(deviceid)
507
- @macros = mcs.macros
508
-
509
- if model then
510
- @model = Model.new(model)
511
- end
512
-
513
- @store = {}
514
- @query = Query.new(self)
515
-
516
- end
517
-
518
- def export(s)
519
- @macros = MacroDroid.new(s).macros
520
- end
521
-
522
- def invoke(name, options={})
523
-
524
- if @control.respond_to? name.to_sym then
525
- @control.method(name.to_sym).call(options)
526
- else
527
- @control.http_exec name.to_sym, options
528
- end
529
- end
530
-
531
- # Object Property (op)
532
- # Helpful for accessing properites in dot notation
533
- # e.g. op.livingroom.light.switch = 'off'
534
- #
535
- def op()
536
- @model.op
537
- end
538
-
539
- def query(id=nil)
540
-
541
- return @query unless id
542
-
543
- @store[id] = nil
342
+ webhook
343
+ identifier: screen_on_off
344
+ screen_on: true
544
345
 
545
- sys = %i(accelerometer_rotation)
546
-
547
- global = [:airplane_mode_on, :bluetooth_on, :cell_on, :device_name, \
548
- :usb_mass_storage_enabled, :wifi_on]
549
-
550
- secure = %i(bluetooth_name flashlight_enabled)
346
+ m: Power Button Toggle3
347
+ t: Power Button Toggle (3)
348
+ a: webhook
551
349
 
552
-
553
- # send http request via macrodroid.com API
554
-
555
- if id.downcase.to_sym == :location then
556
- @control.http_exec id
557
- elsif sys.include? id
558
- @control.http_exec :'query-setting-system', {qvar: id}
559
- elsif global.include? id
560
- @control.http_exec :'query-setting-global', {qvar: id}
561
- elsif secure.include? id
562
- @control.http_exec :'query-setting-secure', {qvar: id}
563
- elsif id.downcase.to_sym == :'take-picture'
564
- @control.http_exec id
565
- else
566
- @control.http_exec :query, {qvar: id}
567
- end
568
-
569
- # wait for the local variable to be updated
570
- # timeout after 5 seoncds
571
- t = Time.now
572
-
573
- begin
574
- sleep 1
575
- end until @store[id] or Time.now > t + 10
576
-
577
- return {warning: 'HTTP response timeout'} if Time.now > t+5
578
-
579
- return @store[id]
350
+ m: Power Button Toggle4
351
+ t: Power Button Toggle (4)
352
+ a: webhook
580
353
 
581
-
582
- end
583
-
584
- def request(s)
585
- @model.request s
586
- end
587
-
588
-
589
- def trigger(name, detail={time: Time.now})
590
-
591
- macros = @macros.select do |macro|
592
-
593
- puts 'macro: ' + macro.inspect if @debug
354
+ m: Power Button Toggle5
355
+ t: Power Button Toggle (5)
356
+ a: webhook
594
357
 
595
- # fetch the associated properties from the model if possible and
596
- # merge them into the detail.
597
- #
598
- valid_trigger = macro.match?(name, detail, @model.op)
599
-
600
- puts 'valid_trigger: ' + valid_trigger.inspect if @debug
601
-
602
- if valid_trigger then
603
- @syslog << [Time.now, :trigger, name]
604
- @syslog << [Time.now, :macro, macro.title]
605
- end
606
-
607
- valid_trigger
608
-
609
- end
610
-
611
- puts 'macros: ' + macros.inspect if @debug
612
-
613
- macros.flat_map(&:run)
614
- end
615
-
616
- alias trigger_fired trigger
617
-
618
- def update(id, val)
619
-
620
- key = if %i(location take-picture).include? id
621
- id
622
- else
623
- val.keys.first.to_sym
624
- end
625
-
626
- @store[key] = val
627
- end
628
-
629
- end
358
+ m: Connected to network
359
+ t:
360
+ Connected to network
361
+ Any Network
362
+ a: wait 2 seconds
363
+ a:
364
+ webhook
365
+ ssid: [ssid]
630
366
 
631
- class Service
632
- def initialize(callback)
633
- @callback = callback
634
- end
635
- end
636
-
637
- class Bluetooth
638
- def enable()
639
- end
640
- end
641
-
642
- class Toast < Service
643
-
644
- def invoke()
645
- @callback.call :toast
646
- end
647
-
648
- end
649
-
650
- class Torch < Service
651
-
652
- def toggle()
653
- @callback.http_exec :torch
654
- end
655
-
656
- end
657
-
658
- class ControlHelper
659
-
660
- def initialize(callback)
661
- @callback
662
- end
663
- end
367
+ m: In Vehicle
368
+ t:
369
+ Activity - In Vehicle
370
+ Confidence >= 50%
371
+ a:
372
+ webhook
373
+ identifier: activity
374
+ index: 0
664
375
 
665
- class Control
666
-
667
- def initialize(dev=nil, deviceid: dev, remote_url: nil, debug: false)
668
-
669
- @deviceid, @remote_url, @debug = deviceid, remote_url, debug
670
- @torch = Torch.new(self)
671
- end
672
-
673
- def bluetooth()
674
- @bluetooth
675
- end
676
-
677
- def camera_flash_light(options={})
678
- http_exec 'camera-flash-light', options
679
- end
376
+ m: On Bicycle
377
+ t:
378
+ Activity - On Bicycle
379
+ Confidence >= 50%
380
+ a:
381
+ webhook
382
+ identifier: activity
383
+ index: 1
680
384
 
681
- def hotspot(state=nil)
682
-
683
- if state then
684
- http_exec 'hotspot', {enable: state == :enable}
685
- else
385
+ m: Running
386
+ t:
387
+ Activity - Running
388
+ Confidence >= 50%
389
+ a:
390
+ webhook
391
+ identifier: activity
392
+ index: 2
686
393
 
687
- def self.enable()
688
- http_exec 'hotspot', {enable: true}
689
- end
690
-
691
- def self.on()
692
- self.enable
693
- end
694
-
695
- def self.disable()
696
- http_exec 'hotspot', {enable: false}
697
- end
698
-
699
- def self.off()
700
- self.disable
701
- end
702
-
703
- self
704
-
705
- end
706
- end
707
-
708
- def http_exec(command, options={})
709
-
710
- url = "https://trigger.macrodroid.com/%s/%s" % [@deviceid, command]
711
-
712
- if options and options.any? then
713
- h = options
714
- url += '?' + \
715
- URI.escape(h.map {|key,value| "%s=%s" % [key, value]}.join('&'))
716
- end
717
-
718
- s = open(url).read
719
-
720
- end
721
-
722
- def location(options={})
723
- http_exec 'location'
724
- end
725
-
726
- def say_current_time(options={})
727
- http_exec 'say-current-time'
728
- end
729
-
730
- alias say_time say_current_time
731
-
732
- def screen(state=nil)
733
-
734
- if state then
735
- http_exec 'screen', {on: state == :on}
736
- else
737
-
738
- def self.on()
739
- http_exec 'screen', {on: true}
740
- end
741
-
742
- def self.off()
743
- http_exec 'screen', {on: false}
744
- end
745
-
746
- self
747
-
748
- end
749
- end
750
-
751
- def share_location(options={})
752
- http_exec 'share-location'
753
- end
754
-
755
- def speak_text(obj)
756
-
757
- options = case obj
758
- when String
759
- {text: obj}
760
- when Hash
761
- obj
762
- end
763
-
764
- http_exec 'speak-text', options
765
- end
766
-
767
- alias say speak_text
768
-
769
- def stay_awake(options={})
770
- http_exec 'stay-awake', options
771
- end
394
+ m: Walking
395
+ t:
396
+ Activity - Walking
397
+ Confidence >= 50%
398
+ a:
399
+ webhook
400
+ identifier: activity
401
+ index: 3
772
402
 
773
- def stay_awake_off(options={})
774
- http_exec 'stay-awake-off', options
775
- end
403
+ m: Still
404
+ t:
405
+ Activity - Still
406
+ Confidence >= 83%
407
+ a:
408
+ webhook
409
+ identifier: activity
410
+ index: 4
776
411
 
777
- def take_picture(options={})
778
- http_exec 'take-picture', options
779
- end
412
+ m: Swipe top left across
413
+ t:
414
+ Swipe Screen
415
+ Top Left - Across
416
+ a:
417
+ webhook
418
+ identifier: swipe
419
+ start: 0
420
+ motion: 0
421
+
422
+ m: Swipe top left diagonal
423
+ t:
424
+ Swipe Screen
425
+ Top Left - Diagonal
426
+ a:
427
+ webhook
428
+ identifier: swipe
429
+ start: 0
430
+ motion: 1
431
+
432
+ m: Swipe top left down
433
+ t:
434
+ Swipe Screen
435
+ Top Left - Down
436
+ a:
437
+ webhook
438
+ identifier: swipe
439
+ start: 0
440
+ motion: 2
441
+
442
+ m: Swipe top right across
443
+ t:
444
+ Swipe Screen
445
+ Top Right - Across
446
+ a:
447
+ webhook
448
+ identifier: swipe
449
+ start: 1
450
+ motion: 0
780
451
 
781
- alias take_photo take_picture
782
452
 
783
-
784
- def toast(options={})
785
- http_exec :toast, options
786
- end
787
-
788
- def torch(options={})
789
- http_exec :torch
790
- end
791
-
792
- def vibrate(options={})
793
- http_exec :vibrate
794
- end
453
+ m: Swipe top right diagonal
454
+ t:
455
+ Swipe Screen
456
+ Top Right - Diagonal
457
+ a:
458
+ webhook
459
+ identifier: swipe
460
+ start: 1
461
+ motion: 1
462
+
463
+ m: Swipe top right down
464
+ t:
465
+ Swipe Screen
466
+ Top Right - Down
467
+ a:
468
+ webhook
469
+ identifier: swipe
470
+ start: 1
471
+ motion: 2
795
472
 
473
+ m: flip from up to down
474
+ t: Flip Device Face Up -> Face Down
475
+ a:
476
+ webhook
477
+ identifier: flip_device
478
+ facedown: true
796
479
 
797
- def write(s)
798
-
799
- MacroDroid.new(RD_MACROS, deviceid: @deviceid,
800
- remote_url: @remote_url, debug: @debug).export s
801
-
802
- end
803
-
804
- alias export write
805
-
806
- def method_missing2(method_name, *args)
807
- http_exec(method_name, args.first)
808
- end
809
-
810
- end
811
-
812
- class Query
813
-
814
- def initialize(callback)
815
- @callback = callback
816
- end
817
-
818
- def airplane_mode_enabled?()
819
- q(:airplane_mode_on).to_i > 0
820
- end
821
-
822
- def battery()
823
- q(:battery).to_i
824
- end
825
-
826
- def current_brightness()
827
- q(:current_brightness).to_i
828
- end
480
+ m: flip from down to up
481
+ t: Flip Device Face Down -> Face Up
482
+ a:
483
+ webhook
484
+ identifier: flip_device
485
+ facedown: false
486
+ EOF
829
487
 
830
- alias brightness current_brightness
831
-
832
- def cell_id()
833
- q(:cell_id)
834
- end
835
-
836
- alias cell_tower cell_id
837
-
838
- def ip()
839
- q(:ip)
840
- end
841
-
842
- def location()
843
- @callback.query(:location)[:coords]
844
- end
845
488
 
846
- def take_picture()
847
- @callback.query(:'take-picture')
848
- end
849
-
850
- private
851
-
852
- def q(id)
853
- @callback.query(id)[id]
854
- end
855
-
856
- end
489
+ module RemoteDroid
857
490
 
858
491
  class Server
859
492
 
@@ -870,127 +503,7 @@ module RemoteDroid
870
503
  end
871
504
 
872
505
  end
873
-
874
- class Client
875
-
876
- def initialize(host='127.0.0.1')
877
- @drb = OneDrb::Client.new host: host, port: '5777'
878
- end
879
-
880
- def control
881
- @drb.control
882
- end
883
-
884
- def export(s)
885
- @drb.export(s)
886
- end
887
-
888
- def invoke(s, *args)
889
- @drb.invoke(s, *args)
890
- end
891
-
892
- def query(id=nil)
893
-
894
- return @drb.query unless id
895
- t = Time.now
896
- h = @drb.query(id)
897
- h.merge({latency: (Time.now - t).round(3)})
898
-
899
- end
900
-
901
- def update(key, val)
902
- @drb.update key.to_sym, val
903
- end
904
-
905
- def store()
906
- @drb.store
907
- end
908
-
909
- # -- helpful methods -----------------
910
-
911
- def battery()
912
- query.battery
913
- end
914
-
915
- def cell_tower()
916
- query.cell_tower
917
- end
918
-
919
- def hotspot(state=nil)
920
- control.hotspot state
921
- end
922
-
923
- def location()
924
- query.location
925
- end
926
-
927
- def photo()
928
- take_picture
929
- end
930
-
931
- def say(text)
932
- control.speak_text text
933
- end
934
-
935
- def say_time()
936
- control.say_time
937
- end
938
-
939
- alias saytime say_time
940
-
941
- def screen(state=nil)
942
- control.screen state
943
- end
944
-
945
- def screen_on()
946
- screen :on
947
- end
948
-
949
- def screen_off()
950
- screen :off
951
- end
952
-
953
- def stay_awake()
954
- control.stay_awake
955
- end
956
-
957
- def stay_awake_off()
958
- control.stay_awake_off
959
- end
960
-
961
- def take_picture(ftp_src: nil, fileout: '.')
962
-
963
- #screen.on
964
- r = query.take_picture
965
-
966
- if ftp_src then
967
-
968
- # the sleep statement will be replaced in the near future,
969
- # but it's fine to demonstrate it works
970
- #sleep 8
971
-
972
- credentials, dir = ftp_src.match(/(ftp:\/\/[^\/]+)\/([^$]+)/).captures
973
- ftp = MyMediaFTP.new(credentials)
974
- ftp.cd dir
975
- filename = ftp.ls.sort_by {|x| x[:ctime]}.last[:name]
976
- ftp.cp filename, fileout
977
-
978
- end
979
-
980
- end
981
-
982
- alias take_photo take_picture
983
506
 
984
- def torch()
985
- control.torch
986
- end
987
-
988
- def vibrate
989
- control.vibrate
990
- end
991
-
992
- end
993
-
994
507
  class TriggerSubscriber < SPSSub
995
508
 
996
509
  def initialize(host: 'sps.home', drb_host: '127.0.0.1')
@@ -1025,8 +538,19 @@ module RemoteDroid
1025
538
 
1026
539
  context, json = msg.split(/:\s+/,2)
1027
540
  category, action = context.split('/',2)
1028
- @remote.control.method(action.to_sym)\
1029
- .call(JSON.parse(json, symbolize_names: true))
541
+
542
+ h = JSON.parse(json, symbolize_names: true)
543
+
544
+ if action == 'force_macro_run' and h[:serverside] then
545
+
546
+ a = @remote.run_macro(h)
547
+ a.each {|msg| self.notice 'macrodroid/action: ' + msg }
548
+
549
+ else
550
+
551
+ @remote.control.method(action.to_sym).call(h)
552
+
553
+ end
1030
554
 
1031
555
  end
1032
556
 
@@ -1057,3 +581,12 @@ module RemoteDroid
1057
581
 
1058
582
  end
1059
583
  end
584
+
585
+ # PASTE_END
586
+
587
+
588
+ require 'remotedroid/model'
589
+ require 'remotedroid/query'
590
+ require 'remotedroid/control'
591
+ require 'remotedroid/controller'
592
+ require 'remotedroid/client'