Compare commits

...

3 commits
1.1.2 ... main

Author SHA1 Message Date
Matyáš Caras cd14eb62f3 Update README.md 2023-10-14 21:02:40 +02:00
Matyáš Caras 7ea3df0b2b
BREAKING: změnit alergeny na třídu, opravit propisování 2023-10-06 13:24:47 +02:00
Matyáš Caras 58db9adf6e
fix(burza): opravit burzaUrl u multiburza 2023-09-12 22:26:12 +02:00
6 changed files with 60 additions and 20 deletions

View file

@ -1,3 +1,11 @@
## 2.0.0
- Alergeny jsou nyní ve tříde `Alergen`
- Opravena chyba, kdy se HTML alergenů propisovalo do názvu jídla
## 1.1.4
- Opravit info o stavu na burze
## 1.1.3
- Opravit hledání burza URL u jídelen, kde je tlačítko ve tvaru `X ks do burzy`
## 1.1.2 ## 1.1.2
- Opravit negativní čísla v kreditu, účet pro platby by @tpkowastaken in https://github.com/hernikplays/canteenlib/pull/4 - Opravit negativní čísla v kreditu, účet pro platby by @tpkowastaken in https://github.com/hernikplays/canteenlib/pull/4
## 1.1.1 ## 1.1.1

View file

@ -11,8 +11,8 @@ Kantýny, které v adrese obsahují i číslo portu, dokážou být často probl
| Provozovatel | Verze iCanteen | Funkční | Verze knihovny | Adresa | | Provozovatel | Verze iCanteen | Funkční | Verze knihovny | Adresa |
|:--------------:|------------------|---------|----------------|---------| |:--------------:|------------------|---------|----------------|---------|
| SŠTE Brno | iCanteen 2.18.19 | ✅ | 1.0.1 | https://stravovani.sstebrno.cz | SŠTE Brno | iCanteen 2.19.13 | ✅ | 2.0.0 | https://stravovani.sstebrno.cz
| SPŠ Třebíč | iCanteen 2.10.25 | | 0.1.0-alpha | https://icanteen.spst.cz | SPŠ Třebíč | iCanteen 2.10.25 | | 0.1.0-alpha | https://icanteen.spst.cz
| SPŠEI Ostrava | iCanteen 2.17.03 | [zde](https://git.mnau.xyz/hernik/canteenlib/issues/2) | 1.0.1 | https://obedy.spseiostrava.cz:8443/ | SPŠEI Ostrava | iCanteen 2.17.03 | [zde](https://git.mnau.xyz/hernik/canteenlib/issues/2) | 1.0.1 | https://obedy.spseiostrava.cz:8443/
Pokud chcete přispět s testem, otestujte tuto knihovnu na instanci iCanteen, kde, nejlépe legálně, máte přístup, a nahlašte své poznatky [zde](https://git.mnau.xyz/hernik/canteenlib/issues/new?template=.github%2fISSUE_TEMPLATE%2fhl--en--kompatibility.md) Pokud chcete přispět s testem, otestujte tuto knihovnu na instanci iCanteen, kde, nejlépe legálně, máte přístup, a nahlašte své poznatky [zde](https://git.mnau.xyz/hernik/canteenlib/issues/new?template=.github%2fISSUE_TEMPLATE%2fhl--en--kompatibility.md)

View file

@ -1,3 +1,6 @@
## INFO
__Tato verze knihovny není dále vyvíjena. Vývoj teď probíhá na https://github.com/tpkowastaken/canteenlib__
## O knihovně ## O knihovně
Experimentální **neoficiální** webscrape knihovna pro komunikaci se systémem [iCanteen](https://www.z-ware.cz/internetove-objednavky). **Knihovna je aktuálně nestabilní! Používejte na vlastní riziko!** Experimentální **neoficiální** webscrape knihovna pro komunikaci se systémem [iCanteen](https://www.z-ware.cz/internetove-objednavky). **Knihovna je aktuálně nestabilní! Používejte na vlastní riziko!**

View file

@ -48,11 +48,12 @@ class Canteen {
prihlasen = false; prihlasen = false;
return Future.error("Uživatel není přihlášen"); return Future.error("Uživatel není přihlášen");
} }
var kreditMatch = double.tryParse(RegExp(r' +<span id="Kredit" .+?>(.+?)(?=&)') var kreditMatch = double.tryParse(
.firstMatch(r)! RegExp(r' +<span id="Kredit" .+?>(.+?)(?=&)')
.group(1)! .firstMatch(r)!
.replaceAll(",", ".") .group(1)!
.replaceAll(RegExp(r"[^\w.-]"), "")); .replaceAll(",", ".")
.replaceAll(RegExp(r"[^\w.-]"), ""));
var jmenoMatch = RegExp(r'(?<=jméno: <b>).+?(?=<\/b)').firstMatch(r); var jmenoMatch = RegExp(r'(?<=jméno: <b>).+?(?=<\/b)').firstMatch(r);
var prijmeniMatch = RegExp(r'(?<=příjmení: <b>).+?(?=<\/b)').firstMatch(r); var prijmeniMatch = RegExp(r'(?<=příjmení: <b>).+?(?=<\/b)').firstMatch(r);
var kategorieMatch = var kategorieMatch =
@ -60,7 +61,7 @@ class Canteen {
var ucetMatch = RegExp(r'účet pro platby do jídelny:\s*<b>(\d+/\d+)</b>') var ucetMatch = RegExp(r'účet pro platby do jídelny:\s*<b>(\d+/\d+)</b>')
.firstMatch(r) .firstMatch(r)
?.group(1) ?.group(1)
?.replaceAll(RegExp(r'<\/?b>'), '');//odstranit html tag <b> ?.replaceAll(RegExp(r'<\/?b>'), ''); //odstranit html tag <b>
var varMatch = var varMatch =
RegExp(r'(?<=variabilní symbol: <b>).+?(?=<\/b)').firstMatch(r); RegExp(r'(?<=variabilní symbol: <b>).+?(?=<\/b)').firstMatch(r);
var specMatch = var specMatch =
@ -305,10 +306,21 @@ class Canteen {
.replaceAll(' ,', ",") .replaceAll(' ,', ",")
.replaceAll(" <br>", "") .replaceAll(" <br>", "")
.replaceAll("\n", ""); .replaceAll("\n", "");
var alergeny = var alergenyList =
RegExp(r"""<span title=".+?" class="textGrey">(.+?)<\/span>""") RegExp(r"""<span(?: |\n).+?title="(.+?)".+?>(\d{1,2})""")
.allMatches(jidlaProDen) .allMatches(jidlaProDen)
.toList(); .toList();
var alergeny = alergenyList.map<Alergen>((e) {
var jmeno = RegExp(r'<b>(.+?)<\/b>')
.firstMatch(e.group(1).toString())!
.group(1);
var popis =
RegExp(r'<\/b> - (.+)').firstMatch(e.group(1).toString())?.group(1);
var kod = int.parse(e.group(2).toString());
return Alergen(nazev: jmeno!, kod: kod, popis: popis);
}).toList();
var vydejna = RegExp( var vydejna = RegExp(
r'(?<=<span class="smallBoldTitle button-link-align">).+?(?=<)') r'(?<=<span class="smallBoldTitle button-link-align">).+?(?=<)')
.firstMatch(o)! .firstMatch(o)!
@ -326,16 +338,19 @@ class Canteen {
} else { } else {
// jinak nastavíme URL pro burzu // jinak nastavíme URL pro burzu
var match = RegExp( var match = RegExp(
r"""db\/dbProcessOrder\.jsp.+?type=((plusburza)|(minusburza)).+?(?=')""") r"""db\/dbProcessOrder\.jsp.+?type=((plusburza)|(minusburza)|(multiburza)).+?(?=')""")
.firstMatch(o); .firstMatch(o);
if (match != null) { if (match != null) {
burzaUrl = match.group(0)!.replaceAll("amp;", ""); burzaUrl = match.group(0)!.replaceAll("amp;", "");
} }
} }
var jidloJmeno = RegExp(r'(.+?)(?=<sub>)')
.firstMatch(jidlaProDen)!
.group(1)
.toString();
jidla.add( jidla.add(
Jidlo( Jidlo(
nazev: jidlaProDen.replaceAll( nazev: jidloJmeno.replaceAll(
r' (?=[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉŤŇťň])', ''), r' (?=[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉŤŇťň])', ''),
objednano: objednano, objednano: objednano,
varianta: vydejna, varianta: vydejna,
@ -345,8 +360,8 @@ class Canteen {
den: obedDen, den: obedDen,
burzaUrl: burzaUrl, burzaUrl: burzaUrl,
naBurze: naBurze:
(burzaUrl == null) ? false : !burzaUrl.contains("plusburza"), (burzaUrl == null) ? false : burzaUrl.contains("minusburza"),
alergeny: [...alergeny.map((e) => e.group(1).toString())]), alergeny: alergeny),
); );
// KONEC formátování do třídy // KONEC formátování do třídy
} }
@ -394,7 +409,7 @@ class Canteen {
/// ///
/// Výstup: /// Výstup:
/// - Aktualizovaná instance [Jidlo] tohoto jídla NEBO [Future] jako chyba /// - Aktualizovaná instance [Jidlo] tohoto jídla NEBO [Future] jako chyba
Future<Jidlo> doBurzy(Jidlo j) async { Future<Jidlo> doBurzy(Jidlo j, {int amount = 1}) async {
if (!prihlasen) { if (!prihlasen) {
return Future.error("Uživatel není přihlášen"); return Future.error("Uživatel není přihlášen");
} }
@ -404,8 +419,13 @@ class Canteen {
"Jídlo nelze uložit do burzy nebo nemá adresu pro uložení"); "Jídlo nelze uložit do burzy nebo nemá adresu pro uložení");
} }
if (amount < 1 && j.burzaUrl!.endsWith("amount=")) {
return Future.error("Nemůžeš dát do burzy méně než jeden kus");
}
var finalUrl =
(j.burzaUrl!.endsWith("amount=")) ? "${j.burzaUrl}$amount" : j.burzaUrl;
try { try {
await _getRequest("/faces/secured/${j.burzaUrl!}"); // provést operaci await _getRequest("/faces/secured/$finalUrl"); // provést operaci
} catch (e) { } catch (e) {
return Future.error(e); return Future.error(e);
} }

View file

@ -24,7 +24,7 @@ class Jidlo {
/// Seznam alergenů /// Seznam alergenů
/// ///
/// Pokud se žádný nepodařilo najít, vrací prázdný seznam /// Pokud se žádný nepodařilo najít, vrací prázdný seznam
List<String> alergeny; List<Alergen> alergeny;
/// URL pro požadavek na objednání jídla /// URL pro požadavek na objednání jídla
final String? orderUrl; final String? orderUrl;
@ -44,6 +44,15 @@ class Jidlo {
required this.naBurze}); required this.naBurze});
} }
/// Popisuje alergen v jídelníčku
class Alergen {
final int kod;
final String nazev;
final String? popis;
const Alergen({required this.nazev, required this.kod, this.popis});
}
/// Reprezentuje cizí jídlo na burze /// Reprezentuje cizí jídlo na burze
class Burza { class Burza {
/// Den, který je jídlo vydáváno /// Den, který je jídlo vydáváno

View file

@ -1,6 +1,6 @@
name: canteenlib name: canteenlib
description: Library for communication with the czech canteen food ordering system iCanteen description: Library for communication with the czech canteen food ordering system iCanteen
version: 1.1.2 version: 2.0.0
repository: 'https://git.mnau.xyz/hernik/canteenlib' repository: 'https://git.mnau.xyz/hernik/canteenlib'
issue_tracker: 'https://git.mnau.xyz/hernik/canteenlib/issues' issue_tracker: 'https://git.mnau.xyz/hernik/canteenlib/issues'