Module: IRCSupport::Modes
- Defined in:
- lib/ircsupport/modes.rb
Class Method Summary collapse
-
.condense_modes(modes) ⇒ Strings
Condense mode string by removing duplicates.
-
.diff_modes(before, after) ⇒ String
Calculate the difference between two mode strings.
-
.parse_channel_modes(modeparts, opts = {}) ⇒ Array
Parse channel mode changes.
-
.parse_modes(modes) ⇒ Array
Parse mode changes.
Class Method Details
.condense_modes(modes) ⇒ Strings
Condense mode string by removing duplicates.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/ircsupport/modes.rb', line 75 def condense_modes(modes) action = nil result = '' modes.split(//).each do |mode| if mode =~ /[+-]/ and (!action or mode != action) result += mode action = mode next end result += mode if mode =~ /[^+-]/ end result.sub!(/[+-]\z/, '') return result end |
.diff_modes(before, after) ⇒ String
Calculate the difference between two mode strings.
95 96 97 98 99 100 101 102 103 |
# File 'lib/ircsupport/modes.rb', line 95 def diff_modes(before, after) before_modes = before.split(//) after_modes = after.split(//) removed = before_modes - after_modes added = after_modes - before_modes result = removed.map { |m| '-' + m }.join result << added.map { |m| '+' + m }.join return condense_modes(result) end |
.parse_channel_modes(modeparts, opts = {}) ⇒ Array
Parse channel mode changes.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/ircsupport/modes.rb', line 33 def parse_channel_modes(modeparts, opts = {}) chanmodes = opts[:chanmodes] || { 'A' => %w{b e I}, 'B' => %w{k}, 'C' => %w{l}, 'D' => %w{i m n p s t a q r}, } statmodes = opts[:statmodes] || %w{o h v} mode_changes = [] modes, *args = modeparts parse_modes(modes).each do |mode_change| set, mode = mode_change[:set], mode_change[:mode] case when chanmodes["A"].include?(mode) || chanmodes["B"].include?(mode) mode_changes << { mode: mode, set: set, argument: args.shift } when chanmodes["C"].include?(mode) mode_changes << { mode: mode, set: set, argument: args.shift.to_i } when chanmodes["D"].include?(mode) mode_changes << { mode: mode, set: set, } else raise ArgumentError, "Unknown mode: #{mode}" end end return mode_changes end |
.parse_modes(modes) ⇒ Array
Parse mode changes.
11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/ircsupport/modes.rb', line 11 def parse_modes(modes) mode_changes = [] modes.scan(/[-+]\w+/).each do |modegroup| set, modegroup = modegroup.split '', 2 set = set == '+' ? true : false modegroup.split('').each do |mode| mode_changes << { set: set, mode: mode } end end return mode_changes end |