diff --git a/Changes.md b/Changes.md index 3ca064e..a506ea2 100644 --- a/Changes.md +++ b/Changes.md @@ -16,7 +16,7 @@ Added: Fixed: -- [volume] Deprecate `io.popen` +- [volume,gmail] Deprecate `io.popen` - [mpd] Lua 5.3 compatibility (for real this time); also correct a typo - [pkg,weather,contrib/btc] Allow function call without Awesome - [pkg] Use more updated front-ends for Debian/Ubuntu (apt) and Fedora (dnf) diff --git a/widgets/gmail_all.lua b/widgets/gmail_all.lua index db868c3..7e897b8 100644 --- a/widgets/gmail_all.lua +++ b/widgets/gmail_all.lua @@ -6,12 +6,10 @@ -- {{{ Grab environment local type = type local tonumber = tonumber -local io = { popen = io.popen } -local setmetatable = setmetatable +local string = { match = string.match } + local helpers = require("vicious.helpers") -local string = { - match = string.match -} +local spawn = require("vicious.spawn") -- }}} @@ -19,59 +17,33 @@ local string = { -- vicious.widgets.gmail local gmail_all = {} - --- {{{ Variable definitions -local rss = { - inbox = "https://mail.google.com/mail/feed/atom", - unread = "https://mail.google.com/mail/feed/atom/unread", - --labelname = "https://mail.google.com/mail/feed/atom/labelname", -} - --- Default is just Inbox -local feed = rss.inbox -local mail = { - ["{count}"] = 0, - ["{subject}"] = "N/A" -} --- }}} - - -- {{{ Gmail widget type -local function worker(format, warg) - -- Get info from the Gmail atom feed - local f = io.popen("curl --connect-timeout 1 -m 3 -fsn " .. helpers.shellquote(feed)) - - -- Could be huge don't read it all at once, info we are after is at the top - local xml = f:read(2000) - - if xml == nil then - return mail - end - - mail["{count}"] = -- Count comes before messages and matches at least 0 - tonumber(string.match(xml, "([%d]+)")) or mail["{count}"] +local function parse(warg, stdout, stderr, exitreason, exitcode) + local count = -- Count comes before messages and matches at least 0 + tonumber(string.match(stdout, "([%d]+)")) or 0 -- Find subject tag - local title = string.match(xml, ".-(.-)") + local title = string.match(stdout, ".-(.-)") or "N/A" - if title ~= nil then - -- Check if we should scroll, or maybe truncate - if warg then - if type(warg) == "table" then - title = helpers.scroll(title, warg[1], warg[2]) - else - title = helpers.truncate(title, warg) - end - end - - -- Spam sanitize the subject and store - mail["{subject}"] = title + -- Check if we should scroll, or maybe truncate + if type(warg) == "number" then + title = helpers.truncate(title, warg) + elseif type(warg) == "table" then + title = helpers.scroll(title, warg[1], warg[2]) end - f:close() + return { ["{count}"] = count, ["{subject}"] = title } +end - return mail +function gmail_all.async(format, warg, callback) + -- Get info from the Gmail atom feed using curl --netrc. + -- With username 'user' and password 'pass' + -- $HOME/.netrc should look similar to: + -- machine mail.google.com login user password pass + -- BE AWARE THAT MAKING THESE SETTINGS IS A SECURITY RISK! + spawn.easy_async("curl -fsn https://mail.google.com/mail/feed/atom", + function (...) callback(parse(warg, ...)) end) end -- }}} -return setmetatable(gmail_all, { __call = function(_, ...) return worker(...) end }) +return helpers.setasyncall(gmail_all)