popup and grapper wip

This commit is contained in:
salam committed 2025-12-22 15:46:04 +01:00
1 parent a3c9f16550
commit c9588f39b6
18 files changed
+656 -156248

No files matched your search

+1
View File
@@ -5,6 +5,7 @@ namespace App\Console\Commands\Grapper;
use App\Console\Commands\Grapper\Betsapi\Bwin;
use App\Console\Commands\Grapper\Betsapi\Fixtures;
use App\Console\Commands\Grapper\Betsapi\Odds;
use App\Console\Commands\Grapper\Betsapi\Willhill;
use App\Console\Commands\Nuh;
use App\Utilities\Notice;
+12 -6
View File
@@ -17,6 +17,8 @@ class Bwin
$sportmap = Sport::map('bwin');
$sportmap = [4];
$total = 1;
foreach ($sportmap as $sport_id => $bwin_sport_id) {
@@ -25,28 +27,32 @@ class Bwin
/**
* BWIN ODDS & BETRADAR ID (per page)
*/
$url = 'https://api.b365api.com/v1/bwin/prematch?token='.config('env.betsapi_token').'&page=###page###&sport_id='.$bwin_sport_id;
$base_url = 'https://api.b365api.com/v1/bwin/prematch?token='.config('env.betsapi_token').'&skip_markets=1&page=###page###&sport_id='.$bwin_sport_id;
while ($page <= $total) {
$url = str_replace('###page###', $page, $url);
$url = str_replace('###page###', $page, $base_url);
$data = Curl::load($url);
$page++;
$total = round($data['pager']['total'] / $data['pager']['per_page']);
if ($debug) {
Notice::note("Page: $page \nTotal: $total");
}
$page++;
if (isset($data['results'])) {
foreach ($data['results'] as $event) {
$bwin_id = $event['Id'];
$betsapi_id = $event['our_event_id'] ?? 0;
$betradar_id = $event['BetRadarId'] ?? 0;
$betsapi_id = $event['our_event_id'];
$bwin_id = $event['Id'] ?? 0;
if ($debug) {
Notice::note(["Betsapi ID : $betsapi_id", "Betradar ID : $betradar_id", "Bwin ID : $bwin_id"]);
}
if ($betradar_id) {
Event::where('betsapi_id', (int) $betsapi_id)->update(['betradar_id' => $betradar_id, 'bwin_id' => $bwin_id]);
@@ -17,49 +17,61 @@ class Fixtures
$sportmap = Sport::map('bapi');
$total = 1;
foreach ($sportmap as $sport_id => $betsapi_sport_id) {
$page = 1;
while ($page <= $total) {
$now = Carbon::now();
$url = "https://api.b365api.com/v3/events/upcoming?sport_id=$betsapi_sport_id&page=$page&skip_esports=1&token=".config('env.betsapi_token');
$data = Curl::load($url);
$page++;
$total = round($data['pager']['total'] / $data['pager']['per_page']);
if ($debug) {
Notice::note("Page: $page \nTotal: $total");
}
if (isset($data['results'])) {
foreach ($data['results'] as $row) {
$event = [
'sport_id' => (int) $sport_id,
'provider_id' => (int) Nuh::$options['provider_id'],
'starttime' => Carbon::createFromTimestamp((string) $row['time'])->toDateTimeString(),
'home' => $row['home']['name'] ?? '',
'home_id' => (int) $row['home']['id'],
'home_cc' => $row['home']['cc'] ?? '',
'away' => $row['away']['name'] ?? '',
'away_id' => (int) $row['away']['id'],
'away_cc' => $row['away']['cc'] ?? '',
'group' => $row['league']['name'] ?? '',
'group_id' => (int) $row['league']['id'] ?? 0,
'group_cc' => $row['league']['cc'] ?? '',
];
Mapper::updateOrCreate(['event_id' => (int) $row['id']], $event);
}
}
}
for ($i = 0; $i < 30; $i++) {
if ($debug) {
Notice::note('FIRST LOOP', 'g', 1);
Notice::note('Day: '.$now->format('d. M Y'), 'g');
}
$base_url = 'https://api.b365api.com/v3/events/upcoming?sport_id=###sport_id###&page=###page###&day='.$now->format('Ymd').'skip_esports=1&token='.config('env.betsapi_token');
$now->addDays(1);
$total = 1;
foreach ($sportmap as $sport_id => $betsapi_sport_id) {
$sport_url = str_replace('###sport_id###', $sport_id, $base_url);
$page = 1;
while ($page <= $total) {
$url = str_replace('###page###', $page, $sport_url);
$data = Curl::load($url);
$page++;
$total = round($data['pager']['total'] / $data['pager']['per_page']);
if ($debug) {
Notice::note("Page: $page \nTotal: $total");
}
if (isset($data['results'])) {
foreach ($data['results'] as $row) {
$event = [
'sport_id' => (int) $sport_id,
'provider_id' => (int) Nuh::$options['provider_id'],
'starttime' => Carbon::createFromTimestamp((string) $row['time'])->toDateTimeString(),
'home' => $row['home']['name'] ?? '',
'home_id' => (int) $row['home']['id'],
'home_cc' => $row['home']['cc'] ?? '',
'away' => $row['away']['name'] ?? '',
'away_id' => (int) $row['away']['id'],
'away_cc' => $row['away']['cc'] ?? '',
'group' => $row['league']['name'] ?? '',
'group_id' => (int) $row['league']['id'] ?? 0,
'group_cc' => $row['league']['cc'] ?? '',
];
Mapper::updateOrCreate(['event_id' => (int) $row['id']], $event);
}
}
}
}
}
}
@@ -21,26 +21,25 @@ class Fixtures
$count = 0;
$total = 0;
$now = Carbon::now();
/**
* Delete
*/
// $info = 0;
$info = Event::where('starttime', '<', $now->toDateTimeString())->delete();
$info = Event::where('starttime', '<', Carbon::now()->toDateTimeString())->delete();
if ($debug) {
Notice::note("Deleted: $info");
}
/**
* Grap
*/
for ($i = 0; $i < 30; $i++) {
$from = $now->addDays($i)->toDateString();
$to = $now->addDays($i + 1)->toDateString();
$url = 'https://xml2.txodds.com/feed/result/xml.php?'.Nuh::$AUTHTOKEN."&date=$from,$to";
$url = 'https://xml2.txodds.com/feed/result/xml.php?'.Nuh::$AUTHTOKEN.'&date='.$now->toDateString().','.$now->addDays(1)->toDateString();
$data = Xml::load($url);
@@ -94,12 +93,12 @@ class Fixtures
}
if ($debug) {
Notice::note("$from - $count events processed", 'g');
Notice::note($now->toDateString()." - $count events processed", 'g');
}
$total += $count;
if ($break || $debug) {
if ($break) {
break;
}
}
@@ -137,6 +137,10 @@ class Odds
dd($data);
}
if ($debug) {
Notice::note('call counter: '.$counter, 'g');
}
foreach ($data as $row) {
$event = [
File diff suppressed because it is too large. Load diff
@@ -2,7 +2,8 @@
namespace App\Filament\Resources\Events\Tables;
use App\Filament\Tables\Columns\MultilineColumn;
use App\Filament\Tables\Columns\Columns3way;
use App\Filament\Tables\Columns\MatchIds;
use App\Models\Country;
use App\Models\Event;
use Carbon\Carbon;
@@ -34,12 +35,12 @@ class EventsTable
->size(IconSize::ExtraLarge)
->icon(fn ($record) => $record->sport->icon)
->tooltip(fn ($record) => $record->id),
TextColumn::make('txodds_id')
->state(fn ($record) => $record->id)
->description(fn ($record) => $record->betsapi_id)
->copyable()
->label('Id')
->alignCenter(),
MatchIds::make('match_ids'),
TextColumn::make('id')->hidden()->searchable(),
TextColumn::make('betsapi_id')->hidden()->searchable(),
TextColumn::make('betradar_id')->hidden()->searchable(),
TextColumn::make('bet365_id')->hidden()->searchable(),
TextColumn::make('bwin_id')->hidden()->searchable(),
TextColumn::make('starttime')
->label('Start')
->alignCenter()
@@ -57,9 +58,7 @@ class EventsTable
->alignRight(),
TextColumn::make('away.name')
->searchable(),
MultilineColumn::make('id')
->searchable()
->label(fn () => view('filament.tables.columns.multiline.label')),
Columns3way::make('odds3way')->label(fn () => view('filament.tables.columns.multiline.label')),
])
->poll('10s')
->defaultSort('starttime', 'ASC')
@@ -0,0 +1,69 @@
<?php
namespace App\Filament\Tables\Columns;
use App\Models\Odds3way;
use Filament\Tables\Columns\Column;
class Columns3way extends Column
{
protected string $view = 'filament.tables.columns.columns_3way';
protected ?array $multiline;
protected ?array $fumetto;
public function loadData($record, $multiline_client)
{
$res = Odds3way::with('bookmaker')->where('event_id', $record->id)->get();
$this->fumetto = [];
$this->multiline = [];
foreach ($res as $item) {
$this->fumetto[] = $item;
foreach ($multiline_client as $slot => $bookmaker) {
if ($item->bookmaker_id == $bookmaker->bookmaker_id) {
$this->multiline[$slot] = $item;
}
}
}
// $this->multiline = [];
// foreach ($multiline_client as $slot => $bookmaker) {
// $open = true;
// foreach ($this->fumetto as $item) {
// if ($item['bookmaker_id'] == $bookmaker->bookmaker_id) {
// $this->multiline[$slot] = $item;
// $open = false;
// }
// }
// if ($open) {
// $item = new stdClass;
// $item['icon'] = $bookmaker->bookmaker->icon;
// $item['h3w'] = 0;
// $item['d3w'] = 0;
// $item['a3w'] = 0;
// $item['margin'] = 0;
// $item['bookmaker_id'] = $bookmaker->bookmaker_id;
// $this->multiline[$slot] = $item;
// }
// }
}
public function getMultilines(): ?array
{
return $this->multiline;
}
public function getFumetto()
{
return $this->fumetto;
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Filament\Tables\Columns;
use Filament\Tables\Columns\Column;
class MatchIds extends Column
{
protected string $view = 'filament.tables.columns.match-ids';
}
@@ -1,113 +0,0 @@
<?php
namespace App\Filament\Tables\Columns;
use Filament\Tables\Columns\Column;
use Illuminate\Support\Facades\DB;
use stdClass;
class MultilineColumn extends Column
{
protected string $view = 'filament.tables.columns.multiline.main';
protected ?array $slots;
protected $settings;
public function loadSlots($event_id, $bookmakers)
{
$systemSettings = app('systemSettings');
$this->settings = $systemSettings[auth()->user()->multiline_setting_id];
$odds = DB::table($this->settings->table)->where('event_id', $event_id)->get();
$this->makeSlots($odds, $bookmakers);
}
public function has3Columns(): ?int
{
return $this->settings->has_3_columns;
}
public function getSlots(): ?array
{
return $this->slots;
}
public function makeSlots(&$odds, $bookmakers)
{
$multilines = [];
foreach ($bookmakers as $slot => $bookmaker) {
$open = true;
foreach ($odds as $item) {
if ($item->bookmaker_id == $bookmaker->bookmaker_id) {
$item->icon = $bookmaker->bookmaker->icon;
$item->table = $this->settings['table'];
switch ($this->settings->table) {
case 'odds_2ways':
case 'odds_2ways_s1':
$item->a = $item->h3w;
$item->c = $item->a3w;
break;
case 'odds_3ways':
$item->a = $item->h3w;
$item->b = $item->d3w;
$item->c = $item->a3w;
break;
case 'odds_dc':
$item->a = $item->dc1x;
$item->b = $item->dc12;
$item->c = $item->dc2x;
break;
case 'odds_dnb':
$item->a = $item->dnb1;
$item->c = $item->dnb2;
break;
case 'odds_ggng':
$item->a = $item->gg;
$item->c = $item->ng;
break;
case 'odds_handicaps':
case 'odds_handicaps_q1':
$item->a = $item->home;
$item->b = $item->away;
$item->c = $item->handicap;
break;
case 'odds_qualify':
$item->a = $item->htq;
$item->c = $item->atq;
break;
case 'odds_totals':
case 'odds_totals_q1':
$item->a = $item->over;
$item->b = $item->under;
$item->c = $item->total;
break;
default:
// code...
break;
}
$multilines[$slot] = $item;
$open = false;
}
}
if ($open) {
$item = new stdClass;
$item->icon = $bookmaker->bookmaker->icon;
$item->bookmaker_id = $bookmaker->bookmaker_id;
$item->a = 0;
$item->b = 0;
$item->c = 0;
$item->margin = 0;
$multilines[$slot] = $item;
}
}
$this->slots = $multilines;
}
}
@@ -0,0 +1,70 @@
<?php
namespace App\Filament\Tables\Columns;
use App\Models\Odds3way;
use App\Models\OddsDc;
use App\Models\OddsDnb;
use Filament\Tables\Columns\Column;
class MultilineColumn extends Column
{
protected string $view = 'filament.tables.columns.multiline.main';
protected ?array $fumetto;
protected ?array $settings;
public function has3Columns(): ?int
{
return $this->settings->has_3_columns;
}
public function getFumetto()
{
return $this->fumetto;
}
public function laodFumetto($event_id)
{
$systemSettings = app('systemSettings');
$this->settings = $systemSettings[auth()->user()->multiline_setting_id];
switch ($this->settings->table) {
case 'odds_2ways':
$this->fumetto = Odds2way::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_2ways_s1':
$this->fumetto = Odds2wayS1::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_3ways':
$this->fumetto = Odds3way::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_dc':
$this->fumetto = OddsDc::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_dnb':
$this->fumetto = OddsDnb::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_ggng':
$this->fumetto = OddsGgng::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_handicaps':
$this->fumetto = OddsHandicap::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_handicaps_q1':
$this->fumetto = OddsHandicapQ1::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_qualify':
$this->fumetto = OddsQualify::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_totals':
$this->fumetto = OddsTotal::with('bookmaker')->where('event_id', $event_id)->get();
break;
case 'odds_totals_q1':
$this->fumetto = OddsTotalQ1::with('bookmaker')->where('event_id', $event_id)->get();
break;
}
}
}
+2
View File
@@ -1990,6 +1990,7 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -2223,6 +2224,7 @@
"integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.27.0",
"fdir": "^6.5.0",
@@ -0,0 +1,23 @@
@php
$loadData($record, $record->multiline_client);
@endphp
@include('filament.tables.columns.multiline.fumetto')
<div {{ $getExtraAttributeBag() }} class="grid grid-cols-5 grid-rows-5 text-xs">
@foreach ($getMultilines() as $item)
@include('filament.tables.columns.multiline.bkm', [
'bookmaker_id' => $item->bookmaker_id,
'icon' => $item->bookmaker->icon,
])
@include('filament.tables.columns.multiline.odds', ['odd' => $item->h3w, 'decimal' => 2])
@include('filament.tables.columns.multiline.odds', ['odd' => $item->d3w, 'decimal' => 2])
@include('filament.tables.columns.multiline.odds', ['odd' => $item->a3w, 'decimal' => 2])
@include('filament.tables.columns.multiline.odds', ['odd' => $item->margin, 'decimal' => 1])
@endforeach
</div>
@@ -0,0 +1,18 @@
<div class="grid grid-cols-2 text-xs">
<div>TxOdds</div>
<div>
{{ $record->id }}
</div>
<div>BetsApi</div>
<div>
{{ $record->betsapi_id }}
</div>
<div>Betradar</div>
<div>
{{ $record->betradar_id }}
</div>
<div>Bet365</div>
<div>
{{ $record->bet365_id }}
</div>
</div>
@@ -1,6 +1,9 @@
@php
use App\Utilities\BkmIconMap;
@endphp
<div class="w-12 bg-contain bg-center bg-no-repeat dark:opacity-90" title="{{ $bookmaker_id }}"
style="background-image: url('{{ BkmIconMap::get($icon) }}')">
</div>
@if (isset($icon))
<div class="w-12 bg-contain bg-center bg-no-repeat dark:opacity-90" title="{{ $bookmaker_id }}"
style="background-image: url('{{ BkmIconMap::get($icon) }}')">
</div>
@endif
@@ -0,0 +1,41 @@
<div class="mx-3 my-auto" x-data="{ open: false }">
<div x-on:mouseover="open = true" x-on:mouseleave="open = false">
<x-filament::icon-button icon="heroicon-o-chat-bubble-left-ellipsis" color="alert gray" />
</div>
<div x-show="open" x-transition:enter="transition ease-out duration-200"
x-transition:enter-start="opacity-0 transform translate-y-2"
x-transition:enter-end="opacity-100 transform translate-y-0">
<div
class="absolute z-10 bg-gray-100 dark:bg-gray-800 p-5 border border-gray-300 dark:border-gray-900 rounded-md">
<div class="grid grid-cols-5 grid-rows-5 gap-2">
@foreach ($getFumetto() as $item)
@include('filament.tables.columns.multiline.bkm', [
'bookmaker_id' => $item->bookmaker_id,
'icon' => $item->bookmaker->icon,
])
@include('filament.tables.columns.multiline.odds', [
'odd' => $item->h3w,
'decimal' => 2,
])
@include('filament.tables.columns.multiline.odds', [
'odd' => $item->d3w,
'decimal' => 2,
])
@include('filament.tables.columns.multiline.odds', [
'odd' => $item->a3w,
'decimal' => 2,
])
@include('filament.tables.columns.multiline.odds', [
'odd' => $item->margin,
'decimal' => 1,
])
@endforeach
</div>
</div>
</div>
</div>
@@ -1,5 +1,5 @@
<div class="flex justify-start gap-0 text-xs">
<div class="w-12 text-center"></div>
<div class="w-8 text-center"></div>
@switch(auth()->user()->multiline_setting_id)
@case(1)
@case(13)
@@ -10,7 +10,7 @@
@foreach ($getSlots() as $item)
@include('filament.tables.columns.multiline.bkm', [
'icon' => $item->icon,
'icon' => $item?->bookmaker->icon,
'bookmaker_id' => $item->bookmaker_id,
])