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
- Aktualizace licence

View file

@ -4,7 +4,7 @@ void main(List<String> 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

View file

@ -2,4 +2,4 @@
library canteenlib;
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 '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<String, String> 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<double> 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<Uzivatel> 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' +<span id="Kredit" .+?>(.+?)(?=&)')
.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>).+?(?=<\/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);
}
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));
_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<bool> 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<String?> _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<Jidelnicek> 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<Jidlo> 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<Jidlo> doBurzy(Jidlo j) async {
if (j.burzaUrl == null || j.burzaUrl!.isEmpty) {
return j;

View file

@ -47,3 +47,40 @@ class Jidelnicek {
List<Jidlo> 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
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'