Source code for i3pystatus.modsde

#!/usr/bin/env python

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


[docs]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"""), ('keyring_backend', 'alternative keyring backend for retrieving credentials'), ("offset", """subtract number of posts before output"""), "color", "username", "password" ) required = ("username", "password") keyring_backend = None 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 on_leftclick = "open_browser" 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 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 open_browser(self): webbrowser.open_new_tab("http://forum.mods.de/bb/")