Improved mensa module

This commit is contained in:
Matthias Schiffer 2010-05-03 17:01:05 +02:00
parent 78703620d3
commit 7ce3e4c59e

View file

@ -17,99 +17,124 @@ class Module(ModuleBase):
return return
tomorrow = re.match(r'!mensa\W+tomorrow(\W|\Z)', text) tomorrow = re.match(r'!mensa\W+tomorrow(\W|\Z)', text)
daystr = 'heute' daystr = 'Heute'
day = date.today() day = date.today()
if tomorrow: if tomorrow:
day += timedelta(1) day += timedelta(1)
daystr = 'morgen' daystr = 'Morgen'
datestr = day.strftime('%d.%m.</div>') datestr = day.strftime(r'%d\.%m\.<\/div>')
try: try:
f = urllib.urlopen(self.manager.config['mensa_url'], 'r') f = urllib.urlopen(self.manager.config['mensa_url'], 'r')
data = f.read()
f.close()
except IOError: except IOError:
handler.reply('Hmm, es scheint gerade keine Daten über das Mensa-Menü zu geben.') handler.reply('Hmm, es scheint gerade keine Daten über das Mensa-Menü zu geben.')
return return
found = False def handle_data(data):
line = f.readline() if not re.search(datestr, data):
while line: return False
if re.search(datestr, line):
found = True
break
line = f.readline()
if not found: (data, count) = re.compile(r'^.*' + datestr + r'(.*?)<td rowspan="3" class="schrift_fett"><div>.*$', re.DOTALL).subn(r'\1', data)
f.close()
handler.reply('%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr)
return
meals = [] if count < 1:
r = re.compile(r'<td class="schrift_gerichte">([^<]*)</td>') return False
line = f.readline()
while line:
match = r.search(line)
if match:
meals.append(match.group(1))
if len(meals) >= 4: r = re.compile(r'.*?<tr[^>]*>(.*?)</tr>', re.DOTALL)
break match = r.match(data)
if not match:
return False
mealstr = match.group(1)
if re.search('<td rowspan="3" class="schrift_fett"><div>', line): match = r.match(data, match.end())
break if not match:
return False
pricestr = match.group(1)
line = f.readline() 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'))
prices = [] if len(meals) >= 4:
r = re.compile(r'<td class="schrift_preise">([^<]*)</td>') break
line = f.readline()
while line: pos = match.end()
match = r.search(line) match = r.match(mealstr, pos)
if match:
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:
prices.append(match.group(1)) prices.append(match.group(1))
if len(prices) >= 4: if len(prices) >= 4:
break break
if re.search('<td rowspan="3" class="schrift_fett"><div>', line): pos = match.end()
break match = r.match(pricestr, pos)
line = f.readline() if len(prices) < 4:
return False
f.close() 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
if len(meals) < 4 or len(prices) < 4: meals = map(lambda (s, special): (unescape(s), special), meals)
handler.reply('%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr) prices = map(unescape, prices)
return
def unescape(s): reply = 'Mensa-Menü für den %s\n\n' % day.strftime('%d.%m.%y')
s = s.replace('&nbsp;', '') if meals[0][0]:
s = s.replace('&euro;', '') if meals[0][1]:
s = s.replace('&auml;', 'ä') reply += 'Mensatipp: '
s = s.replace('&Auml;', 'Ä') else:
s = s.replace('&ouml;', 'ö') reply += 'Eintopf: '
s = s.replace('&Ouml;', 'Ö') reply += '%s (%s)\n' % (meals[0][0], prices[0])
s = s.replace('&uuml;', 'ü') if meals[1][0]:
s = s.replace('&Uuml;', 'Ü') if meals[1][1]:
s = s.replace('&szlig;', 'ß') reply += 'Mensatipp: '
s = s.replace('&amp;', '&') else:
s = s.replace('&lt;', '<') reply += 'Hauptgericht 1: '
s = s.replace('&gt;', '>') reply += '%s (%s)\n' % (meals[1][0], prices[1])
s = s.replace('&quot;', '"') if meals[2][0]:
s = re.sub('\s+', ' ', s) if meals[2][1]:
return s 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])
meals = map(unescape, meals) return reply
prices = map(unescape, prices)
reply = 'Mensa-Menü für den %s\n\n' % day.strftime('%d.%m.%y') reply = handle_data(data)
if not reply:
if meals[0]: reply = '%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr
reply += 'Eintopf: %s (%s)\n' % (meals[0], prices[0])
if meals[1]:
reply += 'Hauptgericht 1: %s (%s)\n' % (meals[1], prices[1])
if meals[2]:
reply += 'Hauptgericht 2: %s (%s)\n' % (meals[2], prices[2])
if meals[3]:
reply += 'Vegetarisches Hauptgericht: %s (%s)\n' % (meals[3], prices[3])
handler.reply(reply.strip()) handler.reply(reply.strip())