From 6e14dbd1bcaaf6c9b6d530149eb393c35069377f Mon Sep 17 00:00:00 2001 From: salam Date: Mon, 27 Jul 2026 16:53:00 +0200 Subject: [PATCH] wip --- app/Console/Commands/Grapper/Sofascore.php | 10 +++ .../Commands/Grapper/Sofascore/Grapper.php | 10 +-- .../Commands/Grapper/Sofascore/MakeExcel.php | 39 ++++++++++ .../Commands/Grapper/Sofascore/SqlMover.php | 25 +++--- .../Tables/StatisticFixturesTable.php | 16 ++-- .../Tables/StatistikoEventsTable.php | 2 +- app/Filament/Widgets/ChartEvent.php | 1 - app/Filament/Widgets/Data/LoadEvents.php | 7 +- app/Filament/Widgets/Data/LoadPerformance.php | 72 +++++++++++------- grapper.sh | 8 +- rosa-2026-07-27.xlsx | Bin 0 -> 15007 bytes 11 files changed, 123 insertions(+), 67 deletions(-) create mode 100644 app/Console/Commands/Grapper/Sofascore/MakeExcel.php create mode 100644 rosa-2026-07-27.xlsx diff --git a/app/Console/Commands/Grapper/Sofascore.php b/app/Console/Commands/Grapper/Sofascore.php index 3712dd33..b1be2540 100644 --- a/app/Console/Commands/Grapper/Sofascore.php +++ b/app/Console/Commands/Grapper/Sofascore.php @@ -5,6 +5,7 @@ namespace App\Console\Commands\Grapper; use App\Console\Commands\Grapper\Sofascore\Grapper; use App\Console\Commands\Grapper\Sofascore\Helper\Strings; use App\Console\Commands\Grapper\Sofascore\Helper\ZipFolder; +use App\Console\Commands\Grapper\Sofascore\MakeExcel; use App\Console\Commands\Grapper\Sofascore\PlayerPerSeason; use App\Console\Commands\Grapper\Sofascore\Rose; use App\Console\Commands\Grapper\Sofascore\SendMail; @@ -23,6 +24,8 @@ class Sofascore public static string $archive_name; + public static string $excel_name; + public static string $useragent; public static function switch() @@ -67,6 +70,12 @@ class Sofascore SqlMover::run(); break; + case 8: + self::setStorage(); + + MakeExcel::create(); + break; + default: Notice::note('id not valid', 'br', 1); } @@ -77,6 +86,7 @@ class Sofascore $task = Nuh::$options['task']; self::$storage = storage_path('sofascore_data') . '/'; + // for grapper to start with self::$useragent = 4; $storage_name = Strings::clean(SofaScoreTask::where('id', $task)->value('name')) . '/'; diff --git a/app/Console/Commands/Grapper/Sofascore/Grapper.php b/app/Console/Commands/Grapper/Sofascore/Grapper.php index ce752f98..d7857c40 100644 --- a/app/Console/Commands/Grapper/Sofascore/Grapper.php +++ b/app/Console/Commands/Grapper/Sofascore/Grapper.php @@ -132,7 +132,7 @@ class Grapper * EVENT event *********************************/ - File::put($folder . '/event.json', json_encode($event)); + File::put($folder . '/event.json', json_encode($event, JSON_PRETTY_PRINT)); /********************************* * EVENT statistics @@ -150,7 +150,7 @@ class Grapper $data['id'] = $event_id; - File::put($folder . '/statistics.json', json_encode($data)); + File::put($folder . '/statistics.json', json_encode($data, JSON_PRETTY_PRINT)); $grapped->got_statistics = 1; // } @@ -169,7 +169,7 @@ class Grapper $data['id'] = $event_id; - File::put($folder . '/lineups.json', json_encode($data)); + File::put($folder . '/lineups.json', json_encode($data, JSON_PRETTY_PRINT)); $grapped->got_lineups = 1; // } @@ -188,7 +188,7 @@ class Grapper $data['id'] = $event_id; - File::put($folder . '/odds.json', json_encode($data)); + File::put($folder . '/odds.json', json_encode($data, JSON_PRETTY_PRINT)); $grapped->got_odds = 1; // } @@ -207,7 +207,7 @@ class Grapper $data['id'] = $event_id; - File::put($folder . '/incidents.json', json_encode($data)); + File::put($folder . '/incidents.json', json_encode($data, JSON_PRETTY_PRINT)); $grapped->got_incidents = 1; // } diff --git a/app/Console/Commands/Grapper/Sofascore/MakeExcel.php b/app/Console/Commands/Grapper/Sofascore/MakeExcel.php new file mode 100644 index 00000000..84df6b6f --- /dev/null +++ b/app/Console/Commands/Grapper/Sofascore/MakeExcel.php @@ -0,0 +1,39 @@ +addHeader(['#TEAM# ' . $name]); + + $data = file_get_contents($file); + + $arr = json_decode($data, true); + + if (isset($arr['players']) && is_array($arr['players'])) { + foreach ($arr['players'] as $value) { + if ($value) { + $writer->addRow([$name => json_encode($value)]); + } + } + } + } + + $writer->close(); + } +} diff --git a/app/Console/Commands/Grapper/Sofascore/SqlMover.php b/app/Console/Commands/Grapper/Sofascore/SqlMover.php index 83387563..f88f6f82 100644 --- a/app/Console/Commands/Grapper/Sofascore/SqlMover.php +++ b/app/Console/Commands/Grapper/Sofascore/SqlMover.php @@ -10,24 +10,21 @@ class SqlMover { public static function run() { - // $ligas = [649, 242, 20, 40, 325, 41]; - // $ligas = [5, 9, 19, 26, 13, 99]; - $ligas = [22, 26, 28, 29, 33, 51]; Notice::note('SqlMover', 'b'); - foreach ($ligas as $liga_id) { + $res = StatistikoEvent::pluck('match_id'); + foreach ($res as $match_id) { + $has = StatistikoPlayer::where('match_id', $match_id)->first(); + if (!$has) + Notice::note('StatistikoPlayer missing ' . $match_id, 'br', 1); + } - Notice::note($liga_id, 'b'); - - $res = StatistikoEvent::where('league_id', $liga_id) - ->where('season', '2026') - ->pluck('match_id'); - - foreach ($res as $match_id) { - StatistikoEvent::where('match_id', $match_id)->delete(); - StatistikoPlayer::where('match_id', $match_id)->delete(); - } + $res = StatistikoPlayer::groupBy('match_id')->pluck('match_id'); + foreach ($res as $match_id) { + $has = StatistikoEvent::where('match_id', $match_id)->first(); + if (!$has) + Notice::note('StatistikoEvent missing ' . $match_id, 'br', 1); } Notice::note('done', 'bb', 1); diff --git a/app/Filament/Clusters/StaticData/Resources/StatisticFixtures/Tables/StatisticFixturesTable.php b/app/Filament/Clusters/StaticData/Resources/StatisticFixtures/Tables/StatisticFixturesTable.php index 9166bf6d..9a6c4680 100644 --- a/app/Filament/Clusters/StaticData/Resources/StatisticFixtures/Tables/StatisticFixturesTable.php +++ b/app/Filament/Clusters/StaticData/Resources/StatisticFixtures/Tables/StatisticFixturesTable.php @@ -21,7 +21,7 @@ class StatisticFixturesTable ->columns([ IconColumn::make('sport_id') ->label('') - ->icon(fn (string $state): string => match ($state) { + ->icon(fn(string $state): string => match ($state) { '1' => 'icon-soccerball', '2' => 'icon-icehockey', '3' => 'icon-basketball', @@ -31,16 +31,16 @@ class StatisticFixturesTable ->label('League') ->searchable() ->wrap() - ->tooltip(fn ($record) => $record->league_id) - ->hidden(fn () => auth()->user()->sport_id == 5) - ->description(fn ($record) => ucwords($record->league?->country->name)), - TextColumn::make('starttime')->dateTime('M j, Y h:i')->label('Date'), + ->tooltip(fn($record) => $record->league_id) + ->hidden(fn() => auth()->user()->sport_id == 5) + ->description(fn($record) => ucwords($record->league?->country->name)), + TextColumn::make('starttime')->dateTime('Y-m-d H:i'), TextColumn::make('home.name') - ->tooltip(fn ($record) => $record->home_id) + ->tooltip(fn($record) => $record->home_id) ->color('primary') ->searchable(), TextColumn::make('away.name') - ->tooltip(fn ($record) => $record->away_id) + ->tooltip(fn($record) => $record->away_id) ->color('success') ->searchable(), // TextColumn::make('exp_home')->alignCenter()->numeric(), @@ -49,7 +49,7 @@ class StatisticFixturesTable ]) ->filters([ SelectFilter::make('league_id') - ->options(fn () => LoadStatisticFixturesLeaguesOptions::load(1)) + ->options(fn() => LoadStatisticFixturesLeaguesOptions::load(1)) ->preload() ->searchable() ->columnSpan(2) diff --git a/app/Filament/Clusters/StaticData/Resources/StatistikoEvents/Tables/StatistikoEventsTable.php b/app/Filament/Clusters/StaticData/Resources/StatistikoEvents/Tables/StatistikoEventsTable.php index df395276..65332c44 100644 --- a/app/Filament/Clusters/StaticData/Resources/StatistikoEvents/Tables/StatistikoEventsTable.php +++ b/app/Filament/Clusters/StaticData/Resources/StatistikoEvents/Tables/StatistikoEventsTable.php @@ -50,7 +50,7 @@ class StatistikoEventsTable ->copyable() ->copyMessage('Away team name copied') ->copyMessageDuration(1500), - TextColumn::make('starttime')->dateTime('d.m.Y H:i'), + TextColumn::make('starttime')->dateTime('Y-m-d H:i'), ]) ->filters([ diff --git a/app/Filament/Widgets/ChartEvent.php b/app/Filament/Widgets/ChartEvent.php index bb470979..90d0ebea 100644 --- a/app/Filament/Widgets/ChartEvent.php +++ b/app/Filament/Widgets/ChartEvent.php @@ -63,7 +63,6 @@ class ChartEvent extends ChartWidget position: 'left', generateLabels: (chart) => { const datasets = chart.data.datasets; - alert(datasets) }, }, tooltip: { diff --git a/app/Filament/Widgets/Data/LoadEvents.php b/app/Filament/Widgets/Data/LoadEvents.php index a1da80fa..fea5fd7f 100644 --- a/app/Filament/Widgets/Data/LoadEvents.php +++ b/app/Filament/Widgets/Data/LoadEvents.php @@ -203,13 +203,8 @@ class LoadEvents foreach ($res as $value) { - // dd($value); - - $result_code = (string) $value['result_code']; - - Log::debug($value); - $labels[] = round($value['starttime']->diffInDays(Carbon::now())); + // $labels[] = $value['starttime']->format('Y-m-d H:i'); $playing_date[] = $value['starttime']->format('d. F Y H:i'); diff --git a/app/Filament/Widgets/Data/LoadPerformance.php b/app/Filament/Widgets/Data/LoadPerformance.php index d1f5d6f3..42d21147 100644 --- a/app/Filament/Widgets/Data/LoadPerformance.php +++ b/app/Filament/Widgets/Data/LoadPerformance.php @@ -502,46 +502,62 @@ class LoadPerformance $count_home = 0; $count_away = 0; - for ($i = \count($homes['all']) - 1; $i > 0; $i--) { - if ($homes['all'][$i] == null) { - $count_home++; - } else { - break; + if (isset($homes['all'])) { + for ($i = \count($homes['all']) - 1; $i > 0; $i--) { + if ($homes['all'][$i] == null) { + $count_home++; + } else { + break; + } } } - for ($i = \count($aways['all']) - 1; $i > 0; $i--) { - if ($aways['all'][$i] == null) { - $count_away++; - } else { - break; + if (isset($aways['all'])) { + for ($i = \count($aways['all']) - 1; $i > 0; $i--) { + if ($aways['all'][$i] == null) { + $count_away++; + } else { + break; + } } } $keeps = count($homes['all']) - min($count_home, $count_away) - 1; - $homes['all'] = array_slice($homes['all'], 0, $keeps); - $homes['def'] = array_slice($homes['def'], 0, $keeps); - $homes['att'] = array_slice($homes['att'], 0, $keeps); - $homes['mid'] = array_slice($homes['mid'], 0, $keeps); - $aways['all'] = array_slice($aways['all'], 0, $keeps); - $aways['def'] = array_slice($aways['def'], 0, $keeps); - $aways['att'] = array_slice($aways['att'], 0, $keeps); - $aways['mid'] = array_slice($aways['mid'], 0, $keeps); + if (isset($homes['all'])) { + $homes['all'] = array_slice($homes['all'], 0, $keeps); + $homes['def'] = array_slice($homes['def'], 0, $keeps); + $homes['att'] = array_slice($homes['att'], 0, $keeps); + $homes['mid'] = array_slice($homes['mid'], 0, $keeps); + } + if (isset($aways['all'])) { + $aways['all'] = array_slice($aways['all'], 0, $keeps); + $aways['def'] = array_slice($aways['def'], 0, $keeps); + $aways['att'] = array_slice($aways['att'], 0, $keeps); + $aways['mid'] = array_slice($aways['mid'], 0, $keeps); + } // $labels = array_slice($labels, 0, $keeps); $labels = range(1, $keeps); } - public static function makeAv(array &$arr, $length) + public static function makeAv(array &$arr, int $length) { - $all = isset($arr['all']) ? array_sum($arr['all']) / count($arr['all']) : 1; - $def = isset($arr['def']) ? array_sum($arr['def']) / count($arr['def']) : 1; - $mid = isset($arr['mid']) ? array_sum($arr['mid']) / count($arr['mid']) : 1; - $att = isset($arr['att']) ? array_sum($arr['att']) / count($arr['att']) : 1; - $ret = []; - $ret['all'] = array_fill(0, $length, round($all, 2)); - $ret['def'] = array_fill(0, $length, round($def, 2)); - $ret['mid'] = array_fill(0, $length, round($mid, 2)); - $ret['att'] = array_fill(0, $length, round($att, 2)); + if (isset($arr['all']) && count($arr['all'])) { + $all = isset($arr['all']) ? array_sum($arr['all']) / count($arr['all']) : 1; + $def = isset($arr['def']) ? array_sum($arr['def']) / count($arr['def']) : 1; + $mid = isset($arr['mid']) ? array_sum($arr['mid']) / count($arr['mid']) : 1; + $att = isset($arr['att']) ? array_sum($arr['att']) / count($arr['att']) : 1; + $ret = []; + $ret['all'] = array_fill(0, $length, round($all, 2)); + $ret['def'] = array_fill(0, $length, round($def, 2)); + $ret['mid'] = array_fill(0, $length, round($mid, 2)); + $ret['att'] = array_fill(0, $length, round($att, 2)); + } else { + $ret = []; + $ret['all'] = []; + $ret['def'] = []; + $ret['mid'] = []; + $ret['att'] = []; + } return $ret; } diff --git a/grapper.sh b/grapper.sh index 0343f11f..d0b72f71 100755 --- a/grapper.sh +++ b/grapper.sh @@ -27,11 +27,11 @@ case "$1" in echo "\n⚽ Grapper" php artisan nuh --d --f --ff 67 --fun=3 --task=1 - echo "\n⚽ CreateZip" - php artisan nuh --d --f 67 --fun=4 --task=1 + # echo "\n⚽ CreateZip" + # php artisan nuh --d --f 67 --fun=4 --task=1 - echo "\n⚽ SendMail" - php artisan nuh --d --f 67 --fun=5 --task=1 + # echo "\n⚽ SendMail" + # php artisan nuh --d --f 67 --fun=5 --task=1 echo "\n😎 task done :)" echo "" diff --git a/rosa-2026-07-27.xlsx b/rosa-2026-07-27.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..43dd3ddcd138aa46f974342c92759e92ba5073ab GIT binary patch literal 15007 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 literal 0 HcmV?d00001