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,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")
|
||||
|
|
101
widgets/imap.lua
101
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)
|
||||
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)
|
||||
|
||||
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
|
||||
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 <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 = notification_preset, text = nt })
|
||||
end
|
||||
|
||||
helpers.set_map(mail, mailcount)
|
||||
end
|
||||
|
||||
helpers.newtimer(mail, timeout, imap.update, true)
|
||||
|
||||
return imap.widget
|
||||
end
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Cloudy.png
|
|
@ -132,7 +132,6 @@ local function fetch_weather()
|
|||
|
||||
forecast = weather_data:match(": %S+.-,"):gsub(": ", ""):gsub(",", "\n")
|
||||
units = units:gsub(" ", "")
|
||||
-- notification_preset = {}
|
||||
|
||||
settings()
|
||||
end
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -14,6 +14,7 @@ Isolated Thunderstorms|
|
|||
Scattered Thunderstorms|
|
||||
Thundershowers|
|
||||
Thunderstorms|
|
||||
Thunder in the Vicinity|
|
||||
Thunder|
|
||||
AM|
|
||||
PM|
|
||||
|
|
Loading…
Reference in New Issue