i3pystatus/i3pystatus/modsde.py
2013-10-01 15:22:09 +02:00

109 lines
2.9 KiB
Python

#!/usr/bin/env python
import sys
import json
import time
import threading
import urllib.request
import urllib.parse
import urllib.error
import re
import http.cookiejar
import xml.etree.ElementTree as ET
import webbrowser
from i3pystatus import IntervalModule
class ModsDeChecker(IntervalModule):
"""
This class returns i3status parsable output of the number of
unread posts in any bookmark in the mods.de forums.
"""
settings = (
("format",
"""Use {unread} as the formatter for number of unread posts"""),
("offset", """subtract number of posts before output"""),
"color", "username", "password"
)
required = ("username", "password")
color = "#7181fe"
offset = 0
format = "{unread} new posts in bookmarks"
login_url = "http://login.mods.de/"
bookmark_url = "http://forum.mods.de/bb/xml/bookmarks.php"
opener = None
cj = None
logged_in = False
def init(self):
self.cj = http.cookiejar.CookieJar()
self.opener = urllib.request.build_opener(
urllib.request.HTTPCookieProcessor(self.cj))
def run(self):
unread = self.get_unread_count()
if not unread:
self.output = None
else:
self.output = {
"full_text": self.format.format(unread=unread),
"urgent": "true",
"color": self.color
}
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.offset
except Exception:
self.cj.clear()
self.opener = urllib.request.build_opener(
urllib.request.HTTPCookieProcessor(self.cj))
self.logged_in = False
def test(self):
if not self.login():
return "Wrong credentials or no internet connection"
return True
def login(self):
data = urllib.parse.urlencode({
"login_username": self.username,
"login_password": self.password,
"login_lifetime": "31536000"
})
try:
response = self.opener.open(self.login_url, data.encode("ascii"))
except Exception:
return
page = response.read().decode("ISO-8859-15")
m = re.search("http://forum.mods.de/SSO.php[^']*", page)
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
return False
def on_leftclick(self):
webbrowser.open_new_tab("http://forum.mods.de/bb/")