blur 1.8.6 → 2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +0 -11
- data/executables/blur +62 -0
- data/library/blur.rb +37 -12
- data/library/blur/callbacks.rb +59 -0
- data/library/blur/channel.rb +75 -0
- data/library/blur/client.rb +122 -91
- data/library/blur/enhancements.rb +1 -3
- data/library/blur/handling.rb +117 -125
- data/library/blur/logging.rb +41 -0
- data/library/blur/network.rb +54 -36
- data/library/blur/network/connection.rb +2 -2
- data/library/blur/script.rb +124 -117
- data/library/blur/script_cache.rb +43 -0
- data/library/blur/user.rb +105 -0
- data/library/blur/version.rb +1 -1
- metadata +17 -21
- data/library/blur/encryption.rb +0 -17
- data/library/blur/encryption/base64.rb +0 -71
- data/library/blur/encryption/fish.rb +0 -80
- data/library/blur/evaluable.rb +0 -13
- data/library/blur/extension.rb +0 -42
- data/library/blur/network/channel.rb +0 -91
- data/library/blur/network/command.rb +0 -83
- data/library/blur/network/user.rb +0 -106
- data/library/blur/script/cache.rb +0 -77
- data/library/blur/script/commands.rb +0 -77
- data/library/blur/script/dsl.rb +0 -52
data/library/blur/handling.rb
CHANGED
@@ -4,18 +4,18 @@ module Blur
|
|
4
4
|
class Client
|
5
5
|
# The +Handling+ module is the very core of the IRC-part in Blur.
|
6
6
|
#
|
7
|
-
# When the client receives a parsed
|
8
|
-
# looking for a got_(the
|
7
|
+
# When the client receives a parsed message instance, it immediately starts
|
8
|
+
# looking for a got_(the message name) method inside the client, which
|
9
9
|
# is implemented in this module.
|
10
10
|
#
|
11
11
|
# == Implementing a handler
|
12
12
|
# Implementing a handler is very, very easy.
|
13
13
|
#
|
14
|
-
# All you need to do is define a method named got_(
|
15
|
-
# implement) that accepts 2 parameters, +network+ and +
|
14
|
+
# All you need to do is define a method named got_(message you want to
|
15
|
+
# implement) that accepts 2 parameters, +network+ and +message+.
|
16
16
|
#
|
17
|
-
# You can then do whatever you need to do with the
|
18
|
-
# you can access the parameters of it through {Network::
|
17
|
+
# You can then do whatever you need to do with the message instance,
|
18
|
+
# you can access the parameters of it through {Network::message#[]}.
|
19
19
|
#
|
20
20
|
# Don't forget that this module is inside the clients scope, so you can
|
21
21
|
# access all instance-variables and methods.
|
@@ -23,8 +23,8 @@ module Blur
|
|
23
23
|
# @example
|
24
24
|
# # RPL_WHOISUSER
|
25
25
|
# # <nick> <user> <host> * :<real name>
|
26
|
-
# def got_whois_user network,
|
27
|
-
# puts "nick: #{
|
26
|
+
# def got_whois_user network, message
|
27
|
+
# puts "nick: #{message.parameters[0]} user: #{message.parameters[1]} host: #{message.parameters[2]} …"
|
28
28
|
# end
|
29
29
|
#
|
30
30
|
# @see http://www.irchelp.org/irchelp/rfc/chapter6.html
|
@@ -36,32 +36,31 @@ module Blur
|
|
36
36
|
# Emits +:connection_ready+ with the parameter +network+.
|
37
37
|
#
|
38
38
|
# Automatically joins the channels specified in +:channels+.
|
39
|
-
def got_end_of_motd network,
|
39
|
+
def got_end_of_motd network, message
|
40
40
|
emit :connection_ready, network
|
41
41
|
|
42
|
-
network.options[
|
43
|
-
network.
|
42
|
+
network.options['channels'].each do |channel|
|
43
|
+
network.join channel
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
# Called when the namelist of a channel was received.
|
48
|
-
def got_name_reply network,
|
49
|
-
name =
|
50
|
-
|
48
|
+
def got_name_reply network, message
|
49
|
+
name = message.parameters[2] # Channel name.
|
50
|
+
nicks = message.parameters[3].split.map do |nick|
|
51
51
|
# Slice the nick if the first character is a user mode prefix.
|
52
52
|
if network.user_prefixes.include? nick.chr
|
53
53
|
nick.slice! 0
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
nick
|
57
57
|
end
|
58
58
|
|
59
59
|
if channel = find_or_create_channel(name, network)
|
60
|
+
users = nicks.map{|nick| find_or_create_user nick, network }
|
60
61
|
users.each do |user|
|
61
|
-
user.
|
62
|
-
user.
|
63
|
-
|
64
|
-
channel.users << user
|
62
|
+
user.channels << channel
|
63
|
+
channel.users << user unless channel.users.include? user
|
65
64
|
end
|
66
65
|
|
67
66
|
emit :channel_who_reply, channel
|
@@ -72,35 +71,35 @@ module Blur
|
|
72
71
|
#
|
73
72
|
# == Callbacks:
|
74
73
|
# Emits :topic_change with the parameters +channel+ and +topic+.
|
75
|
-
def got_channel_topic network,
|
76
|
-
|
74
|
+
def got_channel_topic network, message
|
75
|
+
_, channel_name, topic = message.parameters
|
77
76
|
|
78
|
-
if channel = find_or_create_channel(
|
79
|
-
emit :
|
77
|
+
if channel = find_or_create_channel(channel_name, network)
|
78
|
+
emit :channel_topic, channel, topic
|
80
79
|
|
81
80
|
channel.topic = topic
|
82
81
|
end
|
83
82
|
end
|
84
83
|
|
85
84
|
# Called when the server needs to verify that we're alive.
|
86
|
-
def got_ping network,
|
87
|
-
network.transmit :PONG,
|
85
|
+
def got_ping network, message
|
86
|
+
network.transmit :PONG, message.parameters[0]
|
87
|
+
|
88
|
+
emit :network_ping, message.parameters[0]
|
88
89
|
end
|
89
90
|
|
90
91
|
# Called when a user changed nickname.
|
91
92
|
#
|
92
93
|
# == Callbacks:
|
93
|
-
# Emits :user_rename with the parameters +channel+, +user
|
94
|
-
def got_nick network,
|
95
|
-
|
94
|
+
# Emits :user_rename with the parameters +channel+, +user+ and +new_nick+
|
95
|
+
def got_nick network, message
|
96
|
+
old_nick = message.prefix.nick
|
96
97
|
|
97
|
-
if
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
end
|
103
|
-
end
|
98
|
+
if user = network.users.delete(old_nick)
|
99
|
+
new_nick = message.parameters[0]
|
100
|
+
emit :user_rename, user, new_nick
|
101
|
+
user.nick = new_nick
|
102
|
+
network.users[new_nick] = user
|
104
103
|
end
|
105
104
|
end
|
106
105
|
|
@@ -113,38 +112,27 @@ module Blur
|
|
113
112
|
# Emits +:private_message+ with the parameters +user+ and +message+.
|
114
113
|
#
|
115
114
|
# @note Messages are contained as strings.
|
116
|
-
def got_privmsg network,
|
117
|
-
return
|
118
|
-
name,
|
119
|
-
|
120
|
-
if channel = network.channel_by_name(name)
|
121
|
-
if user = channel.user_by_nick(command.sender.nickname)
|
122
|
-
user.name = command.sender.username
|
123
|
-
user.host = command.sender.hostname
|
124
|
-
|
125
|
-
begin
|
126
|
-
if message[0..3] == "+OK " and channel.encrypted?
|
127
|
-
message = channel.encryption.decrypt message[4..-1]
|
128
|
-
end
|
129
|
-
rescue Encryption::BadInputError
|
130
|
-
puts "-!- FiSH: #{$!.message}"
|
131
|
-
rescue => exception
|
132
|
-
puts "-!- There was a problem with the FiSH encryption, disabling"
|
115
|
+
def got_privmsg network, message
|
116
|
+
return unless message.prefix.nick # Ignore all server privmsgs
|
117
|
+
name, msg = message.parameters
|
133
118
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
emit :message, user, channel, message
|
138
|
-
else
|
139
|
-
# Odd… this shouldn't happen
|
119
|
+
if channel = network.channels[name]
|
120
|
+
unless user = network.users[message.prefix.nick]
|
121
|
+
user = User.new message.prefix.nick, network
|
140
122
|
end
|
123
|
+
|
124
|
+
user.name = message.prefix.user
|
125
|
+
user.host = message.prefix.host
|
126
|
+
|
127
|
+
emit :message, user, channel, msg
|
141
128
|
else # This is a private message
|
142
|
-
user =
|
143
|
-
|
144
|
-
|
145
|
-
|
129
|
+
unless user = network.users[message.prefix.nick]
|
130
|
+
user = User.new message.prefix.nick, network
|
131
|
+
user.name = message.prefix.user
|
132
|
+
user.host = message.prefix.host
|
133
|
+
end
|
146
134
|
|
147
|
-
emit :private_message, user,
|
135
|
+
emit :private_message, user, msg
|
148
136
|
end
|
149
137
|
end
|
150
138
|
|
@@ -152,18 +140,16 @@ module Blur
|
|
152
140
|
#
|
153
141
|
# == Callbacks:
|
154
142
|
# Emits +:user_entered+ with the parameters +channel+ and +user+.
|
155
|
-
def got_join network,
|
156
|
-
|
157
|
-
|
143
|
+
def got_join network, message
|
144
|
+
channel_name = message.parameters[0]
|
145
|
+
|
146
|
+
user = find_or_create_user message.prefix.nick, network
|
147
|
+
user.name = message.prefix.user
|
148
|
+
user.host = message.prefix.host
|
158
149
|
|
159
|
-
if channel = network
|
160
|
-
user
|
161
|
-
|
162
|
-
user.channel = channel
|
163
|
-
user.network = network
|
164
|
-
|
165
|
-
channel.users << user
|
166
|
-
|
150
|
+
if channel = find_or_create_channel(channel_name, network)
|
151
|
+
_user_join_channel user, channel
|
152
|
+
|
167
153
|
emit :user_entered, channel, user
|
168
154
|
end
|
169
155
|
end
|
@@ -172,12 +158,12 @@ module Blur
|
|
172
158
|
#
|
173
159
|
# == Callbacks:
|
174
160
|
# Emits +:user_left+ with the parameters +channel+ and +user+.
|
175
|
-
def got_part network,
|
176
|
-
|
161
|
+
def got_part network, message
|
162
|
+
channel_name = message.parameters[0]
|
177
163
|
|
178
|
-
if channel = network.
|
179
|
-
if user =
|
180
|
-
|
164
|
+
if channel = network.channels[channel_name]
|
165
|
+
if user = network.users[message.prefix.nick]
|
166
|
+
_user_part_channel user, channel
|
181
167
|
|
182
168
|
emit :user_left, channel, user
|
183
169
|
end
|
@@ -188,17 +174,17 @@ module Blur
|
|
188
174
|
#
|
189
175
|
# == Callbacks:
|
190
176
|
# Emits +:user_quit+ with the parameters +channel+ and +user+.
|
191
|
-
def got_quit network,
|
192
|
-
nick =
|
177
|
+
def got_quit network, message
|
178
|
+
nick = message.prefix.nick
|
179
|
+
reason = message.parameters[2]
|
193
180
|
|
194
|
-
if
|
195
|
-
channels.each do |channel|
|
196
|
-
|
197
|
-
channel.users.delete user
|
198
|
-
|
199
|
-
emit :user_quit, channel, user
|
200
|
-
end
|
181
|
+
if user = network.users[nick]
|
182
|
+
user.channels.each do |channel|
|
183
|
+
channel.users.delete user
|
201
184
|
end
|
185
|
+
|
186
|
+
emit :user_quit, user, reason
|
187
|
+
network.users.delete nick
|
202
188
|
end
|
203
189
|
end
|
204
190
|
|
@@ -209,13 +195,13 @@ module Blur
|
|
209
195
|
# and +reason+.
|
210
196
|
#
|
211
197
|
# +kicker+ is the user that kicked +kickee+.
|
212
|
-
def got_kick network,
|
213
|
-
name, target, reason =
|
198
|
+
def got_kick network, message
|
199
|
+
name, target, reason = message.parameters
|
214
200
|
|
215
|
-
if channel = network.
|
216
|
-
if kicker =
|
217
|
-
if kickee =
|
218
|
-
|
201
|
+
if channel = network.channels[name]
|
202
|
+
if kicker = network.users[message.prefix.nick]
|
203
|
+
if kickee = network.users[target]
|
204
|
+
_user_part_channel kickee, channel
|
219
205
|
|
220
206
|
emit :user_kicked, kicker, channel, kickee, reason
|
221
207
|
end
|
@@ -227,11 +213,11 @@ module Blur
|
|
227
213
|
#
|
228
214
|
# == Callbacks:
|
229
215
|
# Emits :topic with the parameters +user+, +channel+ and +topic+.
|
230
|
-
def got_topic network,
|
231
|
-
|
216
|
+
def got_topic network, message
|
217
|
+
channel_name, topic = message.parameters
|
232
218
|
|
233
|
-
if channel = network.
|
234
|
-
if user =
|
219
|
+
if channel = network.channels[channel_name]
|
220
|
+
if user = network.users[message.prefix.nick]
|
235
221
|
emit :topic, user, channel, topic
|
236
222
|
end
|
237
223
|
|
@@ -246,29 +232,17 @@ module Blur
|
|
246
232
|
# Emits +:channel_mode+ with the parameters +channel+ and +modes+.
|
247
233
|
# === When it's user modes:
|
248
234
|
# Emits +:user_mode+ with the parameters +user+ and +modes+.
|
249
|
-
def got_mode network,
|
250
|
-
name, modes, limit, nick, mask =
|
235
|
+
def got_mode network, message
|
236
|
+
name, modes, limit, nick, mask = message.parameters
|
251
237
|
|
252
|
-
if channel = network.
|
253
|
-
|
254
|
-
unless limit.numeric?
|
255
|
-
nick = limit
|
256
|
-
end
|
257
|
-
|
258
|
-
if user = channel.user_by_nick(nick)
|
259
|
-
user.merge_modes modes
|
260
|
-
emit :user_mode, user, modes
|
261
|
-
end
|
262
|
-
else
|
263
|
-
channel.merge_modes modes
|
264
|
-
emit :channel_mode, channel, modes
|
265
|
-
end
|
238
|
+
if channel = network.channels[name]
|
239
|
+
# FIXME
|
266
240
|
end
|
267
241
|
end
|
268
242
|
|
269
243
|
# Called when the network announces its ISUPPORT parameters.
|
270
|
-
def got_005 network,
|
271
|
-
params =
|
244
|
+
def got_005 network, message
|
245
|
+
params = message.parameters[1..-2]
|
272
246
|
|
273
247
|
network.isupport.parse *params
|
274
248
|
end
|
@@ -280,23 +254,41 @@ module Blur
|
|
280
254
|
|
281
255
|
private
|
282
256
|
|
283
|
-
def
|
284
|
-
|
257
|
+
def _user_part_channel user, channel
|
258
|
+
user.channels.delete channel
|
259
|
+
channel.users.delete user
|
285
260
|
|
286
|
-
if
|
287
|
-
|
288
|
-
network.
|
261
|
+
# Forget the user if we no longer share any channels.
|
262
|
+
if user.channels.empty?
|
263
|
+
user.network.users.delete user.nick
|
264
|
+
end
|
265
|
+
end
|
289
266
|
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
267
|
+
def _user_join_channel user, channel
|
268
|
+
channel.users << user
|
269
|
+
user.channels << channel
|
270
|
+
end
|
271
|
+
|
272
|
+
def find_or_create_user nick, network
|
273
|
+
unless user = network.users[nick]
|
274
|
+
user = User.new nick, network
|
275
|
+
network.users[nick] = user
|
276
|
+
emit :user_created, user
|
277
|
+
end
|
278
|
+
|
279
|
+
user
|
280
|
+
end
|
294
281
|
|
282
|
+
def find_or_create_channel name, network
|
283
|
+
unless channel = network.channels[name]
|
284
|
+
channel = Channel.new name, network
|
285
|
+
network.channels[name] = channel
|
295
286
|
emit :channel_created, channel
|
296
287
|
end
|
297
288
|
|
298
289
|
channel
|
299
290
|
end
|
300
291
|
end
|
292
|
+
|
301
293
|
end
|
302
294
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Temporary replacement for majic's color method.
|
4
|
+
class String
|
5
|
+
def ^ c
|
6
|
+
self
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Blur
|
11
|
+
# Very crude logging module.
|
12
|
+
module Logging
|
13
|
+
Levels = [:debug, :info, :warn, :error, :fatal]
|
14
|
+
|
15
|
+
class Logger
|
16
|
+
Levels.each do |level|
|
17
|
+
define_method level do |*messages|
|
18
|
+
Logging.mutex.synchronize do
|
19
|
+
messages.each{|m| puts "%-8s %s" % [level.to_s.upcase, m] }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
@mutex = Mutex.new
|
26
|
+
@logger = Logger.new
|
27
|
+
|
28
|
+
class << self
|
29
|
+
attr_reader :mutex
|
30
|
+
attr_reader :logger
|
31
|
+
end
|
32
|
+
|
33
|
+
def log *messages
|
34
|
+
if messages.empty?
|
35
|
+
Logging.logger
|
36
|
+
else
|
37
|
+
Logging.logger.debug *messages
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/library/blur/network.rb
CHANGED
@@ -13,12 +13,13 @@ module Blur
|
|
13
13
|
|
14
14
|
# @return [Hash] the network options.
|
15
15
|
attr_accessor :options
|
16
|
-
|
16
|
+
|
17
|
+
# @return [Hash] the map of users that is known.
|
18
|
+
attr_accessor :users
|
19
|
+
# @return [Hash] the map of channels the client is in.
|
17
20
|
attr_accessor :channels
|
18
|
-
# @return [
|
19
|
-
attr_accessor :
|
20
|
-
# @return [Client] the client delegate.
|
21
|
-
attr_accessor :delegate
|
21
|
+
# @return [Client] the client reference.
|
22
|
+
attr_accessor :client
|
22
23
|
# @return [Network::Connection] the connection instance.
|
23
24
|
attr_accessor :connection
|
24
25
|
# @return [Network::ISupport] the network isupport specs.
|
@@ -30,20 +31,17 @@ module Blur
|
|
30
31
|
# Get the remote hostname.
|
31
32
|
#
|
32
33
|
# @return [String] the remote hostname.
|
33
|
-
def host; @options[
|
34
|
+
def host; @options['hostname'] end
|
34
35
|
|
35
36
|
# Get the remote port.
|
36
37
|
# If no port is specified, it returns 6697 if using a secure connection,
|
37
38
|
# returns 6667 otherwise.
|
38
39
|
#
|
39
40
|
# @return [Fixnum] the remote port
|
40
|
-
def port; @options[
|
41
|
+
def port; @options['port'] ||= secure? ? 6697 : 6667 end
|
41
42
|
|
42
43
|
# Check to see if it's a secure connection.
|
43
|
-
def secure?; @options[
|
44
|
-
|
45
|
-
# Check to see if FiSH encryption is enabled.
|
46
|
-
def fish?; not @options[:fish].nil? end
|
44
|
+
def secure?; @options['secure'] == true end
|
47
45
|
|
48
46
|
# Instantiates the network.
|
49
47
|
#
|
@@ -68,18 +66,24 @@ module Blur
|
|
68
66
|
# remote certificate matches the specified fingerprint.
|
69
67
|
# @option options [optional, Boolean] :ssl_no_verify Disable verification
|
70
68
|
# alltogether.
|
71
|
-
def initialize options
|
72
|
-
@
|
73
|
-
@
|
69
|
+
def initialize options, client = nil
|
70
|
+
@client = client
|
71
|
+
@options = options
|
72
|
+
@users = {}
|
73
|
+
@channels = {}
|
74
74
|
@isupport = ISupport.new self
|
75
75
|
|
76
|
-
unless options[
|
77
|
-
|
76
|
+
unless options['nickname']
|
77
|
+
if options['hostname']
|
78
|
+
raise ArgumentError, "Network configuration for `#{options['hostname']}' is missing a nickname"
|
79
|
+
else
|
80
|
+
raise ArgumentError, "Network configuration is missing a nickname"
|
81
|
+
end
|
78
82
|
end
|
79
83
|
|
80
|
-
@options[
|
81
|
-
@options[
|
82
|
-
@options[
|
84
|
+
@options['username'] ||= @options['nickname']
|
85
|
+
@options['realname'] ||= @options['username']
|
86
|
+
@options['channels'] ||= []
|
83
87
|
end
|
84
88
|
|
85
89
|
# Send a message to a recipient.
|
@@ -87,16 +91,17 @@ module Blur
|
|
87
91
|
# @param [String, #to_s] recipient the recipient.
|
88
92
|
# @param [String] message the message.
|
89
93
|
def say recipient, message
|
90
|
-
if recipient.is_a? Channel and recipient.encrypted?
|
91
|
-
message = "+OK #{recipient.encryption.encrypt message}"
|
92
|
-
end
|
93
|
-
|
94
94
|
transmit :PRIVMSG, recipient.to_s, message
|
95
95
|
end
|
96
96
|
|
97
97
|
# Called when the network connection has enough data to form a command.
|
98
|
-
def
|
99
|
-
@
|
98
|
+
def got_message message
|
99
|
+
@client.got_message self, message
|
100
|
+
rescue => e
|
101
|
+
puts "#{e.class}: #{e.message}"
|
102
|
+
puts
|
103
|
+
puts "---"
|
104
|
+
puts e.backtrace
|
100
105
|
end
|
101
106
|
|
102
107
|
# Find a channel by its name.
|
@@ -104,7 +109,7 @@ module Blur
|
|
104
109
|
# @param [String] name the channel name.
|
105
110
|
# @return [Network::Channel] the matching channel, or nil.
|
106
111
|
def channel_by_name name
|
107
|
-
@channels.find {
|
112
|
+
@channels.find {|channel| channel.name == name }
|
108
113
|
end
|
109
114
|
|
110
115
|
# Find all instances of channels in which there is a user with the nick
|
@@ -113,7 +118,7 @@ module Blur
|
|
113
118
|
# @param [String] nick the nickname.
|
114
119
|
# @return [Array] a list of channels in which the user is located, or nil.
|
115
120
|
def channels_with_user nick
|
116
|
-
@channels.select {
|
121
|
+
@channels.select {|channel| channel.user_by_nick nick }
|
117
122
|
end
|
118
123
|
|
119
124
|
# Returns a list of user prefixes that a nick might contain.
|
@@ -146,17 +151,18 @@ module Blur
|
|
146
151
|
|
147
152
|
# Called when the connection was successfully established.
|
148
153
|
def connected!
|
149
|
-
transmit :PASS, @options[
|
150
|
-
transmit :NICK, @options[
|
151
|
-
transmit :USER, @options[
|
154
|
+
transmit :PASS, @options['password'] if @options['password']
|
155
|
+
transmit :NICK, @options['nickname']
|
156
|
+
transmit :USER, @options['username'], 'void', 'void', @options['realname']
|
152
157
|
end
|
153
158
|
|
154
159
|
# Called when the connection was closed.
|
155
160
|
def disconnected!
|
156
|
-
@channels.each {
|
161
|
+
@channels.each {|name, channel| channel.users.clear }
|
157
162
|
@channels.clear
|
163
|
+
@users.clear
|
158
164
|
|
159
|
-
@
|
165
|
+
@client.network_connection_closed self
|
160
166
|
end
|
161
167
|
|
162
168
|
# Terminate the connection and clear all channels and users.
|
@@ -169,13 +175,25 @@ module Blur
|
|
169
175
|
# @param [Symbol, String] name the command name.
|
170
176
|
# @param [...] arguments all the prepended parameters.
|
171
177
|
def transmit name, *arguments
|
172
|
-
|
173
|
-
|
178
|
+
message = IRCParser::Message.new command: name.to_s, parameters: arguments
|
179
|
+
|
180
|
+
if @client.verbose
|
181
|
+
log "#{'→' ^ :red} #{message.command.to_s.ljust(8, ' ') ^ :light_gray} #{message.parameters.map(&:inspect).join ' '}"
|
182
|
+
end
|
174
183
|
|
175
|
-
@connection.send_data "#{
|
184
|
+
@connection.send_data "#{message}\r\n"
|
185
|
+
end
|
186
|
+
|
187
|
+
# Send a private message.
|
188
|
+
def send_privmsg recipient, message
|
189
|
+
transmit :PRIVMSG, recipient, message
|
190
|
+
end
|
191
|
+
|
192
|
+
# Join a channel.
|
193
|
+
def join channel
|
194
|
+
transmit :JOIN, channel
|
176
195
|
end
|
177
196
|
|
178
|
-
|
179
197
|
# Convert it to a debug-friendly format.
|
180
198
|
def to_s
|
181
199
|
%{#<#{self.class.name} "#{host}":#{port}>}
|