Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?
- set_time_limit(0);
- class Parser
- {
- public static function closeLeague($lid)
- {
- $leagueRow = ORM::for_table('leagues')->where('id',$lid)->find_one();
- $leagueRow->open = 0;
- $leagueRow->save;
- return true;
- }
- // отменяет результаты последнего тура, подчищает все очки, стоимость и прочую херню, херни много, может где забыли
- public static function cancelLastTour($lid)
- {
- $leagueRow = ORM::for_table('leagues')->where('id',$lid)->find_one();
- // $leagueRow->open = 0;
- $cost = ORM::for_table('cost')->where('lid',$lid)->where('tour',$leagueRow->active_tour-1)->delete_many();
- $matches = ORM::for_table('match')->where('lid',$lid)->where('tour',$leagueRow->active_tour-1)->find_many();
- foreach ($matches as $valueMatch)
- {
- $valueMatch->score1 = -1;
- $valueMatch->score2 = -1;
- $valueMatch->stat = '';
- $valueMatch->calculations = '';
- $valueMatch->series = '';
- $valueMatch->calculated = 0;
- $valueMatch->save();
- }
- $points = ORM::for_table('points')->where('lid',$lid)->where('tour',$leagueRow->active_tour-1)->delete_many();
- $users_players = ORM::for_table('users_players')->where('lid',$lid)->where('tour',$leagueRow->active_tour)->delete_many();
- $users_players_for_erase = ORM::for_table('users_players')->where('lid',$lid)->where('tour',$leagueRow->active_tour-1)->find_many();
- foreach ($users_players_for_erase as $valuePlayer)
- {
- $valuePlayer->points = 0;
- $valuePlayer->played = 0;
- $valuePlayer->save();
- }
- $user_players_actions = ORM::for_table('user_players_actions')->where('lid',$lid)->where('tour',$leagueRow->active_tour-1)->delete_many();
- $users_teams = ORM::for_table('users_teams')->where('lid',$lid)->where('active',1)->find_many();
- foreach ($users_teams as $user_team)
- {
- $users_teams_result = ORM::for_table('users_teams_result')->where('tid',$user_team->id)->where('tour',$leagueRow->active_tour-1)->find_one();
- if ($users_teams_result->id)
- $users_teams_result->delete();
- }
- $leagueRow->active_tour = $leagueRow->active_tour - 1;
- $leagueRow->save();
- return true;
- }
- // прогнать тур - получить результаты, посчитать очки, записать очки, по пользовательским базам пройтись и сделать там всё для нового тура
- public static function doLeagueTour($lid)
- {
- $leagueRow = ORM::for_table('leagues')->where('id',$lid)->find_one();
- // if ($leagueRow->open == 1) self::closeLeague($lid);
- $matches = ORM::for_table('match')->where('lid',$leagueRow->id)->where('tour',$leagueRow->active_tour)->find_array();
- foreach ($matches as $keyMatch=>$valueMatch)
- {
- $mr = Parser::getMatchResult($valueMatch['id']);
- $matchRow = ORM::for_table('match')->where('id',$valueMatch['id'])->find_one();
- if ($mr['status'] == 'Матч окончен')
- {
- $calculations = Parser::calculatePoints($matchRow->id,$mr);
- $matchRow->stat = serialize($mr);
- $matchRow->calculations = serialize($calculations);
- if (isset($mr['score1'])) $matchRow->score1 = $mr['score1'];
- if (isset($mr['score2'])) $matchRow->score2 = $mr['score2'];
- $matchRow->save();
- Parser::doCalculate($matchRow->id);
- }
- }
- $leagueRow->open = 0;
- $leagueRow->save();
- self::doLeagueTourTeams($lid);
- $leagueRow->active_tour = $leagueRow->active_tour + 1;
- $leagueRow->save();
- }
- // прогоняет всё командное - делает таблицу users_teams_result (очки и место команды в зависимости от тура)
- // копирует игроков с прошлого тура в этот
- public static function doLeagueTourTeams($lid)
- {
- $leagueRow = ORM::for_table('leagues')->where('id',$lid)->find_one();
- // $leagueRow->active_tour = 1;
- if ($leagueRow->open == 0)
- {
- $teamsRow = ORM::for_table('users_teams')->where('lid',$lid)->where('active',1)->find_many();
- foreach ($teamsRow as $teamRow)
- {
- $sumPoints = 0;
- $playersInTeam = ORM::for_table('users_players')->where('tid',$teamRow->id)->where('tour',$leagueRow->active_tour)->where('active',1)->order_by_desc('position')->order_by_desc('sort')->find_many();
- // узнать кто играет, а кто из запаса играет
- foreach ($playersInTeam as $playerRow)
- {
- }
- // раскопировать всё на следующий тур
- foreach ($playersInTeam as $playerRow)
- {
- $newPlayerRow = ORM::for_table('users_players')->create();
- $newPlayerRow->tid = $playerRow->tid;
- $newPlayerRow->lid = $playerRow->lid;
- $newPlayerRow->pid = $playerRow->pid;
- $newPlayerRow->start_tour = $playerRow->start_tour;
- $newPlayerRow->end_tour = $playerRow->end_tour;
- $newPlayerRow->start_price = $playerRow->start_price;
- $newPlayerRow->active = $playerRow->active;
- $newPlayerRow->tour = $playerRow->tour+1;
- $newPlayerRow->position = $playerRow->position;
- $newPlayerRow->sort = $playerRow->sort;
- $newPlayerRow->captain = $playerRow->captain;
- $newPlayerRow->save();
- if ($playerRow->position == 2)
- {
- $sumPoints = $sumPoints + $playerRow->points;
- }
- // ТУТ СДЕЛАТЬ АЛГОРИТМ С ЗАМЕНАМИ
- }
- $checkTeamResult = ORM::for_table('users_teams_result')->where('tid',$teamRow->id)->where('tour',$leagueRow->active_tour)->find_one();
- if ($checkTeamResult->id)
- {
- $oldPoints = $checkTeamResult->points;
- $checkTeamResult->points = $sumPoints;
- $checkTeamResult->sum = $checkTeamResult->sum - $oldPoints + $sumPoints;
- $checkTeamResult->save();
- } else
- {
- $newTeamResult = ORM::for_table('users_teams_result')->create();
- $newTeamResult->tid = $teamRow->id;
- $newTeamResult->tour = $leagueRow->active_tour;
- $newTeamResult->points = $sumPoints;
- $lastTourTeamResult = ORM::for_table('users_teams_result')->where('tid',$teamRow->id)->where_not_equal('tour',$leagueRow->active_tour)->order_by_desc('tour')->find_one();
- if ($lastTourTeamResult->sum)
- $newTeamResult->sum = $lastTourTeamResult->sum + $sumPoints;
- else
- $newTeamResult->sum = $sumPoints;
- $newTeamResult->save();
- }
- }
- }
- }
- public static function defaultFirstTour($lid)
- {
- $teams = ORM::for_table('teams_in_leagues')->select('id_team')->where('id_league',$lid)->find_array();
- if ($teams['0']['id_team'])
- {
- foreach ($teams as $keyTeam=>$valueTeam)
- {
- $arrTeams[] = $valueTeam['id_team'];
- }
- }
- if (!$arrTeams) return false;
- $players = ORM::for_table('players')->select('id')->where_in('team_id',$arrTeams)->find_array();
- if ($players['0']['id'])
- {
- foreach ($players as $keyPlayer=>$valuePlayer)
- {
- $check = ORM::for_table('points')->where('lid',$lid)->where('pid',$valuePlayer['id'])->where('mid',-1)->where('tour',0)->find_one();
- if (!$check->id)
- {
- $newRowPoints = ORM::for_table('points')->create();
- $newRowPoints->lid = $lid;
- $newRowPoints->pid = $valuePlayer['id'];
- $newRowPoints->p = 0;
- $newRowPoints->sum = 0;
- $newRowPoints->tour = 0;
- $newRowPoints->mid = -1;
- $newRowPoints->save();
- self::calculateCost($newRowPoints->id);
- }
- }
- }
- }
- private static function getEn($n,$pid,$lid,$nt = 0,$s0 = 0)
- {
- if ($n<1) return ($s0 / $nt);
- $row = ORM::for_table('points')->where('lid',$lid)->where('pid',$pid)->where('tour',$n)->find_one();
- if ($row->sum) return $row->sum; else return 0;
- }
- private static function getPn($n,$pid,$lid, $nt = 0, $s0 = 0)
- {
- $row = ORM::for_table('points')->where('lid',$lid)->where('pid',$pid)->where('tour',$n)->find_one();
- if ($row->p) return $row->p; else return 0;
- }
- public static function calculateCost($pointsId)
- {
- $row = ORM::for_table('points')->where('id',$pointsId)->find_one();
- if ($row->id)
- {
- $s0Row = ORM::for_table('points')->where('lid',$row->lid)->where('pid',$row->pid)->where('tour',0)->find_one();
- if ($s0Row->p) $s0 = $s0Row->p; else $s0 = 0; // начальный рейтинг
- $ntRow = ORM::for_table('match')->where('lid',$row->lid)->order_by_desc('tour')->find_one();
- if ($ntRow->tour) $nt = $ntRow->tour; else $nt = 30; // количество туров в текущем сезоне
- $n = $row->tour;
- $s = 333 +
- ( (($nt - $n) * $s0) / $nt ) +
- self::getEn($n,$row->pid,$row->lid,$nt,$s0);
- $s1 = 2 * (self::getPn($n,$row->pid,$row->lid,$nt,$s0) - ( ( (($s0 * ($nt - $n) / ($nt)) + self::getEn($n,$row->pid,$row->lid,$nt,$s0)) / ($nt) ) ));
- $s2 = 1 * (self::getPn($n-1,$row->pid,$row->lid,$nt,$s0) - ( ( (($s0 * ($nt - $n + 2) / ($nt)) + self::getEn($n-1,$row->pid,$row->lid,$nt,$s0)) / ($nt) ) ));
- $s3 = 0.5 * (self::getPn($n-2,$row->pid,$row->lid,$nt,$s0) - ( ( (($s0 * ($nt - $n + 2) / ($nt)) + self::getEn($n-2,$row->pid,$row->lid,$nt,$s0)) / ($nt) ) ));
- echo $s."<br /> ".$s1."<br /> ".$s2."<br /> ".$s3."<br /> ";
- $t = $s + $s1 + $s2 + $s3;
- // echo $n; echo $nt;
- $checkRow = ORM::for_table('cost')->where('lid',$row->lid)->where('pid',$row->pid)->where('tour',$n)->find_one();
- if ($checkRow->id) // апдейтим цену
- {
- $checkRow->s = round($t,2);
- $checkRow->save();
- } else
- {
- $rowCost = ORM::for_table('cost')->create();
- $rowCost->lid = $row->lid;
- $rowCost->pid = $row->pid;
- $rowCost->s = round($t,2);
- $rowCost->tour = $n;
- $rowCost->save();
- }
- //556
- } else return false;
- }
- // по записанному в поле calculations (таблица match) посчитать очки и сохранить в базе
- // серии тоже сохранить (поле series)
- public static function doCalculate($mid)
- {
- $row = ORM::for_table('match')->where('id',$mid)->find_one();
- if ($row->calculations and $row->calculated == 0 and ($row->score1!=-1 and $row->score2!=-1) )
- {
- $data = unserialize($row->calculations);
- $series = unserialize($row->series);
- if ($data)
- {
- foreach ($data as $keyD=>$valueD)
- {
- unset($atypes);
- if ($valueD['id'])
- {
- foreach ($valueD['p'] as $keyP=>$valueP)
- {
- if (isset($valueP['atype']))
- {
- if (!isset($valueP['acount'])) $valueP['acount'] = 1;
- $atypes[$valueP['atype']] = $atypes[$valueP['atype']] + $valueP['acount'];
- }
- }
- foreach ($atypes as $keyP=>$valueP)
- {
- $checkUserPlayersActions = ORM::for_table('user_players_actions')->where('mid',$row->id)->where('pid',$valueD['id'])->where('lid',$row->lid)->where('type',$keyP)->where('cnt',$valueP)->where('tour',$row->tour)->find_one();
- if (!$checkUserPlayersActions->id)
- {
- $rowUserPlayersActions = ORM::for_table('user_players_actions')->create();
- $rowUserPlayersActions->mid = $row->id;
- $rowUserPlayersActions->pid = $valueD['id'];
- $rowUserPlayersActions->lid = $row->lid;
- $rowUserPlayersActions->type = $keyP;
- $rowUserPlayersActions->cnt = $valueP;
- $rowUserPlayersActions->tour = $row->tour;
- $rowUserPlayersActions->save();
- }
- }
- $checkRow = ORM::for_table('points')->where('tour',$row->tour)->where('lid',$row->lid)->where('pid',$valueD['id'])->where('mid',$row->id)->find_one();
- if (!$checkRow->id)
- {
- $lastTourRow = ORM::for_table('points')->where_lte('tour',$row->tour)->where('lid',$row->lid)->where('pid',$valueD['id'])->order_by_desc('tour')->order_by_desc('id')->find_one();
- $newRow = ORM::for_table('points')->create();
- $newRow->lid = $row->lid;
- $newRow->pid = $valueD['id'];
- $newRow->p = $valueD['sum'];
- if ($lastTourRow->sum) $sum = $lastTourRow->sum; else $sum = 0;
- $newRow->sum = $sum + $valueD['sum'];
- $newRow->tour = $row->tour;
- $newRow->mid = $row->id;
- $newRow->save();
- self::calculateCost($newRow->id);
- }
- // обновление данных в таблице users_players
- $rowsUsersPlayers = ORM::for_table('users_players')->where('tour',$row->tour)->where('lid',$row->lid)->where('pid',$valueD['id'])->where('active',1)->find_many();
- foreach ($rowsUsersPlayers as $rowUserPlayer)
- {
- if ($rowUserPlayer->captain == 1)
- $rowUserPlayer->points = $valueD['sum'] * 2;
- else
- $rowUserPlayer->points = $valueD['sum'];
- if ($atypes[42]>0) // не играл
- $rowUserPlayer->played = 0;
- else
- $rowUserPlayer->played = 1;
- $rowUserPlayer->save();
- }
- }
- }
- }
- if ($series)
- {
- foreach ($series as $keySerie=>$valueSerie)
- {
- if ($valueSerie['id'])
- {
- if ($valueSerie['id'] == 'new') // новая серия
- {
- $newRow = ORM::for_table('serie')->create();
- $newRow->pid = $valueSerie['pid'];
- $newRow->lid = $valueSerie['lid'];
- $newRow->last_mid = $valueSerie['last_mid'];
- $newRow->type = $valueSerie['type'];
- $newRow->match = $valueSerie['match'];
- $newRow->active = $valueSerie['active'];
- $newRow->save();
- } else
- {
- $checkRow = ORM::for_table('serie')->where('id',$valueSerie['id'])->find_one();
- if ($checkRow->id)
- {
- $checkRow->last_mid = $valueSerie['last_mid'];
- $checkRow->match = $valueSerie['match'];
- $checkRow->active = $valueSerie['active'];
- $checkRow->save();
- }
- }
- }
- }
- }
- } else return false;
- $row->calculated = 1;
- $row->save();
- return true;
- }
- // подсчет очков без записи в базу (возвращает массив с очками по каждому игроку)
- public static function calculatePoints($mid,$matchResultData = null)
- {
- if ($matchResultData == null)
- $res = self::getMatchResult($mid);
- else
- $res = $matchResultData;
- $match = ORM::for_table('match')->where('id',$mid)->find_one();
- if ($res['status'] == 'Матч окончен')
- {
- $team1AllPlayers = ORM::for_table('players')->where('team_id',$match->team1)->find_array();
- $team2AllPlayers = ORM::for_table('players')->where('team_id',$match->team2)->find_array();
- foreach ($res['lineup'] as $kP=>$player)
- {
- $p = 0;
- $jocker = false;
- if ($player['id'])
- {
- if ($player['tid'] == $match->team1)
- {
- foreach ($team1AllPlayers as $keyTeam1=>$valueTeam1)
- {
- if ($valueTeam1['id'] == $player['id']) $team1AllPlayers[$keyTeam1]['in_match'] = true;
- }
- }
- if ($player['tid'] == $match->team2)
- {
- foreach ($team2AllPlayers as $keyTeam2=>$valueTeam2)
- {
- if ($valueTeam2['id'] == $player['id']) $team2AllPlayers[$keyTeam2]['in_match'] = true;
- }
- }
- $data[$player['id']]['id'] = $player['id'];
- $playerRow = ORM::for_table('players')->where('id',$player['id'])->find_one();
- $line = $playerRow->line;
- if ($player['tid'] == $match->team1) { $status = 1; } // дома
- if ($player['tid'] == $match->team2) { $status = 2; } // в гостях
- if ($status == 1)
- {
- if ($res['score1'] > $res['score2']) $scores[] = array('type'=>1,'caption'=>'Победа дома','p'=>1);
- if ($res['score1'] == $res['score2']) $scores[] = array('type'=>1,'caption'=>'Ничья дома','p'=>-0.5); // ничья дома
- if ($res['score1'] < $res['score2']) $scores[] = array('type'=>1,'caption'=>'Поражение дома','p'=>-2); // поражение дома
- }
- if ($status == 2)
- {
- if ($res['score2'] > $res['score1']) $scores[] = array('type'=>1,'caption'=>'Победа в гостях','p'=>2); // победа в гостях
- if ($res['score2'] == $res['score1']) $scores[] = array('type'=>1,'caption'=>'Ничья в гостях','p'=>0.5); // ничья в гостях
- if ($res['score2'] < $res['score1']) $scores[] = array('type'=>1,'caption'=>'Поражение в гостях','p'=>-1); // поражение в гостях
- }
- $win_goal = 0;
- $activeGoal = 0;
- if ( ($res['score1'] > $res['score2']) and ($status == 1) ) $win_goal = $res['score2']+1;
- if ( ($res['score2'] > $res['score1']) and ($status == 2) ) $win_goal = $res['score1']+1;
- if ($status == 1)
- {
- if ($res['score1'] >= 3) // много забитых голов
- {
- $scores[] = array('type'=>1,'caption'=>'Много забитых голов','p'=>1);
- if ($line == 0) $p = $p + 1;
- if ($line == 1) $p = $p + 1;
- if ($line == 2) $p = $p + 1;
- if ($line == 3) $p = $p + 1;
- }
- }
- if ($status == 2)
- {
- if ($res['score2'] >= 3) // много забитых голов
- {
- $scores[] = array('type'=>1,'caption'=>'Много забитых голов','p'=>1);
- if ($line == 0) $p = $p + 1;
- if ($line == 1) $p = $p + 1;
- if ($line == 2) $p = $p + 1;
- if ($line == 3) $p = $p + 1;
- }
- }
- if ($status == 1)
- {
- if ( ($res['score1'] - $res['score2']) >= 3) // крупный счет
- {
- $scores[] = array('type'=>1,'caption'=>'Крупный счет','p'=>1);
- if ($line == 0) $p = $p + 1;
- if ($line == 1) $p = $p + 1;
- if ($line == 2) $p = $p + 1;
- if ($line == 3) $p = $p + 1;
- }
- }
- if ($status == 2)
- {
- if ( ($res['score2'] - $res['score1']) >= 3) // крупный счет
- {
- $scores[] = array('type'=>1,'caption'=>'Крупный счет','p'=>1);
- if ($line == 0) $p = $p + 1;
- if ($line == 1) $p = $p + 1;
- if ($line == 2) $p = $p + 1;
- if ($line == 3) $p = $p + 1;
- }
- }
- $komanda_zabila = false;
- $komanda_propustila = false;
- $goals = 0; // для хеттрика
- $asist = 0;
- $red = false;
- $yellow = false;
- if ($res['actions'][0]['type'])
- {
- foreach ($res['actions'] as $kA=>$vA)
- {
- // jocker
- if ($player['id'] == $vA['id'] and $player['in']>0 and (($vA['min']-20)<=$player['in']))
- {
- $jocker = true;
- }
- // каждый забитый гол / каждый пропущенный гол
- if ($vA['type'] == 1 or $vA['type'] == 2 or $vA['type'] == 3)
- {
- if ( ($vA['tid'] == $player['tid']) and $vA['type'] != 3 and ($vA['min']>=$player['in'] and $vA['min']<=$player['out'])) // забили и не автогол
- {
- $komanda_zabila = true;
- if ($line == 0) $p = $p + 0;
- if ($line == 1) $scores[] = array('type'=>1,'caption'=>'Каждый забитый гол','p'=>0.5);
- if ($line == 2) $scores[] = array('type'=>1,'caption'=>'Каждый забитый гол','p'=>1);
- if ($line == 3) $scores[] = array('type'=>1,'caption'=>'Каждый забитый гол','p'=>1);
- }
- if ( (($vA['tid'] != $player['tid']) or $vA['type'] == 3) and ($vA['min']>=$player['in'] and $vA['min']<=$player['out'])) // пропустили или автогол
- {
- $komanda_propustila = true;
- if ($vA['type'] == 2) // с пенальти
- {
- if ($line == 0) $scores[] = array('type'=>1,'caption'=>'Каждый пропущенный гол (с пенальти)','p'=>-0.5);
- if ($line == 1) $scores[] = array('type'=>1,'caption'=>'Каждый пропущенный гол (с пенальти)','p'=>-0.5);
- if ($line == 2) $scores[] = array('type'=>1,'caption'=>'Каждый пропущенный гол (с пенальти)','p'=>-0.5);
- if ($line == 3) $p = $p + 0;
- } else
- {
- if ($line == 0) $scores[] = array('type'=>1,'caption'=>'Каждый пропущенный гол','p'=>-1);
- if ($line == 1) $scores[] = array('type'=>1,'caption'=>'Каждый пропущенный гол','p'=>-0.5);
- if ($line == 2) $scores[] = array('type'=>1,'caption'=>'Каждый пропущенный гол','p'=>-0.5);
- if ($line == 3) $p = $p + 0;
- }
- }
- }
- // победный гол
- $m = 0;
- if ($win_goal and ($vA['type'] == 1 or $vA['type'] == 2))
- {
- if ($vA['tid'] == $player['tid'])
- {
- $activeGoal=$activeGoal+1;
- if ($player['id'] == $vA['id'])
- {
- if ($activeGoal == $win_goal)
- {
- if ($line == 0) $scores[] = array('atype'=>6,'type'=>1,'caption'=>'Победный гол','p'=>3);
- if ($line == 1) $scores[] = array('atype'=>6,'type'=>1,'caption'=>'Победный гол','p'=>1);
- if ($line == 2) $scores[] = array('atype'=>6,'type'=>1,'caption'=>'Победный гол','p'=>1);
- if ($line == 3) $scores[] = array('atype'=>6,'type'=>1,'caption'=>'Победный гол','p'=>1);
- $p = $p + $m;
- }
- }
- }
- }
- // гол с игры
- $m = 0;
- if ($vA['type'] == 1 and $player['id'] == $vA['id'])
- {
- $goals = $goals + 1;
- if ($line == 0) $scores[] = array('atype'=>4,'type'=>1,'caption'=>'Гол с игры','p'=>10);
- if ($line == 1) $scores[] = array('atype'=>4,'type'=>1,'caption'=>'Гол с игры','p'=>5);
- if ($line == 2) $scores[] = array('atype'=>4,'type'=>1,'caption'=>'Гол с игры','p'=>4);
- if ($line == 3) $scores[] = array('atype'=>4,'type'=>1,'caption'=>'Гол с игры','p'=>3);
- }
- $p = $p + $m;
- // пенальти
- $m = 0;
- if ($vA['type'] == 2 and $player['id'] == $vA['id'])
- {
- $goals = $goals + 1;
- if ($line == 0) $scores[] = array('atype'=>5,'type'=>1,'caption'=>'Пенальти','p'=>3);
- if ($line == 1) $scores[] = array('atype'=>5,'type'=>1,'caption'=>'Пенальти','p'=>2);
- if ($line == 2) $scores[] = array('atype'=>5,'type'=>1,'caption'=>'Пенальти','p'=>2);
- if ($line == 3) $scores[] = array('atype'=>5,'type'=>1,'caption'=>'Пенальти','p'=>2);
- }
- $p = $p + $m;
- // автогол
- $m = 0;
- if ($vA['type'] == 3 and $player['id'] == $vA['id'])
- {
- if ($line == 0) $scores[] = array('atype'=>9,'type'=>1,'caption'=>'Автогол','p'=>-3);
- if ($line == 1) $scores[] = array('atype'=>9,'type'=>1,'caption'=>'Автогол','p'=>-3);
- if ($line == 2) $scores[] = array('atype'=>9,'type'=>1,'caption'=>'Автогол','p'=>-3);
- if ($line == 3) $scores[] = array('atype'=>9,'type'=>1,'caption'=>'Автогол','p'=>-5);
- }
- $p = $p + $m;
- // асист
- $m = 0;
- if ($vA['type'] == 4 and $player['id'] == $vA['id'])
- {
- if ($line == 0) $scores[] = array('atype'=>2,'type'=>1,'caption'=>'Голевой пас','p'=>3);
- if ($line == 1) $scores[] = array('atype'=>2,'type'=>1,'caption'=>'Голевой пас','p'=>2.5);
- if ($line == 2) $scores[] = array('atype'=>2,'type'=>1,'caption'=>'Голевой пас','p'=>1.5);
- if ($line == 3) $scores[] = array('atype'=>2,'type'=>1,'caption'=>'Голевой пас','p'=>1.5);
- $asist = $asist + 1;
- }
- $p = $p + $m;
- // красная
- if ($vA['type'] == 5 and $player['id'] == $vA['id'])
- {
- $scores[] = array('atype'=>8,'type'=>1,'caption'=>'Красная','p'=>-3);
- $scores[] = array('type'=>1,'caption'=>'Возврат за желтую','p'=>1);
- $red = true;
- }
- // желтая
- if ($vA['type'] == 6 and ($player['id'] == $vA['id']))
- {
- $scores[] = array('atype'=>7,'type'=>1,'caption'=>'Желтая','p'=>-1);
- $yellow = true;
- }
- // пенальти не забитый
- $m = 0;
- if ($vA['type'] == 7 and $player['id'] == $vA['id'])
- {
- if ($line == 0) $scores[] = array('atype'=>10,'type'=>1,'caption'=>'Пенальти не забитый','p'=>-2);$m = -2;
- if ($line == 1) $scores[] = array('atype'=>10,'type'=>1,'caption'=>'Пенальти не забитый','p'=>-3);$m = -3;
- if ($line == 2) $scores[] = array('atype'=>10,'type'=>1,'caption'=>'Пенальти не забитый','p'=>-3);$m = -3;
- if ($line == 3) $scores[] = array('atype'=>10,'type'=>1,'caption'=>'Пенальти не забитый','p'=>-3);$m = -3;
- }
- $m = 0;
- // пенальти отраженный (если пенальти не забитый, а я вратарь, команда не забившая пенальти не моя и я в это время был на воротах, то видимо я и отбил
- if ($vA['type'] == 7 and $line==0 and $player['tid'] != $vA['tid'] and ($vA['min']>=$player['in'] and $vA['min']<=$player['out']))
- {
- if ($line == 0) $scores[] = array('atype'=>12,'type'=>1,'caption'=>'Пенальти отраженный','p'=>2);
- }
- $p = $p + $m;
- }
- }
- if (!$komanda_zabila) // команда не забила
- {
- if ($line == 0) $scores[] = array('type'=>1,'caption'=>'Команда не забила','p'=>0);
- if ($line == 1) $scores[] = array('type'=>1,'caption'=>'Команда не забила','p'=>0);
- if ($line == 2) $scores[] = array('type'=>1,'caption'=>'Команда не забила','p'=>-1);
- if ($line == 3) $scores[] = array('type'=>1,'caption'=>'Команда не забила','p'=>-2);
- }
- if (!$komanda_propustila) // команда не пропустила
- {
- if ($line == 0) $scores[] = array('type'=>1,'caption'=>'Команда не пропустила','p'=>3);
- if ($line == 1) $scores[] = array('type'=>1,'caption'=>'Команда не пропустила','p'=>3);
- if ($line == 2) $scores[] = array('type'=>1,'caption'=>'Команда не пропустила','p'=>1.5);
- }
- if ($goals>=3) // хеттрик
- {
- // if ($line == 0) $scores[] = array('type'=>1,'caption'=>'Пенальти','p'=>2);$p = $p + 0;
- if ($line == 1) $scores[] = array('type'=>1,'caption'=>'Хеттрик','p'=>5);
- if ($line == 2) $scores[] = array('type'=>1,'caption'=>'Хеттрик','p'=>4);
- if ($line == 3) $scores[] = array('type'=>1,'caption'=>'Хеттрик','p'=>3);
- }
- if ($jocker) $data[$player['id']]["jocker"] = 1;
- if ($line == 0)
- {
- $out = $player['out'];
- $in = $player['in'];
- if ($out>90) $out = 90;
- if ($in>90) $in = 90;
- if ($status == 1)
- {
- $saves = self::gauss( ( ($res['shots2']-$res['score2']) * ($out - $in) ) / (90) );
- $scores[] = array('atype'=>11,'acount'=>$saves,'type'=>2,'caption'=>'Удары в створ(отраженные) - '.$saves,'p'=>(0.4*($saves)));
- }
- if ($status == 2)
- {
- $saves = self::gauss( ( ($res['shots1']-$res['score1']) * ($out - $in) ) / (90) );
- $scores[] = array('atype'=>11,'acount'=>$saves,'type'=>2,'caption'=>'Удары в створ(отраженные) - '.($saves),'p'=>(0.4*($saves)));
- }
- }
- $out = $player['out'];
- $in = $player['in'];
- if ($out>90) $out = 90;
- if ($in>90) $in = 90;
- $scores[] = array('atype'=>3,'type'=>2,'caption'=>'Выход на поле','p'=>0);
- if ( ($out - $in) <20 ) $scores[] = array('type'=>2,'caption'=>'Количество минут на поле меньше 20','p'=>-1); // количество минут на поле меньше 20
- $data[$player['id']]['line'] = $line;
- $data[$player['id']]['p'] = $scores;
- $points1 = 0;
- $points2 = 0;
- if ($scores[0]['type'])
- {
- foreach ($scores as $kss=>$vss)
- {
- if ($vss['type'] == 1) $points1 = $points1 + $vss['p'];
- if ($vss['type'] == 2) $points2 = $points2 + $vss['p'];
- }
- }
- $data[$player['id']]['points1'] = $points1; // очки до подсчета серийности, умножения на коэфициенты и джокера
- if ($jocker) $points1 = 1.5 * $points1;
- $data[$player['id']]['points2'] = $points1; // очки до подсчета серийности, умножения на коэфициенты но с подсчетом джокера
- $data[$player['id']]['points3'] = $points2; // очки за мало времени на поле и отбитые мячи
- // серийность, добавление в базу серий и обновление количества матчей в уже активных сериях
- // серии вратарей
- if ($line == 0)
- {
- // серийный суперкипер
- if ($saves>5)
- {
- $series[] = self::serieDo($player['id'],$match->lid,2,$match->id);
- }
- else
- {
- $series[] = self::serieUnDo($player['id'],$match->lid,2,$match->id);
- }
- }
- // серия сухий матчей (не для напов)
- if (!$komanda_propustila and $line!=3)
- {
- if ($line == 0) $serie = 1;
- if ($line == 1) $serie = 3;
- if ($line == 2) $serie = 6;
- $series[] = self::serieDo($player['id'],$match->lid,$serie,$match->id);
- }
- else
- {
- if ($line!=3)
- {
- if ($line == 0) $serie = 1;
- if ($line == 1) $serie = 3;
- if ($line == 2) $serie = 6;
- $series[] = self::serieUnDo($player['id'],$match->lid,$serie,$match->id);
- }
- }
- // серия голов
- if ($goals>0)
- {
- if ($line == 1) $serie = 4;
- if ($line == 2) $serie = 7;
- if ($line == 3) $serie = 9;
- if ($line!=0)
- $series[] = self::serieDo($player['id'],$match->lid,$serie,$match->id);
- } else
- {
- if ($line == 1) $serie = 4;
- if ($line == 2) $serie = 7;
- if ($line == 3) $serie = 9;
- if ($line!=0)
- $series[] = self::serieUnDo($player['id'],$match->lid,$serie,$match->id);
- }
- // серия передач
- if ($asist>0)
- {
- if ($line == 1) $serie = 5;
- if ($line == 2) $serie = 8;
- if ($line == 3) $serie = 10;
- if ($line!=0)
- $series[] = self::serieDo($player['id'],$match->lid,$serie,$match->id);
- } else
- {
- if ($line == 1) $serie = 5;
- if ($line == 2) $serie = 8;
- if ($line == 3) $serie = 10;
- if ($line!=0)
- $series[] = self::serieUnDo($player['id'],$match->lid,$serie,$match->id);
- }
- // серии на желтые и красные карточки
- if ($yellow and !$red)
- {
- $series[] = self::serieDo($player['id'],$match->lid,11,$match->id);
- } else
- {
- $series[] = self::serieUnDo($player['id'],$match->lid,11,$match->id);
- }
- if ($red)
- {
- $series[] = self::serieDo($player['id'],$match->lid,12,$match->id);
- }
- else
- {
- $series[] = self::serieUnDo($player['id'],$match->lid,12,$match->id);
- }
- $activeSeries = self::getSeries($series,$player['id'],$match->lid);
- $data[$player['id']]['series'] = $activeSeries;
- $points4 = 0;
- if ($activeSeries)
- {
- foreach ($activeSeries as $keySerie=>$valueSerie)
- {
- if ($valueSerie['id'])
- {
- $mcount = $valueSerie['match'];
- switch ($valueSerie['type'])
- {
- case '1':
- {
- if ($mcount == 2) $points4 = $points4 + 1;
- if ($mcount == 3) $points4 = $points4 + 2;
- if ($mcount == 4) $points4 = $points4 + 3;
- if ($mcount >= 5) $points4 = $points4 + 4;
- break;
- }
- case '2':
- {
- if ($mcount == 2) $points4 = $points4 + (0.2*$saves);
- if ($mcount == 3) $points4 = $points4 + (0.3*$saves);
- if ($mcount >= 4) $points4 = $points4 + (0.4*$saves);
- break;
- }
- case '3':
- {
- if ($mcount == 2) $points4 = $points4 + 1;
- if ($mcount == 3) $points4 = $points4 + 2;
- if ($mcount == 4) $points4 = $points4 + 3;
- if ($mcount >= 5) $points4 = $points4 + 4;
- break;
- }
- case '4':
- {
- if ($mcount == 2) $points4 = $points4 + 2;
- if ($mcount == 3) $points4 = $points4 + 3;
- if ($mcount == 4) $points4 = $points4 + 4;
- if ($mcount >= 5) $points4 = $points4 + 5;
- break;
- }
- case '5':
- {
- if ($mcount == 2) $points4 = $points4 + 1.5;
- if ($mcount == 3) $points4 = $points4 + 2;
- if ($mcount == 4) $points4 = $points4 + 2.5;
- if ($mcount >= 5) $points4 = $points4 + 3;
- break;
- }
- case '6':
- {
- if ($mcount == 2) $points4 = $points4 + 0.5;
- if ($mcount == 3) $points4 = $points4 + 1;
- if ($mcount == 4) $points4 = $points4 + 1.5;
- if ($mcount >= 5) $points4 = $points4 + 2;
- break;
- }
- case '7':
- {
- if ($mcount == 2) $points4 = $points4 + 1;
- if ($mcount == 3) $points4 = $points4 + 2;
- if ($mcount == 4) $points4 = $points4 + 3;
- if ($mcount >= 5) $points4 = $points4 + 4;
- break;
- }
- case '8':
- {
- if ($mcount == 2) $points4 = $points4 + 1;
- if ($mcount == 3) $points4 = $points4 + 2.5;
- if ($mcount == 4) $points4 = $points4 + 4;
- if ($mcount >= 5) $points4 = $points4 + 5;
- break;
- }
- case '9':
- {
- if ($mcount == 2) $points4 = $points4 + 1;
- if ($mcount == 3) $points4 = $points4 + 2.5;
- if ($mcount == 4) $points4 = $points4 + 4;
- if ($mcount >= 5) $points4 = $points4 + 5;
- break;
- }
- case '10':
- {
- if ($mcount == 2) $points4 = $points4 + 1;
- if ($mcount == 3) $points4 = $points4 + 1.5;
- if ($mcount == 4) $points4 = $points4 + 2;
- if ($mcount >= 5) $points4 = $points4 + 2.5;
- break;
- }
- case '11':
- {
- if ($mcount == 2) $points4 = $points4 - 1;
- if ($mcount == 3) $points4 = $points4 - 2;
- if ($mcount == 4) $points4 = $points4 - 3;
- if ($mcount >= 5) $points4 = $points4 - 4;
- break;
- }
- case '12':
- {
- if ($mcount == 2) $points4 = $points4 - 5;
- if ($mcount >= 3) $points4 = $points4 - 7;
- break;
- }
- }
- }
- }
- }
- $data[$player['id']]['points4'] = $points4; // очки за серийность
- $data[$player['id']]['sum'] = $points1+$points2+$points4; // очки суммарно
- unset($scores);
- }
- }
- $match->series = serialize($series);
- $match->save();
- // проставить -1 очко тем кто не играл
- foreach ($team1AllPlayers as $keyPlayer=>$valuePlayer)
- {
- if (!$valuePlayer['in_match'])
- {
- $clearPointsArray['id'] = $valuePlayer['id'];
- $clearPointsArray['line'] = $valuePlayer['line'];
- $clearPointsArray['points1'] = -1;
- $clearPointsArray['points2'] = 0;
- $clearPointsArray['points3'] = 0;
- $clearPointsArray['points4'] = 0;
- $clearPointsArray['sum'] = -1;
- $clearPointsArray['p'] = array(0=>array('atype'=>42,'type'=>1,'caption'=>'Не играл','p'=>-1));
- $data[$valuePlayer['id']] = $clearPointsArray;
- }
- }
- foreach ($team2AllPlayers as $keyPlayer=>$valuePlayer)
- {
- if (!$valuePlayer['in_match'])
- {
- $clearPointsArray['id'] = $valuePlayer['id'];
- $clearPointsArray['line'] = $valuePlayer['line'];
- $clearPointsArray['points1'] = -1;
- $clearPointsArray['points2'] = 0;
- $clearPointsArray['points3'] = 0;
- $clearPointsArray['points4'] = 0;
- $clearPointsArray['sum'] = -1;
- $clearPointsArray['p'] = array(0=>array('atype'=>42,'type'=>1,'caption'=>'Не играл','p'=>-1));
- $data[$valuePlayer['id']] = $clearPointsArray;
- }
- }
- return $data;
- } else return false;
- }
- private static function getSeries($seriesArray,$pid,$lid)
- {
- if ($seriesArray)
- {
- foreach ($seriesArray as $keySeries=>$valueSeries)
- {
- if ($valueSeries['pid'] == $pid and $valueSeries['id'] != 'new' and $valueSeries['active'] and $valueSeries['match']>1)
- {
- $returnArray[] = $valueSeries;
- }
- }
- return $returnArray;
- } else return false;
- }
- // округление по гауcсу (к ближайшему, кроме случая когда после точки 5; тогда округление идет к ближайшему четному (4.4 => 4, 4.6 => 5, 4.5 => 4, 5.5 => 6)
- private static function gauss($r)
- {
- if ( ($r - floor($r)) > 0.5 ) return ceil($r);
- if ( ($r - floor($r)) < 0.5 ) return floor($r);
- if ( ($r - floor($r)) == 0.5 )
- {
- if (floor($r) % 2 == 0) return floor($r);
- if (ceil($r) % 2 == 0) return ceil($r);
- }
- }
- // прервать серию
- private static function serieUnDo($pid,$lid,$type,$matchId)
- {
- $checkRow = ORM::for_table('serie')->where('pid',$pid)->where('lid',$lid)->where('type',$type)->where('active',1)->find_one();
- if ($checkRow->id)
- {
- $tempSerie['id'] = $checkRow->id;
- $tempSerie['active'] = 0;
- $tempSerie['last_mid'] = $matchId;
- $tempSerie['match'] = $checkRow->match;
- $tempSerie['type'] = $checkRow->type;
- $tempSerie['pid'] = $pid;
- return $tempSerie;
- /* $checkRow->active = 0;
- $checkRow->last_mid = $matchId;
- $checkRow->save(); */
- return true;
- }
- return false;
- }
- // продолжить серию на один матч или создать новую серию если нету
- private static function serieDo($pid,$lid,$type,$matchId)
- {
- $checkRow = ORM::for_table('serie')->where('pid',$pid)->where('lid',$lid)->where('type',$type)->where('active',1)->find_one();
- if ($checkRow->id)
- {
- if ($checkRow->last_mid != $matchId) // проверка чтобы серия за один матч два раза случайно не засчиталась
- {
- $tempSerie['id'] = $checkRow->id;
- $tempSerie['last_mid'] = $matchId;
- $tempSerie['pid'] = $pid;
- $tempSerie['active'] = 1;
- $tempSerie['match'] = $checkRow->match + 1;
- $tempSerie['type'] = $checkRow->type;
- return $tempSerie;
- /* $checkRow->match = $checkRow->match + 1;
- $checkRow->last_mid = $matchId;
- $checkRow->save(); */
- }
- } else
- {
- $tempSerie['id'] = 'new';
- $tempSerie['pid'] = $pid;
- $tempSerie['lid'] = $lid;
- $tempSerie['type'] = $type;
- $tempSerie['last_mid'] = $matchId;
- $tempSerie['active'] = 1;
- $tempSerie['match'] = 1;
- return $tempSerie;
- /* $newRow = ORM::for_table('serie')->create();
- $newRow->pid = $pid;
- $newRow->lid = $lid;
- $newRow->type = $type;
- $newRow->last_mid = $matchId;
- $newRow->active = 1;
- $newRow->match = 1;
- $newRow->save(); */
- }
- return true;
- }
- private static function minp($min)
- {
- if (strpos($min,'+'))
- {
- return (substr($min,0,strpos($min,'+')) + substr($min,strpos($min,'+')+1));
- } else return $min;
- }
- public static function getMatchResult($id)
- {
- $match = ORM::for_table('match')->where('id',$id)->find_one();
- if ($match->championat_url)
- {
- set_time_limit(120);
- $content = file_get_contents($match->championat_url);
- // result
- preg_match_all('|<div class="match__count__main">(.*?) : (.*?)<\/div>|sei',$content,$t1);
- preg_match('|<div class="match__count__status">(.*?)<br><\/div>|',$content,$t2);
- $data['status'] = $t2[1];
- $data['score1'] = $t1[1][0];
- $data['score2'] = $t1[2][0];
- preg_match('|tab-stats(.*?)tab-text-all|sei',$content,$stat);
- preg_match('|Голы<\/div>(.*)<div class="match__tab__head">|seiU',$stat[1],$arr['score']);
- preg_match('|Ассистенты<\/div>(.*)<div class="match__tab__head">|seiU',$stat[1],$arr['asist']);
- preg_match('|Наказания<\/div>(.*)<div class="match__tab__head">|seiU',$stat[1],$arr['cards']);
- preg_match('|Незабитые пенальти<\/div>(.*)<div class="match__tab__head">|seiU',$stat[1],$arr['no_penalty']);
- preg_match('|id="tab-combination">(.*)<div class="match__table__head">Запасные|seiU',$content,$arr['line']);
- $stat[1] .= '<div class="match-section__sec">овечка</div>';
- preg_match('|Статистика<\/div>(.*)<div class="match-section__sec">|seiU',$stat[1],$arr['stat']);
- // $arr['line'][1] .= '<div class="in-out">';
- preg_match_all('|<tr>(.*)<\/tr>|seiU',$arr['line'][0],$t3); // состав
- if ($t3[1][0])
- {
- $team_id = $match->team1;
- $next_change = false;
- foreach ($t3[1] as $kP=>$vP)
- {
- if ($next_change) $team_id = $match->team2; // первая табличка с составом прошла, теперь вторая команда
- if (strpos($vP,'"Голоса"') and $kP!=0) { $next_change = true;}
- preg_match('|player/(.*).html|seiU',$vP,$t4);
- preg_match('|_in.*/>(.*)</div>|seiU',$vP,$t5);
- preg_match('|_out.*/>(.*)</div>|seiU',$vP,$t6);
- unset($elLine);
- if ($t4[1])
- {
- $elLine['championat_id'] = $t4[1];
- $player = ORM::for_table('players')->where('championat_id',$t4[1])->find_one();
- if ($player->id)
- {
- $elLine['fio'] = $player->fio_full;
- $elLine['id'] = $player->id;
- $teams[$player->id] = $team_id;
- $elLine['tid'] = $team_id;
- }
- if ($t5[1]) $elLine['in'] = self::minp(trim(substr($t5[1],2))); else $elLine['in'] = 0;
- if ($t6[1]) $elLine['out'] = self::minp(trim(substr($t6[1],2))); else $elLine['out'] = 300;
- }
- if ($elLine)
- $line[] = $elLine;
- }
- $data['lineup'] = $line;
- }
- // print_r($arr['stat']); die();
- // $arr['stat'][1] = str_replace('<div class="row">','<азаза><озозо>',$arr['stat'][1]);
- // $arr['stat'][1] .= '<озозо>';
- // preg_match_all('|<озозо>(.*)<азаза>|seiU',$arr['stat'][1],$t3);
- if ($arr['stat'][0])
- {
- $actualSection = substr($arr['stat'][0],strpos($arr['stat'][0],'Удары в створ')-300,350);
- preg_match('|left">(.*)</div>.*right"> (.*)</div>|seiU',$actualSection,$t4);
- if (isset($t4[1])) $data['shots1'] = $t4[1];
- if (isset($t4[2])) $data['shots2'] = $t4[2];
- }
- if ($arr['cards'][1]) // наказания!!111
- {
- $arr['cards'][1] .= 'match__stat__row';
- preg_match_all('|<div class="match__stat__row(.*)<\/a>|seiU',$arr['cards'][1],$t3);
- if ($t3[1][0])
- {
- foreach ($t3[1] as $kAction=>$vAction)
- {
- $k = "'";
- preg_match_all('|minute">(.*)<\/div>.*match_icon_(.*).png".*player/(.*)\.html">(.*),.*|seiU',$vAction,$t4);
- if ($t4[1][0])
- {
- if (strpos($t4[1][0],"'")) $t4[1][0] = substr($t4[1][0],0,strpos($t4[1][0],"'"));
- $nArray['min'] = self::minp($t4[1][0]);
- $nArray['championat_id'] = $t4[3][0];
- $player = ORM::for_table('players')->where('championat_id',$t4[3][0])->find_one();
- if ($player->id)
- {
- $nArray['id'] = $player->id;
- $nArray['tid'] = $teams[$player->id];
- $player->fio = trim($t4[4][0]);
- $player->save();
- }
- $nArray['fio'] = $t4[4][0];
- if ($t4[2][0] == 'red') { foreach ($data['lineup'] as $kl=>$vl) { if ($vl['id'] == $player->id) {$data['lineup'][$kl]['out'] = trim($t4[1][0]);}} $nArray['type'] = 5; $nArray['captiontype'] = "Красная"; } // Красная
- if ($t4[2][0] == 'yellow') { $nArray['type'] = 6; $nArray['captiontype'] = "Желтая"; } // Желтая
- if ($t4[2][0] == 'yellow2') { foreach ($data['lineup'] as $kl=>$vl) { if ($vl['id'] == $player->id) {$data['lineup'][$kl]['out'] = trim($t4[1][0]);}} $nArray['type'] = 5; $nArray['captiontype'] = "Красная (вторая желтая)"; } // Красная вторая
- $data['actions'][] = $nArray;
- unset($nArray);
- }
- }
- }
- }
- if ($arr['no_penalty'][1]) // незабитый!!111
- {
- $arr['no_penalty'][1] .= 'match__stat__row';
- preg_match_all('|<div class="match__stat__row(.*)<\/a>|seiU',$arr['no_penalty'][1],$t3);
- if ($t3[1][0])
- {
- foreach ($t3[1] as $kAction=>$vAction)
- {
- $k = "'";
- preg_match_all('|minute">(.*)'.$k.'<\/div>.*player/(.*)\.html">(.*),.*|seiU',$vAction,$t4);
- if ($t4[1][0])
- {
- $nArray['min'] = self::minp($t4[1][0]);
- $nArray['championat_id'] = $t4[2][0];
- $player = ORM::for_table('players')->where('championat_id',$t4[2][0])->find_one();
- if ($player->id)
- {
- $nArray['id'] = $player->id;
- $nArray['tid'] = $teams[$player->id];
- $player->fio = trim($t4[3][0]);
- $player->save();
- }
- $nArray['fio'] = $t4[3][0];
- $nArray['type'] = 7; // незабитый
- $nArray['captiontype'] = "Незабитый пенальти";
- $data['actions'][] = $nArray;
- unset($nArray);
- }
- }
- }
- }
- if ($arr['asist'][1]) // асисты!!111
- {
- $arr['asist'][1] .= 'match__stat__row';
- preg_match_all('|<div class="match__stat__row(.*)<\/a>|seiU',$arr['asist'][1],$t3);
- if ($t3[1][0])
- {
- foreach ($t3[1] as $kAction=>$vAction)
- {
- $k = "'";
- preg_match_all('|minute">(.*)'.$k.'<\/div>.*player/(.*)\.html">(.*),.*|seiU',$vAction,$t4);
- if ($t4[1][0])
- {
- $nArray['min'] = self::minp($t4[1][0]);
- $nArray['championat_id'] = $t4[2][0];
- $player = ORM::for_table('players')->where('championat_id',$t4[2][0])->find_one();
- if ($player->id)
- {
- $nArray['id'] = $player->id;
- $nArray['tid'] = $teams[$player->id];
- $player->fio = trim($t4[3][0]);
- $player->save();
- }
- $nArray['fio'] = $t4[3][0];
- $nArray['type'] = 4; // асист
- $nArray['captiontype'] = "Асист";
- $data['actions'][] = $nArray;
- unset($nArray);
- }
- }
- }
- }
- if ($arr['score'][1]) // ГОЛЫ!!111
- {
- $arr['score'][1] .= 'match__stat__row';
- preg_match_all('|<div class="match__stat__row(.*)<\/a>|seiU',$arr['score'][1],$t3);
- if ($t3[1][0])
- {
- foreach ($t3[1] as $kAction=>$vAction)
- {
- $k = "'";
- preg_match_all('|minute">(.*)'.$k.'<\/div>.*match__score (.*)">.*player/(.*)\.html">(.*),.*|seiU',$vAction,$t4);
- if ($t4[1][0])
- {
- $nArray['min'] = self::minp($t4[1][0]);
- $nArray['championat_id'] = $t4[3][0];
- $player = ORM::for_table('players')->where('championat_id',$t4[3][0])->find_one();
- if ($player->id)
- {
- $nArray['id'] = $player->id;
- $nArray['tid'] = $teams[$player->id];
- $player->fio = trim($t4[4][0]);
- $player->save();
- }
- $nArray['fio'] = $t4[4][0];
- if ($t4[2][0] == '_goal') { $nArray['type'] = 1; $nArray['captiontype'] = "Гол"; } // гол
- if ($t4[2][0] == '_pen') { $nArray['type'] = 2; $nArray['captiontype'] = "Гол с пенальти"; } // гол с пенальти
- if ($t4[2][0] == '_own') { $nArray['type'] = 3; $nArray['captiontype'] = "Автогол"; } // автогол
- $data['actions'][] = $nArray;
- unset($nArray);
- }
- }
- }
- }
- return $data;
- } else return false;
- }
- private static function getLeagueMainData($mainUrl)
- {
- // <a class="sport__menu__i button" href="/football/_russiapl/748/teams.html">Команды</a>
- // <a class="sport__menu__i button" href="/football/_russiapl/748/calendar/tour.html">Календарь игр</a>
- //<h1 class="sport__head__title">РФПЛ</h1>
- set_time_limit(120);
- $content = file_get_contents($mainUrl);
- preg_match('|<a.*?href="(.*?)">Команды<\\/a>|',$content,$t1);
- preg_match('|<a.*?href="(.*?)">Календарь игр<\/a>|',$content,$t2);
- preg_match('/[\d]+/sei',$t1[1],$t3);
- preg_match('|<h1.*?>(.*?)<\/h1>|sei',$content,$t4);
- if (!$t4[1]) $t4[1] = 'Чемпионат';
- if ($t1[1] and $t2[1])
- {
- return array(
- "url_teams"=>"http://www.championat.com".$t1[1],
- "url_calendar"=>"http://www.championat.com".$t2[1],
- "id"=>$t3[0],
- "caption"=>$t4[1]
- );
- } else return false;
- }
- public static function getMatches($type,$trunc = true)
- {
- $league = ORM::for_table('leagues')->where('type',$type)->where('active',1)->find_one();
- $parsing = json_decode($league->parsing,true);
- if ($parsing['calendar'])
- {
- set_time_limit(120);
- $content = file_get_contents($parsing['calendar']);
- $modifiedContent = str_replace('<div class="sport__date">','razdvatri42o<div class="sport__date">',$content);
- // echo $modifiedContent; die();
- preg_match_all('|<div class="sport__date">(.*)razdvatri42o|seiU', $modifiedContent, $tours);
- $lastTour = substr($modifiedContent,strripos($modifiedContent,'<div class="sport__date"')); //последний тур регулярка не охватывает, это костыли
- $lastTour = substr($lastTour,strpos($lastTour,'>')+1); // костыли на последний тур, продолжение
- $tours[1][] = $lastTour;
- // print_r($tours);
- // die();
- $lastWeek = -99;
- $tour = 0;
- if ($tours[1][0])
- {
- foreach ($tours[1] as $keySection=>$valueSection)
- {
- preg_match_all('|(.*)<\/div>|seiU',$valueSection,$t1); // чисто даты игр
- preg_match_all("|result\.html'>(.*)<\/a>.*result\.html'>(.*)<\/a>.*match/(.*).html'|seiU",$valueSection,$t2); // данные по матчам
- // print_r($t2);
- $calendarItem['date'] = trim($t1[1][0]);
- // тур со вторник по понедельник
- $time = substr($calendarItem['date'],0,strpos($calendarItem['date'],',')-1);
- $arr = explode(' ',$time);
- if ($arr[0] and $arr[1] and $arr[2])
- {
- switch ($arr[1])
- {
- case 'января': { $arr[1]='01'; break;}
- case 'февраля': { $arr[1]='02'; break;}
- case 'марта': { $arr[1]='03'; break;}
- case 'апреля': { $arr[1]='04'; break;}
- case 'мая': { $arr[1]='05'; break;}
- case 'июня': { $arr[1]='06'; break;}
- case 'июля': { $arr[1]='07'; break;}
- case 'августа': { $arr[1]='08'; break;}
- case 'сентября': { $arr[1]='09'; break;}
- case 'октября': { $arr[1]='10'; break;}
- case 'ноября': { $arr[1]='11'; break;}
- case 'декабря': { $arr[1]='12'; break;}
- }
- $dtf = $arr[0].".".$arr[1].".".$arr[2];
- }
- $time = strtotime($dtf);
- $calendarItem['mysql_date'] = date('Y-m-d',$time);
- $time = $time - 60*60*24;
- if (date('W',$time)!=$lastWeek)
- {
- $tour++;
- $lastWeek = date('W',$time);
- }
- $calendarItem['tour'] = $tour;
- if ($t2[1][0] and $t2[2][0] and $t2[3][0])
- {
- foreach ($t2[1] as $keyMatch=>$valueMatch)
- {
- $calendarItem['team1'] = $t2[1][$keyMatch];
- $calendarItem['team2'] = $t2[2][$keyMatch];
- $calendarItem['championat_id'] = $t2[3][$keyMatch];
- $calendar[] = $calendarItem;
- }
- }
- }
- if ($calendar[0]['team1'])
- {
- foreach ($calendar as $keyCal=>$valueCal)
- {
- $check = ORM::for_table('match')->where('championat_id',$valueCal['championat_id'])->find_one();
- if (!$check->id)
- {
- $team1 = ORM::for_table('teams')->where_like('caption','%'.$valueCal['team1'].'%')->find_one();
- if (!$team1->id) $team1 = ORM::for_table('teams')->where_like('captions','%'.$valueCal['team1'].'|%')->find_one();
- $team2 = ORM::for_table('teams')->where_like('caption','%'.$valueCal['team2'].'%')->find_one();
- if (!$team2->id) $team2 = ORM::for_table('teams')->where_like('captions','%'.$valueCal['team2'].'|%')->find_one();
- if (!$team1->id or !$team2->id)
- {
- Log::msg('При добавлении матчей мы не смогли найти команду, может они как по другому называются в турнире, обновите синонимы. '.$valueCal['team1'].' или '.$valueCal['team2'],true);
- } else
- {
- $newRow = ORM::for_table('match')->create();
- $newRow->team1 = $team1->id;
- $newRow->team2 = $team2->id;
- $newRow->lid = $league->id;
- $newRow->date = $valueCal['mysql_date'];
- $newRow->championat_id = $valueCal['championat_id'];
- $newRow->championat_url = "http://www.championat.com/".Cnst::get($type.'Prefix')."/".$league->championat_id."/match/".$valueCal['championat_id'].".html";
- $newRow->tour = $valueCal['tour'];
- $newRow->save();
- }
- } else { Log::msg('Матч уже есть в базе '.$valueCal['team1'].' '.$valueCal['team2']);}
- }
- }
- // print_r($calendar);
- // die();
- return true;
- }
- }
- }
- public static function getParseLineUp($team_id)
- {
- $teamRow = ORM::for_table('teams')->where('id',$team_id)->find_one();
- if ($teamRow->id)
- {
- $parsing = json_decode($teamRow->parsing,true);
- if ($parsing['lineup'])
- {
- $content = file_get_contents($parsing['lineup']);
- preg_match("|<table class='table b-table-sortlist'>(.*?)Отзаявлены|sei", $content, $t0);
- if (!$t0[0]) $t0[0] = $content;
- preg_match_all("|<tr class=.*?<a href='.*?\/player/(.*?)\.html'>(.*?)</a>.*?</tr>|sei",$t0[0],$t1);
- if ($t1[1][0])
- {
- foreach ($t1[1] as $keyPlayer=>$valuePlayer)
- {
- $line = -1; // хуй знает кто
- if (strpos($t1[0][$keyPlayer],'нападающий')) $line = 3;
- if (strpos($t1[0][$keyPlayer],'защитник')) $line = 1; //
- if (strpos($t1[0][$keyPlayer],'полузащитник')) $line = 2; // местами не менять, а то все защитниками станут
- if (strpos($t1[0][$keyPlayer],'вратарь')) $line = 0;
- $checkDb = ORM::for_table('players')->where('championat_id',$valuePlayer)->find_one();
- if ($checkDb->id)
- {
- if ($checkDb->team_id != $team_id) // у игрока поменялась команда
- {
- $checkDb->team_id = $team_id;
- $checkDb->save();
- Log::msg("У игрока ".$t1[2][$keyPlayer]." (id:".$checkDb->id.") меняем команду");
- }
- if ($checkDb->line != $line) // игрок сменил амплуа, лол
- {
- $checkDb->line = $line;
- $checkDb->save();
- Log::msg("У игрока ".$t1[2][$keyPlayer]." (id:".$checkDb->id.") меняем амплуа");
- }
- } else
- {
- $newPlayerRow = ORM::for_table('players')->create();
- $newPlayerRow->fio_full = $t1[2][$keyPlayer];
- $newPlayerRow->team_id = $team_id;
- $newPlayerRow->line = $line;
- $newPlayerRow->championat_id = $valuePlayer;
- $newPlayerRow->save();
- Log::msg("Добавляем игрока ".$t1[2][$keyPlayer]." в базу");
- }
- }
- $notInTeamNow = ORM::for_table('players')->where_not_in('championat_id', $t1[1])->where('team_id',$team_id)->find_result_set()->set('team_id',0)->save(); // покинули команду
- }
- }
- } else return 0;
- }
- public static function getTeamsByLeague($type,$players=true)
- {
- $league = ORM::for_table('leagues')->where('type',$type)->where('active',1)->find_one();
- $parsing = json_decode($league->parsing,true);
- if ($parsing['teams'])
- {
- $content = file_get_contents($parsing['teams']);
- preg_match('|<table class.*?table sport__tiles.*?>(.*?)<\/table>|sei', $content, $t1);
- preg_match_all("|<a href='(.*?)\/result\.html'.*?class.*?sport__tiles__i.*?>.*?<strong>(.*?)<\/strong>.*?<\/a>|sei", $t1[1], $t2);
- if ($t2[1][0])
- {
- foreach ($t2[1] as $keyTeam=>$valueTeam)
- {
- $championat_id = substr($valueTeam,strripos($valueTeam,'/')+1);
- $checkDb = ORM::for_table('teams')->where_like('caption','%'.$t2[2][$keyTeam].'%')->find_one();
- if ($checkDb->id)
- {
- if ($type!='le' and $type!='lc') // для лиги европы и лч не меняем урл парсинга состава - в этих турнирах составы не полные, оставляем урлы от лиг стран
- {
- $checkDb->parsing = '{"lineup":"http://www.championat.com'.$t2[1][$keyTeam].'/players.html"}';
- $checkDb->save();
- }
- Log::msg('Попытка добавить команду в базу: команда уже есть, хотели добавить : '.$t2[2][$keyTeam].', в базе '.$checkDb->caption.'(id:'.$checkDb->id.')');
- $checkConnection = ORM::for_table('teams_in_leagues')->where('id_team',$checkDb->id)->where('id_league',$league->id)->find_one();
- if (!$checkConnection->id)
- {
- $newConnectionRow = ORM::for_table('teams_in_leagues')->create();
- $newConnectionRow->id_team = $checkDb->id;
- $newConnectionRow->id_league = $league->id;
- $newConnectionRow->championat_id = $championat_id;
- $newConnectionRow->save();
- Log::msg('Добавили связь команды '.$checkDb->caption.'(id:'.$checkDb->id.') и лиги '.$league->caption.'(id:'.$league->id.',championat_id:'.$league->championat_id.')');
- } else
- {
- Log::msg('Команда '.$checkDb->caption.' (id:'.$checkDb->id.') уже играет в лиге '.$league->caption.' (id:'.$league->id.')');
- }
- $team_id = $checkDb->id;
- }
- else
- {
- Log::msg('Пытаемся добавить команду в базу: '.$t2[2][$keyTeam].'. Прямого вхождения названия не нашли, попробуем поискать в синонимах команд');
- $checkSynDb = ORM::for_table('teams')->where_like('captions','%'.$t2[2][$keyTeam].'|%')->find_one();
- if ($checkSynDb->id)
- {
- if ($type!='le' and $type!='lc') // для лиги европы и лч не меняем урл парсинга состава - в этих турнирах составы не полные, оставляем урлы от лиг стран
- {
- $checkSynDb->parsing = '{"lineup":"http://www.championat.com'.$t2[1][$keyTeam].'/players.html"}';
- $checkSynDb->save();
- }
- Log::msg('Команда найдена в синонимах, искали '.$t2[2][$keyTeam].', нашли '.$checkSynDb->caption);
- $checkConnection = ORM::for_table('teams_in_leagues')->where('id_team',$checkSynDb->id)->where('id_league',$league->id)->find_one();
- if (!$checkConnection->id)
- {
- $newConnectionRow = ORM::for_table('teams_in_leagues')->create();
- $newConnectionRow->id_team = $checkSynDb->id;
- $newConnectionRow->id_league = $league->id;
- $newConnectionRow->championat_id = $championat_id;
- $newConnectionRow->save();
- Log::msg('Добавили связь команды '.$checkSynDb->caption.'(id:'.$checkSynDb->id.') и лиги '.$league->caption.'(id:'.$league->id.',championat_id:'.$league->championat_id.')');
- }
- $team_id = $checkSynDb->id;
- } else
- {
- Log::msg('В синонимах тоже команды нет, сейчас будем первый раз добавлять команду в базу');
- $newTeam = ORM::for_table('teams')->create();
- $newTeam->caption = $t2[2][$keyTeam];
- $newTeam->captions = $t2[2][$keyTeam]."|";
- $newTeam->parsing = '{"lineup":"http://www.championat.com'.$t2[1][$keyTeam].'/players.html"}';
- $newTeam->championat_id = 0;
- $newTeam->save();
- Log::msg('Добавили команду в базу, id : '.$newTeam->id);
- $team_id = $newTeam->id;
- $newConnectionRow = ORM::for_table('teams_in_leagues')->create();
- $newConnectionRow->id_team = $newTeam->id;
- $newConnectionRow->id_league = $league->id;
- $newConnectionRow->championat_id = $championat_id;
- $newConnectionRow->save();
- Log::msg('Добавили связь команды '.$newTeam->caption.'(id:'.$newTeam->id.') и лиги '.$league->caption.'(id:'.$league->id.',championat_id:'.$league->championat_id.')');
- }
- }
- self::getParseLineUp($team_id);
- }
- } else Log::msg('При парсинге данных (команды лиги) регулярка не вернула список команд. Возможно чемпионат.ком поменялся',true);
- } else Log::msg('Нет адреса для парсинга команд лиги. Возможно чемпионат.ком поменялся',true);
- }
- public static function getPlayerFullName($id,$leagueChampionatId)
- {
- $playerRow = ORM::for_table('players')->where('id',$id)->find_one();
- if (!$playerRow->championat_id) return true;
- $url = "http://www.championat.com/".Cnst::get('ruPrefix')."/".$leagueChampionatId."/player/".$playerRow->championat_id.".html";
- $content = file_get_contents($url);
- $kv = "'";
- preg_match_all('|<div class="sport__info__image">.*alt='.$kv.'(.*)'.$kv.'|seiU', $content, $r1);
- if ($r1[1][0])
- $playerRow->fio = $r1[1][0];
- $playerRow->save();
- return true;
- }
- public static function getLeaguePlayersFullNames($id_league)
- {
- $leagueRow = ORM::for_table('leagues')->where('id',$id_league)->find_one();
- if (!$leagueRow->id) return true;
- $teamsInLeague = ORM::for_table('teams_in_leagues')->select('id_team')->where('id_league',$id_league)->find_array();
- if ($teamsInLeague['0']['id_team'])
- {
- foreach ($teamsInLeague as $keyTeam=>$valueTeam)
- {
- $teamsIdArray[] = $valueTeam['id_team'];
- }
- }
- $players = ORM::for_table('players')->where_in('team_id',$teamsIdArray)->where('fio','')->find_many();
- foreach ($players as $playerRow)
- {
- self::getPlayerFullName($playerRow->id,$leagueRow->championat_id);
- sleep(2);
- }
- }
- public static function initTournament($mainUrl,$type)
- {
- $main = self::getLeagueMainData($mainUrl);
- Log::msg('Инициализация новой лиги '.$type);
- if ($main['id'])
- {
- $check = ORM::for_table('leagues')->where('championat_id',$main['id'])->find_array();
- if (!$check[0]['id']) // лиги с этой айди еще нет в базе
- {
- $newLeague = ORM::for_table('leagues')->create();
- $newLeague->caption = $main["caption"];
- $newLeague->championat_id = $main["id"];
- $newLeague->type = $type;
- $newLeague->parsing = '{"teams":"'.$main['url_teams'].'","calendar":"'.$main['url_calendar'].'"}';
- $newLeague->active = 1;
- $newLeague->default_money = 5500;
- $newLeague->max_players_from_one_team = 3;
- $newLeague->save();
- Log::msg('Получаем список команд от парсера');
- self::getTeamsByLeague($type);
- Log::msg('Получаем список матчей и формируем туры');
- self::getMatches($type);
- return true;
- } else {Log::msg('Лига #'.$main['id'].' уже есть в базе, инициализировать не удалось');}
- } else return false;
- }
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement