Opravy a vylepšení
This commit is contained in:
parent
c22e4535ae
commit
6d4ed8b99e
6 changed files with 91 additions and 25 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -2,4 +2,4 @@
|
||||||
library canteenlib;
|
library canteenlib;
|
||||||
|
|
||||||
export 'src/canteen.dart';
|
export 'src/canteen.dart';
|
||||||
export 'src/jidlo.dart';
|
export 'src/tridy.dart';
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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});
|
||||||
|
}
|
|
@ -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'
|
||||||
|
|
||||||
|
|
Reference in a new issue