-
Notifications
You must be signed in to change notification settings - Fork 0
/
cli.hpi
302 lines (246 loc) · 10.7 KB
/
cli.hpi
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
beantrage Geld von Hasso;
beantrage Drucke von Drucker;
beantrage Http von Netzwerk;
beantrage Gliedere_JSON von Textverarbeitung;
beantrage Zergliedere_JSON von Textverarbeitung;
beantrage Formatiere von Textverarbeitung;
beantrage Aufgeben von libSAP;
beantrage Umgebungsvariablen von libSAP;
beantrage Argumente von libSAP;
beantrage Zeit von Uhr;
beantrage Versions_Nummer von libSAP;
//
// ANFANG LIB.
//
//
// Datentypen.
//
datentyp Speise auf Objekt {
Zeichenkette Titel /
Zeichenkette Beschreibung /
Fließkommazahl Preis /
// LECKER NAEHRWERTE.
Fließkommazahl Protein_GR /
Fließkommazahl Kcal /
Fließkommazahl Fett_GR /
Fließkommazahl Zucker_GR /
Fließkommazahl Kohlenhydrate_GR /
Zeichenkette ZeitSlot /
};
//
// Konstanten.
//
setze Zahl MENSA_FILMUNI auf 9603;
setze Zahl MENSA_GRIEBNITZSEE auf 9601;
setze Zeichenkette MENSA_URL_GENERISCH auf "https://swp.webspeiseplan.de/index.php?token=55ed21609e26bbf68ba2b19390bf7961&model=menu&location=%d&languagetype=2&_=1699354619713";
//
// Funktionen.
//
funk Lade_Speiseangebot(Zahl Mensa_Ort / Zahl Tages_Verschiebung) ergibt Liste von Speise {
setze Zeichenkette Körper auf "";
setze Zeichenkette URL auf Formatiere(MENSA_URL_GENERISCH / Mensa_Ort);
setze Zahl Antwort_Zahl auf Http(
"GET" /
URL /
"" /
[
erstelle {
Zeichenkette Schlüssel auf "Referer" /
Zeichenkette Wert auf "https://swp.webspeiseplan.de/menu" /
}
] /
&Körper /
);
falls Antwort_Zahl != 200 {
Aufgeben(1);
}
setze Speicherbox Res auf Zergliedere_JSON(Körper) als Speicherbox;
setze Liste von Speicherbox ContentRes auf Res.Nehmen("content") als Liste von Speicherbox;
setze Zahl Zähler auf 0;
setze Liste von Speise Resultat auf [];
solange Zähler < ContentRes.Länge() {
setze Speicherbox ResTemp auf ContentRes[Zähler];
setze Liste von Speicherbox Gerichte auf ResTemp.Nehmen("speiseplanGerichtData") als Liste von Speicherbox;
setze Speicherbox SpeiseplanAdvanced auf ResTemp.Nehmen("speiseplanAdvanced") als Speicherbox;
setze Zeichenkette ZeitSlot auf SpeiseplanAdvanced.Nehmen("titel") als Zeichenkette;
setze Zahl Gerichtzähler auf 0;
solange (Gerichtzähler < Gerichte.Länge()) {
setze Speicherbox Gericht auf Gerichte[Gerichtzähler];
Gerichtzähler += 1;
setze Speicherbox ZusatzInfos auf Gericht.Nehmen("zusatzinformationen") als Speicherbox;
// DIES STIRBT MANCHMAL.
setze Fließkommazahl Preis auf ZusatzInfos.Nehmen("mitarbeiterpreisDecimal2") als Fließkommazahl;
setze Fließkommazahl Protein auf ZusatzInfos.Nehmen("nweiweissDecimal1") als Fließkommazahl;
setze Fließkommazahl Kcal auf ZusatzInfos.Nehmen("nwkcalInteger") als Fließkommazahl;
setze Fließkommazahl Fett auf ZusatzInfos.Nehmen("nwfettDecimal1") als Fließkommazahl;
setze Fließkommazahl Zucker auf ZusatzInfos.Nehmen("nwzuckerDecimal1") als Fließkommazahl;
setze Fließkommazahl Kohlenhydrate auf ZusatzInfos.Nehmen("nwzuckerDecimal1") als Fließkommazahl;
setze Speicherbox GerichtInfos auf Gericht.Nehmen("speiseplanAdvancedGericht") als Speicherbox;
setze Zeichenkette GerichtDatumRoh auf GerichtInfos.Nehmen("datum") als Zeichenkette;
setze Zeichenkette GerichtDatum auf GerichtDatumRoh.Zertrenne("T")[0];
setze Zahl Verwendeter_Tag auf Zeit().Kalendar_Tag + Tages_Verschiebung;
setze Zeichenkette HeuteDatum auf Formatiere("%d-%2d-%2d" / Zeit().Jahr / Zeit().Monat / Verwendeter_Tag);
setze Zeichenkette Gerichtname auf GerichtInfos.Nehmen("gerichtname") als Zeichenkette;
setze Zahl Kaunter auf -1;
falls Gerichtname.Enthält("COUNTER 1") {
aendere Kaunter auf 1;
} sonst falls Gerichtname.Enthält("COUNTER 2") {
aendere Kaunter auf 2;
} sonst falls Gerichtname.Enthält("COUNTER 3") {
aendere Kaunter auf 3;
} sonst falls Gerichtname.Enthält("COUNTER 4") {
aendere Kaunter auf 4;
}
aendere Gerichtname auf Gerichtname
.Ersetze("\n" / "")
.Ersetze("COUNTER 1 / " / "")
.Ersetze("COUNTER 2 / " / "")
.Ersetze("COUNTER 3 / " / "")
.Ersetze("COUNTER 4 / " / "");
falls
(GerichtDatum != HeuteDatum)
|| Gerichtname.Startet_Mit("Salatbuffet")
|| Gerichtname.Enthält("Relevo")
|| Gerichtname.Enthält("Wochenende!")
|| Gerichtname.Enthält("Preise pro 100 g")
|| Gerichtname.Enthält("Preis pro 100 g")
|| Gerichtname.Enthält("Preis pro 100g") { // WARUM??? Es gibt einfach beide!
weitermachen;
}
setze Zeichenkette Titel auf Formatiere("Kaunter %d" / Kaunter);
falls Kaunter == -1 {
aendere Titel auf "K/A ";
}
Resultat.Hinzufügen(erstelle {
Zeichenkette ZeitSlot auf ZeitSlot /
Zeichenkette Titel auf Titel /
Zeichenkette Beschreibung auf Gerichtname /
Fließkommazahl Preis auf Preis /
Fliesskommazahl Protein_GR auf Protein /
Fliesskommazahl Kcal auf Kcal /
Fliesskommazahl Fett_GR auf Fett /
Fliesskommazahl Zucker_GR auf Zucker /
Fliesskommazahl Kohlenhydrate_GR auf Kohlenhydrate /
Zeichenkette ZeitSlot auf ZeitSlot /
});
}
Zähler += 1;
}
Resultat
}
//
// ENDE LIB.
//
setze Zeichenkette KEINE_DATEN auf "! OBACHT: Keine Daten vorhanden";
setze Wahrheitswert ZEIGE_MEHR_NACHRICHTEN auf nein;
funk Bewerbung() ergibt Zeichenkette { "Hallo Welt!" }
funk Einschreibung(Zahl Matrikelnummer) ergibt Nichts {
setze Zahl _ auf Matrikelnummer;
}
funk Studium() ergibt Nichts {
setze Liste von Zeichenkette Args auf Argumente();
falls Args.Länge() == 1 {
Drucke("Erwartete Befehlszeilenargument <mensa-ort> <tages-verschiebung (wenn du willst)>, bekam nichts");
Aufgeben(69);
}
falls Args.Länge() > 3 {
Drucke("Erwartete Befehlszeilenargument <mensa-ort> <tages-verschiebung (wenn du willst)>, bekam vieel zu vieel");
Aufgeben(69);
}
setze Zeichenkette Eingabe auf Args[1];
setze Zahl Tages_Verschiebung auf 0;
// EXTREMST ABGEFUCKT -> das sollte aber nicht kaputt gehen???
// SORRY, falls das jemand findet -- Mike Myueller
falls Args.Länge() == 3 {
setze Zeichenkette Parser_Eingabe auf Formatiere("{\"tage\": %s}" / Args[2]);
setze Speicherbox Parser_Ausgabe auf Zergliedere_JSON(Parser_Eingabe) als Speicherbox;
aendere Tages_Verschiebung auf Parser_Ausgabe.Nehmen("tage") als Zahl;
//Drucke(Tages_Verschiebung); // THIS FUCKS ITSELF IF THERE IS NO ;
}
setze Zahl Mensa_Ort auf 0;
falls Eingabe == "hpi" {
ändere Mensa_Ort auf MENSA_GRIEBNITZSEE;
} sonst falls Eingabe == "filmuni" {
ändere Mensa_Ort auf MENSA_FILMUNI;
} sonst falls Eingabe == "bernau" {
Drucke(Formatiere("Gefährlicher Standort: <%s>\nValide, weniger gefährliche Standorte:\n - hpi\n - filmuni" / Eingabe));
Drucke("UND: wurde in Bernau überhaupt schon Essen erfunden? - Oder gibt es da nur Salz?");
Aufgeben(69);
} sonst falls Eingabe == "afrika" {
Drucke("@TimoNeyer - was gibt's? hast du den speiseplan gechief'd?");
Aufgeben(1);
} sonst {
Drucke(Formatiere("Unbekannter Standort: <%s>\nValide Standorte:\n - hpi\n - filmuni" / Eingabe));
Aufgeben(42);
}
// Erwarte einen Wahrheitswert fuer logging.
falls Args.Länge() == 3 {
ändere Eingabe auf Args[2];
falls Eingabe == "schreibe" {
ändere ZEIGE_MEHR_NACHRICHTEN auf ja;
}
}
Drucke(Formatiere("FAHRE HPI script version V%s für LINUX" / Versions_Nummer()));
Drucke("========================================================");
Aktualisiere(Mensa_Ort / Tages_Verschiebung);
}
funk Aktualisiere(Zahl Mensa_Ort / Zahl Tages_Verschiebung) ergibt Nichts {
Drucke(" ~> Lade Speiseangebot aus dem Internet herunter...");
falls Tages_Verschiebung != 0 {
Drucke(Formatiere(" ~> ANMERKUNG: Speiseangebot wird um %d Tag(e) verschoben." / Tages_Verschiebung));
}
setze Liste von Speise Speisen auf Lade_Speiseangebot(Mensa_Ort / Tages_Verschiebung);
Drucke(Formatiere(" ~> Speiseangebot bereit. %d Speisen geladen." / Speisen.Länge()));
setze Liste von Speise Mittagessen auf [];
setze Liste von Speise Abendessen auf [];
setze Zahl Zähler auf 0;
solange Zähler < Speisen.Länge() {
setze Speise S auf Speisen[Zähler];
setze Zeichenkette ZeitSlot auf S.ZeitSlot.Ersetze(" " / "");
falls ZeitSlot.Enthält("Mittagessen") {
Mittagessen.Hinzufügen(S);
} sonst falls ZeitSlot.Enthält("Abendessen") {
Abendessen.Hinzufügen(S);
} sonst falls ZeitSlot.Enthält("Automatenplan") {
falls ZEIGE_MEHR_NACHRICHTEN {
Drucke("[NACHRICHT] Ignoriere Automat");
}
} sonst {
Drucke(Formatiere("Nicht unterstützter ZeitSlot: `%s`" / ZeitSlot));
Aufgeben(1);
}
Zähler += 1;
}
Drucke("======= MITTAGESSEN ========");
Gericht_Liste_Drucken(Mittagessen);
Drucke("======== ABENDESSEN ========");
Gericht_Liste_Drucken(Abendessen);
}
funk Gericht_Liste_Drucken(Liste von Speise Eingabe) ergibt Nichts {
setze Fliesskommazahl Maximale_Protein auf 0,0;
setze Zahl Zähler auf 0;
solange Zähler < Eingabe.Länge() {
setze Speise S auf Eingabe[Zähler];
falls S.Protein_GR > Maximale_Protein {
aendere Maximale_Protein auf S.Protein_GR;
}
Zähler += 1;
}
setze Zahl Zähler auf 0;
solange Zähler < Eingabe.Länge() {
setze Speise S auf Eingabe[Zähler];
Drucke(Formatiere("\x1b[0;32m - %s | %.2f€ | %s\x1b[0m" / S.Titel / S.Preis / S.Beschreibung));
Drucke(Formatiere(
"\x1b[0;31m * %3@ d Kcal * %3@ dg. Protein * %3@ dg. Fett * %3@ dg. Kohl.\x1b[0m"
/ S.Kcal als Zahl
/ S.Protein_GR als Zahl
/ S.Fett_GR als Zahl
/ S.Kohlenhydrate_GR als Zahl
));
Zähler += 1;
}
falls Zähler == 0 {
// HOLY BALLS: this fails to compile if there is the ; missing
Drucke(" " / KEINE_DATEN);
}
}