tkgoodstuff/tcl/BiffMH.tcl

245 lines
5.6 KiB
Tcl
Raw Normal View History

# method for MH folders
# Written by Gary Dezern (gdezern@uniquecr.sundial.net)
# and M. Crimmins.
# array BiffMH():
# mh_path - path to MH binaries
# path - path to MH folders (usually just "Mail")
# seq - name of the unseen-sequence. (usually "unseen")
# scan - command line for calling 'scan'
# rcvstore - preferences switch. 1 if MH's rcvstore is used
# to incorporate new mail into folders (in that case, we
# look at unseen-sequence; otherwise look at atimes/mtimes).
proc BiffMHInit {} {
global BiffMH env
if [Empty $BiffMH(mh_path)] {
foreach dir [split $env(PATH) :] {
lappend mhpath "${dir}/mh$"
}
foreach dir \
[concat [split $env(PATH) :] $mhpath /usr/local/bin/mh] {
if [file exists $dir/mhparam] {
set BiffMH(mh_path) $dir
}
}
}
if ![file exists $BiffMH(mh_path)/mhparam] {
TKGNotice "Biff: Cannot find directory of MH binaries.
Set it by hand in the preferences manager."
return
}
set env(PATH) [set BiffMH(mh_path)]:$env(PATH)
set BiffMH(path) Mail
set BiffMH(scan) scan
if [string length $BiffMH(scan_params)] {
lappend BiffMH(scan) $BiffMH(scan_params)
}
if !$BiffMH(rcvstore) return
if [catch "exec mhparam unseen-sequence" BiffMH(seq)] {
TKGError "Biff: Unable to locate MH unseen-sequence.
Please verify your MH setup: in your ~/.mh-profile you
should have a line like \"Unseen-Sequence: u\"."
}
if [catch "exec mhparam mh-sequences" BiffMH(mhseq)] {
set BiffMH(mhseq) ".mh_sequences"
}
}
proc BiffMHFolderInit {f} {
global BiffMH Biff
set folder $Biff($f,folder)
set Biff($f,mtime) 0
set Biff($f,oldmtime) 0
if [string match [string index $folder 0] +] {
if [catch "exec mhpath $folder" fpath] {
TKGError "Unable to locate path to $folder: $fpath"
return
}
} else {
set fpath $folder
}
set Biff($f,path) "$fpath"
if $BiffMH(rcvstore) {
global BiffMH(mhseq)
set Biff($f,seqpath) "$fpath/$BiffMH(mhseq)"
}
}
proc BiffMHTest {f} {
global Biff Biff-params BiffMH
set folder $Biff($f,folder)
if $BiffMH(rcvstore) {
set testfile $Biff($f,seqpath)
} else {
set testfile $Biff($f,path)
}
if ![file exists $testfile] {
if $Biff(count) {
BiffCountLabel $f 0
}
return 0
}
set t [file mtime $testfile]
if {$t > $Biff($f,mtime)} {
set Biff($f,oldmtime) $Biff($f,mtime)
set Biff($f,mtime) $t
if $BiffMH(rcvstore) {
return [BiffMHseqcheck $f]
} else {
return [BiffMHatimecheck $f]
}
} else {
return nochange
}
}
proc BiffMHIgnore {f} {
global Biff
set dir $Biff($f,path)
if [file exists $dir] {
set Biff(f,mtime) [file mtime $dir]
}
}
proc BiffMHatimecheck {f {getlist 0}} {
global Biff BiffMH
set dir $Biff($f,path)
set Biff($f,unseen) ""
foreach file [glob -nocomplain $dir/*] {
if {[catch {expr [file tail $file]}] || [file isdirectory $file]} continue
file stat $file a
if {$a(atime) <= $a(mtime)} {
if {!$Biff(count) && !$getlist} {return 1}
lappend Biff($f,unseen) [file tail $file]
}
}
set n [llength $Biff($f,unseen)]
if $Biff(count) {
BiffCountLabel $f $n
}
return [expr $n > 0]
}
proc BiffMHseqcheck {f} {
global BiffMH Biff
set Biff($f,unseen) ""
if ![file exists $Biff($f,seqpath)] {return 0}
if [catch {open $Biff($f,seqpath)} inf] {
return 0
}
fconfigure $inf -blocking 0
while {![eof $inf]} {
gets $inf line
if [string match $BiffMH(seq):* $line] {
if { [llength $line] > 1 } {
set Biff($f,unseen) "[lrange $line 1 end]"
}
}
}
close $inf
set unseen [BiffMHSeqTrans $Biff($f,unseen)]
set n [llength $unseen]
if $Biff(count) {
BiffCountLabel $f $n
}
set new 0
foreach msg $unseen {
if {[file mtime $Biff($f,path)/$msg] > $Biff($f,oldmtime)} {
set new 1
break
}
}
return $new
}
proc BiffMHScan {f} {
global BiffMH Biff
set dir $Biff($f,path)
if $BiffMH(rcvstore) {
BiffMHseqcheck $f
} else {
BiffMHatimecheck $f 1
exec touch -m $dir
}
set unseen [lsort -integer [BiffMHSeqTrans $Biff($f,unseen)]]
if $Biff($f,listall) {
set pwd [pwd]
cd $Biff($f,path)
set msglist [lsort -integer [glob -nocomplain \[0-9\]*]]
cd $pwd
} else {
set msglist $unseen
}
foreach mnum $msglist {
set id [open $dir/$mnum]
set from($mnum) ""
set subject($mnum) ""
set new($mnum) [In $mnum $unseen]
while {[gets $id l] != -1} {
switch -glob -- $l {
"From*" {
regexp "^From: *(.*)" "$l" v from($mnum)
} "Subject: *" {
regexp "^Subject: *(.*)" "$l" v subject($mnum)
} "" { break }
}
}
close $id
}
set frmlist ""
foreach i $msglist {
lappend frmlist [list $from($i) $subject($i) $new($i) $i]
}
return $frmlist
}
proc BiffMHGetMessage {f mnum} {
global BiffMH Biff
catch {exec $BiffMH(mh_path)/show $Biff($f,folder) $mnum -noshowproc} out
return $out
}
proc BiffMHSeqTrans {seq} {
set ret ""
foreach item $seq {
if {[llength [set s [split $item -]]] == 1} {
lappend ret $item
} else {
for {set i [lindex $s 0]} {$i <= [lindex $s 1]} {incr i} {
lappend ret $i
}
}
}
return $ret
}
proc BiffMHExmh {f} {
global Biff Fvwm
if {[In exmh [winfo interps]]} {
set box [string trimleft $Biff($f,folder) +]
if {[string match inbox $box] || [string match INBOX $f]} {
send exmh "Inc"
send exmh "Folder_Change inbox"
} else {
send exmh "Folder_Change $box"
}
send exmh "Msg_ShowUnseen"
if {[info exists Fvwm(outid)]} {
FvwmNext exmh
} else {
send exmh "wm deiconify .; raise ."
}
} else {
exec exmh &
}
}
DEBUG "Loaded BiffMH.tcl"