08/01/2018, 14:16
J'ai fait rapidement ceci:
C'est pas optimisé, mais ça fonctionne :)
tcl
namespace eval planning {
variable plchan "#canal"
variable db "planning.db"
variable mem
bind msg - addpl ::planning::pladd
bind pub - !planning ::planning::pllist
proc pladd {nick uhost handle text} {
if {[llength [split $text]]<3} {
putserv "PRIVMSG $nick :La commande est /msg $::botnick addpl jj/mm/aaaa hh:min Description de l'évènement"
return 0
}
set date [lrange [split $text] 0 1]
set event [join [lrange [split $text] 2 end]]
if {$event==""} {
putserv "PRIVMSG $nick :Aucune description donnée..."
return 0
}
set ts [checkdate $date]
if {$ts == "E1"} {
putserv "PRIVMSG $nick :La date n'est pas formatée comme il faut"
return 0
} elseif {$ts == "E2"} {
putserv "PRIVMSG $nick :On ne peut pas planifier un évènement passé"
return 0
}
::planning::dbsave $ts $event
set strd [strftime "%d/%m/%Y %H:%M" $ts]
putserv "PRIVMSG $::planning::plchan :Nouvel évènement pour le $strd : $event"
return 1
}
proc pllist {nick uhost handle chan args} {
if { [string tolower $chan] != [string tolower $::planning::plchan]} {
putserv "PRIVMSG $nick :Pas sur le bon chan"
return 0
}
::planning::dbload
if {[llength $::planning::mem] < 1} {
putserv "PRIVMSG $::planning::plchan :Aucun évènement"
return 0
}
foreach line $::planning::mem {
foreach {t e} $line {
set strd [strftime "%d/%m/%Y %H:%M" $t]
putserv "PRIVMSG $::planning::plchan :$strd $e"
}
}
}
proc dbsave {ts event} {
set fo [open $::planning::db a]
puts $fo "$ts $event"
close $fo
::planning::dbload
}
proc dbload {} {
if {![file exists $::planning::db]} { return 0 }
set ::planning::mem [list]
set fi [open $::planning::db r]
set tmp [read -nonewline $fi]
close $fi
set tmp2 [list]
foreach line [split $tmp "\n"] {
set ts [lindex $line 0]
set event [lrange $line 1 end]
if {$ts >= [clock seconds]} {
lappend tmp2 [list $ts [join $event]]
}
}
set ::planning::mem [lsort -index 0 $tmp2]
unset tmp
}
proc checkdate {datetime} {
if {![regexp {([0-3]\d)/([01]\d)/((20)?\d{2})\ ([0-2]\d):([0-5]\d)} $datetime match day mon year cent H i]} {
# date mal formatée
return "E1"
}
set ts [clock scan "$mon/$day/$year $H:$i"]
if { $ts < [clock seconds]} {
# date dans le passé...
return "E2"
}
return $ts
}
proc init {} {
::planning::dbload
}
}
::planning::init
C'est pas optimisé, mais ça fonctionne :)