ircmachine 0.0.1 → 0.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 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