hwping 0.1 → 0.2
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
- data/bin/hwping +8 -6
- data/lib/hwping/bot.rb +4 -5
- data/lib/hwping/config.rb +12 -13
- data/lib/hwping/constants.rb +6 -5
- data/lib/hwping/handler.rb +30 -15
- data/lib/hwping/hwping.rb +1 -2
- data/lib/hwping/launcher.rb +12 -12
- metadata +58 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c18dfab7c8e9e20c071cc51f6a36f6d0e2c21c04
|
4
|
+
data.tar.gz: 08c791adf1bd917fc072b880c28b4d24d7d65ddf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d0d79a4f4dfef09e164812079e186828d2e70f16f29a147e0a76991b83649e32b59eecee8cc8ba0122c5f93dae3401a3e67ac3866bf04b33f79abbb7110b9b1
|
7
|
+
data.tar.gz: 6c8c25675325b49a02dd98be552241fbbdc060a633aeaf2f22c1b290690205b14aeae3777a11c5caf875e9536330f4a1349c072b003bd7e8a26f8da5ad4cca20
|
data/bin/hwping
CHANGED
@@ -10,7 +10,7 @@ OptionParser.new do |opts|
|
|
10
10
|
opts.version = HWPing::VERSION
|
11
11
|
opts.program_name = HWPing::APP_NAME
|
12
12
|
opts.banner = 'Usage: hwping [options]'
|
13
|
-
opts.on('-c', '--config-file file.yml',
|
13
|
+
opts.on('-c', '--config-file file.yml', 'Specify which configuration file you want to use instead of the default config.yml') do |v|
|
14
14
|
options[:config] = v
|
15
15
|
end
|
16
16
|
end.parse!
|
@@ -19,14 +19,16 @@ end.parse!
|
|
19
19
|
file = options.fetch(:config, HWPing::CONFIG_FILE)
|
20
20
|
config = YAML.load_file(file)
|
21
21
|
|
22
|
-
#
|
22
|
+
# Initialize the application
|
23
23
|
app = HWPing::HWPing.new(config)
|
24
|
-
app.start
|
25
24
|
|
26
25
|
# Stop the bot and save the configuration file
|
27
26
|
at_exit do
|
28
|
-
app.stop
|
29
27
|
File.open(file, 'w') do |f|
|
30
|
-
YAML.dump(app.config
|
28
|
+
f.write(YAML.dump(app.config))
|
31
29
|
end
|
32
|
-
|
30
|
+
app.stop
|
31
|
+
end
|
32
|
+
|
33
|
+
# Run the application
|
34
|
+
app.start
|
data/lib/hwping/bot.rb
CHANGED
@@ -2,7 +2,6 @@ require 'cinch'
|
|
2
2
|
|
3
3
|
module HWPing
|
4
4
|
class Bot
|
5
|
-
|
6
5
|
MESSAGES = {
|
7
6
|
:unauthorized => "Sorry, you're unauthorized to use this bot!",
|
8
7
|
:firing => 'Firing rocket in 5 seconds!',
|
@@ -28,16 +27,16 @@ module HWPing
|
|
28
27
|
target set <nick> <right> <up>\n
|
29
28
|
target get <nick>\n
|
30
29
|
target del <nick>\n"
|
31
|
-
}
|
30
|
+
}.freeze
|
32
31
|
|
33
32
|
# Initialize a bot and return with its Cinch instance
|
34
33
|
def initialize(handler, config = {})
|
35
|
-
@bot = Cinch::Bot.new do
|
34
|
+
@bot = Cinch::Bot.new do
|
36
35
|
configure do |c|
|
37
36
|
c.nick = config.nick
|
38
37
|
c.server = config.server
|
39
38
|
c.port = config.port
|
40
|
-
c.channels = config.channels.map { |m| "\##{m}"}
|
39
|
+
c.channels = config.channels.map { |m| "\##{m}" }
|
41
40
|
end
|
42
41
|
|
43
42
|
# For channel mesages, just reply with the matching message
|
@@ -64,4 +63,4 @@ module HWPing
|
|
64
63
|
@bot.quit
|
65
64
|
end
|
66
65
|
end
|
67
|
-
end
|
66
|
+
end
|
data/lib/hwping/config.rb
CHANGED
@@ -1,24 +1,23 @@
|
|
1
1
|
module HWPing
|
2
2
|
class Config
|
3
|
-
|
4
|
-
attr_reader
|
5
|
-
attr_reader
|
6
|
-
attr_reader
|
7
|
-
attr_reader
|
8
|
-
attr_reader :auth
|
3
|
+
attr_reader :server
|
4
|
+
attr_reader :port
|
5
|
+
attr_reader :nick
|
6
|
+
attr_reader :channels
|
7
|
+
attr_reader :auth
|
9
8
|
attr_accessor :targets
|
10
9
|
|
11
10
|
def initialize(hash = {})
|
12
|
-
@server = hash.fetch('server',
|
13
|
-
@port = hash.fetch('port',
|
14
|
-
@nick = hash.fetch('nick',
|
15
|
-
@channels = hash.fetch('channels', ['hwping-test'])
|
16
|
-
@auth = hash.fetch('auth'
|
17
|
-
@targets = hash.fetch('targets',
|
11
|
+
@server = hash.fetch('server', 'irc.freenode.net')
|
12
|
+
@port = hash.fetch('port', 6667)
|
13
|
+
@nick = hash.fetch('nick', 'hwping')
|
14
|
+
@channels = Array(hash.fetch('channels', ['hwping-test']))
|
15
|
+
@auth = Array(hash.fetch('auth', []))
|
16
|
+
@targets = hash.fetch('targets', {}).to_h
|
18
17
|
end
|
19
18
|
|
20
19
|
def to_hash
|
21
20
|
Hash[instance_variables.map { |name| [name[1..-1], instance_variable_get(name)] }]
|
22
21
|
end
|
23
22
|
end
|
24
|
-
end
|
23
|
+
end
|
data/lib/hwping/constants.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module HWPing
|
2
|
-
VERSION = '0.
|
3
|
-
APP_NAME = 'hwping'
|
4
|
-
REPO_URL = 'http://github.com/skateman/hwping'
|
5
|
-
CONFIG_FILE = 'config.yml'
|
6
|
-
end
|
3
|
+
VERSION = '0.2'.freeze
|
4
|
+
APP_NAME = 'hwping'.freeze
|
5
|
+
REPO_URL = 'http://github.com/skateman/hwping'.freeze
|
6
|
+
CONFIG_FILE = 'config.yml'.freeze
|
7
|
+
end
|
data/lib/hwping/handler.rb
CHANGED
@@ -11,9 +11,9 @@ module HWPing
|
|
11
11
|
# If the event happened in a channel, return just with a symbol
|
12
12
|
def channel(event)
|
13
13
|
if event.message =~ /^hwping,?\s+(.*)\s*$/
|
14
|
-
if
|
15
|
-
if @targets.include?(
|
16
|
-
@launcher.point_and_fire(@targets[
|
14
|
+
if authorized?(event.user.to_s)
|
15
|
+
if @targets.include?(Regexp.last_match(1))
|
16
|
+
@launcher.point_and_fire(@targets[Regexp.last_match(1)])
|
17
17
|
return :firing
|
18
18
|
else
|
19
19
|
return :notarget
|
@@ -26,26 +26,32 @@ module HWPing
|
|
26
26
|
|
27
27
|
# If the event happened in a private window, return with an array
|
28
28
|
def private(event)
|
29
|
-
if
|
29
|
+
if authorized?(event.user.to_s)
|
30
30
|
case event.message
|
31
|
-
when
|
31
|
+
when 'fire'
|
32
32
|
@launcher.fire
|
33
33
|
return [:fire]
|
34
|
-
when
|
34
|
+
when 'position'
|
35
35
|
return @launcher.position.unshift(:position)
|
36
|
-
when
|
36
|
+
when 'help'
|
37
37
|
return [:help]
|
38
|
-
when
|
38
|
+
when 'reset'
|
39
39
|
@launcher.reset
|
40
40
|
return [:reset]
|
41
|
-
when
|
41
|
+
when 'target list'
|
42
42
|
return [:target_list, @targets.keys.join(', ')]
|
43
43
|
when /^target set ([^\s]+)( (\d+) (\d+))?$/
|
44
|
-
@targets[
|
45
|
-
|
44
|
+
@targets[Regexp.last_match(1)] = begin
|
45
|
+
if Regexp.last_match(2)
|
46
|
+
[Regexp.last_match(3).to_i, Regexp.last_match(4).to_i]
|
47
|
+
else
|
48
|
+
@launcher.position
|
49
|
+
end
|
50
|
+
end
|
51
|
+
return [:target_set, @targets[Regexp.last_match(1)]].flatten
|
46
52
|
when /^target ((get)|(del)) ([^\s]+)$/
|
47
|
-
if @targets.
|
48
|
-
if
|
53
|
+
if @targets.key?($+)
|
54
|
+
if Regexp.last_match(1) == 'del'
|
49
55
|
@targets.delete($+)
|
50
56
|
return [:target_del]
|
51
57
|
else
|
@@ -55,7 +61,7 @@ module HWPing
|
|
55
61
|
return [:notarget]
|
56
62
|
end
|
57
63
|
when /^((up)|(down)|(left)|(right)) (\d+)$/
|
58
|
-
@launcher.send(
|
64
|
+
@launcher.send(Regexp.last_match(1), $+.to_i)
|
59
65
|
return [:move]
|
60
66
|
else
|
61
67
|
return [:badcommand]
|
@@ -64,5 +70,14 @@ module HWPing
|
|
64
70
|
return [:unauthorized]
|
65
71
|
end
|
66
72
|
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def authorized?(nick)
|
77
|
+
@auth.each do |user|
|
78
|
+
return true if user =~ /^#{nick}(?:\b?|\S?)/
|
79
|
+
end
|
80
|
+
false
|
81
|
+
end
|
67
82
|
end
|
68
|
-
end
|
83
|
+
end
|
data/lib/hwping/hwping.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
module HWPing
|
2
2
|
class HWPing
|
3
|
-
|
4
3
|
attr_reader :bot
|
5
4
|
|
6
5
|
def initialize(config = {})
|
7
6
|
@config = Config.new(config)
|
8
|
-
@launcher = Launcher.connect
|
7
|
+
@launcher = Launcher.connect
|
9
8
|
@handler = Handler.new(@launcher, @config)
|
10
9
|
@bot = Bot.new(@handler, @config)
|
11
10
|
end
|
data/lib/hwping/launcher.rb
CHANGED
@@ -3,13 +3,12 @@ require 'libusb'
|
|
3
3
|
|
4
4
|
module HWPing
|
5
5
|
class Launcher
|
6
|
-
|
7
6
|
DeviceNotFoundError = Class.new(IOError)
|
8
7
|
|
9
8
|
DEVICE = {
|
10
9
|
:vendor_id => 0x2123,
|
11
10
|
:product_id => 0x1010
|
12
|
-
}
|
11
|
+
}.freeze
|
13
12
|
|
14
13
|
COMMANDS = {
|
15
14
|
:down => 0x01,
|
@@ -20,12 +19,12 @@ module HWPing
|
|
20
19
|
:stop => 0x20,
|
21
20
|
:on => 0x01,
|
22
21
|
:off => 0x00
|
23
|
-
}
|
22
|
+
}.freeze
|
24
23
|
|
25
24
|
TARGETS = {
|
26
25
|
:launcher => 0x02,
|
27
26
|
:led => 0x03
|
28
|
-
}
|
27
|
+
}.freeze
|
29
28
|
|
30
29
|
REQUEST_TYPE = 0x21
|
31
30
|
REQUEST = 0x09
|
@@ -38,7 +37,7 @@ module HWPing
|
|
38
37
|
:idProduct => DEVICE[:product_id]
|
39
38
|
).first
|
40
39
|
|
41
|
-
|
40
|
+
fail DeviceNotFoundError, 'Launcher was not found.' if launcher.nil?
|
42
41
|
new(launcher)
|
43
42
|
end
|
44
43
|
|
@@ -99,18 +98,19 @@ module HWPing
|
|
99
98
|
update_pos direction, duration
|
100
99
|
end
|
101
100
|
|
102
|
-
|
101
|
+
private
|
102
|
+
|
103
103
|
# Send data through USB
|
104
104
|
def send!(target, command)
|
105
105
|
payload = build_payload(target, COMMANDS[command.to_sym])
|
106
106
|
|
107
107
|
@handle.control_transfer(
|
108
|
-
bmRequestType
|
109
|
-
bRequest
|
110
|
-
wValue
|
111
|
-
wIndex
|
112
|
-
dataOut
|
113
|
-
timeout
|
108
|
+
:bmRequestType => REQUEST_TYPE,
|
109
|
+
:bRequest => REQUEST,
|
110
|
+
:wValue => 0,
|
111
|
+
:wIndex => 0,
|
112
|
+
:dataOut => payload,
|
113
|
+
:timeout => 0
|
114
114
|
)
|
115
115
|
end
|
116
116
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hwping
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dávid Halász
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: libusb
|
@@ -16,56 +16,98 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.5.
|
19
|
+
version: 0.5.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.5.
|
26
|
+
version: 0.5.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: cinch
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.
|
33
|
+
version: 2.3.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.
|
40
|
+
version: 2.3.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: codecov
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.1.4
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.4
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: 10.
|
61
|
+
version: 10.5.0
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: 10.
|
68
|
+
version: 10.5.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rspec
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
75
|
+
version: 3.4.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.4.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.37.2
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
96
|
+
version: 0.37.2
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.11.2
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.11.2
|
69
111
|
description: IRC bot for HW pinging with the Dream Cheeky Thunder missile launcher
|
70
112
|
email: skateman@skateman.eu
|
71
113
|
executables:
|
@@ -73,14 +115,14 @@ executables:
|
|
73
115
|
extensions: []
|
74
116
|
extra_rdoc_files: []
|
75
117
|
files:
|
76
|
-
-
|
77
|
-
- lib/hwping
|
78
|
-
- lib/hwping/hwping.rb
|
118
|
+
- bin/hwping
|
119
|
+
- lib/hwping.rb
|
79
120
|
- lib/hwping/bot.rb
|
80
121
|
- lib/hwping/config.rb
|
81
122
|
- lib/hwping/constants.rb
|
82
|
-
- lib/hwping.rb
|
83
|
-
-
|
123
|
+
- lib/hwping/handler.rb
|
124
|
+
- lib/hwping/hwping.rb
|
125
|
+
- lib/hwping/launcher.rb
|
84
126
|
homepage: http://github.com/skateman/hwping
|
85
127
|
licenses:
|
86
128
|
- GPL-2
|
@@ -101,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
143
|
version: '0'
|
102
144
|
requirements: []
|
103
145
|
rubyforge_project:
|
104
|
-
rubygems_version: 2.
|
146
|
+
rubygems_version: 2.5.1
|
105
147
|
signing_key:
|
106
148
|
specification_version: 4
|
107
149
|
summary: Hardware Pinger
|