aboutsummaryrefslogtreecommitdiff
path: root/gmail.lua
diff options
context:
space:
mode:
authorAdrian C. (anrxc) <anrxc@sysphere.org>2009-09-08 22:46:59 +0200
committerAdrian C. (anrxc) <anrxc@sysphere.org>2009-09-08 22:46:59 +0200
commit161607e5179fe3f8151d56752cf2d46963ff1aa3 (patch)
treea3d7063932fe2a5f2c094b2d8f7beb32b8f5c874 /gmail.lua
parente5c980e58a3b6ca7f369ac87ab8f1fa897bb504d (diff)
downloadvicious-legacy-161607e5179fe3f8151d56752cf2d46963ff1aa3.tar.xz
Gmail widget included
Widget returns the count of new and subject of last e-mail in a Gmail inbox. Use ${count} and ${subject} in the format string to retrieve the values. Widget takes a table with login information as an argument. I don't like how gmail widgets handle sensitive data but I gave in seeing how popular they are. Better storing and handling of login information would be in order but this isn't Python and I'm out of ideas. For now use it on your own responsability, I would suggest to set login info directly in the widget and file as read-only by user.
Diffstat (limited to 'gmail.lua')
-rw-r--r--gmail.lua55
1 files changed, 55 insertions, 0 deletions
diff --git a/gmail.lua b/gmail.lua
new file mode 100644
index 0000000..98fb40d
--- /dev/null
+++ b/gmail.lua
@@ -0,0 +1,55 @@
+----------------------------------------------------------
+-- Licensed under the GNU General Public License version 2
+-- * Copyright (C) 2009 Adrian C. <anrxc_sysphere_org>
+----------------------------------------------------------
+
+-- {{{ Grab environment
+local io = { popen = io.popen }
+local setmetatable = setmetatable
+local helpers = require("vicious.helpers")
+-- }}}
+
+
+-- Gmail: provides count of new and subject of last e-mail in a Gmail inbox
+module("vicious.gmail")
+
+
+-- {{{ Gmail widget type
+local function worker(format, login)
+ -- Initialise tables
+ local mail = {
+ ["{count}"] = "0",
+ ["{subject}"] = "N/A"
+ }
+
+ -- Todo: find a safer way to do this
+ local auth = login[1] .. ":" .. login[2]
+
+ -- Get info from the Gmail atom feed
+ local f = io.popen("curl --max-time 3 -fsu "..auth.." https://mail.google.com/mail/feed/atom")
+
+ -- Could be huge don't read it all at once, info we are after is at the top
+ for line in f:lines() do
+ mail["{count}"] = line:match("<fullcount>([%d]+)</fullcount>") or mail["{count}"]
+
+ -- Find subject tags
+ local title = line:match("<title>(.*)</title>")
+ -- If the subject changed then break out of the loop
+ if title ~= nil and -- Ignore the feed title
+ title ~= "Gmail - Inbox for "..login[1].."@gmail.com" then
+ -- Spam sanitize the subject
+ title = helpers.escape(title)
+ -- Don't abuse the wibox, truncate, then store
+ mail["{subject}"] = helpers.truncate(title, 22)
+ -- By this point we have the count, it comes before
+ -- messages and always matches, at least 0
+ break
+ end
+ end
+ f:close()
+
+ return mail
+end
+-- }}}
+
+setmetatable(_M, { __call = function(_, ...) return worker(...) end })