ruby-macrodroid 0.9.11 → 0.9.16
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 +3 -0
- data/lib/ruby-macrodroid/actions.rb +223 -19
- data/lib/ruby-macrodroid/actionsnlp.rb +42 -2
- data/lib/ruby-macrodroid/base.rb +6 -3
- data/lib/ruby-macrodroid/macro.rb +2 -2
- data/lib/ruby-macrodroid/triggers.rb +160 -18
- data/lib/ruby-macrodroid/triggersnlp.rb +73 -2
- 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: e9789db9405136e821003060f52912072c11665303ab25a714c93d5dac058d8f
|
4
|
+
data.tar.gz: 7878f4f2c52b3450e2485e5b993cfe275269e88e125da647f89ddf73610c504e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a2f574bc7692cba9cf2cc31228c5c4e6cd4aa78de0bb3a73c5e73c1458fd6cdc0798ac31aebd9e1833738ce700819257a02242c13ed2c5bc91f4e977d171e27
|
7
|
+
data.tar.gz: ce58d73abe7f2583bd50a7c6fa0fda42c9aa2a0cf14b9fc370c066dad69fcb8263332f685da3f14aee447180fbfcd9cd5a25a59b81853748114e58e420c6f74c
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/ruby-macrodroid.rb
CHANGED
@@ -603,4 +603,7 @@ require 'ruby-macrodroid/base'
|
|
603
603
|
require 'ruby-macrodroid/triggers'
|
604
604
|
require 'ruby-macrodroid/actions'
|
605
605
|
require 'ruby-macrodroid/constraints'
|
606
|
+
require 'ruby-macrodroid/triggersnlp'
|
607
|
+
require 'ruby-macrodroid/actionsnlp'
|
608
|
+
require 'ruby-macrodroid/constraintsnlp'
|
606
609
|
require 'ruby-macrodroid/macro'
|
@@ -32,6 +32,30 @@
|
|
32
32
|
#
|
33
33
|
|
34
34
|
|
35
|
+
APPS = {
|
36
|
+
'AutoBoy' => 'com.happyconz.blackbox',
|
37
|
+
'Amazon Alexa' => 'com.amazon.dee.app',
|
38
|
+
'Brave' => 'com.brave.browser',
|
39
|
+
'Camera' => 'com.google.android.camera',
|
40
|
+
'Cast to TV' => 'cast.video.screenmirroring.casttotv',
|
41
|
+
'File Manager' => 'com.alphainventor.filemanager',
|
42
|
+
'Firefox' => 'org.mozilla.firefox',
|
43
|
+
'Google Chrome' => 'com.google.android.chrome',
|
44
|
+
'Chrome' => 'com.google.android.chrome',
|
45
|
+
'Google Home' => 'com.google.android.apps.chromecast.app',
|
46
|
+
'Google Play Music' => 'com.google.android.music',
|
47
|
+
'MacroDroid' => 'com.arlosoft.macrodroid',
|
48
|
+
'QuickEdit Text Editor Pro' => 'com.rhmsoft.edit.pro',
|
49
|
+
'QR & Barcode Reader' => 'com.teacapps.barcodescanner',
|
50
|
+
'Settings' => 'com.google.android.settings',
|
51
|
+
'tinyCam PRO' => 'com.alexvas.dvr.pro',
|
52
|
+
'Tor Browser' => 'org.torproject.torbrowser',
|
53
|
+
'VLC' => 'org.videolan.vlc',
|
54
|
+
'WiFi FTP Server' => 'com.medhaapps.wififtpserver',
|
55
|
+
'YouTube' => 'com.google.android.youtube'
|
56
|
+
}
|
57
|
+
|
58
|
+
|
35
59
|
class Action < MacroObject
|
36
60
|
using ColouredText
|
37
61
|
using Params
|
@@ -150,17 +174,17 @@ class OpenWebPageAction < ApplicationAction
|
|
150
174
|
|
151
175
|
def initialize(obj={}, macro=nil)
|
152
176
|
|
153
|
-
$debug =
|
177
|
+
$debug = true
|
154
178
|
puts ('obj: ' + obj.inspect).debug if $debug
|
155
179
|
|
156
180
|
h = if obj.is_a? Hash then
|
157
181
|
|
158
|
-
obj.merge({macro: macro})
|
182
|
+
obj.merge({macro: macro}) #unless obj and obj[:macro]
|
159
183
|
|
160
184
|
elsif obj.is_a? Array
|
161
185
|
|
162
186
|
puts ('obj: ' + obj.inspect).debug if $debug
|
163
|
-
e, macro = obj
|
187
|
+
e, macro, h3 = obj
|
164
188
|
|
165
189
|
a = e.xpath('item/*')
|
166
190
|
|
@@ -181,7 +205,7 @@ class OpenWebPageAction < ApplicationAction
|
|
181
205
|
{url: (txt || e.text)}
|
182
206
|
end
|
183
207
|
|
184
|
-
h2.merge(macro: macro)
|
208
|
+
h2.merge(macro: macro).merge(h3)
|
185
209
|
|
186
210
|
end
|
187
211
|
|
@@ -219,6 +243,7 @@ class OpenWebPageAction < ApplicationAction
|
|
219
243
|
h[:macro].title.downcase.gsub(/ +/,'-')
|
220
244
|
|
221
245
|
end
|
246
|
+
puts 'url: ' + url.inspect if $debug
|
222
247
|
|
223
248
|
if h2 then
|
224
249
|
|
@@ -242,7 +267,8 @@ class OpenWebPageAction < ApplicationAction
|
|
242
267
|
end
|
243
268
|
|
244
269
|
def to_s(colour: false, indent: 0)
|
245
|
-
|
270
|
+
s = @h[:http_get] ? '' : 'Open Website / '
|
271
|
+
@s = s + "HTTP GET\nurl: " + @h[:url_to_open]
|
246
272
|
super()
|
247
273
|
end
|
248
274
|
|
@@ -888,8 +914,17 @@ end
|
|
888
914
|
#
|
889
915
|
class SayTimeAction < DateTimeAction
|
890
916
|
|
891
|
-
def initialize(
|
892
|
-
|
917
|
+
def initialize(obj=nil)
|
918
|
+
|
919
|
+
h = if obj.is_a? Hash then
|
920
|
+
obj
|
921
|
+
elsif obj.is_a? Array
|
922
|
+
|
923
|
+
e, macro = obj
|
924
|
+
{:'12_hour' => e.text('item/description').to_s[/^\d+/] == '12'}
|
925
|
+
|
926
|
+
end
|
927
|
+
|
893
928
|
options = {
|
894
929
|
:'12_hour' => true
|
895
930
|
}
|
@@ -910,7 +945,9 @@ class SayTimeAction < DateTimeAction
|
|
910
945
|
end
|
911
946
|
|
912
947
|
def to_s(colour: false, indent: 0)
|
913
|
-
'Say Current Time'
|
948
|
+
@s = 'Say Current Time'
|
949
|
+
@s += "\n%s hour clock" % (@h[:'12_hour'] ? '12' : '24')
|
950
|
+
super()
|
914
951
|
end
|
915
952
|
|
916
953
|
end
|
@@ -950,8 +987,15 @@ end
|
|
950
987
|
#
|
951
988
|
class ClipboardAction < DeviceAction
|
952
989
|
|
953
|
-
def initialize(
|
990
|
+
def initialize(obj=nil)
|
954
991
|
|
992
|
+
h = if obj.is_a? Hash then
|
993
|
+
obj
|
994
|
+
elsif obj.is_a? Array
|
995
|
+
e, macro = obj
|
996
|
+
{clipboard_text: e.text('item/description').to_s}
|
997
|
+
end
|
998
|
+
|
955
999
|
options = {
|
956
1000
|
clipboard_text: ''
|
957
1001
|
}
|
@@ -1031,14 +1075,57 @@ end
|
|
1031
1075
|
#
|
1032
1076
|
class UIInteractionAction < DeviceAction
|
1033
1077
|
|
1034
|
-
def initialize(
|
1078
|
+
def initialize(obj=nil)
|
1035
1079
|
|
1080
|
+
if obj.is_a? Hash then
|
1081
|
+
h = obj
|
1082
|
+
elsif obj.is_a? Array
|
1083
|
+
|
1084
|
+
e, macro = obj
|
1085
|
+
s = e.text('item/description').to_s
|
1086
|
+
|
1087
|
+
r = s.match(/^(Click|Long Click) \[([^\]]+)/)
|
1088
|
+
|
1089
|
+
# [Current focus] # Current focus
|
1090
|
+
# [0,0] # x,y location
|
1091
|
+
# [274,186] # Identify in app
|
1092
|
+
# [fooo] # Text content
|
1093
|
+
|
1094
|
+
h = {
|
1095
|
+
ui_interaction_configuration: {}, :xy_point=>{:x=>0, :y=>0},
|
1096
|
+
:type=>"Click"
|
1097
|
+
}
|
1098
|
+
h2 = {}
|
1099
|
+
|
1100
|
+
if r then
|
1101
|
+
|
1102
|
+
h[:action] = 0
|
1103
|
+
|
1104
|
+
click, detail = r.captures
|
1105
|
+
h2[:long_click] = false if click.downcase.to_sym == :click
|
1106
|
+
|
1107
|
+
if detail == 'Current focus' then
|
1108
|
+
h2[:click_option] = 1
|
1109
|
+
elsif detail =~ /\d+,\d+/
|
1110
|
+
# to-do
|
1111
|
+
else
|
1112
|
+
# text content
|
1113
|
+
h2[:click_option] = 1
|
1114
|
+
h2[:text_content] = detail
|
1115
|
+
end
|
1116
|
+
|
1117
|
+
h[:ui_interaction_configuration] = h2
|
1118
|
+
end
|
1119
|
+
|
1120
|
+
end
|
1121
|
+
|
1036
1122
|
options = {
|
1037
1123
|
ui_interaction_configuration: {:type=>"Copy"},
|
1038
1124
|
action: 2
|
1039
1125
|
}
|
1040
1126
|
|
1041
|
-
|
1127
|
+
|
1128
|
+
super(options.merge h)
|
1042
1129
|
|
1043
1130
|
end
|
1044
1131
|
|
@@ -1078,7 +1165,7 @@ class UIInteractionAction < DeviceAction
|
|
1078
1165
|
"Gesture [%s]" % detail
|
1079
1166
|
end
|
1080
1167
|
|
1081
|
-
'UI Interaction' + "\n " + s
|
1168
|
+
'UI Interaction' + "\n " + s + ' ' + @h.inspect
|
1082
1169
|
end
|
1083
1170
|
|
1084
1171
|
alias to_summary to_s
|
@@ -1656,9 +1743,18 @@ class ClearLogAction < LoggingAction
|
|
1656
1743
|
end
|
1657
1744
|
|
1658
1745
|
|
1746
|
+
class MacroDroidAction < Action
|
1747
|
+
|
1748
|
+
def initialize(h={})
|
1749
|
+
super(h)
|
1750
|
+
@group = 'macrodroid'
|
1751
|
+
end
|
1752
|
+
|
1753
|
+
end
|
1754
|
+
|
1659
1755
|
# MacroDroid Specific
|
1660
1756
|
#
|
1661
|
-
class CancelActiveMacroAction <
|
1757
|
+
class CancelActiveMacroAction < MacroDroidAction
|
1662
1758
|
|
1663
1759
|
def initialize(h={})
|
1664
1760
|
|
@@ -1682,7 +1778,7 @@ end
|
|
1682
1778
|
|
1683
1779
|
# MacroDroid Specific
|
1684
1780
|
#
|
1685
|
-
class ConfirmNextAction <
|
1781
|
+
class ConfirmNextAction < MacroDroidAction
|
1686
1782
|
|
1687
1783
|
def initialize(h={})
|
1688
1784
|
|
@@ -1706,7 +1802,7 @@ class ConfirmNextAction < Action
|
|
1706
1802
|
|
1707
1803
|
end
|
1708
1804
|
|
1709
|
-
class DisableMacroAction <
|
1805
|
+
class DisableMacroAction < MacroDroidAction
|
1710
1806
|
|
1711
1807
|
def initialize(obj=nil)
|
1712
1808
|
|
@@ -1753,7 +1849,7 @@ end
|
|
1753
1849
|
|
1754
1850
|
# MacroDroid Specific
|
1755
1851
|
#
|
1756
|
-
class ExportMacrosAction <
|
1852
|
+
class ExportMacrosAction < MacroDroidAction
|
1757
1853
|
|
1758
1854
|
def initialize(h={})
|
1759
1855
|
|
@@ -1775,9 +1871,61 @@ class ExportMacrosAction < Action
|
|
1775
1871
|
end
|
1776
1872
|
|
1777
1873
|
|
1874
|
+
|
1875
|
+
class ForceMacroRunAction < MacroDroidAction
|
1876
|
+
|
1877
|
+
def initialize(obj=nil)
|
1878
|
+
|
1879
|
+
h = if obj.is_a? Hash then
|
1880
|
+
|
1881
|
+
obj
|
1882
|
+
|
1883
|
+
elsif obj.is_a? Array
|
1884
|
+
|
1885
|
+
e, macro, h2 = obj
|
1886
|
+
|
1887
|
+
# find the macro guid for the given name
|
1888
|
+
name = e.text('item/description').to_s
|
1889
|
+
found = macro.parent.macros.find {|macro| macro.title =~ /#{name}/ }
|
1890
|
+
|
1891
|
+
h3 = if found then
|
1892
|
+
{macro_name: found.title, GUID: found.guid}
|
1893
|
+
else
|
1894
|
+
{macro_name: name}
|
1895
|
+
end
|
1896
|
+
|
1897
|
+
h3.merge h2
|
1898
|
+
|
1899
|
+
end
|
1900
|
+
|
1901
|
+
options = {
|
1902
|
+
guid: nil, ignore_constraints: true,
|
1903
|
+
macro_name: "", use_off_status: false,
|
1904
|
+
user_prompt_title: "Run Macro"
|
1905
|
+
}
|
1906
|
+
super(options.merge h)
|
1907
|
+
|
1908
|
+
end
|
1909
|
+
|
1910
|
+
def invoke()
|
1911
|
+
super(macro_name: @h[:macro_name])
|
1912
|
+
end
|
1913
|
+
|
1914
|
+
def to_s(colour: false, indent: 0)
|
1915
|
+
|
1916
|
+
@s = 'Macro Run'# + @h.inspect
|
1917
|
+
@s += "\n" + @h[:macro_name]
|
1918
|
+
super()
|
1919
|
+
|
1920
|
+
end
|
1921
|
+
|
1922
|
+
alias to_summary to_s
|
1923
|
+
|
1924
|
+
end
|
1925
|
+
|
1778
1926
|
# MacroDroid Specific
|
1779
1927
|
#
|
1780
|
-
class SetVariableAction <
|
1928
|
+
class SetVariableAction < MacroDroidAction
|
1781
1929
|
using ColouredText
|
1782
1930
|
|
1783
1931
|
def initialize(obj=nil)
|
@@ -1867,7 +2015,7 @@ end
|
|
1867
2015
|
|
1868
2016
|
# MacroDroid Specific
|
1869
2017
|
#
|
1870
|
-
class TextManipulationAction <
|
2018
|
+
class TextManipulationAction < MacroDroidAction
|
1871
2019
|
|
1872
2020
|
def initialize(h={})
|
1873
2021
|
|
@@ -1910,7 +2058,7 @@ end
|
|
1910
2058
|
|
1911
2059
|
|
1912
2060
|
|
1913
|
-
class PauseAction <
|
2061
|
+
class PauseAction < MacroDroidAction
|
1914
2062
|
|
1915
2063
|
def initialize(h={})
|
1916
2064
|
|
@@ -1950,6 +2098,62 @@ end
|
|
1950
2098
|
|
1951
2099
|
# Category: Media
|
1952
2100
|
#
|
2101
|
+
|
2102
|
+
|
2103
|
+
# note: to find a package id from an App name, try searching for the name on
|
2104
|
+
# the Google Play Store and the id will be returned in the URL once the
|
2105
|
+
# correct app has been clicked. e.g.
|
2106
|
+
# https://play.google.com/store/apps/details?id=com.google.android.music
|
2107
|
+
#
|
2108
|
+
class ControlMediaAction < MediaAction
|
2109
|
+
|
2110
|
+
def initialize(obj=nil)
|
2111
|
+
|
2112
|
+
h = if obj.is_a? Hash then
|
2113
|
+
obj
|
2114
|
+
elsif obj.is_a? Array
|
2115
|
+
|
2116
|
+
e, macro = obj
|
2117
|
+
s = e.text('item/description').to_s
|
2118
|
+
app = s[/Simulate Media Button \(([^\)]+)/,1]
|
2119
|
+
|
2120
|
+
if app then
|
2121
|
+
|
2122
|
+
{
|
2123
|
+
application_name: app, package_name: APPS[app],
|
2124
|
+
simulate_media_button: true
|
2125
|
+
}
|
2126
|
+
|
2127
|
+
else
|
2128
|
+
{}
|
2129
|
+
end
|
2130
|
+
end
|
2131
|
+
|
2132
|
+
options = {
|
2133
|
+
application_name: "Google Play Music", option: "Play/Pause",
|
2134
|
+
package_name: "com.google.android.music",
|
2135
|
+
send_media_player_commands: false,
|
2136
|
+
simulate_media_button: true,
|
2137
|
+
}
|
2138
|
+
|
2139
|
+
super(options.merge h)
|
2140
|
+
|
2141
|
+
end
|
2142
|
+
|
2143
|
+
def to_s(colour: false, indent: 0)
|
2144
|
+
|
2145
|
+
@s = 'Media ' + @h[:option] #+ @h.inspect
|
2146
|
+
|
2147
|
+
if @h[:simulate_media_button] then
|
2148
|
+
@s += "\nSimulate Media Button (%s)" % @h[:application_name]
|
2149
|
+
end
|
2150
|
+
|
2151
|
+
super()
|
2152
|
+
end
|
2153
|
+
|
2154
|
+
alias to_summary to_s
|
2155
|
+
end
|
2156
|
+
|
1953
2157
|
class RecordMicrophoneAction < MediaAction
|
1954
2158
|
|
1955
2159
|
def initialize(h={})
|
@@ -90,6 +90,7 @@ class ActionsNlp
|
|
90
90
|
|
91
91
|
# -- DEVICE ACTIONS ------------------------------------------------------
|
92
92
|
|
93
|
+
#
|
93
94
|
get /^Speak text \(([^\)]+)\)/i do |text|
|
94
95
|
[SpeakTextAction, {text: text}]
|
95
96
|
end
|
@@ -100,7 +101,11 @@ class ActionsNlp
|
|
100
101
|
|
101
102
|
get /^Speak text$/i do |text|
|
102
103
|
[SpeakTextAction, {}]
|
103
|
-
end
|
104
|
+
end
|
105
|
+
|
106
|
+
get /^UI Interaction$/i do
|
107
|
+
[UIInteractionAction, {}]
|
108
|
+
end
|
104
109
|
|
105
110
|
get /^Vibrate \(([^\)]+)/i do |pattern|
|
106
111
|
[VibrateAction, {pattern: pattern}]
|
@@ -123,6 +128,10 @@ class ActionsNlp
|
|
123
128
|
[SetWifiAction, {state: state}]
|
124
129
|
|
125
130
|
end
|
131
|
+
|
132
|
+
get /^Fill Clipboard$/i do
|
133
|
+
[ClipboardAction, {}]
|
134
|
+
end
|
126
135
|
|
127
136
|
# e.g. Play: Altair
|
128
137
|
get /^Play: (.*)$/i do |name|
|
@@ -134,9 +143,11 @@ class ActionsNlp
|
|
134
143
|
# e.g. Launch Settings
|
135
144
|
get /^Launch (.*)$/i do |application|
|
136
145
|
|
146
|
+
app = APPS[application] || 'com.android.' + application.downcase.split()\
|
147
|
+
.join('.')
|
137
148
|
h = {
|
138
149
|
application_name: application,
|
139
|
-
package_to_launch:
|
150
|
+
package_to_launch: app
|
140
151
|
}
|
141
152
|
[LaunchActivityAction, h]
|
142
153
|
|
@@ -155,6 +166,19 @@ class ActionsNlp
|
|
155
166
|
|
156
167
|
end
|
157
168
|
|
169
|
+
|
170
|
+
get /^Open Website \/ HTTP GET$/i do
|
171
|
+
|
172
|
+
[OpenWebPageAction, {http_get: false}]
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
get /^(?:open|goto) ((?:https?:\/\/|\[lv=)[^$]+)$/i do |url|
|
177
|
+
|
178
|
+
[OpenWebPageAction, url_to_open: url, http_get: false]
|
179
|
+
|
180
|
+
end
|
181
|
+
|
158
182
|
# e.g. webhook entered_kitchen
|
159
183
|
#
|
160
184
|
get /(?:webhook|HTTP GET) ([^$]+)$/i do |s|
|
@@ -221,6 +245,14 @@ class ActionsNlp
|
|
221
245
|
state = %w(enable disable toggle).index(rawstate.downcase)
|
222
246
|
[DisableMacroAction, {state: state}]
|
223
247
|
end
|
248
|
+
|
249
|
+
get /^Macro Run$/i do
|
250
|
+
[ForceMacroRunAction, {}]
|
251
|
+
end
|
252
|
+
|
253
|
+
get /^Run Macro$/i do
|
254
|
+
[ForceMacroRunAction, {}]
|
255
|
+
end
|
224
256
|
|
225
257
|
get /^Set Variable$/i do
|
226
258
|
[SetVariableAction, {}]
|
@@ -230,6 +262,14 @@ class ActionsNlp
|
|
230
262
|
[PauseAction, {delay_in_seconds: seconds.to_i}]
|
231
263
|
end
|
232
264
|
|
265
|
+
## -- Media -----------------------------------------
|
266
|
+
#
|
267
|
+
# options: Play/Pause, Previous, Next, Play, Pause, Stop
|
268
|
+
#
|
269
|
+
get /^Media ([^$]+)$/i do |option|
|
270
|
+
[ControlMediaAction, {option: option}]
|
271
|
+
end
|
272
|
+
|
233
273
|
# -- Screen ------------------------------------------------
|
234
274
|
#
|
235
275
|
get /^Screen (On|Off)$/i do |state|
|
data/lib/ruby-macrodroid/base.rb
CHANGED
@@ -12,7 +12,7 @@ module ObjectX
|
|
12
12
|
|
13
13
|
def action_to_object(ap, e, item, macro)
|
14
14
|
|
15
|
-
debug =
|
15
|
+
debug = true
|
16
16
|
|
17
17
|
puts 'inside action_to_object: item.xml: ' + item.xml if debug
|
18
18
|
|
@@ -34,7 +34,8 @@ module ObjectX
|
|
34
34
|
r = ap.find_action action
|
35
35
|
puts 'r: ' + r.inspect if debug
|
36
36
|
|
37
|
-
nested = description.element('item
|
37
|
+
nested = description.element('item/*')
|
38
|
+
puts 'nested: ' + nested.inspect if debug
|
38
39
|
|
39
40
|
if r[1].any? and not nested then
|
40
41
|
|
@@ -132,7 +133,8 @@ class MacroObject
|
|
132
133
|
end
|
133
134
|
|
134
135
|
def to_h()
|
135
|
-
|
136
|
+
|
137
|
+
@h.delete :macro
|
136
138
|
hashify(@h)
|
137
139
|
|
138
140
|
end
|
@@ -204,6 +206,7 @@ class MacroObject
|
|
204
206
|
new_key = key.to_s.gsub(/\w_\w/){|x| x[0] + x[-1].upcase}
|
205
207
|
new_key = new_key.prepend 'm_' unless @list.include? new_key
|
206
208
|
new_key = 'm_SIGUID' if new_key == 'm_siguid'
|
209
|
+
new_key = 'm_SSIDList' if new_key == 'm_ssidList'
|
207
210
|
new_val = value.is_a?(Hash) ? hashify(value) : value
|
208
211
|
r.merge(new_key => new_val)
|
209
212
|
end
|
@@ -268,7 +268,7 @@ class Macro
|
|
268
268
|
r = tp.find_trigger trigger
|
269
269
|
puts 'r: ' + r.inspect if @debug
|
270
270
|
#o = r[0].new([description, self]) if r
|
271
|
-
o = object_create(r[0], [description, self]) if r
|
271
|
+
o = object_create(r[0], [description, self, r[1]]) if r
|
272
272
|
puts 'after o' if @debug
|
273
273
|
o
|
274
274
|
|
@@ -356,7 +356,7 @@ class Macro
|
|
356
356
|
|
357
357
|
end
|
358
358
|
|
359
|
-
def match?(triggerx, detail={
|
359
|
+
def match?(triggerx, detail={}, model=nil )
|
360
360
|
|
361
361
|
if @triggers.any? {|x| x.type == triggerx and x.match?(detail, model) } then
|
362
362
|
|
@@ -61,6 +61,7 @@ class Trigger < MacroObject
|
|
61
61
|
{|x| 'c: ' + x.to_summary(colour: colour, indent: 1)}.join(" %s " % operator)
|
62
62
|
|
63
63
|
@constraints.any? ? @s + "\n" + constraints : @s
|
64
|
+
super()
|
64
65
|
|
65
66
|
end
|
66
67
|
|
@@ -85,7 +86,7 @@ end
|
|
85
86
|
# ["Any Network"]
|
86
87
|
# ["some Wifi SSID"] - 1 or more SSID can be supplied
|
87
88
|
|
88
|
-
class
|
89
|
+
class WifiConnectionTrigger2 < Trigger
|
89
90
|
|
90
91
|
def initialize(h={})
|
91
92
|
|
@@ -216,7 +217,7 @@ class PowerButtonToggleTrigger < Trigger
|
|
216
217
|
end
|
217
218
|
|
218
219
|
def to_s(colour: false)
|
219
|
-
|
220
|
+
"Power Button Toggle (%s)" % @h[:num_toggles] #+ @h.inspect
|
220
221
|
end
|
221
222
|
|
222
223
|
alias to_summary to_s
|
@@ -457,7 +458,7 @@ class WebHookTrigger < Trigger
|
|
457
458
|
|
458
459
|
url = "https://trigger.macrodroid.com/%s/%s" % \
|
459
460
|
[@deviceid, @h[:identifier]]
|
460
|
-
@s = 'WebHook (Url)' + "\n
|
461
|
+
@s = 'WebHook (Url)' + "\n" + url
|
461
462
|
super()
|
462
463
|
|
463
464
|
end
|
@@ -469,8 +470,15 @@ end
|
|
469
470
|
#
|
470
471
|
class WifiConnectionTrigger < Trigger
|
471
472
|
|
472
|
-
def initialize(
|
473
|
+
def initialize(obj=nil)
|
473
474
|
|
475
|
+
h = if obj.is_a? Hash then
|
476
|
+
obj
|
477
|
+
elsif obj.is_a? Array
|
478
|
+
e, macro = obj
|
479
|
+
{ssid_list: [e.text('item/description').to_s], wifi_state: 2}
|
480
|
+
end
|
481
|
+
|
474
482
|
options = {
|
475
483
|
ssid_list: [],
|
476
484
|
wifi_state: 0
|
@@ -482,10 +490,15 @@ class WifiConnectionTrigger < Trigger
|
|
482
490
|
|
483
491
|
def to_s(colour: false)
|
484
492
|
access_point = @h[:ssid_list].first
|
485
|
-
'Connected to network
|
493
|
+
@s = 'Connected to network'
|
494
|
+
@s += "\n" + access_point
|
495
|
+
super()
|
486
496
|
end
|
487
497
|
|
488
|
-
|
498
|
+
def to_summary()
|
499
|
+
access_point = @h[:ssid_list].first
|
500
|
+
'Connected to network' + access_point
|
501
|
+
end
|
489
502
|
end
|
490
503
|
|
491
504
|
# Category: Connectivity
|
@@ -1010,7 +1023,7 @@ class MusicPlayingTrigger < DeviceEventsTrigger
|
|
1010
1023
|
def to_s(colour: false)
|
1011
1024
|
|
1012
1025
|
event = @h[:option] == 0 ? 'Started' : 'Stopped'
|
1013
|
-
@s = 'Music/Sound Playing' + "\n
|
1026
|
+
@s = 'Music/Sound Playing' + "\n%s" % event #+ @h.inspect
|
1014
1027
|
super()
|
1015
1028
|
|
1016
1029
|
end
|
@@ -1026,8 +1039,15 @@ end
|
|
1026
1039
|
#
|
1027
1040
|
class NFCTrigger < DeviceEventsTrigger
|
1028
1041
|
|
1029
|
-
def initialize(
|
1030
|
-
|
1042
|
+
def initialize(obj=nil)
|
1043
|
+
|
1044
|
+
h = if obj.is_a? Hash then
|
1045
|
+
obj
|
1046
|
+
elsif obj.is_a? Array
|
1047
|
+
e, macro = obj
|
1048
|
+
{tag_name: e.text('item/description').to_s}
|
1049
|
+
end
|
1050
|
+
|
1031
1051
|
options = {
|
1032
1052
|
}
|
1033
1053
|
|
@@ -1367,8 +1387,24 @@ end
|
|
1367
1387
|
#
|
1368
1388
|
class ActivityRecognitionTrigger < SensorsTrigger
|
1369
1389
|
|
1370
|
-
def initialize(
|
1371
|
-
|
1390
|
+
def initialize(obj=nil)
|
1391
|
+
|
1392
|
+
#puts 'obj: ' + obj.inspect
|
1393
|
+
|
1394
|
+
h = if obj.is_a? Hash then
|
1395
|
+
|
1396
|
+
obj
|
1397
|
+
|
1398
|
+
elsif obj.is_a? Array
|
1399
|
+
|
1400
|
+
e, macro, h2 = obj
|
1401
|
+
#puts 'h2: ' + h2.inspect
|
1402
|
+
#puts 'e: ' + e.xml
|
1403
|
+
s = e.text('item/description').to_s
|
1404
|
+
#puts 's: ' + s.inspect
|
1405
|
+
{confidence_level: s[/\d+%$/].to_i}.merge h2
|
1406
|
+
end
|
1407
|
+
|
1372
1408
|
options = {
|
1373
1409
|
confidence_level: 50,
|
1374
1410
|
selected_index: 1
|
@@ -1380,9 +1416,18 @@ class ActivityRecognitionTrigger < SensorsTrigger
|
|
1380
1416
|
|
1381
1417
|
end
|
1382
1418
|
|
1419
|
+
def match?(detail={})
|
1420
|
+
@h[:selected_index] == detail[:selected_index]
|
1421
|
+
end
|
1422
|
+
|
1383
1423
|
def to_s(colour: false)
|
1424
|
+
|
1384
1425
|
activity = @activity[@h[:selected_index]]
|
1385
|
-
'Activity - ' + activity
|
1426
|
+
@s = 'Activity - ' + activity #+ @h.inspect
|
1427
|
+
@s += "\nConfidence >= %s%%" % @h[:confidence_level]
|
1428
|
+
|
1429
|
+
super()
|
1430
|
+
|
1386
1431
|
end
|
1387
1432
|
|
1388
1433
|
def to_summary(colour: false)
|
@@ -1499,6 +1544,19 @@ class FlipDeviceTrigger < SensorsTrigger
|
|
1499
1544
|
|
1500
1545
|
end
|
1501
1546
|
|
1547
|
+
def match?(detail={})
|
1548
|
+
|
1549
|
+
fd = detail[:face_down]
|
1550
|
+
|
1551
|
+
b = if fd.is_a? String then
|
1552
|
+
fd.downcase == 'true'
|
1553
|
+
else
|
1554
|
+
fd
|
1555
|
+
end
|
1556
|
+
|
1557
|
+
@h[:face_down] == b
|
1558
|
+
end
|
1559
|
+
|
1502
1560
|
def to_pc()
|
1503
1561
|
@h[:face_down] ? 'flip_device_down?' : 'flip_device_up?'
|
1504
1562
|
end
|
@@ -1577,7 +1635,7 @@ class ShortcutTrigger < Trigger
|
|
1577
1635
|
end
|
1578
1636
|
|
1579
1637
|
def to_s(colour: false)
|
1580
|
-
'
|
1638
|
+
'Shortcut Launched' #+ @h.inspect
|
1581
1639
|
end
|
1582
1640
|
|
1583
1641
|
alias to_summary to_s
|
@@ -1633,8 +1691,15 @@ end
|
|
1633
1691
|
#
|
1634
1692
|
class MediaButtonPressedTrigger < Trigger
|
1635
1693
|
|
1636
|
-
def initialize(
|
1694
|
+
def initialize(obj=nil)
|
1637
1695
|
|
1696
|
+
h = if obj.is_a? Hash then
|
1697
|
+
obj
|
1698
|
+
elsif obj.is_a? Array
|
1699
|
+
e, macro = obj
|
1700
|
+
{option: e.text('item/description').to_s}
|
1701
|
+
end
|
1702
|
+
|
1638
1703
|
options = {
|
1639
1704
|
option: 'Single Press',
|
1640
1705
|
cancel_press: false
|
@@ -1645,7 +1710,50 @@ class MediaButtonPressedTrigger < Trigger
|
|
1645
1710
|
end
|
1646
1711
|
|
1647
1712
|
def to_s(colour: false)
|
1648
|
-
|
1713
|
+
|
1714
|
+
@s = 'Media Button Pressed ' #+ @h.inspect
|
1715
|
+
@s += "\n" + @h[:option]
|
1716
|
+
super()
|
1717
|
+
|
1718
|
+
end
|
1719
|
+
|
1720
|
+
alias to_summary to_s
|
1721
|
+
end
|
1722
|
+
|
1723
|
+
class MediaButtonV2Trigger < Trigger
|
1724
|
+
|
1725
|
+
def initialize(obj=nil)
|
1726
|
+
|
1727
|
+
@a = %w(Play Play/Pause Pause Stop Previous Next Headset Hook)
|
1728
|
+
|
1729
|
+
h = if obj.is_a? Hash then
|
1730
|
+
obj
|
1731
|
+
elsif obj.is_a? Array
|
1732
|
+
e, macro = obj
|
1733
|
+
s = e.text('item/description').to_s
|
1734
|
+
a = s.split(/, /)
|
1735
|
+
{options_enabled_array: @a.map {|x| a.include? x } }
|
1736
|
+
end
|
1737
|
+
|
1738
|
+
|
1739
|
+
|
1740
|
+
options = {
|
1741
|
+
options_enabled_array: [true, false, false, false, false, false, false]
|
1742
|
+
}
|
1743
|
+
|
1744
|
+
super(options.merge h)
|
1745
|
+
|
1746
|
+
end
|
1747
|
+
|
1748
|
+
def to_s(colour: false)
|
1749
|
+
|
1750
|
+
|
1751
|
+
options = @a.zip(@h[:options_enabled_array]).select(&:last).map(&:first)
|
1752
|
+
|
1753
|
+
@s = 'Media Button V2 ' #+ @h.inspect
|
1754
|
+
@s += "\n" + options.join(', ')
|
1755
|
+
super()
|
1756
|
+
|
1649
1757
|
end
|
1650
1758
|
|
1651
1759
|
alias to_summary to_s
|
@@ -1655,8 +1763,22 @@ end
|
|
1655
1763
|
#
|
1656
1764
|
class SwipeTrigger < Trigger
|
1657
1765
|
|
1658
|
-
def initialize(
|
1659
|
-
|
1766
|
+
def initialize(obj=nil)
|
1767
|
+
|
1768
|
+
h = if obj.is_a? Hash then
|
1769
|
+
obj
|
1770
|
+
elsif obj.is_a? Array
|
1771
|
+
|
1772
|
+
e, macro = obj
|
1773
|
+
s = e.text('item/description').to_s
|
1774
|
+
start, motion = s.split(/ - /,2)
|
1775
|
+
|
1776
|
+
{
|
1777
|
+
swipe_start_area: ['Top Left', 'Top Right'].index(start),
|
1778
|
+
swipe_motion: %w(Across Diagonal Down).index(motion)
|
1779
|
+
}
|
1780
|
+
end
|
1781
|
+
|
1660
1782
|
options = {
|
1661
1783
|
swipe_start_area: 0,
|
1662
1784
|
swipe_motion: 0,
|
@@ -1666,9 +1788,29 @@ class SwipeTrigger < Trigger
|
|
1666
1788
|
super(options.merge h)
|
1667
1789
|
|
1668
1790
|
end
|
1791
|
+
|
1792
|
+
def match?(detail={}, model=nil)
|
1793
|
+
|
1794
|
+
puts 'detail : ' + detail.inspect
|
1795
|
+
|
1796
|
+
return false if detail.empty?
|
1797
|
+
|
1798
|
+
detail[:swipe_start_area] = detail[:start]
|
1799
|
+
detail[:swipe_motion] = detail[:motion]
|
1800
|
+
return unless detail[:swipe_start_area] and detail[:swipe_motion]
|
1801
|
+
|
1802
|
+
@h[:swipe_start_area] == detail[:swipe_start_area].to_i and \
|
1803
|
+
@h[:swipe_motion] == detail[:swipe_motion].to_i
|
1804
|
+
|
1805
|
+
end
|
1669
1806
|
|
1670
1807
|
def to_s(colour: false)
|
1671
|
-
|
1808
|
+
|
1809
|
+
direction = [['Top Left', 'Top Right'][@h[:swipe_start_area]],
|
1810
|
+
%w(Across Diagonal Down)[@h[:swipe_motion]]].join(' - ')
|
1811
|
+
@s = 'Swipe Screen'# + @h.inspect
|
1812
|
+
@s += "\n" + direction
|
1813
|
+
super()
|
1672
1814
|
end
|
1673
1815
|
|
1674
1816
|
alias to_summary to_s
|
@@ -19,6 +19,10 @@ class TriggersNlp
|
|
19
19
|
|
20
20
|
# -- Battery/Power ---------------------------------------------
|
21
21
|
|
22
|
+
get /Power Button Toggle \((\d)\)/i do |num|
|
23
|
+
[PowerButtonToggleTrigger, {num_toggles: num.to_i}]
|
24
|
+
end
|
25
|
+
|
22
26
|
get /^Power Connected: (Wired \([^\)]+\))/i do |s|
|
23
27
|
|
24
28
|
h = {
|
@@ -50,7 +54,26 @@ class TriggersNlp
|
|
50
54
|
[ExternalPowerTrigger, h]
|
51
55
|
end
|
52
56
|
|
57
|
+
# -- Connectivity ----------------------------------------------------
|
58
|
+
#
|
59
|
+
|
60
|
+
# Wifi State Change
|
61
|
+
|
62
|
+
get /^Connected to network (.*)$/i do |network|
|
63
|
+
[WifiConnectionTrigger, {ssid_list: [network], wifi_state: 2 }]
|
64
|
+
end
|
65
|
+
|
66
|
+
get /^Connected to network$/i do
|
67
|
+
[WifiConnectionTrigger, {}]
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
|
53
72
|
# -- Device Events ----------------------------------------------------
|
73
|
+
|
74
|
+
get /^NFC Tag$/i do |state|
|
75
|
+
[NFCTrigger, {}]
|
76
|
+
end
|
54
77
|
|
55
78
|
get /^Screen[ _](On|Off)/i do |state|
|
56
79
|
[ScreenOnOffTrigger, {screen_on: state.downcase == 'on'}]
|
@@ -132,11 +155,59 @@ class TriggersNlp
|
|
132
155
|
[WebHookTrigger, params]
|
133
156
|
end
|
134
157
|
|
135
|
-
|
158
|
+
#-- MacroDroid specific ---------------------------------------------------------------
|
136
159
|
|
137
160
|
get /^EmptyTrigger$/i do
|
138
161
|
[EmptyTrigger, params]
|
139
|
-
end
|
162
|
+
end
|
163
|
+
|
164
|
+
#-- Sensors ---------------------------------------------------------------
|
165
|
+
|
166
|
+
get /^Activity - (.*)$/i do |s|
|
167
|
+
|
168
|
+
a = ['In Vehicle', 'On Bicycle', 'Running', 'Walking', 'Still']
|
169
|
+
r = a.find {|x| x.downcase == s.downcase}
|
170
|
+
h = r ? {selected_index: a.index(r)} : {}
|
171
|
+
[ActivityRecognitionTrigger , h]
|
172
|
+
end
|
173
|
+
|
174
|
+
# -- User Input ---------------------------------------------------------------
|
175
|
+
|
176
|
+
get /^Media Button Pressed$/i do
|
177
|
+
[MediaButtonPressedTrigger, {}]
|
178
|
+
end
|
179
|
+
|
180
|
+
get /^Media Button V2$/i do
|
181
|
+
[MediaButtonV2Trigger, {}]
|
182
|
+
end
|
183
|
+
|
184
|
+
get /^Shortcut Launched$/i do
|
185
|
+
[ShortcutTrigger, {}]
|
186
|
+
end
|
187
|
+
|
188
|
+
get /^Swipe Screen$/i do
|
189
|
+
[SwipeTrigger, {}]
|
190
|
+
end
|
191
|
+
|
192
|
+
get /^Swipe (top left) (across|diagonal|down)$/i do |start, motion|
|
193
|
+
|
194
|
+
swipe_motion = case motion.downcase.to_sym
|
195
|
+
when :across
|
196
|
+
0
|
197
|
+
when :diagonal
|
198
|
+
1
|
199
|
+
when :down
|
200
|
+
2
|
201
|
+
end
|
202
|
+
|
203
|
+
h = {
|
204
|
+
swipe_start_area: (start.downcase == 'top left' ? 0 : 1),
|
205
|
+
swipe_motion: swipe_motion
|
206
|
+
}
|
207
|
+
|
208
|
+
[SwipeTrigger, h]
|
209
|
+
|
210
|
+
end
|
140
211
|
|
141
212
|
end
|
142
213
|
|
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.16
|
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-23 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: glw
|
metadata.gz.sig
CHANGED
Binary file
|