Files
nuhodds_fi4/app/Console/Commands/Grapper/TxOdds/Odds.php
T
2026-03-12 11:00:33 +01:00

430 lines
18 KiB
PHP

<?php
namespace App\Console\Commands\Grapper\TxOdds;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_2Way;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_2WayS1;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_3Way;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_3WayHt;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_Dc;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_Dnb;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_Ggng;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_Points;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_PointsHt;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_PointsQ1;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_Totals;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_TotalsHt;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_TotalsQ1;
use App\Console\Commands\Grapper\TxOdds\Odds\Odds_Tq;
use App\Console\Commands\Grapper\TxOdds\Odds\Tools\ActiveSpread;
use App\Console\Commands\Nuh;
use App\Console\Commands\Xml;
use App\Models\CompetitionGroup;
use App\Models\Element;
use App\Models\ElementGroup;
use App\Models\Event;
use App\Models\EventBookmaker;
use App\Models\Group;
use App\Models\Supervisor;
use App\Models\TxoddsMarket;
use App\Utilities\Notice;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
class Odds
{
public static function grap()
{
$debug = Nuh::$options['d'] ?? 0;
if ($debug) {
Notice::note('TXODD ODD sport: '.Nuh::$options['sport_id'], 'b');
}
/**
* Delete
*/
// $info = Event::where('starttime', '<', Carbon::now()->subMinutes(10))->delete();
// if ($debug) {
// Notice::note("Deleted: $info");
// }
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;
}
/*************************************************
* markets
*************************************************/
$markets = '&ot='.implode(',', $res);
/*************************************************
* 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';
} else {
$url = 'https://xml2.txodds.com/feed/odds/xml.php?'.config('env.txodds_betaid2').'&all_odds=2';
}
$_calls = [];
$sport = '&spid='.Nuh::$options['sport_id'];
if (Nuh::$options['provider_id'] == 8) {
/*************************************************
* TXODDS MARKET LASTCALL
*************************************************/
if ($debug) {
Notice::note('TXOdds MARKET Lastcall', 'p');
}
$market = '&ot='.Nuh::$options['txodds_market_id'];
$lastcall = Nuh::$options['lastcall'] > time() - 600 ? '&last='.Nuh::$options['lastcall'] : '&last='.time() - 600;
$_calls[] = $url.$sport.$market.$lastcall;
} elseif (Nuh::$options['id']) {
/*************************************************
* BY ID
*************************************************/
if ($debug) {
Notice::note("BY ID \nsport_id: ".Nuh::$options['sport_id'], 'p');
}
$id = '&peid='.Nuh::$options['id'];
$_calls[] = $url.$markets.$id;
} elseif (Nuh::$options['gid']) {
/*************************************************
* BY GROUP ID
*************************************************/
if ($debug) {
Notice::note("GROUP_ID \nsport_id: ".Nuh::$options['sport_id'], 'p');
}
$from_to = '&days='.Nuh::$options['days_from'].','.Nuh::$options['days_to'];
$events = Event::where('starttime', '>', Carbon::now())->where('group_id', Nuh::$options['gid'])->pluck('id');
foreach ($events as $event_id) {
$_calls[] = $url.$markets.$from_to.'&peid='.$event_id;
}
} elseif (Nuh::$options['g']) {
/*************************************************
* ALL BY GROUP ID for last changes
*************************************************/
if ($debug) {
Notice::note("GROUP_ID \nsport_id: ".Nuh::$options['sport_id'], 'p');
}
$from_to = '&days='.Nuh::$options['days_from'].','.Nuh::$options['days_to'];
$groupids = Event::where('starttime', '>', Carbon::now())->groupBy('group_id')->pluck('group_id');
foreach ($groupids as $groupid) {
$_calls[] = $url.$markets.$from_to.'&pgid='.$groupid;
}
} elseif (Nuh::$options['t']) {
/*************************************************
* TODAY by ID
*************************************************/
if ($debug) {
Notice::note("TODAY \nsport_id: ".Nuh::$options['sport_id'], 'p');
}
$res = Event::where('sport_id', Nuh::$options['sport_id'])->where('starttime', '>=', Carbon::now())->where('starttime', '<', Carbon::now()->addDays(1))->pluck('id');
foreach ($res as $id) {
$_calls[] = $url.$sport.$markets.'&peid='.$id;
}
} elseif (Nuh::$options['w']) {
/*************************************************
* ONE WEEK FROM NOW
*************************************************/
if ($debug) {
Notice::note("ONE WEEK FROM NOW \nsport_id: ".Nuh::$options['sport_id'], 'p');
}
$res = Event::where('sport_id', Nuh::$options['sport_id'])->where('starttime', '>=', Carbon::now())->where('starttime', '<', Carbon::now()->addDays(7))->pluck('id');
foreach ($res as $id) {
$_calls[] = $url.$sport.$markets.'&peid='.$id;
}
} elseif (Nuh::$options['a']) {
/*************************************************
* ALL BY ID (reload)
*************************************************/
if ($debug) {
Notice::note("ALL \nsport_id: ".Nuh::$options['sport_id'], 'p');
}
$res = Event::where('sport_id', Nuh::$options['sport_id'])->where('starttime', '>=', Carbon::now())->pluck('id');
foreach ($res as $id) {
$_calls[] = $url.$sport.$markets.'&peid='.$id;
}
} else {
Notice::note('BASH PARAMETER MISSING [--t, --w, --g, --a, --id=]', 'r', 1);
}
/*************************************************
* CALL
*************************************************/
$counter = 0;
foreach ($_calls as $url) {
$counter++;
$data = Xml::load($url);
if (Nuh::$options['provider_id'] == 8) {
Supervisor::where('id', Nuh::$options['supervisor_id'])->update(['lastcall' => (int) $data['timestamp']]);
}
if ($debug) {
Notice::note('counter: '.count($_calls).'/'.$counter, 'g');
}
foreach ($data as $row) {
$event_id = (int) $row['id'];
$sport_id = (int) $row->group['spid'];
$event = [
'has_markets' => 1,
'provider_id' => (int) Nuh::$options['provider_id'],
'starttime' => $row->time,
'sport_id' => $sport_id,
'home_id' => (int) $row->hteam['id'],
'away_id' => (int) $row->ateam['id'],
'country_id' => (int) $row->group['cnid'],
'group_id' => (int) $row->group['id'],
'competition_group_id' => (int) $row->group['cgid'],
];
$res = DB::transaction(function () use ($row, $event) {
return Event::updateOrCreate(['id' => (int) $row['id']], $event);
}, 5);
$event_id = $res->id;
$group = [
'competition_group_id' => (string) $row->group['cgid'],
'sport_id' => $sport_id,
'country_id' => (int) $row->group['cnid'],
'name' => (string) $row->group['cname'],
'fullname' => (string) $row->group,
];
Group::updateOrCreate(['id' => (int) $row->group['id']], $group);
$compgroup = [
'sport_id' => $sport_id,
'country_id' => $event['country_id'],
'name' => (string) $row->group['cname'],
];
CompetitionGroup::updateOrCreate(['id' => (int) $row->group['cgid']], $compgroup);
$element = [
'name' => (string) $row->hteam,
'sport_id' => $sport_id,
'country_id' => (int) $row->group['cnid'],
];
Element::updateOrCreate(['id' => (int) $row->hteam['id']], $element);
$element_group = [
'competition_group_id' => (int) $row->group['cgid'],
];
ElementGroup::updateOrCreate(['element_id' => (int) $row->hteam['id'], 'group_id' => (int) $row->group['id']], $element_group);
$element = [
'name' => (string) $row->ateam,
'sport_id' => $sport_id,
'country_id' => (int) $row->group['cnid'],
];
Element::updateOrCreate(['id' => (int) $row->ateam['id']], $element);
$element_group = [
'competition_group_id' => (int) $row->group['cgid'],
];
ElementGroup::updateOrCreate(['element_id' => (int) $row->ateam['id'], 'group_id' => (int) $row->group['id']], $element_group);
if ($event_id && Event::where('id', $event_id)->exists()) {
// inconsistency with CONSTRAINT when getting only market updates
foreach ($row->bookmaker as $book) {
ActiveSpread::start();
$bookmaker_id = (int) $book['bid'];
$odds = [];
$odds['event_id'] = $event_id;
$odds['bookmaker_id'] = $bookmaker_id;
$odds['sport_id'] = $sport_id;
$odds['provider_id'] = Nuh::$options['provider_id'];
$odds['flags'] = 1;
foreach ($book->offer as $offer) {
$bettypeid = 0;
foreach ($offer->attributes() as $attributeName => $attributeValue) {
switch ($attributeName) {
case 'id':
$odds['offer_id'] = (int) $attributeValue;
break;
case 'ot':
$bettypeid = (int) $attributeValue;
break;
case 'bmoid':
$odds['bmoid'] = (string) $attributeValue;
break;
case 'flags':
$odds['flags'] = (string) $attributeValue;
break;
}
}
switch ($bettypeid) {
case 0:
foreach ($offer->odds->attributes() as $attributeName => $attributeValue) {
switch ($attributeName) {
case 'starting_time':
DB::transaction(function () use ($odds, $sport_id, $event_id, $bookmaker_id, $attributeValue) {
EventBookmaker::updateOrCreate([
'event_id' => $event_id,
'sport_id' => $sport_id,
'bookmaker_id' => $bookmaker_id,
], ['in_feed' => 1, 'bmoid' => $odds['bmoid'], 'starttime' => $attributeValue]);
}, 5);
break;
}
}
Odds_3Way::grap($odds, $offer);
break;
case 1:
foreach ($offer->odds->attributes() as $attributeName => $attributeValue) {
switch ($attributeName) {
case 'starting_time':
DB::transaction(function () use ($odds, $sport_id, $event_id, $bookmaker_id, $attributeValue) {
EventBookmaker::updateOrCreate([
'event_id' => $event_id,
'sport_id' => $sport_id,
'bookmaker_id' => $bookmaker_id,
], ['in_feed' => 1, 'bmoid' => $odds['bmoid'], 'starttime' => $attributeValue]);
}, 5);
break;
}
}
Odds_2Way::grap($odds, $offer);
break;
case 3:
foreach ($offer->odds->attributes() as $attributeName => $attributeValue) {
switch ($attributeName) {
case 'starting_time':
DB::transaction(function () use ($odds, $sport_id, $event_id, $bookmaker_id, $attributeValue) {
EventBookmaker::updateOrCreate([
'event_id' => $event_id,
'sport_id' => $sport_id,
'bookmaker_id' => $bookmaker_id,
], ['in_feed' => 1, 'bmoid' => $odds['bmoid'], 'starttime' => $attributeValue]);
}, 5);
break;
}
}
Odds_Points::grap($odds, $offer);
break;
case 4:
Odds_Totals::grap($odds, $offer);
break;
case 131073:
Odds_2WayS1::grap($odds, $offer);
break;
case 65536:
Odds_3WayHt::grap($odds, $offer);
break;
case 65540:
Odds_TotalsHt::grap($odds, $offer);
break;
case 65539:
Odds_PointsHt::grap($odds, $offer);
break;
case 131075:
Odds_PointsQ1::grap($odds, $offer);
break;
case 131076:
Odds_TotalsQ1::grap($odds, $offer);
break;
case 5242880:
Odds_Dc::grap($odds, $offer);
break;
case 6291457:
Odds_Dnb::grap($odds, $offer);
break;
case 11534337:
Odds_Ggng::grap($odds, $offer);
break;
case 7340033:
Odds_Tq::grap($odds, $offer);
break;
default:
Notice::note('switch bettype ID not found: '.$bettypeid, 'r');
break;
}
}
ActiveSpread::set($event_id, $bookmaker_id);
}
}
}
}
if ($debug) {
Notice::note('DONE - EVENTS: '.$counter, 'g');
}
}
}