2022-03-05 16:49:11 +01:00
|
|
|
import 'package:http/http.dart' as http;
|
|
|
|
|
2022-03-28 20:22:43 +02:00
|
|
|
import 'tridy.dart';
|
2022-03-05 16:49:11 +01:00
|
|
|
|
|
|
|
/*
|
2022-03-25 21:08:23 +01:00
|
|
|
MIT License
|
|
|
|
|
|
|
|
Copyright (c) 2022 Matyáš Caras and contributors
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
|
|
copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
SOFTWARE.
|
2022-03-05 16:49:11 +01:00
|
|
|
*/
|
2022-03-30 15:56:42 +02:00
|
|
|
|
|
|
|
/// Reprezentuje kantýnu
|
|
|
|
///
|
|
|
|
/// **Všechny metody v případě chyby vrací [Future] s chybovou hláškou.**
|
2022-03-05 16:49:11 +01:00
|
|
|
class Canteen {
|
2022-03-30 17:17:50 +02:00
|
|
|
/// Adresa kantýny
|
2022-03-28 20:22:43 +02:00
|
|
|
String url;
|
2022-03-30 17:17:50 +02:00
|
|
|
|
|
|
|
/// Sušenky potřebné pro komunikaci
|
2022-03-05 16:49:11 +01:00
|
|
|
Map<String, String> cookies = {"JSESSIONID": "", "XSRF-TOKEN": ""};
|
2022-03-30 17:17:50 +02:00
|
|
|
|
|
|
|
/// Je uživatel přihlášen?
|
2022-03-22 20:12:10 +01:00
|
|
|
bool prihlasen = false;
|
2022-03-05 16:49:11 +01:00
|
|
|
Canteen(this.url);
|
|
|
|
|
2022-03-28 20:22:43 +02:00
|
|
|
/// Vrátí informace o uživateli ve formě instance [Uzivatel]
|
|
|
|
Future<Uzivatel> ziskejUzivatele() async {
|
2022-03-30 16:28:16 +02:00
|
|
|
if (!prihlasen) return Future.error("Uživatel není přihlášen");
|
2022-03-28 20:22:43 +02:00
|
|
|
var r = await _getRequest("/web/setting");
|
2022-03-30 15:30:51 +02:00
|
|
|
if (r.contains("přihlášení uživatele")) {
|
2022-03-30 17:17:50 +02:00
|
|
|
prihlasen = false;
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error("Uživatel není přihlášen");
|
2022-03-30 15:30:51 +02:00
|
|
|
}
|
2022-03-22 20:12:10 +01:00
|
|
|
var m = double.tryParse(RegExp(r' +<span id="Kredit" .+?>(.+?)(?=&)')
|
|
|
|
.firstMatch(r)!
|
|
|
|
.group(1)!
|
|
|
|
.replaceAll(",", ".")
|
|
|
|
.replaceAll(RegExp(r"[^\w.]"), ""));
|
2022-03-28 20:22:43 +02:00
|
|
|
var jmenoMatch = RegExp(r'(?<=jméno: <b>).+?(?=<\/b)').firstMatch(r);
|
|
|
|
var prijmeniMatch = RegExp(r'(?<=příjmení: <b>).+?(?=<\/b)').firstMatch(r);
|
|
|
|
var kategorieMatch =
|
|
|
|
RegExp(r'(?<=kategorie: <b>).+?(?=<\/b)').firstMatch(r);
|
|
|
|
var ucetMatch = RegExp(r'(?<=účet pro platby do jídelny: <b>).+?(?=<\/b)')
|
|
|
|
.firstMatch(r);
|
|
|
|
var varMatch =
|
|
|
|
RegExp(r'(?<=variabilní symbol: <b>).+?(?=<\/b)').firstMatch(r);
|
|
|
|
var specMatch =
|
|
|
|
RegExp(r'(?<=specifický symbol: <b>).+?(?=<\/b)').firstMatch(r);
|
|
|
|
|
|
|
|
var jmeno = jmenoMatch?.group(0) ?? "";
|
|
|
|
var prijmeni = prijmeniMatch?.group(0) ?? "";
|
|
|
|
var kategorie = kategorieMatch?.group(0) ?? "";
|
|
|
|
var ucet = ucetMatch?.group(0) ?? "";
|
|
|
|
var varSymbol = varMatch?.group(0) ?? "";
|
|
|
|
var specSymbol = specMatch?.group(0) ?? "";
|
|
|
|
|
|
|
|
return Uzivatel(
|
|
|
|
jmeno: jmeno,
|
|
|
|
prijmeni: prijmeni,
|
|
|
|
kategorie: kategorie,
|
|
|
|
ucetProPlatby: ucet,
|
|
|
|
varSymbol: varSymbol,
|
|
|
|
specSymbol: specSymbol,
|
|
|
|
kredit: m ?? 0.0);
|
2022-03-22 20:12:10 +01:00
|
|
|
}
|
|
|
|
|
2022-03-30 17:17:50 +02:00
|
|
|
Future<void> _getFirstSession() async {
|
2022-03-30 15:30:51 +02:00
|
|
|
if (url.endsWith("/")) {
|
|
|
|
url = url.substring(0, url.length - 1);
|
|
|
|
} // odstranit lomítko
|
2022-03-05 16:49:11 +01:00
|
|
|
var res = await http.get(Uri.parse(url));
|
|
|
|
_parseCookies(res.headers['set-cookie']!);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Převede cookie řetězec z požadavku do mapy
|
|
|
|
void _parseCookies(String cookieString) {
|
|
|
|
Map<String, String> cookies = this.cookies;
|
|
|
|
var regCookie = RegExp(r'([A-Z\-]+=.+?(?=;))|(remember-me=.+?)(?=;)')
|
|
|
|
.allMatches(cookieString)
|
|
|
|
.toList();
|
|
|
|
for (var cook in regCookie) {
|
|
|
|
var c = cook.group(0).toString().split("=");
|
|
|
|
cookies[c[0]] = c[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Přihlášení do iCanteen
|
|
|
|
///
|
2022-03-30 17:17:50 +02:00
|
|
|
/// Vstup:
|
2022-03-05 16:49:11 +01:00
|
|
|
///
|
2022-03-30 17:17:50 +02:00
|
|
|
/// - `user` - uživatelské jméno | [String]
|
|
|
|
/// - `password` - heslo | [String]
|
|
|
|
///
|
|
|
|
/// Výstup:
|
|
|
|
/// - [bool] ve [Future], v případě přihlášení `true`, v případě špatného hesla `false`
|
2022-03-22 20:12:10 +01:00
|
|
|
Future<bool> login(String user, String password) async {
|
2022-03-05 16:49:11 +01:00
|
|
|
if (cookies["JSESSIONID"] == "" || cookies["XSRF-TOKEN"] == "") {
|
2022-03-30 17:17:50 +02:00
|
|
|
await _getFirstSession();
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
var res =
|
2022-10-30 11:15:13 +01:00
|
|
|
await http.post(Uri.parse("$url/j_spring_security_check"), headers: {
|
|
|
|
"Cookie":
|
|
|
|
"JSESSIONID=${cookies["JSESSIONID"]!}; XSRF-TOKEN=${cookies["XSRF-TOKEN"]!};",
|
2022-03-05 16:49:11 +01:00
|
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
|
|
}, body: {
|
|
|
|
"j_username": user,
|
|
|
|
"j_password": password,
|
|
|
|
"terminal": "false",
|
|
|
|
"_csrf": cookies["XSRF-TOKEN"],
|
|
|
|
"_spring_security_remember_me": "on",
|
|
|
|
"targetUrl":
|
|
|
|
"/faces/secured/main.jsp?terminal=false&status=true&printer=&keyboard="
|
|
|
|
});
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-22 20:12:10 +01:00
|
|
|
if (res.headers['set-cookie']!.contains("remember-me=;")) {
|
|
|
|
return false; // špatné heslo
|
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
if (res.statusCode != 302) {
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error("Chyba: ${res.body}");
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
2022-03-28 20:22:43 +02:00
|
|
|
_parseCookies(res.headers['set-cookie']!);
|
|
|
|
|
2022-03-22 20:12:10 +01:00
|
|
|
prihlasen = true;
|
|
|
|
return true;
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Builder pro GET request
|
2022-03-30 15:30:51 +02:00
|
|
|
Future<String> _getRequest(String path) async {
|
2022-03-05 16:49:11 +01:00
|
|
|
var r = await http.get(Uri.parse(url + path), headers: {
|
2022-10-30 11:15:13 +01:00
|
|
|
"Cookie":
|
|
|
|
"JSESSIONID=${cookies["JSESSIONID"]!}; XSRF-TOKEN=${cookies["XSRF-TOKEN"]!}${cookies.containsKey("remember-me") ? "; ${cookies["remember-me"]!};" : ";"}",
|
2022-03-05 16:49:11 +01:00
|
|
|
});
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-04-12 14:25:21 +02:00
|
|
|
if (r.statusCode != 200 ||
|
|
|
|
r.body.contains("fail") ||
|
|
|
|
r.body.contains("Chyba")) {
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error("Chyba: ${r.body}");
|
2022-03-28 20:22:43 +02:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-04-12 14:25:21 +02:00
|
|
|
if (r.body.contains("přihlášení uživatele")) {
|
|
|
|
prihlasen = false;
|
|
|
|
return Future.error("Uživatel není přihlášen");
|
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
if (r.headers.containsKey("set-cookie")) {
|
|
|
|
_parseCookies(r.headers["set-cookie"]!);
|
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
return r.body;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Získá jídelníček bez cen
|
2022-03-30 17:17:50 +02:00
|
|
|
///
|
|
|
|
/// Výstup:
|
|
|
|
/// - [List] s [Jidelnicek], který neobsahuje ceny
|
|
|
|
///
|
|
|
|
/// __Lze použít bez přihlášení__
|
2022-03-05 16:49:11 +01:00
|
|
|
Future<List<Jidelnicek>> ziskejJidelnicek() async {
|
|
|
|
var res = await _getRequest("/");
|
|
|
|
var reg = RegExp(
|
|
|
|
r'((?=<div class="jidelnicekDen">).+?(?=<div class="jidelnicekDen">))|((?=<div class="jidelnicekDen">).*<\/span>)',
|
|
|
|
dotAll: true)
|
2022-03-30 15:30:51 +02:00
|
|
|
.allMatches(res)
|
2022-03-05 16:49:11 +01:00
|
|
|
.toList();
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
List<Jidelnicek> jidelnicek = [];
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
for (var t in reg) {
|
|
|
|
// projedeme každý den individuálně
|
2022-09-04 11:38:22 +02:00
|
|
|
var j = t.group(0).toString(); // převedeme text na něco přehlednějšího
|
2022-03-05 16:49:11 +01:00
|
|
|
var den = DateTime.parse(RegExp(r'(?<=day-).+?(?=")', dotAll: true)
|
|
|
|
.firstMatch(j)!
|
|
|
|
.group(0)
|
|
|
|
.toString());
|
|
|
|
var jidlaDenne = RegExp(
|
|
|
|
r'(?=<div class="container">).+?<\/div>.+?(?=<\/div>)',
|
|
|
|
dotAll: true)
|
|
|
|
.allMatches(j)
|
|
|
|
.toList(); // získáme jednotlivá jídla pro den / VERZE 2.18
|
|
|
|
if (jidlaDenne.isEmpty) {
|
|
|
|
jidlaDenne = RegExp(
|
|
|
|
r'(?=<div style="padding: 2 0 2 20">).+?(?=<\/div>)',
|
|
|
|
dotAll: true)
|
|
|
|
.allMatches(j)
|
|
|
|
.toList(); // získáme jednotlivá jídla pro den / VERZE 2.10
|
|
|
|
}
|
|
|
|
|
|
|
|
List<Jidlo> jidla = [];
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
for (var jidloNaDen in jidlaDenne) {
|
|
|
|
// projedeme vsechna jidla
|
|
|
|
var s = jidloNaDen.group(0)!.replaceAll(
|
|
|
|
RegExp(
|
|
|
|
r'[a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:] [a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:]'),
|
|
|
|
''); // odstraní dvojté mezery mezi písmeny
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 17:18:57 +01:00
|
|
|
var vydejna = RegExp(r'(?<=<span style="color: #1b75bb;">).+?(?=<)')
|
2022-03-05 16:49:11 +01:00
|
|
|
.firstMatch(s); // název výdejny / verze 2.18
|
2022-03-05 17:18:57 +01:00
|
|
|
vydejna ??= RegExp(
|
2022-03-22 20:12:10 +01:00
|
|
|
// TODO: Lepší systém pro podporu různých verzí iCanteen
|
2022-03-05 16:49:11 +01:00
|
|
|
r'(?<=<span class="smallBoldTitle" style="color: #1b75bb;">).+?(?=<)')
|
|
|
|
.firstMatch(s); // název výdejny / verze 2.10
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
var hlavni = RegExp(
|
|
|
|
r' {20}(([a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+ )+[a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+)',
|
|
|
|
dotAll: true)
|
|
|
|
.firstMatch(s)!
|
|
|
|
.group(1)
|
|
|
|
.toString(); // Jídlo
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
jidla.add(Jidlo(
|
|
|
|
nazev: hlavni,
|
|
|
|
objednano: false,
|
2022-03-30 15:30:51 +02:00
|
|
|
varianta: vydejna!.group(0).toString(),
|
2022-03-22 20:12:10 +01:00
|
|
|
lzeObjednat: false,
|
2022-03-28 17:04:55 +02:00
|
|
|
den: den,
|
|
|
|
naBurze: false));
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
|
|
|
jidelnicek.add(Jidelnicek(den, jidla));
|
|
|
|
}
|
|
|
|
return jidelnicek;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Získá jídlo pro daný den
|
2022-03-30 17:17:50 +02:00
|
|
|
///
|
|
|
|
/// __Vyžaduje přihlášení pomocí [login]__
|
|
|
|
///
|
|
|
|
/// Vstup:
|
|
|
|
/// - `den` - *volitelné*, určuje pro jaký den chceme získat jídelníček | [DateTime]
|
|
|
|
///
|
|
|
|
/// Výstup:
|
|
|
|
/// - [Jidelnicek] obsahující detaily, které vidí přihlášený uživatel
|
2022-03-22 20:12:10 +01:00
|
|
|
Future<Jidelnicek> jidelnicekDen({DateTime? den}) async {
|
2022-03-30 15:30:51 +02:00
|
|
|
if (!prihlasen) {
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error("Uživatel není přihlášen");
|
2022-03-30 15:30:51 +02:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-22 20:12:10 +01:00
|
|
|
den ??= DateTime.now();
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-04-12 14:25:21 +02:00
|
|
|
String res;
|
|
|
|
try {
|
|
|
|
res = await _getRequest(
|
2022-10-30 11:15:13 +01:00
|
|
|
"/faces/secured/main.jsp?day=${den.year}-${(den.month < 10) ? "0${den.month}" : den.month}-${(den.day < 10) ? "0${den.day}" : den.day}&terminal=false&printer=false&keyboard=false");
|
2022-04-12 14:25:21 +02:00
|
|
|
} catch (e) {
|
|
|
|
return Future.error(e);
|
2022-03-22 20:12:10 +01:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-22 20:12:10 +01:00
|
|
|
var obedDen = DateTime.parse(RegExp(r'(?<=day-).+?(?=")', dotAll: true)
|
|
|
|
.firstMatch(res)!
|
2022-03-05 16:49:11 +01:00
|
|
|
.group(0)
|
|
|
|
.toString());
|
|
|
|
var jidla = <Jidlo>[];
|
2022-10-30 11:15:13 +01:00
|
|
|
var jidelnicek = RegExp(
|
|
|
|
r'(?<=<div class="jidWrapLeft">).+?((fa-clock)|(fa-ban))',
|
|
|
|
dotAll: true)
|
|
|
|
.allMatches(res)
|
|
|
|
.toList();
|
2022-03-05 16:49:11 +01:00
|
|
|
for (var obed in jidelnicek) {
|
|
|
|
// formátování do třídy
|
|
|
|
var o = obed
|
|
|
|
.group(0)
|
|
|
|
.toString()
|
|
|
|
.replaceAll(RegExp(r'( )+|([^>a-z]\n)'), '');
|
|
|
|
var objednano = o.contains("Máte objednáno");
|
2022-05-02 11:58:15 +02:00
|
|
|
var lzeObjednat = !(o.contains("nelze zrušit") ||
|
|
|
|
o.contains("nelze objednat") ||
|
|
|
|
o.contains("nelze změnit"));
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
var cenaMatch =
|
2022-10-30 11:15:13 +01:00
|
|
|
RegExp(r'((?<=Cena objednaného jídla">).+?(?=&))').firstMatch(o);
|
2022-03-22 20:12:10 +01:00
|
|
|
cenaMatch ??=
|
|
|
|
RegExp(r'(?<=Cena při objednání jídla: ).+?(?=&)').firstMatch(o);
|
2022-03-05 16:49:11 +01:00
|
|
|
cenaMatch ??=
|
|
|
|
RegExp(r'(?<=Cena při objednání jídla">).+?(?=&)').firstMatch(o);
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
var cena =
|
|
|
|
double.parse(cenaMatch!.group(0).toString().replaceAll(",", "."));
|
2022-10-04 16:45:09 +02:00
|
|
|
var jidlaProDen =
|
|
|
|
RegExp(r'<div class="jidWrapCenter.+?>(.+?)(?=<\/div>)', dotAll: true)
|
|
|
|
.firstMatch(o)!
|
|
|
|
.group(1)
|
|
|
|
.toString()
|
|
|
|
.replaceAll(' ,', ",")
|
2022-10-30 11:15:13 +01:00
|
|
|
.replaceAll(" <br>", "")
|
|
|
|
.replaceAll("\n", "");
|
|
|
|
var alergeny =
|
|
|
|
RegExp(r"""<span title=".+?" class="textGrey">([a-zA-Z]*)<\/span>""")
|
|
|
|
.allMatches(jidlaProDen)
|
|
|
|
.toList();
|
2022-03-05 16:49:11 +01:00
|
|
|
var vydejna = RegExp(
|
2022-03-05 17:18:57 +01:00
|
|
|
r'(?<=<span class="smallBoldTitle button-link-align">).+?(?=<)')
|
2022-03-05 16:49:11 +01:00
|
|
|
.firstMatch(o)!
|
|
|
|
.group(0)
|
|
|
|
.toString();
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
String? orderUrl;
|
2022-03-24 15:42:04 +01:00
|
|
|
String? burzaUrl;
|
2022-03-05 16:49:11 +01:00
|
|
|
if (lzeObjednat) {
|
|
|
|
// pokud lze objednat, nastavíme adresu pro objednání
|
2022-03-24 15:42:04 +01:00
|
|
|
var match = RegExp(r"(?<=ajaxOrder\(this, ').+?(?=')").firstMatch(o);
|
|
|
|
if (match != null) {
|
|
|
|
orderUrl = match.group(0)!.replaceAll("amp;", "");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// jinak nastavíme URL pro burzu
|
2022-04-05 18:17:00 +02:00
|
|
|
var match = RegExp(
|
2022-10-30 11:15:13 +01:00
|
|
|
r"""db\/dbProcessOrder\.jsp.+?type=((plusburza)|(minusburza)).+?(?=')""")
|
2022-04-05 18:17:00 +02:00
|
|
|
.firstMatch(o);
|
2022-03-24 15:42:04 +01:00
|
|
|
if (match != null) {
|
2022-12-14 19:33:40 +01:00
|
|
|
burzaUrl = match.group(0)!.replaceAll("amp;", "");
|
2022-03-24 15:42:04 +01:00
|
|
|
}
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-10-30 11:15:13 +01:00
|
|
|
jidla.add(
|
|
|
|
Jidlo(
|
|
|
|
nazev: jidlaProDen.replaceAll(
|
|
|
|
r' (?=[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉŤŇťň])', ''),
|
|
|
|
objednano: objednano,
|
|
|
|
varianta: vydejna,
|
|
|
|
lzeObjednat: lzeObjednat,
|
|
|
|
cena: cena,
|
|
|
|
orderUrl: orderUrl,
|
|
|
|
den: obedDen,
|
|
|
|
burzaUrl: burzaUrl,
|
|
|
|
naBurze:
|
|
|
|
(burzaUrl == null) ? false : !burzaUrl.contains("plusburza"),
|
|
|
|
alergeny: [...alergeny.map((e) => e.group(1).toString())]),
|
|
|
|
);
|
2022-03-05 16:49:11 +01:00
|
|
|
// KONEC formátování do třídy
|
|
|
|
}
|
|
|
|
|
2022-03-22 20:12:10 +01:00
|
|
|
return Jidelnicek(obedDen, jidla);
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
|
|
|
|
2022-03-22 20:12:10 +01:00
|
|
|
/// Objedná vybrané jídlo
|
2022-03-30 15:30:51 +02:00
|
|
|
///
|
2022-03-30 17:17:50 +02:00
|
|
|
/// Vstup:
|
|
|
|
/// - `j` - Jídlo, které chceme objednat | [Jidlo]
|
|
|
|
///
|
|
|
|
/// Výstup:
|
2022-04-05 18:45:47 +02:00
|
|
|
/// - Aktualizovaná instance [Jidlo] tohoto jídla
|
2022-03-22 20:12:10 +01:00
|
|
|
Future<Jidlo> objednat(Jidlo j) async {
|
2022-03-30 15:30:51 +02:00
|
|
|
if (!prihlasen) {
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error("Uživatel není přihlášen");
|
2022-03-30 15:30:51 +02:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-05 16:49:11 +01:00
|
|
|
if (!j.lzeObjednat || j.orderUrl == null || j.orderUrl!.isEmpty) {
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error(
|
|
|
|
"Jídlo nelze objednat nebo nemá adresu pro objednání");
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
2022-04-12 14:25:21 +02:00
|
|
|
|
|
|
|
try {
|
2022-10-30 11:15:13 +01:00
|
|
|
await _getRequest("/faces/secured/${j.orderUrl!}"); // provést operaci
|
2022-04-12 14:25:21 +02:00
|
|
|
} catch (e) {
|
|
|
|
return Future.error(e);
|
2022-03-30 15:30:51 +02:00
|
|
|
}
|
2022-03-22 20:12:10 +01:00
|
|
|
|
2022-04-05 18:45:47 +02:00
|
|
|
var novy = (await jidelnicekDen(den: j.den))
|
|
|
|
.jidla
|
|
|
|
.where(
|
|
|
|
(element) => element.nazev == j.nazev,
|
|
|
|
)
|
|
|
|
.toList()[0];
|
2022-03-24 15:42:04 +01:00
|
|
|
|
2022-04-05 18:45:47 +02:00
|
|
|
return novy; // vrátit novou instanci
|
2022-03-24 15:42:04 +01:00
|
|
|
}
|
|
|
|
|
2022-03-30 15:30:51 +02:00
|
|
|
/// Uloží vaše jídlo z/do burzy
|
2022-03-28 20:22:43 +02:00
|
|
|
///
|
2022-03-30 17:17:50 +02:00
|
|
|
/// Vstup:
|
|
|
|
/// - `j` - Jídlo, které chceme dát/vzít do/z burzy | [Jidlo]
|
|
|
|
///
|
|
|
|
/// Výstup:
|
2022-04-05 18:45:47 +02:00
|
|
|
/// - Aktualizovaná instance [Jidlo] tohoto jídla NEBO [Future] jako chyba
|
2022-03-24 15:42:04 +01:00
|
|
|
Future<Jidlo> doBurzy(Jidlo j) async {
|
2022-03-30 15:30:51 +02:00
|
|
|
if (!prihlasen) {
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error("Uživatel není přihlášen");
|
2022-03-30 15:30:51 +02:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-24 15:42:04 +01:00
|
|
|
if (j.burzaUrl == null || j.burzaUrl!.isEmpty) {
|
2022-03-30 16:28:16 +02:00
|
|
|
return Future.error(
|
2022-03-30 15:30:51 +02:00
|
|
|
"Jídlo nelze uložit do burzy nebo nemá adresu pro uložení");
|
2022-03-24 15:42:04 +01:00
|
|
|
}
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-04-12 14:25:21 +02:00
|
|
|
try {
|
2022-10-30 11:15:13 +01:00
|
|
|
await _getRequest("/faces/secured/${j.burzaUrl!}"); // provést operaci
|
2022-04-12 14:25:21 +02:00
|
|
|
} catch (e) {
|
|
|
|
return Future.error(e);
|
2022-03-30 15:30:51 +02:00
|
|
|
}
|
|
|
|
|
2022-04-05 18:45:47 +02:00
|
|
|
var novy = (await jidelnicekDen(den: j.den))
|
|
|
|
.jidla
|
|
|
|
.where(
|
|
|
|
(element) => element.nazev == j.nazev,
|
|
|
|
)
|
|
|
|
.toList()[0];
|
2022-03-24 15:42:04 +01:00
|
|
|
|
2022-04-05 18:45:47 +02:00
|
|
|
return novy; // vrátit upravenou instanci
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|
2022-03-30 15:30:51 +02:00
|
|
|
|
|
|
|
/// Získá aktuální jídla v burze
|
2022-03-30 15:56:42 +02:00
|
|
|
///
|
2022-03-30 17:17:50 +02:00
|
|
|
/// Výstup:
|
|
|
|
/// - List instancí [Burza], každá obsahuje informace o jídle v burze
|
2022-03-30 15:30:51 +02:00
|
|
|
Future<List<Burza>> ziskatBurzu() async {
|
2022-03-30 16:28:16 +02:00
|
|
|
if (!prihlasen) return Future.error("Uživatel není přihlášen");
|
2022-03-30 15:30:51 +02:00
|
|
|
List<Burza> burza = [];
|
2022-04-12 14:25:21 +02:00
|
|
|
|
|
|
|
String res;
|
|
|
|
try {
|
|
|
|
res = await _getRequest("/faces/secured/burza.jsp");
|
|
|
|
} catch (e) {
|
|
|
|
return Future.error(e);
|
2022-03-30 15:30:51 +02:00
|
|
|
}
|
2022-04-12 14:25:21 +02:00
|
|
|
|
2022-03-30 15:30:51 +02:00
|
|
|
var dostupnaJidla =
|
|
|
|
RegExp(r'(?<=<tr class="mouseOutRow">).+?(?=<\/tr>)', dotAll: true)
|
2022-04-12 14:25:21 +02:00
|
|
|
.allMatches(res); // vyfiltrujeme jednotlivá jídla
|
2022-03-30 15:30:51 +02:00
|
|
|
if (dostupnaJidla.isNotEmpty) {
|
|
|
|
for (var burzaMatch in dostupnaJidla) {
|
|
|
|
var bu = burzaMatch.group(0)!;
|
|
|
|
var data = RegExp(
|
|
|
|
r'((?<=<td>).+?(?=<))|(?<=<td align="left">).+?(?=<)|((?<=<td align="right">).+?(?=<))',
|
|
|
|
dotAll: true)
|
|
|
|
.allMatches(bu)
|
|
|
|
.toList();
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-30 15:30:51 +02:00
|
|
|
// Získat datum
|
|
|
|
var datumRaw = RegExp(r'\d\d\.\d\d\.\d{4}')
|
|
|
|
.firstMatch(data[1].group(0)!)!
|
|
|
|
.group(0)!
|
|
|
|
.split(".");
|
|
|
|
var datum =
|
|
|
|
DateTime.parse("${datumRaw[2]}-${datumRaw[1]}-${datumRaw[0]}");
|
|
|
|
// Získat variantu
|
|
|
|
var varianta = data[0].group(0)!;
|
|
|
|
// Získat název jídla
|
|
|
|
var nazev = data[2].group(0)!.replaceAll(RegExp(r'\n| '), "");
|
|
|
|
// Získat počet kusů
|
2022-04-09 17:33:14 +02:00
|
|
|
var pocet = int.parse(data[4].group(0)!.replaceAll(" ks", ""));
|
2022-04-20 16:13:24 +02:00
|
|
|
var url = RegExp(r"(?<=')db.+?(?=')")
|
|
|
|
.firstMatch(bu)!
|
|
|
|
.group(0)!
|
|
|
|
.replaceAll("&", "&");
|
2022-09-04 11:38:22 +02:00
|
|
|
|
2022-03-30 15:30:51 +02:00
|
|
|
var jidlo = Burza(
|
|
|
|
den: datum,
|
|
|
|
varianta: varianta,
|
2022-04-05 17:06:25 +02:00
|
|
|
nazev: nazev,
|
2022-03-30 15:30:51 +02:00
|
|
|
pocet: pocet,
|
|
|
|
url: url);
|
|
|
|
burza.add(jidlo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return burza;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Objedná jídlo z burzy pomocí URL z instance třídy Burza
|
|
|
|
///
|
2022-03-30 17:17:50 +02:00
|
|
|
/// Vstup:
|
|
|
|
/// - `b` - Jídlo __z burzy__, které chceme objednat | [Burza]
|
|
|
|
///
|
|
|
|
/// Výstup:
|
2022-06-02 15:25:39 +02:00
|
|
|
/// - [bool], `true`, pokud bylo jídlo úspěšně objednáno z burzy, jinak `Exception`
|
2022-03-30 15:30:51 +02:00
|
|
|
Future<bool> objednatZBurzy(Burza b) async {
|
2022-04-05 18:45:47 +02:00
|
|
|
if (!prihlasen) return Future.error("Uživatel není přihlášen");
|
2022-04-12 14:25:21 +02:00
|
|
|
try {
|
2022-10-30 11:15:13 +01:00
|
|
|
await _getRequest("/faces/secured/${b.url!}");
|
2022-04-12 14:25:21 +02:00
|
|
|
} catch (e) {
|
2022-06-02 15:25:39 +02:00
|
|
|
return Future.error(e.toString());
|
2022-04-12 14:25:21 +02:00
|
|
|
}
|
2022-03-30 15:30:51 +02:00
|
|
|
return true;
|
|
|
|
}
|
2022-03-05 16:49:11 +01:00
|
|
|
}
|