diff --git a/html/26.html b/html/26.html deleted file mode 100644 index b9c1922ac2946aedcd891e1c3aae8918bb669829..0000000000000000000000000000000000000000 --- a/html/26.html +++ /dev/null @@ -1,59 +0,0 @@ ---- -saison: '26' -date: '2021-10-11' -ligaspieltag: 17 -step: 1 -finals_step: 2 ---- - -<!DOCTYPE html> -<html> - -<head> - <link rel="stylesheet" href="assets/css/custom.css"> - <script src="assets/js/jquery.min.js"></script> - <script src="assets/js/script26.js"></script> -</head> - -<body> - - <script> - - var DATA={{ site.data | jsonify }}; - const STEP={{ page.step | default: '1' }}; - const FINALS_STEP={{ page.finals_step | default: '0' }}; - const LIGASPIELTAG={{ page.ligaspieltag | default: '1' }}; - $(document).ready( function(){ - calculatePartien('{{ page.saison }}', '{{ page.date }}'); - calculateTabelle('{{ page.saison }}', '7'); - } - ); - - </script> - - <div id="partien" class="div_left"> - </div> - - <div class="div_right"> - <h2 class="tabelle">Tabelle</h2> - <table id="tabelle" class="tabelle"> - <thead> - <tr> - <th>Pl.</th> - <th>Sp.</th> - <th>Team</th> - <th>S/U/N</th> - <th>Hist.</th> - <th>Tore</th> - <th>Dif</th> - <th>Pkt.</th> - </tr> - </thead> - <tbody> - </tbody> - </table> - </div> - -</body> - -</html> diff --git a/html/26.php b/html/26.php new file mode 100644 index 0000000000000000000000000000000000000000..ab25f4eb0bf99deb4465f4e99a7c9a32615d4ee5 --- /dev/null +++ b/html/26.php @@ -0,0 +1,184 @@ +--- +saison: '26' +date: '2021-10-11' +ligaspieltag: 17 +step: 1 +finals_step: 2 +--- +<?php + +include_once('functions/db_connect.php'); +include_once('functions/db_methods.php'); + +$csv=$_POST['csv']; +$saison='{{ page.saison }}'; +$secret=''; + +if( !empty($csv) ){ + + $secret=$_POST['secret']; + $user=db_checkSecret($secret); + if( $user ){ + $C=preg_split('/ +/',$csv); + if( trim($C[0]) == 'runde,spieltag,T,H,A,TH,TA,MID' ){ + foreach( $C as $i=>$v ){ + if( $i > 0 ) db_addErgebnisse($saison.','.$v,$secret); + } + } else if( trim($C[0]) == 'MatchID,L,Pos,SpielerID,Spieler,Z+,Z-,T,A,Bk' ) { + foreach( $C as $i=>$v ){ + if( $i > 0 ) db_addStatistik($v,$secret); + } + } else if( trim($C[0]) == 'TeamID,N,SpielerID,Attr,Spieler,Alter,Pos,S,T,A,Z+,Z-,Zd,Mw' ){ + foreach( $C as $i=>$v ){ + if( $i > 0 ) db_addSpieler($v,$secret); + } + } + } + +} + +?> +<!DOCTYPE html> +<html> + +<head> + <link rel="stylesheet" href="assets/css/custom.css"> + <script src="assets/js/jquery.min.js"></script> + <script src="assets/js/script26.js"></script> +</head> + +<body> + + <script> + + var DATA={{ site.data | jsonify }}; + var TEAMS=<?=json_encode( db_getFromTeams() )?>; + var T2ID={}; + TEAMS.forEach( + function(v){ + T2ID[v.nt] = v.id; + } + ); + var SPIELER=<?=json_encode( db_getFromSpieler() )?>; + var ERGEBNISSE=<?=json_encode( db_getFromErgebnisse() )?>; + var STAT=<?=json_encode( db_getFromStatistikBySaison($saison))?>; + STATISTIK={}; + STAT.forEach( + function(v,i){ + if( STATISTIK[v.SpielerID] == undefined ) STATISTIK[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'MID' : [] }; + STATISTIK[v.SpielerID].S++; + STATISTIK[v.SpielerID].T+=v.Tore*1; + STATISTIK[v.SpielerID].A+=v.Assists*1; + STATISTIK[v.SpielerID].Z+=v.Zwk*1; + STATISTIK[v.SpielerID].MID.push(v.MID); + STATISTIK[v.SpielerID].name=v.name; + STATISTIK[v.SpielerID].age=v.age; + STATISTIK[v.SpielerID].nt=v.nt; + } + ); + + const STEP={{ page.step | default: '1' }}; + const FINALS_STEP={{ page.finals_step | default: '0' }}; + const LIGASPIELTAG={{ page.ligaspieltag | default: '1' }}; + $(document).ready( function(){ + calculatePartien('{{ page.saison }}', '{{ page.date }}'); + calculateTabelle('{{ page.saison }}', '7'); + calculateTore('{{ page.saison }}'); + calculateAssists('{{ page.saison }}'); + calculateZwk('{{ page.saison }}'); + + $('h2.tabelle button').on('click', + function(){ + $('h2.tabelle button').toggleClass('active',false); + $(this).toggleClass('active',true); + $('table.tabelle').toggleClass('d-none',true); + $('#tabelle_'+$(this).text().toLowerCase()).toggleClass('d-none',false); + } + ); + + } + ); + + </script> + + <form method="POST"> + <div id="copypaste" class="d-none" ondblclick="$(this).toggleClass('d-none')"> + <button type="submit">update</button> + <input type="text" name="secret" placeholder="secret" value="<?=$secret?>"> + <textarea name="csv"></textarea> + </div> + </form> + + + <div id="partien" class="div_left"> + </div> + + <div class="div_right"> + <h2 class="tabelle">Tabelle <button>Zweikampf</button><button>Assists</button><button>Tore</button><button class="active">Punktestand</button></h2> + + <table id="tabelle_punktestand" class="tabelle"> + <thead> + <tr> + <th>Pl.</th> + <th>Sp.</th> + <th>Team</th> + <th>S/U/N</th> + <th>Hist.</th> + <th>Tore</th> + <th>Dif</th> + <th>Pkt.</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + + <table id="tabelle_tore" class="tabelle d-none"> + <thead> + <tr> + <th>Pl.</th> + <th>Sp.</th> + <th>Name</th> + <th>Team</th> + <th>T</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + + <table id="tabelle_assists" class="tabelle d-none"> + <thead> + <tr> + <th>Pl.</th> + <th>Sp.</th> + <th>Name</th> + <th>Team</th> + <th>A</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + + <table id="tabelle_zweikampf" class="tabelle d-none"> + <thead> + <tr> + <th>Pl.</th> + <th>Sp.</th> + <th>Name</th> + <th>Team</th> + <th>A</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + + </div> + + +</body> + +</html> diff --git a/html/assets/css/custom.scss b/html/assets/css/custom.scss index bec28137c11c24eb7e384a6868e67d5c737057ad..95c10eb4906b4ac512967975f043228a9f0e54a8 100644 --- a/html/assets/css/custom.scss +++ b/html/assets/css/custom.scss @@ -1,11 +1,16 @@ --- --- +@import url("fonts/stylesheet.css"); body { - font-family: "Helvetica", Helvetica, Arial; + font-family: "open_sans"; font-size: 0.9em; } +.d-none { + display: none; +} + .saison { background: darkcyan; padding: 5px; @@ -53,6 +58,17 @@ body { h2.tabelle { background: cornflowerblue; + button { + float: right; + border-radius: 0px; + border: 1px solid grey; + cursor: pointer; + border-top-left-radius: 10px; + background: darkgrey; + &.active { + background: white; + } + } } @@ -141,3 +157,63 @@ img.flags { width: 20px; border: 1px solid darkgrey; } + +#copypaste { + position: fixed; + z-index:200; + width: 100%; + height: 100%; + top: 0px; + left: 0px; + padding: 10%; + background: rgba(255,255,255,0.8); + textarea { + width: 80%; + height: 70%; + } + button { + vertical-align: top; + } +} + + +tr.stats { + td { + &:nth-child(5), + &:nth-child(7) { + text-decoration: underline; + text-decoration-color: grey; + } + } +} + +#tabelle_punktestand { + tr { + td,th { + &:last-child { + text-align: right; + font-weight: bold; + } + &:nth-child(1) { width: 30px; text-align: right; } + &:nth-child(2) { width: 30px; text-align: right; } + &:nth-child(3) { width: 220px; } + &:nth-child(4) { width: 50px; } + &:nth-child(5) { width: 50px; } + } + } +} + +#tabelle_tore, #tabelle_assists, #tabelle_zweikampf { + tr { + td,th { + &:last-child { + text-align: right; + font-weight: bold; + } + &:nth-child(1) { width: 30px; text-align: right; } + &:nth-child(2) { width: 30px; text-align: right; } + &:nth-child(3) { width: 280px; } + &:nth-child(4) { width: 200px; } + } + } +} diff --git a/html/assets/css/fonts/OpenSans-Regular.ttf b/html/assets/css/fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..db433349b7047f72f40072630c1bc110620bf09e Binary files /dev/null and b/html/assets/css/fonts/OpenSans-Regular.ttf differ diff --git a/html/assets/css/fonts/stylesheet.css b/html/assets/css/fonts/stylesheet.css new file mode 100644 index 0000000000000000000000000000000000000000..d06dff9518aad28bbc295e251c87c7bdfcd44565 --- /dev/null +++ b/html/assets/css/fonts/stylesheet.css @@ -0,0 +1,3 @@ +--- +--- +/* @font-face kit by Fonts2u (http://www.fonts2u.com) */ @font-face {font-family:"open_sans";src:url("OpenSans-Regular.ttf") format("truetype"); font-weight:normal;font-style:normal;} diff --git a/html/assets/js/script26.js b/html/assets/js/script26.js index 75fdab2c093e851153fe5c2ca6db39c85c22fae4..8d668ae351ff61219c8ace72c2d830b89f96d982 100644 --- a/html/assets/js/script26.js +++ b/html/assets/js/script26.js @@ -1,86 +1,5 @@ const DAY=24*3600*1000; -function calculateTabelle(saison,runde,show=true){ - - $.each( DATA.teams, - function( i,v ){ - //if( v[saison] == undefined ) - DATA.teams[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( DATA.teams[i].start <= saison )) } - } - ); - - $.each( ( ( DATA.ergebnisse[saison] != undefined ) ? DATA.ergebnisse[saison] : {} ), - function(k,z){ - $.each(z, - function(j,w){ - w.forEach( - function( v,i ){ - if( runde < k || !$.isNumeric(k) ) return; - var H=DATA.teams[v.H][saison]; - var A=DATA.teams[v.A][saison]; - if( parseInt(v.TH) > parseInt(v.TA) ){ - H.P+=3; - H.Tr.push('S'); - A.Tr.push('N'); - } else if( parseInt(v.TH) < parseInt(v.TA) ){ - A.P+=3; - H.Tr.push('N'); - A.Tr.push('S'); - } else { - H.P+=1; - A.P+=1; - H.Tr.push('U'); - A.Tr.push('U'); - } - H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn; - A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn; - } - ); - } - ); - } - ); - - var Tabelle=Object.values(DATA.teams).filter( (a) => ( a.start <= saison ) ) - .sort( - function(a,b){ - return a[saison].P < b[saison].P || - ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) || - ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) || - ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.id > b.id ) ? 1 : -1; - } - ); - - if( !show ){ - return Tabelle; - } - - $('#tabelle tbody').html(''); - - Tabelle.forEach( - function(v,i){ - if( ! v[saison].active ) return; - var tmp='<td>'+(i+1)+'</td>'; - var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 ); - if( t.length == 0 ) t.push(0); - tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>'; - tmp+='<td><img class="flags" src="./images/flags/'+v.id.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.id+'</sup>')+'</a></td>'; - tmp+='<td>'+ - v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+ - v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+ - v[saison].Tr.map( (a) => ( ( a == 'N') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'</td>'; - var hist=v[saison].Tr.map( (a) => '<'+a+'></'+a+'>' ).slice(-6).join(''); - tmp+='<td>'+hist+'</td>'; - tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>'; - tmp+='<td>'+v[saison].Td+'</td>'; - tmp+='<td>'+v[saison].P+'</td>'; - $('#tabelle tbody').append('<tr>'+tmp+'</tr>') - } - ); - -} - - var Grps=[]; function calculatePartien(saison,date){ @@ -103,7 +22,7 @@ function calculatePartien(saison,date){ Grps=[] if( runde == 1 ){ - Grps.push( Object.values( DATA.teams ).filter( (c) => c.start<=saison ).sort( (a,b) => ( b.id < a.id ) ? 1 : -1 ) ); + Grps.push( Object.values( TEAMS ).filter( (c) => c.start<=saison ).sort( (a,b) => ( b.nt < a.nt ) ? 1 : -1 ) ); } else { while( Tabelle.length > 3 ){ Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.pop(), Tabelle.pop() ] ); @@ -137,7 +56,7 @@ function calculatePartien(saison,date){ var Tabelle = [ { 'kontinent' : 'dummy', - 'id': 'XX', + 'nt': 'xx', 'name': '<i>Platz 1</i>', 'link': '', 'manager': 'dummy', @@ -145,7 +64,7 @@ function calculatePartien(saison,date){ }, { 'kontinent' : 'dummy', - 'id': 'XX', + 'nt': 'xx', 'name': '<i>Platz 2</i>', 'link': '', 'manager': 'dummy', @@ -153,7 +72,7 @@ function calculatePartien(saison,date){ }, { 'kontinent' : 'dummy', - 'id': 'XX', + 'nt': 'xx', 'name': '<i>Platz 3</i>', 'link': '', 'manager': 'dummy', @@ -161,7 +80,7 @@ function calculatePartien(saison,date){ }, { 'kontinent' : 'dummy', - 'id': 'XX', + 'nt': 'xx', 'name': '<i>Platz 4</i>', 'link': '', 'manager': 'dummy', @@ -183,14 +102,13 @@ function calculatePartien(saison,date){ steps+=FINALS_STEP; if( done.reduce( (a,b) => a && b ) == true ){ - Grps.shift(); Grps.push([]); - - var p1=DATA.ergebnisse[saison][runde][1][0]; - if( p1.TH >= p1.TA ){ Grps[0].push( DATA.teams[p1.H] ); } else { Grps[0].push( DATA.teams[p1.A] ); } - var p2=DATA.ergebnisse[saison][runde][1][1]; - if( p2.TH >= p2.TA ){ Grps[0].push( DATA.teams[p2.H] ); } else { Grps[0].push( DATA.teams[p2.A] ); } + Grps.shift(); Grps.push([]); + var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 1 ) )[0]; + if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); } + var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 2 ) )[0]; + if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); } runde='F' var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>'; @@ -207,16 +125,16 @@ function calculatePartien(saison,date){ var Tabelle = [ { 'kontinent' : 'dummy', - 'id': 'XX', - 'name': '<i>Sieger 1/4</i>', + 'nt': 'xx', + 'name': '<i>Sieger HF1</i>', 'link': '', 'manager': 'dummy', 'start': 27 }, { 'kontinent' : 'dummy', - 'id': 'XX', - 'name': '<i>Sieger 2/3</i>', + 'nt': 'xx', + 'name': '<i>Sieger HF2</i>', 'link': '', 'manager': 'dummy', 'start': 27 @@ -227,6 +145,8 @@ function calculatePartien(saison,date){ Grps.push( [ Tabelle.shift(), Tabelle.shift() ] ); + + done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) ); } @@ -240,17 +160,36 @@ function grpPartien( date,steps,saison,runde,spieltag,Bg ){ var done=true; var tmp=''; - tmp+='<h4 class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'">Spieltag '+spieltag+'</h4>'; + tmp+='<h4 class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'" ondblclick="getCsv('+saison+',\''+runde+'\','+spieltag+')">Spieltag '+spieltag+'</h4>'; tmp+='<table class="partien s_'+saison+' r_'+runde+' t_'+spieltag+'">'; + var partie=0; do { var h1 = Bg.shift()-1; var a1 = Bg.shift()-1; + partie++; + Grps.forEach( function(v,i){ if( h1 == -1 || a1 == -1 ) return; + var ergebnis=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == spieltag && a.H.toLowerCase() == v[h1].nt.toLowerCase() && a.A.toLowerCase() == v[a1].nt.toLowerCase() ) ); + + if( ergebnis.length == 1 ){ + ergebnis=ergebnis[0]; + var th=(( ergebnis.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+ergebnis.MID+'" target="ultrasoccer">'+ergebnis.TH+'</a>' : ergebnis.TH ); + var ta=(( ergebnis.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+ergebnis.MID+'" target="ultrasoccer">'+ergebnis.TA+'</a>' : ergebnis.TA ); + var dt=new Date(ergebnis.T).toJSON().slice(0,10); + var st=STAT.filter( (a) => ( a.MID == ergebnis.MID )).length == 12; + ergebnis['partie']=partie; + } else { + var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; var st=false; done=false; var match=''; + } + + + /* + if( DATA.ergebnisse[saison] == undefined ){ var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match=''; } else if( DATA.ergebnisse[saison][runde] == undefined ){ @@ -263,16 +202,23 @@ function grpPartien( date,steps,saison,runde,spieltag,Bg ){ var th=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TH+'</a>' : result.TH ) : '-' ); var ta=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TA+'</a>' : result.TA ) : '-' ); var dt=(( result != undefined ) ? new Date(result.T).toJSON().slice(0,10) : '<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i>' ); - if( result == undefined ) done=false; + if( result == undefined ){ + done=false; + } else if( result.TA == '-' || result.TH == '-' ){ + done=false; + } } - tmp+='<tr class="begegnungen h_'+v[h1].id+' a_'+v[a1].id+'">'; + */ + + + tmp+='<tr class="begegnungen h_'+v[h1].nt+' a_'+v[a1].nt+' '+(( st ) ? 'stats' : '')+'">'; tmp+='<td>'+dt+'</td>'; - tmp+='<td><sup>'+v[h1].id+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h1].id.toLowerCase()+'.svg"></td>'; + tmp+='<td data-id="'+v[h1].nt+'"><sup>'+v[h1].nt.toUpperCase()+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h1].nt.toLowerCase()+'.svg"></td>'; tmp+='<td> - </td>'; - tmp+='<td><img class="flags" src="./images/flags/'+v[a1].id.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].id+'</sup></td>'; + tmp+='<td data-id="'+v[a1].nt+'"><img class="flags" src="./images/flags/'+v[a1].nt.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].nt.toUpperCase()+'</sup></td>'; - tmp+='<td>'+th+'</td>'; + tmp+='<td data-mid="'+(( ergebnis.MID != undefined ) ? ergebnis.MID : '0' )+'">'+th+'</td>'; tmp+='<td>:</td>'; tmp+='<td>'+ta+'</td>'; tmp+='</tr>'; @@ -281,9 +227,227 @@ function grpPartien( date,steps,saison,runde,spieltag,Bg ){ ); } while( Bg.length > 0 ); - tmp+='</table>'; $('#partien').append(tmp); return done; } + + +function getCsv(saison, runde, spieltag){ + var tbl=$('.partien.s_'+saison+'.r_'+runde+'.t_'+spieltag)[0]; + var csv= + Object.values(tbl.rows).map( + function(v,i){ + var T=[]; + T.push( runde ); + T.push( spieltag ); + T.push( v.cells[0].innerText.slice(0,10) ); + T.push( v.cells[1].dataset.id ); + T.push( v.cells[3].dataset.id ); + T.push( v.cells[4].innerText ); + T.push( v.cells[6].innerText ); + T.push( v.cells[4].dataset.mid ); + return T; + } + ).join('\n'); + $('#copypaste').toggleClass('d-none'); + $('#copypaste textarea').text('runde,spieltag,T,H,A,TH,TA,MID\n'+csv); +} + +function calculateTabelle(saison,runde,show=true){ + + $.each( TEAMS, + function( i,v ){ + //if( v[saison] == undefined ) + TEAMS[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( TEAMS[i].start <= saison )) } + } + ); + + ERGEBNISSE.filter( (a) => ( a.saison == saison && $.isNumeric(a.runde) && a.runde <= runde ) ).forEach( + function( v,i ){ + var H=TEAMS.filter( (a) => (a.nt == v.H.toLowerCase()) ); + var A=TEAMS.filter( (a) => (a.nt == v.A.toLowerCase()) ); + if( H.length == 0 ){ + alert('Error: Team mit Code '+v.H+' fehlt!!' ); + return; + } + if( A.length == 0 ){ + alert('Error: Team mit Code '+v.A+' fehlt!!' ); + return; + } + H=H[0][saison]; + A=A[0][saison]; + //var H=DATA.teams[v.H][saison]; + //var A=DATA.teams[v.A][saison]; + if( v.TH == '-' || v.TA == '-' ) return; + if( parseInt(v.TH) > parseInt(v.TA) ){ + H.P+=3; + H.Tr.push('S'); + A.Tr.push('N'); + } else if( parseInt(v.TH) < parseInt(v.TA) ){ + A.P+=3; + H.Tr.push('N'); + A.Tr.push('S'); + } else { + H.P+=1; + A.P+=1; + H.Tr.push('U'); + A.Tr.push('U'); + } + H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn; + A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn; + } + ); + + + /* + + $.each( ( ( DATA.ergebnisse[saison] != undefined ) ? DATA.ergebnisse[saison] : {} ), + function(k,z){ + $.each(z, + function(j,w){ + w.forEach( + function( v,i ){ + if( runde < k || !$.isNumeric(k) ) return; + var H=DATA.teams[v.H][saison]; + var A=DATA.teams[v.A][saison]; + if( v.TH == '-' || v.TA == '-' ) return; + if( parseInt(v.TH) > parseInt(v.TA) ){ + H.P+=3; + H.Tr.push('S'); + A.Tr.push('N'); + } else if( parseInt(v.TH) < parseInt(v.TA) ){ + A.P+=3; + H.Tr.push('N'); + A.Tr.push('S'); + } else { + H.P+=1; + A.P+=1; + H.Tr.push('U'); + A.Tr.push('U'); + } + H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn; + A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn; + } + ); + } + ); + } + ); + */ + + var Tabelle=Object.values(TEAMS).filter( (a) => ( a.start <= saison ) ) + .sort( + function(a,b){ + return a[saison].P < b[saison].P || + ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) || + ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) || + ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.id > b.id ) ? 1 : -1; + } + ); + + if( !show ){ + return Tabelle; + } + + $('#tabelle_punktestand tbody').html(''); + + Tabelle.forEach( + function(v,i){ + if( ! v[saison].active ) return; + var tmp='<td>'+(i+1)+'</td>'; + var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 ); + if( t.length == 0 ) t.push(0); + tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>'; + tmp+='<td><img class="flags" src="./images/flags/'+v.nt.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</sup>')+'</a></td>'; + tmp+='<td>'+ + v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+ + v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+ + v[saison].Tr.map( (a) => ( ( a == 'N') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'</td>'; + var hist=v[saison].Tr.map( (a) => '<'+a+'></'+a+'>' ).slice(-6).join(''); + tmp+='<td>'+hist+'</td>'; + tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>'; + tmp+='<td>'+v[saison].Td+'</td>'; + tmp+='<td>'+v[saison].P+'</td>'; + $('#tabelle_punktestand tbody').append('<tr>'+tmp+'</tr>') + } + ); + +} + +function calculateTore(saison){ + var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].T < b[1].T || ( a[1].T == b[1].T && a[1].S > b[1].S ) ) ).slice(0,10).map( + function(v,i){ + var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) ); + if( team.length == 0 ){ + var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">'; + var team_name=''; + } else { + var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">'; + var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>'; + } + + return '<td>'+ + [ + i+1, + (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0), + team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ), + team_name, + v[1].T + ].join('</td><td>')+'</td>'; + } + ); + $('#tabelle_tore tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' ); +} + +function calculateAssists(saison){ + var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].A < b[1].A || ( a[1].A == b[1].A && a[1].S > b[1].S ) ) ).slice(0,10).map( + function(v,i){ + var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) ); + if( team.length == 0 ){ + var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">'; + var team_name=''; + } else { + var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">'; + var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>'; + } + + return '<td>'+ + [ + i+1, + (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0), + team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ), + team_name, + v[1].A + ].join('</td><td>')+'</td>'; + } + ); + $('#tabelle_assists tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' ); +} + +function calculateZwk(saison){ + var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].Z < b[1].Z || ( a[1].Z == b[1].Z && a[1].S > b[1].S ) ) ).slice(0,10).map( + function(v,i){ + var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) ); + if( team.length == 0 ){ + var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">'; + var team_name=''; + } else { + var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">'; + var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>'; + } + + return '<td>'+ + [ + i+1, + (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0), + team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ), + team_name, + v[1].Z + ].join('</td><td>')+'</td>'; + } + ); + + $('#tabelle_zweikampf tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' ); +} diff --git a/html/functions/db_connect.php b/html/functions/db_connect.php new file mode 100644 index 0000000000000000000000000000000000000000..4bdc470988058bd64cc2ae5286b0b78ee7b05ea6 --- /dev/null +++ b/html/functions/db_connect.php @@ -0,0 +1,45 @@ +<?php + +class db +{ + private $servername = ''; + private $username = ''; + private $password = ''; + private $aes_key = ''; + private $dbname = ''; + public $conn; + + function __construct() { + // Create connection + $this->servername = getenv('MYSQL_HOST').':'.getenv('MYSQL_PORT'); + $this->username = getenv('MYSQL_USER'); + $this->password = getenv('MYSQL_PASSWORD'); + $this->aes_key = getenv('AES_KEY'); + $this->dbname = getenv('MYSQL_DATABASE'); + + $this->conn = new mysqli($this->servername, $this->username, $this->password, $this->dbname); + // Check connection + if ($this->conn->connect_error) { + die('Connection failed: ' . $this->conn->connect_error); + } + } + + function __destruct() { + $this->conn->close(); + } + + public function query($sql){ + $sql=preg_replace('/KEY/','"'.$this->aes_key.'"',$sql); + return $this->conn->query($sql); + } + + public function commit(){ + return $this->conn->commit(); + } + + public function autocommit($bool){ + return $this->conn->autocommit($bool); + } +} + +?> diff --git a/html/functions/db_methods.php b/html/functions/db_methods.php new file mode 100644 index 0000000000000000000000000000000000000000..11bbedcd6db3450e1bfe84975cb44624b7d09d41 --- /dev/null +++ b/html/functions/db_methods.php @@ -0,0 +1,432 @@ +<?php + +function db_addPartie( $csv ){ + + echo $csv; + return; + + $data=array( + 'member:'.get_0($member), + 'location:'.$location, + 'tags:'.$tags, + 'url:'.$url, + 'orderlist:'.preg_replace('/\r\n/',PHP_EOL,$orderlist), + 'price:'.number_format( $price,8,'.','' ), + 'shipping:'.number_format( $shipping,8,'.','' ), + 'currency:'.$currency + ); + $datastring=implode(PHP_EOL,$data); + $m=db_getFromMembersById( $member ); + + $F=new FaircoinAddress($m['fair_address'],false); + if( !$F->verifymessage($datastring , $signature ) ){ + // signature invalid + return array( 'success' => false, 'message' => 'signature could not be verified!', 'd' => [ $m['fair_address'], $datastring, $signature ] ); + } + + $db=new db; + + $signature_hex=bin2hex( base64_decode($signature) ); + $sql = "INSERT INTO stargate_list ( member, location, tags, url, orderlist, price, shipping, currency, signature ) VALUES ( ".$member.",'".$location."','".$tags."','".$url."','".$orderlist."',".$price.", ".$shipping.",'".$currency."', 0x".$signature_hex.")"; + + if ( $db->query($sql) === TRUE) { + // success + $result=array( 'success' => true, 'message' => 'order verified and added successfully!', 'data' => db_getFromListBySignature($signature)); + } else { + // check if already exists + $row=db_getFromListBySignature($signature); + if($row){ + $result=array( 'success' => true, 'message' => 'order already exists and successfully verified!', 'data' => $row ); + } else { + $result=array( 'success' => false, 'message' => 'sql error!' ); + } + } + + unset($db); + return $result; +} +function db_addErgebnisse( $csv, $secret ){ + + $C=preg_split('/,/',$csv); + $C[1]='"'.$C[1].'"'; + $C[3]='"'.$C[3].'"'; + $C[4]='"'.$C[4].'"'; + $C[5]='"'.$C[5].'"'; + + $user=db_checkSecret($secret); + if( empty( $user ) ) return false; + + $C[]=$user['id']; + + $csv=implode($C,','); + + + + $db=new db; + + $sql = "REPLACE INTO Ergebnisse VALUES ( ".$csv." )"; + + if ( $db->query( $sql ) === TRUE) { + // success + $result=array( 'success' => true, 'message' => 'Spieltag erfolgreich hinzugefügt!', 'data' => [] ); + } else { + echo 'SQL-Error: '.$sql.'<br>'; + } + + unset($db); + return $result; +} +function db_addSpieler( $csv, $secret ){ + + $C=preg_split('/,/',$csv); + $C[1]='"'.$C[1].'"'; + $C[2]='0x'.$C[2]; + $C[4]='"'.$C[4].'"'; + unset($C[3]); + unset($C[6]); + unset($C[7]); + unset($C[8]); + unset($C[9]); + unset($C[10]); + unset($C[11]); + unset($C[12]); + unset($C[13]); + + $user=db_checkSecret($secret); + if( empty( $user ) ) return false; + + $C[]=$user['id']; + + $csv=implode($C,','); + + $db=new db; + + $sql = "REPLACE INTO Spieler VALUES ( ".$csv." )"; + + if ( $db->query( $sql ) === TRUE) { + // success + $result=array( 'success' => true, 'message' => 'Spieltag erfolgreich hinzugefügt!', 'data' => [] ); + } else { + echo 'SQL-Error: '.$sql.'<br>'; + } + + unset($db); + return $result; +} +function db_addStatistik( $csv, $secret ){ + + $C=preg_split('/,/',$csv); + if( $C[2] == '0' ) return; + $C[1]='"'.$C[1].'"'; + $C[3]='0x'.$C[3]; + unset($C[4]); + + $user=db_checkSecret($secret); + if( empty( $user ) ) return false; + + $ergebnis=db_getFromErgebnisseByMID($C[0]); + if( empty( $ergebnis ) || $C[0] == '0' ) return; + + $C[]=$user['id']; + + $csv=implode($C,','); + + $db=new db; + + $sql = "REPLACE INTO Statistik VALUES ( ".$csv." )"; + + if ( $db->query( $sql ) === TRUE) { + // success + $result=array( 'success' => true, 'message' => 'Statistik erfolgreich hinzugefügt!', 'data' => [] ); + } else { + echo 'SQL-Error: '.$sql.'<br>'; + } + + unset($db); + return $result; +} + + +function db_checkSecret($secret){ + + $db=new db; + + $sql = 'SELECT * FROM User WHERE secret="'.$secret.'"'; + + $result = $db->query($sql); + + $row = $result->fetch_assoc(); + + unset($db); + return $row; + +} +function db_getFromTeams(){ + + $db=new db; + + $sql = 'SELECT * FROM Teams'; + $result = $db->query($sql); + + $ROW=Array(); + + while( $row = $result->fetch_assoc() ){ + $ROW[]=$row; + } + + unset($db); + return $ROW; + +} +function db_getFromSpieler(){ + + $db=new db; + + $sql = 'SELECT * FROM Spieler'; + $result = $db->query($sql); + + $ROW=Array(); + + while( $row = $result->fetch_assoc() ){ + $row['id']=bin2hex($row['id']); + $ROW[]=$row; + } + + unset($db); + return $ROW; + +} +function db_getFromErgebnisse(){ + + $db=new db; + + $sql = 'SELECT * FROM Ergebnisse'; + $result = $db->query($sql); + + $ROW=Array(); + + while( $row = $result->fetch_assoc() ){ + $ROW[]=$row; + } + + unset($db); + return $ROW; + +} +function db_getFromErgebnisseByMID($mid){ + + $db=new db; + + $sql = 'SELECT * FROM Ergebnisse WHERE MID='.$mid; + $result = $db->query($sql); + + $ROW=Array(); + + while( $row = $result->fetch_assoc() ){ + $ROW[]=$row; + } + + unset($db); + return $ROW; + +} +function db_getFromStatistikBySaison($saison){ + + $db=new db; + + /* + $sql = 'SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.age, Teams.id, SUM(Statistik.Tore) AS "Tore", SUM(Statistik.Assists) AS "Assists", SUM(Statistik.Zpos - Statistik.Zneg) AS "Zwkbilanz" FROM Statistik + INNER JOIN Ergebnisse ON Ergebnisse.MID = Statistik.MID + LEFT JOIN Spieler ON Spieler.id = Statistik.SpielerID + LEFT JOIN Teams ON Teams.id = Spieler.teamID + WHERE Ergebnisse.saison = '.$saison.' + GROUP BY SpielerID, MID'; + */ + $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.age, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos - Statistik.Zneg AS "Zwk" FROM Statistik + INNER JOIN Ergebnisse ON Ergebnisse.MID = Statistik.MID + LEFT JOIN Spieler ON Spieler.id = Statistik.SpielerID + LEFT JOIN Teams ON Teams.id = Spieler.teamID + WHERE Ergebnisse.saison = '.$saison.' + GROUP BY SpielerID, MID'; + + $result = $db->query($sql); + + $ROW=Array(); + + while( $row = $result->fetch_assoc() ){ + $row['SpielerID']=bin2hex($row['SpielerID']); + $ROW[]=$row; + } + + unset($db); + return $ROW; + +} + +function db_updateListSetStatus( $n, $status ){ + $db=new db; + + $sql = "UPDATE stargate_list SET status='".$status."' WHERE n=".$n; + + if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) { + // success + $result=array('success' => true, 'message' => 'orderlist status successfully set!', 'n' => $n, 'status' => $status ); + } else { + // check if already exists + $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql ); + } + + unset($db); + return $result; +} +function db_updateListSetSupporterTxhash( $n, $supporter, $txhash ){ + $db=new db; + + $sql = "UPDATE stargate_list SET supporter=".$supporter.", txhash=0x".$txhash." WHERE n=".$n; + + if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) { + // success + $result=array('success' => true, 'message' => 'orderlist supporter successfully set!', 'n' => $n, 'supporter' => $supporter ); + } else { + // check if already exists + $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql ); + } + + unset($db); + return $result; +} +function db_updateMembersSetLatitudeLongitudeByMemberSignature($member, $latitude, $longitude, $location, $default_currency, $signature ){ + + $db=new db; + + $sql = "UPDATE stargate_members SET latitude=".$latitude.", longitude=".$longitude.", location='".$location."', default_currency='".$default_currency."', signature=0x".bin2hex(base64_decode($signature)).", status='active' WHERE ( status='active' OR status='init' ) AND id=".$member; + + if ($db->query($sql) === TRUE) { + // success + $result=array('success' => true, 'message' => 'member profile updated successfully!'); + } else { + // error return false + $result=array('success' => false, 'message' => 'member profile could not be updated!', 'info' => $sql ); + } + + unset($db); + return $result; + +} +function db_updateMembersSetSessionkey($member, $sessionkey ){ + + $db=new db; + + $sql = "UPDATE stargate_members SET sessionkey=0x".$sessionkey." WHERE ( status='active' OR status='init' ) AND id=".$member; + + if ($db->query($sql) === TRUE) { + // success + $result=array('success' => true, 'message' => 'member sessionkey updated successfully!'); + } else { + // error return false + $result=array('success' => false, 'message' => 'member sessionkey could not be updated!', 'info' => $sql ); + } + + unset($db); + return $result; + +} +function db_updateMembersSetToken( $member, $token ){ + + $db=new db; + $m=db_getFromMembersById($member); + if( regex( $m['status'], 'init|active') ){ + if( $m['session_expiration'] > time() ){ + $result=array('success' => true, 'message' => 'member token updated successfully!', 'token' => $m['token'] ); + } else { + $sql = "UPDATE stargate_members SET token='".$token."', session_expiration=UNIX_TIMESTAMP()+".SESSION_EXPIRATION." WHERE ( status='active' OR status='init' ) AND id=".$member; + if ($db->query($sql) === TRUE) { + // success + $result=array('success' => true, 'message' => 'member token updated successfully!', 'token' => $token ); + } else { + // error return false + $result=array('success' => false, 'message' => 'member token could not be updated!', 'info' => $sql ); + } + } + } else { + $result=array('success' => false, 'message' => 'member not active', 'status' => $m['status'] ); + } + + unset($db); + return $result; + +} + +function db_updateMessagesSetReceipientStatus( $m, $receipient, $receipient_status ){ + + $db=new db; + + $sql = "UPDATE stargate_messages SET receipient_status='".$receipient_status."' WHERE receipient=".$receipient." AND m=".$m; + + if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) { + // success + $result=array('success' => true, 'message' => 'message successfully marked as read!', 'm' => $m, 'status' => $receipient_status ); + } else { + // check if already exists + $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql ); + } + + unset($db); + return $result; +} +function db_updateMessagesSetTxhash( $sender_address, $amount, $txhash ){ + + $db=new db; + + $sender=db_getFromMembersByFairAddress($sender_address); + $msg=db_getFromMessagesBySenderAmount($sender['id'], $amount); + if( count( $msg ) != 1 ){ + return array('success' => false, 'message' => 'message tx on blockchain does not match with database!', 'info' => '' ); + } + + $sql = "UPDATE stargate_messages SET txhash=0x".$txhash." WHERE m=".$msg['m']." AND fee=".$amount." AND txhash IS NULL"; + + if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) { + // success + $result=array('success' => true, 'message' => 'message successfully marked as read!', 'm' => $m, 'status' => $receipient_status ); + } else { + // check if already exists + $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql ); + } + + unset($db); + return $result; +} +function db_updateMessages( $n, $sender, $receipient, $message, $signature, $fee, $txhash ){ + + $db=new db; + + $signature_hex=bin2hex( base64_decode($signature) ); + $sql = "UPDATE stargate_messages SET n".(empty( $n ) ? "=NULL" : "='".$n."'").", message='".$message."', signature=0x".$signature_hex.", txhash=0x".$txhash." WHERE sender=".$sender." AND receipient=".$receipient." AND message IS NULL AND fee=".$fee; + + if ( $db->query($sql) === TRUE) { + // success + $result=array('success' => true, 'message' => 'message successfully saved!', 'data' => db_getFromMessagesByTxhash($txhash) ); + } else { + // check if already exists + $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql ); + } + + unset($db); + return $result; +} + + +function db_removeFromFairauth(){ + $db=new db; + + $sql = 'DELETE FROM stargate_fairauth WHERE CAST(tstamp as date) < CAST( NOW() as date)'; + $result = $db->query($sql); + + if( ! $result ) return 0; + + return true; +} + + +?>