diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/mensa.py | 142 |
1 files changed, 69 insertions, 73 deletions
diff --git a/modules/mensa.py b/modules/mensa.py index 1baf60f..279caa0 100644 --- a/modules/mensa.py +++ b/modules/mensa.py @@ -8,22 +8,21 @@ 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() @@ -31,67 +30,60 @@ class Module(ModuleBase): 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'(.*?)(?:<td rowspan="3" class="schrift_fett"><div>|</table>).*$', re.DOTALL).match(data) - - if not match: - return False - - data = match.group(1) - - r = re.compile(r'.*?<tr[^>]*>(.*?)</tr>', re.DOTALL) - r2 = re.compile(r'(?:.*?<td[^>]*>(.*?)</td>){4}', re.DOTALL) - - mealstr = '' - pos = 0 - while not r2.match(mealstr): + r = re.compile(r'.*?<tr[^>]*>(.*?)</tr>.*?<tr[^>]*>(.*?)</tr>', re.DOTALL) + r2 = re.compile(r'.*?<td[^>]*>(.*?)</td>', re.DOTALL) + + def handle_data_row(data, pos): match = r.match(data, pos) + if not match: return False - mealstr = match.group(1) - pos = match.end() - - match = r.match(data, pos) + + ret = [] + mealpos = 0 + pricepos = 0 + + for day in range(0,5): + mealmatch = r2.match(match.group(1), mealpos) + pricematch = r2.match(match.group(2), pricepos) + + if not mealmatch or not pricematch: + return False + + ret.append((mealmatch.group(1), pricematch.group(1))) + mealpos = mealmatch.end() + pricepos = pricematch.end() + + return (ret, match.end()) + + + match = re.compile(r'^.*?<table[^>]*>.*?<td[^>]*>.*?(\d+)\.(\d+)\. - \d+\.\d+\.(\d+)\.*?</td>.*?(?:<col[^>]*>\s*){4}(.*?)</table>.*$', re.DOTALL).match(data) + if not match: return False - pricestr = match.group(1) - - meals = [] - pos = 0 - r = re.compile(r'\s*<td class="schrift_(gerichte|spezial)">(.+?)</td>', 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: + + firstday = datetime.strptime('%s-%s-%s' % (match.group(3), match.group(2), match.group(1)), '%Y-%m-%d').date() + weekday = (day - firstday).days + + if weekday < 0 or weekday > 4: return False - - prices = [] + + data = match.group(4) + + meals = [] pos = 0 - r = re.compile(r'\s*<td class="schrift_(?:preise|spezial)">(.+?)</td>', 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 - + + for i in range(0,6): + row = handle_data_row(data, pos) + + if not row: + return False + + meals.append(row[0]) + pos = row[1] + def unescape(s): s = s.replace(' ', '') s = s.replace('€', '€') @@ -117,24 +109,28 @@ class Module(ModuleBase): s = re.sub(r'<img[^>]*logo_bio[^>]*>', 'Bio', s) s = re.sub(r'<[^>]*>', '', s) return s - - meals = map(unescape, meals) - prices = map(unescape, prices) - + + stripunescape = (lambda item: (unescape(item[0].strip()), unescape(item[1].strip()))) + meals = map(lambda item: map(stripunescape, item), meals) + 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()) - + if meals[0][weekday][0]: + reply += 'Eintopf: %s (%s)\n' % meals[0][weekday] + if meals[1][weekday][0]: + reply += 'Hauptgericht 1: %s (%s)\n' % meals[1][weekday] + if meals[3][weekday][0]: + reply += 'Hauptgericht 2: %s (%s)\n' % meals[3][weekday] + if meals[2][weekday][0]: + reply += 'Vegetarisches Hauptgericht: %s (%s)\n' % meals[2][weekday] + if meals[4][weekday][0]: + reply += 'Wok: %s (%s)\n' % meals[4][weekday] + if meals[5][weekday][0]: + reply += 'Beilagen: %s (%s)\n' % meals[5][weekday] + return reply - + reply = handle_data(data) if not reply: reply = '%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr - + handler.reply(reply.strip()) |