Mercurial > hg > egg-tcls
diff mndb.tcl @ 0:1c4e2814cd41
Initial import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 21 Sep 2010 13:12:49 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mndb.tcl Tue Sep 21 13:12:49 2010 +0300 @@ -0,0 +1,346 @@ +########################################################################## +# +# MattiNykanenDB v0.7 by ccr/TNSP <ccr@tnsp.org> +# +# Not for public use or distribution. If you happen to find this, +# send your questions and/or problems to /dev/null, thank you. +# +########################################################################## + +### +### General options +### +# Filename where the logged quote data goes +set mndb_file "data.mndb" + +# 1 = Verbose: Say messages PUBLIC when quote is OK, bad, etc. +# 0 = Quiet : Say privately +set mndb_verbose 0 + +# 1 = Put some info to bot's Logfile when doing stuff... +# 0 = Don't. +set mndb_logmsg 1 + +# What IRC "command" should we use to send messages: +# (Valid alternatives are "PRIVMSG" and "NOTICE") +set mndb_preferredmsg "PRIVMSG" + + +### +### Search related settings +### + +# How many quote's should the !mnfind command show (maximum limit) +set mndb_showmax_pub 3 + +# For private-search, this is the default limit (user can change it) +set mndb_showmax_priv 5 + + +########################################################################## +# No need to look below this line +########################################################################## +#------------------------------------------------------------------------- +set mndb_name "MattiNykanenDB" +set mndb_version "0.7" + + +#------------------------------------------------------------------------- +### Binding initializations +bind pub - !mnfind mndb_pub_find +bind pub - !mnadd mndb_pub_add +bind pub - !mn mndb_pub_mn +bind msg - mnfind mndb_msg_find +bind msg - mn mndb_msg_mn + + +### Initialization messages +set mndb_message "$mndb_name v$mndb_version by ccr/TNSP" +putlog "$mndb_message" + + +#------------------------------------------------------------------------- +### Utility functions +proc mndb_log { jarg } { + global mndb_logmsg mndb_name + + if {$mndb_logmsg != 0} { + putlog "$mndb_name: $jarg" + } +} + + +proc mndb_ctime { utime } { + + if {$utime == "" || $utime == "*"} { + set utime 0 + } + + return [clock format $utime -format "%d.%m.%Y %H:%M"] +} + + +proc mndb_isnumber { uarg } { + set ufoo 1 + + foreach i [split $uarg {}] { + if ![string match \[0-9\] $i] {set ufoo 0} + } + + return $ufoo +} + + +proc mndb_msg {apublic anick achan amsg} { +global mndb_preferredmsg + +if {$apublic == 0} { + putserv "$mndb_preferredmsg $anick :$amsg" + } else { + putserv "$mndb_preferredmsg $achan :$anick, $amsg" + } +} + + +#------------------------------------------------------------------------- +proc mndb_add {utext unick uhost uchan upublic} { +global mndb_file + + if {[string length $utext] < 10} { + mndb_msg $upublic $unick $uchan "pyh." + return 0 + } + +### Create the database file if it does not exist yet + set fd [open $mndb_file a+] + close $fd + +### OK. The quote is valid, but let's check if we already know it. + set fd [open $mndb_file r] + set sindex 0 + set smax -1 + + while {![eof $fd]} { + gets $fd foo + incr sindex + + set foo [split $foo "|"] + set qindex [lindex $foo 0] + if {$qindex > $smax} { set smax $qindex } + } + + close $fd + +### OK, the quote was not already known and IS valid. Add it. + + incr smax + + set fd [open $mndb_file a+] + puts $fd "$smax|$utext|[unixtime]|$unick|$uhost|$uchan" + close $fd + +### Log some data + mndb_log "Added quote #$smax ($unick @ $uchan): $utext" + +### Let's report success to user + mndb_msg $upublic $unick $uchan "tietokantaa sörkitty (#$smax / $sindex), kiitos." + + return 1 +} + + +#------------------------------------------------------------------------- +proc mndb_find {ipatterns imax} { +global mndb_file + +### Search the database for pattern +### Clear the count, open the quote logfile +set iresults {} +set nresults 0 +set fd [open $mndb_file r] + +### Start searching... +while {![eof $fd]} { + +# Get one quote for inspection + gets $fd foo + set irecord [split [string tolower $foo] "|"] + set itext [lindex $irecord 1] + set iname [lindex $irecord 3] + +# Match with all given patterns and rules + set imatched 1 + + foreach ipattern $ipatterns { + + set foob [split [string tolower $ipattern] " "] + set ftoken [lindex $foob 0] + set fparam [lindex $foob 1] + set fmatch [string match $fparam $itext] + + if {($ftoken == "+") && ($fmatch == 0)} { set imatched 0 } + + if {($ftoken == "-") && ($fmatch == 1)} { set imatched 0 } + + if {($ftoken == "%") && ([string match $fparam $iname] == 0)} { set imatched 0 } + + } + +# If the all patterns matched, add to the list... + if {($imatched == 1) && ($foo != "")} { + incr nresults + lappend iresults $foo + } + + } + +# Close file +close $fd + +# Take only last imax results +return [lrange $iresults [expr $nresults-$imax] $nresults] +} + + + +#------------------------------------------------------------------------- +proc mndb_get { unick uhand uindex } { +global mndb_file + +set ifound 0 +set iindex 0 +set iresults {} +set nresults 0 + +### Create the database file if it does not exist yet +set fd [open $mndb_file a+] +close $fd + +### OK. The quote is valid, but let's check if we already know it. +set fd [open $mndb_file r] + +if {$uindex == ""} { +### Log search + mndb_log "$unick/$uhand get random quote" + +### Do search + while {![eof $fd]} { + gets $fd foo + incr nresults + lappend iresults $foo + } + + set foo [split [lindex $iresults [rand $nresults]] "|"] + set ifound 1 + +} else { +### Log search + mndb_log "$unick/$uhand searched quote #$uindex" + +### Do search + while {![eof $fd] && !$ifound} { + gets $fd foo + set foo [split $foo "|"] + + if {[lindex $foo 0] == $uindex} { + set ifound 1 + } + } +} + +### Close file +close $fd + +### Return result +if {$ifound} { + return "#[lindex $foo 0]: [lindex $foo 1]" + } else { + return "ei löydy." + } +} + + +#------------------------------------------------------------------------- +proc mndb_search {unick uhand uchan utext upublic} { +global mndb_showmax_pub spmsg_nomatch + +### Log search + mndb_log "$unick/$uhand searched quote: $utext" + +### Parse the given command + set footokens [split $utext " "] + foreach ftoken $footokens { + set foomark [string range $ftoken 0 0] + set foopat [string range $ftoken 1 end] + + if {$foomark == "-" || $foomark == "+" || $foomark == "%"} { + lappend ipatlist "$foomark *$foopat*" + } else { + lappend ipatlist "+ *$ftoken*" + } + } + + +### Get the matches + + set iresults [mndb_find $ipatlist $mndb_showmax_pub] + +### Show the results + if {$iresults != ""} { + foreach i $iresults { + set foo [split $i "|"] + mndb_msg $upublic $unick $uchan "#[lindex $foo 0]: [lindex $foo 1]" + } + +# If no quotes were found + } else { + mndb_msg $upublic $unick $uchan "ei löydy." + } +} + + +#------------------------------------------------------------------------- +proc mndb_pub_mn {unick uhost uhand uchan utext} { + +mndb_msg 0 $uchan "" [mndb_get $unick $uhand $utext] +} + + +#------------------------------------------------------------------------- +proc mndb_msg_mn {unick uhost uhand utext} { + +mndb_msg 0 $unick "" [mndb_get $unick $uhand $utext] +} + + +#------------------------------------------------------------------------- +proc mndb_pub_add {unick uhost uhand uchan utext} { + + mndb_add $utext $unick $uhost $uchan 1 +} + + +#------------------------------------------------------------------------- +proc mndb_pub_rm {unick uhost uhand uchan utext} { + + mndb_rm $utext $unick $uhost $uchan 1 +} + + +#------------------------------------------------------------------------- +proc mndb_pub_find {unick uhost uhand uchan utext} { + + mndb_search $unick $uhand $uchan $utext 1 +} + + +#------------------------------------------------------------------------- +proc mndb_msg_find {unick uhost uhand utext} { + + mndb_search $unick $uhand "" $utext 0 +} + + +#------------------------------------------------------------------------- + +# end of script