In some situations a PRIVMSG could be output twice in sequence with no
intervening newline when using the Socket#puts function. Use syswrite to
skip Ruby's buffered IO.
if @sock.nil?
error "SEND attempted on closed socket"
else
- @sock.puts(@filter.out(message))
+ # we use Socket#syswrite() instead of Socket#puts() because
+ # the latter is racy and can cause double message output in
+ # some circumstances
+ actual = @filter.out(message) + "\n"
+ @sock.syswrite actual
@last_send = Time.new
@flood_send += message.irc_send_penalty if penalty
@lines_sent += 1