ircguerilla-irc 1.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.
- data/lib/irc/client/client_error.rb +35 -0
- data/lib/irc/client/command_handler.rb +113 -0
- data/lib/irc/client/connected_state.rb +95 -0
- data/lib/irc/client/connection.rb +119 -0
- data/lib/irc/client/connection_listener.rb +97 -0
- data/lib/irc/client/connection_state.rb +88 -0
- data/lib/irc/client/context.rb +250 -0
- data/lib/irc/client/disconnected_state.rb +132 -0
- data/lib/irc/client/message_handler.rb +87 -0
- data/lib/irc/client/registered_state.rb +90 -0
- data/lib/irc/client/unregistered_state.rb +113 -0
- data/lib/irc/commands/command.rb +57 -0
- data/lib/irc/commands/invalid_command.rb +35 -0
- data/lib/irc/commands/join_command.rb +122 -0
- data/lib/irc/commands/nick_command.rb +86 -0
- data/lib/irc/commands/part_command.rb +84 -0
- data/lib/irc/commands/password_command.rb +72 -0
- data/lib/irc/commands/ping_command.rb +79 -0
- data/lib/irc/commands/pong_command.rb +68 -0
- data/lib/irc/commands/quit_command.rb +77 -0
- data/lib/irc/commands/user_command.rb +105 -0
- data/lib/irc/messages/codes.rb +186 -0
- data/lib/irc/messages/error_join_message.rb +72 -0
- data/lib/irc/messages/error_message.rb +101 -0
- data/lib/irc/messages/factory.rb +122 -0
- data/lib/irc/messages/invalid_message.rb +35 -0
- data/lib/irc/messages/join_message.rb +130 -0
- data/lib/irc/messages/message.rb +110 -0
- data/lib/irc/messages/nick_message.rb +93 -0
- data/lib/irc/messages/notice_message.rb +87 -0
- data/lib/irc/messages/part_message.rb +95 -0
- data/lib/irc/messages/ping_message.rb +101 -0
- data/lib/irc/messages/pong_message.rb +89 -0
- data/lib/irc/messages/private_message.rb +121 -0
- data/lib/irc/models/bot.rb +159 -0
- data/lib/irc/models/channel.rb +158 -0
- data/lib/irc/models/network.rb +252 -0
- data/lib/irc/models/packet.rb +84 -0
- data/lib/irc/models/server.rb +116 -0
- data/lib/irc/models/user.rb +112 -0
- data/test/functional/irc/client/connection_test.rb +118 -0
- data/test/functional/irc/client/context_test.rb +126 -0
- data/test/test_helper.rb +32 -0
- data/test/unit/irc/client/command_handler_test.rb +137 -0
- data/test/unit/irc/commands/join_command_test.rb +72 -0
- data/test/unit/irc/commands/nick_command_test.rb +35 -0
- data/test/unit/irc/commands/part_command_test.rb +52 -0
- data/test/unit/irc/commands/password_command_test.rb +35 -0
- data/test/unit/irc/commands/ping_command_test.rb +36 -0
- data/test/unit/irc/commands/pong_command_test.rb +36 -0
- data/test/unit/irc/commands/quit_command_test.rb +35 -0
- data/test/unit/irc/commands/user_command_test.rb +35 -0
- data/test/unit/irc/messages/error_join_message_test.rb +45 -0
- data/test/unit/irc/messages/factory_test.rb +62 -0
- data/test/unit/irc/messages/join_message_test.rb +46 -0
- data/test/unit/irc/messages/message_test.rb +56 -0
- data/test/unit/irc/messages/nick_message_test.rb +48 -0
- data/test/unit/irc/messages/notice_message_test.rb +43 -0
- data/test/unit/irc/messages/part_message_test.rb +47 -0
- data/test/unit/irc/messages/ping_message_test.rb +57 -0
- data/test/unit/irc/messages/pong_message_test.rb +57 -0
- data/test/unit/irc/messages/private_message_test.rb +42 -0
- data/test/unit/irc/models/bot_test.rb +85 -0
- data/test/unit/irc/models/channel_test.rb +90 -0
- data/test/unit/irc/models/network_test.rb +210 -0
- data/test/unit/irc/models/packet_test.rb +38 -0
- data/test/unit/irc/models/server_test.rb +54 -0
- data/test/unit/irc/models/user_test.rb +67 -0
- metadata +111 -0
@@ -0,0 +1,122 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (c) 2006 Roman Scherer | IRC Guerilla | Rapid Packet Movement
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#
|
24
|
+
# $Id: factory.rb 93 2006-08-13 21:30:53Z roman $
|
25
|
+
#
|
26
|
+
require 'irc/messages/message'
|
27
|
+
require 'irc/messages/error_message'
|
28
|
+
require 'irc/messages/join_message'
|
29
|
+
require 'irc/messages/nick_message'
|
30
|
+
require 'irc/messages/notice_message'
|
31
|
+
require 'irc/messages/part_message'
|
32
|
+
require 'irc/messages/ping_message'
|
33
|
+
require 'irc/messages/pong_message'
|
34
|
+
|
35
|
+
module IRC
|
36
|
+
|
37
|
+
module Messages
|
38
|
+
|
39
|
+
class Factory
|
40
|
+
|
41
|
+
def self.create(raw_message)
|
42
|
+
|
43
|
+
# Remove new line from raw message if available.
|
44
|
+
raw_message.chomp!
|
45
|
+
|
46
|
+
# Create a new message object, to get access to the message code.
|
47
|
+
message = Message.new(raw_message)
|
48
|
+
|
49
|
+
# Create a new specialized message object, depending on the message code.
|
50
|
+
case message.code
|
51
|
+
|
52
|
+
when ErrorAlreadyRegisteredMessage::CODE
|
53
|
+
return ErrorAlreadyRegisteredMessage.new(raw_message)
|
54
|
+
|
55
|
+
when ErrorBadChannelKeyMessage::CODE
|
56
|
+
return ErrorBadChannelKeyMessage.new(raw_message)
|
57
|
+
|
58
|
+
when ErrorBadChannelMaskMessage::CODE
|
59
|
+
return ErrorBadChannelMaskMessage.new(raw_message)
|
60
|
+
|
61
|
+
when ErrorBannedFromChannelMessage::CODE
|
62
|
+
return ErrorBannedFromChannelMessage.new(raw_message)
|
63
|
+
|
64
|
+
when ErrorChannelIsFulMessage::CODE
|
65
|
+
return ErrorChannelIsFulMessage.new(raw_message)
|
66
|
+
|
67
|
+
when ErrorErroneusNickNameMessage::CODE
|
68
|
+
return ErrorErroneusNickNameMessage.new(raw_message)
|
69
|
+
|
70
|
+
when ErrorInviteOnlyChannelMessage::CODE
|
71
|
+
return ErrorInviteOnlyChannelMessage.new(raw_message)
|
72
|
+
|
73
|
+
when ErrorNeedMoreParametersMessage::CODE
|
74
|
+
return ErrorNeedMoreParametersMessage.new(raw_message)
|
75
|
+
|
76
|
+
when ErrorNickCollisionMessage::CODE
|
77
|
+
return ErrorNickCollisionMessage.new(raw_message)
|
78
|
+
|
79
|
+
when ErrorNickNameInUseMessage::CODE
|
80
|
+
return ErrorNickNameInUseMessage.new(raw_message)
|
81
|
+
|
82
|
+
when ErrorNoNickNameGivenMessage::CODE
|
83
|
+
return ErrorNoNickNameGivenMessage.new(raw_message)
|
84
|
+
|
85
|
+
when ErrorNoSuchChannelMessage::CODE
|
86
|
+
return ErrorNoSuchChannelMessage.new(raw_message)
|
87
|
+
|
88
|
+
when ErrorNotOnChannelMessage::CODE
|
89
|
+
return ErrorNotOnChannelMessage.new(raw_message)
|
90
|
+
|
91
|
+
when ErrorTooManyChannelsMessage::CODE
|
92
|
+
return ErrorTooManyChannelsMessage.new(raw_message)
|
93
|
+
|
94
|
+
when JoinMessage::CODE
|
95
|
+
return JoinMessage.new(raw_message)
|
96
|
+
|
97
|
+
when NickMessage::CODE
|
98
|
+
return NickMessage.new(raw_message)
|
99
|
+
|
100
|
+
when NoticeMessage::CODE
|
101
|
+
return NoticeMessage.new(raw_message)
|
102
|
+
|
103
|
+
when PartMessage::CODE
|
104
|
+
return PartMessage.new(raw_message)
|
105
|
+
|
106
|
+
when PingMessage::CODE
|
107
|
+
return PingMessage.new(raw_message)
|
108
|
+
|
109
|
+
when PongMessage::CODE
|
110
|
+
return PongMessage.new(raw_message)
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
return message
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (c) 2006 Roman Scherer | IRC Guerilla | Rapid Packet Movement
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#
|
24
|
+
# $Id: invalid_message.rb 85 2006-08-13 11:42:07Z roman $
|
25
|
+
#
|
26
|
+
module IRC
|
27
|
+
|
28
|
+
module Messages
|
29
|
+
|
30
|
+
class InvalidMessage < Exception
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (c) 2006 Roman Scherer | IRC Guerilla | Rapid Packet Movement
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#
|
24
|
+
# $Id$
|
25
|
+
#
|
26
|
+
require 'irc/commands/pong_command'
|
27
|
+
require 'irc/messages/message'
|
28
|
+
require 'irc/messages/invalid_message'
|
29
|
+
|
30
|
+
module IRC
|
31
|
+
|
32
|
+
module Messages
|
33
|
+
|
34
|
+
|
35
|
+
# 4.2.1 Join message
|
36
|
+
#
|
37
|
+
# Command: JOIN
|
38
|
+
# Parameters: <channel>{,<channel>} [<key>{,<key>}]
|
39
|
+
#
|
40
|
+
# The JOIN command is used by client to start listening a specific channel.
|
41
|
+
# Whether or not a client is allowed to join a channel is checked only by
|
42
|
+
# the server the client is connected to; all other servers automatically add
|
43
|
+
# the user to the channel when it is received from other servers. The conditions
|
44
|
+
# which affect this are as follows:
|
45
|
+
#
|
46
|
+
# 1. the user must be invited if the channel is invite-only;
|
47
|
+
# 2. the user's nick/username/hostname must not match any active bans;
|
48
|
+
# 3. the correct key (password) must be given if it is set.
|
49
|
+
#
|
50
|
+
# These are discussed in more detail under the MODE command (see section 4.2.3
|
51
|
+
# for more details).
|
52
|
+
#
|
53
|
+
# Once a user has joined a channel, they receive notice about all commands their
|
54
|
+
# server receives which affect the channel. This includes MODE, KICK, PART, QUIT
|
55
|
+
# and of course PRIVMSG/NOTICE. The JOIN command needs to be broadcast to all
|
56
|
+
# servers so that each server knows where to find the users who are on the channel.
|
57
|
+
# This allows optimal delivery of PRIVMSG/NOTICE messages to the channel.
|
58
|
+
#
|
59
|
+
# If a JOIN is successful, the user is then sent the channel's topic (using
|
60
|
+
# RPL_TOPIC) and the list of users who are on the channel (using RPL_NAMREPLY),
|
61
|
+
# which must include the user joining.
|
62
|
+
#
|
63
|
+
# Numeric Replies:
|
64
|
+
#
|
65
|
+
# * ERR_NEEDMOREPARAMS
|
66
|
+
# * ERR_BANNEDFROMCHAN
|
67
|
+
# * ERR_INVITEONLYCHAN
|
68
|
+
# * ERR_BADCHANNELKEY
|
69
|
+
# * ERR_CHANNELISFULL
|
70
|
+
# * ERR_BADCHANMASK
|
71
|
+
# * ERR_NOSUCHCHANNEL
|
72
|
+
# * ERR_TOOMANYCHANNELS
|
73
|
+
# * RPL_TOPIC
|
74
|
+
#
|
75
|
+
# Examples:
|
76
|
+
#
|
77
|
+
# JOIN #foobar ; join channel #foobar.
|
78
|
+
#
|
79
|
+
# JOIN &foo fubar ; join channel &foo using key "fubar".
|
80
|
+
#
|
81
|
+
# JOIN #foo,&bar fubar ; join channel #foo using key "fubar"
|
82
|
+
# ; and &bar using no key.
|
83
|
+
#
|
84
|
+
# JOIN #foo,#bar fubar,foobar ; join channel #foo using key "fubar".
|
85
|
+
# ; and channel #bar using key "foobar".
|
86
|
+
#
|
87
|
+
# JOIN #foo,#bar ; join channels #foo and #bar.
|
88
|
+
#
|
89
|
+
# :WiZ JOIN #Twilight_zone ; JOIN message from WiZ
|
90
|
+
#
|
91
|
+
class JoinMessage < Message
|
92
|
+
|
93
|
+
CODE = "JOIN"
|
94
|
+
|
95
|
+
attr_reader :channel
|
96
|
+
|
97
|
+
# Notify all connection listeners, that a user has joined a channel.
|
98
|
+
def handle(context)
|
99
|
+
|
100
|
+
# Notify all connection listeners by calling their on_server_response method.
|
101
|
+
super(context)
|
102
|
+
|
103
|
+
# Notify all connection listeners by calling their on_join method.
|
104
|
+
notify(context) do |connection_listener|
|
105
|
+
connection_listener.on_join(context, context.lookup_channel(channel), context.lookup_user(nick))
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
protected
|
111
|
+
|
112
|
+
def parse(raw_message)
|
113
|
+
|
114
|
+
# Initialize the base message fields.
|
115
|
+
super(raw_message)
|
116
|
+
|
117
|
+
# Extract the message specific fields.
|
118
|
+
match_data = Regexp.new(':?(.+)').match(message)
|
119
|
+
raise InvalidMessage.new("Can't parse join message. Invalid message format.") if match_data == nil || code != CODE
|
120
|
+
|
121
|
+
# Extract the channel name.
|
122
|
+
@channel = match_data[1]
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (c) 2006 Roman Scherer | IRC Guerilla | Rapid Packet Movement
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#
|
24
|
+
# $Id: message.rb 93 2006-08-13 21:30:53Z roman $
|
25
|
+
#
|
26
|
+
require 'pp'
|
27
|
+
require 'irc/messages/codes'
|
28
|
+
require 'irc/messages/invalid_message'
|
29
|
+
|
30
|
+
module IRC
|
31
|
+
|
32
|
+
module Messages
|
33
|
+
|
34
|
+
class Message
|
35
|
+
|
36
|
+
include Codes
|
37
|
+
|
38
|
+
MESSAGE_FORMAT = Regexp.new('(:([^!\s]+)(!([^@\s]+))?(@(\S+))?\s+)?(\w+|\d\d\d)\s+(.*)')
|
39
|
+
|
40
|
+
attr_reader :code
|
41
|
+
attr_reader :host
|
42
|
+
attr_reader :message
|
43
|
+
attr_reader :nick
|
44
|
+
attr_reader :raw_message
|
45
|
+
attr_reader :server
|
46
|
+
attr_reader :login
|
47
|
+
|
48
|
+
def initialize(raw_message)
|
49
|
+
parse(raw_message)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Notify all connection listeners that a message was received from the IRC server,
|
53
|
+
# by calling their on_server_response method.
|
54
|
+
def handle(context)
|
55
|
+
|
56
|
+
# Notify all connection listeners by calling their on_server_response method.
|
57
|
+
notify(context) do |connection_listener|
|
58
|
+
connection_listener.on_server_response(context, self)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns true if the given string matches the IRC message format, else false.
|
64
|
+
def self.is_valid?(raw_message)
|
65
|
+
return Regexp.new(MESSAGE_FORMAT).match(raw_message) != nil
|
66
|
+
end
|
67
|
+
|
68
|
+
protected
|
69
|
+
|
70
|
+
# Notify all connection listeners, by calling the surrounding block with a channel listener as parameter.
|
71
|
+
def notify(context)
|
72
|
+
|
73
|
+
context.connection_listeners.each do |connection_listener|
|
74
|
+
yield connection_listener
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
def parse(raw_message)
|
80
|
+
|
81
|
+
# Throw an exception if the given message doesn't match the IRC message format.
|
82
|
+
raise InvalidMessage.new("Can't create message. Invalid IRC message format.") unless Message.is_valid?(raw_message)
|
83
|
+
|
84
|
+
# Save the raw message for later use.
|
85
|
+
@raw_message = raw_message
|
86
|
+
|
87
|
+
# Parse the raw message & initialize the IRC message fields.
|
88
|
+
match_data = MESSAGE_FORMAT.match(raw_message)
|
89
|
+
|
90
|
+
# Extract nick & server.
|
91
|
+
@nick = match_data[2]
|
92
|
+
@server = match_data[4] != nil || match_data[6] != nil ? nil : match_data[2]
|
93
|
+
|
94
|
+
# Extract the login & host name.
|
95
|
+
@login = match_data[4]
|
96
|
+
@host = match_data[6]
|
97
|
+
|
98
|
+
# Extract the IRC message code. If the code is a number, convert it to an integer.
|
99
|
+
@code = (match_data[7] =~ /\d+/ ? match_data[7].to_i : match_data[7])
|
100
|
+
|
101
|
+
# Extract the rest of the message. The message is everything after the IRC message code.
|
102
|
+
@message = match_data[8]
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (c) 2006 Roman Scherer | IRC Guerilla | Rapid Packet Movement
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#
|
24
|
+
# $Id: nick_message.rb 89 2006-08-13 14:03:35Z roman $
|
25
|
+
#
|
26
|
+
require 'irc/messages/message'
|
27
|
+
require 'irc/messages/invalid_message'
|
28
|
+
|
29
|
+
module IRC
|
30
|
+
|
31
|
+
module Messages
|
32
|
+
|
33
|
+
# 4.1.2 Nick message
|
34
|
+
#
|
35
|
+
# Command: NICK
|
36
|
+
# Parameters: <nickname> [ <hopcount> ]
|
37
|
+
#
|
38
|
+
# NICK message is used to give user a nickname or change the previous one. The
|
39
|
+
# <hopcount> parameter is only used by servers to indicate how far away a nick
|
40
|
+
# is from its home server. A local connection has a hopcount of 0. If supplied
|
41
|
+
# by a client, it must be ignored.
|
42
|
+
#
|
43
|
+
# If a NICK message arrives at a server which already knows about an identical
|
44
|
+
# nickname for another client, a nickname collision occurs. As a result of a
|
45
|
+
# nickname collision, all instances of the nickname are removed from the server's
|
46
|
+
# database, and a KILL command is issued to remove the nickname from all other
|
47
|
+
# server's database. If the NICK message causing the collision was a nickname
|
48
|
+
# change, then the original (old) nick must be removed as well.
|
49
|
+
#
|
50
|
+
# If the server recieves an identical NICK from a client which is directly
|
51
|
+
# connected, it may issue an ERR_NICKCOLLISION to the local client, drop the NICK
|
52
|
+
# command, and not generate any kills.
|
53
|
+
#
|
54
|
+
# Numeric Replies:
|
55
|
+
#
|
56
|
+
# ERR_NONICKNAMEGIVEN
|
57
|
+
# ERR_ERRONEUSNICKNAME
|
58
|
+
# ERR_NICKNAMEINUSE
|
59
|
+
# ERR_NICKCOLLISION
|
60
|
+
#
|
61
|
+
# Example:
|
62
|
+
#
|
63
|
+
# NICK Wiz ; Introducing new nick "Wiz".
|
64
|
+
#
|
65
|
+
# :WiZ NICK Kilroy ; WiZ changed his nickname to Kilroy.
|
66
|
+
#
|
67
|
+
class NickMessage < Message
|
68
|
+
|
69
|
+
CODE = "NICK"
|
70
|
+
|
71
|
+
attr_reader :after
|
72
|
+
attr_reader :before
|
73
|
+
|
74
|
+
def parse(raw_message)
|
75
|
+
|
76
|
+
# Initialize the base message fields.
|
77
|
+
super(raw_message)
|
78
|
+
|
79
|
+
# Match the message against the message format.
|
80
|
+
match_data = Regexp.new('\s*:?(\S+)\s+NICK\s+(\S+)\s*').match(raw_message)
|
81
|
+
raise InvalidMessage.new("Can't parse nick message. Invalid message format.") unless match_data
|
82
|
+
|
83
|
+
# Initialize the variables holding the nick names before & after the nick change.
|
84
|
+
@after = match_data[2]
|
85
|
+
@before = match_data[1]
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|