# ============================================= # !tell script for Eggdrop # Usage: !tell # Admin: /msg !cleartell (bot owners only) # ============================================= namespace eval tell { variable tellfile "scripts/tell.db" ;# storage file (relative to the eggdrop dir) variable maxpending 10 ;# max queued messages per nick (0 = unlimited) variable messages array set messages {} # Load queued messages from disk proc load {} { variable messages variable tellfile array unset messages array set messages {} if {![file exists $tellfile]} { return } if {[catch {open $tellfile r} fd]} { putlog "tell.tcl: cannot read $tellfile: $fd" return } fconfigure $fd -encoding utf-8 while {[gets $fd line] >= 0} { if {[string trim $line] eq ""} { continue } # each line is a clean Tcl list: target sender time message if {[catch {lassign $line target sender time message}]} { continue } if {$target eq ""} { continue } lappend messages([string tolower $target]) [list $sender $time $message] } close $fd } # Persist queued messages to disk proc save {} { variable messages variable tellfile if {[catch {open $tellfile w} fd]} { putlog "tell.tcl: cannot write $tellfile: $fd" return } fconfigure $fd -encoding utf-8 foreach target [array names messages] { foreach m $messages($target) { lassign $m sender time message puts $fd [list $target $sender $time $message] } } close $fd } # !tell proc do_tell {nick uhost hand chan text} { variable messages variable maxpending if {![regexp {^\s*(\S+)\s+(.+)$} $text -> target message]} { puthelp "PRIVMSG $chan :Usage: !tell " return } set message [string trim $message] set ltarget [string tolower $target] if {$maxpending > 0 && [info exists messages($ltarget)] \ && [llength $messages($ltarget)] >= $maxpending} { puthelp "PRIVMSG $chan :$nick: $target already has $maxpending messages waiting - try again later." return } set timestamp [clock format [clock seconds] -gmt 1 -format "%d/%m %H:%M GMT"] lappend messages($ltarget) [list $nick $timestamp $message] save puthelp "PRIVMSG $chan :$nick: noted. $target will be told the next time they're around." } # Deliver queued messages (on join or when the user speaks) proc deliver {nick uhost hand chan {text ""}} { variable messages set lnick [string tolower $nick] if {![info exists messages($lnick)] || [llength $messages($lnick)] == 0} { return } foreach m $messages($lnick) { lassign $m sender time message puthelp "PRIVMSG $chan :$nick: $sender left you a message on $time - $message" } unset messages($lnick) save } # !cleartell (owner only via private message) proc clear_tells {nick uhost hand text} { variable messages set n 0 foreach t [array names messages] { incr n [llength $messages($t)] } array unset messages array set messages {} save puthelp "PRIVMSG $nick :Cleared $n pending message(s)." } bind pub - "!tell" ::tell::do_tell bind join - * ::tell::deliver bind pubm - * ::tell::deliver ;# deliver when the user next speaks bind msg o "!cleartell" ::tell::clear_tells load putlog "tell.tcl loaded - !tell system active" }