From 985dcb2901d2527b79976df787035425294200b9 Mon Sep 17 00:00:00 2001 From: fireonlive Date: Fri, 9 Aug 2024 19:04:10 +0000 Subject: init --- remind.tcl | 330 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 remind.tcl (limited to 'remind.tcl') diff --git a/remind.tcl b/remind.tcl new file mode 100644 index 0000000..edd6fd7 --- /dev/null +++ b/remind.tcl @@ -0,0 +1,330 @@ +################################################ +#################### ABOUT ##################### +################################################ +# +# Reminder-0.2 by Fredrik Bostrom +# for Eggdrop IRC bot +# +# Usage: +# !remind nick time message +# - creates a new reminder for nick in the +# current channel at time with message +# - time is a format parseable by the tcl +# command 'clock scan'. If the time consists +# of several words, it has to be enclosed +# in "". +# - examples: +# !remind morbaq "tomorrow 10:00" Call Peter +# !remind morbaq "2009-12-31 23:59" Happy new year! +# +# !reminders +# - lists all active reminders +# +# !cancelReminder id +# - cancels the reminder with id +# - the id is the number preceeding the +# reminder in the list produced by +# !reminders +# - note: the id may change as new reminders +# are added or old reminders removed. Always +# check the id just before cancelling +# +# +################################################ +################ CONFIGURATION ################# +################################################ + +set datafile "scripts/reminders.dat" + +################################################ +######## DON'T EDIT BEOYND THIS LINE! ########## +################################################ + +bind pub - "!clockscan" pub:clockscan +bind pub - "!remind" pub:newReminder +bind pub - "!remindme" pub:newReminderfornick +bind pub - "!reminders" pub:getReminders +bind pub n "!cancelReminder" pub:cancelReminder +bind pub n "\$inspectReminders" pub:inspectReminders + +array set reminders {} + +# save to file +proc saveReminders {} { + global reminders + global datafile + + set file [open $datafile w+] + puts $file [array get reminders] + close $file +} + +# the run-at-time procedure +proc at {time args} { + if {[llength $args]==1} { + set args [lindex $args 0] + } + set dt [expr {($time - [clock seconds])*1000}] + return [after $dt $args] +} + +proc printReminder {reminderId {tonick ""} {fire "false"}} { + global reminders + + # get the reminder + set reminder $reminders($reminderId) + + set when [clock format [lindex $reminder 0] -format "%Y-%m-%dT%H:%M:%SZ"] + set chan [lindex $reminder 1] + set who [lindex $reminder 2] + set timer [lindex $reminder 3] + set what [lindex $reminder 4] + + if {$fire} { + putserv "PRIVMSG $chan :\[remind\] $who: $what" + } else { + putserv "NOTICE $tonick :\[remind\] $reminderId: for $who at $when: $what" + } +} + +proc fireReminder {reminderId} { + global reminders + + printReminder $reminderId "" "true" + unset reminders($reminderId) + saveReminders +} + + +proc pub:clockscan {nick host handle chan text} { + set timeError "" + # parse parameters + set curTime [clock format [clock seconds] -format "%H:%M:%SZ" -gmt 1] + regsub -all {([0-9]+)y$} $text "\\1 years $curTime" text + regsub -all {([0-9]+)mo$} $text "\\1 months $curTime" text + regsub -all {([0-9]+)w$} $text "\\1 weeks $curTime" text + regsub -all {([0-9]+)d$} $text "\\1 days $curTime" text + regsub -all {([0-9]+)hr?$} $text {\1 hours} text + regsub -all {([0-9]+)m$} $text {\1 minutes} text + regsub -all {([0-9]+)s$} $text {\1 seconds} text + set time [catch {clock scan $text} timeResult] + + if {$time != 0} { + putserv "NOTICE $chan :\[remind\] unable to parse time: $timeResult" + return 1 + } + + set ISOTimeResult [clock format $timeResult -format "%Y-%m-%dT%H:%M:%SZ" -gmt 1] + + if {[clock seconds] > $timeResult} { + putserv "NOTICE $chan :\[clockscan\] error: \"$text\" (parsed as $timeResult → $ISOTimeResult) is in the past" + return 1 + } + + putserv "NOTICE $chan :\[clockscan\] parsed \"$text\" as $timeResult → $ISOTimeResult" +} + + +proc pub:newReminderfornick {nick host handle chan text} { + global reminders + + + set timeError "" + # parse parameters + set id [clock seconds] + set who $nick + set when [lindex $text 0] + set curTime [clock format [clock seconds] -format "%H:%M:%SZ" -gmt 1] + regsub -all {([0-9]+)y$} $when "\\1 years $curTime" when + regsub -all {([0-9]+)mo$} $when "\\1 months $curTime" when + regsub -all {([0-9]+)w$} $when "\\1 weeks $curTime" when + regsub -all {([0-9]+)d$} $when "\\1 days $curTime" when + regsub -all {([0-9]+)hr?$} $when {\1 hours} when + regsub -all {([0-9]+)m$} $when {\1 minutes} when + regsub -all {([0-9]+)s$} $when {\1 seconds} when + set time [catch {clock scan $when} timeResult] + set what [lrange $text 1 end] + + if {$when == ""} { + putserv "NOTICE $chan :\[remind\] !remindme \"