diff --git a/lib/src/canteen.dart b/lib/src/canteen.dart index 2c56e82..0627acf 100644 --- a/lib/src/canteen.dart +++ b/lib/src/canteen.dart @@ -114,6 +114,7 @@ class Canteen { if (cookies["JSESSIONID"] == "" || cookies["XSRF-TOKEN"] == "") { await _getFirstSession(); } + var res = await http.post(Uri.parse(url + "/j_spring_security_check"), headers: { "Cookie": "JSESSIONID=" + @@ -132,9 +133,11 @@ class Canteen { "targetUrl": "/faces/secured/main.jsp?terminal=false&status=true&printer=&keyboard=" }); + if (res.headers['set-cookie']!.contains("remember-me=;")) { return false; // špatné heslo } + if (res.statusCode != 302) { return Future.error("Chyba: ${res.body}"); } @@ -156,18 +159,22 @@ class Canteen { ? "; " + cookies["remember-me"]! + ";" : ";"), }); + if (r.statusCode != 200 || r.body.contains("fail") || r.body.contains("Chyba")) { return Future.error("Chyba: ${r.body}"); } + if (r.body.contains("přihlášení uživatele")) { prihlasen = false; return Future.error("Uživatel není přihlášen"); } + if (r.headers.containsKey("set-cookie")) { _parseCookies(r.headers["set-cookie"]!); } + return r.body; } @@ -184,14 +191,12 @@ class Canteen { dotAll: true) .allMatches(res) .toList(); + List jidelnicek = []; + for (var t in reg) { // projedeme každý den individuálně - var j = t - .group(0) - .toString() /*.replaceAll(RegExp(r'( )+|([^>a-z]\n)'), - '')*/ - ; // převedeme text na něco přehlednějšího + var j = t.group(0).toString(); // převedeme text na něco přehlednějšího var den = DateTime.parse(RegExp(r'(?<=day-).+?(?=")', dotAll: true) .firstMatch(j)! .group(0) @@ -210,24 +215,28 @@ class Canteen { } List jidla = []; + 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 + var vydejna = RegExp(r'(?<=).+?(?=<)') .firstMatch(s); // název výdejny / verze 2.18 vydejna ??= RegExp( // TODO: Lepší systém pro podporu různých verzí iCanteen r'(?<=).+?(?=<)') .firstMatch(s); // název výdejny / verze 2.10 + var hlavni = RegExp( r' {20}(([a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+ )+[a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+)', dotAll: true) .firstMatch(s)! .group(1) .toString(); // Jídlo + jidla.add(Jidlo( nazev: hlavni, objednano: false, @@ -254,7 +263,9 @@ class Canteen { if (!prihlasen) { return Future.error("Uživatel není přihlášen"); } + den ??= DateTime.now(); + String res; try { res = await _getRequest( @@ -262,6 +273,7 @@ class Canteen { } catch (e) { return Future.error(e); } + var obedDen = DateTime.parse(RegExp(r'(?<=day-).+?(?=")', dotAll: true) .firstMatch(res)! .group(0) @@ -271,6 +283,7 @@ class Canteen { RegExp(r'(?<=
).+?((fa-clock))', dotAll: true) .allMatches(res) .toList(); + for (var obed in jidelnicek) { // formátování do třídy var o = obed @@ -281,12 +294,14 @@ class Canteen { var lzeObjednat = !(o.contains("nelze zrušit") || o.contains("nelze objednat") || o.contains("nelze změnit")); + var cenaMatch = RegExp(r'(?<=Cena objednaného jídla">).+?(?=&)').firstMatch(o); cenaMatch ??= RegExp(r'(?<=Cena při objednání jídla: ).+?(?=&)').firstMatch(o); cenaMatch ??= RegExp(r'(?<=Cena při objednání jídla">).+?(?=&)').firstMatch(o); + var cena = double.parse(cenaMatch!.group(0).toString().replaceAll(",", ".")); var jidlaProDen = RegExp(r'(?<=Polévka: ).+') @@ -301,6 +316,7 @@ class Canteen { .firstMatch(o)! .group(0) .toString(); + String? orderUrl; String? burzaUrl; if (lzeObjednat) { @@ -318,6 +334,7 @@ class Canteen { burzaUrl = match.group(1)!.replaceAll("amp;", ""); } } + jidla.add(Jidlo( nazev: jidlaProDen[1] .replaceAll(r' (?=[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉŤŇťň])', ''), @@ -347,6 +364,7 @@ class Canteen { if (!prihlasen) { return Future.error("Uživatel není přihlášen"); } + if (!j.lzeObjednat || j.orderUrl == null || j.orderUrl!.isEmpty) { return Future.error( "Jídlo nelze objednat nebo nemá adresu pro objednání"); @@ -379,10 +397,12 @@ class Canteen { if (!prihlasen) { return Future.error("Uživatel není přihlášen"); } + if (j.burzaUrl == null || j.burzaUrl!.isEmpty) { return Future.error( "Jídlo nelze uložit do burzy nebo nemá adresu pro uložení"); } + try { await _getRequest("/faces/secured/" + j.burzaUrl!); // provést operaci } catch (e) { @@ -425,6 +445,7 @@ class Canteen { dotAll: true) .allMatches(bu) .toList(); + // Získat datum var datumRaw = RegExp(r'\d\d\.\d\d\.\d{4}') .firstMatch(data[1].group(0)!)! @@ -442,6 +463,7 @@ class Canteen { .firstMatch(bu)! .group(0)! .replaceAll("&", "&"); + var jidlo = Burza( den: datum, varianta: varianta, diff --git a/test/canteenlib_test.dart b/test/canteenlib_test.dart index c697095..140b095 100644 --- a/test/canteenlib_test.dart +++ b/test/canteenlib_test.dart @@ -7,13 +7,24 @@ void main() { load(); Canteen c = Canteen(env["ADDRESS"]!); - setUp(() { - c.login(env["USER"]!, env["PASS"]!); + test('Log-in test', () { + c.login(env["USER"]!, env["PASS"]!).then((r) => expect(r, true)); }); test('First Test', () { - c.jidelnicekDen().then((t) { - expect(DateTime.now().day, t.den.day); + c.login(env["USER"]!, env["PASS"]!).then((r) { + c.jidelnicekDen().then((t) { + expect(DateTime.now().day, t.den.day); + }); + }); + }); + + test('Neprázdný jídelníček', () { + c.login(env["USER"]!, env["PASS"]!).then((r) { + c.jidelnicekDen(den: DateTime.parse("2022-08-15")).then((t) { + print(t.jidla[0].nazev); + expect(t.jidla[0].nazev.isNotEmpty, true); + }); }); }); });