X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/52a50fafa078c4fb715c7d274d875ff37e6d96f8..b7e11ca57eece06f8edc222bb0d928a6a16c1aeb:/widgets/imap.lua?ds=inline

diff --git a/widgets/imap.lua b/widgets/imap.lua
index f06660b..39518bd 100644
--- a/widgets/imap.lua
+++ b/widgets/imap.lua
@@ -6,160 +6,82 @@
                                                   
 --]]
 
-local markup       = require("lain.util.markup")
 local helpers      = require("lain.helpers")
 
-local awful        = require("awful")
-local beautiful    = require("beautiful")
 local naughty      = require("naughty")
 local wibox        = require("wibox")
 
-local io           = io
+local io           = { popen  = io.popen }
+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 = {} 
+local imap = {}
 
-function worker(args)
-    local args = args or {}
+local function worker(args)
+    local args     = args or {}
 
-    local server = args.server
-    local mail = args.mail
+    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 = args.color or beautiful.fg_focus or "#FFFFFF"
-    local mail_encoding = args.mail_encoding or nil
-    local maxlen = args.maxlen or 200
-    local app = args.app or "mutt"
+    local port     = args.port or 993
+    local timeout  = args.timeout or 60
     local is_plain = args.is_plain or false
-    local shadow = args.shadow 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 1 -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", "")
+        password = f:read("*all"):gsub("\n", "")
         f:close()
     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, " 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
-        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:%s %s -k",
+               head_command, server, port, mail, password, request)
 
-        f = io.popen(to_execute)
+        f = io.popen(curl)
         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, "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
+        _, mailcount = string.gsub(ws, "%d+", "")
+        _ = nil
 
-            myimapcheck:set_markup(" " .. markup(header_color, header) ..
-                                   markup(color, mailcount) .. " ")
-
-            if 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", "")
-                end
-
-                naughty.notify({ title = notify_title,
-                                 fg = color,
-                                 text = ws,
-                                 icon = beautiful.lain_mail_notify or
-                                        helpers.icons_dir .. "mail.png",
-                                 timeout = 8,
-                                 position = "top_left" })
-
-                helpers.set_map(mail, false)
+        widget = imap.widget
+        settings()
+
+        if mailcount > helpers.get_map(mail) and mailcount >= 1
+        then
+            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
-    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.set_map(mail, mailcount)
+    end
 
-    return myimapcheck
+    helpers.newtimer(mail, timeout, update, true)
+    return imap.widget
 end
 
 return setmetatable(imap, { __call = function(_, ...) return worker(...) end })