Improved mensa module
This commit is contained in:
parent
78703620d3
commit
7ce3e4c59e
1 changed files with 101 additions and 76 deletions
177
modules/mensa.py
177
modules/mensa.py
|
@ -17,99 +17,124 @@ class Module(ModuleBase):
|
|||
return
|
||||
|
||||
tomorrow = re.match(r'!mensa\W+tomorrow(\W|\Z)', text)
|
||||
daystr = 'heute'
|
||||
daystr = 'Heute'
|
||||
day = date.today()
|
||||
if tomorrow:
|
||||
day += timedelta(1)
|
||||
daystr = 'morgen'
|
||||
datestr = day.strftime('%d.%m.</div>')
|
||||
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
|
||||
|
||||
found = False
|
||||
line = f.readline()
|
||||
while line:
|
||||
if re.search(datestr, line):
|
||||
found = True
|
||||
break
|
||||
line = f.readline()
|
||||
|
||||
if not found:
|
||||
f.close()
|
||||
handler.reply('%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr)
|
||||
return
|
||||
|
||||
meals = []
|
||||
r = re.compile(r'<td class="schrift_gerichte">([^<]*)</td>')
|
||||
line = f.readline()
|
||||
while line:
|
||||
match = r.search(line)
|
||||
if match:
|
||||
meals.append(match.group(1))
|
||||
def handle_data(data):
|
||||
if not re.search(datestr, data):
|
||||
return False
|
||||
|
||||
if len(meals) >= 4:
|
||||
break
|
||||
(data, count) = re.compile(r'^.*' + datestr + r'(.*?)<td rowspan="3" class="schrift_fett"><div>.*$', re.DOTALL).subn(r'\1', data)
|
||||
|
||||
if re.search('<td rowspan="3" class="schrift_fett"><div>', line):
|
||||
break
|
||||
if count < 1:
|
||||
return False
|
||||
|
||||
line = f.readline()
|
||||
|
||||
prices = []
|
||||
r = re.compile(r'<td class="schrift_preise">([^<]*)</td>')
|
||||
line = f.readline()
|
||||
while line:
|
||||
match = r.search(line)
|
||||
if match:
|
||||
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:
|
||||
prices.append(match.group(1))
|
||||
|
||||
if len(prices) >= 4:
|
||||
break
|
||||
|
||||
pos = match.end()
|
||||
match = r.match(pricestr, pos)
|
||||
|
||||
if len(prices) >= 4:
|
||||
break
|
||||
if len(prices) < 4:
|
||||
return False
|
||||
|
||||
if re.search('<td rowspan="3" class="schrift_fett"><div>', line):
|
||||
break
|
||||
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('<br />', ' ‒ ')
|
||||
s = re.sub('\s+', ' ', s)
|
||||
return s
|
||||
|
||||
line = f.readline()
|
||||
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
|
||||
|
||||
f.close()
|
||||
|
||||
if len(meals) < 4 or len(prices) < 4:
|
||||
handler.reply('%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr)
|
||||
return
|
||||
|
||||
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 = re.sub('\s+', ' ', 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], 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])
|
||||
reply = handle_data(data)
|
||||
if not reply:
|
||||
reply = '%s kein Mensa-Menü... ist vielleicht Wochenende?' % daystr
|
||||
|
||||
handler.reply(reply.strip())
|
||||
|
|
Reference in a new issue