summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2010-10-31 23:01:21 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2010-10-31 23:01:21 +0100
commitae46cfb761c54241b3e01ef4d503ada5143afaa9 (patch)
treeb46795ea49420dccaff1f84b49dcc57ecbb25b3e
parentc33aea37f26d9779132a4126de0b62245654cbd2 (diff)
downloadcurunir-ae46cfb761c54241b3e01ef4d503ada5143afaa9.tar
curunir-ae46cfb761c54241b3e01ef4d503ada5143afaa9.zip
Rewrote mensa module ...
-rwxr-xr-xcurunir2
-rw-r--r--modules/mensa.py142
2 files changed, 70 insertions, 74 deletions
diff --git a/curunir b/curunir
index bf357b1..89af587 100755
--- a/curunir
+++ b/curunir
@@ -5,4 +5,4 @@ DIR=`dirname $0`
cd "$DIR"
export PYTHONPATH="$PYTHONPATH:."
-exec /usr/bin/env python -OO "$APP.py" "$@"
+exec /usr/bin/env python2 -OO "$APP.py" "$@"
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('&nbsp;', '')
s = s.replace('&euro;', '€')
@@ -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())