ircmachine 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ircmachine.gemspec +1 -1
- data/lib/ircmachine.rb +1 -0
- data/lib/ircmachine/command.rb +5 -17
- data/lib/ircmachine/message.rb +8 -0
- data/lib/ircmachine/reply.rb +188 -0
- data/lib/ircmachine/version.rb +1 -1
- data/spec/reply_spec.rb +47 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e3830cc91efbb2027aeb162469d24efded0b4c6
|
4
|
+
data.tar.gz: c5834dc8320206ec114b8fc394abd037c850bbb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4368e32e490b74e4ee62cccf2987920e161cd69cfe3de97b33a5a05af51c8038835245c27c8f53a124aceea3dc1d9ea7c4022dd5d9eb0daa208d0291bdfc8afd
|
7
|
+
data.tar.gz: 0956fabcfa902d5ff9fc4ea0b3adbb74a2ef148fe15bb62ae872c1c3194b895b1d6765ca69e99053cddabdf6dadb7b067006d98ea2b1cdae9aa6445739eccd35
|
data/ircmachine.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ['chris.davies.uk@member.mensa.org']
|
11
11
|
spec.summary = %q{A simple IRC protocol parser.}
|
12
12
|
spec.description = spec.summary
|
13
|
-
spec.homepage = ''
|
13
|
+
spec.homepage = 'https://github.com/north636/ircmachine'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
data/lib/ircmachine.rb
CHANGED
data/lib/ircmachine/command.rb
CHANGED
@@ -30,12 +30,8 @@ module IRCMachine
|
|
30
30
|
|
31
31
|
klass = Class.new do
|
32
32
|
define_method(:initialize) do |prefix = nil, *args|
|
33
|
-
|
34
|
-
|
35
|
-
arg_names.zip(args).each do |e|
|
36
|
-
name, value = e[0], e[1]
|
37
|
-
instance_variable_set("@#{name}", value)
|
38
|
-
end
|
33
|
+
@prefix = prefix
|
34
|
+
arg_names.zip(args).each { |name, value| instance_variable_set("@#{name}", value) }
|
39
35
|
end
|
40
36
|
|
41
37
|
# Create readers for the parameters.
|
@@ -47,12 +43,7 @@ module IRCMachine
|
|
47
43
|
|
48
44
|
define_method(:to_msg) do
|
49
45
|
param_values = arg_names.map { |k| instance_variable_get("@#{k}") }.join(' ')
|
50
|
-
|
51
|
-
IRCMachine::Message.new(
|
52
|
-
instance_variable_get('@prefix'),
|
53
|
-
cmd,
|
54
|
-
param_values
|
55
|
-
)
|
46
|
+
IRCMachine::Message.new(@prefix, cmd, param_values)
|
56
47
|
end
|
57
48
|
|
58
49
|
define_method(:to_s) { self.to_msg.to_s }
|
@@ -64,7 +55,7 @@ module IRCMachine
|
|
64
55
|
private :defcmd
|
65
56
|
|
66
57
|
# Same as defcmd, but arguments are passed in reverse order. This is to
|
67
|
-
# support
|
58
|
+
# support the WHOIS command, which has an optional parameter in the
|
68
59
|
# middle, rather than at the end...
|
69
60
|
def defrcmd(cmd, *arg_names)
|
70
61
|
cmd = cmd.strip.upcase
|
@@ -73,10 +64,7 @@ module IRCMachine
|
|
73
64
|
define_method(:initialize) do |prefix = nil, *args|
|
74
65
|
instance_variable_set('@prefix', prefix)
|
75
66
|
|
76
|
-
arg_names.reverse.zip(args.reverse).each
|
77
|
-
name, value = e[0], e[1]
|
78
|
-
instance_variable_set("@#{name}", value)
|
79
|
-
end
|
67
|
+
arg_names.reverse.zip(args.reverse).each { |name, value| instance_variable_set("@#{name}", value) }
|
80
68
|
end
|
81
69
|
|
82
70
|
# Create readers for the parameters.
|
data/lib/ircmachine/message.rb
CHANGED
@@ -44,6 +44,14 @@ module IRCMachine
|
|
44
44
|
str << "\r\n"
|
45
45
|
end
|
46
46
|
|
47
|
+
def reply?
|
48
|
+
!!(@command =~ /^\d+$/)
|
49
|
+
end
|
50
|
+
|
51
|
+
def command?
|
52
|
+
!reply?
|
53
|
+
end
|
54
|
+
|
47
55
|
def self.parse(str)
|
48
56
|
unless (m = MESSAGE.match(str)).nil?
|
49
57
|
Message.new(m[:prefix], m[:command], m[:params])
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'ircmachine/message'
|
2
|
+
|
3
|
+
module IRCMachine
|
4
|
+
module Reply
|
5
|
+
class << self
|
6
|
+
def replies
|
7
|
+
@replies ||= {}
|
8
|
+
end
|
9
|
+
private :replies
|
10
|
+
|
11
|
+
def from_msg(msg)
|
12
|
+
if (klass = replies[msg.command]).nil?
|
13
|
+
fail ArgumentError, "Unknown reply: #{msg.command}"
|
14
|
+
else
|
15
|
+
klass.new(msg.prefix, *msg.params)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse(str)
|
20
|
+
if (msg = IRCMachine::Message.parse(str)).nil?
|
21
|
+
fail ArgumentError, 'Invalid format for IRC message.'
|
22
|
+
else
|
23
|
+
from_msg(msg)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def defrpl(code, name, *arg_names)
|
28
|
+
raise ArgumentError, 'Code must be 3 digits.' unless code =~ /^\d{3}$/
|
29
|
+
|
30
|
+
klass = Class.new do
|
31
|
+
define_method(:initialize) do |prefix, *args|
|
32
|
+
@prefix = prefix
|
33
|
+
arg_names.zip(args).each { |name, value| instance_variable_set("@#{name}", value) }
|
34
|
+
end
|
35
|
+
|
36
|
+
arg_names.each do |name|
|
37
|
+
define_method(name) { instance_variable_get("@#{name}") }
|
38
|
+
end
|
39
|
+
|
40
|
+
define_method(:prefix) { @prefix }
|
41
|
+
define_method(:code) { code }
|
42
|
+
|
43
|
+
define_method(:to_msg) do
|
44
|
+
param_values = arg_names.map { |k| instance_variable_get("@#{k}") }.join(' ')
|
45
|
+
IRCMachine::Message.new(@prefix, code, param_values)
|
46
|
+
end
|
47
|
+
|
48
|
+
define_method(:to_s) { self.to_msg.to_s }
|
49
|
+
end
|
50
|
+
|
51
|
+
class_name = "#{name.to_s.split('_').map(&:capitalize).join('')}Reply"
|
52
|
+
const_set(class_name, klass)
|
53
|
+
|
54
|
+
replies[code] = klass
|
55
|
+
end
|
56
|
+
private :defrpl
|
57
|
+
end
|
58
|
+
|
59
|
+
defrpl '001', :welcome, :message
|
60
|
+
defrpl '002', :your_host, :message
|
61
|
+
defrpl '003', :created, :message
|
62
|
+
defrpl '004', :my_info, :info
|
63
|
+
defrpl '005', :bounce, :message
|
64
|
+
|
65
|
+
# Ignoring trace stuff.
|
66
|
+
|
67
|
+
defrpl '212', :stats_commands, :command, :count, :byte_count, :remote_count
|
68
|
+
defrpl '219', :end_of_stats, :message
|
69
|
+
defrpl '221', :u_modeis, :mode_string
|
70
|
+
defrpl '234', :serv_list, :name, :server, :mask, :type, :hop_count, :info
|
71
|
+
defrpl '235', :serv_list_end, :mask, :type, :message
|
72
|
+
defrpl '242', :stats_uptime, :message
|
73
|
+
defrpl '243', :stats_o_line, :o, :hostmask, :star, :name
|
74
|
+
defrpl '251', :l_user_client, :message
|
75
|
+
defrpl '252', :l_user_op, :num_ops, :message
|
76
|
+
defrpl '253', :l_user_unknown, :num_unknowns, :message
|
77
|
+
defrpl '254', :l_user_channels, :num_channels, :message
|
78
|
+
defrpl '255', :l_user_me, :message
|
79
|
+
defrpl '256', :admin_me, :server, :message
|
80
|
+
defrpl '257', :admin_loc1, :info
|
81
|
+
defrpl '258', :admin_loc2, :info
|
82
|
+
defrpl '259', :admin_email, :info
|
83
|
+
defrpl '263', :try_again, :command, :message
|
84
|
+
|
85
|
+
defrpl '301', :away, :nickname, :away_message
|
86
|
+
defrpl '302', :user_host, :replies
|
87
|
+
defrpl '303', :is_on, :nicknames
|
88
|
+
defrpl '305', :unaway, :message
|
89
|
+
defrpl '306', :now_away, :message
|
90
|
+
defrpl '311', :whois_user, :nickname, :user, :host, :star, :real_name
|
91
|
+
defrpl '312', :whois_server, :nickname, :server, :server_info
|
92
|
+
defrpl '313', :whois_operator, :nickname, :message
|
93
|
+
defrpl '314', :whowas_user, :nickname, :user, :host, :star, :real_name
|
94
|
+
defrpl '315', :end_of_who, :name, :message
|
95
|
+
defrpl '317', :whois_idle, :nickname, :idle_time, :message
|
96
|
+
defrpl '318', :end_of_whois, :nickname, :message
|
97
|
+
defrpl '319', :whois_channels, :nickname, :channels
|
98
|
+
defrpl '321', :list_start, :message
|
99
|
+
defrpl '322', :list, :channel, :num_visible, :topic
|
100
|
+
defrpl '323', :list_end, :message
|
101
|
+
defrpl '324', :channel_mode_is, :channel, :mode, :mode_params
|
102
|
+
defrpl '325', :uniq_op_is, :channel, :nickname
|
103
|
+
defrpl '331', :no_topic, :channel, :message
|
104
|
+
defrpl '332', :topic, :channel, :message
|
105
|
+
defrpl '341', :inviting, :channel, :nickname
|
106
|
+
defrpl '342', :summoning, :user, :message
|
107
|
+
defrpl '346', :invite_list, :channel, :invite_mask
|
108
|
+
defrpl '347', :end_of_invite_list, :channel, :message
|
109
|
+
defrpl '348', :except_list, :channel, :exception_mask
|
110
|
+
defrpl '349', :end_of_except_list, :channel, :message
|
111
|
+
defrpl '351', :version, :version, :server, :comments
|
112
|
+
defrpl '352', :who, :channel, :user, :host, :server, :nickname # TODO: uhh... what comes after?
|
113
|
+
defrpl '353', :nam, :channel_type, :channel, :info
|
114
|
+
defrpl '364', :links, :mask, :server, :info
|
115
|
+
defrpl '365', :end_of_links, :mask, :message
|
116
|
+
defrpl '366', :end_of_names, :channel, :message
|
117
|
+
defrpl '367', :ban_list, :channel, :ban_mask
|
118
|
+
defrpl '368', :end_of_ban_list, :channel, :message
|
119
|
+
defrpl '369', :end_of_whowas, :nickname, :message
|
120
|
+
defrpl '371', :info, :message
|
121
|
+
defrpl '372', :motd, :message
|
122
|
+
defrpl '374', :end_of_info, :message
|
123
|
+
defrpl '375', :motd_start, :message
|
124
|
+
defrpl '376', :end_of_motd, :message
|
125
|
+
defrpl '381', :youre_oper, :message
|
126
|
+
defrpl '382', :rehashing, :config_file, :message
|
127
|
+
defrpl '383', :youre_service, :message
|
128
|
+
defrpl '391', :time, :server, :time
|
129
|
+
defrpl '392', :users_start, :info
|
130
|
+
defrpl '393', :users, :info
|
131
|
+
defrpl '394', :end_of_users, :message
|
132
|
+
defrpl '395', :no_users, :message
|
133
|
+
|
134
|
+
defrpl '401', :no_such_nickname_error, :nickname, :message
|
135
|
+
defrpl '402', :no_such_server_error, :server, :message
|
136
|
+
defrpl '403', :no_such_channel_error, :channel, :message
|
137
|
+
defrpl '404', :cannot_send_to_channel_error, :channel, :message
|
138
|
+
defrpl '405', :too_many_channels_error, :channel, :message
|
139
|
+
defrpl '406', :was_no_such_nickname_error, :nickname, :message
|
140
|
+
defrpl '407', :too_many_targets_error, :target, :message
|
141
|
+
defrpl '408', :no_such_service_error, :service, :message
|
142
|
+
defrpl '409', :no_origin_error, :message
|
143
|
+
defrpl '411', :no_recipient_error, :message
|
144
|
+
defrpl '412', :no_text_to_send_error, :message
|
145
|
+
defrpl '413', :no_top_level_error, :message
|
146
|
+
defrpl '414', :wild_top_level_error, :message
|
147
|
+
defrpl '415', :bad_mask_error, :mask, :message
|
148
|
+
defrpl '421', :unknown_command_error, :command, :message
|
149
|
+
defrpl '422', :no_motd_error, :message
|
150
|
+
defrpl '423', :no_admin_info_error, :server, :message
|
151
|
+
defrpl '424', :file_error_error, :message
|
152
|
+
defrpl '431', :no_nickname_given_error, :message
|
153
|
+
defrpl '432', :erroneous_nickname_error, :nickname, :message
|
154
|
+
defrpl '433', :nickname_in_use_error, :nickname, :message
|
155
|
+
defrpl '436', :nickname_collision_error, :nickname, :message
|
156
|
+
defrpl '437', :unavailable_resource_error, :what, :message
|
157
|
+
defrpl '441', :user_not_in_channel_error, :nickname, :channel, :message
|
158
|
+
defrpl '442', :not_on_channel_error, :channel, :message
|
159
|
+
defrpl '443', :user_on_channel_error, :nickname, :channel, :message
|
160
|
+
defrpl '444', :no_login_error, :nickname, :message
|
161
|
+
defrpl '445', :summon_disabled_error, :message
|
162
|
+
defrpl '446', :users_disabled_error, :message
|
163
|
+
defrpl '451', :not_registered_error, :message
|
164
|
+
defrpl '461', :need_more_params_error, :command, :message
|
165
|
+
defrpl '462', :already_registered_error, :message
|
166
|
+
defrpl '463', :no_perm_for_host_error, :message
|
167
|
+
defrpl '464', :incorrect_password_error, :message
|
168
|
+
defrpl '465', :banned_error, :message
|
169
|
+
defrpl '466', :you_will_be_banned_error, :message
|
170
|
+
defrpl '467', :key_set_error, :channel, :message
|
171
|
+
defrpl '471', :channel_full_error, :channel, :message
|
172
|
+
defrpl '472', :unknown_mode_error, :mode, :message
|
173
|
+
defrpl '473', :invite_only_channel_error, :channel, :message
|
174
|
+
defrpl '474', :banned_from_channel_error, :channel, :message
|
175
|
+
defrpl '475', :incorrect_key_error, :channel, :message
|
176
|
+
defrpl '476', :bad_channel_mask_error, :channel, :message
|
177
|
+
defrpl '477', :no_channel_modes_error, :channel, :message
|
178
|
+
defrpl '478', :ban_list_full_error, :channel, :char, :message
|
179
|
+
defrpl '481', :no_privileges_error, :message
|
180
|
+
defrpl '482', :not_operator_error, :channel, :message
|
181
|
+
defrpl '483', :cant_kill_server_error, :message
|
182
|
+
defrpl '484', :restricted_error, :message
|
183
|
+
defrpl '485', :not_original_operator_error, :channel, :message
|
184
|
+
defrpl '491', :no_oper_host_error, :message
|
185
|
+
defrpl '501', :unknown_u_mode_flag_error, :message
|
186
|
+
defrpl '502', :users_dont_match_error, :message
|
187
|
+
end
|
188
|
+
end
|
data/lib/ircmachine/version.rb
CHANGED
data/spec/reply_spec.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
|
3
|
+
require 'ircmachine/reply'
|
4
|
+
|
5
|
+
describe IRCMachine::Reply do
|
6
|
+
describe 'defrpl' do
|
7
|
+
it 'should generate properly-named classes' do
|
8
|
+
r = IRCMachine::Reply.parse("001 :foo\r\n")
|
9
|
+
r.wont_be_nil
|
10
|
+
r.must_be_instance_of IRCMachine::Reply::WelcomeReply
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should assign parameter values to names, if given' do
|
14
|
+
r = IRCMachine::Reply.parse(":example.com 263 JOIN :message here\r\n")
|
15
|
+
r.wont_be_nil
|
16
|
+
r.must_be_instance_of IRCMachine::Reply::TryAgainReply
|
17
|
+
r.prefix.must_equal ':example.com'
|
18
|
+
r.code.must_equal '263'
|
19
|
+
r.command.must_equal 'JOIN'
|
20
|
+
r.message.must_equal ':message here'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should assign nil to parameters that are omitted' do
|
24
|
+
r = IRCMachine::Reply.parse(":example.com 263 JOIN\r\n")
|
25
|
+
r.wont_be_nil
|
26
|
+
r.must_be_instance_of IRCMachine::Reply::TryAgainReply
|
27
|
+
r.prefix.must_equal ':example.com'
|
28
|
+
r.code.must_equal '263'
|
29
|
+
r.command.must_equal 'JOIN'
|
30
|
+
r.message.must_be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'provides a method for transforming back to a Message object' do
|
34
|
+
r = IRCMachine::Reply.parse(":example.com 263 JOIN :message here\r\n")
|
35
|
+
m = r.to_msg
|
36
|
+
m.wont_be_nil
|
37
|
+
m.prefix.must_equal ':example.com'
|
38
|
+
m.command.must_equal '263'
|
39
|
+
m.params.must_equal [ 'JOIN', ':message here' ]
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'provides a sensible to_s implementation' do
|
43
|
+
r = IRCMachine::Reply.parse(":example.com 263 JOIN :message here\r\n")
|
44
|
+
r.to_s.must_equal ":example.com 263 JOIN :message here\r\n"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ircmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Davies
|
@@ -55,11 +55,13 @@ files:
|
|
55
55
|
- lib/ircmachine/command.rb
|
56
56
|
- lib/ircmachine/ircsocketadapter.rb
|
57
57
|
- lib/ircmachine/message.rb
|
58
|
+
- lib/ircmachine/reply.rb
|
58
59
|
- lib/ircmachine/version.rb
|
59
60
|
- spec/command_spec.rb
|
60
61
|
- spec/ircsocketadapter_spec.rb
|
61
62
|
- spec/message_spec.rb
|
62
|
-
|
63
|
+
- spec/reply_spec.rb
|
64
|
+
homepage: https://github.com/north636/ircmachine
|
63
65
|
licenses:
|
64
66
|
- MIT
|
65
67
|
metadata: {}
|
@@ -87,3 +89,4 @@ test_files:
|
|
87
89
|
- spec/command_spec.rb
|
88
90
|
- spec/ircsocketadapter_spec.rb
|
89
91
|
- spec/message_spec.rb
|
92
|
+
- spec/reply_spec.rb
|