Opravy a vylepšení

This commit is contained in:
Matyáš Caras 2022-03-28 20:22:43 +02:00
parent c22e4535ae
commit 6d4ed8b99e
6 changed files with 91 additions and 25 deletions

View file

@ -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 ## 0.1.0-alpha.1
- Aktualizace licence - Aktualizace licence

View file

@ -4,7 +4,7 @@ void main(List<String> args) {
Canteen c = Canteen("https://kantyna.neco.cz"); Canteen c = Canteen("https://kantyna.neco.cz");
c.login("uzivatel", "heslo").then((value) { c.login("uzivatel", "heslo").then((value) {
c.jidelnicekDen(den: DateTime.parse("2022-04-04")).then((t) async { 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( c.objednat(t.jidla[0]).then(
(value) { (value) {
t.jidla[0] = value; // divně udělané ale nic lepšího teď nevymyslím t.jidla[0] = value; // divně udělané ale nic lepšího teď nevymyslím

View file

@ -2,4 +2,4 @@
library canteenlib; library canteenlib;
export 'src/canteen.dart'; export 'src/canteen.dart';
export 'src/jidlo.dart'; export 'src/tridy.dart';

View file

@ -2,7 +2,7 @@ import 'dart:io';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'jidlo.dart'; import 'tridy.dart';
/* /*
MIT License MIT License
@ -28,31 +28,52 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
class Canteen { class Canteen {
final String url; String url;
Map<String, String> cookies = {"JSESSIONID": "", "XSRF-TOKEN": ""}; Map<String, String> cookies = {"JSESSIONID": "", "XSRF-TOKEN": ""};
double _kredit = 0.0;
bool prihlasen = false; bool prihlasen = false;
Canteen(this.url); Canteen(this.url);
/// Vrátí aktuální kredit ze serveru jako [double]. Jelikož je async, nejdřív [Future] /// Vrátí informace o uživateli ve formě instance [Uzivatel]
/// Future<Uzivatel> ziskejUzivatele() async {
/// Nastane-li chyba, vrací 0 if (!prihlasen) throw Exception("Bez přihlášení");
Future<double> ziskejKredit() async { var r = await _getRequest("/web/setting");
if (!prihlasen) return 0.0; if (r == null) throw Exception("Při požadavku došlo k chybě");
var r = await _getRequest("/faces/secured/main.jsp");
if (r == null) return 0.0;
File("./test.txt").writeAsStringSync(r);
var m = double.tryParse(RegExp(r' +<span id="Kredit" .+?>(.+?)(?=&)') var m = double.tryParse(RegExp(r' +<span id="Kredit" .+?>(.+?)(?=&)')
.firstMatch(r)! .firstMatch(r)!
.group(1)! .group(1)!
.replaceAll(",", ".") .replaceAll(",", ".")
.replaceAll(RegExp(r"[^\w.]"), "")); .replaceAll(RegExp(r"[^\w.]"), ""));
if (m == null) return 0.0; var jmenoMatch = RegExp(r'(?<=jméno: <b>).+?(?=<\/b)').firstMatch(r);
_kredit = m; var prijmeniMatch = RegExp(r'(?<=příjmení: <b>).+?(?=<\/b)').firstMatch(r);
return _kredit; 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);
} }
Future<void> getFirstSession() async { Future<void> getFirstSession() async {
if (url.endsWith("/"))
url = url.substring(0, url.length - 1); // odstranit lomítko
var res = await http.get(Uri.parse(url)); var res = await http.get(Uri.parse(url));
_parseCookies(res.headers['set-cookie']!); _parseCookies(res.headers['set-cookie']!);
} }
@ -74,8 +95,8 @@ class Canteen {
/// `user` - uživatelské jméno /// `user` - uživatelské jméno
/// `password` - heslo /// `password` - heslo
/// ///
/// Vrátí `true`, když se uživatel přihlásil, jinak `false` /// Vrátí `true`, když se uživatel přihlásil, v případě špatného hesla `false`
/// TODO: Házet chyby /// V případě chyby na serveru vyhodí [Exception]
Future<bool> login(String user, String password) async { Future<bool> login(String user, String password) async {
if (cookies["JSESSIONID"] == "" || cookies["XSRF-TOKEN"] == "") { if (cookies["JSESSIONID"] == "" || cookies["XSRF-TOKEN"] == "") {
await getFirstSession(); await getFirstSession();
@ -101,17 +122,17 @@ class Canteen {
if (res.headers['set-cookie']!.contains("remember-me=;")) { if (res.headers['set-cookie']!.contains("remember-me=;")) {
return false; // špatné heslo return false; // špatné heslo
} }
_parseCookies(res.headers['set-cookie']!);
if (res.statusCode != 302) { if (res.statusCode != 302) {
print(res.body); throw Exception("Chyba: ${res.body}");
print("ERROR");
} }
_parseCookies(res.headers['set-cookie']!);
prihlasen = true; prihlasen = true;
return true; return true;
} }
/// Builder pro GET request /// Builder pro GET request
/// V případě chyby na serveru (divný status kód) vyhodí [Exception]
Future<String?> _getRequest(String path) async { Future<String?> _getRequest(String path) async {
var r = await http.get(Uri.parse(url + path), headers: { var r = await http.get(Uri.parse(url + path), headers: {
"Cookie": "JSESSIONID=" + "Cookie": "JSESSIONID=" +
@ -123,6 +144,9 @@ class Canteen {
? "; " + cookies["remember-me"]! + ";" ? "; " + cookies["remember-me"]! + ";"
: ";"), : ";"),
}); });
if (r.statusCode != 302) {
throw Exception("Chyba: ${r.body}");
}
if (r.headers.containsKey("set-cookie")) { if (r.headers.containsKey("set-cookie")) {
_parseCookies(r.headers["set-cookie"]!); _parseCookies(r.headers["set-cookie"]!);
} }
@ -197,7 +221,6 @@ class Canteen {
/// Získá jídlo pro daný den /// Získá jídlo pro daný den
/// Vyžaduje přihlášení pomocí [login] /// Vyžaduje přihlášení pomocí [login]
/// Aktuálně pouze dnešní den
Future<Jidelnicek> jidelnicekDen({DateTime? den}) async { Future<Jidelnicek> jidelnicekDen({DateTime? den}) async {
den ??= DateTime.now(); den ??= DateTime.now();
var res = await _getRequest( var res = await _getRequest(
@ -279,7 +302,6 @@ class Canteen {
/// Objedná vybrané jídlo /// Objedná vybrané jídlo
/// Vrátí upravenou instanci [Jidlo], v případě chyby vrací originální /// Vrátí upravenou instanci [Jidlo], v případě chyby vrací originální
Future<Jidlo> objednat(Jidlo j) async { Future<Jidlo> objednat(Jidlo j) async {
//TODO
if (!j.lzeObjednat || j.orderUrl == null || j.orderUrl!.isEmpty) { if (!j.lzeObjednat || j.orderUrl == null || j.orderUrl!.isEmpty) {
return j; return j;
} }
@ -324,6 +346,9 @@ class Canteen {
: !burzaUrl.contains("plusburza")); // vrátit upravenou instanci : !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<Jidlo> doBurzy(Jidlo j) async { Future<Jidlo> doBurzy(Jidlo j) async {
if (j.burzaUrl == null || j.burzaUrl!.isEmpty) { if (j.burzaUrl == null || j.burzaUrl!.isEmpty) {
return j; return j;

View file

@ -47,3 +47,40 @@ class Jidelnicek {
List<Jidlo> jidla; List<Jidlo> jidla;
Jidelnicek(this.den, this.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});
}

View file

@ -1,6 +1,6 @@
name: canteenlib name: canteenlib
description: Knihovna pro komunikaci se stravovacím systémem iCanteen 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' repository: 'https://github.com/hernikplays/canteenlib'
issue_tracker: 'https://github.com/hernikplays/canteenlib/issues' issue_tracker: 'https://github.com/hernikplays/canteenlib/issues'