Module: Blur::Client::Handling
- Included in:
- Blur::Client
- Defined in:
- library/blur/handling.rb
Overview
The Handling
module is the very core of the IRC-part in Blur.
When the client receives a parsed message instance, it immediately starts looking for a got_(the message name) method inside the client, which is implemented in this module.
Implementing a handler
Implementing a handler is very, very easy.
All you need to do is define a method named got_(message you want to implement) that accepts 2 parameters, network
and message
.
You can then do whatever you need to do with the message instance, you can access the parameters of it through Network::message#[].
Don’t forget that this module is inside the clients scope, so you can access all instance-variables and methods.
Instance Method Summary collapse
- #got_001(network, message) ⇒ Object
-
#got_005(network, message) ⇒ Object
Called when the network announces its ISUPPORT parameters.
-
#got_900(network, message) ⇒ Object
:server 900 <nick> <nick>!<ident>@<host> <account> :You are now logged in as <user> RPL_LOGGEDIN SASL.
-
#got_904(network, message) ⇒ Object
:server 904 <nick> :SASL authentication failed ERR_SASLFAIL.
- #got_authenticate(network, message) ⇒ Object
-
#got_cap(network, message) ⇒ Object
Received when the server supports capability negotiation.
-
#got_channel_topic(network, message) ⇒ Object
(also: #got_332)
Called when a channel topic was changed.
-
#got_end_of_motd(network, message) ⇒ Object
(also: #got_422, #got_376)
Called when the MOTD was received, which also means it is ready.
-
#got_join(network, message) ⇒ Object
Called when a user joined a channel.
-
#got_kick(network, message) ⇒ Object
Called when a user was kicked from a channel.
-
#got_mode(network, message) ⇒ Object
Called when a channel or a users flags was altered.
-
#got_name_reply(network, message) ⇒ Object
(also: #got_353)
Called when the namelist of a channel was received.
-
#got_nick(network, message) ⇒ Object
Called when a user changed nickname.
-
#got_part(network, message) ⇒ Object
Called when a user left a channel.
-
#got_ping(network, message) ⇒ Object
Called when the server needs to verify that we’re alive.
-
#got_privmsg(network, message) ⇒ Object
Called when a message was received (both channel and private messages).
-
#got_quit(network, message) ⇒ Object
Called when a user disconnected from a network.
-
#got_topic(network, message) ⇒ Object
Called when a topic was changed for a channel.
Instance Method Details
#got_001(network, message) ⇒ Object
276 277 278 279 280 |
# File 'library/blur/handling.rb', line 276 def got_001 network, if network.waiting_for_cap network.abort_cap_neg end end |
#got_005(network, message) ⇒ Object
Called when the network announces its ISUPPORT parameters.
244 245 246 247 248 |
# File 'library/blur/handling.rb', line 244 def got_005 network, params = .parameters[1..-2] network.isupport.parse *params end |
#got_900(network, message) ⇒ Object
:server 900 <nick> <nick>!<ident>@<host> <account> :You are now logged in as <user> RPL_LOGGEDIN SASL
295 296 297 298 299 |
# File 'library/blur/handling.rb', line 295 def got_900 network, if network.waiting_for_cap network.cap_end end end |
#got_904(network, message) ⇒ Object
:server 904 <nick> :SASL authentication failed ERR_SASLFAIL
303 304 305 306 307 308 309 |
# File 'library/blur/handling.rb', line 303 def got_904 network, nick, = .parameters puts "SASL authentication failed! Disconnecting!" network.disconnect end |
#got_authenticate(network, message) ⇒ Object
282 283 284 285 286 287 288 289 290 291 |
# File 'library/blur/handling.rb', line 282 def got_authenticate network, case .parameters[0] when '+' return unless network.sasl? sasl = network.['sasl'] response = "#{sasl['username']}\x00#{sasl['username']}\x00#{sasl['password']}" network.transmit :AUTHENTICATE, Base64.encode64(response).strip end end |
#got_cap(network, message) ⇒ Object
Received when the server supports capability negotiation.
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
# File 'library/blur/handling.rb', line 251 def got_cap network, id, command = .parameters[0..1] case command when 'ACK' capabilities = .parameters[2]&.split if capabilities&.include? 'sasl' and network.sasl? network.transmit :AUTHENTICATE, 'PLAIN' else network.cap_end end when 'NAK' capabilities = .parameters[2]&.split if capabilities&.include? 'sasl' and network.sasl? puts "The server does not support SASL, but you've configured it " \ "as such! Disconnecting!" network.disconnect end end end |
#got_channel_topic(network, message) ⇒ Object Also known as: got_332
Called when a channel topic was changed.
Callbacks:
Emits :topic_change with the parameters channel
and topic
.
74 75 76 77 78 79 80 81 82 |
# File 'library/blur/handling.rb', line 74 def got_channel_topic network, _, channel_name, topic = .parameters if channel = find_or_create_channel(channel_name, network) emit :channel_topic, channel, topic channel.topic = topic end end |
#got_end_of_motd(network, message) ⇒ Object Also known as: got_422, got_376
Called when the MOTD was received, which also means it is ready.
Callbacks:
Emits :connection_ready
with the parameter network
.
Automatically joins the channels specified in :channels
.
39 40 41 42 43 44 45 |
# File 'library/blur/handling.rb', line 39 def got_end_of_motd network, emit :connection_ready, network network.['channels'].each do |channel| network.join channel end end |
#got_join(network, message) ⇒ Object
Called when a user joined a channel.
Callbacks:
Emits :user_entered
with the parameters channel
and user
.
143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'library/blur/handling.rb', line 143 def got_join network, channel_name = .parameters[0] user = find_or_create_user .prefix.nick, network user.name = .prefix.user user.host = .prefix.host if channel = find_or_create_channel(channel_name, network) _user_join_channel user, channel emit :user_entered, channel, user end end |
#got_kick(network, message) ⇒ Object
Called when a user was kicked from a channel.
Callbacks:
Emits :user_kicked
with the parameters kicker
, channel
, kickee
and reason
.
kicker
is the user that kicked kickee
.
198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'library/blur/handling.rb', line 198 def got_kick network, name, target, reason = .parameters if channel = network.channels[name] if kicker = network.users[.prefix.nick] if kickee = network.users[target] _user_part_channel kickee, channel emit :user_kicked, kicker, channel, kickee, reason end end end end |
#got_mode(network, message) ⇒ Object
Called when a channel or a users flags was altered.
Callbacks:
When it’s channel modes:
Emits :channel_mode
with the parameters channel
and modes
.
When it’s user modes:
Emits :user_mode
with the parameters user
and modes
.
235 236 237 238 239 240 241 |
# File 'library/blur/handling.rb', line 235 def got_mode network, name, modes, limit, nick, mask = .parameters if channel = network.channels[name] # FIXME end end |
#got_name_reply(network, message) ⇒ Object Also known as: got_353
Called when the namelist of a channel was received.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'library/blur/handling.rb', line 48 def got_name_reply network, name = .parameters[2] # Channel name. nicks = .parameters[3].split.map do |nick| # Slice the nick if the first character is a user mode prefix. if network.user_prefixes.include? nick.chr nick.slice! 0 end nick end if channel = find_or_create_channel(name, network) users = nicks.map{|nick| find_or_create_user nick, network } users.each do |user| user.channels << channel channel.users << user unless channel.users.include? user end emit :channel_who_reply, channel end end |
#got_nick(network, message) ⇒ Object
Called when a user changed nickname.
Callbacks:
Emits :user_rename with the parameters channel
, user
and new_nick
95 96 97 98 99 100 101 102 103 104 |
# File 'library/blur/handling.rb', line 95 def got_nick network, old_nick = .prefix.nick if user = network.users.delete(old_nick) new_nick = .parameters[0] emit :user_rename, user, new_nick user.nick = new_nick network.users[new_nick] = user end end |
#got_part(network, message) ⇒ Object
Called when a user left a channel.
Callbacks:
Emits :user_left
with the parameters channel
and user
.
161 162 163 164 165 166 167 168 169 170 171 |
# File 'library/blur/handling.rb', line 161 def got_part network, channel_name = .parameters[0] if channel = network.channels[channel_name] if user = network.users[.prefix.nick] _user_part_channel user, channel emit :user_left, channel, user end end end |
#got_ping(network, message) ⇒ Object
Called when the server needs to verify that we’re alive.
85 86 87 88 89 |
# File 'library/blur/handling.rb', line 85 def got_ping network, network.transmit :PONG, .parameters[0] emit :network_ping, .parameters[0] end |
#got_privmsg(network, message) ⇒ Object
Messages are contained as strings.
Called when a message was received (both channel and private messages).
Callbacks:
When it’s a channel message:
Emits :message
with the parameters user
, channel
and message
.
When it’s a private message:
Emits :private_message
with the parameters user
and message
.
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'library/blur/handling.rb', line 115 def got_privmsg network, return unless .prefix.nick # Ignore all server privmsgs name, msg = .parameters if channel = network.channels[name] unless user = network.users[.prefix.nick] user = User.new .prefix.nick, network end user.name = .prefix.user user.host = .prefix.host emit :message, user, channel, msg else # This is a private message unless user = network.users[.prefix.nick] user = User.new .prefix.nick, network user.name = .prefix.user user.host = .prefix.host end emit :private_message, user, msg end end |
#got_quit(network, message) ⇒ Object
Called when a user disconnected from a network.
Callbacks:
Emits :user_quit
with the parameters channel
and user
.
177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'library/blur/handling.rb', line 177 def got_quit network, nick = .prefix.nick reason = .parameters[2] if user = network.users[nick] user.channels.each do |channel| channel.users.delete user end emit :user_quit, user, reason network.users.delete nick end end |
#got_topic(network, message) ⇒ Object
Called when a topic was changed for a channel.
Callbacks:
Emits :topic with the parameters user
, channel
and topic
.
216 217 218 219 220 221 222 223 224 225 226 |
# File 'library/blur/handling.rb', line 216 def got_topic network, channel_name, topic = .parameters if channel = network.channels[channel_name] if user = network.users[.prefix.nick] emit :topic, user, channel, topic end channel.topic = topic end end |