mirror of https://github.com/lcpz/lain.git
new imap widget
This commit is contained in:
parent
19ea09fead
commit
4cd75de2ed
|
@ -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 <imapserver> -u <usermail> -p <password> [--port <port>] [--encoding <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:])
|
|
|
@ -30,6 +30,7 @@ local function worker(args)
|
||||||
|
|
||||||
bat.widget = wibox.widget.textbox('')
|
bat.widget = wibox.widget.textbox('')
|
||||||
|
|
||||||
|
function bat.update()
|
||||||
bat_now = {
|
bat_now = {
|
||||||
status = "not present",
|
status = "not present",
|
||||||
perc = "N/A",
|
perc = "N/A",
|
||||||
|
@ -37,7 +38,6 @@ local function worker(args)
|
||||||
watt = "N/A"
|
watt = "N/A"
|
||||||
}
|
}
|
||||||
|
|
||||||
function bat.update()
|
|
||||||
local present = first_line("/sys/class/power_supply/"
|
local present = first_line("/sys/class/power_supply/"
|
||||||
.. battery
|
.. battery
|
||||||
.. "/present")
|
.. "/present")
|
||||||
|
|
|
@ -12,9 +12,8 @@ local naughty = require("naughty")
|
||||||
local wibox = require("wibox")
|
local wibox = require("wibox")
|
||||||
|
|
||||||
local io = { popen = io.popen }
|
local io = { popen = io.popen }
|
||||||
local tonumber = tonumber
|
local string = { format = string.format,
|
||||||
local string = { len = string.len,
|
gsub = string.gsub }
|
||||||
format = string.format }
|
|
||||||
|
|
||||||
local setmetatable = setmetatable
|
local setmetatable = setmetatable
|
||||||
|
|
||||||
|
@ -29,102 +28,58 @@ local function worker(args)
|
||||||
local mail = args.mail
|
local mail = args.mail
|
||||||
local password = args.password
|
local password = args.password
|
||||||
|
|
||||||
local port = args.port or "993"
|
local port = args.port or 993
|
||||||
local timeout = args.timeout or 60
|
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 is_plain = args.is_plain or false
|
||||||
local settings = args.settings or function() end
|
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, 0)
|
||||||
helpers.set_map(mail .. " count", "0")
|
|
||||||
|
|
||||||
if not is_plain
|
if not is_plain
|
||||||
then
|
|
||||||
if not imap.stored
|
|
||||||
then
|
then
|
||||||
local f = io.popen(password)
|
local f = io.popen(password)
|
||||||
password = f:read("*all"):gsub("\n", ""):gsub("\r", "")
|
password = f:read("*all"):gsub("\n", "")
|
||||||
f:close()
|
f:close()
|
||||||
imap.stored = password
|
|
||||||
else
|
|
||||||
password = imap.stored
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
imap.widget = wibox.widget.textbox('')
|
imap.widget = wibox.widget.textbox('')
|
||||||
|
|
||||||
|
function imap.update()
|
||||||
notification_preset = {
|
notification_preset = {
|
||||||
icon = helpers.icons_dir .. "mail.png",
|
icon = helpers.icons_dir .. "mail.png",
|
||||||
timeout = 8,
|
|
||||||
position = "top_left"
|
position = "top_left"
|
||||||
}
|
}
|
||||||
|
|
||||||
function imap.update()
|
curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:%s %s -k",
|
||||||
to_execute = string.format("%s -s %s -u %s -p %s --port %s",
|
head_command, server, port, mail, password, request)
|
||||||
checkmail, server, mail, password, port)
|
|
||||||
|
|
||||||
if encoding ~= nil
|
f = io.popen(curl)
|
||||||
then
|
|
||||||
to_execute = string.format("%s --encoding %s",
|
|
||||||
to_execute, encoding)
|
|
||||||
end
|
|
||||||
|
|
||||||
f = io.popen(to_execute)
|
|
||||||
ws = f:read("*all")
|
ws = f:read("*all")
|
||||||
f:close()
|
f:close()
|
||||||
|
|
||||||
mailcount = "0"
|
t, mailcount = string.gsub(ws, "%d", "")
|
||||||
|
t = nil -- because it's useless
|
||||||
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
|
|
||||||
|
|
||||||
widget = imap.widget
|
widget = imap.widget
|
||||||
settings()
|
settings()
|
||||||
|
|
||||||
if helpers.get_map(mail) and tonumber(mailcount) >= 1
|
if mailcount > helpers.get_map(mail) and mailcount >= 1
|
||||||
then
|
then
|
||||||
notify_title = ws:match(mail .. " has %d new message.?")
|
if mailcount == 1 then
|
||||||
ws = ws:gsub(notify_title, "", 1):gsub("\n", "", 2)
|
nt = mail .. " has one new message"
|
||||||
|
else
|
||||||
-- trying to remove useless infos
|
nt = mail .. " has <b>" .. mailcount .. "</b> new messages"
|
||||||
ws = ws:gsub("--Content.%S+.-\n", "")
|
end
|
||||||
ws = ws:gsub("--%d+.-\n", "")
|
naughty.notify({ preset = notification_preset, text = nt })
|
||||||
|
|
||||||
if string.len(ws) > maxlen
|
|
||||||
then
|
|
||||||
ws = ws:sub(1, maxlen) .. "[...]"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
notify_title = notify_title:gsub("\n", "")
|
helpers.set_map(mail, mailcount)
|
||||||
|
|
||||||
naughty.notify({
|
|
||||||
preset = notification_preset,
|
|
||||||
title = notify_title,
|
|
||||||
text = ws
|
|
||||||
})
|
|
||||||
|
|
||||||
helpers.set_map(mail, false)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
helpers.newtimer(mail, timeout, imap.update, true)
|
helpers.newtimer(mail, timeout, imap.update, true)
|
||||||
|
|
||||||
return imap.widget
|
return imap.widget
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Cloudy.png
|
|
@ -132,7 +132,6 @@ local function fetch_weather()
|
||||||
|
|
||||||
forecast = weather_data:match(": %S+.-,"):gsub(": ", ""):gsub(",", "\n")
|
forecast = weather_data:match(": %S+.-,"):gsub(": ", ""):gsub(",", "\n")
|
||||||
units = units:gsub(" ", "")
|
units = units:gsub(" ", "")
|
||||||
-- notification_preset = {}
|
|
||||||
|
|
||||||
settings()
|
settings()
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,6 +14,7 @@ Isolated Thunderstorms|Temporali Isolati
|
||||||
Scattered Thunderstorms|Temporali Sparsi
|
Scattered Thunderstorms|Temporali Sparsi
|
||||||
Thundershowers|Rovesci Temporaleschi
|
Thundershowers|Rovesci Temporaleschi
|
||||||
Thunderstorms|Temporali
|
Thunderstorms|Temporali
|
||||||
|
Thunder in the Vicinity|Temporale In Arrivo
|
||||||
Thunder|Temporale
|
Thunder|Temporale
|
||||||
AM|In Mattinata
|
AM|In Mattinata
|
||||||
PM|Nel Pomeriggio
|
PM|Nel Pomeriggio
|
||||||
|
|
|
@ -14,6 +14,7 @@ Isolated Thunderstorms|
|
||||||
Scattered Thunderstorms|
|
Scattered Thunderstorms|
|
||||||
Thundershowers|
|
Thundershowers|
|
||||||
Thunderstorms|
|
Thunderstorms|
|
||||||
|
Thunder in the Vicinity|
|
||||||
Thunder|
|
Thunder|
|
||||||
AM|
|
AM|
|
||||||
PM|
|
PM|
|
||||||
|
|
Loading…
Reference in New Issue