diff --git a/README b/README index 1a33232..1206353 100644 --- a/README +++ b/README @@ -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 diff --git a/mboxc.lua b/mboxc.lua new file mode 100644 index 0000000..b549b69 --- /dev/null +++ b/mboxc.lua @@ -0,0 +1,57 @@ +---------------------------------------------------------- +-- Licensed under the GNU General Public License version 2 +-- * Copyright (C) 2009 Adrian C. +---------------------------------------------------------- + +-- {{{ 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 +-- }}}