X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/0ef82f83e0baaa2936b6204a24ee3b3b638fd409..cc7173f060ca66885794b4584c8bcb0fa2a0dc38:/widgets/imap.lua?ds=sidebyside

diff --git a/widgets/imap.lua b/widgets/imap.lua
index 9821cb3..39518bd 100644
--- a/widgets/imap.lua
+++ b/widgets/imap.lua
@@ -11,10 +11,10 @@ local helpers      = require("lain.helpers")
 local naughty      = require("naughty")
 local wibox        = require("wibox")
 
-local io           = { popen = io.popen }
+local io           = { popen  = io.popen }
+local string       = { format = string.format,
+                       gsub   = string.gsub }
 local tonumber     = tonumber
-local string       = { len    = string.len,
-                       format = string.format }
 
 local setmetatable = setmetatable
 
@@ -29,102 +29,58 @@ local function worker(args)
     local mail     = args.mail
     local password = args.password
 
-    local port     = args.port or "993"
+    local port     = args.port or 993
     local timeout  = args.timeout or 60
-    local encoding = args.encoding or nil
-    local maxlen   = args.maxlen or 200
     local is_plain = args.is_plain or false
     local settings = args.settings or function() end
 
-    local checkmail = helpers.scripts_dir .. "checkmail"
+    local head_command  = "curl --connect-timeout 1 -fsm 3"
+    local request = "-X 'SEARCH (UNSEEN)'"
 
-    helpers.set_map(mail, true)
-    helpers.set_map(mail .. " count", "0")
+    helpers.set_map(mail, 0)
 
     if not is_plain
     then
-        if not imap.stored
-        then
-            local f = io.popen(password)
-            password = f:read("*all"):gsub("\n", ""):gsub("\r", "")
-            f:close()
-            imap.stored = password
-        else
-            password = imap.stored
-        end
+        local f = io.popen(password)
+        password = f:read("*all"):gsub("\n", "")
+        f:close()
     end
 
     imap.widget = wibox.widget.textbox('')
 
-    notification_preset = {
-        icon     = helpers.icons_dir .. "mail.png",
-        timeout  = 8,
-        position = "top_left"
-    }
+    function update()
+        mail_notification_preset = {
+            icon     = helpers.icons_dir .. "mail.png",
+            position = "top_left"
+        }
 
-    function imap.update()
-        to_execute = string.format("%s -s %s -u %s -p %s --port %s",
-                     checkmail, server, mail, password, port) 
+        curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:%s %s -k",
+               head_command, server, port, mail, password, request)
 
-        if encoding ~= nil
-        then
-            to_execute = string.format("%s --encoding %s",
-                         to_execute, encoding)
-        end
-
-        f = io.popen(to_execute)
+        f = io.popen(curl)
         ws = f:read("*all")
         f:close()
 
-        mailcount = "0"
-
-        if ws:find("No new messages") ~= nil
-        then
-            helpers.set_map(mail, true)
-        elseif ws:find("CheckMailError: invalid credentials") ~= nil
-        then
-            helpers.set_map(mail, true)
-            mailcount = "invalid credentials"
-        else
-            mailcount = ws:match("%d") or "0"
-            if helpers.get_map(mail .. " count") ~= mailcount and mailcount ~= "0"
-            then
-                helpers.set_map(mail, true)
-                helpers.set_map(mail .. " count", mailcount)
-            end
-        end
+        _, mailcount = string.gsub(ws, "%d+", "")
+        _ = nil
 
         widget = imap.widget
         settings()
 
-        if helpers.get_map(mail) and tonumber(mailcount) >= 1
+        if mailcount > helpers.get_map(mail) and mailcount >= 1
         then
-            notify_title = ws:match(mail .. " has %d new message.?")
-            ws = ws:gsub(notify_title, "", 1):gsub("\n", "", 2)
-
-            -- trying to remove useless infos
-            ws = ws:gsub("--Content.%S+.-\n", "")
-            ws = ws:gsub("--%d+.-\n", "")
-
-            if string.len(ws) > maxlen
-            then
-                ws = ws:sub(1, maxlen) .. "[...]"
+            if mailcount == 1 then
+                nt = mail .. " has one new message"
+            else
+                nt = mail .. " has <b>" .. mailcount .. "</b> new messages"
             end
-
-            notify_title = notify_title:gsub("\n", "")
-
-            naughty.notify({
-                preset = notification_preset,
-                title = notify_title,
-                text = ws
-            })
-
-            helpers.set_map(mail, false)
+            naughty.notify({ preset = mail_notification_preset, text = nt })
         end
-    end
 
-    helpers.newtimer(mail, timeout, imap.update, true)
+        helpers.set_map(mail, mailcount)
+    end
 
+    helpers.newtimer(mail, timeout, update, true)
     return imap.widget
 end