-
Notifications
You must be signed in to change notification settings - Fork 1
/
mensabot.py
115 lines (95 loc) · 4.77 KB
/
mensabot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# coding: utf8
from errbot.botplugin import BotPlugin
from errbot import botcmd
from urllib.request import urlopen
from lxml import etree
from datetime import datetime, timedelta
from random import choice
class MensaBot(BotPlugin):
def __init__(self):
super(MensaBot, self).__init__()
@botcmd
def mensa(self, mess, args):
""" Prints the menu @Mensa Uni Karlsruhe for this day (before 2pm) or the next day (2pm and after) in a compact form. """
result = {}
lines = ["1", "2", "3", "4/5", "SB", "6"]
# Get menu for current week until friday 2pm, for next week after
week = datetime.date(datetime.now()).isocalendar()[1]
if datetime.now().weekday() > 4 or (datetime.now().weekday() == 4 and datetime.now().hour >= 14):
# http://stackoverflow.com/a/6558588/1083696
nextmonday = datetime.now() + timedelta(days=(7 - datetime.now().weekday()))
week = nextmonday.isocalendar()[1]
html = etree.HTML(urlopen("http://www.studentenwerk-karlsruhe.de/de/essen/?view=ok&STYLE=popup_plain&c=adenauerring&p=1&kw=" + str(week)).read())
# Show table for next day after 2pm (but not after Friday, since the table for next Monday is then read)
tableindex = 1
if datetime.now().weekday() < 4 and datetime.now().hour >= 14:
tableindex = 2
# Each row represents a line.
rows = [r for r in html.xpath("/html/body/table/tr/td/div/table[" + str(tableindex) + "]/tr") if len(r)]
for idx, row in enumerate(rows):
# Don't show special lines like Curry Queen, Cafeteria etc.
if idx >= len(lines):
break
# Each row inside the subtable represents a food item
for food in row[1].xpath("table/tr"):
if len(food) < 3:
continue
# Don't display food items which cost €1 or less or have no assigned price.
price_nodes = food[2].xpath("span[contains(@class,'bg')]/text()")
if len(price_nodes) == 0:
continue
price = price_nodes[0].strip()
if price.startswith("0,") or price.startswith("1,00"):
continue
# Display only the bold-face part of the food name
foodname = food[1].xpath("span/b")[0].text.strip()
# Append food and price to results
if lines[idx] not in result:
result[lines[idx]] = []
result[lines[idx]].append(foodname + " " + price)
result = " ".join(["[" + key + "] " + ", ".join(result[key]) for key in lines if key in result])
comments = ["Guten Appetit!",
"Bon appétit!",
"Enjoy your meal!",
"¡Buen provecho!",
"Buon appetito!",
"多吃点!",
"прия́тного аппети́та!",
"Smacznego!",
"Brought to you by the one and only Mensabot™ – since 1803.",
"(Disclaimer: Mensabot™ übernimmt keine Verantwortung für erlittene oder eingebildete Lebensmittelvergiftungen.)",
"(Apropos: Wann gehen wir mal wieder Blut spenden?)",
"(Es steht mir ja nicht zu, das zu kommentieren, aber ich empfehle heute Linie " + choice(["1", "2", "3", "4/5", "6", "42", "9 3/4"]) + ".)",
"(Ich sag’s ja nur ungern, aber da ist heute nix dabei. Auf zur Schnitzelbar!)",
"(Wenn’s mal nicht geschmeckt hat: Mail an [email protected])",]
if "omlette" in result.lower():
comments.append("(P.S. Wann wird „Omelette“ mal richtig geschrieben?)")
if "spinat" in result.lower():
comments.append("(Spinat habe ich übrigens noch nie gemocht.)")
if "medaillon" in result.lower():
comments.append("(Bullshit-Bingo: Medaillon!)")
if "bolognese" in result.lower():
comments.append("(Also Bolognese kann ich auch zu Hause kochen.!)")
if "sahnesoße" in result.lower():
comments.append("(Warnung: Sahnesoße ist mit 70% Wahrscheinlichkeit einfach nur Wasser.)")
if "paella" in result.lower():
comments.append("(Hach, Paella. Das erinnert mich an meine Zeit in Barcelona. Sonne, Sommer, Strand … jemand neidisch?)")
if "schlemmer" in result.lower():
comments.append("(Also Namen ausdenken können die sich, das muss man ihnen lassen.)")
if "fagottini" in result.lower():
comments.append("(Fagottini … fagöttlich!)")
if "kaiser" in result.lower():
comments.append("(Schon gewusst? Die Mensaleitung ist von Monarchisten durchsetzt.)")
if "gulasch" in result.lower():
comments.append("(Gulasch? Erinnert mich an die GPN. Schöne Zeiten!)")
if "vegetarisches schnitzel" in result.lower():
comments.append("(Übrigens: Schon mal was von einem Oxymoron gehört?)")
if "weißwein" in result.lower() or "rotwein" in result.lower():
comments.append("Prost!")
if "bifteki" in result.lower():
comments.append("(Das müsste eigentlich Bifteki™ heißen.)")
if datetime.now().weekday() == 2:
comments.append("(Heute ist Eintopftag! All glory to the Erbseneintopf!)")
if datetime.now().weekday() == 4:
comments.append("(Übrigens gibt es heute kein Abendessen in der Mensa. Tja, Pech.)")
return result + ". " + choice(comments)