set KAOSChannel         "#Lombok"
set KAOSPointsName      "Points"
set KAOSPointsPerAnswer 5
set KAOSQuestionTime    60
set KAOSMarker          "*"
set KAOSAskedFile       "eggdrop/scripts/kaos.asked"
set KAOSQuestionFile    "eggdrop/scripts/kaos.db"
set KAOSCFGFile         "eggdrop/scripts/kaos.cfg"

# Channel Triggers
bind pub - !start KAOS_Start
bind pub m !stop KAOS_stop


# Global Variables
set KAOSRunning 0
set KAOSAllAnswered 0
set KAOSRoundOver 0
set KAOSQNumber 0
set KAOSQuestion ""
set KAOSQuestions(0) ""
set KAOSAsked ""
set KAOSQCount 0
set KAOSAnswerCount 0
set KAOSDisplayNum 0
set KAOSNumAnswered 0
set KAOSForced 0
set KAOSForcedQuestion ""
set KAOSAutoStart 0
set KAOStimeanswer 1



# Scores And Ads
set KAOSAdNumber 0
set KAOSAd(0) "$botnick"
set KAOSAd(1) "$botnick"
set KAOSAd(2) "$botnick"

# Timers
set KAOSAdTimer ""
set KAOSQuestionTimer ""

# Version
set KDebug 0
set KAOSVersion "2.3.4"

#
# Start KAOS
#
proc KAOS_Start {nick uhost hand chan args} {
 global KAOSChannel KAOSRunning KAOSQCount KAOSQNumber KAOSQuestionFile KAOSAdNumber KAOSVersion KDebug CountAnswer CountNoAnswer

 if {($chan != $KAOSChannel)||($KAOSRunning != 0)} {return}

 set KAOSQCount 0
 set KAOSAdNumber 0
 KAOS_ReadCFG

 if {![file exist $KAOSQuestionFile]} {
   putcmdlog "\[KAOS\] Question File: $KAOSQuestionFile Unreadable Or Does Not Exist"
   return 0
 }

 set KAOSQCount [KAOS_ReadQuestionFile]

 if {$KAOSQCount < 2} {
   putcmdlog "\[KAOS\] Not Enough Questions in Question File $KAOSQuestionFile"
   return 0
 }

 set KAOSAskedFileLen [KAOS_ReadAskedFile]

 if {$KAOSAskedFileLen >= $KAOSQCount} {
#   kaosmsg "All Questions Asked: Resetting \003"
   KAOS_ResetAsked
   return 0
 }

 set KAOSRunning 1


 bind pubm - "*" KAOSCheckGuess

 KAOSAskQuestion

 return 1
}


# stop KAOS
proc KAOS_stop {nick uhost hand chan args} {
 global KAOSChannel KAOSRunning KAOSQuestionTimer KAOSAdTimer
 global botnick quizconf
 global rankfile uptime botnick

 if {($chan != $KAOSChannel)||($KAOSRunning != 1)} {return}

 set KAOSRunning 0

 catch {killutimer $KAOSQuestionTimer}
 catch {killutimer $KAOSAdTimer}

 catch {unbind pubm - "*" KAOSCheckGuess}

 kaosmsg "\00306Skipping to next question by \00302$nick's\00306 request..."
 tmcquiz_ask $botnick {} {} $quizconf(quizchannel) {}
 return 1
}


# Pick Question
proc KAOSPickQuestion {} {
 global KAOSAsked KAOSQCount KDebug
 set KAOSUnasked [expr ($KAOSQCount - [llength $KAOSAsked])]
 if {$KAOSUnasked < 1} {
#   kaosmsg "[kaos] [kcr] All Questions Asked: Resetting \003"
   KAOS_ResetAsked
 }
 set pickdone 0
 while {$pickdone == 0} {
  set kidx 0
  set foundinasked 0
  set pick [rand $KAOSQCount]
  while {[lindex $KAOSAsked $kidx] != ""} {
    if {[lindex $KAOSAsked $kidx] == $pick} {
     set foundinasked 1
     # kaoslog "KAOS" "Found Pick:$pick in Asked"
     break
    }
    incr kidx
  }
  if {$foundinasked == 0} {incr pickdone}
 }
 # kaoslog "KAOS" "Picked Question:$pick"
 KAOS_AddAsked $pick
 return $pick
}


# Parse Question
proc KAOSParseQuestion {QNum} {
 global KAOSMarker KAOSQuestions KAOSQuestion KAOSAnswers KAOSAnswerCount KAOSForcedQuestion KDebug

  set KAnswersLeft ""

  if {$QNum < 0} {
   set KAOSFileQuestion $KAOSForcedQuestion
  } {
   set KAOSFileQuestion $KAOSQuestions($QNum)
  }

  if {$KDebug > 1} {kaoslog "kaos" "Picked:$QNum Question:$KAOSFileQuestion"}

  if [info exists KAOSAnswers] {unset KAOSAnswers}

  # Position of first "*"

  set KAOSMarkerIDX [string first $KAOSMarker $KAOSFileQuestion]

  if {$KAOSMarkerIDX < 1} {
   kaoslog "KAOS" "Malformed Question #$QNum"
  }

  set KAOSQuestionEndIDX [expr $KAOSMarkerIDX - 1]

  set KAOSQuestion [string range $KAOSFileQuestion 0 $KAOSQuestionEndIDX]

  # Move to first character in answers
  incr KAOSMarkerIDX
  set KAnswersLeft [string range $KAOSFileQuestion $KAOSMarkerIDX end]

  set KDoneParsing 0
  set KAOSAnswerCount 0

  # Parse all answers

  while {$KDoneParsing != 1 } {
   set KAnswerEnd [string first $KAOSMarker $KAnswersLeft]

   if {$KAnswerEnd < 1} {
    set KDoneParsing 1
    set KAnswerEnd [string length $KAnswersLeft]
   }

   set KAnswer [string range $KAnswersLeft 0 [expr $KAnswerEnd -1]]

   set KAOSAnswers($KAOSAnswerCount) "# $KAnswer"

   set KAOSMarkerIDX [expr $KAnswerEnd +1]

   set KAnswersLeft [string range $KAnswersLeft $KAOSMarkerIDX end]
   incr KAOSAnswerCount
  }
}


# Ask Question
proc KAOSAskQuestion {} {
 global KAOSRunning KAOSQNumber KAOSAllAnswered KAOSRoundOver KAOSQuestion KAOSQCount
 global KAOSPointsPerAnswer KAOSPointsName KAOSNumAnswered KAOSAnswerCount
 global KAOSQuestionTimer KAOSQuestionTime KAOSDisplayNum KAOSForced KAOSLastGuesser
 global tipno tiplist TipsToUse InfoItem KAOStimestart KAOStimeanswer

 if {$KAOSRunning != 1} {return}

 # Get The Current Scores

 # Pick Next Question

 if {$KAOSForced == 1} {
  KAOSParseQuestion -1
  set KAOSQNumber 0
  set KAOSForced 0
  set KAOSForcedQuestion ""
 } {
  set KAOSQNumber [KAOSPickQuestion]
  KAOSParseQuestion $KAOSQNumber
 }

 set KAOSAllAnswered 0
 set KAOSLastGuesser ""
 set KAOSDisplayNum 0
 set KAOSNumAnswered 0
 set KAOSRoundOver 0

 # Choose Points Value For This Round
 set KAOSPointsPerAnswer [rand 3]
 if {$KAOSPointsPerAnswer < 1} {set KAOSPointsPerAnswer 3}
 set KAOSPointsPerAnswer [expr $KAOSPointsPerAnswer *10]
 set KAOSBonus [expr $KAOSPointsPerAnswer *5]
 set KAOSPointTotal [expr $KAOSPointsPerAnswer *$KAOSAnswerCount]
 #set tipzs "[get_InfoItems]"
 if {$KAOStimeanswer==1} {
 set KAOStimestart [clock clicks -milliseconds]
 }

 if {$KAOSAnswerCount == 1} {
 kaosmsg ""
 kaosmsg ""
 kaosmsg ""
} elseif {$KAOSAnswerCount >= 2} {
 kaosmsg "\0030,2 :: Question No. $KAOSQNumber\/$KAOSQCount \00308\[\00311 ®Family Feud® \00308\] \0030maluku@DALnet ::..\003"
 kaosmsg "\002\037\0032Question\002\037: $KAOSQuestion \[\00306 $KAOSAnswerCount Jawaban \00302\]"
 kaosmsg "\0030,2 ::\00311 +$KAOSPointsPerAnswer \0030 $KAOSPointsName Untuk setiap jawaban - Total:\00311 $KAOSPointTotal\0030 $KAOSPointsName - Bonus:\00311 +$KAOSBonus\0030 $KAOSPointsName :: \037-= GudLuck =-\037 :: "
}
 set KRemain [expr int([expr $KAOSQuestionTime /2])]
 set KAOSQuestionTimer [utimer $KRemain "KAOSDisplayRemainingTime $KRemain"]
}


# Get Player Guess
proc KAOSCheckGuess {nick uhost hand chan args} {
 global KAOSChannel KAOSRunning KAOSAnswerCount KAOSAnswers KAOSRoundOver KAOStimeanswer
 global KAOSPointsName KAOSPointsPerAnswer KAOSNumAnswered KAOSAllAnswered KAOSLastGuesser KDebug
 global lastwinner lastwinnercount botnick userlist quizconf rankfile KAOStimestart KAOStimetoanswer

    variable bestscore 0 lastbestscore 0 lastbest ""
    variable userarray
    variable authorsolved 0 waitforrank 0 gameend 0

 if {($chan != $KAOSChannel)||($KAOSRunning != 1)||($KAOSRoundOver == 1)} {return}


    mx_getcreate_userentry $nick $nick
    array set userarray $userlist($nick)
#    set hostmask $userarray(mask)

            set lastbest [lindex [lsort -command mx_sortrank [array names userlist]] 0]
            if {$lastbest == ""} {
                set lastbestscore 0
            } else {
                array set aa $userlist($lastbest)
                set lastbestscore $aa(score)
            }

 regsub -all \[{',.!}] $args "" args

 if {[string length args] == 0} {return}

 set KAOSGuessOld $args
 set KAOSGuess [string tolower $KAOSGuessOld]

 if {$KDebug > 1} {kaoslog "KAOS" "Guess: $nick $KAOSGuess"}

 foreach z [array names KAOSAnswers] {
  set KAOSTry [lrange $KAOSAnswers($z) 1 end]
  set KAOSTryOld $KAOSTry

  regsub -all \[{',.!}] $KAOSTry "" KAOSTry

  set KAOSTry [string tolower $KAOSTry]
  if {$KDebug > 1} {kaoslog "KAOS" "Try: $KAOSTry"}
  if {$KAOSTry == $KAOSGuess} {
   if {[lindex $KAOSAnswers($z) 0] == "#"} {
    set KAOSAnswers($z) "$nick $KAOSGuessOld"
        set KAOStimetoanswer ""
        if {$KAOStimeanswer==1} {
                set KAOStimetoanswer [expr [expr [clock clicks -milliseconds]-$KAOStimestart]/1000.00]
        }
            incr userarray(score) $KAOSPointsPerAnswer
            if {$userarray(score) == 1} {
                set userarray(started) [unixtime]
            }
            set userlist($nick) [array get userarray]
    kaosmsg "\0032Jawaban Betul :\00302\[\00306 [expr $KAOSNumAnswered+1]. $KAOSTryOld \00302\] by \00306$nick \00302score:\00306 +$KAOSPointsPerAnswer \00302- less then \00306$KAOStimetoanswer \00302seconds - Total Score: \00306$userarray(score) \00302Points and Ranked: \00306[mx_get_rank_pos $nick]"
    pushmode $KAOSChannel +v $nick
    tmcquiz_rank_save {} {} {}
    incr KAOSNumAnswered
    if {$KAOSNumAnswered == $KAOSAnswerCount} {
     set KAOSAllAnswered 1
     set KAOSRoundOver 1
       if {$KAOSAnswerCount == 1} {
       set KAOSLastGuesser ""
#       set greeting "[get_grated]"
       kaosmsg ""
       KAOS_TriviaResults
       } elseif {$KAOSAnswerCount >= 2} {
       set KAOSLastGuesser $nick
       kaosmsg "\00306You've Guessed Them All, \00302Well Done!!!"
       KAOS_ShowResults
       }
     KAOS_Recycle
    }
    return
   }
  }
 }
}


# Display Remaining Time And Answer Stats
proc KAOSDisplayRemainingTime {remaining} {
 global KAOSRunning KAOSAllAnswered KAOSNumAnswered KAOSAnswerCount KAOSQuestionTimer KAOSQuestionTime KAOSDisplayNum
 global KAOSQuestion
 if {($KAOSRunning != 1)||($KAOSAllAnswered == 1)} {return}
   if {$KAOSAnswerCount == 1} {
   kaosmsg "\00306$remaining \00302secs remaining"
  } elseif {$KAOSAnswerCount >= 2} {
   kaosmsg "\00306$remaining \00302secs remaining"
  }

 incr KAOSDisplayNum

 set KRemain [expr int([expr $KAOSQuestionTime /4])]

 if {$KAOSDisplayNum < 2} {
  set KAOSQuestionTimer [utimer $KRemain "KAOSDisplayRemainingTime $KRemain"]
 } {
  set KAOSQuestionTimer [utimer $KRemain KAOSTimesUp]
 }
}


# Show Results Of Round
proc KAOSTimesUp {} {
 global KAOSAnswers KAOSAllAnswered KAOSRoundOver KAOSNumAnswered KAOSAnswerCount KAOSQuestionTimer KAOSAdTimer
 global botnick quizconf
 global CountNoAnswer CountAnswer AutoOff
 global rankfile uptime botnick
 global KAOSChannel KAOSRunning KAOSQuestionTimer KAOSAdTimer

 if {$KAOSAllAnswered == 1} { return 1}

 set KAOSRoundOver 1

 set kaosmissed "Time's Up! \003 "

 append KMissed "\00302Times Up. Sisa Jawaban (\00306[expr $KAOSAnswerCount - $KAOSNumAnswered]\00302): "
 set KAnswersRemaining [expr ($KAOSAnswerCount - $KAOSNumAnswered)]

 set kcount 0
 foreach z [array names KAOSAnswers] {
  if {[lindex $KAOSAnswers($z) 0] == "#"} {
   append KMissed "\00302\[\00306 [lrange $KAOSAnswers($z) 1 end] \00302\]"
 incr kcount
   if {$kcount < $KAnswersRemaining} {append KMissed " "}
  }
 }

 kaosmsg "$KMissed"

 KAOS_ShowResults

 if {$KAOSNumAnswered > 0} {
  kaosmsg "\0030,14 Total number answered correctly:\002 $KAOSNumAnswered\002 from a possible\002 $KAOSAnswerCount \002"
 } {
  kaosmsg "\00302Kita masuk ke soal Scramble.. Harap Siap"
 }

# tmcquiz_rank_save {} {} {}
# set KAOSAdTimer [utimer 10 KAOS_ShowAd]
# set KAOSQuestionTimer [utimer 5 KAOSAskQuestion]
 tmcquiz_ask $botnick {} {} $quizconf(quizchannel) {}

}


# All Answers Gotten, Next Question
proc KAOS_Recycle {} {
 global botnick quizconf
 global rankfile uptime botnick
 global KAOSAnswers KAOSNumAnswered KAOSQuestionTimer KAOSAdTimer
 catch {killutimer $KAOSQuestionTimer}
 if [info exists KAOSAnswers] {unset KAOSAnswers}
 set KAOSQuestion ""
 set KAOSNumAnswered 0
 tmcquiz_ask $botnick {} {} $quizconf(quizchannel) {}

}


# Total Answers and Points
proc KAOS_ShowResults {} {
 global KAOSAnswers KAOSPointsPerAnswer KAOSPointsName KAOSAllAnswered KAOSLastGuesser
 global botnick quizconf rankfile userlist lastwinner lastwinnercount

 if {$KAOSAllAnswered == 1} {
  set KAOSBonus [expr $KAOSPointsPerAnswer *5]
  set nick $KAOSLastGuesser
    mx_getcreate_userentry $nick $nick
    array set userarray $userlist($nick)
            set lastbest [lindex [lsort -command mx_sortrank [array names userlist]] 0]
            if {$lastbest == ""} {
                set lastbestscore 0
            } else {
                array set aa $userlist($lastbest)
                set lastbestscore $aa(score)
            }
            incr userarray(score) $KAOSBonus
            if {$userarray(score) == 1} {
                set userarray(started) [unixtime]
            }
            set userlist($nick) [array get userarray]
  kaosmsg "\0036 $KAOSLastGuesser \0032dapat BONUS \0036+$KAOSBonus pts \0032(Total Score:\0036 $userarray(score)\0032) (Rank:\0036 [mx_get_rank_pos $nick]\0032)"
  tmcquiz_rank_save {} {} {}
 }
}

proc KAOS_TriviaResults {} {
 global KAOSAnswers KAOSPointsPerAnswer KAOSPointsName KAOSAllAnswered KAOSLastGuesser
}


# Add Question Number To Asked File
proc KAOS_AddAsked {KQnum} {
 global KAOSAsked KAOSAskedFile
 set f [open $KAOSAskedFile a]
 puts $f $KQnum
 close $f
 lappend KAOSAsked $KQnum
}

#
# Parse Asked Questions
#
proc KAOS_ReadAskedFile {} {
 global KAOSAsked KAOSAskedFile
 set KAsked 0
 set KAOSAsked ""
 if {![file exists $KAOSAskedFile]} {
  set f [open $KAOSAskedFile w]
 } {
  set f [open $KAOSAskedFile r]
  while {[gets $f KQnum] != -1} {
   lappend KAOSAsked "$KQnum"
   incr KAsked
  }
 }
 close $f
 return $KAsked
}

#
# Reset Asked File
#
proc KAOS_ResetAsked {} {
 global KAOSAskedFile KAOSAsked
 set f [open $KAOSAskedFile w]
 puts $f "0"
 close $f
 set KAOSAsked ""
}

#
# Read Question File
#
proc KAOS_ReadQuestionFile {} {
 global KAOSQuestionFile KAOSQuestions
 set KQuestions 0
 set f [open $KAOSQuestionFile r]
 while {[gets $f q] != -1} {
  set KAOSQuestions($KQuestions) $q
  incr KQuestions
 }
 close $f
 return $KQuestions
}


# Show Asked
proc KAOS_ShowAsked {nick uhost hand chan args} {
 global KAOSQCount KAOSAsked KAOSQuestions
 set KAOSStatsAsked [llength $KAOSAsked]
 set KAOSStatsUnasked [expr ($KAOSQCount - $KAOSStatsAsked)]
 kaosmsg "Total: $KAOSQCount Asked: $KAOSStatsAsked Remaining: $KAOSStatsUnasked \003"
}


#
# Last Month's Top 3
#
proc KAOSLastMonthTop3 {nick uhost hand chan args} {
 global KAOSChannel KAOSLastMonthScores
 if {$chan != $KAOSChannel} {return}
 if [info exists KAOSLastMonthScores] {
  set KWinners "[kcm] Last Month's KAOS Top 3 "
  for { set s 0} { $s < 3 } { incr s} {
   append KWinners "[kcm] #[expr $s +1] [kcc] $KAOSLastMonthScores($s) "
  }
  kaosmsg "$KWinners"
 }
}


# Read Config File
proc KAOS_ReadCFG {} {
 global KAOSCFGFile KAOSChannel KAOSAutoStart KAOSAskedFile KAOSQuestionFile KAOSPointsName KAOSAd
 if {[file exist $KAOSCFGFile]} {
  set f [open $KAOSCFGFile r]
  while {[gets $f s] != -1} {
   set kkey [string tolower [lindex [split $s "="] 0]]
   set kval [lindex [split $s "="] 1]
   switch $kkey {
    points { set KAOSPointsName $kval }
    channel { set KAOSChannel $kval }
    autostart { set KAOSAutoStart $kval }
    askedfile { set KAOSAskedFile $kval }
    kaosfile { set KAOSQuestionFile $kval }
    ad1 { set KAOSAd(0) $kval }
    ad2 { set KAOSAd(1) $kval }
    ad3 { set KAOSAd(2) $kval }
   }
  }
  close $f
  if {($KAOSAutoStart < 0)||($KAOSAutoStart > 1)} {set KAOSAutoStart 1}
  return
 }
 kaoslog "KAOS" "Config file $KAOSCFGFile not found... using defaults"
}


# Write Config File
proc KAOS_WriteCFG {} {
 global KAOSCFGFile KAOSChannel KAOSAutoStart KAOSAskedFile KAOSQuestionFile KAOSPointsName KAOSAd
 set f [open $KAOSCFGFile w]
 puts $f "# This file is automatically overwritten"
 puts $f "Points=$KAOSPointsName"
 puts $f "Channel=$KAOSChannel"
 puts $f "AutoStart=$KAOSAutoStart"
 puts $f "AskedFile=$KAOSAskedFile"
 puts $f "KAOSFile=$KAOSQuestionFile"
 puts $f "Ad1=$KAOSAd(0)"
 puts $f "Ad2=$KAOSAd(1)"
 puts $f "Ad3=$KAOSAd(2)"
 close $f
}

# Channel Message
proc kaosmsg {what} {
 global KAOSChannel
 putquick "PRIVMSG $KAOSChannel :$what"
}


# Command Log
proc kaoslog {who what} {
 putcmdlog "\[$who\] $what"
}



# Rehash KAOS Config
proc dcc_kaosrehash {hand idx arg} {
 global KAOSQCount

 putcmdlog "#$hand# Rehashing KAOS config"

 KAOS_ReadCFG

 set KAOSQCount [KAOS_ReadQuestionFile]

 if {$KAOSQCount < 2} {
   kaoslog "KAOS" "Not Enough Questions in Question File $KAOSQuestionFile"
   return 0
 }

 set KAOSAskedFileLen [KAOS_ReadAskedFile]

 if {$KAOSAskedFileLen >= $KAOSQCount} {
   kaoslog "KAOS" "Asked file out of sync with question database: resetting"
   KAOS_ResetAsked
   return 0
 }
 kaoslog "KAOS" "Questions:$KAOSQCount Asked:$KAOSAskedFileLen Remaining:[expr ($KAOSQCount - $KAOSAskedFileLen)]"
}


KAOS_ReadCFG


putlog "Family Feud maluku DALnet Succesfully LoaDeD..."


