i3pystatus/modsde.py
2013-02-11 21:37:07 +01:00

89 lines
2.6 KiB
Python

#!/usr/bin/env python
import sys
import json
import time
import threading
import urllib.request, urllib.parse, urllib.error, urllib.request, urllib.error, urllib.parse
import re
import http.cookiejar
import xml.etree.ElementTree as ET
class ModsDeChecker(object):
"""
This class returns i3status parsable output of the number of
unread posts in any bookmark in the mods.de forums.
"""
async = True
output = None
login_url = "http://login.mods.de/"
bookmark_url = "http://forum.mods.de/bb/xml/bookmarks.php"
opener = None
cj = None
logged_in = False
settings = {
"color": "#7181fe",
"pause": 20,
"username": "",
"password": "",
"offset": 0,
"format": "%d new posts in bookmarks"
}
def __init__(self, settings = None):
self.settings.update(settings)
self.cj = http.cookiejar.CookieJar()
self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.cj))
def mainloop(self):
while True:
unread = self.get_unread_count()
if not unread:
self.output = None
else:
self.output = {
"full_text" : self.settings["format"] % unread,
"name" : "modsde",
"urgent" : "true",
"color" : self.settings["color"]
}
time.sleep(self.settings["pause"])
def get_unread_count(self):
if not self.logged_in:
self.login()
try:
f = self.opener.open(self.bookmark_url)
root = ET.fromstring(f.read())
return int(root.attrib["newposts"]) - self.settings["offset"]
except Exception:
self.cj.clear()
self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.cj))
self.logged_in = False
def login(self):
data = urllib.parse.urlencode({
"login_username": self.settings["username"],
"login_password": self.settings["password"],
"login_lifetime": "31536000"
})
response = self.opener.open(self.login_url, data.encode("ascii"))
m = re.search("http://forum.mods.de/SSO.php[^']*", response.read().decode("ISO-8859-15"))
self.cj.clear()
if m and m.group(0):
# get the cookie
response = self.opener.open(m.group(0))
for cookie in self.cj:
self.cj.clear
self.logged_in = True
self.opener.addheaders.append(('Cookie', '{}={}'.format(cookie.name, cookie.value)))
return True