# -------------------------------------------------------------------- # ______________________________________ # | | # | Quote v1.1 by mortician | # | | # | IRC: irc.undernet.org - #mortician | # | email: mortician@linux.be | # | www: www.mortician.tk | # |______________________________________| # -------------------------------------------------------------------- # Usage # -------------------------------------------------------------------- # !quote(s) - Displays a quote # !quotehelp # !addquote - Adds a quote # !delquote - Deletes a quote # !quotestats - Shows how many quotes there are and # how big the quote storage file is. # # ".chanset +quotes" to set the channels to store quotes in # -------------------------------------------------------------------- # History # -------------------------------------------------------------------- # 03 Jan 2003 v1.0 - Initial release # 10 Jan 2003 v1.1 - bugfix in !quotestats and !quote # -------------------------------------------------------------------- # notes # -------------------------------------------------------------------- # inspired on Quote tcl v3.52 by Stigmata # todo: add a flood protection # -------------------------------------------------------------------- # VARIABLES # you have to change these # -------------------------------------------------------------------- # the char that marks public commands set mqt(char) "!" # flag(s) needed to read quotes set mqt(readflag) "." # flag(s) needed to add quotes set mqt(addflag) "!" # flag(s) needed to delete quotes set mqt(delflag) "!" # use a 1 general quote file? (1=yes/0=no) # if 0, channels will have different quote files set mqt(gen) 0 # -------------------------------------------------------------------- # please email any bugs or comments (mortician@linux.be) or use forum # on http://www.mortician.tk # -------------------------------------------------------------------- # -------------------------------------------------------------------- # MAGIC BORDER # Don't cross this line unless you feel prepared to code # -------------------------------------------------------------------- set mqt(version) "v1.1" putlog "Quote $mqt(version) by mortician loaded..." setudef flag quotes # -------------------------------------------------------------------- # bindings # -------------------------------------------------------------------- bind pub $mqt(readflag) $mqt(char)quote mqt:quote bind pub $mqt(readflag) $mqt(char)quotes mqt:quote bind pub $mqt(readflag) $mqt(char)quotehelp mqt:quotehelp bind pub $mqt(addflag) $mqt(char)addquote mqt:addquote bind pub $mqt(delflag) $mqt(char)delquote mqt:delquote bind pub $mqt(readflag) $mqt(char)quotestats mqt:quotestats # -------------------------------------------------------------------- # procedures # -------------------------------------------------------------------- # replace and mirc_strip thanks to More Tools v3.0.4 by MC_8 # (http://mc.purehype.net:81/) proc replace {{args ""}} { set switches "" for {set i 0} {[string match -* [set arg [lindex $args $i]]]} {incr i} { if {![regexp -- {^-(nocase|-)$} $arg -> switch]} { error "bad switch \"$arg\": must be -nocase, or --" } if {$switch == "-"} { incr i break }; lappend switches $switch } set nocase [expr {([lsearch -exact $switches "nocase"] >= "0") ? 1 : 0}] set text [lindex $args $i] set substitutions [lindex $args [expr $i+1]] # Check to see if $substitutions is in list format, if not make it so. set substitutions [split $substitutions] if {[info tclversion] >= "8.1"} { return [expr {($nocase)? [string map -nocase $substitutions $text]: [string map $substitutions $text]}] } set re_syntax {([][\\\*\+\?\{\}\,\(\)\:\.\^\$\=\!\|])} foreach {a b} $substitutions { regsub -all -- $re_syntax $a {\\\1} a if {$nocase} {regsub -all -nocase -- $a $text $b text} \ else {regsub -all -- $a $text $b text} }; return $text } proc mirc_strip {{args ""}} { set switches "" for {set i 0} {[string match -* [set arg [lindex $args $i]]]} {incr i} { if {![regexp -- {^-(all|bold|color|reverse|underline|-)$} $arg -> switch]} { set valid "-all -bold -color -reverse -underline {or --}" error "bad switch \"$arg\": must be [join $valid ", "]" } if {$switch == "-"} { incr i break }; lappend switches $switch } if {$switches == ""} {set switches all} set arg [lindex $args $i] set all [expr {([lsearch -exact $switches all] >= 0) ? 1 : 0}] set list [list \002 "" \017 "" \026 "" \037 ""] regsub -all -- "\003(\[0-9\]\[0-9\]?(,\[0-9\]\[0-9\]?)?)?" $arg "" arg set arg [replace -- $arg [join $list]] return $arg } # add quotes proc mqt:addquote {nick uhost handle chan arg} { global mqt if {![string match "*+quotes*" [channel info $chan]]} {return 0} if {$mqt(gen) == 1} { set file "quotes.mqt" } else { set file "[string tolower $chan].mqt" } set arg [mirc_strip $arg] if {$mqt(gen) == 1} {set arg "\[$chan\] $arg"} set mqt(fd) [open $file a+] puts $mqt(fd) $arg close $mqt(fd) putserv "PRIVMSG $chan :Quote has been added" putcmdlog "<<$nick>> !$handle! Added a quote in $chan." return 1 } # quotehelp proc mqt:quotehelp {nick uhost handle chan arg} { global mqt if {![string match "*+quotes*" [channel info $chan]]} {return 0} putserv "NOTICE $nick :Quote.tcl $mqt(version) by mortician. Commands:" putserv "NOTICE $nick :$mqt(char)addquote $mqt(char)quote(s) " putserv "NOTICE $nick :$mqt(char)delquote $mqt(char)quotestats" } # read quotes proc mqt:quote {nick uhost handle chan arg} { global mqt if {![string match "*+quotes*" [channel info $chan]]} {return 0} if {$mqt(gen) == 1} {set file "quotes.mqt"} else {set file "[string tolower $chan].mqt"} if {![file exists $file]} {putserv "PRIVMSG $chan :No quotes found, $file does not exist" ; return} set mqt(fd) [open $file r] set mqt(list) "" while { ![eof $mqt(fd)] } { set mqt_tmp [gets $mqt(fd)] if { $mqt_tmp != "" } {lappend mqt(list) $mqt_tmp} } close $mqt(fd) if {[llength $mqt(list)] == 0} {putserv "PRIVMSG $chan :No quotes found, $file is empty"; return} set arg [split $arg] if {$arg==""} { set mqt(print) [lindex $mqt(list) [rand [llength $mqt(list)]]] putserv "PRIVMSG $chan :Quote \002[expr [lsearch -exact $mqt(list) $mqt(print)] + 1]\002 of \002[llength $mqt(list)]\002: $mqt(print)" } else { if {[string is integer $arg]} { if {$arg > [llength $mqt(list)] || $arg <= 0} {return} set mqt(print) [lindex $mqt(list) [expr $arg - 1]] putserv "PRIVMSG $chan :Quote \002[expr [lsearch -exact $mqt(list) $mqt(print)] + 1]\002 of \002[llength $mqt(list)]\002: $mqt(print)" } else { if {$arg == "help"} { mqt:quotehelp $nick $uhost $handle $chan $arg ; return } set mqt(mlist) "" set arg "*[string tolower $arg]*" foreach mqt_tmp $mqt(list) { set mqt_low [string tolower $mqt_tmp] if { [string match $arg $mqt_low] } { lappend mqt(mlist) $mqt_tmp } } if {[llength $mqt(mlist)] == 0} {putserv "PRIVMSG $chan :no quotes found matching $arg"; return} set mqt(print) [lindex $mqt(mlist) [rand [llength $mqt(mlist)]]] putserv "PRIVMSG $chan :Quote \002[expr [lsearch -exact $mqt(mlist) $mqt(print)] + 1]\002 of \002[llength $mqt(mlist)]\002: $mqt(print)" } } } #del quotes proc mqt:delquote {nick uhost handle chan arg} { global mqt if {![string match "*+quotes*" [channel info $chan]]} {return 0} if {$mqt(gen) == 1} { set file "quotes.mqt" } else { set file "[string tolower $chan].mqt" } if {![file exists $file]} { putserv "PRIVMSG $chan :No quotes found, $file does not exist" ; return} set mqt(fd) [open $file r] set mqt(list) "" while { ![eof $mqt(fd)] } { set mqt_tmp [gets $mqt(fd)] if { $mqt_tmp != "" } {lappend mqt(list) $mqt_tmp} } close $mqt(fd) if {[string is integer $arg]} { set index [expr $arg - 1] if {$arg > [llength $mqt(list)] || $arg <= 0} { putserv "PRIVMSG $chan :No quote deleted" ; return} set mqt(list) [lreplace $mqt(list) $index $index ] set mqt(fd) [open $file w] foreach mqt_tmp $mqt(list) {puts $mqt(fd) $mqt_tmp} close $mqt(fd) putserv "PRIVMSG $chan :Quote $arg deleted" putcmdlog "<<$nick>> !$handle! Deleted a quote in $chan." } } # stats quotes -- based on Quote tcl v3.52 by Stigmata proc mqt:quotestats {nick uhost handle chan arg} { global mqt if {![string match "*+quotes*" [channel info $chan]]} {return 0} if {$mqt(gen) == 1} { set file "quotes.mqt" } else { set file "[string tolower $chan].mqt" } if {![file exists $file]} { putserv "PRIVMSG $chan :No quotes found, $file does not exist" } else { set mqt(size) [expr [file size $file] / 1024] set mqt(cnt) [exec grep -c "" $file] putserv "PRIVMSG $chan :$mqt(cnt) quotes total using $mqt(size)kb." } }