here is the script:
Code: Select all
# ^-- don't remove this line
# ___ _ ____ _
# / _ \ _ _ ___ | |_ ___| __ ) ___ | |_
# | | | | | | |/ _ \| __/ _ \ _ \ / _ \| __|
# | |_| | |_| | (_) | || __/ |_) | (_) | |_
# \__\_\\__,_|\___/ \__\___|____/ \___/ \__|
# 2.0 by Baerchen, August 2001
# for eggdrop 1.4.x+ & TCL 8.3.3
# baerchen@germany-chat.net
#
# Please report bugs. Thanks.
#
# CONFIGURATION
#
# qb(workdir) is the location for the cache files. Leave leading & trailing /'s as is.
set qb(workdir) "/usr/home/blah/eggdrop/scripts/"
# Do you want to use channel-specific quotes? If so, quotes added in channel #a aren't
# available in channel #b and vice versa. If not, all quotes are available everywhere.
# You don't have to decide now, you can en- and disable this feature later as you want.
# 0 = do not, 1 = yes please
set qb(chanspec) 0
# qb(noaddchan) is a list of channels which aren't allowed to add quotes
set qb(noaddchan) ""
# qb(noquotechan) is a list of channels you don't want the bot to quote to
set qb(noquotechan) ""
# qb(max) is the maximum characters a quote is allowed to have.
set qb(max) 999
# Next one will let the bot answer to his nick when mentioned in the channel. Put your bot's
# name within the ** and uncoment the line. Example: bind pubm - *LamestBot* qb:answer
# bind pubm - ** qb:answer
# qb(logactions) defines whether you want to log additions or deletions of quotes
# 0 = do not, 1 = yes please
set qb(logactions) 1
# qb(trigger) is the character that triggers a command.
set qb(trigger) "."
# qb(sendnote) defines whether QuoteBot sends a note to a user when there are
# new quotes available. To disable, set to "". To enable, insert a valid handle
# and make sure the notes module is loaded.
set qb(sendnote) ""
# CODEBASE BELOW
bind pub - ${qb(trigger)}addquote qb:addpub
bind pub - ${qb(trigger)}quote qb:quote
bind pub n|n ${qb(trigger)}delquote qb:delpub
bind pub m|m ${qb(trigger)}talk qb:init
bind dcc - addquote qb:adddcc
bind dcc n delquote qb:deldcc
bind dcc n listquotes qb:listquotes
bind dcc n newquotes qb:newquotes
bind dcc n copyquotes qb:copy
bind dcc n delchanquotes qb:delchan
proc qb:read {} {
global qb qbl qbt
set old "$qb(workdir)quotebot.dat"; set new "$qb(workdir)QuoteBot.dat"
if {[file exists $old]} {
set fid [open $old r]; gets $fid l; set qb(nextind) 1; set qb(nextcind) 1
while {![eof $fid]} {
gets $fid l; if {$l == ""} {continue}
regsub -all \\\* $l !%08 l; regsub -all \\\? $l !%09 l
set qbl($qb(nextind)#$qb(nextcind)#quotebot) $l; incr qb(nextind); incr qb(nextcind)
}
close $fid; file rename -force $old $old.old; qb:saveqts; set qb(conversion) 1
}
if {[file exists $new]} {
set fid [open $new r]; gets $fid l; if {$l != "0"} {set qb(new) $l}
while {![eof $fid]} {gets $fid l; if {$l == ""} {continue}; set qbl([lindex $l 0]) [lrange $l 1 end]}
close $fid
}
if {[file exists $qb(workdir)quotebot.cfg]} {
file rename -force $qb(workdir)quotebot.cfg $qb(workdir)QuoteBot.cfg; set fid [open $qb(workdir)QuoteBot.cfg r]
while {![eof $fid]} {
gets $fid l; if {$l == ""} {continue}
set qbt([lindex $l 0]) "[lindex $l 1] [lindex $l 2] [timer [lindex $l 2] "qb:scheduled [lindex $l 0]"]"
}
close $fid
}
if {[file exists $qb(workdir)quotebot.log]} {file rename -force $qb(workdir)quotebot.log $qb(workdir)QuoteBot.log}
}
proc qb:saveqts {} {
global qb qbl
set fid [open $qb(workdir)QuoteBot.dat w]
if {$qb(new) == ""} {puts $fid "0"} else {puts $fid $qb(new)}
foreach e [array names qbl] {set el [split $e #]; puts $fid "$e $qbl($e)"}
close $fid
}
proc qb:savecfg {} {
global qb qbt
set fid [open $qb(workdir)QuoteBot.cfg w]
foreach e [array names qbt] {puts $fid "$e [lindex $qbt($e) 0] [lindex $qbt($e) 1]"}
close $fid
}
proc qb:log {input} {
global qb
set log "$qb(workdir)QuoteBot.log"
if {[file exists $log]} {set fid [open $log a]} else {set fid [open $log w]}
puts $fid "$input"; close $fid
}
proc qb:addpub {n uh h c arg} {
global qb qbl
set c [string tolower $c]
foreach b $qb(noaddchan) {if {[string match -nocase $c $b]} {return}}
set arg [qb:rs $arg]
if {[string length $arg] > $qb(max)} {puthelp "NOTICE $n :Quote exceeds $qb(max) characters. Yours has [string length $arg]."; return}
if {[llength $arg] == 0} {puthelp "NOTICE $n :Usage: ${qb(trigger)}addquote <quote>"; return}
if {$qb(chanspec)} {
foreach e [array names qbl] {if {[string match "#[lindex [split $e #] 2]" $c] && [string match -nocase $qbl($e) $arg]} {set index [lindex [split $e #] 1]}}
} else {
foreach e [array names qbl] {if {[string match -nocase $qbl($e) $arg]} {set index [lindex [split $e #] 0]}}
}
if {[info exists index]} {puthelp "NOTICE $n :The quote you tried to add already exists (index #$index)."; return}
qb:findnn $c; set index $qb(nextind)#$qb(nextcind)$c; set qbl($index) $arg; lappend qb(new) $index; qb:saveqts
if {$qb(chanspec)} {set index $qb(nextcind)} else {set index $qb(nextind)}
puthelp "NOTICE $n :Added Quote #${index}: \"[qb:dr $arg]\""
if {[llength $qb(new)] == 1} {
if {$qb(sendnote) != ""} {
if {[info commands sendnote] != ""} {
if {[validuser $qb(sendnote)]} {sendnote QuoteBot $qb(sendnote) "New quotes available. Use .newquotes to list them."}
}
}
}
if {$qb(logactions)} {qb:log "ADD PUB $n $c (#$index) [qb:dr $arg]"}
}
proc qb:adddcc {h idx arg} {
global qb qbl
if {$qb(chanspec)} {
if {[llength $arg] < 2} {putdcc $idx "Usage: ${qb(trigger)}addquote <channel> <quote>"; return}
set c [string tolower [lindex $arg 0]]; set arg [lrange [qb:rs $arg] 1 end]
if {![string match #* $c]} {putdcc $idx "Usage: addquote <channel> <quote>"; return}
foreach b $qb(noaddchan) {if {[string match -nocase $c $b]} {return}}
foreach e [array names qbl] {if {[string match "#[lindex [split $e #] 2]" $c] && [string match -nocase $qbl($e) $arg]} {set index [lindex [split $e #] 1]}}
if {[info exists index]} {putdcc $idx "The quote you tried to add already exists for $c (index #$index)."; return}
qb:findnn $c; set index $qb(nextind)#$qb(nextcind)$c; set qbl($index) $arg; lappend qb(new) $index; qb:saveqts
putdcc $idx "Added Quote #$qb(nextcind) for $c: \"[qb:dr $arg]\""
} else {
set c #quotebot; set arg [qb:rs $arg]
if {[string length $arg] > $qb(max)} {putdcc $idx "Quote exceeds $qb(max) characters. Yours has [string length $arg]."; return}
if {[llength $arg] == 0} {putdcc $idx "Usage: ${qb(trigger)}addquote <quote>"; return}
foreach e [array names qbl] {if {[string match -nocase $qbl($e) $arg]} {set index [lindex [split $e #] 0]}}
if {[info exists index]} {putdcc $idx "The quote you tried to add already exists (index #$index)."; return}
qb:findnn $c; set index $qb(nextind)#$qb(nextcind)$c; set qbl($index) $arg; lappend qb(new) $index; qb:saveqts
putdcc $idx "Added Quote #$qb(nextind): \"[qb:dr $arg]\""
}
if {[llength $qb(new)] == 1} {
if {$qb(sendnote) != ""} {
if {[info commands sendnote] != ""} {
if {[validuser $qb(sendnote)]} {sendnote QuoteBot $qb(sendnote) "New quotes available. Use .newquotes to list them."}
}
}
}
if {$qb(logactions)} {qb:log "ADD PUB $h $c (#$index) [qb:dr $arg]"}
}
proc qb:newquotes {h idx arg} {
global qb qbl
set len [llength $qb(new)]
putdcc $idx "$len new quote(s) have arrived. There are [array size qbl] quotes in the database."
if {$len > 0} {
if {$qb(chanspec)} {
putdcc $idx "(No.) (Channel: No.) Quote"
foreach e $qb(new) {set el [split $e #]; putdcc $idx "(#[lindex $el 0]) (#[lindex $el 2]: #[lindex $el 1]) [qb:dr $qbl($e)]"}
} else {
putdcc $idx "(No.) Quote"
foreach e $qb(new) {set el [split $e #]; putdcc $idx "(#[lindex $el 0]) [qb:dr $qbl($e)]"}
}
set qb(new) ""; qb:saveqts
}
}
proc qb:listquotes {h idx arg} {
global qb qbl
set argu $arg; set arg [string tolower [qb:rs $arg]]; set list ""
if {![string match #* $arg]} {
if {$arg == ""} {set insert ""; foreach e [array names qbl] {lappend list $e}} else {
set insert "matching \"[qb:dr $argu]\""
foreach e [array names qbl] {if {[string match -nocase *$arg* $qbl($e)]} {lappend list $e}}
}
} else {
if {$qb(chanspec)} {
set insert "for channel $argu"
foreach e [array names qbl] {if {[string match -nocase "#[lindex [split $e #] 2]" $arg]} {lappend list $e}}
} else {
set insert "matching \"[qb:dr $argu]\""
foreach e [array names qbl] {if {[string match -nocase *$arg* $qbl($e)]} {lappend list $e}}
}
}
if {[llength $list] > 0} {
set nlist ""; foreach e $list {lappend nlist "[lindex [split $e #] 0] $e"}; set list ""
set nlist [lsort -decreasing -integer -index 0 $nlist]; foreach e $nlist {lappend list [lindex $e 1]}
putdcc $idx "Found [llength $list] quotes (out of [array size qbl]) $insert, latest first."
if {$qb(chanspec)} {
putdcc $idx "(No.) (Channel: No.) Quote"
foreach e $list {set el [split $e #]; putdcc $idx "(#[lindex $el 0]) (#[lindex $el 2]: #[lindex $el 1]) [qb:dr $qbl($e)]"}
} else {
putdcc $idx "(No.) Quote"
foreach e $list {set el [split $e #]; putdcc $idx "(#[lindex $el 0]) [qb:dr $qbl($e)]"}
}
} else {putdcc $idx "Found no matches to your query."}
}
proc qb:quote {n uh h c arg} {
global qb qbl
foreach e $qb(noquotechan) {if {[string match -nocase $c $e]} {return}}
set arg [qb:rs $arg]; regsub -all \\*|\\? $arg "" arg
if {![info exists qb(${c}results)]} {set qb(${c}results) ""}
if {![info exists qb(${c}last)]} {set qb(${c}last) ""}
if {$arg == ""} {puthelp "PRIVMSG $c :[qb:random $c]"; return}
if {[string is integer $arg]} {
if {$qb(chanspec)} {
foreach e [array names qbl] {if {[string match *#$arg$c $e]} {puthelp "PRIVMSG $c :(#[lindex [split $e #] 1]) [qb:dr $qbl($e)]"; return}}
} else {
foreach e [array names qbl] {if {[string match ${arg}#* $e]} {puthelp "PRIVMSG $c :(#[lindex [split $e #] 0]) [qb:dr $qbl($e)]"; return}}
}
puthelp "NOTICE $n :Can't find index $arg"; return
}
if {[string match -nocase $arg $qb(${c}last)]} {
set e [lindex $qb(${c}results) 0]; set qb(${c}results) [lreplace $qb(${c}results) 0 0]; set len [llength $qb(${c}results)]
if {$qb(chanspec)} {set el [lindex [split $e #] 1]} else {set el [lindex [split $e #] 0]}
puthelp "PRIVMSG $c :(#$el) [qb:dr $qbl($e)] ($len left)"
if {$len == 0} {unset qb(${c}results); set qb(${c}last) ""; return} else {set qb(${c}last) $arg}
return
}
set qb(${c}results) ""
if {$qb(chanspec)} {
foreach e [array names qbl] {
if {[string match "#[lindex [split $e #] 2]" $c] && [string match -nocase *$arg* $qbl($e)]} {lappend qb(${c}results) $e}}
} else {
foreach e [array names qbl] {if {[string match -nocase *$arg* $qbl($e)]} {lappend qb(${c}results) $e}}
}
set len [llength $qb(${c}results)]
if {$len == 0} {puthelp "NOTICE $n :Found no quotes matching \"[qb:dr $arg]\""; unset qb(${c}results); set qb(${c}last) ""; return}
set qb(${c}results) [lsort -decreasing $qb(${c}results)]; set e [lindex $qb(${c}results) 0]
if {$qb(chanspec)} {set el [lindex [split $e #] 1]} else {set el [lindex [split $e #] 0]}
puthelp "PRIVMSG $c :(#$el) [qb:dr $qbl($e)] ($len match(es), latest first)"
set qb(${c}results) [lreplace $qb(${c}results) 0 0]; set qb(${c}last) $arg
}
proc qb:answer {n uh h c a} {
global qb qbl
foreach e $qb(noquotechan) {if {[string match -nocase $e $c]} {return}}
puthelp "PRIVMSG $c :[qb:random $c]"
}
proc qb:init {n uh h c arg} {
global qb qbt
set ch [string tolower $c]; set switch [string tolower [lindex [split $arg] 0]]; set rate [lindex $arg 1]
if {($switch != "on") && ($switch != "off")} {puthelp "NOTICE $n :Usage: talk <on|off> \[minutes\]"; return}
if {$rate == ""} {set rate 30} elseif {![string is integer $rate]} {puthelp "NOTICE $n :Use an integer instead of $rate"; return}
switch $switch {
"on" {
if {([info exists qbt($ch)]) && ([lindex $qbt($ch) 0] == "on")} {
killtimer [lindex $qbt($ch) 2]
set qbt($ch) "on $rate [timer $rate "qb:scheduled $ch"]"
} else {set qbt($ch) "on $rate [timer $rate "qb:scheduled $ch"]"}
puthelp "PRIVMSG $c :Enabled quoting for $c with $rate minutes intervall"
}
"off" {
if {([info exists qbt($ch)]) && ([lindex $qbt($ch) 0] == "on")} {
killtimer [lindex $qbt($ch) 2]; unset qbt($ch)
puthelp "PRIVMSG $c :Disabled quoting for $c"
} else {puthelp "NOTICE $n :Quoting was not enabled for $c"}
}
}
qb:savecfg
}
proc qb:scheduled {c} {
global qb qbl qbt
puthelp "PRIVMSG $c :[qb:random $c]"
set rate [lindex $qbt($c) 1]; set qbt($c) "on $rate [timer $rate "qb:scheduled $c"]"
}
proc qb:delpub {n uh h c arg} {
global qb qbl
set c [string tolower $c]; regsub -all \\*|\\? $arg "" arg; set arg [split [qb:rs $arg]]; set del ""; set nodel ""; set i 0
if {[llength $arg] == 0} {puthelp "NOTICE $n :Usage: ${qb(trigger)}delquote <index ?index index ..?|mask>"; return}
if {[string is integer [lindex $arg 0]]} {
if {$qb(chanspec)} {
foreach e $arg {
set f 0
foreach el [array names qbl] {
set ele [split $el #]
if {[string match "#[lindex $ele 2]" $c] && [string match -nocase [lindex $ele 1] $e]} {unset qbl($el); lappend del $e; set f 1; qb:delnew [lindex $ele 0]}
}
if {!$f} {lappend nodel $e}
}
} else {
foreach e $arg {
set f 0
foreach el [array names qbl] {
set ele [lindex [split $el #] 0]
if {[string match -nocase $ele $e]} {unset qbl($el); lappend del $e; set f 1; qb:delnew $ele}
}
if {!$f} {lappend nodel $e}
}
}
qb:saveqts
if {$del != ""} {puthelp "NOTICE $n :Deleted indices [join $del ", "]"; if {$qb(logactions)} {qb:log "DEL PUB $n $c [qb:dr $arg]"}}
if {$nodel != ""} {puthelp "NOTICE $n :I can't find indices [join $nodel ", "]"}
return
}
set arg [join $arg]
if {$qb(chanspec)} {
foreach e [array names qbl] {
if {[string match "#[lindex [split $e #] 2]" $c] && [string match -nocase *$arg* $qbl($e)]} {unset qbl($e); incr i; qb:delnew [lindex [split $e #] 0]}
}
} else {
foreach e [array names qbl] {
if {[string match -nocase *$qbl($e)* $arg]} {unset qbl($e); incr i; qb:delnew [lindex [split $e #] 0]}
}
}
if {!$i} {puthelp "NOTICE $n :Can't find a quote matching \"[qb:dr $arg]\""; return} else {
puthelp "NOTICE $n :Removed $i quote(s) matching \"[qb:dr $arg]\""; qb:saveqts
if {$qb(logactions)} {qb:log "DEL PUB $n $c [qb:dr $arg]"}
}
}
proc qb:deldcc {h idx arg} {
global qb qbl
set del ""; set nodel ""; set i 0; regsub -all \\*|\\? $arg "" arg
if {$qb(chanspec)} {
if {[llength $arg] < 2} {putdcc $idx "Usage: ${qb(trigger)}delquote <channel> <index ?index index ..?|mask>"; return}
set c [string tolower [lindex $arg 0]]; set arg [lrange [qb:rs $arg] 1 end]
if {![string match #* $c]} {putdcc $idx "Usage: ${qb(trigger)}delquote <channel> <index ?index index ..?|mask>"; return}
if {[string is integer [lindex $arg 0]]} {
foreach e $arg {
set f 0
foreach el [array names qbl] {
set ele [split $el #]
if {[string match "#[lindex $ele 2]" $c] && [string match -nocase [lindex $ele 1] $e]} {unset qbl($el); lappend del $e; set f 1; qb:delnew [lindex $ele 0]}
}
if {!$f} {lappend nodel $e}
}
if {$del != ""} {putdcc $idx "Deleted indices [join $del ", "] for $c"; if {$qb(logactions)} {qb:log "DEL DCC $h $c [qb:dr $arg]"}}
if {$nodel != ""} {putdcc $idx "I can't find indices [join $nodel ", "] for $c"}
qb:saveqts; return
}
foreach e [array names qbl] {
if {[string match "#[lindex [split $e #] 2]" $c] && [string match -nocase *$arg* $qbl($e)]} {unset qbl($e); incr i; qb:delnew [lindex [split $e #] 0]}
}
if {!$i} {putdcc $idx "Can't find a quote for $c matching \"[qb:dr $arg]\""; return} else {
putdcc $idx "Removed $i quote(s) for $c matching \"[qb:dr $arg]\""; qb:saveqts
}
if {$qb(logactions)} {qb:log "DEL DCC $h $c [qb:dr $arg]"}
} else {
if {[llength $arg] == 0} {putdcc $idx "Usage: ${qb(trigger)}delquote <index ?index index ..?|mask>"; return}
set arg [qb:rs $arg]
if {[string is integer [lindex $arg 0]]} {
foreach e $arg {
set f 0
foreach el [array names qbl] {
set ele [lindex [split $el #] 0]
if {[string match -nocase $ele $e]} {unset qbl($el); lappend del $e; set f 1; qb:delnew $ele}
}
if {!$f} {lappend nodel $e}
}
if {$del != ""} {putdcc $idx "Deleted indices [join $del ", "]"; if {$qb(logactions)} {qb:log "DEL DCC $h [qb:dr $arg]"}}
if {$nodel != ""} {putdcc $idx "I can't find indices [join $nodel ", "]"}
qb:saveqts; return
}
foreach e [array names qbl] {if {[string match -nocase *$qbl($e)* $arg]} {unset qbl($e); incr i; qb:delnew [lindex [split $e #] 0]}}
if {!$i} {putdcc $idx "Can't find a quote matching \"[qb:dr $arg]\""; return} else {
putdcc $idx "Removed $i quote(s) matching \"[qb:dr $arg]\""; qb:saveqts
if {$qb(logactions)} {qb:log "DEL DCC $h [qb:dr $arg]"}
}
}
}
proc qb:copy {h idx arg} {
global qb qbl
if {!$qb(chanspec)} {putdcc $idx "Command not available (script option \"channel specific quotes\" is disabled)"; return}
set fromc [string tolower [lindex $arg 0]]; set toc [string tolower [lindex $arg 1]]
if {$fromc == $toc || [llength $arg] != 2} {putdcc $idx "Usage: copyquotes <fromchannel> <tochannel>"; return}
qb:findnn $toc; set l ""
foreach e [array names qbl] {if {[string match "#[lindex [split $e #] 2]" $fromc]} {lappend l $qbl($e)}}
if {[llength $l] == 0} {putdcc $idx "Can't find any quotes for $fromc."; return}
foreach e $l {set qbl($qb(nextind)#$qb(nextcind)$toc) $e; incr qb(nextind); incr qb(nextcind)}
qb:saveqts; putdcc $idx "Done. Copied [llength $l] quotes from $fromc to $toc"
if {$qb(logactions)} {qb:log "CPY DCC $h from $fromc to $toc"}
}
proc qb:delchan {h idx arg} {
global qb qbl
if {!$qb(chanspec)} {putdcc $idx "Command not available (script option \"channel specific quotes\" is disabled)"; return}
set c [string tolower $arg]; set l ""
if {[llength $arg] != 1} {putdcc $idx "Usage: delchanquotes <channel>"; return}
foreach e [array names qbl] {if {[string match "#[lindex [split $e #] 2]" $c]} {lappend l $e}}
if {[llength $l] == 0} {putdcc $idx "Can't find any quotes for $c."; return}
foreach e $l {unset qbl($e)}; qb:saveqts; putdcc $idx "Done. Deleted [llength $l] quotes from $c."
if {$qb(logactions)} {qb:log "DLC DCC $h $c"}
}
proc qb:delnew {what} {
global qb qbl
set pos [lsearch $qb(new) $what]; if {$pos > -1} {set qb(new) [lreplace $qb(new) $pos $pos]}
}
proc qb:random {c} {
global qb qbl
set l ""
if {$qb(chanspec)} {
foreach e [array names qbl] {if {[string match "#[lindex [split $e #] 2]" $c]} {lappend l $e}}; set i 1
} else {
foreach e [array names qbl] {lappend l $e}; set i 0
}
if {[llength $l] > 0} {set e [lindex $l [rand [llength $l]]]} else {return}
set e [lindex $l [rand [llength $l]]]; return "(#[lindex [split $e #] $i]) [qb:dr $qbl($e)]"
}
proc qb:findnn {c} {
global qb qbl
set alist ""; set clist ""; set a [array names qbl]
foreach e $a {lappend alist [lindex [split $e #] 0]}
set qb(nextind) [expr [lindex [lsort -decreasing -integer $alist] 0] + 1]
foreach e $a {
set el [split $e #]
if {[string match "#[lindex $el 2]" $c]} {lappend clist [lindex $el 1]}
}
set qb(nextcind) [expr [lindex [lsort -decreasing -integer $clist] 0] + 1]
}
proc qb:rs {i} {
global numversion
regsub -all \\\\ $i !%01 i; regsub -all \\\[ $i !%02 i; regsub -all \\\] $i !%03 i
regsub -all \\\} $i !%04 i; regsub -all \\\{ $i !%05 i; regsub -all \\\^ $i !%06 i
regsub -all \\\" $i !%07 i; regsub -all \\\* $i !%08 i; regsub -all \\\? $i !%09 i
if {$numversion < 1060400} {
regsub -all Ä $i AE i; regsub -all ä $i ae i; regsub -all Ö $i OE i
regsub -all ö $i oe i; regsub -all Ü $i UE i; regsub -all ü $i ue i
regsub -all ß $i ss i; regsub -all Ý $i Y i; regsub -all ý $i y i
}
return $i
}
proc qb:dr {i} {
regsub -all !%01 $i \\ i; regsub -all !%02 $i \[ i; regsub -all !%03 $i \] i
regsub -all !%04 $i \} i; regsub -all !%05 $i \{ i; regsub -all !%06 $i \^ i
regsub -all !%07 $i \" i; regsub -all !%08 $i \* i; regsub -all !%09 $i \? i
return $i
}
if {[array exist qbt]} {unset qbt}
foreach t [timers] {if {[lsearch -regexp $t qb:scheduled] > -1} {killtimer [lindex $t 2]}}
set qb(new) ""; set qb(conversion) 0; qb:read
if {$qb(new) != ""} {set qbinsert ", [llength $qb(new)] new"} else {set qbinsert ""}
putlog "TCL LOADED: QuoteBot v2.0 by Baerchen. [llength [array names qbl]] Quotes in database${qbinsert}."
if {$qb(conversion)} {
putlog " Converted old database. Quotes assigned to channel #quotebot"
putlog " Use command .copyquotes to assign them to other channels"
putlog " This is _only_ needed if you chose to have channel specific quotes"
}