# -*- coding: utf-8 -*- from . import ModuleBase import re from datetime import datetime, date, timedelta, time import urllib class Module(ModuleBase): def __init__(self, manager): ModuleBase.__init__(self, manager) def commands(self): return [('!mensa [tomorrow]', 'Zeigt das aktuelle Menü der Mensa der Uni Lübeck an (oder das des nächsten Tages)')] def groupchat(self, room, nick, text, handler): if not re.match(r'!mensa(?:\W|\Z)', text): return tomorrow = re.match(r'!mensa\W+tomorrow(\W|\Z)', text) daystr = 'Heute' day = date.today() if tomorrow or datetime.now().time() > time(15): day += timedelta(1) daystr = 'Morgen' datestr = day.strftime(r'%d\.%m\.<\/div>') try: f = urllib.urlopen(self.manager.config['mensa_url'], 'r') data = f.read() f.close() except IOError: handler.reply('Hmm, es scheint gerade keine Daten über das Mensa-Menü zu geben.') return def handle_data(data): if not re.search(datestr, data): return False match = re.compile(r'^.*' + datestr + r'(.*?)(?:
|).*$', re.DOTALL).match(data) if not match: return False data = match.group(1) r = re.compile(r'.*?]*>(.*?)', re.DOTALL) match = r.match(data) if not match: return False mealstr = match.group(1) match = r.match(data, match.end()) if not match: return False pricestr = match.group(1) meals = [] pos = 0 r = re.compile(r'\s*(.+?)', re.DOTALL) match = r.match(mealstr, pos) while match: meals.append(match.group(2)) if len(meals) >= 4: break pos = match.end() match = r.match(mealstr, pos) if len(meals) < 4: return False prices = [] pos = 0 r = re.compile(r'\s*(.+?)', re.DOTALL) match = r.match(pricestr, pos) while match: prices.append(match.group(1)) if len(prices) >= 4: break pos = match.end() match = r.match(pricestr, pos) if len(prices) < 4: return False def unescape(s): s = s.replace(' ', '') s = s.replace('€', '€') s = s.replace('ä', 'ä') s = s.replace('Ä', 'Ä') s = s.replace('ö', 'ö') s = s.replace('Ö', 'Ö') s = s.replace('ü', 'ü') s = s.replace('Ü', 'Ü') s = s.replace('ß', 'ß') s = s.replace('&', '&') s = s.replace('<', '<') s = s.replace('>', '>') s = s.replace('"', '"') s = s.replace('
', ' ') s = re.sub(r'-\s+', '-', s) s = re.sub(r'\s+', ' ', s) s = re.sub(r'([a-zäöüß])-([a-zäöüß])', r'\1\2', s) s = re.sub(r']*>(.+?)', r'\1', s) return s meals = map(unescape, meals) prices = map(unescape, prices) reply = 'Mensa-Menü für den %s\n\n' % day.strftime('%d.%m.%y') if meals[0]: reply += 'Eintopf: %s (%s)\n' % (meals[0].strip(), prices[0].strip()) if meals[1]: reply += 'Hauptgericht 1: %s (%s)\n' % (meals[1].strip(), prices[1].strip()) if meals[2]: reply += 'Hauptgericht 2: %s (%s)\n' % (meals[2].strip(), prices[2].strip()) if meals[3]: reply += 'Vegetarisches Hauptgericht: %s (%s)\n' % (meals[3].strip(), prices[3].strip()) return reply reply = handle_data(data) if not reply: reply = '%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr handler.reply(reply.strip())