ircguerilla-irc 1.1.0 → 1.2.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/connected_state.rb +5 -10
- data/lib/irc/client/connection_listener.rb +0 -2
- data/lib/irc/client/connection_state.rb +2 -0
- data/lib/irc/client/context.rb +1 -1
- data/lib/irc/client/message_handler.rb +7 -1
- data/lib/irc/client/registered_state.rb +2 -2
- data/lib/irc/client/unregistered_state.rb +40 -32
- data/lib/irc/commands/command.rb +62 -4
- data/lib/irc/commands/join_command.rb +15 -0
- data/lib/irc/commands/nick_command.rb +1 -0
- data/lib/irc/commands/part_command.rb +2 -0
- data/lib/irc/commands/password_command.rb +1 -0
- data/lib/irc/commands/ping_command.rb +19 -0
- data/lib/irc/commands/pong_command.rb +4 -1
- data/lib/irc/commands/quit_command.rb +4 -0
- data/lib/irc/commands/user_command.rb +9 -7
- data/lib/irc/messages/error_message.rb +9 -1
- data/lib/irc/messages/factory.rb +10 -0
- data/lib/irc/messages/message.rb +4 -1
- data/lib/irc/messages/pong_message.rb +1 -1
- data/test/functional/irc/client/connection_test.rb +1 -7
- data/test/functional/irc/client/context_test.rb +9 -15
- data/test/unit/irc/commands/command_test.rb +137 -0
- data/test/unit/irc/commands/ping_command_test.rb +131 -1
- data/test/unit/irc/messages/factory_test.rb +5 -1
- metadata +4 -3
@@ -70,16 +70,6 @@ module IRC
|
|
70
70
|
|
71
71
|
end
|
72
72
|
|
73
|
-
# Sends the command to the server bypassing the command queue.
|
74
|
-
def send_command(context, command)
|
75
|
-
context.command_handler.send_command(command)
|
76
|
-
end
|
77
|
-
|
78
|
-
# Sends the command to the server using the command queue.
|
79
|
-
def send_command_via_queue(context, command)
|
80
|
-
context.command_handler.send_command_via_queue(command)
|
81
|
-
end
|
82
|
-
|
83
73
|
# ConnectionListener
|
84
74
|
|
85
75
|
# This method gets called when disconnected from a server.
|
@@ -87,6 +77,11 @@ module IRC
|
|
87
77
|
log.debug("#{network_name(connection)} Successfully disconnected from #{server}. #{reason != nil ? reason + '.' : ''}")
|
88
78
|
end
|
89
79
|
|
80
|
+
# This method gets called when a ping message was received from the server.
|
81
|
+
def on_ping(connection, servers)
|
82
|
+
IRC::Commands::PongCommand.new(servers[0], servers[1]).execute(connection)
|
83
|
+
end
|
84
|
+
|
90
85
|
|
91
86
|
end
|
92
87
|
|
@@ -57,10 +57,12 @@ module IRC
|
|
57
57
|
|
58
58
|
# Sends the command to the server bypassing the command queue.
|
59
59
|
def send_command(context, command)
|
60
|
+
context.command_handler.send_command(command)
|
60
61
|
end
|
61
62
|
|
62
63
|
# Sends the command to the server using the command queue.
|
63
64
|
def send_command_via_queue(context, command)
|
65
|
+
context.command_handler.send_command_via_queue(command)
|
64
66
|
end
|
65
67
|
|
66
68
|
# ConnectionListener
|
data/lib/irc/client/context.rb
CHANGED
@@ -209,7 +209,7 @@ module IRC
|
|
209
209
|
|
210
210
|
# Sends the command to the server bypassing the command queue.
|
211
211
|
def send_command(command)
|
212
|
-
state.send_command(self, command)
|
212
|
+
state.send_command(self, command)
|
213
213
|
end
|
214
214
|
|
215
215
|
# Sends the command to the server using the command queue.
|
@@ -51,7 +51,7 @@ module IRC
|
|
51
51
|
loop do
|
52
52
|
|
53
53
|
# Read the raw message from the socket.
|
54
|
-
raw_message =
|
54
|
+
raw_message = socket.gets("\r\n")
|
55
55
|
|
56
56
|
# Log the raw message.
|
57
57
|
@log.debug("[#{@context.network.to_s.upcase}] <<< #{raw_message.chomp}")
|
@@ -80,6 +80,12 @@ module IRC
|
|
80
80
|
|
81
81
|
end
|
82
82
|
|
83
|
+
private
|
84
|
+
|
85
|
+
def socket
|
86
|
+
return @context.socket
|
87
|
+
end
|
88
|
+
|
83
89
|
end
|
84
90
|
|
85
91
|
end
|
@@ -46,12 +46,12 @@ module IRC
|
|
46
46
|
|
47
47
|
# Joins the given channels.
|
48
48
|
def join(context, channels)
|
49
|
-
IRC::Commands::JoinCommand.new(channels).
|
49
|
+
IRC::Commands::JoinCommand.new(channels).execute(context)
|
50
50
|
end
|
51
51
|
|
52
52
|
# Leaves the given channels.
|
53
53
|
def part(context, channels)
|
54
|
-
IRC::Commands::PartCommand.new(channels).
|
54
|
+
IRC::Commands::PartCommand.new(channels).execute(context)
|
55
55
|
end
|
56
56
|
|
57
57
|
# ConnectionListener
|
@@ -27,6 +27,9 @@ require 'irc/client/client_error'
|
|
27
27
|
require 'irc/client/connected_state'
|
28
28
|
require 'irc/client/registered_state'
|
29
29
|
require 'irc/messages/error_message'
|
30
|
+
require 'irc/commands/nick_command'
|
31
|
+
require 'irc/messages/notice_message'
|
32
|
+
require 'irc/commands/user_command'
|
30
33
|
require 'log4r'
|
31
34
|
|
32
35
|
module IRC
|
@@ -58,40 +61,42 @@ module IRC
|
|
58
61
|
|
59
62
|
# This method gets called when a message from the server is received.
|
60
63
|
def on_server_response(context, message)
|
61
|
-
|
62
|
-
|
63
|
-
if message.instance_of?(IRC::Messages::ErrorErroneusNickNameMessage)
|
64
|
-
registration_failure(context, message)
|
65
|
-
|
66
|
-
# We didn't send a valid command. There are some parameters missing.
|
67
|
-
elsif message.instance_of?(IRC::Messages::ErrorNeedMoreParametersMessage)
|
68
|
-
registration_failure(context, message)
|
69
|
-
|
70
|
-
# Nick name collision.
|
71
|
-
elsif message.instance_of?(IRC::Messages::ErrorNickCollisionMessage)
|
72
|
-
registration_failure(context, message)
|
73
|
-
|
74
|
-
# The chosen nick name is already in use.
|
75
|
-
elsif message.instance_of?(IRC::Messages::ErrorNickNameInUseMessage)
|
76
|
-
registration_failure(context, message)
|
77
|
-
|
78
|
-
# We didn't send a valid nick command. The nick name was missing.
|
79
|
-
elsif message.instance_of?(IRC::Messages::ErrorNoNickNameGivenMessage)
|
80
|
-
registration_failure(context, message)
|
64
|
+
|
65
|
+
case message.code
|
81
66
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# We are already registered. Did we miss something?
|
87
|
-
elsif message.instance_of?(IRC::Messages::ErrorAlreadyRegisteredMessage)
|
88
|
-
change_state(context, RegisteredState.instance)
|
67
|
+
# Ignore notice messages.
|
68
|
+
when IRC::Messages::NoticeMessage::CODE
|
69
|
+
return
|
89
70
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
71
|
+
# The given nick name is not valid.
|
72
|
+
when IRC::Messages::ErrorErroneusNickNameMessage::CODE
|
73
|
+
registration_failure(context, message)
|
74
|
+
|
75
|
+
# We didn't send a valid command. There are some parameters missing.
|
76
|
+
when IRC::Messages::ErrorNeedMoreParametersMessage::CODE
|
77
|
+
registration_failure(context, message)
|
78
|
+
|
79
|
+
# Nick name collision.
|
80
|
+
when IRC::Messages::ErrorNickCollisionMessage::CODE
|
81
|
+
registration_failure(context, message)
|
82
|
+
|
83
|
+
# The chosen nick name is already in use.
|
84
|
+
when IRC::Messages::ErrorNickNameInUseMessage::CODE
|
85
|
+
registration_failure(context, message)
|
86
|
+
|
87
|
+
# We didn't send a valid nick command. The nick name was missing.
|
88
|
+
when IRC::Messages::ErrorNoNickNameGivenMessage::CODE
|
89
|
+
registration_failure(context, message)
|
90
|
+
|
91
|
+
# We are already registered. Did we miss something?
|
92
|
+
when IRC::Messages::ErrorAlreadyRegisteredMessage::CODE
|
93
|
+
change_state(context, RegisteredState.instance)
|
94
|
+
|
95
|
+
# Everything ok. Change to the registered state.
|
96
|
+
else
|
97
|
+
change_state(context, RegisteredState.instance)
|
98
|
+
|
99
|
+
end
|
95
100
|
|
96
101
|
end
|
97
102
|
|
@@ -103,6 +108,9 @@ module IRC
|
|
103
108
|
context.connection_listeners.each do |connection_listener|
|
104
109
|
connection_listener.on_registration_failure(context, message)
|
105
110
|
end
|
111
|
+
|
112
|
+
IRC::Commands::NickCommand.new("au_lasa").execute(context)
|
113
|
+
IRC::Commands::UserCommand.new("au_lasa", Socket.gethostname, server.hostname, context.realname).execute(context)
|
106
114
|
|
107
115
|
end
|
108
116
|
|
data/lib/irc/commands/command.rb
CHANGED
@@ -23,15 +23,23 @@
|
|
23
23
|
#
|
24
24
|
# $Id: command.rb 85 2006-08-13 11:42:07Z roman $
|
25
25
|
#
|
26
|
+
require 'irc/client/connection_listener'
|
26
27
|
require 'irc/commands/invalid_command'
|
28
|
+
require 'monitor'
|
27
29
|
|
28
30
|
module IRC
|
29
31
|
|
30
32
|
module Commands
|
31
33
|
|
32
|
-
class Command
|
34
|
+
class Command < Monitor
|
35
|
+
|
36
|
+
include IRC::Client::ConnectionListener
|
37
|
+
|
38
|
+
# The message that was sent by the IRC server as a response to the execution of the command.
|
39
|
+
attr_reader :response
|
33
40
|
|
34
41
|
def initialize(raw_command = "")
|
42
|
+
super()
|
35
43
|
@raw_command = raw_command
|
36
44
|
end
|
37
45
|
|
@@ -40,15 +48,65 @@ module IRC
|
|
40
48
|
return @raw_command
|
41
49
|
end
|
42
50
|
|
43
|
-
#
|
44
|
-
|
45
|
-
|
51
|
+
# Execute the command. The method registers the command as an connection listener
|
52
|
+
# at the connection object and sends the command. The method returns the command.
|
53
|
+
def execute(connection)
|
54
|
+
|
55
|
+
# Register the command as a connection listener, so we can receive response messages
|
56
|
+
# from the server.
|
57
|
+
connection.add_connection_listener(self)
|
58
|
+
|
59
|
+
# Send the message.
|
60
|
+
connection << self
|
61
|
+
|
62
|
+
# Create a conditinal monitor variable.
|
63
|
+
self.synchronize do
|
64
|
+
@response_received ||= self.new_cond
|
65
|
+
end
|
66
|
+
|
67
|
+
return self
|
68
|
+
|
46
69
|
end
|
47
70
|
|
48
71
|
# Returns the command as a string.
|
49
72
|
def to_s
|
50
73
|
return command
|
51
74
|
end
|
75
|
+
|
76
|
+
# Returns true, if the message is a valid response to the command. This method should get
|
77
|
+
# overriddn in subclasses. For this class every response is valid.
|
78
|
+
def valid_response?(message)
|
79
|
+
return true
|
80
|
+
end
|
81
|
+
|
82
|
+
# Waits until a response for the command was sent by the IRC server. This method expects,
|
83
|
+
# that the command has already been sent to the server by the execute method. A call to
|
84
|
+
# this method blocks until a response was reseived from the server.
|
85
|
+
def wait
|
86
|
+
|
87
|
+
# If the command has not been sent, or a response was already received. a
|
88
|
+
# call to this method doesn't make any sense.
|
89
|
+
raise Exception.new("Can't wait for response. The command was not send yet, or a response was already received.") if @response_received == nil
|
90
|
+
|
91
|
+
# Wait until a response was received from the server.
|
92
|
+
synchronize do
|
93
|
+
@response_received.wait_until { response != nil }
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
# CONNECTION LISTENER
|
99
|
+
|
100
|
+
# This method gets called when a message from the server is received. This method should be
|
101
|
+
# overridden in subclasses to handle the command specific response messages from the server.
|
102
|
+
def on_server_response(connection, message)
|
103
|
+
|
104
|
+
if valid_response?(message)
|
105
|
+
connection.remove_connection_listener(self)
|
106
|
+
@response = message
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
52
110
|
|
53
111
|
end
|
54
112
|
|
@@ -25,6 +25,7 @@
|
|
25
25
|
#
|
26
26
|
require 'irc/commands/command'
|
27
27
|
require 'irc/commands/invalid_command'
|
28
|
+
require 'irc/messages/codes'
|
28
29
|
|
29
30
|
module IRC
|
30
31
|
|
@@ -109,12 +110,26 @@ module IRC
|
|
109
110
|
@passwords << passwords
|
110
111
|
end
|
111
112
|
|
113
|
+
super(command)
|
114
|
+
|
112
115
|
end
|
113
116
|
|
114
117
|
def command
|
115
118
|
return "JOIN #{channels.join(',')} #{passwords.join(',')}".strip
|
116
119
|
end
|
117
120
|
|
121
|
+
# Returns true, if the message is a valid response to the command.
|
122
|
+
def valid_response?(message)
|
123
|
+
|
124
|
+
valid_reponse_codes = [IRC::Messages::Codes::ERR_NEEDMOREPARAMS, IRC::Messages::Codes::ERR_BANNEDFROMCHAN,
|
125
|
+
IRC::Messages::Codes::ERR_INVITEONLYCHAN, IRC::Messages::Codes::ERR_BADCHANNELKEY, IRC::Messages::Codes::ERR_CHANNELISFULL,
|
126
|
+
IRC::Messages::Codes::ERR_BADCHANMASK, IRC::Messages::Codes::ERR_NOSUCHCHANNEL, IRC::Messages::Codes::ERR_TOOMANYCHANNELS,
|
127
|
+
IRC::Messages::Codes::RPL_TOPIC]
|
128
|
+
|
129
|
+
return valid_reponse_codes.include?(message.code)
|
130
|
+
|
131
|
+
end
|
132
|
+
|
118
133
|
end
|
119
134
|
|
120
135
|
end
|
@@ -25,6 +25,8 @@
|
|
25
25
|
#
|
26
26
|
require 'irc/commands/command'
|
27
27
|
require 'irc/commands/invalid_command'
|
28
|
+
require 'irc/messages/error_message'
|
29
|
+
require 'irc/messages/pong_message'
|
28
30
|
|
29
31
|
module IRC
|
30
32
|
|
@@ -66,12 +68,29 @@ module IRC
|
|
66
68
|
def initialize(first_server, second_server = nil)
|
67
69
|
raise InvalidCommand.new("Can't create ping command. No server.") unless first_server
|
68
70
|
@first_server, @second_server = first_server, second_server
|
71
|
+
super(command)
|
69
72
|
end
|
70
73
|
|
74
|
+
# Returns the command as a string.
|
71
75
|
def command
|
72
76
|
return "PING #{first_server} #{second_server != nil ? second_server.to_s : ''}".strip
|
73
77
|
end
|
74
78
|
|
79
|
+
# Returns true, if the message is a valid response to the command.
|
80
|
+
def valid_response?(message)
|
81
|
+
|
82
|
+
if message.kind_of?(IRC::Messages::PongMessage)
|
83
|
+
return first_server == message.daemons[0] && second_server == message.daemons[1]
|
84
|
+
|
85
|
+
elsif message.kind_of?(IRC::Messages::ErrorNoOriginMessage) || message.kind_of?(IRC::Messages::ErrorNoSuchServerMessage)
|
86
|
+
return true
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
return false
|
91
|
+
|
92
|
+
end
|
93
|
+
|
75
94
|
end
|
76
95
|
|
77
96
|
end
|
@@ -32,7 +32,7 @@ module IRC
|
|
32
32
|
|
33
33
|
# 4.6.3 Pong message
|
34
34
|
#
|
35
|
-
# Command:
|
35
|
+
# Command: PONG
|
36
36
|
# Parameters: <daemon> [<daemon2>]
|
37
37
|
#
|
38
38
|
# PONG message is a reply to ping message. If parameter <daemon2> is given this message must
|
@@ -53,8 +53,11 @@ module IRC
|
|
53
53
|
attr_reader :second_daemon
|
54
54
|
|
55
55
|
def initialize(first_daemon, second_daemon = nil)
|
56
|
+
|
56
57
|
raise InvalidCommand.new("Can't create ping command. No daemon.") unless first_daemon
|
57
58
|
@first_daemon, @second_daemon = first_daemon, second_daemon
|
59
|
+
super(command)
|
60
|
+
|
58
61
|
end
|
59
62
|
|
60
63
|
def command
|
@@ -58,8 +58,8 @@ module IRC
|
|
58
58
|
#
|
59
59
|
# Numeric Replies:
|
60
60
|
#
|
61
|
-
# ERR_NEEDMOREPARAMS
|
62
|
-
# ERR_ALREADYREGISTRED
|
61
|
+
# * ERR_NEEDMOREPARAMS
|
62
|
+
# * ERR_ALREADYREGISTRED
|
63
63
|
#
|
64
64
|
# Examples:
|
65
65
|
#
|
@@ -80,18 +80,20 @@ module IRC
|
|
80
80
|
|
81
81
|
def initialize(user, host, server, realname)
|
82
82
|
|
83
|
-
raise InvalidCommand.new("Can't create user command.
|
83
|
+
raise InvalidCommand.new("Can't create user command. User name is missing.") unless user
|
84
84
|
@user = user
|
85
85
|
|
86
|
-
raise InvalidCommand.new("Can't create user command.
|
86
|
+
raise InvalidCommand.new("Can't create user command. Host is missing.") unless host
|
87
87
|
@host = host
|
88
88
|
|
89
|
-
raise InvalidCommand.new("Can't create user command.
|
89
|
+
raise InvalidCommand.new("Can't create user command. Server is missing.") unless server
|
90
90
|
@server = server
|
91
91
|
|
92
|
-
raise InvalidCommand.new("Can't create user command.
|
92
|
+
raise InvalidCommand.new("Can't create user command. Real name is missing.") unless realname
|
93
93
|
@realname = realname
|
94
|
-
|
94
|
+
|
95
|
+
super(command)
|
96
|
+
|
95
97
|
end
|
96
98
|
|
97
99
|
def command
|
@@ -77,17 +77,25 @@ module IRC
|
|
77
77
|
end
|
78
78
|
|
79
79
|
class ErrorNickNameInUseMessage < ErrorMessage
|
80
|
-
CODE =
|
80
|
+
CODE = ERR_NICKNAMEINUSE
|
81
81
|
end
|
82
82
|
|
83
83
|
class ErrorNoNickNameGivenMessage < ErrorMessage
|
84
84
|
CODE = ERR_NONICKNAMEGIVEN
|
85
85
|
end
|
86
86
|
|
87
|
+
class ErrorNoOriginMessage < ErrorMessage
|
88
|
+
CODE = ERR_NOORIGIN
|
89
|
+
end
|
90
|
+
|
87
91
|
class ErrorNoSuchChannelMessage < ErrorJoinMessage
|
88
92
|
CODE = ERR_NOSUCHCHANNEL
|
89
93
|
end
|
90
94
|
|
95
|
+
class ErrorNoSuchServerMessage < ErrorMessage
|
96
|
+
CODE = ERR_NOSUCHSERVER
|
97
|
+
end
|
98
|
+
|
91
99
|
class ErrorNotOnChannelMessage < ErrorMessage
|
92
100
|
CODE = ERR_NOTONCHANNEL
|
93
101
|
end
|
data/lib/irc/messages/factory.rb
CHANGED
@@ -31,6 +31,7 @@ require 'irc/messages/notice_message'
|
|
31
31
|
require 'irc/messages/part_message'
|
32
32
|
require 'irc/messages/ping_message'
|
33
33
|
require 'irc/messages/pong_message'
|
34
|
+
require 'irc/messages/private_message'
|
34
35
|
|
35
36
|
module IRC
|
36
37
|
|
@@ -81,9 +82,15 @@ module IRC
|
|
81
82
|
|
82
83
|
when ErrorNoNickNameGivenMessage::CODE
|
83
84
|
return ErrorNoNickNameGivenMessage.new(raw_message)
|
85
|
+
|
86
|
+
when ErrorNoOriginMessage::CODE
|
87
|
+
return ErrorNoOriginMessage.new(raw_message)
|
84
88
|
|
85
89
|
when ErrorNoSuchChannelMessage::CODE
|
86
90
|
return ErrorNoSuchChannelMessage.new(raw_message)
|
91
|
+
|
92
|
+
when ErrorNoSuchServerMessage::CODE
|
93
|
+
return ErrorNoSuchServerMessage.new(raw_message)
|
87
94
|
|
88
95
|
when ErrorNotOnChannelMessage::CODE
|
89
96
|
return ErrorNotOnChannelMessage.new(raw_message)
|
@@ -108,6 +115,9 @@ module IRC
|
|
108
115
|
|
109
116
|
when PongMessage::CODE
|
110
117
|
return PongMessage.new(raw_message)
|
118
|
+
|
119
|
+
when PrivateMessage::CODE
|
120
|
+
return PrivateMessage.new(raw_message)
|
111
121
|
|
112
122
|
end
|
113
123
|
|
data/lib/irc/messages/message.rb
CHANGED
@@ -96,7 +96,10 @@ module IRC
|
|
96
96
|
@host = match_data[6]
|
97
97
|
|
98
98
|
# Extract the IRC message code. If the code is a number, convert it to an integer.
|
99
|
-
@code = (match_data[7]
|
99
|
+
@code = (match_data[7].match(/\d+/) ? match_data[7].to_i : match_data[7])
|
100
|
+
|
101
|
+
# puts @code
|
102
|
+
# puts @code.class
|
100
103
|
|
101
104
|
# Extract the rest of the message. The message is everything after the IRC message code.
|
102
105
|
@message = match_data[8]
|
@@ -75,7 +75,7 @@ module IRC
|
|
75
75
|
|
76
76
|
# Extract the message specific fields.
|
77
77
|
match_data = Regexp.new(':?([^\s:]+)(\s+:?(.+))?').match(message)
|
78
|
-
raise InvalidMessage.new("Can't parse
|
78
|
+
raise InvalidMessage.new("Can't parse pong message. Invalid message format.") if match_data == nil || code != CODE
|
79
79
|
|
80
80
|
# Extract the servers and strip white spaces.
|
81
81
|
@daemons = [match_data[1], match_data[3]].compact.map! { |element| element.strip }
|
@@ -42,7 +42,7 @@ class IRC::Client::ConnectionTest < Test::Unit::TestCase
|
|
42
42
|
# Initialize the network, channel & server that is used for testing.
|
43
43
|
network = IRC::Models::Network.new(:name => "Efnet")
|
44
44
|
@channel = network.create_channel("#MP3_RAP_N_REGGAE")
|
45
|
-
@server = network.create_server("irc.efnet.
|
45
|
+
@server = network.create_server("irc.efnet.pl")
|
46
46
|
|
47
47
|
# Initialize the connection connection.
|
48
48
|
@connection = IRC::Client::Connection::Context.new("fumanshu")
|
@@ -58,20 +58,17 @@ class IRC::Client::ConnectionTest < Test::Unit::TestCase
|
|
58
58
|
Timeout::timeout(IRC::Client::Connection::MAX_CONNECTION_TIMEOUT_IN_SEC) do
|
59
59
|
@connection.connect(@server)
|
60
60
|
while !@connection.connected? do sleep 0.1; end
|
61
|
-
assert @connection.connected?
|
62
61
|
end
|
63
62
|
|
64
63
|
# Wait until the connection is registered.
|
65
64
|
Timeout::timeout(5) do
|
66
65
|
while !@connection.registered? do sleep 0.1; end
|
67
|
-
assert @connection.registered?
|
68
66
|
end
|
69
67
|
|
70
68
|
# Disconnect and wait until the connection is in the disconnected state.
|
71
69
|
Timeout::timeout(5) do
|
72
70
|
@connection.disconnect
|
73
71
|
while @connection.connected? do sleep 0.1; end
|
74
|
-
assert !@connection.connected?
|
75
72
|
end
|
76
73
|
|
77
74
|
end
|
@@ -85,13 +82,11 @@ class IRC::Client::ConnectionTest < Test::Unit::TestCase
|
|
85
82
|
Timeout::timeout(IRC::Client::Connection::MAX_CONNECTION_TIMEOUT_IN_SEC) do
|
86
83
|
@connection.connect(@server)
|
87
84
|
while !@connection.connected? do sleep 0.1; end
|
88
|
-
assert @connection.connected?
|
89
85
|
end
|
90
86
|
|
91
87
|
# Wait until the connection is registered.
|
92
88
|
Timeout::timeout(5) do
|
93
89
|
while !@connection.registered? do sleep 0.1; end
|
94
|
-
assert @connection.registered?
|
95
90
|
end
|
96
91
|
|
97
92
|
# Join a channel & wait until the channel is joined and the block was called.
|
@@ -110,7 +105,6 @@ class IRC::Client::ConnectionTest < Test::Unit::TestCase
|
|
110
105
|
Timeout::timeout(5) do
|
111
106
|
@connection.disconnect
|
112
107
|
while @connection.connected? do sleep 0.1; end
|
113
|
-
assert !@connection.connected?
|
114
108
|
end
|
115
109
|
|
116
110
|
end
|
@@ -42,7 +42,7 @@ class IRC::Client::ContextTest < Test::Unit::TestCase
|
|
42
42
|
# Initialize the network, channel & server that is used for testing.
|
43
43
|
network = IRC::Models::Network.new(:name => "Efnet")
|
44
44
|
@channel = network.create_channel("#ircguerilla")
|
45
|
-
@server = network.create_server("irc.efnet.
|
45
|
+
@server = network.create_server("irc.efnet.pl")
|
46
46
|
|
47
47
|
# Initialize the connection context.
|
48
48
|
@context = IRC::Client::Connection::Context.new("fumanshu")
|
@@ -60,8 +60,7 @@ class IRC::Client::ContextTest < Test::Unit::TestCase
|
|
60
60
|
# Connect to the server and wait until the context is in the unregistered state.
|
61
61
|
Timeout::timeout(IRC::Client::Connection::MAX_CONNECTION_TIMEOUT_IN_SEC) do
|
62
62
|
@context.connect(@server)
|
63
|
-
while
|
64
|
-
assert @context.state.instance_of?(IRC::Client::UnregisteredState)
|
63
|
+
while !@context.connected? do sleep 0.1; end
|
65
64
|
end
|
66
65
|
|
67
66
|
# The context should be connected now.
|
@@ -69,17 +68,13 @@ class IRC::Client::ContextTest < Test::Unit::TestCase
|
|
69
68
|
|
70
69
|
# Wait until the connection is registered.
|
71
70
|
Timeout::timeout(5) do
|
72
|
-
while
|
73
|
-
assert @context.state.instance_of?(IRC::Client::RegisteredState)
|
71
|
+
while !@context.registered? do sleep 0.1; end
|
74
72
|
end
|
75
|
-
|
76
|
-
IRC::Commands::Command.new("JOIN a").send(@context)
|
77
|
-
sleep 5
|
78
73
|
|
79
74
|
# Disconnect and wait until the context is in the disconnected state.
|
80
75
|
Timeout::timeout(5) do
|
81
76
|
@context.disconnect
|
82
|
-
|
77
|
+
while @context.connected? do sleep 0.1; end
|
83
78
|
end
|
84
79
|
|
85
80
|
end
|
@@ -92,14 +87,12 @@ class IRC::Client::ContextTest < Test::Unit::TestCase
|
|
92
87
|
# Connect to the server and wait until the context is in the unregistered state.
|
93
88
|
Timeout::timeout(IRC::Client::Connection::MAX_CONNECTION_TIMEOUT_IN_SEC) do
|
94
89
|
@context.connect(@server)
|
95
|
-
while
|
96
|
-
assert @context.state.instance_of?(IRC::Client::UnregisteredState)
|
90
|
+
while !@context.connected? do sleep 0.1; end
|
97
91
|
end
|
98
92
|
|
99
93
|
# Wait until the connection is registered.
|
100
94
|
Timeout::timeout(5) do
|
101
|
-
while
|
102
|
-
assert @context.state.instance_of?(IRC::Client::RegisteredState)
|
95
|
+
while !@context.registered? do sleep 0.1; end
|
103
96
|
end
|
104
97
|
|
105
98
|
# Join a channel & wait until the channel is joined and the block was called.
|
@@ -117,10 +110,11 @@ class IRC::Client::ContextTest < Test::Unit::TestCase
|
|
117
110
|
# Disconnect and wait until the context is in the disconnected state.
|
118
111
|
Timeout::timeout(5) do
|
119
112
|
@context.disconnect
|
120
|
-
|
113
|
+
while @context.connected? do sleep 0.1; end
|
121
114
|
end
|
122
115
|
|
123
116
|
end
|
124
117
|
|
125
|
-
|
118
|
+
def test_truth
|
119
|
+
end
|
126
120
|
end
|
@@ -0,0 +1,137 @@
|
|
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/client/connection_listener'
|
27
|
+
require 'irc/commands/command'
|
28
|
+
require 'irc/messages/nick_message'
|
29
|
+
require 'timeout'
|
30
|
+
require 'test/unit'
|
31
|
+
|
32
|
+
class IRC::Commands::CommandTest < Test::Unit::TestCase
|
33
|
+
|
34
|
+
include IRC::Client::ConnectionListener
|
35
|
+
|
36
|
+
class ConnectionMock
|
37
|
+
|
38
|
+
attr_reader :commands
|
39
|
+
attr_reader :connection_listeners
|
40
|
+
|
41
|
+
def initialize
|
42
|
+
@commands = StringIO.new
|
43
|
+
@connection_listeners = Array.new
|
44
|
+
end
|
45
|
+
|
46
|
+
# Saves the command for later inspection in a string io object.
|
47
|
+
def <<(command)
|
48
|
+
@commands<<(command)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Adds a new connection listener. The connection listener gets notified when a
|
52
|
+
# message was received from the IRC server.
|
53
|
+
def add_connection_listener(connection_listener)
|
54
|
+
connection_listeners << connection_listener unless connection_listeners.include?(connection_listener)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Removes a previously added connection listener. The connection listener will not
|
58
|
+
# get notified any longer when a message was received from the IRC server.
|
59
|
+
def remove_connection_listener(connection_listener)
|
60
|
+
connection_listeners.delete(connection_listener)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_command
|
66
|
+
command = IRC::Commands::Command.new("NICK Wiz")
|
67
|
+
assert_equal "NICK Wiz", command.command
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_execute
|
71
|
+
|
72
|
+
# The connection mock.
|
73
|
+
connection = ConnectionMock.new
|
74
|
+
|
75
|
+
# Construct and execute the nick message.
|
76
|
+
command = IRC::Commands::Command.new("NICK Wiz")
|
77
|
+
command.execute(connection)
|
78
|
+
|
79
|
+
# The command should be registered as a connection listener.
|
80
|
+
assert connection.connection_listeners.include?(command)
|
81
|
+
|
82
|
+
# Send the response message.
|
83
|
+
command.on_server_response(connection, IRC::Messages::NickMessage.new(":WiZ NICK Kilroy"))
|
84
|
+
|
85
|
+
# Should return immediately.
|
86
|
+
command.wait
|
87
|
+
|
88
|
+
# The command should no longer be registered as a connection listener.
|
89
|
+
assert !connection.connection_listeners.include?(command)
|
90
|
+
|
91
|
+
# The command should be available at the connection object.
|
92
|
+
connection.commands.rewind
|
93
|
+
assert_equal command.command, connection.commands.readline
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_to_s
|
98
|
+
command = IRC::Commands::Command.new("NICK Wiz")
|
99
|
+
assert_equal "NICK Wiz", command.to_s
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_wait
|
103
|
+
|
104
|
+
# The connection mock.
|
105
|
+
connection = ConnectionMock.new
|
106
|
+
|
107
|
+
# Construct and execute the nick message.
|
108
|
+
command = IRC::Commands::Command.new("NICK Wiz")
|
109
|
+
command.execute(connection)
|
110
|
+
|
111
|
+
# The command should be registered as a connection listener.
|
112
|
+
assert connection.connection_listeners.include?(command)
|
113
|
+
|
114
|
+
# The wait method should block until a response was received. Because the VALID response
|
115
|
+
# hasn't been received yet this method should block forever.
|
116
|
+
assert_raise(Timeout::Error) do
|
117
|
+
Timeout::timeout(0.1) { command.wait }
|
118
|
+
end
|
119
|
+
|
120
|
+
# Send the response message.
|
121
|
+
command.on_server_response(connection, IRC::Messages::NickMessage.new(":WiZ NICK Kilroy"))
|
122
|
+
|
123
|
+
# Now the methos shouldn't block anymore.
|
124
|
+
Timeout::timeout(0.1) do
|
125
|
+
command.wait
|
126
|
+
end
|
127
|
+
|
128
|
+
# The command should no longer be registered as a connection listener.
|
129
|
+
assert !connection.connection_listeners.include?(command)
|
130
|
+
|
131
|
+
# The command should be available at the connection object.
|
132
|
+
connection.commands.rewind
|
133
|
+
assert_equal command.command, connection.commands.readline
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
@@ -23,14 +23,144 @@
|
|
23
23
|
#
|
24
24
|
# $Id: ping_command_test.rb 85 2006-08-13 11:42:07Z roman $
|
25
25
|
#
|
26
|
+
require 'irc/commands/command_test'
|
26
27
|
require 'irc/commands/ping_command'
|
28
|
+
require 'irc/messages/pong_message'
|
27
29
|
require 'test/unit'
|
28
30
|
|
29
|
-
class IRC::Commands::PingCommandTest <
|
31
|
+
class IRC::Commands::PingCommandTest < IRC::Commands::CommandTest
|
30
32
|
|
31
33
|
def test_command
|
32
34
|
assert_equal "PING WiZ", IRC::Commands::PingCommand.new("WiZ").command
|
33
35
|
assert_equal "PING WiZ irc.efnet.pl", IRC::Commands::PingCommand.new("WiZ", "irc.efnet.pl").command
|
34
36
|
end
|
35
37
|
|
38
|
+
def test_execute
|
39
|
+
|
40
|
+
# The connection mock.
|
41
|
+
connection = ConnectionMock.new
|
42
|
+
|
43
|
+
# Construct and execute the nick message.
|
44
|
+
command = IRC::Commands::PingCommand.new("tolsun.oulu.fi")
|
45
|
+
command.execute(connection)
|
46
|
+
|
47
|
+
# The command should be registered as a connection listener.
|
48
|
+
assert connection.connection_listeners.include?(command)
|
49
|
+
|
50
|
+
# Send the response message.
|
51
|
+
command.on_server_response(connection, IRC::Messages::PongMessage.new("PONG tolsun.oulu.fi"))
|
52
|
+
|
53
|
+
# Should return immediately.
|
54
|
+
command.wait
|
55
|
+
|
56
|
+
# The command should no longer be registered as a connection listener.
|
57
|
+
assert !connection.connection_listeners.include?(command)
|
58
|
+
|
59
|
+
# The command should be available at the connection object.
|
60
|
+
connection.commands.rewind
|
61
|
+
assert_equal command.command, connection.commands.readline
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_to_s
|
66
|
+
command = IRC::Commands::PingCommand.new("WiZ")
|
67
|
+
assert_equal "PING WiZ", command.to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_wait_for_pong
|
71
|
+
|
72
|
+
# The connection mock.
|
73
|
+
connection = ConnectionMock.new
|
74
|
+
|
75
|
+
# Construct and execute the nick message.
|
76
|
+
command = IRC::Commands::PingCommand.new("tolsun.oulu.fi")
|
77
|
+
command.execute(connection)
|
78
|
+
|
79
|
+
# The command should be registered as a connection listener.
|
80
|
+
assert connection.connection_listeners.include?(command)
|
81
|
+
|
82
|
+
# The wait method should block until a response was received. Because the VALID response
|
83
|
+
# hasn't been received yet this method should block forever.
|
84
|
+
assert_raise(Timeout::Error) do
|
85
|
+
command.on_server_response(connection, IRC::Messages::NickMessage.new(":WiZ NICK Kilroy"))
|
86
|
+
Timeout::timeout(0.1) { command.wait }
|
87
|
+
end
|
88
|
+
|
89
|
+
# Send the response message.
|
90
|
+
command.on_server_response(connection, IRC::Messages::PongMessage.new("PONG tolsun.oulu.fi"))
|
91
|
+
|
92
|
+
# Now the methos shouldn't block anymore.
|
93
|
+
Timeout::timeout(0.1) do
|
94
|
+
command.wait
|
95
|
+
end
|
96
|
+
|
97
|
+
# The command should no longer be registered as a connection listener.
|
98
|
+
assert !connection.connection_listeners.include?(command)
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_wait_for_error_no_origin
|
103
|
+
|
104
|
+
# The connection mock.
|
105
|
+
connection = ConnectionMock.new
|
106
|
+
|
107
|
+
# Construct and execute the nick message.
|
108
|
+
command = IRC::Commands::PingCommand.new("tolsun.oulu.fi")
|
109
|
+
command.execute(connection)
|
110
|
+
|
111
|
+
# The command should be registered as a connection listener.
|
112
|
+
assert connection.connection_listeners.include?(command)
|
113
|
+
|
114
|
+
# The wait method should block until a response was received. Because the VALID response
|
115
|
+
# hasn't been received yet this method should block forever.
|
116
|
+
assert_raise(Timeout::Error) do
|
117
|
+
command.on_server_response(connection, IRC::Messages::ErrorMessage.new(":irc.easynews.com 4XX"))
|
118
|
+
Timeout::timeout(0.1) { command.wait }
|
119
|
+
end
|
120
|
+
|
121
|
+
# Send the response message.
|
122
|
+
command.on_server_response(connection, IRC::Messages::ErrorNoOriginMessage.new(":irc.easynews.com 4XX"))
|
123
|
+
|
124
|
+
# Now the methos shouldn't block anymore.
|
125
|
+
Timeout::timeout(0.1) do
|
126
|
+
command.wait
|
127
|
+
end
|
128
|
+
|
129
|
+
# The command should no longer be registered as a connection listener.
|
130
|
+
assert !connection.connection_listeners.include?(command)
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_wait_for_error_no_such_server
|
135
|
+
|
136
|
+
# The connection mock.
|
137
|
+
connection = ConnectionMock.new
|
138
|
+
|
139
|
+
# Construct and execute the nick message.
|
140
|
+
command = IRC::Commands::PingCommand.new("tolsun.oulu.fi")
|
141
|
+
command.execute(connection)
|
142
|
+
|
143
|
+
# The command should be registered as a connection listener.
|
144
|
+
assert connection.connection_listeners.include?(command)
|
145
|
+
|
146
|
+
# The wait method should block until a response was received. Because the VALID response
|
147
|
+
# hasn't been received yet this method should block forever.
|
148
|
+
assert_raise(Timeout::Error) do
|
149
|
+
command.on_server_response(connection, IRC::Messages::ErrorMessage.new(":irc.easynews.com 4XX"))
|
150
|
+
Timeout::timeout(0.1) { command.wait }
|
151
|
+
end
|
152
|
+
|
153
|
+
# Send the response message.
|
154
|
+
command.on_server_response(connection, IRC::Messages::ErrorNoSuchServerMessage.new(":irc.easynews.com 4XX"))
|
155
|
+
|
156
|
+
# Now the methos shouldn't block anymore.
|
157
|
+
Timeout::timeout(0.1) do
|
158
|
+
command.wait
|
159
|
+
end
|
160
|
+
|
161
|
+
# The command should no longer be registered as a connection listener.
|
162
|
+
assert !connection.connection_listeners.include?(command)
|
163
|
+
|
164
|
+
end
|
165
|
+
|
36
166
|
end
|
@@ -57,6 +57,10 @@ class IRC::Messages::FactoryTest < Test::Unit::TestCase
|
|
57
57
|
message = IRC::Messages::Factory.create("PONG tolsun.oulu.fi")
|
58
58
|
assert message.instance_of?(IRC::Messages::PongMessage)
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
|
+
def test_private_message
|
62
|
+
message = IRC::Messages::Factory.create(":Angel PRIVMSG Wiz :Hello are you receiving this message ?")
|
63
|
+
assert message.instance_of?(IRC::Messages::PrivateMessage)
|
64
|
+
end
|
61
65
|
|
62
66
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ircguerilla-irc
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2006-08-
|
6
|
+
version: 1.2.0
|
7
|
+
date: 2006-08-20 00:00:00 +02:00
|
8
8
|
summary: A Ruby framework for the Internet Relay Chat (IRC) protocol.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -70,8 +70,9 @@ files:
|
|
70
70
|
- lib/irc/client/command_handler.rb
|
71
71
|
test_files:
|
72
72
|
- test/test_helper.rb
|
73
|
-
- test/unit/irc/commands/password_command_test.rb
|
74
73
|
- test/unit/irc/commands/quit_command_test.rb
|
74
|
+
- test/unit/irc/commands/command_test.rb
|
75
|
+
- test/unit/irc/commands/password_command_test.rb
|
75
76
|
- test/unit/irc/commands/pong_command_test.rb
|
76
77
|
- test/unit/irc/commands/nick_command_test.rb
|
77
78
|
- test/unit/irc/commands/part_command_test.rb
|