This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
curunir/modules/mensa.py

143 lines
4.9 KiB
Python
Raw Normal View History

2010-05-03 05:20:21 +02:00
# -*- coding: utf-8 -*-
from base import ModuleBase
import re
2010-05-06 22:32:16 +02:00
from datetime import datetime, date, timedelta, time
2010-05-03 05:20:21 +02:00
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)
2010-05-03 17:01:05 +02:00
daystr = 'Heute'
2010-05-03 05:20:21 +02:00
day = date.today()
2010-05-06 22:32:16 +02:00
if tomorrow or datetime.now().time() > time(15):
2010-05-03 05:20:21 +02:00
day += timedelta(1)
2010-05-03 17:01:05 +02:00
daystr = 'Morgen'
datestr = day.strftime(r'%d\.%m\.<\/div>')
2010-05-03 05:20:21 +02:00
try:
f = urllib.urlopen(self.manager.config['mensa_url'], 'r')
2010-05-03 17:01:05 +02:00
data = f.read()
f.close()
2010-05-03 05:20:21 +02:00
except IOError:
handler.reply('Hmm, es scheint gerade keine Daten über das Mensa-Menü zu geben.')
return
2010-05-03 17:01:05 +02:00
def handle_data(data):
if not re.search(datestr, data):
return False
2010-05-03 05:20:21 +02:00
2010-05-04 15:14:31 +02:00
match = re.compile(r'^.*' + datestr + r'(.*?)(?:<td rowspan="3" class="schrift_fett"><div>|</table>).*$', re.DOTALL).match(data)
2010-05-03 05:20:21 +02:00
2010-05-04 15:14:31 +02:00
if not match:
2010-05-03 17:01:05 +02:00
return False
2010-05-03 05:20:21 +02:00
2010-05-04 15:14:31 +02:00
data = match.group(1)
2010-05-03 17:01:05 +02:00
r = re.compile(r'.*?<tr[^>]*>(.*?)</tr>', 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*<td class="schrift_(gerichte|spezial)">(.+?)</td>', 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*<td class="schrift_(?:preise|spezial)">(.+?)</td>', re.DOTALL)
match = r.match(pricestr, pos)
while match:
2010-05-03 05:20:21 +02:00
prices.append(match.group(1))
2010-05-03 17:01:05 +02:00
if len(prices) >= 4:
break
pos = match.end()
match = r.match(pricestr, pos)
2010-05-03 05:20:21 +02:00
2010-05-03 17:01:05 +02:00
if len(prices) < 4:
return False
2010-05-03 05:20:21 +02:00
2010-05-03 17:01:05 +02:00
def unescape(s):
s = s.replace('&nbsp;', '')
s = s.replace('&euro;', '')
s = s.replace('&auml;', 'ä')
s = s.replace('&Auml;', 'Ä')
s = s.replace('&ouml;', 'ö')
s = s.replace('&Ouml;', 'Ö')
s = s.replace('&uuml;', 'ü')
s = s.replace('&Uuml;', 'Ü')
s = s.replace('&szlig;', 'ß')
s = s.replace('&amp;', '&')
s = s.replace('&lt;', '<')
s = s.replace('&gt;', '>')
s = s.replace('&quot;', '"')
s = s.replace('<br />', ' ')
s = re.sub('\s+', ' ', s)
return s
2010-05-03 05:20:21 +02:00
2010-05-03 17:01:05 +02:00
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
2010-05-03 05:20:21 +02:00
2010-05-03 17:01:05 +02:00
reply = handle_data(data)
if not reply:
reply = '%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr
2010-05-03 05:20:21 +02:00
handler.reply(reply.strip())