imapfilter/src/account.lua
Lefteris Chatzimparmpas d7f2910212 Correct current selected mailbox functionality
Correct the functionality that provides monitoring of the current
selected mailbox in each account, where the wrong variable was written.

Simplify and clarify the code around this functionality.
2011-04-04 23:48:23 +02:00

242 lines
5.5 KiB
Lua

-- The Account class represents an IMAP account.
Account = {}
IMAP = Account
imap = Account
Account._mt = {}
setmetatable(Account, Account._mt)
Account._mt.__call = function (self, arg)
_check_required(arg.server, 'string')
_check_required(arg.username, 'string')
_check_optional(arg.password, 'string')
_check_optional(arg.port, 'number')
_check_optional(arg.ssl, 'string')
local object = {}
object._type = 'account'
for key, value in pairs(Account) do
if (type(value) == 'function') then
object[key] = value
end
end
object._mt = {}
object._mt.__index = object._attach_mailbox
setmetatable(object, object._mt)
object._imap = arg
object._selected = nil
return object
end
function Account._login_user(self)
if (self._imap.password == nil) then
self._imap.password = get_password('Enter password for ' ..
self._imap.username .. '@' .. self._imap.server .. ': ')
end
local r = ifcore.login(self._imap)
if (r == nil) then
return true
elseif (r == true) then
self._selected = nil
return true
elseif (r == false) then
return false
end
end
function Account._attach_mailbox(self, mailbox)
self[mailbox] = Mailbox(self, mailbox)
return self[mailbox]
end
function Account._detach_mailbox(self, mailbox)
self[mailbox] = nil
end
function Account.list_all(self, folder, mbox)
_check_optional(folder, 'string')
_check_optional(mbox, 'string')
if (folder == nil) then
folder = ''
else
if (type(options) == 'table' and options.namespace == true) then
if (folder == '/') then
folder = ''
end
if (folder ~= '') then
folder = folder .. '/'
end
end
end
if (mbox == nil) then
mbox = '%'
end
if (self._login_user(self) ~= true) then
return
end
local _, mailboxes, folders = ifcore.list(self._imap, '', folder .. mbox)
local m = {}
for s in string.gmatch(mailboxes, '%C+') do
table.insert(m, s)
end
local f = {}
for s in string.gmatch(folders, '%C+') do
if s ~= folder and s ~= folder .. '/' then
table.insert(f, s)
end
end
return m, f
end
function Account.list_subscribed(self, folder, mbox)
_check_optional(folder, 'string')
_check_optional(mbox, 'string')
if (folder == nil) then
folder = ''
else
if (type(options) == 'table' and options.namespace == true) then
if (folder == '/') then
folder = ''
end
if (folder ~= '') then
folder = folder .. '/'
end
end
end
if (mbox == nil) then
mbox = '*'
end
if (self._login_user(self) ~= true) then
return
end
local _, mailboxes, folders = ifcore.lsub(self._imap, '', folder .. mbox)
local m = {}
for s in string.gmatch(mailboxes, '%C+') do
table.insert(m, s)
end
local f = {}
for s in string.gmatch(folders, '%C+') do
if s ~= folder and s ~= folder .. '/' then
table.insert(f, s)
end
end
return m, f
end
function Account.create_mailbox(self, name)
_check_required(name, 'string')
if (self._login_user(self) ~= true) then
return
end
local r = ifcore.create(self._imap, name)
if (type(options) == 'table' and options.info == true) then
print(string.format("Created mailbox %s@%s/%s.",
self._imap.username, self._imap.server, name))
end
return r
end
function Account.delete_mailbox(self, name)
_check_required(name, 'string')
if (self._login_user(self) ~= true) then
return
end
local r = ifcore.delete(self._imap, name)
if (type(options) == 'table' and options.info == true) then
print(string.format("Deleted mailbox %s@%s/%s.",
self._imap.username, self._imap.server, name))
end
return r
end
function Account.rename_mailbox(self, oldname, newname)
_check_required(oldname, 'string')
_check_required(newname, 'string')
if (self._login_user(self) ~= true) then
return
end
local r = ifcore.rename(self._imap, oldname, newname)
if (type(options) == 'table' and options.info == true) then
print(string.format("Renamed mailbox %s@%s/%s to %s@%s/%s.",
self._imap.username, self._imap.server, oldname,
self._imap.username, self._imap.server, newname))
end
return r
end
function Account.subscribe_mailbox(self, name)
_check_required(name, 'string')
if (self._login_user(self) ~= true) then
return
end
local r = ifcore.subscribe(self._imap, name)
if (type(options) == 'table' and options.info == true) then
print(string.format("Subscribed mailbox %s@%s/%s.",
self._imap.username, self._imap.server, name))
end
return r
end
function Account.unsubscribe_mailbox(self, name)
_check_required(name, 'string')
if (self._login_user(self) ~= true) then
return
end
local r = ifcore.unsubscribe(self._imap, name)
if (type(options) == 'table' and options.info == true) then
print(string.format("Unsubscribed mailbox %s@%s/%s.",
self._imap.username, self._imap.server, name))
end
return r
end
Account._mt.__index = function () end
Account._mt.__newindex = function () end