Here's a nice ugly solution for you, it waits 3 seconds after the last join to send the message.

Code:
on *:join:#<3:{ 
  if ($nick == $me) { msg # Have no fear Ike_Bot is here. }
  elseif ($me isop #) && (%welcome) {
    set -e %welcome.nicks [ $+ [ # ] ] $addtok(%welcome.nicks [ $+ [ # ] ],$nick,32)
    var %msg = Hey everyone $list(%welcome.nicks [ $+ [ # ] ]) $iif($numtok(%welcome.nicks [ $+ [ # ] ],32) > 1,have,has) joined the stream.
    .timer.welcome [ $+ [ # ] ] 1 3 msg $safe(#) %msg $(|,0) unset %welcome.nicks [ $+ [ # ] ]
  }
}

alias -l list {
  tokenize 32 $1
  var %items = $1-, %list = %items
  if ($0 > 2) {
    %list = $regsubex(%items,/(\x20)/g,$iif(\n == \0,$chr(44) and $chr(32),$chr(44) $chr(32)))
  }
  elseif ($0 > 1) {
    %list = $1 and $2
  }

  return %list
}

alias safe return $!decode( $encode($1,m) ,m)