2022-03-05 16:49:11 +01:00
import ' package:http/http.dart ' as http ;
2022-03-28 20:22:43 +02:00
import ' tridy.dart ' ;
2022-03-05 16:49:11 +01:00
/ *
2022-03-25 21:08:23 +01:00
MIT License
Copyright ( c ) 2022 Matyáš Caras and contributors
Permission is hereby granted , free of charge , to any person obtaining a copy
of this software and associated documentation files ( the " Software " ) , to deal
in the Software without restriction , including without limitation the rights
to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
copies of the Software , and to permit persons to whom the Software is
furnished to do so , subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE .
2022-03-05 16:49:11 +01:00
* /
2022-03-30 15:56:42 +02:00
/// Reprezentuje kantýnu
///
/// `url` - adresa kantýny
///
/// `cookies` - sušenky potřebné pro komunikaci
///
/// `prihlasen` - je uživatel přihlášen?
///
/// **Všechny metody v případě chyby vrací [Future] s chybovou hláškou.**
2022-03-05 16:49:11 +01:00
class Canteen {
2022-03-28 20:22:43 +02:00
String url ;
2022-03-05 16:49:11 +01:00
Map < String , String > cookies = { " JSESSIONID " : " " , " XSRF-TOKEN " : " " } ;
2022-03-22 20:12:10 +01:00
bool prihlasen = false ;
2022-03-05 16:49:11 +01:00
Canteen ( this . url ) ;
2022-03-28 20:22:43 +02:00
/// Vrátí informace o uživateli ve formě instance [Uzivatel]
Future < Uzivatel > ziskejUzivatele ( ) async {
2022-03-30 16:28:16 +02:00
if ( ! prihlasen ) return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-28 20:22:43 +02:00
var r = await _getRequest ( " /web/setting " ) ;
2022-03-30 15:30:51 +02:00
if ( r . contains ( " přihlášení uživatele " ) ) {
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
}
2022-03-22 20:12:10 +01:00
var m = double . tryParse ( RegExp ( r' +<span id="Kredit" .+?>(.+?)(?=&)' )
. firstMatch ( r ) !
. group ( 1 ) !
. replaceAll ( " , " , " . " )
. replaceAll ( RegExp ( r"[^\w.]" ) , " " ) ) ;
2022-03-28 20:22:43 +02:00
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 ) ;
2022-03-22 20:12:10 +01:00
}
2022-03-05 16:49:11 +01:00
Future < void > getFirstSession ( ) async {
2022-03-30 15:30:51 +02:00
if ( url . endsWith ( " / " ) ) {
url = url . substring ( 0 , url . length - 1 ) ;
} // odstranit lomítko
2022-03-05 16:49:11 +01:00
var res = await http . get ( Uri . parse ( url ) ) ;
_parseCookies ( res . headers [ ' set-cookie ' ] ! ) ;
}
/// Převede cookie řetězec z požadavku do mapy
void _parseCookies ( String cookieString ) {
Map < String , String > cookies = this . cookies ;
var regCookie = RegExp ( r'([A-Z\-]+=.+?(?=;))|(remember-me=.+?)(?=;)' )
. allMatches ( cookieString )
. toList ( ) ;
for ( var cook in regCookie ) {
var c = cook . group ( 0 ) . toString ( ) . split ( " = " ) ;
cookies [ c [ 0 ] ] = c [ 1 ] ;
}
}
/// Přihlášení do iCanteen
///
/// `user` - uživatelské jméno
/// `password` - heslo
///
2022-03-28 20:22:43 +02:00
/// Vrátí `true`, když se uživatel přihlásil, v případě špatného hesla `false`
2022-03-22 20:12:10 +01:00
Future < bool > login ( String user , String password ) async {
2022-03-05 16:49:11 +01:00
if ( cookies [ " JSESSIONID " ] = = " " | | cookies [ " XSRF-TOKEN " ] = = " " ) {
await getFirstSession ( ) ;
}
var res =
await http . post ( Uri . parse ( url + " /j_spring_security_check " ) , headers: {
" Cookie " : " JSESSIONID= " +
cookies [ " JSESSIONID " ] ! +
" ; " +
" XSRF-TOKEN= " +
cookies [ " XSRF-TOKEN " ] ! +
" ; " ,
" Content-Type " : " application/x-www-form-urlencoded " ,
} , body: {
" j_username " : user ,
" j_password " : password ,
" terminal " : " false " ,
" _csrf " : cookies [ " XSRF-TOKEN " ] ,
" _spring_security_remember_me " : " on " ,
" targetUrl " :
" /faces/secured/main.jsp?terminal=false&status=true&printer=&keyboard= "
} ) ;
2022-03-22 20:12:10 +01:00
if ( res . headers [ ' set-cookie ' ] ! . contains ( " remember-me=; " ) ) {
return false ; // špatné heslo
}
2022-03-28 20:37:27 +02:00
print ( res . statusCode ) ;
2022-03-05 16:49:11 +01:00
if ( res . statusCode ! = 302 ) {
2022-03-30 16:28:16 +02:00
return Future . error ( " Chyba: ${ res . body } " ) ;
2022-03-05 16:49:11 +01:00
}
2022-03-28 20:22:43 +02:00
_parseCookies ( res . headers [ ' set-cookie ' ] ! ) ;
2022-03-22 20:12:10 +01:00
prihlasen = true ;
return true ;
2022-03-05 16:49:11 +01:00
}
/// Builder pro GET request
2022-03-30 15:30:51 +02:00
Future < String > _getRequest ( String path ) async {
2022-03-05 16:49:11 +01:00
var r = await http . get ( Uri . parse ( url + path ) , headers: {
" Cookie " : " JSESSIONID= " +
cookies [ " JSESSIONID " ] ! +
" ; " +
" XSRF-TOKEN= " +
cookies [ " XSRF-TOKEN " ] ! +
( cookies . containsKey ( " remember-me " )
? " ; " + cookies [ " remember-me " ] ! + " ; "
: " ; " ) ,
} ) ;
2022-03-28 20:37:27 +02:00
if ( r . statusCode ! = 200 ) {
2022-03-30 16:28:16 +02:00
return Future . error ( " Chyba: ${ r . body } " ) ;
2022-03-28 20:22:43 +02:00
}
2022-03-05 16:49:11 +01:00
if ( r . headers . containsKey ( " set-cookie " ) ) {
_parseCookies ( r . headers [ " set-cookie " ] ! ) ;
}
return r . body ;
}
/// Získá jídelníček bez cen
/// **nevrací** ceny, ale umožňuje získat jídelníček bez přihlášení
Future < List < Jidelnicek > > ziskejJidelnicek ( ) async {
var res = await _getRequest ( " / " ) ;
var reg = RegExp (
r'((?=<div class="jidelnicekDen">).+?(?=<div class="jidelnicekDen">))|((?=<div class="jidelnicekDen">).*<\/span>)' ,
dotAll: true )
2022-03-30 15:30:51 +02:00
. allMatches ( res )
2022-03-05 16:49:11 +01:00
. toList ( ) ;
List < Jidelnicek > jidelnicek = [ ] ;
for ( var t in reg ) {
// projedeme každý den individuálně
var j = t
. group ( 0 )
. toString ( ) / * . replaceAll ( RegExp ( r'( )+|([^>a-z]\n)' ) ,
' ' ) * /
; // převedeme text na něco přehlednějšího
var den = DateTime . parse ( RegExp ( r'(?<=day-).+?(?=")' , dotAll: true )
. firstMatch ( j ) !
. group ( 0 )
. toString ( ) ) ;
var jidlaDenne = RegExp (
r'(?=<div class="container">).+?<\/div>.+?(?=<\/div>)' ,
dotAll: true )
. allMatches ( j )
. toList ( ) ; // získáme jednotlivá jídla pro den / VERZE 2.18
if ( jidlaDenne . isEmpty ) {
jidlaDenne = RegExp (
r'(?=<div style="padding: 2 0 2 20">).+?(?=<\/div>)' ,
dotAll: true )
. allMatches ( j )
. toList ( ) ; // získáme jednotlivá jídla pro den / VERZE 2.10
}
List < Jidlo > jidla = [ ] ;
for ( var jidloNaDen in jidlaDenne ) {
// projedeme vsechna jidla
var s = jidloNaDen . group ( 0 ) ! . replaceAll (
RegExp (
r'[a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:] [a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:]' ) ,
' ' ) ; // odstraní dvojté mezery mezi písmeny
2022-03-05 17:18:57 +01:00
var vydejna = RegExp ( r'(?<=<span style="color: #1b75bb;">).+?(?=<)' )
2022-03-05 16:49:11 +01:00
. firstMatch ( s ) ; // název výdejny / verze 2.18
2022-03-05 17:18:57 +01:00
vydejna ? ? = RegExp (
2022-03-22 20:12:10 +01:00
// TODO: Lepší systém pro podporu různých verzí iCanteen
2022-03-05 16:49:11 +01:00
r'(?<=<span class="smallBoldTitle" style="color: #1b75bb;">).+?(?=<)' )
. firstMatch ( s ) ; // název výdejny / verze 2.10
var hlavni = RegExp (
r' {20}(([a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+ )+[a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+)' ,
dotAll: true )
. firstMatch ( s ) !
. group ( 1 )
. toString ( ) ; // Jídlo
jidla . add ( Jidlo (
nazev: hlavni ,
objednano: false ,
2022-03-30 15:30:51 +02:00
varianta: vydejna ! . group ( 0 ) . toString ( ) ,
2022-03-22 20:12:10 +01:00
lzeObjednat: false ,
2022-03-28 17:04:55 +02:00
den: den ,
naBurze: false ) ) ;
2022-03-05 16:49:11 +01:00
}
jidelnicek . add ( Jidelnicek ( den , jidla ) ) ;
}
return jidelnicek ;
}
/// Získá jídlo pro daný den
/// Vyžaduje přihlášení pomocí [login]
2022-03-22 20:12:10 +01:00
Future < Jidelnicek > jidelnicekDen ( { DateTime ? den } ) async {
2022-03-30 15:30:51 +02:00
if ( ! prihlasen ) {
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
}
2022-03-22 20:12:10 +01:00
den ? ? = DateTime . now ( ) ;
2022-03-05 16:49:11 +01:00
var res = await _getRequest (
2022-03-22 20:12:10 +01:00
" /faces/secured/main.jsp?day= ${ den . year } - ${ ( den . month < 10 ) ? " 0 " + den . month . toString ( ) : den . month } - ${ ( den . day < 10 ) ? " 0 " + den . day . toString ( ) : den . day } &terminal=false&printer=false&keyboard=false " ) ;
2022-03-30 15:30:51 +02:00
if ( res . contains ( " <title>iCanteen - přihlášení uživatele</title> " ) ) {
2022-03-22 20:12:10 +01:00
prihlasen = false ;
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-22 20:12:10 +01:00
}
var obedDen = DateTime . parse ( RegExp ( r'(?<=day-).+?(?=")' , dotAll: true )
. firstMatch ( res ) !
2022-03-05 16:49:11 +01:00
. group ( 0 )
. toString ( ) ) ;
var jidla = < Jidlo > [ ] ;
var jidelnicek =
RegExp ( r'(?<=<div class="jidWrapLeft">).+?(?=<br>)' , dotAll: true )
. allMatches ( res )
. toList ( ) ;
for ( var obed in jidelnicek ) {
// formátování do třídy
var o = obed
. group ( 0 )
. toString ( )
. replaceAll ( RegExp ( r'( )+|([^>a-z]\n)' ) , ' ' ) ;
var objednano = o . contains ( " Máte objednáno " ) ;
var lzeObjednat =
! ( o . contains ( " nelze zrušit " ) | | o . contains ( " nelze objednat " ) ) ;
var cenaMatch =
RegExp ( r'(?<=Cena objednaného jídla">).+?(?=&)' ) . firstMatch ( o ) ;
2022-03-22 20:12:10 +01:00
cenaMatch ? ? =
RegExp ( r'(?<=Cena při objednání jídla: ).+?(?=&)' ) . firstMatch ( o ) ;
2022-03-05 16:49:11 +01:00
cenaMatch ? ? =
RegExp ( r'(?<=Cena při objednání jídla">).+?(?=&)' ) . firstMatch ( o ) ;
var cena =
double . parse ( cenaMatch ! . group ( 0 ) . toString ( ) . replaceAll ( " , " , " . " ) ) ;
var jidlaProDen = RegExp ( r'(?<=Polévka: ).+' )
. firstMatch ( o ) !
. group ( 0 )
. toString ( )
. split ( " / " ) ;
var vydejna = RegExp (
2022-03-05 17:18:57 +01:00
r'(?<=<span class="smallBoldTitle button-link-align">).+?(?=<)' )
2022-03-05 16:49:11 +01:00
. firstMatch ( o ) !
. group ( 0 )
. toString ( ) ;
String ? orderUrl ;
2022-03-24 15:42:04 +01:00
String ? burzaUrl ;
2022-03-05 16:49:11 +01:00
if ( lzeObjednat ) {
// pokud lze objednat, nastavíme adresu pro objednání
2022-03-24 15:42:04 +01:00
var match = RegExp ( r"(?<=ajaxOrder\(this, ').+?(?=')" ) . firstMatch ( o ) ;
if ( match ! = null ) {
orderUrl = match . group ( 0 ) ! . replaceAll ( " amp; " , " " ) ;
}
} else {
// jinak nastavíme URL pro burzu
var match = RegExp ( r"(?<=ajaxOrder\(this, ')(.+?)(?=').+?do burzy" )
. firstMatch ( o ) ;
if ( match ! = null ) {
burzaUrl = match . group ( 1 ) ! . replaceAll ( " amp; " , " " ) ;
}
2022-03-05 16:49:11 +01:00
}
jidla . add ( Jidlo (
nazev: jidlaProDen [ 1 ]
. replaceAll ( r' (?=[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉŤŇťň])' , ' ' ) ,
objednano: objednano ,
2022-03-30 15:30:51 +02:00
varianta: vydejna ,
2022-03-05 16:49:11 +01:00
lzeObjednat: lzeObjednat ,
cena: cena ,
2022-03-22 20:12:10 +01:00
orderUrl: orderUrl ,
2022-03-28 17:04:55 +02:00
den: obedDen ,
burzaUrl: burzaUrl ,
naBurze:
( burzaUrl = = null ) ? false : ! burzaUrl . contains ( " plusburza " ) ) ) ;
2022-03-05 16:49:11 +01:00
// KONEC formátování do třídy
}
2022-03-22 20:12:10 +01:00
return Jidelnicek ( obedDen , jidla ) ;
2022-03-05 16:49:11 +01:00
}
2022-03-22 20:12:10 +01:00
/// Objedná vybrané jídlo
2022-03-30 15:30:51 +02:00
///
2022-03-30 16:28:16 +02:00
/// Vrátí upravenou instanci [Jidlo], v případě chyby vrátí chybový [Future]
2022-03-22 20:12:10 +01:00
Future < Jidlo > objednat ( Jidlo j ) async {
2022-03-30 15:30:51 +02:00
if ( ! prihlasen ) {
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
}
2022-03-05 16:49:11 +01:00
if ( ! j . lzeObjednat | | j . orderUrl = = null | | j . orderUrl ! . isEmpty ) {
2022-03-30 16:28:16 +02:00
return Future . error (
" Jídlo nelze objednat nebo nemá adresu pro objednání " ) ;
2022-03-05 16:49:11 +01:00
}
2022-03-22 20:12:10 +01:00
var res =
await _getRequest ( " /faces/secured/ " + j . orderUrl ! ) ; // provést operaci
2022-03-30 15:56:42 +02:00
if ( res . contains ( " Chyba " ) ) {
2022-03-30 16:28:16 +02:00
return Future . error ( " Při požadavku došlo k chybě " ) ;
2022-03-30 15:56:42 +02:00
}
2022-03-30 15:30:51 +02:00
if ( res . contains ( " přihlášení uživatele " ) ) {
prihlasen = false ;
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
}
2022-03-22 20:12:10 +01:00
var novy = await _getRequest (
" /faces/secured/db/dbJidelnicekOnDayView.jsp?day= ${ j . den . year } - ${ ( j . den . month < 10 ) ? " 0 " + j . den . month . toString ( ) : j . den . month } - ${ ( j . den . day < 10 ) ? " 0 " + j . den . day . toString ( ) : j . den . day } &terminal=false&rating=null&printer=false&keyboard=false " ) ; // získat novou URL pro objednávání
var lzeObjednat =
! ( novy . contains ( " nelze zrušit " ) | | novy . contains ( " nelze objednat " ) ) ;
2022-03-24 15:42:04 +01:00
String ? orderUrl ;
String ? burzaUrl ;
2022-03-22 20:12:10 +01:00
if ( lzeObjednat ) {
// pokud lze objednat, nastavíme adresu pro objednání
2022-03-24 15:42:04 +01:00
var match = RegExp ( r"(?<=ajaxOrder\(this, ').+?(?=')" ) . firstMatch ( novy ) ;
if ( match ! = null ) {
orderUrl = match . group ( 0 ) ! . replaceAll ( " amp; " , " " ) ;
}
} else {
// jinak nastavíme URL pro burzu
var match = RegExp ( r"(?<=ajaxOrder\(this, ')(.+?)(?=').+?do burzy" )
. firstMatch ( novy ) ;
if ( match ! = null ) {
burzaUrl = match . group ( 1 ) ! . replaceAll ( " amp; " , " " ) ;
}
}
return Jidlo (
2022-03-30 15:30:51 +02:00
varianta: j . varianta ,
2022-03-24 15:42:04 +01:00
nazev: j . nazev ,
objednano: ! j . objednano ,
cena: j . cena ,
lzeObjednat: j . lzeObjednat ,
orderUrl: orderUrl ,
den: j . den ,
2022-03-28 17:04:55 +02:00
burzaUrl: burzaUrl ,
naBurze: ( burzaUrl = = null )
? false
: ! burzaUrl . contains ( " plusburza " ) ) ; // vrátit upravenou instanci
2022-03-24 15:42:04 +01:00
}
2022-03-30 15:30:51 +02:00
/// Uloží vaše jídlo z/do burzy
2022-03-28 20:22:43 +02:00
///
2022-03-30 16:28:16 +02:00
/// Vrací upravenou instanci [Jidlo], v případě chyby vrátí chybový [Future]
2022-03-24 15:42:04 +01:00
Future < Jidlo > doBurzy ( Jidlo j ) async {
2022-03-30 15:30:51 +02:00
if ( ! prihlasen ) {
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
}
2022-03-24 15:42:04 +01:00
if ( j . burzaUrl = = null | | j . burzaUrl ! . isEmpty ) {
2022-03-30 16:28:16 +02:00
return Future . error (
2022-03-30 15:30:51 +02:00
" Jídlo nelze uložit do burzy nebo nemá adresu pro uložení " ) ;
2022-03-24 15:42:04 +01:00
}
var res =
await _getRequest ( " /faces/secured/ " + j . burzaUrl ! ) ; // provést operaci
2022-03-30 15:30:51 +02:00
if ( res . contains ( " Chyba " ) ) return j ;
if ( res . contains ( " přihlášení uživatele " ) ) {
prihlasen = false ;
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
}
2022-03-24 15:42:04 +01:00
var novy = await _getRequest (
" /faces/secured/db/dbJidelnicekOnDayView.jsp?day= ${ j . den . year } - ${ ( j . den . month < 10 ) ? " 0 " + j . den . month . toString ( ) : j . den . month } - ${ ( j . den . day < 10 ) ? " 0 " + j . den . day . toString ( ) : j . den . day } &terminal=false&rating=null&printer=false&keyboard=false " ) ; // získat novou URL pro objednávání
var lzeObjednat =
! ( novy . contains ( " nelze zrušit " ) | | novy . contains ( " nelze objednat " ) ) ;
String ? orderUrl ;
String ? burzaUrl ;
if ( lzeObjednat ) {
// pokud lze objednat, nastavíme adresu pro objednání
var match = RegExp ( r"(?<=ajaxOrder\(this, ').+?(?=')" ) . firstMatch ( novy ) ;
if ( match ! = null ) {
orderUrl = match . group ( 0 ) ! . replaceAll ( " amp; " , " " ) ;
}
} else {
// jinak nastavíme URL pro burzu
var match = RegExp ( r"(?<=ajaxOrder\(this, ')(.+?)(?=').+?do burzy" )
. firstMatch ( novy ) ;
if ( match ! = null ) {
burzaUrl = match . group ( 1 ) ! . replaceAll ( " amp; " , " " ) ;
}
2022-03-22 20:12:10 +01:00
}
return Jidlo (
2022-03-30 15:30:51 +02:00
varianta: j . varianta ,
2022-03-22 20:12:10 +01:00
nazev: j . nazev ,
objednano: ! j . objednano ,
cena: j . cena ,
lzeObjednat: j . lzeObjednat ,
orderUrl: orderUrl ,
2022-03-24 15:42:04 +01:00
den: j . den ,
2022-03-28 17:04:55 +02:00
burzaUrl: burzaUrl ,
naBurze: ( burzaUrl = = null )
? false
: ! burzaUrl . contains ( " plusburza " ) ) ; // vrátit upravenou instanci
2022-03-05 16:49:11 +01:00
}
2022-03-30 15:30:51 +02:00
/// Získá aktuální jídla v burze
2022-03-30 15:56:42 +02:00
///
2022-03-30 16:28:16 +02:00
/// Vrátí [Burza], v případě chyby vrátí chybový [Future]
2022-03-30 15:30:51 +02:00
Future < List < Burza > > ziskatBurzu ( ) async {
2022-03-30 16:28:16 +02:00
if ( ! prihlasen ) return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
List < Burza > burza = [ ] ;
var r = await _getRequest ( " /faces/secured/burza.jsp " ) ;
2022-03-30 16:28:16 +02:00
if ( r . contains ( " Chyba " ) ) return Future . error ( " Při požadavku došlo k chybě " ) ;
2022-03-30 15:30:51 +02:00
if ( r . contains ( " přihlášení uživatele " ) ) {
prihlasen = false ;
2022-03-30 16:28:16 +02:00
return Future . error ( " Uživatel není přihlášen " ) ;
2022-03-30 15:30:51 +02:00
}
var dostupnaJidla =
RegExp ( r'(?<=<tr class="mouseOutRow">).+?(?=<\/tr>)' , dotAll: true )
. allMatches ( r ) ; // vyfiltrujeme jednotlivá jídla
if ( dostupnaJidla . isNotEmpty ) {
for ( var burzaMatch in dostupnaJidla ) {
var bu = burzaMatch . group ( 0 ) ! ;
var data = RegExp (
r'((?<=<td>).+?(?=<))|(?<=<td align="left">).+?(?=<)|((?<=<td align="right">).+?(?=<))' ,
dotAll: true )
. allMatches ( bu )
. toList ( ) ;
// Získat datum
var datumRaw = RegExp ( r'\d\d\.\d\d\.\d{4}' )
. firstMatch ( data [ 1 ] . group ( 0 ) ! ) !
. group ( 0 ) !
. split ( " . " ) ;
var datum =
DateTime . parse ( " ${ datumRaw [ 2 ] } - ${ datumRaw [ 1 ] } - ${ datumRaw [ 0 ] } " ) ;
// Získat variantu
var varianta = data [ 0 ] . group ( 0 ) ! ;
// Získat název jídla
var nazev = data [ 2 ] . group ( 0 ) ! . replaceAll ( RegExp ( r'\n| ' ) , " " ) ;
// Získat počet kusů
var pocet = int . parse ( data [ 3 ] . group ( 0 ) ! . replaceAll ( " ks " , " " ) ) ;
var url = RegExp ( r"(?<=')db.+?(?=')" ) . firstMatch ( bu ) ! . group ( 0 ) ! ;
var jidlo = Burza (
den: datum ,
varianta: varianta ,
jidlo: nazev ,
pocet: pocet ,
url: url ) ;
burza . add ( jidlo ) ;
}
}
return burza ;
}
/// Objedná jídlo z burzy pomocí URL z instance třídy Burza
///
/// Vrací [bool] - true pokud se podařilo objednat, jinak false
Future < bool > objednatZBurzy ( Burza b ) async {
var res = await _getRequest ( " /faces/secured/ " + b . url ! ) ;
if ( res . contains ( " Chyba " ) ) return false ;
return true ;
}
2022-03-05 16:49:11 +01:00
}