renewd grapper wip

This commit is contained in:
salam committed 2026-01-19 18:36:07 +01:00
1 parent 8f1aeafe46
commit 4afe60a957
55 files changed
+1389 -823

No files matched your search

-4
View File
@@ -3,7 +3,6 @@
namespace App\Console\Commands\Grapper;
use App\Console\Commands\Grapper\Betsapi\Bet365;
use App\Console\Commands\Grapper\Betsapi\Betfair;
use App\Console\Commands\Grapper\Betsapi\Bwin;
use App\Console\Commands\Grapper\Betsapi\Fixtures;
use App\Console\Commands\Grapper\Betsapi\Odds;
@@ -36,9 +35,6 @@ class Betsapi
case 'Bet365':
Bet365::grap();
break;
case 'Betfair':
Betfair::grap();
break;
default:
Notice::note('prosses name does not exist', 'r', 1);
break;
+208 -200
View File
@@ -12,6 +12,7 @@ use App\Models\OddsDc;
use App\Models\OddsDnb;
use App\Models\OddsGgng;
use App\Models\OddsTotal;
use App\Models\Sport;
use App\Utilities\Margin;
use App\Utilities\Notice;
use Illuminate\Support\Carbon;
@@ -28,236 +29,243 @@ class Bet365
$single = Nuh::$options['id'] ?? 0;
$sportmap = Sport::map('bapi', 1, [1, 2, 3, 5]);
$sportmap = [3];
/**
* Bet365
*/
$bookmaker_id = 126;
if ($single) {
$events = Event::where('id', Nuh::$options['id'])->where('bet365_id', '>', 0)->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
} elseif ($today) {
$events = Event::where('bet365_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->where('starttime', '<', Carbon::now()->addDay()->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
} elseif ($week) {
$events = Event::where('bet365_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->where('starttime', '<', Carbon::now()->addDays(7)->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
} else {
// all
$events = Event::where('bet365_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
}
if ($events ?? null && $debug) {
Notice::note('No events', 'r');
}
foreach ($events as $key => $event) {
foreach ($sportmap as $sport_id) {
if ($debug) {
Notice::note([
'id' => $event->id,
'bet365_id' => $event->bet365_id,
'starttime' => $event->starttime,
'count' => count($events).'/'.$key + 1,
], 'b');
if ($single) {
$events = Event::where('id', Nuh::$options['id'])->where('bet365_id', '>', 0)->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
} elseif ($today) {
$events = Event::where('sport_id', $sport_id)->where('bet365_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->where('starttime', '<', Carbon::now()->addDay()->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
} elseif ($week) {
$events = Event::where('sport_id', $sport_id)->where('bet365_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->where('starttime', '<', Carbon::now()->addDays(7)->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
} else {
// all
$events = Event::where('sport_id', $sport_id)->where('bet365_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'starttime')->get();
}
/**
* BET365 ODDS (per event)
*/
$url = 'https://api.b365api.com/v4/bet365/prematch?token='.config('env.betsapi_token').'&FI='.$event->bet365_id;
if ($events ?? null && $debug) {
Notice::note('No events', 'r');
}
foreach ($events as $key => $event) {
$data = Curl::load($url);
if (isset($data['results'][0]['main'])) {
EventBookmaker::updateOrCreate([
'event_id' => $event->id,
'bookmaker_id' => Nuh::$options['bookmaker_id'],
], ['starttime' => $event->starttime, 'in_feed' => 1, 'bmoid' => $event->bet365_id]);
$offer = $data['results'][0]['main']['sp'];
$base = [];
$base['event_id'] = $event->id;
$base['bookmaker_id'] = $bookmaker_id;
$base['sport_id'] = $event->sport_id;
$base['provider_id'] = Nuh::$options['provider_id'];
$base['bmoid'] = $event->bet365_id;
$base['flag'] = 1;
/**
* 1X2
*/
if (isset($offer['full_time_result'])) {
$odds = [];
$odds['h3w'] = number_format($offer['full_time_result']['odds'][0]['odds'], 2) ?? 1;
$odds['d3w'] = number_format($offer['full_time_result']['odds'][1]['odds'], 2) ?? 1;
$odds['a3w'] = number_format($offer['full_time_result']['odds'][2]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = Odds3way::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
Odds3way::create($odds);
} else {
$res->h3w = $odds['h3w'];
$res->a3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
if ($debug) {
Notice::note([
'id' => $event->id,
'bet365_id' => $event->bet365_id,
'starttime' => $event->starttime,
'count' => count($events).'/'.$key + 1,
], 'b');
}
/**
* DC
* BET365 ODDS (per event)
*/
if (isset($offer['double_chance'])) {
$odds = [];
$odds['dc1x'] = number_format($offer['double_chance']['odds'][0]['odds'], 2) ?? 1;
$odds['dc12'] = number_format($offer['double_chance']['odds'][1]['odds'], 2) ?? 1;
$odds['dcx2'] = number_format($offer['double_chance']['odds'][2]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$url = 'https://api.b365api.com/v4/bet365/prematch?token='.config('env.betsapi_token').'&FI='.$event->bet365_id;
$odds = array_merge($odds, $base);
$data = Curl::load($url);
$res = OddsDc::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (isset($data['results'][0]['main'])) {
if (! $res) {
OddsDc::create($odds);
} else {
$res->dc1x = $odds['dc1x'];
$res->dc12 = $odds['dc12'];
$res->dcx2 = $odds['dcx2'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
EventBookmaker::updateOrCreate([
'event_id' => $event->id,
'bookmaker_id' => $bookmaker_id,
], ['starttime' => $event->starttime, 'in_feed' => 1, 'bmoid' => $event->bet365_id]);
/**
* OU
*/
if (isset($offer['goals_over_under'])) {
$offer = $data['results'][0]['main']['sp'];
$odds = [];
$odds['over'] = number_format($offer['goals_over_under']['odds'][0]['odds'], 2) ?? 1;
$odds['under'] = number_format($offer['goals_over_under']['odds'][1]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
if ($base['sport_id'] == 1) {
$odds['active_spread'] = 1;
}
$base = [];
$base['event_id'] = $event->id;
$base['bookmaker_id'] = $bookmaker_id;
$base['sport_id'] = $event->sport_id;
$base['provider_id'] = Nuh::$options['provider_id'];
$base['bmoid'] = $event->bet365_id;
$base['flag'] = 1;
$odds = array_merge($odds, $base);
/**
* 1X2
*/
if (isset($offer['full_time_result'])) {
$odds = [];
$odds['h3w'] = number_format($offer['full_time_result']['odds'][0]['odds'], 2) ?? 1;
$odds['d3w'] = number_format($offer['full_time_result']['odds'][1]['odds'], 2) ?? 1;
$odds['a3w'] = number_format($offer['full_time_result']['odds'][2]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
if ($offer['goals_over_under']['odds'][1]['name'] == '2.5') {
$odds['total'] = 2.5;
$res = OddsTotal::where('event_id', $event->id)
->where('bookmaker_id', $bookmaker_id)
->where('total', $odds['total'])
->first();
$odds = array_merge($odds, $base);
$res = Odds3way::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
OddsTotal::create($odds);
Odds3way::create($odds);
} else {
$res->over = $odds['over'];
$res->under = $odds['under'];
$res->h3w = $odds['h3w'];
$res->a3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
/**
* DC
*/
if (isset($offer['double_chance'])) {
$odds = [];
$odds['dc1x'] = number_format($offer['double_chance']['odds'][0]['odds'], 2) ?? 1;
$odds['dc12'] = number_format($offer['double_chance']['odds'][1]['odds'], 2) ?? 1;
$odds['dcx2'] = number_format($offer['double_chance']['odds'][2]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsDc::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
OddsDc::create($odds);
} else {
$res->dc1x = $odds['dc1x'];
$res->dc12 = $odds['dc12'];
$res->dcx2 = $odds['dcx2'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
/**
* OU
*/
if (isset($offer['goals_over_under'])) {
$odds = [];
$odds['over'] = number_format($offer['goals_over_under']['odds'][0]['odds'], 2) ?? 1;
$odds['under'] = number_format($offer['goals_over_under']['odds'][1]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
if ($base['sport_id'] == 1) {
$odds['active_spread'] = 1;
}
$odds = array_merge($odds, $base);
if ($offer['goals_over_under']['odds'][1]['name'] == '2.5') {
$odds['total'] = 2.5;
$res = OddsTotal::where('event_id', $event->id)
->where('bookmaker_id', $bookmaker_id)
->where('total', $odds['total'])
->first();
if (! $res) {
OddsTotal::create($odds);
} else {
$res->over = $odds['over'];
$res->under = $odds['under'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->difference = abs(1 / $odds['over'] - 1 / $odds['under']);
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
/**
* GG NG
*/
if (isset($offer['both_teams_to_score'])) {
$odds = [];
$odds['gg'] = number_format($offer['both_teams_to_score']['odds'][0]['odds'], 2) ?? 1;
$odds['ng'] = number_format($offer['both_teams_to_score']['odds'][1]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsGgng::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
OddsGgng::create($odds);
} else {
$res->gg = $odds['gg'];
$res->ng = $odds['ng'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
/**
* DNB
*/
if (isset($offer['draw_no_bet'])) {
$odds = [];
$odds['dnb1'] = number_format($offer['draw_no_bet']['odds'][0]['odds'], 2) ?? 1;
$odds['dnb2'] = number_format($offer['draw_no_bet']['odds'][1]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$res = OddsDnb::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
$odds = array_merge($odds, $base);
if (! $res) {
OddsDnb::create($odds);
} else {
$res->dnb1 = $odds['dnb1'];
$res->dnb2 = $odds['dnb2'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
/**
* 1X2 HT
*/
if (isset($offer['half_time_result'])) {
$odds = [];
$odds['h3w'] = number_format($offer['half_time_result']['odds'][0]['odds'], 2) ?? 1;
$odds['d3w'] = number_format($offer['half_time_result']['odds'][1]['odds'], 2) ?? 1;
$odds['a3w'] = number_format($offer['half_time_result']['odds'][2]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = Odds3wayHt::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
Odds3wayHt::create($odds);
} else {
$res->h3w = $odds['h3w'];
$res->d3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->difference = abs(1 / $odds['over'] - 1 / $odds['under']);
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
/**
* GG NG
*/
if (isset($offer['both_teams_to_score'])) {
$odds = [];
$odds['gg'] = number_format($offer['both_teams_to_score']['odds'][0]['odds'], 2) ?? 1;
$odds['ng'] = number_format($offer['both_teams_to_score']['odds'][1]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsGgng::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
OddsGgng::create($odds);
} else {
$res->gg = $odds['gg'];
$res->ng = $odds['ng'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
/**
* DNB
*/
if (isset($offer['draw_no_bet'])) {
$odds = [];
$odds['dnb1'] = number_format($offer['draw_no_bet']['odds'][0]['odds'], 2) ?? 1;
$odds['dnb2'] = number_format($offer['draw_no_bet']['odds'][1]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$res = OddsDnb::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
$odds = array_merge($odds, $base);
if (! $res) {
OddsDnb::create($odds);
} else {
$res->dnb1 = $odds['dnb1'];
$res->dnb2 = $odds['dnb2'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
/**
* 1X2 HT
*/
if (isset($offer['half_time_result'])) {
$odds = [];
$odds['h3w'] = number_format($offer['half_time_result']['odds'][0]['odds'], 2) ?? 1;
$odds['d3w'] = number_format($offer['half_time_result']['odds'][1]['odds'], 2) ?? 1;
$odds['a3w'] = number_format($offer['half_time_result']['odds'][2]['odds'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = Odds3wayHt::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
Odds3wayHt::create($odds);
} else {
$res->h3w = $odds['h3w'];
$res->d3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
}
@@ -1,48 +0,0 @@
<?php
namespace App\Console\Commands\Grapper\Betsapi;
use App\Console\Commands\Curl;
use App\Console\Commands\Nuh;
use App\Models\Event;
use App\Utilities\Notice;
class Betfair
{
public static function grap()
{
$debug = Nuh::$options['d'] ?? 0;
/**
* Betfair
*/
exit;
$bookmaker_id = 126;
$res = Event::where('bet365_id', '>', 0)->pluck('id', 'bet365_id');
foreach ($res as $bet365_id => $txodds_id) {
/**
* BETFAIR SP (per page)
* https://api.b365api.com/v1/bwin/prematch?token=36152-aeTRNnZxSPUwGe
*/
$url = 'https://api.b365api.com/v4/bet365/prematch?token='.config('env.betsapi_token').'&FI='.$bet365_id;
$data = Curl::load($url);
dd($data);
$betsapi_id = $data['results'][0]['id'] ?? 0;
$bet365_id = $data['results'][0]['bet365_id'] ?? 0;
if ($debug) {
Notice::note(["TXdds ID : $txodds_id", "Betsapi ID : $betsapi_id", "Bet365 ID : $bet365_id", "Willhill ID : $willhill_id"], 'b');
}
if ($betsapi_id) {
Event::where('id', (int) $txodds_id)->update(['betsapi_id' => $betsapi_id, 'bet365_id' => $bet365_id]);
}
}
}
}
@@ -2,7 +2,14 @@
namespace App\Console\Commands\Grapper\Betsapi;
use App\Console\Commands\Curl;
use App\Console\Commands\Nuh;
use App\Models\Event;
use App\Models\Odds3way;
use App\Models\Supervisor;
use App\Utilities\Margin;
use App\Utilities\Notice;
use Illuminate\Support\Carbon;
class Odds
{
@@ -12,5 +19,121 @@ class Odds
public static function grap()
{
$debug = Nuh::$options['d'] ?? 0;
$today = Nuh::$options['t'] ?? 0;
$week = Nuh::$options['w'] ?? 0;
$single = Nuh::$options['id'] ?? 0;
if ($debug) {
Notice::note('BETSAPI ODDS '.Nuh::$options['sport'], 'b');
}
$sources = [126 => 'bet365', 83 => 'pinnaclesports'];
if ($single) {
$events = Event::where('id', Nuh::$options['id'])->where('betsapi_id', '>', 0)->select('id', 'sport_id', 'bet365_id', 'betsapi_id', 'starttime')->get();
} elseif ($today) {
$events = Event::where('sport_id', Nuh::$options['sport_id'])->where('betsapi_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->where('starttime', '<', Carbon::now()->addDay()->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'betsapi_id', 'starttime')->get();
} elseif ($week) {
$events = Event::where('sport_id', Nuh::$options['sport_id'])->where('betsapi_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->where('starttime', '<', Carbon::now()->addDays(7)->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'betsapi_id', 'starttime')->get();
} else {
// all
$events = Event::where('sport_id', Nuh::$options['sport_id'])->where('betsapi_id', '>', 0)->where('starttime', '>', Carbon::now()->toDateTimeString())->select('id', 'sport_id', 'bet365_id', 'betsapi_id', 'starttime')->get();
}
foreach ($events as $key => $event) {
if ($debug) {
Notice::note([
'id' => $event->id,
'betsapi_id' => $event->betsapi_id,
'starttime' => $event->starttime,
'count' => count($events).'/'.$key + 1,
], 'b');
}
$since_time = Nuh::$options['lastcall'] - 600;
$since_time = 0;
foreach ($sources as $bookmaker_id => $source) {
$url = 'https://api.b365api.com/v2/event/odds?token='.config('env.betsapi_token').'&source'.$source.'&since_time='.$since_time.'&event_id='.$event->betsapi_id;
$data = Curl::load($url);
$base = [];
$base['event_id'] = $event->id;
$base['bookmaker_id'] = $bookmaker_id;
$base['sport_id'] = $event->sport_id;
$base['provider_id'] = Nuh::$options['provider_id'];
$base['bmoid'] = $event->betsapi_id;
$base['flag'] = 1;
foreach ($data['results']['odds'] as $key => $value) {
switch ($key) {
case '1_1':
$odds = [];
$odds['h3w'] = number_format($value[0]['home_od'], 2) ?? 1;
$odds['d3w'] = number_format($value[0]['draw_od'], 2) ?? 1;
$odds['a3w'] = number_format($value[0]['away_od'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = Odds3way::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
Odds3way::create($odds);
} else {
$res->h3w = $odds['h3w'];
$res->a3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
break;
case '1_3':
dd($value);
$odds = [];
$odds['h3w'] = number_format($value[0]['home_od'], 2) ?? 1;
$odds['d3w'] = number_format($value[0]['draw_od'], 2) ?? 1;
$odds['a3w'] = number_format($value[0]['away_od'], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = Odds3way::where('event_id', $event->id)->where('bookmaker_id', $bookmaker_id)->first();
if (! $res) {
Odds3way::create($odds);
} else {
$res->h3w = $odds['h3w'];
$res->a3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
break;
}
}
}
Supervisor::where('id', Nuh::$options['supervisor_id'])->update(['lastcall' => time()]);
}
}
}
@@ -19,8 +19,6 @@ class Willhill
{
$debug = Nuh::$options['d'] ?? 0;
$sports = [1, 2, 3, 5];
/**
* williamhill
*/
@@ -1,8 +0,0 @@
6 Unibet
13 Sportingbet
42 William Hill
110 BetFair
117 SNAI
314 Matchbook
649 1XBet
824 BetPlay
@@ -41,7 +41,8 @@ class FindFixture
// DEFAULT BETRADAR
if ($betradar_id) {
$match = Event::where('betradar_id', $betradar_id)->first();
} else {
}
if (! isset($match) or ! $match) {
switch ($event['provider_id']) {
case 2:
// BETSAPI
@@ -66,7 +67,7 @@ class FindFixture
}
}
if ($match ?? null) {
if ($match) {
$update_array = [];
+4 -5
View File
@@ -60,21 +60,20 @@ class Logifuture
EventBookmaker::updateOrCreate([
'event_id' => $event['id'],
'bookmaker_id' => Nuh::$options['bookmaker_id'],
], ['in_feed' => 1, 'bmoid' => $event['event_id'], 'startime' => $event['startime']]);
], ['in_feed' => 1, 'bmoid' => $event['event_id'], 'startime' => $event['starttime']]);
$_spreads = [];
switch ($sport_id) {
case 1:
Soccer::get($event, $match);
break;
case 2:
Icehockey::get($event, $_spreads, $match);
Icehockey::get($event, $match);
break;
case 3:
Basketball::get($event, $_spreads, $match);
Basketball::get($event, $match);
break;
case 5:
Tennis::get($event, $_spreads, $match);
Tennis::get($event, $match);
break;
default:
@@ -2,13 +2,14 @@
namespace App\Console\Commands\Grapper\Logifuture;
use App\Console\Commands\Grapper\Logifuture\Tools\PrinzipalHandicap;
use App\Models\OddsTotal;
use App\Utilities\Margin;
use App\Console\Commands\Grapper\Logifuture\Odds\StorePoints;
use App\Console\Commands\Grapper\Logifuture\Odds\StoreTotals;
use App\Console\Commands\Grapper\Logifuture\Tools\FilterHandicap;
use App\Console\Commands\Nuh;
class Basketball
{
public static function get(&$event, &$_spreads, $match)
public static function get(&$event, $match)
{
$n_totals = [];
$n_totals_qt = [];
@@ -76,61 +77,48 @@ class Basketball
}
}
dd($n_totals);
$_spreads = [];
// COLUMBIA
if ($c_totals) {
PrinzipalHandicap::filter($_spreads['total'], 'B_OUHND@', $c_totals, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total'], 'B_OUHND@', $c_totals, ['over', 'under', 'total']);
}
if ($c_totals_qt) {
PrinzipalHandicap::filter($_spreads['total_qt'], 'B_OUHND1P@', $c_totals_qt, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total_qt'], 'B_OUHND1P@', $c_totals_qt, ['over', 'under', 'total']);
}
if ($c_points) {
PrinzipalHandicap::filter($_spreads['point'], 'B_12HND@', $c_points, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point'], 'B_12HND@', $c_points, ['hth1', 'hth2', 'hcap']);
}
if ($c_points_qt) {
PrinzipalHandicap::filter($_spreads['point_qt'], 'B_12HND1P@', $c_points_qt, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point_qt'], 'B_12HND1P@', $c_points_qt, ['hth1', 'hth2', 'hcap']);
}
// NIGERIA
if ($n_totals) {
PrinzipalHandicap::filter($_spreads['total'], 'B_OUN@', $n_totals, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total'], 'B_OUN@', $n_totals, ['over', 'under', 'total']);
}
if ($n_totals_qt) {
PrinzipalHandicap::filter($_spreads['total_qt'], 'B_1QOU@', $n_totals_qt, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total_qt'], 'B_1QOU@', $n_totals_qt, ['over', 'under', 'total']);
}
if ($n_points) {
PrinzipalHandicap::filter($_spreads['point'], 'B_H@', $n_points, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point'], 'B_H@', $n_points, ['hth1', 'hth2', 'hcap']);
}
if ($n_points_qt) {
PrinzipalHandicap::filter($_spreads['point_qt'], 'B_1QH@', $n_points_qt, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point_qt'], 'B_1QH@', $n_points_qt, ['hth1', 'hth2', 'hcap']);
}
dd($n_totals);
$base = [];
$base['event_id'] = $event['id'];
$base['bookmaker_id'] = $event['bookmaker_id'];
$base['sport_id'] = $event['sport_id'];
$base['provider_id'] = Nuh::$options['provider_id'];
$base['bmoid'] = $event['event_id'];
$base['flags'] = 1;
if (\count($n_totals) == 2) {
$_total['margin'] = (float) Margin::calculate($n_totals, 1);
$_total = array_merge($_total, $base);
$res = OddsTotal::where('event_id', $event['id'])
->where('bookmaker_id', $event['bookmaker_id'])
->where('total', $event['total'])
->first();
if (! $res) {
OddsTotal::create($_total);
} else {
$res->over = number_format($_total['over'], 2);
$res->under = number_format($_total['under'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $_total['margin'];
$res->save();
}
if (isset($_spreads['total'])) {
StoreTotals::store($_spreads['total'], $base);
}
if (isset($_spreads['point'])) {
StorePoints::store($_spreads['point'], $base);
}
}
}
@@ -2,12 +2,24 @@
namespace App\Console\Commands\Grapper\Logifuture;
use App\Console\Commands\Grapper\Logifuture\Tools\PrinzipalHandicap;
use App\Console\Commands\Grapper\Logifuture\Odds\StorePoints;
use App\Console\Commands\Grapper\Logifuture\Odds\StorePointsQ1;
use App\Console\Commands\Grapper\Logifuture\Odds\StoreTotals;
use App\Console\Commands\Grapper\Logifuture\Odds\StoreTotalsQ1;
use App\Console\Commands\Grapper\Logifuture\Tools\FilterHandicap;
use App\Console\Commands\Nuh;
use App\Models\Odds2way;
use App\Models\Odds2wayS1;
use App\Models\Odds3way;
use App\Utilities\Margin;
class Icehockey
{
public static function get(&$event, &$_spreads, $match)
public static function get(&$event, $match)
{
$ml = [];
$mls1 = [];
$_3way = [];
$n_totals = [];
$n_points = [];
$c_totals = [];
@@ -16,22 +28,27 @@ class Icehockey
foreach ($match['odds'] as $name => $value) {
switch ($name) {
case 'IH_1X2_1':
$event['h3w'] = number_format($value, 2);
$_3way['h3w'] = number_format($value, 2);
break;
case 'IH_1X2_X':
$event['d3w'] = number_format($value, 2);
$_3way['d3w'] = number_format($value, 2);
break;
case 'IH_1X2_2':
$event['a3w'] = number_format($value, 2);
$_3way['a3w'] = number_format($value, 2);
break;
case 'IH_12_1':
case 'IH_12OTAP_1':
$event['h2w'] = number_format($value, 2);
$ml['h2w'] = number_format($value, 2);
break;
case 'IH_12_2':
$ml['a2w'] = number_format($value, 2);
break;
case 'IH_12OTAP_1':
$mls1['h2w'] = number_format($value, 2);
break;
case 'IH_12OTAP_2':
$event['a2w'] = number_format($value, 2);
$mls1['a2w'] = number_format($value, 2);
break;
}
@@ -59,20 +76,111 @@ class Icehockey
}
}
$base = [];
$base['event_id'] = $event['id'];
$base['bookmaker_id'] = $event['bookmaker_id'];
$base['sport_id'] = $event['sport_id'];
$base['provider_id'] = Nuh::$options['provider_id'];
$base['bmoid'] = $event['event_id'];
$base['flags'] = 1;
// 1x2
if (\count($_3way) == 3) {
$_3way['margin'] = (float) Margin::calculate($_3way, 1);
$_3way = array_merge($_3way, $base);
$res = Odds3way::where('event_id', $event['id'])->where('bookmaker_id', $event['bookmaker_id'])->first();
if (! $res) {
Odds3way::create($_3way);
} else {
$res->h3w = number_format($_3way['h3w'], 2);
$res->d3w = number_format($_3way['d3w'], 2);
$res->a3w = number_format($_3way['a3w'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $_3way['margin'];
$res->save();
}
}
// ML
if (\count($ml) == 2) {
$ml['margin'] = (float) Margin::calculate($ml, 1);
$ml = array_merge($ml, $base);
$res = Odds2way::where('event_id', $event['id'])->where('bookmaker_id', $event['bookmaker_id'])->first();
if (! $res) {
Odds2way::create($ml);
} else {
$res->h2w = number_format($ml['h2w'], 2);
$res->a2w = number_format($ml['a2w'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $ml['margin'];
$res->save();
}
}
if (\count($mls1) == 2) {
$mls1['margin'] = (float) Margin::calculate($mls1, 1);
$mls1 = array_merge($mls1, $base);
$res = Odds2wayS1::where('event_id', $event['id'])->where('bookmaker_id', $event['bookmaker_id'])->first();
if (! $res) {
Odds2wayS1::create($ml);
} else {
$res->h2w = number_format($ml['h2w'], 2);
$res->a2w = number_format($ml['a2w'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $mls1['margin'];
$res->save();
}
}
// COLUMBIA
if ($c_totals) {
PrinzipalHandicap::filter($_spreads['total'], 'IH_OUHND@', $c_totals, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total'], 'IH_OUHND@', $c_totals, ['over', 'under', 'total']);
}
if ($c_points) {
PrinzipalHandicap::filter($_spreads['point'], 'IH_12HND@', $c_points, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point'], 'IH_12HND@', $c_points, ['hth1', 'hth2', 'hcap']);
}
// NIGERIA
if ($n_totals) {
PrinzipalHandicap::filter($_spreads['total'], 'IH_TF@', $n_totals, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total'], 'IH_TF@', $n_totals, ['over', 'under', 'total']);
}
if ($n_points) {
PrinzipalHandicap::filter($_spreads['point'], 'IH_HR1@', $n_points, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point'], 'IH_HR1@', $n_points, ['hth1', 'hth2', 'hcap']);
}
if (isset($_spreads['total'])) {
StoreTotals::store($_spreads['total'], $base);
}
if (isset($_spreads['total_qt'])) {
StoreTotalsQ1::store($_spreads['total_qt'], $base);
}
if (isset($_spreads['point'])) {
StorePoints::store($_spreads['point'], $base);
}
if (isset($_spreads['point_qt'])) {
StorePointsQ1::store($_spreads['point_qt'], $base);
}
}
}
@@ -74,7 +74,7 @@ class Soccer
$base['sport_id'] = $event['sport_id'];
$base['provider_id'] = Nuh::$options['provider_id'];
$base['bmoid'] = $event['event_id'];
$base['flag'] = 1;
$base['flags'] = 1;
// 1x2
if (\count($_3way) == 3) {
@@ -89,13 +89,12 @@ class Soccer
Odds3way::create($_3way);
} else {
$res->h3w = number_format($_3way['h3w'], 2);
$res->a3w = number_format($_3way['d3w'], 2);
$res->d3w = number_format($_3way['a3w'], 2);
$res->d3w = number_format($_3way['d3w'], 2);
$res->a3w = number_format($_3way['a3w'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->flag = 1;
$res->margin = $_3way['margin'];
$res->save();
}
@@ -111,7 +110,7 @@ class Soccer
$res = OddsTotal::where('event_id', $event['id'])
->where('bookmaker_id', $event['bookmaker_id'])
->where('total', $event['total'])
->where('total', $_total['total'])
->first();
if (! $res) {
@@ -179,12 +178,12 @@ class Soccer
$_tq['margin'] = (float) Margin::calculate($_tq, 1);
$_tq = array_merge($_dc, $base);
$_tq = array_merge($_tq, $base);
$res = OddsTq::where('event_id', $event['id'])->where('bookmaker_id', $event['bookmaker_id'])->first();
if (! $res) {
OddsTq::create($_dc);
OddsTq::create($_tq);
} else {
$res->htq = number_format($_tq['htq'], 2);
$res->atq = number_format($_tq['atq'], 2);
@@ -2,12 +2,20 @@
namespace App\Console\Commands\Grapper\Logifuture;
use App\Console\Commands\Grapper\Logifuture\Tools\PrinzipalHandicap;
use App\Console\Commands\Grapper\Logifuture\Tools\FilterHandicap;
use App\Console\Commands\Grapper\Magloo\Odds\StorePoints;
use App\Console\Commands\Grapper\Magloo\Odds\StoreTotals;
use App\Console\Commands\Nuh;
use App\Models\Odds2way;
use App\Models\Odds2wayS1;
use App\Utilities\Margin;
class Tennis
{
public static function get(&$event, &$_spreads, $match)
public static function get(&$event, $match)
{
$ml = [];
$mls1 = [];
$n_totals = [];
$n_points = [];
$c_totals = [];
@@ -16,17 +24,17 @@ class Tennis
foreach ($match['odds'] as $name => $value) {
switch ($name) {
case 'T_12_1':
$event['h2w'] = number_format($value, 2);
$ml['h2w'] = number_format($value, 2);
break;
case 'T_12_2':
$event['a2w'] = number_format($value, 2);
$ml['a2w'] = number_format($value, 2);
break;
case 'T_121P_1':
$_spreads['mlset1']['h2w'] = number_format($value, 2);
$mls1['h2w'] = number_format($value, 2);
break;
case 'T_121P_2':
$_spreads['mlset1']['a2w'] = number_format($value, 2);
$mls1['a2w'] = number_format($value, 2);
break;
}
@@ -38,15 +46,13 @@ class Tennis
// NIGERIA
case 'T_OUG':
$n_totals[$name] = $value;
$c_totals[$name] = $value;
break;
case 'T_GH':
$n_points[$name] = $value;
break;
// COLOMBIA
case 'T_OUG':
$c_totals[$name] = $value;
break;
case 'T_HNDGAMES':
$c_points[$name] = $value;
break;
@@ -54,20 +60,81 @@ class Tennis
}
}
$base = [];
$base['event_id'] = $event['id'];
$base['bookmaker_id'] = $event['bookmaker_id'];
$base['sport_id'] = $event['sport_id'];
$base['provider_id'] = Nuh::$options['provider_id'];
$base['bmoid'] = $event['event_id'];
$base['flags'] = 1;
// ML
if (\count($ml) == 2) {
$ml['margin'] = (float) Margin::calculate($ml, 1);
$ml = array_merge($ml, $base);
$res = Odds2way::where('event_id', $event['id'])->where('bookmaker_id', $event['bookmaker_id'])->first();
if (! $res) {
Odds2way::create($ml);
} else {
$res->h2w = number_format($ml['h2w'], 2);
$res->a2w = number_format($ml['a2w'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $ml['margin'];
$res->save();
}
}
if (\count($mls1) == 2) {
$mls1['margin'] = (float) Margin::calculate($mls1, 1);
$mls1 = array_merge($mls1, $base);
$res = Odds2wayS1::where('event_id', $event['id'])->where('bookmaker_id', $event['bookmaker_id'])->first();
if (! $res) {
Odds2wayS1::create($ml);
} else {
$res->h2w = number_format($ml['h2w'], 2);
$res->a2w = number_format($ml['a2w'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = now();
$res->margin = $mls1['margin'];
$res->save();
}
}
$_spreads = [];
// COLUMBIA
if ($c_totals) {
PrinzipalHandicap::filter($_spreads['total'], 'T_OUG@', $c_totals, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total'], 'T_OUG@', $c_totals, ['over', 'under', 'total']);
}
if ($c_points) {
PrinzipalHandicap::filter($_spreads['point'], 'T_HNDGAMES@', $c_points, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point'], 'T_HNDGAMES@', $c_points, ['hth1', 'hth2', 'hcap']);
}
// NIGERIA
if ($n_totals) {
PrinzipalHandicap::filter($_spreads['total'], 'T_OUG@', $n_totals, ['over', 'under', 'total']);
FilterHandicap::filter($_spreads['total'], 'T_OUG@', $n_totals, ['over', 'under', 'total']);
}
if ($n_points) {
PrinzipalHandicap::filter($_spreads['point'], 'T_GH@', $n_points, ['hth1', 'hth2', 'hcap']);
FilterHandicap::filter($_spreads['point'], 'T_GH@', $n_points, ['hth1', 'hth2', 'hcap']);
}
if (isset($_spreads['total'])) {
StoreTotals::store($_spreads['total'], $base);
}
if (isset($_spreads['point'])) {
StorePoints::store($_spreads['point'], $base);
}
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Console\Commands\Grapper\Logifuture\Tools;
class ActiveHandicap
{
public static function set(&$_spreads)
{
$tmp = 10000;
$hcap = false;
foreach ($_spreads as $key => $value) {
$x = 0;
foreach ($value as $k => $v) {
if ($x == 0) {
$x = $v;
} else {
$x -= $v;
}
}
$x = abs($x);
if ($x < $tmp) {
$hcap = $key;
$tmp = $x;
}
}
foreach ($_spreads as $key => $value) {
if ($key == $hcap) {
$_spreads[$key]['active_spread'] = 1;
} else {
$_spreads[$key]['active_spread'] = 0;
}
}
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Console\Commands\Grapper\Logifuture\Tools;
class FilterHandicap
{
public static function filter(&$_spreads, $filter, $data, $oddnames)
{
foreach ($data as $key => $value) {
$key = str_replace($filter, '', $key);
if (strpos($key, '_O') !== false) {
$hcap = str_replace('_O', '', $key);
$_spreads[$hcap]['ele1'] = $value;
} elseif (strpos($key, '_1H') !== false) {
$hcap = str_replace('_1H', '', $key);
$_spreads[$hcap]['ele1'] = $value;
} elseif (strpos($key, '_1') !== false) {
$hcap = str_replace('_1', '', $key);
$_spreads[$hcap]['ele1'] = $value;
} elseif (strpos($key, '_U') !== false) {
$hcap = str_replace('_U', '', $key);
$_spreads[$hcap]['ele2'] = $value;
} elseif (strpos($key, '_2H') !== false) {
$hcap = str_replace('_2H', '', $key);
$_spreads[$hcap]['ele2'] = $value;
} elseif (strpos($key, '_2') !== false) {
$hcap = str_replace('_2', '', $key);
$_spreads[$hcap]['ele2'] = $value;
}
}
}
}
@@ -8,9 +8,25 @@ use App\Utilities\Notice;
class LogifutureData
{
public static $testfiles = '/Console/Commands/TestFiles/';
public static function load($logifuture_sport_id)
{
$debug = Nuh::$options['d'] ?? 0;
$save = Nuh::$options['s'] ?? 0;
$read = Nuh::$options['r'] ?? 0;
$filename = app_path().self::$testfiles.str_replace(' ', '_', strtolower(Nuh::$options['sport'].'_'.Nuh::$options['provider'])).'.json';
if ($read) {
if ($debug) {
Notice::note('data read localy', 'g');
}
$file = file_get_contents($filename);
return json_decode($file, true);
}
$url = Nuh::$options['base_url'].'/v1/matches?sportId='.$logifuture_sport_id;
@@ -59,6 +75,13 @@ class LogifutureData
$file = curl_exec($ch);
if ($save) {
file_put_contents($filename, $file);
Notice::note('file saved localy', 'g');
}
if (curl_errno($ch)) {
echo curl_error($ch);
}
@@ -9,7 +9,6 @@ class MapEvent
{
public static function filter($sport_id, $match)
{
$event = [];
$event['event_id'] = (int) $match['id'];
$event['bookmaker_id'] = Nuh::$options['bookmaker_id'];
@@ -1,58 +0,0 @@
<?php
namespace App\Console\Commands\Grapper\Logifuture\Tools;
class PrinzipalHandicap
{
public static function filter(&$_spreads, $filter, $data, $oddnames)
{
$_tmp = [];
foreach ($data as $key => $value) {
$key = str_replace($filter, '', $key);
if (strpos($key, '_O') !== false) {
$hcap = str_replace('_O', '', $key);
$_tmp[$hcap]['ele1'] = $value;
} elseif (strpos($key, '_1H') !== false) {
$hcap = str_replace('_1H', '', $key);
$_tmp[$hcap]['ele1'] = $value;
} elseif (strpos($key, '_1') !== false) {
$hcap = str_replace('_1', '', $key);
$_tmp[$hcap]['ele1'] = $value;
} elseif (strpos($key, '_U') !== false) {
$hcap = str_replace('_U', '', $key);
$_tmp[$hcap]['ele2'] = $value;
} elseif (strpos($key, '_2H') !== false) {
$hcap = str_replace('_2H', '', $key);
$_tmp[$hcap]['ele2'] = $value;
} elseif (strpos($key, '_2') !== false) {
$hcap = str_replace('_2', '', $key);
$_tmp[$hcap]['ele2'] = $value;
}
}
$tmp = 10000;
$hcap = false;
foreach ($_tmp as $key => $value) {
$x = 0;
foreach ($value as $k => $v) {
if ($x == 0) {
$x = $v;
} else {
$x -= $v;
}
}
$x = abs($x);
if ($x < $tmp) {
$hcap = $key;
$tmp = $x;
}
}
if ($hcap) {
$_spreads[$oddnames[0]] = $_tmp[$hcap]['ele1'];
$_spreads[$oddnames[1]] = $_tmp[$hcap]['ele2'];
$_spreads[$oddnames[2]] = $hcap;
}
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Console\Commands\Grapper\Logifuture\Odds;
use App\Console\Commands\Grapper\Logifuture\Tools\ActiveHandicap;
use App\Models\OddsPoint;
use App\Utilities\Margin;
class StorePoints
{
public static function store(&$_spreads, $base)
{
ActiveHandicap::set($_spreads);
foreach ($_spreads as $handicap => $value) {
// code...
$odds = [];
$odds['home'] = $value['ele1'];
$odds['away'] = $value['ele2'];
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['handicap'] = $handicap;
$odds['difference'] = abs(1 / $odds['home'] - 1 / $odds['away']);
$odds = array_merge($odds, $base);
$res = OddsPoint::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('handicap', $odds['handicap'])
->first();
if (! $res) {
OddsPoint::create($odds);
} else {
$res->home = number_format($odds['home'], 2);
$res->away = number_format($odds['away'], 2);
$res->handicap = number_format($odds['handicap'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Console\Commands\Grapper\Logifuture\Odds;
use App\Console\Commands\Grapper\Logifuture\Tools\ActiveHandicap;
use App\Models\OddsPointQ1;
use App\Utilities\Margin;
class StorePointsQ1
{
public static function store(&$_spreads, $base)
{
ActiveHandicap::set($_spreads);
foreach ($_spreads as $handicap => $value) {
// code...
$odds = [];
$odds['home'] = $value['ele1'];
$odds['away'] = $value['ele2'];
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['handicap'] = $handicap;
$odds['difference'] = abs(1 / $odds['home'] - 1 / $odds['away']);
$odds = array_merge($odds, $base);
$res = OddsPointQ1::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('handicap', $odds['handicap'])
->first();
if (! $res) {
OddsPointQ1::create($odds);
} else {
$res->home = number_format($odds['home'], 2);
$res->away = number_format($odds['away'], 2);
$res->handicap = number_format($odds['handicap'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Console\Commands\Grapper\Logifuture\Odds;
use App\Console\Commands\Grapper\Logifuture\Tools\ActiveHandicap;
use App\Models\OddsTotal;
use App\Utilities\Margin;
class StoreTotals
{
public static function store(&$_spreads, $base)
{
ActiveHandicap::set($_spreads);
foreach ($_spreads as $total => $value) {
// code...
$odds = [];
$odds['over'] = $value['ele1'];
$odds['under'] = $value['ele2'];
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['total'] = $total;
$odds['difference'] = abs(1 / $odds['over'] - 1 / $odds['under']);
$odds = array_merge($odds, $base);
$res = OddsTotal::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('total', $odds['total'])
->first();
if (! $res) {
OddsTotal::create($odds);
} else {
$res->over = number_format($odds['over'], 2);
$res->under = number_format($odds['under'], 2);
$res->total = number_format($odds['total'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Console\Commands\Grapper\Logifuture\Odds;
use App\Console\Commands\Grapper\Logifuture\Tools\ActiveHandicap;
use App\Models\OddsTotalQ1;
use App\Utilities\Margin;
class StoreTotalsQ1
{
public static function store(&$_spreads, $base)
{
ActiveHandicap::set($_spreads);
foreach ($_spreads as $total => $value) {
// code...
$odds = [];
$odds['over'] = $value['ele1'];
$odds['under'] = $value['ele2'];
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['total'] = $total;
$odds['difference'] = abs(1 / $odds['over'] - 1 / $odds['under']);
$odds = array_merge($odds, $base);
$res = OddsTotalQ1::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('total', $odds['total'])
->first();
if (! $res) {
OddsTotalQ1::create($odds);
} else {
$res->over = number_format($odds['over'], 2);
$res->under = number_format($odds['under'], 2);
$res->total = number_format($odds['total'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
+22 -185
View File
@@ -7,19 +7,18 @@ use App\Console\Commands\Grapper\Magloo\Odds\FilterHandicap;
use App\Console\Commands\Grapper\Magloo\Odds\FilterHandicapQ1;
use App\Console\Commands\Grapper\Magloo\Odds\FilterTotals;
use App\Console\Commands\Grapper\Magloo\Odds\FilterTotalsQ1;
use App\Console\Commands\Grapper\Magloo\Odds\Store1x2;
use App\Console\Commands\Grapper\Magloo\Odds\StoreDc;
use App\Console\Commands\Grapper\Magloo\Odds\StoreGgng;
use App\Console\Commands\Grapper\Magloo\Odds\StorePoints;
use App\Console\Commands\Grapper\Magloo\Odds\StorePointsQ1;
use App\Console\Commands\Grapper\Magloo\Odds\StoreTotals;
use App\Console\Commands\Grapper\Magloo\Odds\StoreTotalsQ1;
use App\Console\Commands\Grapper\Magloo\Odds\StoreTq;
use App\Console\Commands\Nuh;
use App\Models\Event;
use App\Models\EventBookmaker;
use App\Models\Odds3way;
use App\Models\OddsDc;
use App\Models\OddsGgng;
use App\Models\OddsPoint;
use App\Models\OddsPointQ1;
use App\Models\OddsTotal;
use App\Models\OddsTotalQ1;
use App\Models\OddsTq;
use App\Models\Sport;
use App\Utilities\Margin;
use App\Utilities\Notice;
use Illuminate\Support\Carbon;
@@ -58,9 +57,11 @@ class Odds
$betradar_id = (int) preg_replace('/\D/', '', $match['p']);
$bmoid = preg_replace('/\D/', '', $match['i']);
$starttime = Carbon::parse($match['dt'])->toDateTimeString();
$event_id = Event::where('betradar_id', $betradar_id)->value('id');
$event_id = Event::where('betradar_id', $betradar_id)->orWhere('magnig_id', $bmoid)->orWhere('magken_id', $bmoid)->value('id');
if ($event_id) {
$base = [];
@@ -79,114 +80,30 @@ class Odds
'bookmaker_id' => Nuh::$options['bookmaker_id'],
], ['starttime' => $starttime, 'in_feed' => 1, 'bmoid' => $base['bmoid']]);
// if ($event_id == 13913478) {
// dd($match['M']);
// }
if ($event_id == 14190947) {
// dd($match['M']);
}
foreach ($match['M'] as $magloo_bettype_id => $value) {
switch ($magloo_bettype_id) {
case 1:
// 1x2
$odds = [];
$odds['h3w'] = number_format($value['static'][1], 2) ?? 1;
$odds['d3w'] = number_format($value['static'][2], 2) ?? 1;
$odds['a3w'] = number_format($value['static'][3], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = Odds3way::where('event_id', $event_id)->where('bookmaker_id', Nuh::$options['bookmaker_id'])->first();
if (! $res) {
Odds3way::create($odds);
} else {
$res->h3w = $odds['h3w'];
$res->a3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
Store1x2::store($value, $base);
break;
case 2:
// to qalify
$odds = [];
$odds['htq'] = number_format($value['static'][4], 2) ?? 1;
$odds['atq'] = number_format($value['static'][5], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsTq::where('event_id', $event_id)->where('bookmaker_id', Nuh::$options['bookmaker_id'])->first();
if (! $res) {
OddsTq::create($odds);
} else {
$res->htq = $odds['htq'];
$res->atq = $odds['atq'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
StoreTq::store($value, $base);
break;
case 10:
// double chance
$odds = [];
$odds['dc1x'] = number_format($value['static'][9], 2) ?? 1;
$odds['dc12'] = number_format($value['static'][10], 2) ?? 1;
$odds['dcx2'] = number_format($value['static'][11], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsDc::where('event_id', $event_id)->where('bookmaker_id', Nuh::$options['bookmaker_id'])->first();
if (! $res) {
OddsDc::create($odds);
} else {
$res->dc1x = $odds['dc1x'];
$res->dc12 = $odds['dc12'];
$res->dcx2 = $odds['dcx2'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
StoreDc::store($value, $base);
break;
case 27:
// ggng
$odds = [];
$odds['gg'] = number_format($value['static'][74], 2) ?? 1;
$odds['ng'] = number_format($value['static'][76], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsGgng::where('event_id', $event_id)->where('bookmaker_id', Nuh::$options['bookmaker_id'])->first();
if (! $res) {
OddsGgng::create($odds);
} else {
$res->gg = $odds['gg'];
$res->ng = $odds['ng'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
StoreGgng::store($value, $base);
break;
case 16:
@@ -194,52 +111,15 @@ class Odds
// points
$odds = FilterHandicap::get($value);
$odds = array_merge($odds, $base);
StorePoints::store($odds, $base);
$res = OddsPoint::where('event_id', $event_id)
->where('bookmaker_id', Nuh::$options['bookmaker_id'])
->where('handicap', $odds['handicap'])
->first();
if (! $res) {
OddsPoint::create($odds);
} else {
$res->home = $odds['home'];
$res->away = $odds['away'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->difference = $odds['difference'];
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
break;
case 2025:
// points qt
$odds = FilterHandicapQ1::get($value);
$odds = array_merge($odds, $base);
$res = OddsPointQ1::where('event_id', $event_id)
->where('bookmaker_id', Nuh::$options['bookmaker_id'])
->where('handicap', $odds['handicap'])
->first();
if (! $res) {
OddsPointQ1::create($odds);
} else {
$res->home = $odds['home'];
$res->away = $odds['away'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->difference = $odds['difference'];
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
StorePointsQ1::store($odds, $base);
break;
@@ -247,60 +127,17 @@ class Odds
case 2002:
// totals
$odds = FilterTotals::get($value, $sport_id);
$odds = array_merge($odds, $base);
if ($base['sport_id'] == 1) {
$odds['active_spread'] = 1;
}
$res = OddsTotal::where('event_id', $event_id)
->where('bookmaker_id', Nuh::$options['bookmaker_id'])
->where('total', $odds['total'])
->first();
if (! $res) {
OddsTotal::create($odds);
} else {
$res->over = $odds['over'];
$res->under = $odds['under'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->difference = $odds['difference'];
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
StoreTotals::store($odds, $base);
break;
case 2012:
// totals qt
$odds = FilterTotalsQ1::get($value, $sport_id);
$odds = array_merge($odds, $base);
if ($base['sport_id'] == 1) {
$odds['active_spread'] = 1;
}
StoreTotalsQ1::store($odds, $base);
$res = OddsTotalQ1::where('event_id', $event_id)
->where('bookmaker_id', Nuh::$options['bookmaker_id'])
->where('total', $odds['total'])
->first();
if (! $res) {
OddsTotalQ1::create($odds);
} else {
$res->over = $odds['over'];
$res->under = $odds['under'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->difference = $odds['difference'];
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
break;
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
class ActiveHandicap
{
public static function set(&$_spreads)
{
$tmp = 10000;
$hcap = false;
foreach ($_spreads as $key => $value) {
$x = 0;
foreach ($value as $k => $v) {
if ($x == 0) {
$x = $v;
} else {
$x -= $v;
}
}
$x = abs($x);
if ($x < $tmp) {
$hcap = $key;
$tmp = $x;
}
}
foreach ($_spreads as $key => $value) {
if ($key == $hcap) {
$_spreads[$key]['active_spread'] = 1;
} else {
$_spreads[$key]['active_spread'] = 0;
}
}
}
}
@@ -2,14 +2,17 @@
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Utilities\Margin;
use App\Console\Commands\Grapper\Logifuture\Tools\ActiveHandicap;
class FilterHandicap
{
public static function get($_array)
public static function get($_spreads)
{
ActiveHandicap::set($_spreads);
$_points = [];
foreach ($_array as $handicap => $value) {
foreach ($_spreads as $handicap => $value) {
if (fmod(abs($handicap), 1) == 0.5) {
if ($value[1714] > 1 and $value[1715] > 1) {
$_points[$handicap]['home'] = number_format($value[1714], 2);
@@ -18,32 +21,6 @@ class FilterHandicap
}
}
$tmp = 10000;
$handicap = false;
foreach ($_points as $key => $value) {
$x = 0;
foreach ($value as $k => $v) {
if ($x == 0) {
$x = $v;
} else {
$x -= $v;
}
}
$x = abs($x);
if ($x < $tmp) {
$handicap = $key;
$tmp = $x;
}
}
$return = [];
if ($handicap) {
$return['home'] = $_points[$handicap]['home'];
$return['away'] = $_points[$handicap]['away'];
$return['difference'] = abs(1 / $return['home'] - 1 / $return['away']);
$return['margin'] = (float) Margin::calculate($return, 1);
$return['handicap'] = $handicap;
}
return $return;
return $_points;
}
}
@@ -2,50 +2,25 @@
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Utilities\Margin;
class FilterHandicapQ1
{
public static function get($_array)
{
$_points = [];
foreach ($_array as $handicap => $value) {
$t = explode('_', $handicap);
$handicap = $t[1];
if (fmod(abs($handicap), 1) == 0.5) {
if ($value[1714] > 1 and $value[1715] > 1) {
$_points[$handicap]['home'] = number_format($value[1714], 2);
$_points[$handicap]['away'] = number_format($value[1715], 2);
foreach ($_array as $key => $value) {
$t = explode('_', $key);
$matchpart = $t[0];
$handicap = (float) $t[1];
if ($matchpart == 1) {
if (fmod(abs($handicap), 1) == 0.5) {
if ($value[1714] > 1 and $value[1715] > 1) {
$_points[$handicap]['home'] = number_format($value[1714], 2);
$_points[$handicap]['away'] = number_format($value[1715], 2);
}
}
}
}
$tmp = 10000;
$handicap = false;
foreach ($_points as $key => $value) {
$x = 0;
foreach ($value as $k => $v) {
if ($x == 0) {
$x = $v;
} else {
$x -= $v;
}
}
$x = abs($x);
if ($x < $tmp) {
$handicap = $key;
$tmp = $x;
}
}
$return = [];
if ($handicap) {
$return['home'] = $_points[$handicap]['home'];
$return['away'] = $_points[$handicap]['away'];
$return['difference'] = abs(1 / $return['home'] - 1 / $return['away']);
$return['margin'] = (float) Margin::calculate($return, 1);
$return['handicap'] = $handicap;
}
return $return;
return $_points;
}
}
@@ -2,8 +2,6 @@
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Utilities\Margin;
class FilterTotals
{
public static function get($_array, $sport_id)
@@ -17,36 +15,7 @@ class FilterTotals
}
}
}
if ($sport_id == 1) {
$spread = '2.5';
} else {
$tmp = 10000;
$spread = false;
foreach ($_totals as $key => $value) {
$x = 0;
foreach ($value as $v) {
if ($x == 0) {
$x = $v;
} else {
$x -= $v;
}
}
$x = abs($x);
if ($x < $tmp) {
$spread = $key;
$tmp = $x;
}
}
}
$return = [];
if (isset($_totals[$spread])) {
$return['over'] = $_totals[$spread]['over'];
$return['under'] = $_totals[$spread]['under'];
$return['difference'] = abs(1 / $return['over'] - 1 / $return['under']);
$return['margin'] = (float) Margin::calculate($return, 1);
$return['total'] = $spread;
}
return $return;
return $_totals;
}
}
@@ -2,53 +2,25 @@
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Utilities\Margin;
class FilterTotalsQ1
{
public static function get($_array, $sport_id)
{
$_totals = [];
foreach ($_array as $total => $value) {
if (fmod(abs($total), 1) == 0.5) {
$t = explode('_', $total);
$total = $t[1];
if ($value[12] > 1 and $value[13] > 1) {
$_totals[$total]['over'] = number_format($value[12], 2);
$_totals[$total]['under'] = number_format($value[13], 2);
}
}
}
if ($sport_id == 1) {
$spread = '2.5';
} else {
$tmp = 10000;
$spread = false;
foreach ($_totals as $key => $value) {
$x = 0;
foreach ($value as $k => $v) {
if ($x == 0) {
$x = $v;
} else {
$x -= $v;
foreach ($_array as $key => $value) {
$t = explode('_', $key);
$matchpart = $t[0];
$total = (float) $t[1];
if ($matchpart == 1) {
if (fmod(abs($total), 1) == 0.5) {
if ($value[12] > 1 and $value[13] > 1) {
$_totals[$total]['over'] = number_format($value[12], 2);
$_totals[$total]['under'] = number_format($value[13], 2);
}
}
$x = abs($x);
if ($x < $tmp) {
$spread = $key;
$tmp = $x;
}
}
}
$return = [];
if (isset($_totals[$spread])) {
$return['over'] = $_totals[$spread]['over'];
$return['under'] = $_totals[$spread]['under'];
$return['difference'] = abs(1 / $return['over'] - 1 / $return['under']);
$return['margin'] = (float) Margin::calculate($return, 1);
$return['total'] = $spread;
}
return $return;
return $_totals;
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\Odds3way;
use App\Utilities\Margin;
class Store1x2
{
public static function store($value, $base)
{
$odds = [];
$odds['h3w'] = number_format($value['static'][1], 2) ?? 1;
$odds['d3w'] = number_format($value['static'][2], 2) ?? 1;
$odds['a3w'] = number_format($value['static'][3], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = Odds3way::where('event_id', $base['event_id'])->where('bookmaker_id', $base['bookmaker_id'])->first();
if (! $res) {
Odds3way::create($odds);
} else {
$res->h3w = $odds['h3w'];
$res->a3w = $odds['d3w'];
$res->d3w = $odds['a3w'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\OddsDc;
use App\Utilities\Margin;
class StoreDc
{
public static function store($value, $base)
{
$odds = [];
$odds['dc1x'] = number_format($value['static'][9], 2) ?? 1;
$odds['dc12'] = number_format($value['static'][10], 2) ?? 1;
$odds['dcx2'] = number_format($value['static'][11], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsDc::where('event_id', $base['event_id'])->where('bookmaker_id', $base['bookmaker_id'])->first();
if (! $res) {
OddsDc::create($odds);
} else {
$res->dc1x = $odds['dc1x'];
$res->dc12 = $odds['dc12'];
$res->dcx2 = $odds['dcx2'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\OddsGgng;
use App\Utilities\Margin;
class StoreGgng
{
public static function store($value, $base)
{
$odds = [];
$odds['gg'] = number_format($value['static'][74], 2) ?? 1;
$odds['ng'] = number_format($value['static'][76], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsGgng::where('event_id', $base['event_id'])->where('bookmaker_id', $base['bookmaker_id'])->first();
if (! $res) {
OddsGgng::create($odds);
} else {
$res->gg = $odds['gg'];
$res->ng = $odds['ng'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\OddsPoint;
use App\Utilities\Margin;
class StorePoints
{
public static function store($data, $base)
{
ActiveHandicap::set($data);
foreach ($data as $handicap => $value) {
$odds = $value;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['handicap'] = $handicap;
$odds['difference'] = abs(1 / $odds['home'] - 1 / $odds['away']);
$odds = array_merge($odds, $base);
$res = OddsPoint::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('handicap', $odds['handicap'])
->first();
if (! $res) {
OddsPoint::create($odds);
} else {
$res->home = number_format($odds['home'], 2);
$res->away = number_format($odds['away'], 2);
$res->handicap = number_format($odds['handicap'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\OddsPointQ1;
use App\Utilities\Margin;
class StorePointsQ1
{
public static function store($data, $base)
{
ActiveHandicap::set($data);
foreach ($data as $handicap => $value) {
$odds = $value;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['handicap'] = $handicap;
$odds['difference'] = abs(1 / $odds['home'] - 1 / $odds['away']);
$odds = array_merge($odds, $base);
$res = OddsPointQ1::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('handicap', $odds['handicap'])
->first();
if (! $res) {
OddsPointQ1::create($odds);
} else {
$res->home = number_format($odds['home'], 2);
$res->away = number_format($odds['away'], 2);
$res->handicap = number_format($odds['handicap'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\OddsTotal;
use App\Utilities\Margin;
class StoreTotals
{
public static function store($data, $base)
{
ActiveHandicap::set($data);
foreach ($data as $total => $value) {
$odds = $value;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['total'] = $total;
$odds['difference'] = abs(1 / $odds['over'] - 1 / $odds['under']);
$odds = array_merge($odds, $base);
$res = OddsTotal::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('total', $odds['total'])
->first();
if (! $res) {
OddsTotal::create($odds);
} else {
$res->over = number_format($odds['over'], 2);
$res->under = number_format($odds['under'], 2);
$res->total = number_format($odds['total'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\OddsTotalQ1;
use App\Utilities\Margin;
class StoreTotalsQ1
{
public static function store($data, $base)
{
ActiveHandicap::set($data);
foreach ($data as $total => $value) {
$odds = $value;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds['active_spread'] = $value['active_spread'];
$odds['total'] = $total;
$odds['difference'] = abs(1 / $odds['over'] - 1 / $odds['under']);
$odds = array_merge($odds, $base);
$res = OddsTotalQ1::where('event_id', $base['event_id'])
->where('bookmaker_id', $base['bookmaker_id'])
->where('total', $odds['total'])
->first();
if (! $res) {
OddsTotalQ1::create($odds);
} else {
$res->over = number_format($odds['over'], 2);
$res->under = number_format($odds['under'], 2);
$res->total = number_format($odds['total'], 2);
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->active_spread = $odds['active_spread'];
$res->difference = $odds['difference'];
$res->checked_at = now();
$res->margin = $odds['margin'];
$res->save();
}
}
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Console\Commands\Grapper\Magloo\Odds;
use App\Models\OddsTq;
use App\Utilities\Margin;
class StoreTq
{
public static function store($value, $base)
{
$odds = [];
$odds['htq'] = number_format($value['static'][4], 2) ?? 1;
$odds['atq'] = number_format($value['static'][5], 2) ?? 1;
$odds['margin'] = (float) Margin::calculate($odds, 1);
$odds = array_merge($odds, $base);
$res = OddsTq::where('event_id', $base['event_id'])->where('bookmaker_id', $base['bookmaker_id'])->first();
if (! $res) {
OddsTq::create($odds);
} else {
$res->htq = $odds['htq'];
$res->atq = $odds['atq'];
if ($res->isDirty()) {
$res->oddchange_at = now();
}
$res->checked_at = $odds['checked_at'];
$res->margin = $odds['margin'];
$res->save();
}
}
}
+18 -8
View File
@@ -50,13 +50,20 @@ class Odds
Notice::note("Deleted: $info");
}
$txodds_markets_columns = [
1 => 'soccer',
2 => 'ice_hockey',
3 => 'basketball',
5 => 'tennis',
];
$res = TxoddsMarket::where($txodds_markets_columns[Nuh::$options['sport_id']], 1)->pluck('market_id', 'id')->toArray();
switch (Nuh::$options['sport_id']) {
case 1:
$res = TxoddsMarket::where('soccer', 1)->pluck('market_id', 'id')->toArray();
break;
case 2:
$res = TxoddsMarket::where('ice_hockey', 1)->pluck('market_id', 'id')->toArray();
break;
case 3:
$res = TxoddsMarket::where('basketball', 1)->pluck('market_id', 'id')->toArray();
break;
case 5:
$res = TxoddsMarket::where('tennis', 1)->pluck('market_id', 'id')->toArray();
break;
}
/*************************************************
* use_lastcall
@@ -65,6 +72,7 @@ class Odds
/*************************************************
* URL
* https://xml2.txodds.com/feed/odds/xml.php?36152-aeTRNnZxSPUwGe&all_odds=2&peid=14190947
*************************************************/
if (Nuh::$options['sport_id'] == 1) {
$url = 'https://xml2.txodds.com/feed/odds/xml.php?'.config('env.txodds_betaid1').'&all_odds=2';
@@ -256,6 +264,8 @@ class Odds
foreach ($row->bookmaker as $book) {
ActiveSpread::start();
$bookmaker_id = (int) $book['bid'];
$odds = [];
@@ -372,8 +382,8 @@ class Odds
break;
}
}
ActiveSpread::set($event_id, $bookmaker_id);
}
ActiveSpread::set();
}
}
@@ -8,54 +8,49 @@ class ActiveSpread
{
public static $collector = [];
public static $event_id = 0;
public static $provider_id = 0;
public static function collect($odds, $bettype)
public static function start()
{
if ($odds['event_id'] != self::$event_id) {
self::$event_id = $odds['event_id'];
self::$provider_id = $odds['provider_id'];
self::$collector = [];
}
if (! isset(self::$collector[$bettype][$odds['bookmaker_id']]['difference'])) {
self::$collector[$bettype][$odds['bookmaker_id']]['difference'] = $odds['difference'];
self::$collector = [];
}
public static function collect($odds, $table)
{
if (! isset(self::$collector[$table]['difference'])) {
self::$collector[$table]['difference'] = $odds['difference'];
if (isset($odds['handicap'])) {
self::$collector[$bettype][$odds['bookmaker_id']]['active_spread'] = $odds['handicap'];
self::$collector[$table]['active_spread'] = $odds['handicap'];
} else {
self::$collector[$bettype][$odds['bookmaker_id']]['active_spread'] = $odds['total'];
self::$collector[$table]['active_spread'] = $odds['total'];
}
} elseif ($odds['difference'] < self::$collector[$bettype][$odds['bookmaker_id']]['difference']) {
self::$collector[$bettype][$odds['bookmaker_id']]['difference'] = $odds['difference'];
} elseif ($odds['difference'] < self::$collector[$table]['difference']) {
self::$collector[$table]['difference'] = $odds['difference'];
if (isset($odds['handicap'])) {
self::$collector[$bettype][$odds['bookmaker_id']]['active_spread'] = $odds['handicap'];
self::$collector[$table]['active_spread'] = $odds['handicap'];
} else {
self::$collector[$bettype][$odds['bookmaker_id']]['active_spread'] = $odds['total'];
self::$collector[$table]['active_spread'] = $odds['total'];
}
}
}
public static function set()
public static function set($event_id, $bookmaker_id)
{
foreach (self::$collector as $table => $value) {
DB::table($table)->where('event_id', self::$event_id)->where('provider_id', self::$provider_id)->update(['active_spread' => 0]);
}
foreach (self::$collector as $table => $bookmaker) {
foreach ($bookmaker as $bookmaker_id => $values) {
if (in_array($table, ['odds_points', 'odds_points_ht', 'odds_points_q1'])) {
DB::table($table)
->where('event_id', self::$event_id)
->where('bookmaker_id', $bookmaker_id)
->where('handicap', $values['active_spread'])
->update(['active_spread' => 1]);
} else {
DB::table($table)
->where('event_id', self::$event_id)
->where('bookmaker_id', $bookmaker_id)
->where('total', $values['active_spread'])
->update(['active_spread' => 1]);
}
DB::table($table)->where('event_id', $event_id)->where('bookmaker_id', $bookmaker_id)->update(['active_spread' => 0]);
if (in_array($table, ['odds_points', 'odds_points_ht', 'odds_points_q1'])) {
DB::table($table)
->where('event_id', $event_id)
->where('bookmaker_id', $bookmaker_id)
->where('handicap', (float) $value['active_spread'])
->update(['active_spread' => 1]);
} else {
DB::table($table)
->where('event_id', $event_id)
->where('bookmaker_id', $bookmaker_id)
->where('total', (float) $value['active_spread'])
->update(['active_spread' => 1]);
}
}
}
@@ -42,6 +42,6 @@ class _PointsQ1
$res->save();
}
ActiveSpread::collect($odds, 'odds_points_q1');
ActiveSpread::collect($odds, 'odds_totals_q1');
}
}
@@ -0,0 +1 @@
[{"id":715459516,"sportId":2,"provider":1,"externalId":"67795176","sportCategory":"Bulgaria","sportCategoryId":43478,"tournamentName":"NBL","tournamentId":4212661,"description":"BC Levski - Balkan Botevgrad","startDate":"2026-01-19T17:30:00Z","endVisibilityDate":"2026-01-19T17:30:00Z","odds":{"B_OUN@167.5_O":"1.89","B_OUN@167.5_U":"1.75","B_H@21.5_2":"1.76","B_H@21.5_1":"1.88","B_H@23.5_1":"1.69","B_OUN@166.5_O":"1.8","B_OUN@166.5_U":"1.83","B_H@22.5_1":"1.78","B_H@22.5_2":"1.86","B_OUN@165.5_O":"1.72","B_H@23.5_2":"1.97","B_OUN@165.5_U":"1.92"}},{"id":714707768,"sportId":2,"provider":1,"externalId":"66972532","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"Neptunas Klaipeda 2 - BC Zalgiris Kaunas II","startDate":"2026-01-20T16:00:00Z","endVisibilityDate":"2026-01-20T16:00:00Z","odds":{"B_H@-3.5_1":"2","B_H@-3.5_2":"1.65","B_OUN@159.5_U":"1.78","B_OUN@159.5_O":"1.86","B_OUN@158.5_U":"1.86","B_H@-2.5_1":"1.89","B_H@-2.5_2":"1.75","B_OUN@158.5_O":"1.78","B_OUN@157.5_U":"1.94","B_OUN@157.5_O":"1.71","B_H@-1.5_1":"1.77","B_H@-1.5_2":"1.87"}},{"id":715854202,"sportId":2,"provider":1,"externalId":"63707601","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"Vilnius Rytas-2 - Mazeikiai M Basket","startDate":"2026-01-22T17:00:00Z","endVisibilityDate":"2026-01-22T17:00:00Z","odds":{"B_OUN@164.5_O":"1.74","B_OUN@164.5_U":"1.9","B_H@-3.5_1":"2","B_H@-3.5_2":"1.66","B_OUN@166.5_O":"1.9","B_H@-2.5_1":"1.88","B_H@-2.5_2":"1.76","B_OUN@166.5_U":"1.74","B_OUN@165.5_O":"1.82","B_H@-1.5_1":"1.76","B_H@-1.5_2":"1.88","B_OUN@165.5_U":"1.82"}},{"id":715854127,"sportId":2,"provider":1,"externalId":"63707599","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"Ukmerges Stekas - BC Telsiai","startDate":"2026-01-22T17:00:00Z","endVisibilityDate":"2026-01-22T17:00:00Z","odds":{"B_OUN@168.5_O":"1.92","B_OUN@168.5_U":"1.72","B_OUN@167.5_O":"1.84","B_OUN@167.5_U":"1.8","B_H@9.5_1":"1.81","B_H@9.5_2":"1.83","B_H@10.5_2":"1.98","B_H@10.5_1":"1.68","B_OUN@166.5_O":"1.76","B_H@8.5_2":"1.71","B_H@8.5_1":"1.94","B_OUN@166.5_U":"1.88"}},{"id":715830782,"sportId":2,"provider":1,"externalId":"63707589","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"KK Vilkaviskio Perlas - Omega Tauras LSU","startDate":"2026-01-22T16:00:00Z","endVisibilityDate":"2026-01-22T16:00:00Z","odds":{"B_H@-9.5_1":"2","B_H@-9.5_2":"1.66","B_H@-8.5_1":"1.86","B_OUN@167.5_O":"1.91","B_H@-8.5_2":"1.78","B_OUN@167.5_U":"1.74","B_H@-7.5_1":"1.71","B_OUN@166.5_O":"1.83","B_H@-7.5_2":"1.94","B_OUN@166.5_U":"1.81","B_OUN@165.5_O":"1.75","B_OUN@165.5_U":"1.9"}},{"id":715831038,"sportId":2,"provider":1,"externalId":"63707591","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"Alytaus Alytus - Kedainiu Sporto Centras","startDate":"2026-01-22T16:00:00Z","endVisibilityDate":"2026-01-22T16:00:00Z","odds":{"B_OUN@169.5_U":"1.83","B_H@6.5_2":"2","B_H@6.5_1":"1.66","B_OUN@168.5_O":"1.73","B_OUN@169.5_O":"1.8","B_OUN@168.5_U":"1.92","B_H@5.5_2":"1.86","B_H@5.5_1":"1.78","B_H@4.5_2":"1.72","B_H@4.5_1":"1.92","B_OUN@170.5_U":"1.76","B_OUN@170.5_O":"1.88"}},{"id":715831037,"sportId":2,"provider":1,"externalId":"63707587","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"BC Silute - Suduva Mantinga Marijampole","startDate":"2026-01-22T16:00:00Z","endVisibilityDate":"2026-01-22T16:00:00Z","odds":{"B_OUN@169.5_U":"1.79","B_H@12.5_1":"1.82","B_OUN@168.5_O":"1.76","B_OUN@169.5_O":"1.84","B_H@13.5_2":"1.94","B_H@13.5_1":"1.71","B_OUN@168.5_U":"1.88","B_H@12.5_2":"1.81","B_OUN@170.5_U":"1.72","B_H@11.5_2":"1.71","B_H@11.5_1":"1.94","B_OUN@170.5_O":"1.93"}},{"id":715854145,"sportId":2,"provider":1,"externalId":"63707595","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"BC Jurbarkas-Karys - Sakiu Vytis-VDU","startDate":"2026-01-22T17:00:00Z","endVisibilityDate":"2026-01-22T17:00:00Z","odds":{"B_OUN@162.5_O":"1.76","B_OUN@164.5_O":"1.93","B_OUN@162.5_U":"1.88","B_OUN@163.5_O":"1.84","B_OUN@163.5_U":"1.8","B_OUN@164.5_U":"1.72"}},{"id":715853910,"sportId":2,"provider":1,"externalId":"63707597","sportCategory":"Lithuania","sportCategoryId":43456,"tournamentName":"NKL","tournamentId":4212484,"description":"Plunges Olimpas - Kretingos Kretinga","startDate":"2026-01-22T17:00:00Z","endVisibilityDate":"2026-01-22T17:00:00Z","odds":{"B_OUN@169.5_U":"1.77","B_OUN@168.5_O":"1.79","B_OUN@167.5_O":"1.71","B_OUN@169.5_O":"1.87","B_OUN@167.5_U":"1.94","B_OUN@168.5_U":"1.85"}},{"id":715376899,"sportId":2,"provider":1,"externalId":"63983981","sportCategory":"Greece","sportCategoryId":43457,"tournamentName":"Basket League","tournamentId":4212529,"description":"Peristeri Athens - AS KLine truncated
@@ -0,0 +1 @@
[{"id":715462033,"sportId":4,"provider":1,"externalId":"61589318","sportCategory":"Germany","sportCategoryId":44089,"tournamentName":"DEL 2","tournamentId":4725989,"description":"EC Kassel Huskies - Lausitzer Fuchse","startDate":"2026-01-20T18:30:00Z","endVisibilityDate":"2026-01-20T18:30:00Z","odds":{"IH_TF@6.5_O":"2","IH_12_2":"3.4","IH_HR1@-0.5_1":"1.45","IH_12_1":"1.28","IH_HR1@-0.5_2":"2.5","IH_HR1@-1.5_2":"1.94","IH_HR1@-1.5_1":"1.77","IH_1X2_X":"4.6","IH_TF@7.5_U":"1.3","IH_TF@7.5_O":"3.2","IH_TF@5.5_O":"1.64","IH_1X2_2":"4.95","IH_1X2_1":"1.45","IH_TF@5.5_U":"2.15","IH_HR1@-2.5_2":"1.5","IH_TF@6.5_U":"1.71","IH_HR1@-2.5_1":"2.4"}},{"id":715461725,"sportId":4,"provider":1,"externalId":"61589322","sportCategory":"Germany","sportCategoryId":44089,"tournamentName":"DEL 2","tournamentId":4725989,"description":"Eispiraten Crimmitschau - Ravensburg Towerstars","startDate":"2026-01-20T18:30:00Z","endVisibilityDate":"2026-01-20T18:30:00Z","odds":{"IH_TF@6.5_O":"2.55","IH_TF@4.5_U":"2.85","IH_12_2":"1.83","IH_HR1@-0.5_1":"2.4","IH_12_1":"1.88","IH_HR1@-0.5_2":"1.5","IH_1X2_X":"3.7","IH_HR1@0.5_1":"1.53","IH_HR1@0.5_2":"2.3","IH_TF@5.5_O":"2.05","IH_1X2_2":"2.3","IH_1X2_1":"2.4","IH_TF@5.5_U":"1.7","IH_HR1@1.5_2":"3.3","IH_TF@6.5_U":"1.45","IH_HR1@1.5_1":"1.29","IH_TF@4.5_O":"1.37"}},{"id":715461660,"sportId":4,"provider":1,"externalId":"61589320","sportCategory":"Germany","sportCategoryId":44089,"tournamentName":"DEL 2","tournamentId":4725989,"description":"EC Bad Nauheim - Starbulls Rosenheim","startDate":"2026-01-20T18:30:00Z","endVisibilityDate":"2026-01-20T18:30:00Z","odds":{"IH_TF@6.5_O":"2.75","IH_TF@4.5_U":"2.65","IH_12_2":"1.7","IH_HR1@-0.5_1":"2.65","IH_12_1":"2.05","IH_HR1@-0.5_2":"1.41","IH_1X2_X":"3.7","IH_HR1@0.5_1":"1.62","IH_HR1@0.5_2":"2.1","IH_TF@5.5_O":"2.15","IH_1X2_2":"2.1","IH_1X2_1":"2.65","IH_TF@5.5_U":"1.62","IH_HR1@1.5_2":"3","IH_TF@6.5_U":"1.39","IH_HR1@1.5_1":"1.34","IH_TF@4.5_O":"1.42"}},{"id":715461663,"sportId":4,"provider":1,"externalId":"61589324","sportCategory":"Germany","sportCategoryId":44089,"tournamentName":"DEL 2","tournamentId":4725989,"description":"EHC Freiburg - Eisbaren Regensburg","startDate":"2026-01-20T18:30:00Z","endVisibilityDate":"2026-01-20T18:30:00Z","odds":{"IH_TF@6.5_O":"2.65","IH_TF@4.5_U":"2.75","IH_12_2":"1.68","IH_HR1@-0.5_1":"2.7","IH_12_1":"2.05","IH_HR1@-0.5_2":"1.41","IH_1X2_X":"3.75","IH_HR1@0.5_1":"1.64","IH_HR1@0.5_2":"2.1","IH_TF@5.5_O":"2.1","IH_1X2_2":"2.1","IH_1X2_1":"2.7","IH_TF@5.5_U":"1.66","IH_HR1@1.5_2":"2.9","IH_TF@6.5_U":"1.42","IH_HR1@1.5_1":"1.36","IH_TF@4.5_O":"1.39"}},{"id":715462078,"sportId":4,"provider":1,"externalId":"61589316","sportCategory":"Germany","sportCategoryId":44089,"tournamentName":"DEL 2","tournamentId":4725989,"description":"Krefeld Pinguine - ESV Kaufbeuren","startDate":"2026-01-20T18:30:00Z","endVisibilityDate":"2026-01-20T18:30:00Z","odds":{"IH_TF@6.5_O":"2.2","IH_TF@4.5_U":"3.35","IH_12_2":"6.25","IH_HR1@-3.5_2":"1.51","IH_HR1@-3.5_1":"2.4","IH_12_1":"1.09","IH_HR1@-1.5_2":"3.15","IH_HR1@-1.5_1":"1.32","IH_1X2_X":"6.55","IH_TF@5.5_O":"1.71","IH_1X2_2":"11.1","IH_1X2_1":"1.16","IH_TF@5.5_U":"2","IH_HR1@-2.5_2":"2.15","IH_TF@6.5_U":"1.59","IH_HR1@-2.5_1":"1.6","IH_TF@4.5_O":"1.28"}},{"id":715708404,"sportId":4,"provider":1,"externalId":"61589314","sportCategory":"Germany","sportCategoryId":44089,"tournamentName":"DEL 2","tournamentId":4725989,"description":"EV Landshut - Bietigheim Steelers","startDate":"2026-01-20T18:30:00Z","endVisibilityDate":"2026-01-20T18:30:00Z","odds":{"IH_TF@6.5_O":"2.1","IH_TF@4.5_U":"3.55","IH_12_2":"2.25","IH_HR1@-0.5_1":"1.9","IH_12_1":"1.58","IH_HR1@-0.5_2":"1.78","IH_HR1@-1.5_2":"1.44","IH_HR1@-1.5_1":"2.6","IH_1X2_X":"4.15","IH_HR1@0.5_1":"1.36","IH_HR1@0.5_2":"2.85","IH_TF@5.5_O":"1.73","IH_1X2_2":"2.85","IH_1X2_1":"1.9","IH_TF@5.5_U":"2","IH_TF@6.5_U":"1.65","IH_TF@4.5_O":"1.25"}},{"id":715461803,"sportId":4,"provider":1,"externalId":"61589312","sportCategory":"Germany","sportCategoryId":44089,"tournamentName":"DEL 2","tournamentId":4725989,"description":"Dusseldorfer EG - EV Blue Devils Weiden","startDate":"2026-01-20T18:30:00Z","endVisibilityDate":"2026-01-20T18:30:00Z","odds":{"IH_TF@6.5_O":"2.15","IH_TF@4.5_U":"3.5","IH_12_2":"2.75","IH_HR1@-0.5_1":"1.65","IH_12_1":"1.4","IH_HR1@-0.5_2":"2.05","IH_HR1@-1.5_2":"1.66","IH_HR1@-1.5_1":"2.1","IH_1X2_X":"4.15","IH_TF@5.5_O":"1.73","IH_1X2_2":"3.8","IH_1X2_1":"1.65","IH_TF@5.5_U":"2","IH_HR1@-2.5_2":"1.34","IH_TF@6.5_U":"1.64","IH_HR1@-2.5_1":"3","IH_TF@4.5_O":"1.26"}},{"id":714969582,"sportId":4,"provider":1,"externalId":"66635674","sportCategory":"Poland","sportCategoryId":44099,"tournamentName":"Polska Hokej Liga","tournamentId":4717164,"description":"Gorniczy Klub Sportowy Tychy - TMH Polonia Bytom","startDate":"2026-01-20T17:00:00Z","endVisibilityDate":"2026-01-20T17:00:00Z","odds":{"IH_12_2":"3.65","IH_HR1@-0.5_1":"1.36","IH_12_1":"1.21","IH_HR1@-0.5_2":"2.65","IH_HR1@-1.5_2":"2.05","IH_HR1@-1.5_1":"1.65","IH_1X2_X":"4.65"Line truncated
@@ -0,0 +1 @@
[{"id":11496442,"sportId":1,"provider":1,"externalId":"sr:match:64055587","sportCategory":"Saudi Arabia","sportCategoryId":363,"tournamentName":"Saudi Professional League","tournamentId":101203,"description":"|AL Akhdood||v||AL Riyadh|","startDate":"2026-01-21T15:30:00Z","endVisibilityDate":"2026-01-21T15:30:00Z","odds":{"S_GGNG_N":"1.86","S_GGNG_Y":"1.86","S_OU@5.5_O":"14.5","S_OU@4.5_O":"7.7","S_OU@4.5_U":"1.05","S_OU@3.5_U":"1.22","S_OU@3.5_O":"3.95","S_DC_12":"1.27","S_OU@2.5_U":"1.65","S_OU@2.5_O":"2.14","S_OU@1.5_U":"2.99","S_DNB_1":"1.78","S_DNB_2":"1.93","S_DC_X2":"1.44","S_OU@1.5_O":"1.35","S_1X2_1":"2.5","S_1X2_2":"2.7","S_1X2_X":"3.25","S_DC_1X":"1.38","S_OU@0.5_O":"1.04","S_OU@0.5_U":"8.7"}},{"id":11496443,"sportId":1,"provider":1,"externalId":"sr:match:64055581","sportCategory":"Saudi Arabia","sportCategoryId":363,"tournamentName":"Saudi Professional League","tournamentId":101203,"description":"|AL Ettifaq FC||v||Neom SC|","startDate":"2026-01-21T17:30:00Z","endVisibilityDate":"2026-01-21T17:30:00Z","odds":{"S_GGNG_N":"2.18","S_GGNG_Y":"1.62","S_OU@5.5_O":"10.25","S_OU@5.5_U":"1.01","S_OU@4.5_O":"5.4","S_OU@4.5_U":"1.12","S_OU@3.5_U":"1.36","S_OU@3.5_O":"2.96","S_DC_12":"1.24","S_OU@2.5_U":"1.96","S_OU@2.5_O":"1.77","S_OU@1.5_U":"3.85","S_DNB_1":"1.9","S_DNB_2":"1.8","S_DC_X2":"1.41","S_OU@1.5_O":"1.23","S_1X2_1":"2.6","S_1X2_2":"2.46","S_1X2_X":"3.45","S_DC_1X":"1.45","S_OU@0.5_O":"1.01","S_OU@0.5_U":"11.5"}},{"id":11496459,"sportId":1,"provider":1,"externalId":"sr:match:64055585","sportCategory":"Saudi Arabia","sportCategoryId":363,"tournamentName":"Saudi Professional League","tournamentId":101203,"description":"|Al Hilal Rijad||v||AL Fayha FC|","startDate":"2026-01-22T17:30:00Z","endVisibilityDate":"2026-01-22T17:30:00Z","odds":{"S_OU@6.5_O":"10.25","S_GGNG_N":"1.8","S_GGNG_Y":"1.93","S_OU@5.5_O":"5.6","S_OU@5.5_U":"1.09","S_OU@4.5_O":"3.2","S_OU@4.5_U":"1.3","S_OU@3.5_U":"1.74","S_OU@3.5_O":"2.0","S_DC_12":"1.06","S_OU@2.5_U":"2.84","S_OU@2.5_O":"1.38","S_OU@1.5_U":"6.2","S_DNB_1":"1.03","S_DNB_2":"9.5","S_DC_X2":"3.95","S_OU@1.5_O":"1.09","S_1X2_1":"1.19","S_1X2_2":"11.25","S_1X2_X":"6.5","S_OU@0.5_U":"19.0"}},{"id":11496464,"sportId":1,"provider":1,"externalId":"sr:match:64055593","sportCategory":"Saudi Arabia","sportCategoryId":363,"tournamentName":"Saudi Professional League","tournamentId":101203,"description":"|AL Taawoun FC||v||AL Hazem FC|","startDate":"2026-01-22T15:15:00Z","endVisibilityDate":"2026-01-22T15:15:00Z","odds":{"S_GGNG_N":"1.92","S_GGNG_Y":"1.81","S_OU@5.5_O":"10.75","S_OU@4.5_O":"5.7","S_OU@4.5_U":"1.1","S_OU@3.5_U":"1.31","S_OU@3.5_O":"3.2","S_DC_12":"1.21","S_OU@2.5_U":"1.84","S_OU@2.5_O":"1.88","S_OU@1.5_U":"3.3","S_DNB_1":"1.27","S_DNB_2":"3.45","S_DC_X2":"2.0","S_OU@1.5_O":"1.29","S_1X2_1":"1.68","S_1X2_2":"4.55","S_1X2_X":"3.7","S_DC_1X":"1.14","S_OU@0.5_O":"1.02","S_OU@0.5_U":"9.8"}},{"id":11496469,"sportId":1,"provider":1,"externalId":"sr:match:64055605","sportCategory":"Saudi Arabia","sportCategoryId":363,"tournamentName":"Saudi Professional League","tournamentId":101203,"description":"|AL Khlood||v||AL Ettifaq FC|","startDate":"2026-01-24T15:20:00Z","endVisibilityDate":"2026-01-24T15:20:00Z","odds":{"S_GGNG_N":"2.19","S_GGNG_Y":"1.62","S_OU@5.5_O":"10.0","S_OU@5.5_U":"1.01","S_OU@4.5_O":"5.4","S_OU@4.5_U":"1.12","S_OU@3.5_U":"1.36","S_OU@3.5_O":"2.95","S_DC_12":"1.26","S_OU@2.5_U":"1.95","S_OU@2.5_O":"1.78","S_OU@1.5_U":"3.8","S_DNB_1":"2.02","S_DNB_2":"1.71","S_DC_X2":"1.36","S_OU@1.5_O":"1.23","S_1X2_1":"2.78","S_1X2_2":"2.36","S_1X2_X":"3.35","S_DC_1X":"1.49","S_OU@0.5_O":"1.01","S_OU@0.5_U":"11.0"}},{"id":11496444,"sportId":1,"provider":1,"externalId":"sr:match:64055603","sportCategory":"Saudi Arabia","sportCategoryId":363,"tournamentName":"Saudi Professional League","tournamentId":101203,"description":"|AL Khaleej Saihat FC||v||AL Shabab FC (KSA)|","startDate":"2026-01-24T13:25:00Z","endVisibilityDate":"2026-01-24T13:25:00Z","odds":{"S_GGNG_N":"2.34","S_GGNG_Y":"1.54","S_OU@5.5_O":"8.1","S_OU@5.5_U":"1.03","S_OU@4.5_O":"4.45","S_OU@4.5_U":"1.17","S_OU@3.5_U":"1.46","S_OU@3.5_O":"2.58","S_DC_12":"1.23","S_OU@2.5_U":"2.15","S_OU@2.5_O":"1.64","S_OU@1.5_U":"4.2","S_DNB_1":"1.49","S_DNB_2":"2.46","S_DC_X2":"1.68","S_OU@1.5_O":"1.19","S_1X2_1":"2.0","S_1X2_2":"3.3","S_1X2_X":"3.55","S_DC_1X":"1.26","S_OU@0.5_U":"12.5"}},{"id":11496446,"sportId":1,"provider":1,"externalId":"sr:match:64055589","sportCategory":"Saudi Arabia","sportCategoryId":363,"tournamentName":"Saudi Professional League","tournamentId":101203,"description":"|AL Qadisiyah||v||Al-Ittihad Jeddah|","startDate":"2026-01-22T17:30:00Z","endVisibilityDate":"2026-01-22T17:30:00Z","odds":{"S_GGNG_N":"2.51","S_GGNG_Y":"1.48","S_OU@5.5_O":"7.6","S_OU@5.5_U":"1.04","S_OU@4.5_O":"4.15","S_OU@4.5_U":"1.19","S_OU@3.5_U":"1.51","S_OU@3.5_O":"2.41","S_DC_12":"1.22","S_OU@2.5_U":"2.3","S_OU@2.5_O":"1.56","S_OU@1.5_U":"4.75","S_DNB_1":"1.71","S_DNB_2":"2.01","S_DC_X2":"1.51","S_OU@1.5_O":"1.16","S_1X2_1":"2.3",Line truncated
@@ -0,0 +1 @@
[{"id":714414245,"sportId":1,"provider":1,"externalId":"66919384","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga de Expansion MX, Clausura","tournamentId":1235075,"description":"CD Mineros de Zacatecas - Club Atletico La Paz","startDate":"2026-01-24T01:00:00Z","endVisibilityDate":"2026-01-24T01:00:00Z","odds":{"S_OU@3.5_U":"1.53","S_OU@3.5_O":"2.24","S_DC_12":"1.16","S_OU@2.5_U":"2.35","S_OU@2.5_O":"1.5","S_OU@1.5_U":"4.75","S_DNB_1":"1.18","S_DNB_2":"3.75","S_DC_X2":"2.22","S_GGNG_N":"2.27","S_GGNG_Y":"1.54","S_OU@1.5_O":"1.14","S_1X2_1":"1.54","S_1X2_2":"4.9","S_1X2_X":"4.2","S_DC_1X":"1.12","S_OU@0.5_U":"14.5","S_OU@4.5_O":"3.65","S_OU@4.5_U":"1.18"}},{"id":715632999,"sportId":1,"provider":1,"externalId":"66919382","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga de Expansion MX, Clausura","tournamentId":1235075,"description":"Tepatitlan FC - CD Tapatio","startDate":"2026-01-24T01:00:00Z","endVisibilityDate":"2026-01-24T01:00:00Z","odds":{"S_OU@3.5_U":"1.39","S_OU@3.5_O":"2.61","S_DC_12":"1.19","S_OU@2.5_U":"2.06","S_OU@2.5_O":"1.66","S_OU@1.5_U":"3.9","S_DNB_1":"1.3","S_DNB_2":"2.91","S_DC_X2":"1.89","S_GGNG_N":"2.17","S_GGNG_Y":"1.59","S_OU@1.5_O":"1.19","S_1X2_1":"1.75","S_1X2_2":"3.9","S_1X2_X":"3.75","S_DC_1X":"1.19","S_OU@0.5_U":"12","S_OU@4.5_O":"4.45","S_OU@4.5_U":"1.12"}},{"id":715039288,"sportId":1,"provider":1,"externalId":"66919388","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga de Expansion MX, Clausura","tournamentId":1235075,"description":"Coyotes Tlaxcala - Irapuato","startDate":"2026-01-25T00:00:00Z","endVisibilityDate":"2026-01-25T00:00:00Z","odds":{"S_OU@3.5_U":"1.41","S_OU@3.5_O":"2.57","S_DC_12":"1.23","S_OU@2.5_U":"2.08","S_OU@2.5_O":"1.63","S_OU@1.5_U":"4.1","S_DNB_1":"2.23","S_DNB_2":"1.51","S_DC_X2":"1.3","S_GGNG_N":"2.29","S_GGNG_Y":"1.53","S_OU@1.5_O":"1.18","S_1X2_1":"3.05","S_1X2_2":"2.07","S_1X2_X":"3.5","S_DC_1X":"1.62","S_OU@0.5_U":"12.5","S_OU@4.5_O":"4.45","S_OU@4.5_U":"1.12"}},{"id":715039286,"sportId":1,"provider":1,"externalId":"66919392","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga de Expansion MX, Clausura","tournamentId":1235075,"description":"Venados - CSD Dorados Sinaloa","startDate":"2026-01-25T02:00:00Z","endVisibilityDate":"2026-01-25T02:00:00Z","odds":{"S_OU@3.5_U":"1.5","S_OU@3.5_O":"2.31","S_DC_12":"1.15","S_OU@2.5_U":"2.3","S_OU@2.5_O":"1.53","S_OU@1.5_U":"4.55","S_DNB_1":"1.17","S_DNB_2":"3.9","S_DC_X2":"2.26","S_GGNG_N":"2.19","S_GGNG_Y":"1.58","S_OU@1.5_O":"1.15","S_1X2_1":"1.52","S_1X2_2":"5","S_1X2_X":"4.3","S_DC_1X":"1.11","S_OU@0.5_U":"14.25","S_OU@4.5_O":"3.8","S_OU@4.5_U":"1.17"}},{"id":715474573,"sportId":1,"provider":1,"externalId":"66919394","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga de Expansion MX, Clausura","tournamentId":1235075,"description":"Leones Negros UDEG - CF Correcaminos UAT","startDate":"2026-01-25T18:00:00Z","endVisibilityDate":"2026-01-25T18:00:00Z","odds":{"S_OU@3.5_U":"1.46","S_OU@3.5_O":"2.4","S_DC_12":"1.15","S_OU@2.5_U":"2.23","S_OU@2.5_O":"1.56","S_OU@1.5_U":"4.4","S_DNB_1":"1.14","S_DNB_2":"4.25","S_DC_X2":"2.41","S_GGNG_N":"2.07","S_GGNG_Y":"1.65","S_OU@1.5_O":"1.16","S_1X2_1":"1.46","S_1X2_2":"5.4","S_1X2_X":"4.4","S_DC_1X":"1.09","S_OU@0.5_U":"14","S_OU@4.5_O":"4","S_OU@4.5_U":"1.15"}},{"id":715039287,"sportId":1,"provider":1,"externalId":"66919390","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga de Expansion MX, Clausura","tournamentId":1235075,"description":"Cancun FC - Alebrijes de Oaxaca","startDate":"2026-01-25T01:00:00Z","endVisibilityDate":"2026-01-25T01:00:00Z","odds":{"S_OU@3.5_U":"1.34","S_OU@3.5_O":"2.85","S_DC_12":"1.15","S_OU@2.5_U":"1.95","S_OU@2.5_O":"1.73","S_OU@1.5_U":"3.7","S_DNB_1":"1.1","S_DNB_2":"4.95","S_DC_X2":"2.59","S_GGNG_N":"1.78","S_GGNG_Y":"1.89","S_OU@1.5_O":"1.22","S_1X2_1":"1.4","S_1X2_2":"6.3","S_1X2_X":"4.4","S_DC_1X":"1.06","S_OU@0.5_O":"1.01","S_OU@0.5_U":"11.5","S_OU@4.5_O":"5.05","S_OU@4.5_U":"1.09"}},{"id":715632988,"sportId":1,"provider":1,"externalId":"66919386","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga de Expansion MX, Clausura","tournamentId":1235075,"description":"Atlante - Tampico Madero","startDate":"2026-01-24T23:00:00Z","endVisibilityDate":"2026-01-24T23:00:00Z","odds":{"S_OU@3.5_U":"1.26","S_OU@3.5_O":"3.3","S_DC_12":"1.22","S_OU@2.5_U":"1.75","S_OU@2.5_O":"1.93","S_OU@1.5_U":"3.15","S_DNB_1":"1.22","S_DNB_2":"3.45","S_DC_X2":"2","S_GGNG_N":"1.84","S_GGNG_Y":"1.83","S_OU@1.5_O":"1.3","S_1X2_1":"1.67","S_1X2_2":"4.7","S_1X2_X":"3.55","S_DC_1X":"1.13","S_OU@0.5_O":"1.03","S_OU@0.5_U":"9.1","S_OU@4.5_O":"6","S_OU@4.5_U":"1.05"}},{"id":715493893,"sportId":1,"provider":1,"externalId":"66919064","sportCategory":"Mexico","sportCategoryId":11061,"tournamentName":"Liga MX, Women, Clausura","tournamentId":1224707,"description":"Club Tijuana de Caliente - Juarez","startDate":"2026-01-21T03:06:00Z","enLine truncated
@@ -0,0 +1 @@
[{"id":713501958,"sportId":5,"provider":1,"externalId":"67817128","sportCategory":"ATP","sportCategoryId":43762,"tournamentName":"Australian Open Men Singles","tournamentId":6246931,"description":"Garin, Cristian - Darderi, Luciano","startDate":"2026-01-20T00:00:00Z","endVisibilityDate":"2026-01-20T00:00:00Z","odds":{"T_OUG@39.5_U":"1.67","T_GH@4.5_2":"2.1","T_GH@4.5_1":"1.7","T_GH@1.5_1":"2.25","T_GH@2.5_2":"1.71","T_OUG@36.5_O":"1.73","T_GH@1.5_2":"1.61","T_OUG@36.5_U":"2.05","T_GH@2.5_1":"2.05","T_OUG@39.5_O":"2.1","T_GH@5.5_2":"2.4","T_OUG@38.5_U":"1.78","T_GH@5.5_1":"1.53","T_GH@3.5_1":"1.88","T_OUG@37.5_O":"1.83","T_GH@3.5_2":"1.86","T_121P_1":"2.25","T_12_1":"2.55","T_OUG@35.5_O":"1.64","T_121P_2":"1.6","T_12_2":"1.51","T_OUG@38.5_O":"1.96","T_OUG@37.5_U":"1.91","T_OUG@35.5_U":"2.15"}},{"id":715654634,"sportId":5,"provider":1,"externalId":"67664540","sportCategory":"ATP","sportCategoryId":43762,"tournamentName":"Australian Open Men Singles","tournamentId":6246931,"description":"Paul, Tommy - Tirante, Thiago Agustin","startDate":"2026-01-21T00:00:00Z","endVisibilityDate":"2026-01-21T00:00:00Z","odds":{"T_GH@-5.5_1":"1.33","T_GH@-5.5_2":"3.15","T_OUG@31.5_O":"1.77","T_OUG@34.5_O":"2.15","T_GH@-8.5_1":"2.45","T_GH@-7.5_1":"1.87","T_GH@-8.5_2":"1.51","T_GH@-7.5_2":"1.87","T_OUG@30.5_U":"2.2","T_OUG@32.5_O":"1.92","T_OUG@32.5_U":"1.82","T_OUG@34.5_U":"1.64","T_OUG@30.5_O":"1.63","T_GH@-6.5_1":"1.53","T_GH@-9.5_1":"3.45","T_121P_1":"1.19","T_GH@-6.5_2":"2.4","T_12_1":"1.07","T_GH@-9.5_2":"1.28","T_121P_2":"4.35","T_12_2":"8.8","T_OUG@31.5_U":"1.98","T_OUG@33.5_O":"2.05","T_OUG@33.5_U":"1.72"}},{"id":715609892,"sportId":5,"provider":1,"externalId":"67664630","sportCategory":"ATP","sportCategoryId":43762,"tournamentName":"Australian Open Men Singles","tournamentId":6246931,"description":"Majchrzak, Kamil - Marozsan, Fabian","startDate":"2026-01-21T00:00:00Z","endVisibilityDate":"2026-01-21T00:00:00Z","odds":{"T_OUG@40.5_U":"1.75","T_OUG@39.5_U":"1.87","T_GH@4.5_2":"2.45","T_GH@4.5_1":"1.52","T_GH@1.5_1":"1.97","T_GH@2.5_2":"1.92","T_GH@1.5_2":"1.78","T_GH@2.5_1":"1.82","T_OUG@39.5_O":"1.87","T_OUG@41.5_O":"2.15","T_OUG@38.5_U":"2","T_GH@3.5_1":"1.67","T_OUG@37.5_O":"1.65","T_GH@0.5_2":"1.67","T_GH@3.5_2":"2.1","T_OUG@41.5_U":"1.64","T_121P_1":"2.05","T_12_1":"2.25","T_121P_2":"1.7","T_12_2":"1.65","T_GH@0.5_1":"2.1","T_OUG@38.5_O":"1.75","T_OUG@37.5_U":"2.15","T_OUG@40.5_O":"2"}},{"id":715778157,"sportId":5,"provider":1,"externalId":"67664560","sportCategory":"ATP","sportCategoryId":43762,"tournamentName":"Australian Open Men Singles","tournamentId":6246931,"description":"Zverev, Alexander - Muller, Alexandre","startDate":"2026-01-21T00:00:00Z","endVisibilityDate":"2026-01-21T00:00:00Z","odds":{"T_GH@-5.5_1":"1.41","T_GH@-5.5_2":"2.75","T_OUG@31.5_O":"1.65","T_OUG@34.5_O":"2","T_GH@-8.5_1":"2.95","T_GH@-7.5_1":"2.05","T_GH@-8.5_2":"1.37","T_GH@-7.5_2":"1.73","T_OUG@32.5_O":"1.81","T_OUG@32.5_U":"1.94","T_OUG@34.5_U":"1.74","T_GH@-6.5_1":"1.73","T_GH@-9.5_1":"3.85","T_121P_1":"1.23","T_GH@-6.5_2":"2.05","T_12_1":"1.1","T_GH@-9.5_2":"1.24","T_OUG@35.5_O":"2.15","T_121P_2":"3.9","T_12_2":"7.15","T_OUG@31.5_U":"2.15","T_OUG@33.5_O":"1.9","T_OUG@35.5_U":"1.66","T_OUG@33.5_U":"1.84"}},{"id":713503682,"sportId":5,"provider":1,"externalId":"67832180","sportCategory":"ATP","sportCategoryId":43762,"tournamentName":"Australian Open Men Singles","tournamentId":6246931,"description":"Sweeny, Dane - Monfils, Gael","startDate":"2026-01-20T02:20:00Z","endVisibilityDate":"2026-01-20T02:20:00Z","odds":{"T_OUG@40.5_U":"1.7","T_OUG@39.5_U":"1.81","T_GH@4.5_2":"2.25","T_GH@4.5_1":"1.6","T_GH@1.5_1":"2.1","T_GH@2.5_2":"1.8","T_GH@1.5_2":"1.68","T_GH@2.5_1":"1.94","T_OUG@39.5_O":"1.93","T_OUG@41.5_O":"2.25","T_OUG@38.5_U":"1.94","T_GH@3.5_1":"1.77","T_OUG@37.5_O":"1.7","T_GH@0.5_2":"1.59","T_GH@3.5_2":"1.98","T_OUG@41.5_U":"1.6","T_121P_1":"2.15","T_12_1":"2.4","T_121P_2":"1.65","T_12_2":"1.57","T_GH@0.5_1":"2.25","T_OUG@38.5_O":"1.8","T_OUG@37.5_U":"2.1","T_OUG@40.5_O":"2.1"}},{"id":715091993,"sportId":5,"provider":1,"externalId":"67664556","sportCategory":"ATP","sportCategoryId":43762,"tournamentName":"Australian Open Men Singles","tournamentId":6246931,"description":"Cerundolo, Francisco - Dzumhur, Damir","startDate":"2026-01-21T00:00:00Z","endVisibilityDate":"2026-01-21T00:00:00Z","odds":{"T_GH@-5.5_1":"1.77","T_GH@-5.5_2":"1.98","T_OUG@34.5_O":"1.71","T_OUG@36.5_O":"1.92","T_GH@-7.5_1":"2.65","T_GH@-7.5_2":"1.45","T_OUG@36.5_U":"1.82","T_GH@-3.5_1":"1.44","T_GH@-3.5_2":"2.7","T_OUG@34.5_U":"2.05","T_GH@-4.5_1":"1.56","T_GH@-4.5_2":"2.3","T_OUG@38.5_U":"1.63","T_OUG@37.5_O":"2.05","T_GH@-6.5_1":"2.1","T_121P_1":"1.38","T_GH@-6.5_2":"1.68","T_12_1":"1.25","T_OUG@35.5_O":"1.81","T_121P_2":"2.9","T_12_2":"4","T_OUG@38.5_O":"2.2","T_OUG@37.5_U":"1.73","T_OUG@35.5_U":"1.93"}},{"id":713506049,"sportId":5,"provider":1,"externalId":"67832174","sportCategory":"ATP","sportCategoryId":43762,"tournamentName":"Australian Open Men Singles"Line truncated