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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb3c6abf09f3ce657496ebac2b2bb384a5fa9962
4
- data.tar.gz: fff381302cd8132fe6412be5837f398d500a0d0f
3
+ metadata.gz: 5e3830cc91efbb2027aeb162469d24efded0b4c6
4
+ data.tar.gz: c5834dc8320206ec114b8fc394abd037c850bbb0
5
5
  SHA512:
6
- metadata.gz: ed5df1caa8891bfa3da2e627d1eccfb21d85d06d08ed4dcce37d8d5eea72aa8b3f6b6551238801be388b836f57f6c0185eea881aefa0964177e10cff4cd52dfb
7
- data.tar.gz: 1b677c17b260d8c4234967a689e0fa70891c11ccacb65c0c0ad1701995d33fe2e8be0c98b1854fef39a5f767a2d0b51d47e65912dc28e16e81e9892bdb0a74ce
6
+ metadata.gz: 4368e32e490b74e4ee62cccf2987920e161cd69cfe3de97b33a5a05af51c8038835245c27c8f53a124aceea3dc1d9ea7c4022dd5d9eb0daa208d0291bdfc8afd
7
+ data.tar.gz: 0956fabcfa902d5ff9fc4ea0b3adbb74a2ef148fe15bb62ae872c1c3194b895b1d6765ca69e99053cddabdf6dadb7b067006d98ea2b1cdae9aa6445739eccd35
@@ -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")
@@ -1,3 +1,4 @@
1
1
  require 'ircmachine/command'
2
2
  require 'ircmachine/message'
3
+ require 'ircmachine/reply'
3
4
  require 'ircmachine/version'
@@ -30,12 +30,8 @@ module IRCMachine
30
30
 
31
31
  klass = Class.new do
32
32
  define_method(:initialize) do |prefix = nil, *args|
33
- instance_variable_set('@prefix', prefix)
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 commands like WHOIS, which has an optional parameter in the
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 do |e|
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.
@@ -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
@@ -1,3 +1,3 @@
1
1
  module IRCMachine
2
- VERSION = "0.0.1"
2
+ VERSION = '0.0.2'
3
3
  end
@@ -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.1
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
- homepage: ''
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