Mbox mail count widget included.

The, mboxc, widget supplements the mbox widget. The mbox widget
returns the subject of the last e-mail in a mbox, while the mboxc
widget returns the count of total, old and new messages. Dealing with
potentially *HUGE* files is not easy, I tried to find some middle
ground for now, comments in the file discuss it in detail. Having the
LuaFileSystem lib would be nice, so we could do caching and avoid 90%
of the reads, but I didn't rely on external libraries to this point so
I'm not going to start now.
This commit is contained in:
Adrian C. (anrxc) 2009-07-31 07:49:28 +02:00
parent dad393b94b
commit 475da04ed1
2 changed files with 61 additions and 0 deletions

4
README
View File

@ -122,6 +122,10 @@ vicious.widgets.mbox
- provides the subject of last e-mail in a mbox file
- takes the full path to the mbox as an argument
vicious.widgets.mboxc
- provides the count of total, old and new messages in a mbox
- takes the full path to the mbox as an argument
vicious.widgets.mdir
- provides a number of new and unread messages in a Maildir
structure

57
mboxc.lua Normal file
View File

@ -0,0 +1,57 @@
----------------------------------------------------------
-- Licensed under the GNU General Public License version 2
-- * Copyright (C) 2009 Adrian C. <anrxc_sysphere_org>
----------------------------------------------------------
-- {{{ Grab environment
local io = { open = io.open }
local string = { find = string.find }
-- }}}
-- Mboxc: provides the count of total, old and new messages in a mbox
module("vicious.mboxc")
-- {{{ Mbox count widget type
function worker(format, mbox)
-- Initialise counters
local old = 0
local total = 0
-- Open the mbox
--
-- If we had LuaFileSystem we could check the mtime and size of
-- the file and if they didn't change since the last read we could
-- return the old, cached, count. However, we didn't rely on extra
-- libraries to this point so we won't start now.
local f = io.open(mbox)
while true do
-- Read the mbox line by line, if we are going to read some
-- *HUGE* folders then switch to reading chunks. It's why we are
-- not reading the whole file at once in the first place.
local lines = f:read("*line")
if not lines then break end
-- Find all messages
-- * http://www.jwz.org/doc/content-length.html
local _, from = string.find(lines, "^From[%s]")
if from ~= nil then total = total + 1 end
-- Read messages have the Status header
local _, status = string.find(lines, "^Status:[%s]RO$")
if status ~= nil then old = old + 1 end
-- Skip the folder internal data
local _, intdata = string.find(lines, "^Subject:[%s].*FOLDER[%s]INTERNAL[%s]DATA")
if intdata ~= nil then total = total -1 end
end
f:close()
-- Substract total from old to get the new count
local new = total - old
return {total, old, new}
end
-- }}}