# -*- coding: utf-8 -*- from base import ModuleBase import re from datetime import date, timedelta 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: 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 (data, count) = re.compile(r'^.*' + datestr + r'(.*?)
.*$', re.DOTALL).subn(r'\1', data) if count < 1: return False 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), match.group(1) == 'spezial')) 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('\s+', ' ', s) return s meals = map(lambda (s, special): (unescape(s), special), meals) prices = map(unescape, prices) reply = 'Mensa-Menü für den %s\n\n' % day.strftime('%d.%m.%y') if meals[0][0]: if meals[0][1]: reply += 'Mensatipp: ' else: reply += 'Eintopf: ' reply += '%s (%s)\n' % (meals[0][0], prices[0]) if meals[1][0]: if meals[1][1]: reply += 'Mensatipp: ' else: reply += 'Hauptgericht 1: ' reply += '%s (%s)\n' % (meals[1][0], prices[1]) if meals[2][0]: if meals[2][1]: reply += 'Mensatipp: ' else: reply += 'Hauptgericht 2: ' reply += '%s (%s)\n' % (meals[2][0], prices[2]) if meals[3][0]: if meals[3][1]: reply += 'Mensatipp: ' else: reply += 'Vegetarisches Hauptgericht: ' reply += '%s (%s)\n' % (meals[3][0], prices[3]) return reply reply = handle_data(data) if not reply: reply = '%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr handler.reply(reply.strip())