diff --git a/CHANGELOG.md b/CHANGELOG.md index c1d8aba..a1ee111 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0-alpha.2 +- Nevytvářet debugovací soubor +- Místo ziskejKredit používáme ziskejUzivatele (Třída Uzivatel) +- Requesty by měly vyhazovat Exception při chybném požadavku (status kódu) ## 0.1.0-alpha.1 - Aktualizace licence diff --git a/example/canteenlib_example.dart b/example/canteenlib_example.dart index 895c97c..da5b8cb 100644 --- a/example/canteenlib_example.dart +++ b/example/canteenlib_example.dart @@ -4,7 +4,7 @@ void main(List args) { Canteen c = Canteen("https://kantyna.neco.cz"); c.login("uzivatel", "heslo").then((value) { c.jidelnicekDen(den: DateTime.parse("2022-04-04")).then((t) async { - print(await c.ziskejKredit()); + print((await c.ziskejUzivatele()).kredit); c.objednat(t.jidla[0]).then( (value) { t.jidla[0] = value; // divně udělané ale nic lepšího teď nevymyslím diff --git a/lib/canteenlib.dart b/lib/canteenlib.dart index 3e5f56b..c2a6dc5 100644 --- a/lib/canteenlib.dart +++ b/lib/canteenlib.dart @@ -2,4 +2,4 @@ library canteenlib; export 'src/canteen.dart'; -export 'src/jidlo.dart'; +export 'src/tridy.dart'; diff --git a/lib/src/canteen.dart b/lib/src/canteen.dart index b736db2..3a99114 100644 --- a/lib/src/canteen.dart +++ b/lib/src/canteen.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:http/http.dart' as http; -import 'jidlo.dart'; +import 'tridy.dart'; /* MIT License @@ -28,31 +28,52 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class Canteen { - final String url; + String url; Map cookies = {"JSESSIONID": "", "XSRF-TOKEN": ""}; - double _kredit = 0.0; bool prihlasen = false; Canteen(this.url); - /// Vrátí aktuální kredit ze serveru jako [double]. Jelikož je async, nejdřív [Future] - /// - /// Nastane-li chyba, vrací 0 - Future ziskejKredit() async { - if (!prihlasen) return 0.0; - var r = await _getRequest("/faces/secured/main.jsp"); - if (r == null) return 0.0; - File("./test.txt").writeAsStringSync(r); + /// Vrátí informace o uživateli ve formě instance [Uzivatel] + Future ziskejUzivatele() async { + if (!prihlasen) throw Exception("Bez přihlášení"); + var r = await _getRequest("/web/setting"); + if (r == null) throw Exception("Při požadavku došlo k chybě"); var m = double.tryParse(RegExp(r' +(.+?)(?=&)') .firstMatch(r)! .group(1)! .replaceAll(",", ".") .replaceAll(RegExp(r"[^\w.]"), "")); - if (m == null) return 0.0; - _kredit = m; - return _kredit; + var jmenoMatch = RegExp(r'(?<=jméno: ).+?(?=<\/b)').firstMatch(r); + var prijmeniMatch = RegExp(r'(?<=příjmení: ).+?(?=<\/b)').firstMatch(r); + var kategorieMatch = + RegExp(r'(?<=kategorie: ).+?(?=<\/b)').firstMatch(r); + var ucetMatch = RegExp(r'(?<=účet pro platby do jídelny: ).+?(?=<\/b)') + .firstMatch(r); + var varMatch = + RegExp(r'(?<=variabilní symbol: ).+?(?=<\/b)').firstMatch(r); + var specMatch = + RegExp(r'(?<=specifický symbol: ).+?(?=<\/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); } Future getFirstSession() async { + if (url.endsWith("/")) + url = url.substring(0, url.length - 1); // odstranit lomítko var res = await http.get(Uri.parse(url)); _parseCookies(res.headers['set-cookie']!); } @@ -74,8 +95,8 @@ class Canteen { /// `user` - uživatelské jméno /// `password` - heslo /// - /// Vrátí `true`, když se uživatel přihlásil, jinak `false` - /// TODO: Házet chyby + /// Vrátí `true`, když se uživatel přihlásil, v případě špatného hesla `false` + /// V případě chyby na serveru vyhodí [Exception] Future login(String user, String password) async { if (cookies["JSESSIONID"] == "" || cookies["XSRF-TOKEN"] == "") { await getFirstSession(); @@ -101,17 +122,17 @@ class Canteen { if (res.headers['set-cookie']!.contains("remember-me=;")) { return false; // špatné heslo } - - _parseCookies(res.headers['set-cookie']!); if (res.statusCode != 302) { - print(res.body); - print("ERROR"); + throw Exception("Chyba: ${res.body}"); } + _parseCookies(res.headers['set-cookie']!); + prihlasen = true; return true; } /// Builder pro GET request + /// V případě chyby na serveru (divný status kód) vyhodí [Exception] Future _getRequest(String path) async { var r = await http.get(Uri.parse(url + path), headers: { "Cookie": "JSESSIONID=" + @@ -123,6 +144,9 @@ class Canteen { ? "; " + cookies["remember-me"]! + ";" : ";"), }); + if (r.statusCode != 302) { + throw Exception("Chyba: ${r.body}"); + } if (r.headers.containsKey("set-cookie")) { _parseCookies(r.headers["set-cookie"]!); } @@ -197,7 +221,6 @@ class Canteen { /// Získá jídlo pro daný den /// Vyžaduje přihlášení pomocí [login] - /// Aktuálně pouze dnešní den Future jidelnicekDen({DateTime? den}) async { den ??= DateTime.now(); var res = await _getRequest( @@ -279,7 +302,6 @@ class Canteen { /// Objedná vybrané jídlo /// Vrátí upravenou instanci [Jidlo], v případě chyby vrací originální Future objednat(Jidlo j) async { - //TODO if (!j.lzeObjednat || j.orderUrl == null || j.orderUrl!.isEmpty) { return j; } @@ -324,6 +346,9 @@ class Canteen { : !burzaUrl.contains("plusburza")); // vrátit upravenou instanci } + /// Uloží jídlo z/do burzy + /// + /// Vrací upravenou instanci [Jidlo], v případě chyby vrací originální Future doBurzy(Jidlo j) async { if (j.burzaUrl == null || j.burzaUrl!.isEmpty) { return j; diff --git a/lib/src/jidlo.dart b/lib/src/tridy.dart similarity index 55% rename from lib/src/jidlo.dart rename to lib/src/tridy.dart index f0db210..387b85d 100644 --- a/lib/src/jidlo.dart +++ b/lib/src/tridy.dart @@ -47,3 +47,40 @@ class Jidelnicek { List jidla; Jidelnicek(this.den, this.jidla); } + +/// Reprezentuje informace o přihlášeném uživateli +class Uzivatel { + /// Uživatelské jméno + String? uzivatelskeJmeno; + + /// Jméno, jak je uvedené v základních údajích o uživateli + String? jmeno; + + /// příjmení, jak je uvedené v základních údajích o uživateli + String? prijmeni; + + /// Kategorie uživatele + String? kategorie; + + /// Účet jídelny pro zasílání plateb + String? ucetProPlatby; + + /// Variabilní symbol + String? varSymbol; + + /// Specifický symbol + String? specSymbol; + + /// Aktuální stav kreditu + double kredit; + + Uzivatel( + {this.uzivatelskeJmeno, + this.jmeno, + this.prijmeni, + this.kategorie, + this.ucetProPlatby, + this.varSymbol, + this.kredit = 0.0, + this.specSymbol}); +} diff --git a/pubspec.yaml b/pubspec.yaml index fb2e272..3381ed1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: canteenlib description: Knihovna pro komunikaci se stravovacím systémem iCanteen -version: 0.1.0-alpha.1 +version: 0.1.0-alpha.2 repository: 'https://github.com/hernikplays/canteenlib' issue_tracker: 'https://github.com/hernikplays/canteenlib/issues'