# # All-Tools TCL, includes toolbox.tcl, toolkit.tcl and moretools.tcl # toolbox was originally authored by cmwagner # toolkit was originally authored by Robey Pointer # moretools was originally authored by David Sesno # modified for 1.3.0 bots by TG # # Copyright (C) 1999, 2003 - 2010 Eggheads Development Team # # Tothwolf 02May1999: rewritten and updated # guppy 02May1999: updated even more # Tothwolf 02May1999: fixed what guppy broke and updated again # Tothwolf 24/25May1999: more changes # rtc 20Sep1999: added isnumber, changes # dw 20Sep1999: use regexp for isnumber checking # Tothwolf 06Oct1999: optimized completely # krbb 09Jun2000: added missing return to randstring # Tothwolf 18Jun2000: added ispermowner # Sup 02Apr2001: added matchbotattr # Tothwolf 13Jun2001: updated/modified several commands # Hanno 28Sep2001: fixed testip # guppy 03Mar2002: optimized # Souperman 05Nov2002: added ordnumber # Tothwolf 27Dec2003: added matchbotattrany, optimized ordnumber, # more minor changes # # $Id: alltools.tcl,v 1.23 2010/01/03 13:27:31 pseudo Exp $ # ######################################## # # Descriptions of available commands: # ## ## (toolkit): ## # # putmsg # send a privmsg to the given nick or channel # # putchan # send a privmsg to the given nick or channel # (for compat only, this is the same as 'putmsg' above) # # putnotc # send a notice to the given nick or channel # # putact # send an action to the given nick or channel # # ## ## (toolbox): ## # # strlwr # string tolower # # strupr # string toupper # # strcmp # string compare # # stricmp # string compare (case insensitive) # # strlen # string length # # stridx # string index # # iscommand # if the given command exists, return 1 # else return 0 # # timerexists # if the given command is scheduled by a timer, return its timer id # else return empty string # # utimerexists # if the given command is scheduled by a utimer, return its utimer id # else return empty string # # inchain # if the given bot is connected to the botnet, return 1 # else return 0 # (for compat only, same as 'islinked') # # randstring # returns a random string of the given length # # putdccall # send the given text to all dcc users # # putdccbut # send the given text to all dcc users except for the given idx # # killdccall # kill all dcc user connections # # killdccbut # kill all dcc user connections except for the given idx # # ## ## (moretools): ## # # iso # if the given nick has +o access on the given channel, return 1 # else return 0 # # realtime [format] # 'time' returns the current time in 24 hour format '14:15' # 'date' returns the current date in the format '21 Dec 1994' # not specifying any format will return the current time in # 12 hour format '1:15 am' # # testip # if the given ip is valid, return 1 # else return 0 # # number_to_number # if the given number is between 1 and 15, return its text representation # else return the number given # # ## ## (other commands): ## # # isnumber # if the given string is a valid number, return 1 # else return 0 # # ispermowner # if the given handle is a permanent owner, return 1 # else return 0 # # matchbotattr # if the given bot has all the given flags, return 1 # else return 0 # # matchbotattrany # if the given bot has any the given flags, return 1 # else return 0 # # ordnumber # if the given string is a number, returns the # "ordinal" version of that number, i.e. 1 -> "1st", # 2 -> "2nd", 3 -> "3rd", 4 -> "4th", etc. # else return # ######################################## # So scripts can see if allt is loaded. set alltools_loaded 1 set allt_version 206 # For backward compatibility. set toolbox_revision 1007 set toolbox_loaded 1 set toolkit_loaded 1 # # toolbox: # proc putmsg {dest text} { puthelp "PRIVMSG $dest :$text" } proc putchan {dest text} { puthelp "PRIVMSG $dest :$text" } proc putnotc {dest text} { puthelp "NOTICE $dest :$text" } proc putact {dest text} { puthelp "PRIVMSG $dest :\001ACTION $text\001" } # # toolkit: # proc strlwr {string} { string tolower $string } proc strupr {string} { string toupper $string } proc strcmp {string1 string2} { string compare $string1 $string2 } proc stricmp {string1 string2} { string compare [string tolower $string1] [string tolower $string2] } proc strlen {string} { string length $string } proc stridx {string index} { string index $string $index } proc iscommand {command} { if {[string compare "" [info commands $command]]} then { return 1 } return 0 } proc timerexists {command} { foreach i [timers] { if {![string compare $command [lindex $i 1]]} then { return [lindex $i 2] } } return } proc utimerexists {command} { foreach i [utimers] { if {![string compare $command [lindex $i 1]]} then { return [lindex $i 2] } } return } proc inchain {bot} { islinked $bot } proc randstring {length {chars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789}} { if {([string compare "" $length]) && \ (![regexp \[^0-9\] $length])} then { set count [string length $chars] if {$count} then { for {set index 0} {$index < $length} {incr index} { append result [string index $chars [rand $count]] } } else { error "empty character string" } } else { error "invalid random string length" } return $result } proc putdccall {text} { foreach i [dcclist CHAT] { putdcc [lindex $i 0] $text } } proc putdccbut {idx text} { foreach i [dcclist CHAT] { set j [lindex $i 0] if {$j != $idx} then { putdcc $j $text } } } proc killdccall {} { foreach i [dcclist CHAT] { killdcc [lindex $i 0] } } proc killdccbut {idx} { foreach i [dcclist CHAT] { set j [lindex $i 0] if {$j != $idx} then { killdcc $j } } } # # moretools: # proc iso {nick chan} { matchattr [nick2hand $nick $chan] o|o $chan } proc realtime {args} { switch -exact -- [lindex $args 0] { time { return [strftime %H:%M] } date { return [strftime "%d %b %Y"] } default { return [strftime "%I:%M %P"] } } } proc testip {ip} { set tmp [split $ip .] if {[llength $tmp] != 4} then { return 0 } set index 0 foreach i $tmp { if {(([regexp \[^0-9\] $i]) || ([string length $i] > 3) || \ (($index == 3) && (($i > 254) || ($i < 1))) || \ (($index <= 2) && (($i > 255) || ($i < 0))))} then { return 0 } incr index } return 1 } proc number_to_number {number} { switch -exact -- $number { 0 { return Zero } 1 { return One } 2 { return Two } 3 { return Three } 4 { return Four } 5 { return Five } 6 { return Six } 7 { return Seven } 8 { return Eight } 9 { return Nine } 10 { return Ten } 11 { return Eleven } 12 { return Twelve } 13 { return Thirteen } 14 { return Fourteen } 15 { return Fifteen } default { return $number } } } # # other commands: # proc isnumber {string} { if {([string compare "" $string]) && \ (![regexp \[^0-9\] $string])} then { return 1 } return 0 } proc ispermowner {hand} { global owner if {([matchattr $hand n]) && \ ([lsearch -exact [split [string tolower $owner] ", "] \ [string tolower $hand]] != -1)} then { return 1 } return 0 } proc matchbotattr {bot flags} { foreach flag [split $flags ""] { if {[lsearch -exact [split [botattr $bot] ""] $flag] == -1} then { return 0 } } return 1 } proc matchbotattrany {bot flags} { foreach flag [split $flags ""] { if {[string first $flag [botattr $bot]] != -1} then { return 1 } } return 0 } proc ordnumber {string} { if {[isnumber $string]} then { set last [string index $string end] if {[string index $string [expr [string length $string] - 2]] != 1} then { if {$last == 1} then { return ${string}st } elseif {$last == 2} then { return ${string}nd } elseif {$last == 3} then { return ${string}rd } } return ${string}th } return $string }