X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/8d37b9a1e4521a220f20ce2e1414f656aa3a5015..a56c60dacef900097509cfa8f36d4a76952a69f8:/widgets/imap.lua?ds=inline

diff --git a/widgets/imap.lua b/widgets/imap.lua
index 2c7067c..39518bd 100644
--- a/widgets/imap.lua
+++ b/widgets/imap.lua
@@ -11,121 +11,77 @@ 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
 
 -- Mail IMAP check
 -- lain.widgets.imap
-local imap = { stored = nil }
+local imap = {}
 
-function worker(args)
+local function worker(args)
     local args     = args or {}
 
     local server   = args.server
     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
 
-    widget = wibox.widget.textbox('')
+    imap.widget = wibox.widget.textbox('')
 
     function update()
-        to_execute = string.format("%s -s %s -u %s -p %s --port %s",
-                     checkmail, server, mail, password, port) 
+        mail_notification_preset = {
+            icon     = helpers.icons_dir .. "mail.png",
+            position = "top_left"
+        }
 
-        if encoding ~= nil
-        then
-            to_execute = string.format("%s --encoding %s",
-                         to_execute, 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()
 
-        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
-
-        notification_preset = {
-            icon     = helpers.icons_dir .. "mail.png",
-            timeout  = 8,
-            position = "top_left"
-        }
+        _, 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
+
+        helpers.set_map(mail, mailcount)
     end
 
     helpers.newtimer(mail, timeout, update, true)
-
-    return widget
+    return imap.widget
 end
 
 return setmetatable(imap, { __call = function(_, ...) return worker(...) end })