ircguerilla-irc 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,87 @@
|
|
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 85 2006-08-13 11:42:07Z roman $
|
25
|
+
#
|
26
|
+
require 'irc/messages/message'
|
27
|
+
require 'irc/messages/invalid_message'
|
28
|
+
|
29
|
+
module IRC
|
30
|
+
|
31
|
+
module Messages
|
32
|
+
|
33
|
+
# 4.4.2 Notice
|
34
|
+
#
|
35
|
+
# Command: NOTICE
|
36
|
+
# Parameters: <nickname> <text>
|
37
|
+
#
|
38
|
+
# The NOTICE message is used similarly to PRIVMSG. The difference between NOTICE and PRIVMSG is
|
39
|
+
# that automatic replies must never be sent in response to a NOTICE message. This rule applies
|
40
|
+
# to servers too - they must not send any error reply back to the client on receipt of a notice.
|
41
|
+
# The object of this rule is to avoid loops between a client automatically sending something in
|
42
|
+
# response to something it received. This is typically used by automatons (clients with either
|
43
|
+
# an AI or other interactive program controlling their actions) which are always seen to be
|
44
|
+
# replying lest they end up in a loop with another automaton.
|
45
|
+
#
|
46
|
+
# See PRIVMSG for more details on replies and examples.
|
47
|
+
#
|
48
|
+
class NoticeMessage < Message
|
49
|
+
|
50
|
+
CODE = "NOTICE"
|
51
|
+
|
52
|
+
attr_reader :message
|
53
|
+
|
54
|
+
# Notify all connection listeners, that a notice message was received.
|
55
|
+
def handle(context)
|
56
|
+
|
57
|
+
# Notify all connection listeners by calling their on_server_response method.
|
58
|
+
super(context)
|
59
|
+
|
60
|
+
# Notify all connection listeners by calling their on_notice method.
|
61
|
+
notify(context) do |connection_listener|
|
62
|
+
connection_listener.on_notice(context, context.lookup_user(nick), message)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
protected
|
68
|
+
|
69
|
+
def parse(raw_message)
|
70
|
+
|
71
|
+
# Initialize the base message fields.
|
72
|
+
super(raw_message)
|
73
|
+
|
74
|
+
# Match the message against the message format.
|
75
|
+
match_data = Regexp.new('\s*NOTICE\s+:?(\S+)\s+:?(.*)').match(raw_message)
|
76
|
+
raise InvalidMessage.new("Can't parse notice message. Invalid message format.") unless match_data
|
77
|
+
|
78
|
+
# Initialize the nick & message fileds.
|
79
|
+
@nick, @message = match_data[1].strip, match_data[2].strip
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,95 @@
|
|
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
|
+
# 4.2.2 Part message
|
35
|
+
#
|
36
|
+
# Command: PART
|
37
|
+
# Parameters: <channel>{,<channel>}
|
38
|
+
#
|
39
|
+
# The PART message causes the client sending the message to be removed
|
40
|
+
# from the list of active users for all given channels listed in the
|
41
|
+
# parameter string.
|
42
|
+
#
|
43
|
+
# Numeric Replies:
|
44
|
+
#
|
45
|
+
# ERR_NEEDMOREPARAMS
|
46
|
+
# ERR_NOSUCHCHANNEL
|
47
|
+
# ERR_NOTONCHANNEL
|
48
|
+
#
|
49
|
+
# Examples:
|
50
|
+
#
|
51
|
+
# PART #twilight_zone ; leave channel "#twilight_zone"
|
52
|
+
#
|
53
|
+
# PART #oz-ops,&group5 ; leave both channels "&group5" and
|
54
|
+
# ; "#oz-ops".
|
55
|
+
#
|
56
|
+
class PartMessage < Message
|
57
|
+
|
58
|
+
CODE = "PART"
|
59
|
+
|
60
|
+
attr_reader :channel
|
61
|
+
|
62
|
+
# Notify all connection listeners, that a user has left a channel.
|
63
|
+
def handle(context)
|
64
|
+
|
65
|
+
# Notify all connection listeners by calling their on_server_response method.
|
66
|
+
super(context)
|
67
|
+
|
68
|
+
# Notify all connection listeners by calling their on_part method.
|
69
|
+
notify(context) do |connection_listener|
|
70
|
+
connection_listener.on_part(context, context.lookup_channel(channel), context.lookup_user(nick))
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
def parse(raw_message)
|
78
|
+
|
79
|
+
# Initialize the base message fields.
|
80
|
+
super(raw_message)
|
81
|
+
|
82
|
+
# Extract the message specific fields.
|
83
|
+
match_data = Regexp.new(':?(.+)').match(message)
|
84
|
+
raise InvalidMessage.new("Can't parse part message. Invalid message format.") if match_data == nil || code != CODE
|
85
|
+
|
86
|
+
# Extract the channel name.
|
87
|
+
@channel = match_data[1]
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
@@ -0,0 +1,101 @@
|
|
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: ping_message.rb 93 2006-08-13 21:30:53Z roman $
|
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
|
+
# 4.6.2 Ping message
|
35
|
+
#
|
36
|
+
# Command: PING
|
37
|
+
# Parameters: <server1> [<server2>]
|
38
|
+
#
|
39
|
+
# The PING message is used to test the presence of an active client at the other end of
|
40
|
+
# the connection. A PING message is sent at regular intervals if no other activity detected
|
41
|
+
# coming from a connection. If a connection fails to respond to a PING command within a set
|
42
|
+
# amount of time, that connection is closed.
|
43
|
+
#
|
44
|
+
# Any client which receives a PING message must respond to <server1> (server which sent the
|
45
|
+
# PING message out) as quickly as possible with an appropriate PONG message to indicate it
|
46
|
+
# is still there and alive. Servers should not respond to PING commands but rely on PINGs
|
47
|
+
# from the other end of the connection to indicate the connection is alive. If the <server2>
|
48
|
+
# parameter is specified, the PING message gets forwarded there.
|
49
|
+
#
|
50
|
+
# Numeric Replies:
|
51
|
+
# * ERR_NOORIGIN
|
52
|
+
# * ERR_NOSUCHSERVER
|
53
|
+
#
|
54
|
+
# Examples:
|
55
|
+
#
|
56
|
+
# PING tolsun.oulu.fi ; server sending a PING message to
|
57
|
+
# another server to indicate it is still
|
58
|
+
# alive.
|
59
|
+
#
|
60
|
+
# PING WiZ ; PING message being sent to nick WiZ
|
61
|
+
#
|
62
|
+
class PingMessage < Message
|
63
|
+
|
64
|
+
CODE = "PING"
|
65
|
+
|
66
|
+
attr_reader :servers
|
67
|
+
|
68
|
+
# Notify all connection listeners, that a ping message was received.
|
69
|
+
def handle(context)
|
70
|
+
|
71
|
+
# Notify all connection listeners by calling their on_server_response method.
|
72
|
+
super(context)
|
73
|
+
|
74
|
+
# Notify all connection listeners by calling their on_ping method.
|
75
|
+
notify(context) do |connection_listener|
|
76
|
+
connection_listener.on_ping(context, servers)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
|
83
|
+
def parse(raw_message)
|
84
|
+
|
85
|
+
# Initialize the base message fields.
|
86
|
+
super(raw_message)
|
87
|
+
|
88
|
+
# Extract the message specific fields.
|
89
|
+
match_data = Regexp.new(':?([^\s:]+)(\s+:?(.+))?').match(message)
|
90
|
+
raise InvalidMessage.new("Can't parse ping message. Invalid message format.") if match_data == nil || code != CODE
|
91
|
+
|
92
|
+
# Extract the servers and strip white spaces.
|
93
|
+
@servers = [match_data[1], match_data[3]].compact.map! { |element| element.strip }
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
@@ -0,0 +1,89 @@
|
|
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: pong_message.rb 93 2006-08-13 21:30:53Z roman $
|
25
|
+
#
|
26
|
+
require 'irc/messages/message'
|
27
|
+
require 'irc/messages/invalid_message'
|
28
|
+
|
29
|
+
module IRC
|
30
|
+
|
31
|
+
module Messages
|
32
|
+
|
33
|
+
# 4.6.3 Pong message
|
34
|
+
#
|
35
|
+
# Command: PONG
|
36
|
+
# Parameters: <daemon> [<daemon2>]
|
37
|
+
#
|
38
|
+
# PONG message is a reply to ping message. If parameter <daemon2> is given this message must
|
39
|
+
# be forwarded to given daemon. The <daemon> parameter is the name of the daemon who has responded
|
40
|
+
# to PING message and generated this message.
|
41
|
+
#
|
42
|
+
# Numeric Replies:
|
43
|
+
# * ERR_NOORIGIN
|
44
|
+
# * ERR_NOSUCHSERVER
|
45
|
+
#
|
46
|
+
# Examples:
|
47
|
+
#
|
48
|
+
# PONG csd.bu.edu tolsun.oulu.fi ; PONG message from csd.bu.edu to
|
49
|
+
#
|
50
|
+
class PongMessage < Message
|
51
|
+
|
52
|
+
CODE = "PONG"
|
53
|
+
|
54
|
+
attr_reader :daemons
|
55
|
+
|
56
|
+
# Notify all message listeners, that a pong message was received.
|
57
|
+
def handle(context)
|
58
|
+
|
59
|
+
# Notify all connection listeners by calling their on_server_response method.
|
60
|
+
super(context)
|
61
|
+
|
62
|
+
# Notify all connection listeners by calling their on_pong method.
|
63
|
+
notify(context) do |connection_listener|
|
64
|
+
message_listener.on_pong(context, daemons)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
protected
|
70
|
+
|
71
|
+
def parse(raw_message)
|
72
|
+
|
73
|
+
# Initialize the base message fields.
|
74
|
+
super(raw_message)
|
75
|
+
|
76
|
+
# Extract the message specific fields.
|
77
|
+
match_data = Regexp.new(':?([^\s:]+)(\s+:?(.+))?').match(message)
|
78
|
+
raise InvalidMessage.new("Can't parse ping message. Invalid message format.") if match_data == nil || code != CODE
|
79
|
+
|
80
|
+
# Extract the servers and strip white spaces.
|
81
|
+
@daemons = [match_data[1], match_data[3]].compact.map! { |element| element.strip }
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,121 @@
|
|
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/messages/message'
|
27
|
+
require 'irc/messages/invalid_message'
|
28
|
+
require 'irc/models/channel'
|
29
|
+
|
30
|
+
module IRC
|
31
|
+
|
32
|
+
module Messages
|
33
|
+
|
34
|
+
# 4.4.1 Private messages
|
35
|
+
#
|
36
|
+
# Command: PRIVMSG
|
37
|
+
# Parameters: <receiver>{,<receiver>} <text to be sent>
|
38
|
+
#
|
39
|
+
# PRIVMSG is used to send private messages between users. <receiver> is the nickname
|
40
|
+
# of the receiver of the message. <receiver> can also be a list of names or channels
|
41
|
+
# separated with commas.
|
42
|
+
#
|
43
|
+
# The <receiver> parameter may also me a host mask (#mask) or server mask ($mask). In
|
44
|
+
# both cases the server will only send the PRIVMSG to those who have a server or host
|
45
|
+
# matching the mask. The mask must have at least 1 (one) "." in it and no wildcards
|
46
|
+
# following the last ".". This requirement exists to prevent people sending messages
|
47
|
+
# to "#*" or "$*", which would broadcast to all users; from experience, this is abused
|
48
|
+
# more than used responsibly and properly. Wildcards are the '*' and '?' characters.
|
49
|
+
# This extension to the PRIVMSG command is only available to Operators.
|
50
|
+
#
|
51
|
+
# Numeric Replies:
|
52
|
+
# * ERR_NORECIPIENT
|
53
|
+
# * ERR_NOTEXTTOSEND
|
54
|
+
# * ERR_CANNOTSENDTOCHAN
|
55
|
+
# * ERR_NOTOPLEVEL
|
56
|
+
# * ERR_WILDTOPLEVEL
|
57
|
+
# * ERR_TOOMANYTARGETS
|
58
|
+
# * ERR_NOSUCHNICK
|
59
|
+
# * RPL_AWAY
|
60
|
+
#
|
61
|
+
# Examples:
|
62
|
+
#
|
63
|
+
# :Angel PRIVMSG Wiz :Hello are you receiving this message ?
|
64
|
+
# ; Message from Angel to Wiz.
|
65
|
+
#
|
66
|
+
# PRIVMSG Angel :yes I'm receiving it !receiving it !'u>(768u+1n) .br
|
67
|
+
# ; Message to Angel.
|
68
|
+
#
|
69
|
+
# PRIVMSG jto@tolsun.oulu.fi :Hello !
|
70
|
+
# ; Message to a client on server
|
71
|
+
# tolsun.oulu.fi with username of "jto".
|
72
|
+
#
|
73
|
+
# PRIVMSG $*.fi :Server tolsun.oulu.fi rebooting.
|
74
|
+
# ; Message to everyone on a server which
|
75
|
+
# has a name matching *.fi.
|
76
|
+
#
|
77
|
+
# PRIVMSG #*.edu :NSFNet is undergoing work, expect interruptions
|
78
|
+
# ; Message to all users who come from a
|
79
|
+
# host which has a name matching *.edu.
|
80
|
+
class PrivateMessage < Message
|
81
|
+
|
82
|
+
CODE = "PRIVMSG"
|
83
|
+
|
84
|
+
attr_reader :target
|
85
|
+
attr_reader :sender
|
86
|
+
attr_reader :text
|
87
|
+
|
88
|
+
# Notify all connection listeners, that a private message was received.
|
89
|
+
def handle(context)
|
90
|
+
|
91
|
+
# Notify all connection listeners by calling their on_server_response method.
|
92
|
+
super(context)
|
93
|
+
|
94
|
+
# Notify all connection listeners by calling their on_private_message method.
|
95
|
+
notify(context) do |connection_listener|
|
96
|
+
connection_listener.on_private_message(context, IRC::Models::Channel.is_valid?(target) ? context.lookup_channel(target) : context.lookup_user(target), text)
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
protected
|
102
|
+
|
103
|
+
def parse(raw_message)
|
104
|
+
|
105
|
+
# Initialize the base message fields.
|
106
|
+
super(raw_message)
|
107
|
+
|
108
|
+
# Extract the message specific fields.
|
109
|
+
match_data = Regexp.new('(\S+)\s+:?(.+)').match(message)
|
110
|
+
raise InvalidMessage.new("Can't parse private message. Invalid message format.") if match_data == nil || code != CODE
|
111
|
+
|
112
|
+
# Extract the sender, target and the text.
|
113
|
+
@sender, @target, @text = nick, match_data[1], match_data[2]
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|