#!/usr/bin/tcl

set waitver 0
source "config.conf"
source "extension.tcl"

puts ""
if {$server == ""} { 
  puts "No server specified"
  exit
}
if {$port == ""} {
  puts "No port specified"
  exit
}
if {$nick == ""} {
  puts "No nick specified"
  exit
}
if {$username == ""} {
  puts "No username specified"
  exit
}
if {$realname == ""} {
  puts "No realname specified"
  exit
}
if {$channel == ""} {
  puts "No channel specified"
  exit
}
if {$master == ""} {
  puts "No master specified"
  exit
}
if {$password == ""} {
  puts "No password specified"
}
set buffer ""
set pong ""
set nick_nick ""
set activate "no"
set master_host ""
set ping_list ""
set temp ""
set counter 0
set start_seconds ""
set proceed ""
set connected 0
set serverUp 0
set iconnected 0

proc get_nick { buffer } {
  global nick_nick
  set nick_end [string first ! $buffer]
  set nick_nick [string range $buffer 1 [expr $nick_end-1] ]
}
proc trigger_match { buf trig chan } {
  if {[string tolower [lrange $buf 1 [expr 2+[llength $trig]]]]==[string tolower "PRIVMSG $chan :$trig"]} { 
    set return 1 
  } else {
    set return 0
  }
}
proc msg_bot { buf bot msg } {
  set buf [string tolower $buf]
  set bot [string tolower $bot]
  set msg [string tolower $msg]
  if {[lrange $buf 1 [expr 2+[llength $msg]]]=="privmsg $bot :$msg"} {
    set return 1
  } else { 
    set return 0
  }
  set return $return
}
proc on_join { buffer channel } {
  if {[lrange $buffer 1 2]=="JOIN :$channel"} {
    set return 1
  } else {
    set return 0
  }
}
proc on_op { buffer channel nick } {
  if {[string tolower [lrange $buffer 1 4]]==[string tolower "MODE $channel +o $nick"]} {
    set return 1
  } else {
    set return 0
  }
}
proc on_deop { buffer channel nick } {
  if {[string tolower [lrange $buffer 1 4]]==[string tolower "MODE $channel -o $nick"]} {
    set return 1
  } else {
    set return 0
  }
}
proc on_voice { buffer channel nick } {
  if {[string tolower [lrange $buffer 1 4]]==[string tolower "MODE $channel +v $nick"]} {
    set return 1
  } else {
    set return 0
  }
}
proc on_devoice { buffer channel nick } {
  if {[string tolower [lrange $buffer 1 4]]==[string tolower "MODE $channel -v $nick"]} {
    set return 1
  } else {
    set return 0
  }
}
proc on_kick { buffer channel nick } {
  if {[string tolower [lrange $buffer 1 3]]==[string tolower "KICK $channel $nick"]} {
    set return 1
  } else {
    set return 0
  }
}
proc connection { sock } {
  global buffer scripts master password activate pong nick channel nick_nick ping_list iconnected

  if [catch { eof $sock } ieof] {
    puts "EOF while reading from IRC Server!"
    catch { close $sock }
    set after(connecti) [after 30000 iconnect]
    set iconnected 0
    return
  }

   if $ieof {
     puts "IRC Server dropped the connection"
     catch { close $sock }
     set after(connecti) [after 30000 iconnect]
     set iconnected 0
     return
   } else {
     if [catch {gets $sock} buffer] {
       puts "Error reading from IRC Server!"
       catch { close $sock }
       set after(connecti) [after 30000 iconnect]
       set iconnected 0
       return
     }
   }

  if {$pong==""} {
    catch {if {[lindex $buffer 0]=="PING"} { 
      set pong [lindex $buffer 1]
      puts $sock "PONG $pong"
      puts "PONG $pong"
    }
   }
  }
  catch {if {[lindex $buffer 0]=="PING"} { 
      puts $sock "PONG $pong"
      puts "PONG $pong"
  }
  }
  if {[string match "*End of /MOTD command*" $buffer]==1 || [string match "*MODE $nick*" $buffer]==1} {
    foreach chan $channel {
      puts $sock "JOIN $chan"
    }
  }
  puts $buffer
  for {set i 0} {$i < [llength $scripts]} {incr i} {
    source [lindex $scripts $i]
  }
}
set fd [open "cs-chatbot.pid" w]
puts $fd [pid]
close $fd

proc iconnect {} {
  global server port username realname nick Sock iconnected

  if !$iconnected {
    set Sock [socket $server $port]
    fileevent $Sock readable [list connection $Sock]
    fconfigure $Sock -buffering line
    puts $Sock "USER $username +iw $username :$realname"
    puts $Sock "NICK $nick"
#    set iconnected 1 #irgendwie gehts dann gar nich wenn das drin is :)
  }
}

iconnect
vwait waitvar
