X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/7a4d6f5ffa594603ef83bc8b0e9945d12e082490..c1bbfdac79bf6a61fbf3cecb8b00f7c4a1b606a7:/widgets/imap.lua

diff --git a/widgets/imap.lua b/widgets/imap.lua
index 94652b6..ea763df 100644
--- a/widgets/imap.lua
+++ b/widgets/imap.lua
@@ -6,161 +6,89 @@
                                                   
 --]]
 
-local markup       = require("lain.util.markup")
 local helpers      = require("lain.helpers")
+local async        = require("lain.asyncshell")
 
-local awful        = require("awful")
-local beautiful    = require("beautiful")
 local naughty      = require("naughty")
 local wibox        = require("wibox")
 
-local io           = io
+local mouse        = mouse
+local string       = { format = string.format,
+                       gsub   = string.gsub }
 local tonumber     = tonumber
-local string       = string
 
 local setmetatable = setmetatable
 
--- Mail imap check
+-- Mail IMAP check
 -- lain.widgets.imap
-local imap = {} 
 
-function worker(args)
-    local args = args or {}
+local function worker(args)
+    local imap        = {}
+    local args        = args or {}
 
-    local server = args.server
-    local mail = args.mail
-    local password = args.password
+    local server      = args.server
+    local mail        = args.mail
+    local password    = args.password
 
-    local port = args.port or "993"
-    local refresh_timeout = args.refresh_timeout or 60
-    local header = args.header or " Mail "
-    local header_color = args.header_color or beautiful.fg_normal or "#FFFFFF"
-    local color_newmail = args.color_newmail or beautiful.fg_focus or "#FFFFFF"
-    local color_nomail = args.color_nomail or beautiful.fg_normal or "#FFFFFF"
-    local mail_encoding = args.mail_encoding or nil
-    local maxlen = args.maxlen or 200
-    local app = args.app or "mutt"
-    local is_plain = args.is_plain or false
-    local shadow = args.shadow or false
+    local port        = args.port or 993
+    local timeout     = args.timeout or 60
+    local is_plain    = args.is_plain or false
+    local followmouse = args.followmouse or false
+    local settings    = args.settings or function() end
 
-    helpers.set_map(mail, true)
-    helpers.set_map(mail .. " count", "0")
+    local head_command  = "curl --connect-timeout 3 -fsm 3"
+    local request = "-X 'SEARCH (UNSEEN)'"
 
-    local checkmail = helpers.scripts_dir .. "checkmail"
+    helpers.set_map(mail, 0)
 
     if not is_plain
     then
-        local f = io.popen(password)
-        password = f:read("*all"):gsub("\n", ""):gsub("\r", "")
-        f:close()
+        password = helpers.read_pipe(password):gsub("\n", "")
     end
 
-    local myimapcheck = wibox.widget.textbox()
+    imap.widget = wibox.widget.textbox('')
 
-    local myimapcheckupdate = function()
-        function set_nomail()
-            if shadow
-            then
-                myimapcheck:set_text('')
-            else
-                myimapcheck:set_markup(markup(color_nomail, " no mail "))
-            end
-        end
+    function update()
+        mail_notification_preset = {
+            icon     = helpers.icons_dir .. "mail.png",
+            position = "top_left"
+        }
 
-        conn = io.popen("ip link show")
-        check_conn = conn:read("*all") 
-        conn:close()
-
-        if not check_conn:find("state UP") then
-               set_nomail()
-               return
+        if followmouse then
+            mail_notification_preset.screen = mouse.screen
         end
 
-        to_execute = checkmail .. ' -s ' .. server ..
-                     ' -u ' .. mail .. ' -p ' .. password
-                     .. ' --port ' .. port
-
-        if mail_encoding ~= nil
-        then
-            to_execute = to_execute .. ' --encoding '
-                         .. mail_encoding
-        end
+        curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:%q %s -k",
+               head_command, server, port, mail, password, request)
 
-        f = io.popen(to_execute)
-        ws = f:read("*all")
-        f:close()
-
-        if ws:find("No new messages") ~= nil
-        then
-            helpers.set_map(mail, true)
-            set_nomail()
-        elseif ws:find("CheckMailError: invalid credentials") ~= nil
-        then
-            helpers.set_map(mail, true)
-            myimapcheck.set_markup(markup(header_color, header) ..
-                                   markup(color_newmail, "invalid credentials "))
-        else
-            mailcount = ws:match("%d") or "?"
-
-            if helpers.get_map(mail .. " count") ~= mailcount and mailcount ~= "?"
-            then
-                helpers.set_map(mail, true)
-                helpers.set_map(mail .. " count", mailcount)
-            end
+        async.request(curl, function(f)
+            _, mailcount = string.gsub(f, "%d+", "")
+            _ = nil
 
-            myimapcheck:set_markup(markup(header_color, header) ..
-                                   markup(color_newmail, mailcount) .. " ")
+            widget = imap.widget
+            settings()
 
-            if helpers.get_map(mail)
+            if mailcount >= 1 and mailcount > helpers.get_map(mail)
             then
-                if mailcount == "?"
-                -- May happens sometimes using keyrings or other password fetchers.
-                -- Since this should be automatically fixed in short times, we threat
-                -- this exception delaying the update to the next timeout.
-                then
-                    set_nomail()
-                    return
-                elseif tonumber(mailcount) >= 1
-                then
-                    notify_title = ws:match(mail .. " has %d new message.?")
-                    ws = ws:gsub(notify_title, "", 1):gsub("\n", "", 2)
-
-                    ws = ws:gsub("--Content.%S+.-\n", "")
-                    ws = ws:gsub("--%d+.-\n", "")
-
-                    if string.len(ws) > maxlen
-                    then
-                        ws = ws:sub(1, maxlen) .. "[...]"
-                    end
-
-                    notify_title = notify_title:gsub("\n", "")
+                if mailcount == 1 then
+                    nt = mail .. " has one new message"
+                else
+                    nt = mail .. " has <b>" .. mailcount .. "</b> new messages"
                 end
+                naughty.notify({
+                    preset = mail_notification_preset,
+                    text = nt
+                })
+            end
 
-                naughty.notify({ title = notify_title,
-                                 fg = color_newmail,
-                                 text = ws,
-                                 icon = beautiful.lain_mail_notify or
-                                        helpers.icons_dir .. "mail.png",
-                                 timeout = 8,
-                                 position = "top_left" })
+            helpers.set_map(mail, mailcount)
+        end)
 
-                helpers.set_map(mail, false)
-            end
-        end
     end
 
-    local myimapchecktimer = timer({ timeout = refresh_timeout })
-    myimapchecktimer:connect_signal("timeout", myimapcheckupdate)
-    myimapchecktimer:start()
-    myimapcheck:buttons(awful.util.table.join(
-        awful.button({}, 0,
-
-            function()
-                helpers.run_in_terminal(app)
-            end)
-    ))
+    helpers.newtimer(mail, timeout, update, true)
 
-    return myimapcheck
+    return setmetatable(imap, { __index = imap.widget })
 end
 
-return setmetatable(imap, { __call = function(_, ...) return worker(...) end })
+return setmetatable({}, { __call = function(_, ...) return worker(...) end })