From 4cd75de2ed52f4bc39ad52eee7d5155c6036ce0e Mon Sep 17 00:00:00 2001 From: luke bonham Date: Thu, 12 Sep 2013 02:26:48 +0200 Subject: [PATCH 1/1] new imap widget --- scripts/checkmail | 104 ------------------ widgets/bat.lua | 14 +-- widgets/imap.lua | 103 +++++------------ widgets/yawn/icons/ThunderintheVicinity.png | 1 + widgets/yawn/init.lua | 1 - widgets/yawn/localizations/it_IT | 1 + .../yawn/localizations/localization_template | 1 + 7 files changed, 39 insertions(+), 186 deletions(-) delete mode 100755 scripts/checkmail create mode 120000 widgets/yawn/icons/ThunderintheVicinity.png diff --git a/scripts/checkmail b/scripts/checkmail deleted file mode 100755 index 67c5206..0000000 --- a/scripts/checkmail +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/python - -# Simple email checker -# -# Wrote by copycat-killer on a rainy day of august 2013 -# to be used in Lain. -# -# https://github.com/copycat-killer/lain - -import sys, getopt, locale, imaplib - -def main(argv): - usage = "usage: checkmail -s -u -p [--port ] [--encoding ] [--cut]" - server = "" - user = "" - password = "" - port = 993 - cut = False - encoding = locale.getdefaultlocale()[1] - output = "" - - try: - opts, args = getopt.getopt(argv, "hs:u:p:", ["port=", "encoding=", "cut"]) - except getopt.GetoptError: - print(usage) - sys.exit(2) - - if len(argv) == 0: - print(usage) - sys.exit() - - for opt, arg in opts: - if opt == "-h": - print(usage) - sys.exit() - elif opt == "-s": - server = arg - elif opt == "-u": - user = arg - elif opt == "-p": - password = arg - elif opt == "--port": - port = int(arg) - elif opt == "--cut": - cut = True - elif opt == "--encoding": - encoding = arg - - try: - mail = imaplib.IMAP4_SSL(server, port) - mail.login(user, password) - except imaplib.IMAP4.error: - print("CheckMailError: invalid credentials") - sys.exit(2) - - status, counts = mail.status("Inbox","(MESSAGES UNSEEN)") - - unread = int(counts[0].split()[4][:-1]) - - if status == "OK" and unread: - mail.select("Inbox", readonly = 1) - ret, messages = mail.uid("search", None, "(UNSEEN)") - - if ret == "OK": - latest_email_uid = messages[0].split()[-1] - - ret_header, new_mail_header = mail.uid("fetch", latest_email_uid, - "(BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)])") - ret_text, new_mail_text = mail.uid("fetch", latest_email_uid, "(BODY[TEXT])") - - if ret_header == "OK" and ret_text == "OK": - try: # not all the servers like this, that's why we try - mail.store(latest_email_uid, "-FLAGS", "\\Seen") - except imaplib.IMAP4.error: - # this simply means the server refused to - # toggle Seen flag from mail - print("[+Seen]\n") - - nm_header = new_mail_header[0][1].decode(encoding, "replace").strip() - nm_text = new_mail_text[0][1].decode(encoding, "replace").strip() - - if unread == 1: - print(user, "has 1 new message\n") - else: - print(user, "has", unread, "new messages\n") - nm_header.replace("From:", "Latest from:", 1) - - print(nm_header, "\n") - - if cut: - if len(nm_text) <= 100: - print(nm_text) - else: - print(nm_text[0:100]) - print("[...]") - else: - print(nm_text) - else: - print("No new messages") - - mail.logout() - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/widgets/bat.lua b/widgets/bat.lua index fa61c34..ba1fa58 100644 --- a/widgets/bat.lua +++ b/widgets/bat.lua @@ -30,14 +30,14 @@ local function worker(args) bat.widget = wibox.widget.textbox('') - bat_now = { - status = "not present", - perc = "N/A", - time = "N/A", - watt = "N/A" - } - function bat.update() + bat_now = { + status = "not present", + perc = "N/A", + time = "N/A", + watt = "N/A" + } + local present = first_line("/sys/class/power_supply/" .. battery .. "/present") diff --git a/widgets/imap.lua b/widgets/imap.lua index 9821cb3..4df3610 100644 --- a/widgets/imap.lua +++ b/widgets/imap.lua @@ -11,10 +11,9 @@ local helpers = require("lain.helpers") local naughty = require("naughty") local wibox = require("wibox") -local io = { popen = io.popen } -local tonumber = tonumber -local string = { len = string.len, - format = string.format } +local io = { popen = io.popen } +local string = { format = string.format, + gsub = string.gsub } local setmetatable = setmetatable @@ -29,102 +28,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 imap.update() - to_execute = string.format("%s -s %s -u %s -p %s --port %s", - checkmail, server, mail, password, port) - - if encoding ~= nil - then - to_execute = string.format("%s --encoding %s", - to_execute, encoding) - end - - f = io.popen(to_execute) + notification_preset = { + icon = helpers.icons_dir .. "mail.png", + position = "top_left" + } + + curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:%s %s -k", + head_command, server, port, mail, password, request) + + 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 + t, mailcount = string.gsub(ws, "%d", "") + t = nil -- because it's useless 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 " .. mailcount .. " 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 = notification_preset, text = nt }) end + + helpers.set_map(mail, mailcount) end helpers.newtimer(mail, timeout, imap.update, true) - return imap.widget end diff --git a/widgets/yawn/icons/ThunderintheVicinity.png b/widgets/yawn/icons/ThunderintheVicinity.png new file mode 120000 index 0000000..1fb3b9c --- /dev/null +++ b/widgets/yawn/icons/ThunderintheVicinity.png @@ -0,0 +1 @@ +Cloudy.png \ No newline at end of file diff --git a/widgets/yawn/init.lua b/widgets/yawn/init.lua index e0e6f68..4d14966 100644 --- a/widgets/yawn/init.lua +++ b/widgets/yawn/init.lua @@ -132,7 +132,6 @@ local function fetch_weather() forecast = weather_data:match(": %S+.-,"):gsub(": ", ""):gsub(",", "\n") units = units:gsub(" ", "") - -- notification_preset = {} settings() end diff --git a/widgets/yawn/localizations/it_IT b/widgets/yawn/localizations/it_IT index 0b74b60..6435eff 100644 --- a/widgets/yawn/localizations/it_IT +++ b/widgets/yawn/localizations/it_IT @@ -14,6 +14,7 @@ Isolated Thunderstorms|Temporali Isolati Scattered Thunderstorms|Temporali Sparsi Thundershowers|Rovesci Temporaleschi Thunderstorms|Temporali +Thunder in the Vicinity|Temporale In Arrivo Thunder|Temporale AM|In Mattinata PM|Nel Pomeriggio diff --git a/widgets/yawn/localizations/localization_template b/widgets/yawn/localizations/localization_template index 98d527d..fd28868 100644 --- a/widgets/yawn/localizations/localization_template +++ b/widgets/yawn/localizations/localization_template @@ -14,6 +14,7 @@ Isolated Thunderstorms| Scattered Thunderstorms| Thundershowers| Thunderstorms| +Thunder in the Vicinity| Thunder| AM| PM| -- 2.39.5