grinch 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -2
  3. data/lib/cinch.rb +7 -5
  4. data/lib/cinch/ban.rb +6 -2
  5. data/lib/cinch/bot.rb +21 -31
  6. data/lib/cinch/cached_list.rb +2 -0
  7. data/lib/cinch/callback.rb +2 -0
  8. data/lib/cinch/channel.rb +43 -44
  9. data/lib/cinch/channel_list.rb +2 -0
  10. data/lib/cinch/configuration.rb +8 -6
  11. data/lib/cinch/configuration/bot.rb +35 -33
  12. data/lib/cinch/configuration/dcc.rb +4 -2
  13. data/lib/cinch/configuration/plugins.rb +8 -6
  14. data/lib/cinch/configuration/sasl.rb +6 -4
  15. data/lib/cinch/configuration/ssl.rb +7 -5
  16. data/lib/cinch/configuration/timeouts.rb +4 -2
  17. data/lib/cinch/constants.rb +3 -1
  18. data/lib/cinch/dcc.rb +2 -0
  19. data/lib/cinch/dcc/dccable_object.rb +6 -8
  20. data/lib/cinch/dcc/incoming.rb +2 -0
  21. data/lib/cinch/dcc/incoming/send.rb +10 -8
  22. data/lib/cinch/dcc/outgoing.rb +2 -0
  23. data/lib/cinch/dcc/outgoing/send.rb +13 -14
  24. data/lib/cinch/exceptions.rb +2 -0
  25. data/lib/cinch/formatting.rb +32 -30
  26. data/lib/cinch/handler.rb +15 -13
  27. data/lib/cinch/handler_list.rb +13 -13
  28. data/lib/cinch/helpers.rb +16 -16
  29. data/lib/cinch/irc.rb +118 -142
  30. data/lib/cinch/isupport.rb +22 -20
  31. data/lib/cinch/log_filter.rb +3 -2
  32. data/lib/cinch/logger.rb +7 -2
  33. data/lib/cinch/logger/formatted_logger.rb +17 -13
  34. data/lib/cinch/logger/zcbot_logger.rb +4 -0
  35. data/lib/cinch/logger_list.rb +15 -14
  36. data/lib/cinch/mask.rb +11 -9
  37. data/lib/cinch/message.rb +6 -6
  38. data/lib/cinch/message_queue.rb +5 -4
  39. data/lib/cinch/mode_parser.rb +7 -5
  40. data/lib/cinch/network.rb +2 -0
  41. data/lib/cinch/open_ended_queue.rb +5 -5
  42. data/lib/cinch/pattern.rb +11 -8
  43. data/lib/cinch/plugin.rb +43 -49
  44. data/lib/cinch/plugin_list.rb +4 -4
  45. data/lib/cinch/rubyext/float.rb +3 -3
  46. data/lib/cinch/rubyext/module.rb +2 -0
  47. data/lib/cinch/rubyext/string.rb +8 -6
  48. data/lib/cinch/sasl.rb +2 -0
  49. data/lib/cinch/sasl/dh_blowfish.rb +5 -3
  50. data/lib/cinch/sasl/diffie_hellman.rb +6 -3
  51. data/lib/cinch/sasl/mechanism.rb +2 -0
  52. data/lib/cinch/sasl/plain.rb +2 -0
  53. data/lib/cinch/syncable.rb +10 -9
  54. data/lib/cinch/target.rb +15 -17
  55. data/lib/cinch/timer.rb +9 -7
  56. data/lib/cinch/user.rb +52 -48
  57. data/lib/cinch/user_list.rb +8 -11
  58. data/lib/cinch/utilities/deprecation.rb +5 -5
  59. data/lib/cinch/utilities/encoding.rb +9 -9
  60. data/lib/cinch/utilities/kernel.rb +4 -1
  61. data/lib/cinch/version.rb +3 -1
  62. metadata +4 -4
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cinch
2
4
  # @since 2.0.0
3
5
  class Handler
@@ -39,16 +41,16 @@ module Cinch
39
41
  # @option options [Array] :args ([]) Additional arguments to pass
40
42
  # to the block
41
43
  def initialize(bot, event, pattern, options = {}, &block)
42
- options = {
43
- :group => nil,
44
- :execute_in_callback => false,
45
- :strip_colors => false,
46
- :args => []
44
+ options = {
45
+ group: nil,
46
+ execute_in_callback: false,
47
+ strip_colors: false,
48
+ args: [],
47
49
  }.merge(options)
48
- @bot = bot
49
- @event = event
50
- @pattern = pattern
51
- @group = options[:group]
50
+ @bot = bot
51
+ @event = event
52
+ @pattern = pattern
53
+ @group = options[:group]
52
54
  @execute_in_callback = options[:execute_in_callback]
53
55
  @strip_colors = options[:strip_colors]
54
56
  @args = options[:args]
@@ -89,7 +91,7 @@ module Cinch
89
91
  def call(message, captures, arguments)
90
92
  bargs = captures + arguments
91
93
 
92
- thread = Thread.new {
94
+ thread = Thread.new do
93
95
  @bot.loggers.debug "[New thread] For #{self}: #{Thread.current} -- #{@thread_group.list.size} in total."
94
96
 
95
97
  begin
@@ -98,12 +100,12 @@ module Cinch
98
100
  else
99
101
  @block.call(message, *@args, *bargs)
100
102
  end
101
- rescue => e
103
+ rescue StandardError => e
102
104
  @bot.loggers.exception(e)
103
105
  ensure
104
106
  @bot.loggers.debug "[Thread done] For #{self}: #{Thread.current} -- #{@thread_group.list.size - 1} remaining."
105
107
  end
106
- }
108
+ end
107
109
 
108
110
  @thread_group.add(thread)
109
111
  thread
@@ -111,7 +113,7 @@ module Cinch
111
113
 
112
114
  # @return [String]
113
115
  def to_s
114
- # TODO maybe add the number of running threads to the output?
116
+ # TODO: maybe add the number of running threads to the output?
115
117
  "#<Cinch::Handler @event=#{@event.inspect} pattern=#{@pattern.inspect}>"
116
118
  end
117
119
  end
@@ -1,4 +1,5 @@
1
- require "thread"
1
+ # frozen_string_literal: true
2
+
2
3
  require "set"
3
4
  require "cinch/cached_list"
4
5
 
@@ -8,7 +9,7 @@ module Cinch
8
9
  include Enumerable
9
10
 
10
11
  def initialize
11
- @handlers = Hash.new {|h,k| h[k] = []}
12
+ @handlers = Hash.new { |h, k| h[k] = [] }
12
13
  @mutex = Mutex.new
13
14
  end
14
15
 
@@ -34,13 +35,11 @@ module Cinch
34
35
  # @return [Array<Handler>]
35
36
  def find(type, msg = nil)
36
37
  if handlers = @handlers[type]
37
- if msg.nil?
38
- return handlers
39
- end
38
+ return handlers if msg.nil?
40
39
 
41
- handlers = handlers.select { |handler|
40
+ handlers = handlers.select do |handler|
42
41
  msg.match(handler.pattern.to_r(msg), type, handler.strip_colors)
43
- }.group_by {|handler| handler.group}
42
+ end.group_by(&:group)
44
43
 
45
44
  handlers.values_at(*(handlers.keys - [nil])).map(&:first) + (handlers[nil] || [])
46
45
  end
@@ -59,14 +58,15 @@ module Cinch
59
58
  already_run = Set.new
60
59
  handlers.each do |handler|
61
60
  next if already_run.include?(handler.block)
61
+
62
62
  already_run << handler.block
63
63
  # calling Message#match multiple times is not a problem
64
64
  # because we cache the result
65
- if msg
66
- captures = msg.match(handler.pattern.to_r(msg), event, handler.strip_colors).captures
67
- else
68
- captures = []
69
- end
65
+ captures = if msg
66
+ msg.match(handler.pattern.to_r(msg), event, handler.strip_colors).captures
67
+ else
68
+ []
69
+ end
70
70
 
71
71
  threads << handler.call(msg, captures, arguments)
72
72
  end
@@ -84,7 +84,7 @@ module Cinch
84
84
 
85
85
  # @api private
86
86
  def stop_all
87
- each { |h| h.stop }
87
+ each(&:stop)
88
88
  end
89
89
  end
90
90
  end
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  module Cinch
3
4
  # The Helpers module contains a number of methods whose purpose is
4
5
  # to make writing plugins easier by hiding parts of the API. The
@@ -22,6 +23,7 @@ module Cinch
22
23
  # @since 2.0.0
23
24
  def Target(target)
24
25
  return target if target.is_a?(Target)
26
+
25
27
  Target.new(target, bot)
26
28
  end
27
29
 
@@ -36,6 +38,7 @@ module Cinch
36
38
  # @since 1.0.0
37
39
  def Channel(channel)
38
40
  return channel if channel.is_a?(Channel)
41
+
39
42
  bot.channel_list.find_ensured(channel)
40
43
  end
41
44
 
@@ -51,6 +54,7 @@ module Cinch
51
54
  # @since 1.0.0
52
55
  def User(user)
53
56
  return user if user.is_a?(User)
57
+
54
58
  if user == bot.nick
55
59
  bot
56
60
  else
@@ -91,14 +95,12 @@ module Cinch
91
95
  # @return [Timer]
92
96
  # @since 2.0.0
93
97
  def Timer(interval, options = {}, &block)
94
- options = {:method => :timer, :threaded => true, :interval => interval}.merge(options)
95
- block ||= self.method(options[:method])
98
+ options = { method: :timer, threaded: true, interval: interval }.merge(options)
99
+ block ||= method(options[:method])
96
100
  timer = Cinch::Timer.new(bot, options, &block)
97
101
  timer.start
98
102
 
99
- if self.respond_to?(:timers)
100
- timers << timer
101
- end
103
+ timers << timer if respond_to?(:timers)
102
104
 
103
105
  timer
104
106
  end
@@ -119,19 +121,17 @@ module Cinch
119
121
  # @return [void]
120
122
  # @since 2.0.0
121
123
  def rescue_exception
122
- begin
123
- yield
124
- rescue => e
125
- bot.loggers.exception(e)
126
- end
124
+ yield
125
+ rescue StandardError => e
126
+ bot.loggers.exception(e)
127
127
  end
128
128
 
129
129
  # (see Logger#log)
130
130
  def log(messages, event = :debug, level = event)
131
- if self.is_a?(Cinch::Plugin)
132
- messages = Array(messages).map {|m|
131
+ if is_a?(Cinch::Plugin)
132
+ messages = Array(messages).map do |m|
133
133
  "[#{self.class}] " + m
134
- }
134
+ end
135
135
  end
136
136
  @bot.loggers.log(messages, event, level)
137
137
  end
@@ -183,7 +183,7 @@ module Cinch
183
183
  def Format(*settings, string)
184
184
  Formatting.format(*settings, string)
185
185
  end
186
- alias_method :Color, :Format # deprecated
186
+ alias Color Format # deprecated
187
187
  undef_method(:Color) # yardoc hack
188
188
 
189
189
  def Color(*args)
@@ -218,7 +218,7 @@ module Cinch
218
218
  # @return [String] The filtered string
219
219
  # @since 2.2.0
220
220
  def self.sanitize(string)
221
- string.gsub(/[\x00-\x08\x0a-\x1f\x7f]/, '')
221
+ string.gsub(/[\x00-\x08\x0a-\x1f\x7f]/, "")
222
222
  end
223
223
 
224
224
  # (see Formatting.unformat)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "timeout"
2
4
  require "net/protocol"
3
5
  require "cinch/network"
@@ -46,7 +48,7 @@ module Cinch
46
48
  tcp_socket = nil
47
49
 
48
50
  begin
49
- Timeout::timeout(@bot.config.timeouts.connect) do
51
+ Timeout.timeout(@bot.config.timeouts.connect) do
50
52
  tcp_socket = TCPSocket.new(@bot.config.server, @bot.config.port, @bot.config.local_host)
51
53
  end
52
54
  rescue Timeout::Error
@@ -55,7 +57,7 @@ module Cinch
55
57
  rescue SocketError => e
56
58
  @bot.loggers.warn("Could not connect to the IRC server. Please check your network: #{e.message}")
57
59
  return false
58
- rescue => e
60
+ rescue StandardError => e
59
61
  @bot.loggers.exception(e)
60
62
  return false
61
63
  end
@@ -70,7 +72,7 @@ module Cinch
70
72
  @socket.read_timeout = @bot.config.timeouts.read
71
73
  @queue = MessageQueue.new(@socket, @bot)
72
74
 
73
- return true
75
+ true
74
76
  end
75
77
 
76
78
  # @api private
@@ -79,7 +81,7 @@ module Cinch
79
81
  def setup_ssl(socket)
80
82
  # require openssl in this method so the bot doesn't break for
81
83
  # people who don't have SSL but don't want to use SSL anyway.
82
- require 'openssl'
84
+ require "openssl"
83
85
 
84
86
  ssl_context = OpenSSL::SSL::SSLContext.new
85
87
 
@@ -112,11 +114,11 @@ module Cinch
112
114
  # @return [void]
113
115
  # @since 2.0.0
114
116
  def send_cap_req
115
- caps = [:"away-notify", :"multi-prefix", :sasl, :"twitch.tv/tags"] & @network.capabilities
117
+ caps = %i[away-notify multi-prefix sasl twitch.tv/tags] & @network.capabilities
116
118
 
117
119
  # InspIRCd doesn't respond to empty REQs, so send an END in that
118
120
  # case.
119
- if caps.size > 0
121
+ if !caps.empty?
120
122
  send "CAP REQ :" + caps.join(" ")
121
123
  else
122
124
  send_cap_end
@@ -155,13 +157,13 @@ module Cinch
155
157
  @bot.loggers.warn "Connection timed out."
156
158
  rescue EOFError
157
159
  @bot.loggers.warn "Lost connection."
158
- rescue => e
160
+ rescue StandardError => e
159
161
  @bot.loggers.exception(e)
160
162
  end
161
163
 
162
164
  @socket.close
163
165
  @bot.handlers.dispatch(:disconnect)
164
- # FIXME won't we kill all :disconnect handlers here? prolly
166
+ # FIXME: won't we kill all :disconnect handlers here? prolly
165
167
  # not, as they have 10 seconds to finish. that should be
166
168
  # plenty of time
167
169
  @bot.handlers.stop_all
@@ -184,7 +186,7 @@ module Cinch
184
186
  # @since 2.0.0
185
187
  def start_ping_thread
186
188
  Thread.new do
187
- while true
189
+ loop do
188
190
  sleep @bot.config.ping_interval
189
191
  # PING requires a single argument. In our case the value
190
192
  # doesn't matter though.
@@ -228,12 +230,13 @@ module Cinch
228
230
  # @return [void]
229
231
  def parse(input)
230
232
  return if input.chomp.empty?
233
+
231
234
  @bot.loggers.incoming(input)
232
235
 
233
236
  msg = Message.new(input, @bot)
234
237
  events = [[:catchall]]
235
238
 
236
- if ["001", "002", "003", "004", "422"].include?(msg.command)
239
+ if %w[001 002 003 004 422].include?(msg.command)
237
240
  @registration << msg.command
238
241
  if registered?
239
242
  events << [:connect]
@@ -242,29 +245,23 @@ module Cinch
242
245
  end
243
246
  end
244
247
 
245
- if ["PRIVMSG", "NOTICE"].include?(msg.command)
248
+ if %w[PRIVMSG NOTICE].include?(msg.command)
246
249
  events << [:ctcp] if msg.ctcp?
247
- if msg.channel?
248
- events << [:channel]
249
- else
250
- events << [:private]
251
- end
250
+ events << if msg.channel?
251
+ [:channel]
252
+ else
253
+ [:private]
254
+ end
252
255
 
253
- if msg.command == "PRIVMSG"
254
- events << [:message]
255
- end
256
+ events << [:message] if msg.command == "PRIVMSG"
256
257
 
257
- if msg.action?
258
- events << [:action]
259
- end
258
+ events << [:action] if msg.action?
260
259
  end
261
260
 
262
261
  meth = "on_#{msg.command.downcase}"
263
262
  __send__(meth, msg, events) if respond_to?(meth, true)
264
263
 
265
- if msg.error?
266
- events << [:error]
267
- end
264
+ events << [:error] if msg.error?
268
265
 
269
266
  events << [msg.command.downcase.to_sym]
270
267
 
@@ -287,7 +284,8 @@ module Cinch
287
284
  end
288
285
 
289
286
  private
290
- def set_leaving_user(message, user, events)
287
+
288
+ def set_leaving_user(_message, user, events)
291
289
  events << [:leaving, user]
292
290
  end
293
291
 
@@ -299,20 +297,20 @@ module Cinch
299
297
  case event
300
298
  when "002"
301
299
  if msg.params.last =~ /^Your host is .+?, running version (.+)$/
302
- case $1
300
+ case Regexp.last_match(1)
303
301
  when /\+snircd\(/
304
302
  new_ircd = :snircd
305
303
  when /^u[\d\.]+$/
306
304
  new_ircd = :ircu
307
305
  when /^(.+?)-?\d+/
308
- new_ircd = $1.downcase.to_sym
306
+ new_ircd = Regexp.last_match(1).downcase.to_sym
309
307
  end
310
308
  elsif msg.params.last == "Your host is jtvchat"
311
309
  new_network = :jtv
312
310
  new_ircd = :jtv
313
311
  end
314
312
  when "004"
315
- if msg.params == %w{irc.tinyspeck.com IRC-SLACK gateway}
313
+ if msg.params == %w[irc.tinyspeck.com IRC-SLACK gateway]
316
314
  new_network = :slack
317
315
  new_ircd = :slack
318
316
  end
@@ -355,7 +353,7 @@ module Cinch
355
353
  msg.channel.bans_unsynced << ban
356
354
  events << [:ban, ban]
357
355
  else
358
- msg.channel.bans_unsynced.delete_if {|b| b.mask == ban.mask}
356
+ msg.channel.bans_unsynced.delete_if { |b| b.mask == ban.mask }
359
357
  events << [:unban, ban]
360
358
  end
361
359
  end
@@ -390,7 +388,7 @@ module Cinch
390
388
  end
391
389
 
392
390
  # @since 2.0.0
393
- def on_cap(msg, events)
391
+ def on_cap(msg, _events)
394
392
  case msg.params[1]
395
393
  when "LS"
396
394
  @network.capabilities.concat msg.message.split(" ").map(&:to_sym)
@@ -407,11 +405,11 @@ module Cinch
407
405
  end
408
406
 
409
407
  # @since 2.0.0
410
- def on_connect(msg, events)
408
+ def on_connect(_msg, _events)
411
409
  @bot.modes = @bot.config.modes
412
410
  end
413
411
 
414
- def on_join(msg, events)
412
+ def on_join(msg, _events)
415
413
  if msg.user == @bot
416
414
  @bot.channels << msg.channel
417
415
  msg.channel.sync_modes
@@ -422,9 +420,7 @@ module Cinch
422
420
 
423
421
  def on_kick(msg, events)
424
422
  target = User(msg.params[1])
425
- if target == @bot
426
- @bot.channels.delete(msg.channel)
427
- end
423
+ @bot.channels.delete(msg.channel) if target == @bot
428
424
  msg.channel.remove_user(target)
429
425
 
430
426
  set_leaving_user(msg, target, events)
@@ -449,23 +445,20 @@ module Cinch
449
445
  parse_channel_modes(msg, events)
450
446
  return
451
447
  end
452
- if msg.params.first == bot.nick
453
- parse_bot_modes(msg)
454
- end
448
+ parse_bot_modes(msg) if msg.params.first == bot.nick
455
449
  end
456
450
 
457
451
  def parse_channel_modes(msg, events)
458
452
  add_and_remove = @bot.irc.isupport["CHANMODES"]["A"] + @bot.irc.isupport["CHANMODES"]["B"] + @bot.irc.isupport["PREFIX"].keys
459
453
 
460
454
  param_modes = {
461
- :add => @bot.irc.isupport["CHANMODES"]["C"] + add_and_remove,
462
- :remove => add_and_remove
455
+ add: @bot.irc.isupport["CHANMODES"]["C"] + add_and_remove,
456
+ remove: add_and_remove,
463
457
  }
464
458
 
465
-
466
459
  modes, err = ModeParser.parse_modes(msg.params[1], msg.params[2..-1], param_modes)
467
- if err != nil
468
- if @network.ircd != :slack || !err.is_a?(ModeParser::TooManyParametersError)
460
+ unless err.nil?
461
+ if @network.ircd != :slack || !err.is_a?(ModeParser::TooManyParametersError)
469
462
  raise Exceptions::InvalidModeString, err
470
463
  end
471
464
  end
@@ -483,9 +476,9 @@ module Cinch
483
476
  user_events = {
484
477
  "o" => "op",
485
478
  "v" => "voice",
486
- "h" => "halfop"
479
+ "h" => "halfop",
487
480
  }
488
- if user_events.has_key?(mode)
481
+ if user_events.key?(mode)
489
482
  event = (direction == :add ? "" : "de") + user_events[mode]
490
483
  events << [event.to_sym, target]
491
484
  end
@@ -513,9 +506,8 @@ module Cinch
513
506
 
514
507
  def parse_bot_modes(msg)
515
508
  modes, err = ModeParser.parse_modes(msg.params[1], msg.params[2..-1])
516
- if err != nil
517
- raise Exceptions::InvalidModeString, err
518
- end
509
+ raise Exceptions::InvalidModeString, err unless err.nil?
510
+
519
511
  modes.each do |direction, mode, _|
520
512
  if direction == :add
521
513
  @bot.modes << mode unless @bot.modes.include?(mode)
@@ -525,13 +517,13 @@ module Cinch
525
517
  end
526
518
  end
527
519
 
528
- def on_nick(msg, events)
529
- if msg.user == @bot
530
- # @bot.set_nick msg.params.last
531
- target = @bot
532
- else
533
- target = msg.user
534
- end
520
+ def on_nick(msg, _events)
521
+ target = if msg.user == @bot
522
+ # @bot.set_nick msg.params.last
523
+ @bot
524
+ else
525
+ msg.user
526
+ end
535
527
 
536
528
  target.update_nick(msg.params.last)
537
529
  target.online = true
@@ -541,18 +533,16 @@ module Cinch
541
533
  msg.channel.remove_user(msg.user)
542
534
  msg.user.channels_unsynced.delete msg.channel
543
535
 
544
- if msg.user == @bot
545
- @bot.channels.delete(msg.channel)
546
- end
536
+ @bot.channels.delete(msg.channel) if msg.user == @bot
547
537
 
548
538
  set_leaving_user(msg, msg.user, events)
549
539
  end
550
540
 
551
- def on_ping(msg, events)
541
+ def on_ping(msg, _events)
552
542
  send "PONG :#{msg.params.first}"
553
543
  end
554
544
 
555
- def on_topic(msg, events)
545
+ def on_topic(msg, _events)
556
546
  msg.channel.sync(:topic, msg.params[1])
557
547
  end
558
548
 
@@ -576,12 +566,10 @@ module Cinch
576
566
 
577
567
  # @since 2.0.0
578
568
  def on_privmsg(msg, events)
579
- if msg.user
580
- msg.user.online = true
581
- end
569
+ msg.user.online = true if msg.user
582
570
 
583
571
  if msg.message =~ /^\001DCC SEND (?:"([^"]+)"|(\S+)) (\S+) (\d+)(?: (\d+))?\001$/
584
- process_dcc_send($1 || $2, $3, $4, $5, msg, events)
572
+ process_dcc_send(Regexp.last_match(1) || Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4), Regexp.last_match(5), msg, events)
585
573
  end
586
574
  end
587
575
 
@@ -594,7 +582,7 @@ module Cinch
594
582
  # If it's not valid, let someone higher up the chain notice
595
583
  # that.
596
584
  ip = ip.to_i
597
- ip = [24, 16, 8, 0].collect {|b| (ip >> b) & 255}.join('.')
585
+ ip = [24, 16, 8, 0].collect { |b| (ip >> b) & 255 }.join(".")
598
586
  end
599
587
 
600
588
  port = port.to_i
@@ -607,119 +595,117 @@ module Cinch
607
595
  end
608
596
 
609
597
  # @since 2.0.0
610
- def on_001(msg, events)
598
+ def on_001(msg, _events)
611
599
  # Ensure that we know our real, possibly truncated or otherwise
612
600
  # modified nick.
613
601
  @bot.set_nick msg.params.first
614
602
  end
615
603
 
616
604
  # @since 2.0.0
617
- def on_002(msg, events)
605
+ def on_002(msg, _events)
618
606
  detect_network(msg, "002")
619
607
  end
620
608
 
621
609
  # @since 2.2.6
622
- def on_004(msg, events)
610
+ def on_004(msg, _events)
623
611
  detect_network(msg, "004")
624
612
  end
625
613
 
626
- def on_005(msg, events)
614
+ def on_005(msg, _events)
627
615
  # ISUPPORT
628
- @isupport.parse(*msg.params[1..-2].map {|v| v.split(" ")}.flatten)
616
+ @isupport.parse(*msg.params[1..-2].map { |v| v.split(" ") }.flatten)
629
617
  detect_network(msg, "005")
630
618
  end
631
619
 
632
620
  # @since 2.0.0
633
- def on_301(msg, events)
621
+ def on_301(msg, _events)
634
622
  # RPL_AWAY
635
623
  user = User(msg.params[1])
636
624
  away = msg.params.last
637
625
 
638
- if @whois_updates[user]
639
- update_whois(user, {:away => away})
640
- end
626
+ update_whois(user, { away: away }) if @whois_updates[user]
641
627
  end
642
628
 
643
629
  # @since 1.1.0
644
- def on_307(msg, events)
630
+ def on_307(msg, _events)
645
631
  # RPL_WHOISREGNICK
646
632
  user = User(msg.params[1])
647
- update_whois(user, {:registered => true})
633
+ update_whois(user, { registered: true })
648
634
  end
649
635
 
650
- def on_311(msg, events)
636
+ def on_311(msg, _events)
651
637
  # RPL_WHOISUSER
652
638
  user = User(msg.params[1])
653
639
  update_whois(user, {
654
- :user => msg.params[2],
655
- :host => msg.params[3],
656
- :realname => msg.params[5],
640
+ user: msg.params[2],
641
+ host: msg.params[3],
642
+ realname: msg.params[5],
657
643
  })
658
644
  end
659
645
 
660
- def on_313(msg, events)
646
+ def on_313(msg, _events)
661
647
  # RPL_WHOISOPERATOR
662
648
  user = User(msg.params[1])
663
- update_whois(user, {:oper? => true})
649
+ update_whois(user, { oper?: true })
664
650
  end
665
651
 
666
- def on_317(msg, events)
652
+ def on_317(msg, _events)
667
653
  # RPL_WHOISIDLE
668
654
  user = User(msg.params[1])
669
655
  update_whois(user, {
670
- :idle => msg.params[2].to_i,
671
- :signed_on_at => Time.at(msg.params[3].to_i),
656
+ idle: msg.params[2].to_i,
657
+ signed_on_at: Time.at(msg.params[3].to_i),
672
658
  })
673
659
  end
674
660
 
675
- def on_318(msg, events)
661
+ def on_318(msg, _events)
676
662
  # RPL_ENDOFWHOIS
677
663
  user = User(msg.params[1])
678
664
  user.end_of_whois(@whois_updates[user])
679
665
  @whois_updates.delete user
680
666
  end
681
667
 
682
- def on_319(msg, events)
668
+ def on_319(msg, _events)
683
669
  # RPL_WHOISCHANNELS
684
670
  user = User(msg.params[1])
685
- channels = msg.params[2].scan(/[#{@isupport["CHANTYPES"].join}][^ ]+/o).map {|c| Channel(c) }
686
- update_whois(user, {:channels => channels})
671
+ channels = msg.params[2].scan(/[#{@isupport["CHANTYPES"].join}][^ ]+/o).map { |c| Channel(c) }
672
+ update_whois(user, { channels: channels })
687
673
  end
688
674
 
689
- def on_324(msg, events)
675
+ def on_324(msg, _events)
690
676
  # RPL_CHANNELMODEIS
691
677
  modes = {}
692
678
  arguments = msg.params[3..-1]
693
679
 
694
680
  msg.params[2][1..-1].split("").each do |mode|
695
- if (@isupport["CHANMODES"]["B"] + @isupport["CHANMODES"]["C"]).include?(mode)
696
- modes[mode] = arguments.shift
697
- else
698
- modes[mode] = true
699
- end
681
+ modes[mode] = if (@isupport["CHANMODES"]["B"] + @isupport["CHANMODES"]["C"]).include?(mode)
682
+ arguments.shift
683
+ else
684
+ true
685
+ end
700
686
  end
701
687
 
702
688
  msg.channel.sync(:modes, modes, false)
703
689
  end
704
690
 
705
- def on_330(msg, events)
691
+ def on_330(msg, _events)
706
692
  # RPL_WHOISACCOUNT
707
693
  user = User(msg.params[1])
708
694
  authname = msg.params[2]
709
- update_whois(user, {:authname => authname})
695
+ update_whois(user, { authname: authname })
710
696
  end
711
697
 
712
- def on_331(msg, events)
698
+ def on_331(msg, _events)
713
699
  # RPL_NOTOPIC
714
700
  msg.channel.sync(:topic, "")
715
701
  end
716
702
 
717
- def on_332(msg, events)
703
+ def on_332(msg, _events)
718
704
  # RPL_TOPIC
719
705
  msg.channel.sync(:topic, msg.params[2])
720
706
  end
721
707
 
722
- def on_352(msg, events)
708
+ def on_352(msg, _events)
723
709
  # RPL_WHOREPLY
724
710
  # "<channel> <user> <host> <server> <nick> <H|G>[*][@|+] :<hopcount> <real name>"
725
711
  _, channel, user, host, _, nick, _, hopsrealname = msg.params
@@ -731,7 +717,7 @@ module Cinch
731
717
  user_object.sync(:realname, realname, true)
732
718
  end
733
719
 
734
- def on_354(msg, events)
720
+ def on_354(msg, _events)
735
721
  # RPL_WHOSPCRPL
736
722
  # We are using the following format: %acfhnru
737
723
 
@@ -750,41 +736,37 @@ module Cinch
750
736
  user_object.sync(:authname, account == "0" ? nil : account, true)
751
737
  end
752
738
 
753
- def on_353(msg, events)
739
+ def on_353(msg, _events)
754
740
  # RPL_NAMEREPLY
755
- unless @in_lists.include?(:names)
756
- msg.channel.clear_users
757
- end
741
+ msg.channel.clear_users unless @in_lists.include?(:names)
758
742
  @in_lists << :names
759
743
 
760
744
  msg.params[3].split(" ").each do |user|
761
745
  m = user.match(/^([#{@isupport["PREFIX"].values.join}]+)/)
762
746
  if m
763
- prefixes = m[1].split("").map {|s| @isupport["PREFIX"].key(s)}
764
- nick = user[prefixes.size..-1]
747
+ prefixes = m[1].split("").map { |s| @isupport["PREFIX"].key(s) }
748
+ nick = user[prefixes.size..-1]
765
749
  else
766
- nick = user
750
+ nick = user
767
751
  prefixes = []
768
752
  end
769
- user = User(nick)
753
+ user = User(nick)
770
754
  user.online = true
771
755
  msg.channel.add_user(user, prefixes)
772
756
  user.channels_unsynced << msg.channel unless user.channels_unsynced.include?(msg.channel)
773
757
  end
774
758
  end
775
759
 
776
- def on_366(msg, events)
760
+ def on_366(msg, _events)
777
761
  # RPL_ENDOFNAMES
778
762
  @in_lists.delete :names
779
763
  msg.channel.mark_as_synced(:users)
780
764
  end
781
765
 
782
766
  # @version 2.0.0
783
- def on_367(msg, events)
767
+ def on_367(msg, _events)
784
768
  # RPL_BANLIST
785
- unless @in_lists.include?(:bans)
786
- msg.channel.bans_unsynced.clear
787
- end
769
+ msg.channel.bans_unsynced.clear unless @in_lists.include?(:bans)
788
770
  @in_lists << :bans
789
771
 
790
772
  mask = msg.params[2]
@@ -794,18 +776,14 @@ module Cinch
794
776
  mask = "%s!%s@%s" % [mask, mask, mask + ".irc.justin.tv"]
795
777
  end
796
778
 
797
- if msg.params[3]
798
- by = User(msg.params[3].split("!").first)
799
- else
800
- by = nil
801
- end
779
+ by = (User(msg.params[3].split("!").first) if msg.params[3])
802
780
 
803
781
  at = Time.at(msg.params[4].to_i)
804
782
  ban = Ban.new(mask, by, at)
805
783
  msg.channel.bans_unsynced << ban
806
784
  end
807
785
 
808
- def on_368(msg, events)
786
+ def on_368(msg, _events)
809
787
  # RPL_ENDOFBANLIST
810
788
  if @in_lists.include?(:bans)
811
789
  @in_lists.delete :bans
@@ -817,64 +795,62 @@ module Cinch
817
795
  msg.channel.mark_as_synced(:bans)
818
796
  end
819
797
 
820
- def on_386(msg, events)
798
+ def on_386(msg, _events)
821
799
  # RPL_QLIST
822
- unless @in_lists.include?(:owners)
823
- msg.channel.owners_unsynced.clear
824
- end
800
+ msg.channel.owners_unsynced.clear unless @in_lists.include?(:owners)
825
801
  @in_lists << :owners
826
802
 
827
803
  owner = User(msg.params[2])
828
804
  msg.channel.owners_unsynced << owner
829
805
  end
830
806
 
831
- def on_387(msg, events)
807
+ def on_387(msg, _events)
832
808
  # RPL_ENDOFQLIST
833
809
  if @in_lists.include?(:owners)
834
810
  @in_lists.delete :owners
835
811
  else
836
- #we never received an owner, yet an end of list -> no owners
812
+ # we never received an owner, yet an end of list -> no owners
837
813
  msg.channel.owners_unsynced.clear
838
814
  end
839
815
 
840
816
  msg.channel.mark_as_synced(:owners)
841
817
  end
842
818
 
843
- def on_396(msg, events)
819
+ def on_396(msg, _events)
844
820
  # RPL_HOSTHIDDEN
845
821
  # note: designed for freenode
846
822
  User(msg.params[0]).sync(:host, msg.params[1], true)
847
823
  end
848
824
 
849
- def on_401(msg, events)
825
+ def on_401(msg, _events)
850
826
  # ERR_NOSUCHNICK
851
827
  if user = @bot.user_list.find(msg.params[1])
852
- update_whois(user, {:unknown? => true})
828
+ update_whois(user, { unknown?: true })
853
829
  end
854
830
  end
855
831
 
856
- def on_402(msg, events)
832
+ def on_402(msg, _events)
857
833
  # ERR_NOSUCHSERVER
858
834
 
859
835
  if user = @bot.user_list.find(msg.params[1]) # not _ensured, we only want a user that already exists
860
- user.end_of_whois({:unknown? => true})
836
+ user.end_of_whois({ unknown?: true })
861
837
  @whois_updates.delete user
862
- # TODO freenode specific, test on other IRCd
838
+ # TODO: freenode specific, test on other IRCd
863
839
  end
864
840
  end
865
841
 
866
- def on_433(msg, events)
842
+ def on_433(msg, _events)
867
843
  # ERR_NICKNAMEINUSE
868
844
  @bot.nick = @bot.generate_next_nick!(msg.params[1])
869
845
  end
870
846
 
871
- def on_671(msg, events)
847
+ def on_671(msg, _events)
872
848
  user = User(msg.params[1])
873
- update_whois(user, {:secure? => true})
849
+ update_whois(user, { secure?: true })
874
850
  end
875
851
 
876
852
  # @since 2.0.0
877
- def on_730(msg, events)
853
+ def on_730(msg, _events)
878
854
  # RPL_MONONLINE
879
855
  msg.params.last.split(",").each do |mask|
880
856
  user = User(Mask.new(mask).nick)
@@ -884,7 +860,7 @@ module Cinch
884
860
  end
885
861
 
886
862
  # @since 2.0.0
887
- def on_731(msg, events)
863
+ def on_731(msg, _events)
888
864
  # RPL_MONOFFLINE
889
865
  msg.params.last.split(",").each do |nick|
890
866
  user = User(nick)
@@ -894,28 +870,28 @@ module Cinch
894
870
  end
895
871
 
896
872
  # @since 2.0.0
897
- def on_734(msg, events)
873
+ def on_734(msg, _events)
898
874
  # ERR_MONLISTFULL
899
875
  user = User(msg.params[2])
900
876
  user.monitored = false
901
877
  end
902
878
 
903
879
  # @since 2.0.0
904
- def on_903(msg, events)
880
+ def on_903(_msg, _events)
905
881
  # SASL authentication successful
906
882
  @bot.loggers.info "[SASL] SASL authentication with #{@sasl_current_method.mechanism_name} successful"
907
883
  send_cap_end
908
884
  end
909
885
 
910
886
  # @since 2.0.0
911
- def on_904(msg, events)
887
+ def on_904(_msg, _events)
912
888
  # SASL authentication failed
913
889
  @bot.loggers.info "[SASL] SASL authentication with #{@sasl_current_method.mechanism_name} failed"
914
890
  send_sasl
915
891
  end
916
892
 
917
893
  # @since 2.0.0
918
- def on_authenticate(msg, events)
894
+ def on_authenticate(msg, _events)
919
895
  send "AUTHENTICATE " + @sasl_current_method.generate(@bot.config.sasl.username,
920
896
  @bot.config.sasl.password,
921
897
  msg.params.last)