secret_knock 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6bc120d77ebabad867307af193e696375a63ade9
4
+ data.tar.gz: 825c13e542a4a30dabb6c7b24ef820d69a41852f
5
+ SHA512:
6
+ metadata.gz: 7f46b59b32d231c6946ffe7c54b7cafbb74abc47964c4dbf543aa25557871728c9295c32a2f3ccc01235f3b15bf786f6db1fc671e13625b81b93373fb6f2bbbb
7
+ data.tar.gz: dd50ba20288db197dd6a79b4ec1098f2b06410f4ef987241484ef7c3eb64de4a1524bfc1151fe40ac09167d6f57217ed0ed6f267b9e102f637e870632963ce71
checksums.yaml.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+ :V��_����n�I�~XM��n�rד�Z:8H��PT��#�������B��^;�\<*�"O^��Ă�2��c��%�t�
2
+ ���
3
+ ��
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # secret_knock.rb
4
+
5
+
6
+ class SecretKnock
7
+
8
+ attr_reader :h, :message
9
+
10
+ def initialize(verbose: true, external: nil)
11
+
12
+ @verbose, @external = verbose, external
13
+
14
+ # ranked by frequency. see https://en.wikipedia.org/wiki/Letter_frequency
15
+ keys = ["e", "t", "a", "o", "i", "n", "s", "h", "r", "d", "l", "c", "u", "m",
16
+ "w", "f", "g", "y", "p", "b", "v", "k", "j", "x", "q", "z"]
17
+
18
+
19
+ # number the keys including numbers and special functions (i.e. backspace)
20
+
21
+ i = 0
22
+ a = ([' '] + keys + ('1'..'9').to_a + ['0','<backspace>']).map do |x|
23
+ i += 1
24
+ i += 1 if i.to_s[-1] == '0'
25
+ [x, i]
26
+ end
27
+
28
+ # create and sort in alphabetical order the
29
+ # hash lookup and inverted hash lookup
30
+
31
+ @h = (a.take(27).sort_by(&:first) + a[27..-1]).to_h
32
+
33
+ #=> h contains the following
34
+ # {
35
+ # " "=>1, "a"=>4, "b"=>23, "c"=>14, "d"=>12, "e"=>2, "f"=>18, "g"=>19,
36
+ # "h"=>9, "i"=>6, "j"=>26, "k"=>25, "l"=>13, "m"=>16, "n"=>7, "o"=>5,
37
+ # "p"=>22, "q"=>28, "r"=>11, "s"=>8, "t"=>3, "u"=>15, "v"=>24, "w"=>17,
38
+ # "x"=>27, "y"=>21, "z"=>29, "1"=>31, "2"=>32, "3"=>33, "4"=>34, "5"=>35,
39
+ # "6"=>36, "7"=>37, "8"=>38, "9"=>39, "0"=>41, "<backspace>"=>42
40
+ # }
41
+
42
+ @hb = h.invert
43
+
44
+ @short_delay, @long_delay = 0.35, 0.9 # seconds
45
+
46
+ end
47
+
48
+ def autoknock(s)
49
+ playback knockerize(s)
50
+ end
51
+
52
+ def knocked()
53
+
54
+ t1 = Time.now
55
+
56
+ if t1 < @t + @short_delay then
57
+
58
+ @i += 1
59
+
60
+ else
61
+
62
+ @a << ',' if t1 > @t + @long_delay
63
+ @i = 1
64
+ @a << 0
65
+
66
+ end
67
+
68
+ @a[-1] = @i
69
+
70
+ @t = Time.now
71
+
72
+ @external.knock if @external
73
+ end
74
+
75
+ alias knock knocked
76
+
77
+ def knocks(n)
78
+
79
+ n.times { knocked }
80
+
81
+ puts (['knock'] * n).join ', ' if @verbose
82
+ short_pause
83
+
84
+ end
85
+
86
+ def knockerize(s)
87
+
88
+ s.chars.flat_map do |x|
89
+ @h[x].to_s.chars.map {|n| [:knocks, n.to_i]} + [:pause]
90
+ end
91
+
92
+ end
93
+
94
+ def listen()
95
+
96
+ @t = Time.now
97
+ @i = 1
98
+ @a = [0]
99
+
100
+ if block_given? then
101
+ yield self
102
+ stop_listening
103
+ end
104
+
105
+ end
106
+
107
+ def long_pause()
108
+
109
+ puts "\n*pause*\n\n" if @verbose
110
+ sleep @long_delay + 0.1
111
+
112
+ end
113
+
114
+ alias pause long_pause
115
+
116
+ def playback(instructions)
117
+
118
+ listen do |x|
119
+
120
+ sleep 1
121
+
122
+ instructions.each do |action|
123
+ name, args = action
124
+ args ? x.method(name).call(args) : x.method(name).call
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+
131
+ def short_pause()
132
+ sleep @short_delay + 0.1
133
+ end
134
+
135
+ def stop_listening()
136
+
137
+ @message = @a[2..-1].join.gsub(/(\d{2})(\d)/,'\1,\2').split(',')\
138
+ .inject([]) do |r, x|
139
+ (x != '42' ? r << @hb[x.to_i] : r[0..-2])
140
+ end.join
141
+
142
+ end
143
+ end
144
+
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: secret_knock
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Robertson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
14
+ YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
+ 8ixkARkWAmV1MB4XDTE2MDExOTE0MTUyNVoXDTE3MDExODE0MTUyNVowSDESMBAG
16
+ A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
+ EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
+ ggEBAMw9ZEKGJysjfGB97gh2L884jzymuenfVeYmX7ZIDJarTuHi5Jjtl0x5+399
19
+ YpObcoYD2kAMIMTXJl6ZaOUtjBXKFLK4JzKxm9Sk1ivagF5tfgdoFzlc25xzqJbQ
20
+ xvS9qqLM25zj6O5G3/HegthOQNXRODJuwa2prZ8/9pBQhKKy/CNmD6Ly6ar5Uy5I
21
+ 8DuXeWWBakJgBjiEJ0/coiXev9Ug0HG4+pQXgEHbAhfy3oqoFle65tBtm1ks06Qe
22
+ Bbk/DFYrDSwRHex4lAJLHSObRgHTQUpzekficTml2BeYBIrNqROAFp/Xx++e6/y9
23
+ A8JQEWSH/b+Q0WYLPxW5n7JYvuUCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
+ DwQEAwIEsDAdBgNVHQ4EFgQUE/COaLF24xP8FvuegdM7TRihSgUwJgYDVR0RBB8w
25
+ HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
+ c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEACeohTXZH
27
+ +xED/6ZHDUbbO4E+9HiQ73ebq1Wlam/H1/HALM+Ov0/RUlnckYlLpE9RVfbB3Keu
28
+ 3Ip5JMaaekntznVgk2N0puE3t+AQ76dVC5jz5QL7/wBSJkObK8l0oV3XzjfJjVRo
29
+ uJltriSINPolShaLkmCId+OO16ijxwcB6xUhzc/zN36BcMMje3bC7fbhWmM9p304
30
+ evPb1MUCKr5ZY0P5Y14HG9Kesh8igxk0kyiQNL7uW3UURH3gTsFcv26dU2xjqmzy
31
+ 99xt/V2xyDfAqj78KwcwRRl/reRM/gEwgnYu81SLIJj/VBHE111bleyFUb95Y6rQ
32
+ Zs+o5zexvKrktw==
33
+ -----END CERTIFICATE-----
34
+ date: 2016-01-19 00:00:00.000000000 Z
35
+ dependencies: []
36
+ description:
37
+ email: james@r0bertson.co.uk
38
+ executables: []
39
+ extensions: []
40
+ extra_rdoc_files: []
41
+ files:
42
+ - lib/secret_knock.rb
43
+ homepage: https://github.com/jrobertson/secret_knock
44
+ licenses:
45
+ - MIT
46
+ metadata: {}
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubyforge_project:
63
+ rubygems_version: 2.4.8
64
+ signing_key:
65
+ specification_version: 4
66
+ summary: Listens for a hidden message in a succession of knocks (or button presses)
67
+ using timing.
68
+ test_files: []
metadata.gz.sig ADDED
Binary file