set if [open fortune.lst r]
set State(jokelist) [read $if]
close $if

set State(listLen) [llength $State(jokelist)]
set State(channels) {}

set sock [socket -server openProc 54321]

proc openProc {channel addr port} {
  global State
  lappend State(channels) $channel
  fileevent $channel readable "readLine $channel"
}

proc removeChannel {ch} {
  global State
  set pos [lsearch $State(channels) $ch]
  puts "Closing $ch at $pos"
  close $ch
  set State(channels) [lreplace $State(channels) $pos $pos]
}
proc readLine {ch} {
  set charCount [gets $ch line]
  if {($charCount < 0) && [eof $ch]} {
    removeChannel $ch
  }
  puts "Read: $line"
}

proc broadcast {} {
  global State
puts "broadcast: Chans: $State(channels)"
  
  set badChannels {}
  set jokenum [expr {int(rand()*$State(listLen))}]
  set joke [lindex $State(jokelist) $jokenum]
  foreach ch $State(channels) {
    if {[catch {puts $ch $joke}]} {
      lappend badChannels $ch
    } else {
      flush $ch
    }
  }
  
  foreach ch $badChannels {
    removeChannel $ch
  }
puts "Schedule After"
  after 10000 broadcast
}

broadcast
vwait sock

