},
:desc => "String used to replace newlines when send.newlines is set to join")
BotConfig.register BotConfigIntegerValue.new('send.max_lines',
- :default => 0,
+ :default => 5,
:validate => Proc.new { |v| v >= 0 },
:on_change => Proc.new { |bot, v|
bot.set_default_send_options :max_lines => v
nickchg new
# If we're setting our nick at connection because our choice was taken,
# we have to fix our nick manually, because there will be no NICK message
- # yo inform us that our nick has been changed.
+ # to inform us that our nick has been changed.
if data[:target] == '*'
debug "setting my connection nick to #{new}"
nick = new
end
end
- message = original_message.to_s.gsub(/[\r\n]+/, "\n")
+ multi_line = original_message.to_s.gsub(/[\r\n]+/, "\n")
+ messages = Array.new
case opts[:newlines]
when :join
- lines = [message.gsub("\n", opts[:join_with])]
+ messages << [multi_line.gsub("\n", opts[:join_with])]
when :split
- lines = Array.new
- message.each_line { |line|
+ multi_line.each_line { |line|
line.chomp!
next unless(line.size > 0)
- lines << line
+ messages << line
}
else
raise "Unknown :newlines option #{opts[:newlines]} while sending #{original_message.inspect}"
# And this is what's left
left = max_len - fixed.size
- case opts[:overlong]
- when :split
- truncate = false
- split_at = opts[:split_at]
- when :truncate
- truncate = opts[:truncate_text]
- truncate = @default_send_options[:truncate_text] if truncate.size > left
- truncate = "" if truncate.size > left
+ truncate = opts[:truncate_text]
+ truncate = @default_send_options[:truncate_text] if truncate.size > left
+ truncate = "" if truncate.size > left
+
+ all_lines = messages.map { |line|
+ if line.size < left
+ line
+ else
+ case opts[:overlong]
+ when :split
+ msg = line.dup
+ sub_lines = Array.new
+ begin
+ sub_lines << msg.slice!(0, left)
+ break if msg.empty?
+ lastspace = sub_lines.last.rindex(opts[:split_at])
+ if lastspace
+ msg.replace sub_lines.last.slice!(lastspace, sub_lines.last.size) + msg
+ msg.gsub!(/^#{opts[:split_at]}/, "") if opts[:purge_split]
+ end
+ end until msg.empty?
+ sub_lines
+ when :truncate
+ line.slice(0, left - truncate.size) << truncate
+ else
+ raise "Unknown :overlong option #{opts[:overlong]} while sending #{original_message.inspect}"
+ end
+ end
+ }.flatten
+
+ if opts[:max_lines] > 0 and all_lines.length > opts[:max_lines]
+ lines = all_lines[0...opts[:max_lines]]
+ new_last = lines.last.slice(0, left - truncate.size) << truncate
+ lines.last.replace(new_last)
else
- raise "Unknown :overlong option #{opts[:overlong]} while sending #{original_message.inspect}"
+ lines = all_lines
end
- # Counter to check the number of lines sent by this command
- cmd_lines = 0
- max_lines = opts[:max_lines]
- maxed = false
- line = String.new
- lines.each { |msg|
- begin
- if max_lines > 0 and cmd_lines == max_lines - 1
- truncate = opts[:truncate_text]
- truncate = @default_send_options[:truncate_text] if truncate.size > left
- truncate = "" if truncate.size > left
- maxed = true
- end
- if(left >= msg.size) and not maxed
- sendq "#{fixed}#{msg}", chan, ring
- log_sent(type, where, msg)
- cmd_lines += 1
- break
- end
- if truncate
- line.replace msg.slice(0, left-truncate.size)
- # line.sub!(/\s+\S*$/, truncate)
- line << truncate
- raise "PROGRAMMER ERROR! #{line.inspect} of size #{line.size} > #{left}" if line.size > left
- sendq "#{fixed}#{line}", chan, ring
- log_sent(type, where, line)
- return
- end
- line.replace msg.slice!(0, left)
- lastspace = line.rindex(opts[:split_at])
- if(lastspace)
- msg.replace line.slice!(lastspace, line.size) + msg
- msg.gsub!(/^#{opts[:split_at]}/, "") if opts[:purge_split]
- end
- sendq "#{fixed}#{line}", chan, ring
- log_sent(type, where, line)
- cmd_lines += 1
- end while(msg.size > 0)
+ lines.each { |line|
+ sendq "#{fixed}#{line}", chan, ring
+ log_sent(type, where, line)
}
end