responseView('XenForo_ViewPublic_Base', 'yfl_rivals_index', $viewParams); } public function actionH2h() { $visitor = XenForo_Visitor::getInstance(); YFL_Rivals_Helpers_EA::checkLogin($visitor); $viewParams = array( "mode" => "find" ); if(isset($_POST['team1']) && isset($_POST['team2'])) { // get the grouped stats for these teams $team1 = $this->_getTeamModel()->getByName($_POST['team1']); $team2 = $this->_getTeamModel()->getByName($_POST['team2']); if($team1 && $team2) { $matches = $this->_getRivalsModel()->getH2HMatches($team1['id'], $team2['id']); if(count($matches)) { $stats = $this->_getRivalsModel()->getH2HStats($matches['matches']); $match = $matches['match']; $teamStats = array( "home" => array(), "away" => array() ); $totalStats = array( "home" => array(), "away" => array() ); if(count($stats)) { foreach($stats as $stat) { $key = 'home'; if($stat['club_id'] == $match['away_team_ea_id']) $key = 'away'; // convert the position $stat['pos'] = YFL_Rivals_Helpers_EA::getPosition($stat['pos']); /*$player = $this->_getContractModel()->getByEAId($stat['player_ea_id']); if($player) { $stat['player'] = $player['username']; } else { $stat['player'] = 'Unknown'; }*/ $teamStats[$key][] = $stat; foreach($stat as $k => $v) { if(in_array($k, YFL_Rivals_Helpers_EA::getValidStats())){ $k = YFL_Rivals_Helpers_EA::getReplace($k); if( ! array_key_exists($k, $totalStats[$key])) $totalStats[$key][$k] = 0; $totalStats[$key][$k] += $v; } } } $viewParams = array( "match" => $match, "results" => $matches['results'], "stats" => $teamStats, "statsjson" => json_encode($totalStats), "mode" => "view", "matchCount" => count($matches['matches']) ); } else { $viewParams = array( "mode" => "failed" ); } } } } return $this->responseView('XenForo_ViewPublic_Base', 'yfl_rivals_h2h', $viewParams); } public function actionStats() { $visitor = XenForo_Visitor::getInstance(); YFL_Rivals_Helpers_EA::checkLogin($visitor); $validFilters = array( "positions" => array("goalkeeper", "defender", "midfielder", "attacker", "any", "all"), "filters" => array("played" => "Played","assists" =>"Assists","cleansheetsany" => "Cleansheets" ,"cleansheetsdef" => "Cleansheets","cleansheetsgk"=> "Cleansheets" ,"goals" => "Goals","goalsconceded" => "Goals Against","mom" => "MOTM","passattempts" => "Pass Attempts","passesmade" => "Pass Completed","rating" => "Rating ","redcards" => "Red Cards","saves"=> "Saves" ,"shots"=> "Shots" ,"tackleattempts" => "Tackle Attmpets","tacklesmade"=> "Tackle Completed" ,"yellowcards" => "Yellow Card","assists_per_game" => "Assists PG","goals_per_game" => "Goals PG","conceded_per_game" => "Conceeded PG","passattempts_per_game" => "Pass Attempts PG" ,"passesmade_per_game" => "Pass Completed PG" ,"saves_per_game" => "Saves PG" ,"shots_per_game" => "Shots PG","tackleattempts_per_game" => "Tackle Attempts PG","tacklesmade_per_game"=> "Tackle Completed PG") ); if(!empty($_GET['adrian'])) { var_dump(YFL_Rivals_Helpers_EA::getPositionID(ucfirst($_GET['pos']))); var_dump( YFL_Rivals_Helpers_EA::getConsole(@$_COOKIE['console'])); var_dump($_COOKIE); exit; } if(isset($_GET['pos']) && in_array($_GET['pos'], $validFilters['positions'])) { $page = 1; $orderBy = 'rating'; $order = 'DESC'; if(isset($_GET['page']) && intval($_GET['page']) > 0) $page = intval($_GET['page']); switch($_GET['pos']) { case 'goalkeeper': $fields = array("played", "cleansheetsgk", "goalsconceded", "mom", "saves", "saves_per_game", "rating"); $orderBy = 'saves'; break; case 'defender': $fields = array("played", "cleansheetsdef", "goalsconceded", "mom", "tackleattempts_per_game", "tacklesmade_per_game", "tacklesmade", "assists", "rating"); $orderBy = 'cleansheetsdef'; break; case 'midfielder': $fields = array("played", "tacklesmade", "passesmade", "mom", "tacklesmade_per_game", "passesmade_per_game", "assists", "goals", "rating"); $orderBy = 'assists'; break; case 'attacker': $fields = array("played", "shots", "mom", "shots_per_game", "goals_per_game", "assists", "goals", "rating"); $orderBy = 'goals'; break; case 'any': $fields = array("played", "cleansheetsany", "goalsconceded", "mom", "passattempts_per_game", "passesmade_per_game", "assists", "goals", "rating"); $orderBy = 'goals'; break; /*case 'all': $fields = array("played", "goalsconceded", "mom", "saves", "tacklesmade", "passesmade", "assists", "shots", "goals", "rating"); $orderBy = 'played'; break;*/ } if(isset($_GET['orderby']) && in_array($_GET['orderby'], $fields)) $orderBy = $_GET['orderby']; if(isset($_GET['order']) && in_array($_GET['order'], array('ASC', 'DESC'))) $order = $_GET['order']; $pos = YFL_Rivals_Helpers_EA::getPositionID(ucfirst($_GET['pos'])); $records = $this->_getRivalsModel()->getOverallStats($pos, 25, $page, $orderBy.' '.$order); $stats = array(); $cleanFields = array(); foreach($records['records'] as $record) { $stats[$record['player_ea_id']] = array(); $stats[$record['player_ea_id']]['user'] = $record; $team = $this->_getTeamModel()->getByEAId($record['club_id']); $stats[$record['player_ea_id']]['ea_user'] = array( "persona_name" => $record['persona_name'], "badge" => $team['badge'], "name" => $team['name'] ); $tmp = array(); foreach($record as $key => $val) { if(in_array($key, $fields)) { if(is_float($val) || strpos(".", $val)!==-1) $val = round($val, 2); $tmp[$key] = $val; } } $cleanFields = array(); foreach($fields as $field) { $cleanFields[] = $validFilters['filters'][$field]; $stats[$record['player_ea_id']][$field] = $tmp[$field]; } } $end = ($records['page'] * $records['limit']); if($end > $records['total']) $end = $records['total']; $viewParams = array( "position" => ucfirst($_GET['pos']), "orderby" => $orderBy, "order" => $order, "fields" => $cleanFields, "values" => $fields, "stats" => $stats, "page" => $records['page'], "start" => (($records['page'] - 1) * $records['limit']) + 1, "end" => $end, "total" => $records['total'] ); return $this->responseView('XenForo_ViewPublic_Base', 'yfl_rivals_stat_view', $viewParams); } $viewParams = array(); return $this->responseView('XenForo_ViewPublic_Base', 'yfl_rivals_stats', $viewParams); } public function actionStandings() { $visitor = XenForo_Visitor::getInstance(); YFL_Rivals_Helpers_EA::checkLogin($visitor); $viewParams = array( "standings" => $this->_getRivalsModel()->getRivalTable() ); return $this->responseView('XenForo_ViewPublic_Base', 'yfl_rivals_standings', $viewParams); } public function actionResults() { $visitor = XenForo_Visitor::getInstance(); YFL_Rivals_Helpers_EA::checkLogin($visitor); $viewParams = array( "results" => $this->_getRivalsModel()->getRecentMatches() ); return $this->responseView('XenForo_ViewPublic_Base', 'yfl_rivals_results', $viewParams); } public function actionPlayerCron($clubId = -1) { set_time_limit(3600); $db = XenForo_Application::get('db'); if( ! $clubId > 0) { $query = "SELECT * FROM xf_yfl_team ORDER BY last_rivals_update LIMIT 30"; } else { $query = sprintf("SELECT * FROM xf_yfl_team WHERE ea_id = %d", intval($clubId)); } $teams = $db->fetchAll($query); $EA = new YFL_Rivals_API_EA; $EA->setMode('forced'); $statsFields = array('assists', 'cleansheetsany', 'cleansheetsdef', 'cleansheetsgk', 'goals', 'goalsconceded', 'mom', 'passattempts', 'passesmade', 'pos', 'rating', 'redcards', 'saves', 'shots', 'tackleattempts', 'tacklesmade'); // foreach team, call the API for members and process the players foreach($teams as $team) { $console = 'PS4'; if($team['platform_id']==1) $console = 'XBOX'; $EA->setConsole($console); $members = $EA->getMembers($team['ea_id']); $this->_getContractModel()->parseEAMembers($team, $members, $console); $query = sprintf("UPDATE xf_yfl_team SET last_player_update = NOW() WHERE id = %d", $team['id']); $db->query($query); } // cache XenForo_Model::create('XenForo_Model_UserField')->rebuildUserFieldCache(); if($clubId==-1) { echo 'complete'; exit; } } static public function cron() { set_time_limit(3600); $db = XenForo_Application::get('db'); $db->query("UPDATE `xf_yfl_team` SET active = 'N' WHERE ea_id NOT IN (SELECT home FROM xf_yfl_match_cache WHERE date > DATE_SUB(NOW(), INTERVAL 30 DAY)) AND ea_id NOT IN (SELECT away FROM xf_yfl_match_cache WHERE date > DATE_SUB(NOW(), INTERVAL 30 DAY)) AND active = 'Y'"); $query = "SELECT * FROM xf_yfl_team WHERE active = 'Y' ORDER BY last_rivals_update LIMIT 30"; $query = "SELECT * FROM xf_yfl_team"; $teams = $db->fetchAll($query); $EA = new YFL_Rivals_API_EA; $EA->setMode('forced'); $statsFields = array('assists', 'cleansheetsany', 'cleansheetsdef', 'cleansheetsgk', 'goals', 'goalsconceded', 'mom', 'passattempts', 'passesmade', 'pos', 'rating', 'redcards', 'saves', 'shots', 'tackleattempts', 'tacklesmade'); // foreach team, call the API for recent matches foreach($teams as $team) { if($team['ea_id']!=0) { $console = 'PS4'; if($team['platform_id']==1) $console = 'XBOX'; $EA->setConsole($console); /* $query = "SELECT * FROM xf_yfl_match_cache WHERE home = ".$team['ea_id']." OR away = ".$team['ea_id']; $res = $db->fetchAll($query); $matches = array(); foreach($res as $r) { $matches[$r['match_id']] = json_decode($r['data'], true); } */ $matches = $EA->getMatches($team['ea_id']); // foreach match, foreach($matches as $matchID => $match) { // cache this match for later procesing overall stats $x = 1; foreach($match['clubs'] as $clubID => $data) { if($x==1) { $homeTeam = $clubID; } else { $awayTeam = $clubID; } $x++; } $query = sprintf("INSERT INTO xf_yfl_match_cache (match_id, platform_id, home, away, data) VALUES (%d, %d, %d, %d, %s) ON DUPLICATE KEY UPDATE match_id = match_id", $db->quote($matchID), $db->quote($team['platform_id']), $db->quote($homeTeam), $db->quote($awayTeam), $db->quote(json_encode($match))); $db->query($query); // check this match_id does not exist $query = sprintf("SELECT match_id FROM xf_yfl_rival_matches WHERE match_id = %d", $matchID); $check = $db->fetchRow($query); if( ! $check) { $opposition = 0; $homeTeam = 0; $awayTeam = 0; // get the involved club ids, check the other exists $x = 1; foreach($match['clubs'] as $clubID => $data) { if($clubID != $team['ea_id']) $opposition = $clubID; if($x==1) { $homeTeam = $clubID; } else { $awayTeam = $clubID; } $x++; } $query = sprintf("SELECT id, rivals_elo FROM xf_yfl_team WHERE ea_id = %d AND platform_id = %d", $opposition, $team['platform_id']); $away = $db->fetchRow($query); if($away) { // if exists, store the match and result $query = sprintf("INSERT INTO xf_yfl_rival_matches (match_id, home_team, home_score, away_team, away_score, played) VALUES (%d, %d, %d, %d, %d, %s)", $matchID, $homeTeam, $match['clubs'][$homeTeam]['goals'], $awayTeam, $match['clubs'][$awayTeam]['goals'], $db->quote(date("Y-m-d H:i:s", $match['timestamp']))); $result = $db->query($query); // work out who won and get the ELO $homeELO = $team['rivals_elo']; $awayELO = $away['rivals_elo']; if($match['clubs'][$homeTeam]['goals'] > $match['clubs'][$awayTeam]['goals']) { $h = 1; $a = 0; } else if ($match['clubs'][$homeTeam]['goals'] > $match['clubs'][$awayTeam]['goals']) { $a = 1; $h = 0; } else { $a = 0.5; $h = 0.5; } $ELO = new YFL_Rivals_Helpers_ELO($homeELO,$awayELO,$h,$a); $ratings = $ELO->getNewRatings(); // update the ELO $query = sprintf("UPDATE xf_yfl_team SET rivals_elo = %d WHERE id = %d", $ratings['a'], $team['id']); $db->query($query); $query = sprintf("UPDATE xf_yfl_team SET rivals_elo = %d WHERE id = %d", $ratings['b'], $away['id']); $db->query($query); // store the players stats as well foreach($match['players'] as $clubID => $player) { foreach($player as $playerID => $stats) { // get the required fields out $myStats = array(); foreach($statsFields as $value) { $myStats[$value] = $stats[$value]; } $persona = $stats['playername']; $keys = array_keys($myStats); $vals = array_values($myStats); $query = sprintf("INSERT INTO xf_yfl_rival_stats (persona_name, match_id, player_ea_id, club_id, %s) VALUES (%s, %d, %d, %d, %s)", implode(",", $keys), $db->quote($persona), $matchID, $playerID, $clubID, implode(",", $vals)); $db->query($query); } } } } } } // set last update $query = sprintf("UPDATE xf_yfl_team SET last_rivals_update = NOW() WHERE id = %d", $team['id']); $db->query($query); } echo 'complete'; exit; } public function actionFixelo() { $db = XenForo_Application::get('db'); $query = "UPDATE xf_yfl_team SET rivals_elo = 2000"; $db->query($query); $query = "SELECT T1.id as home_id, T1.rivals_elo as home_elo, home_score, away_score, T2.id as away_id, T2.rivals_elo as away_elo FROM xf_yfl_rival_matches m INNER JOIN xf_yfl_team T1 ON m.home_team = T1.ea_id INNER JOIN xf_yfl_team T2 ON m.away_team = T2.ea_id ORDER BY played ASC"; $results = $db->fetchAll($query); $x = 0; foreach($results as $result) { $content = ''; // work out who won and get the ELO $hteam = $this->_getTeamModel()->getById($result['home_id']); $ateam = $this->_getTeamModel()->getById($result['away_id']); # var_dump($ateam); $homeELO = $hteam['rivals_elo']; $awayELO = $ateam['rivals_elo']; $content .= 'Home: '.$hteam['name'].' - '.$homeELO.' Away: '.$ateam['name'].' - '.$awayELO.' '; if($result['home_score'] > $result['away_score']) { $h = 1; $a = 0; $content .= ' - Home win - '; } else if ($result['home_score'] < $result['away_score']) { $a = 1; $h = 0; $content .= ' - Away win - '; } else { $a = 0.5; $h = 0.5; $content .= ' - Draw - '; } $ELO = new YFL_Rivals_Helpers_ELO($homeELO,$awayELO,$h,$a); $ratings = $ELO->getNewRatings(); $content .= 'Home: '.$ratings['a'].' Away: '.$ratings['b'].' '; // update the ELO $query = sprintf("UPDATE xf_yfl_team SET rivals_elo = %d WHERE id = %d", $ratings['a'], $result['home_id']); #echo $query; $db->query($query); $query = sprintf("UPDATE xf_yfl_team SET rivals_elo = %d WHERE id = %d", $ratings['b'], $result['away_id']); #echo '
'.$query.'
'.'
'; $db->query($query); #echo $x.'
'; echo $content.'
'; $x++; } echo 'complete'; exit; } public function actionLink() { $visitor = XenForo_Visitor::getInstance(); YFL_Rivals_Helpers_EA::checkLogin($visitor); $viewParams = array( "mode" => 'link' ); if($visitor->isManager()){ header("Location: rivals/"); exit; } if($visitor->getUserId()>0) { $EA = new YFL_Rivals_API_EA; // check if the console cookie is set if(isset($_COOKIE['console'])) { $EA->setConsole($_COOKIE['console']); } if (!$visitor->isLinked()){ if(isset($_POST['player']) && strlen($_POST['player'])>3) { // check this player doesn't exist already $pid = YFL_Rivals_Helpers_EA::getConsole(@$_COOKIE['console']); $player = $this->_getPlayerModel()->getByName($_POST['player'], $pid); if( ! $player) { // search the match stats for this gamertag to get the ea id $eaId = 0; $id = $this->_getPlayerModel()->getEAIdFromCache($_POST['player'], $pid); if($id) { // if found, add to query. if not dont worry, they will get linked when they play $eaId = $id['player_ea_id']; } // create the player record for this platform $db = XenForo_Application::get('db'); $query = sprintf("INSERT INTO xf_yfl_player (platform_id, ea_id, user_id, name) VALUES (%d, %d, %d, %s)", $pid, $eaId, $visitor->getUserId(), $db->quote($_POST['player'])); $db->query($query); $viewParams = array( "mode" => 'playerlinked', "console" => @$_COOKIE['console'] ); } else { // this is already registered $viewParams = array( "error" => 'This player is already registered.', "mode" => 'playerlink', "console" => @$_COOKIE['console'] ); } } else { $viewParams = array( "error" => '', "mode" => 'playerlink', "console" => @$_COOKIE['console'] ); } return $this->responseView('XenForo_ViewPublic_Base', 'yfl_rivals_link', $viewParams); } if(isset($_POST['team']) || isset($_GET['confirm'])){ // query API for the team and get the members if(isset($_GET['confirm'])) { $team = $EA->findTeam($_GET['team']); } else { $team = $EA->findTeam($_POST['team']); } if(count($team > 1) && !isset($_GET['confirm'])){ // its returned multiple clubs, add a list $viewParams['found'] = $team; $viewParams['count'] = count($team); $viewParams['term'] = htmlspecialchars($_POST['team']); $viewParams['mode'] = 'found'; } else { foreach($team as $id => $t){ if(isset($_GET['confirm'])) { if($id==$_GET['confirm']) { $team = $t; } } else { $team = $t; } } if(count($team)){ // check if this team already exists here $check = $this->_getTeamModel()->getByEAId($team['clubId']); if( ! $check) { // output the details for them to confirm $viewParams['team'] = $team; $viewParams['stats'] = $EA->getStats($team['clubId']); $viewParams['members'] = $EA->getMembers($team['clubId']); $viewParams['mode'] = 'confirm'; } } else { // not found } } } if(isset($_POST['confirm'])){ // remove any existing contracts for this player $team = $EA->findTeam($_POST['confirm']); if( ! $team) exit; foreach($team as $id => $t){ //if (isset($_POST['confirmId']) AND $id == $_POST['confirmId']) { $team = $t; } } $this->_getContractModel()->removeUserContract($visitor->getUserId()); // check for the clubs badge on EA api $image = ''; $src = $EA->getBadge(isset($team['clubId']) ? $team['clubId'] : 0); if(file_exists($src)){ $img = copy($src, '/var/www/yfl/htdocs/styles/badges/'.$team['clubId'].'.png'); if($img) { // if it exists cache the image and update the team $image = 'styles/badges/'.$team['clubId'].'.png'; } } if($image=='') { // if it doesnt exist then give them a random one $num = rand(1, 10); $image = 'styles/default/seasons/teams/'.$num.'.png'; } // create the team $db = XenForo_Application::get('db'); $query = sprintf(" INSERT INTO `xf_yfl_team` (`ea_id`, `platform_id`, `name`, `owner`, `player_created`, `image`, `badge`, `active`) VALUES (%d, %d, %s, %d, 'Y', 'styles/default/seasons/teams/generic.jpg', %s, 'Y');", $db->quote(isset($team['clubId'])? $team['clubId'] : 0), YFL_Rivals_Helpers_EA::getConsole(@$_COOKIE['console']), $db->quote(isset($team['name']) ? $team['name'] : ''), $visitor->getUserId(), $db->quote($image) ); $db->query($query); // assign the player to the new team as manager $team = $this->_getTeamModel()->getByName(isset($team['name']) ? $team['name'] : ''); // $query = sprintf("INSERT INTO `xf_yfl_contract` (`team_id`, `user_id`, `level`, `position`, `status`, `start_date`, `end_date`) VALUES (%d, %d, 'Manager', 'SUB', 'Accepted', NOW(), '2100-01-01 00:00:00');", $team['id'], $visitor->getUserId()); // $db->query($query); // process the member list and assign registered users to the team # TODO //$this->actionPlayerCron($team['clubId']); } } # var_dump($viewParams); return $this->responseView('XenForo_ViewPublic_Base', 'yfl_rivals_link', $viewParams); } public static function getSessionActivityDetailsForList(array $activities) { return array( 'Browsing Rivals', 'Rivals', 'rivals/', false ); } /* Model Includes */ protected function _getRivalsModel() { return $this->getModelFromCache( 'YFL_Rivals_Model_Rivals' ); } protected function _getTeamModel() { return $this->getModelFromCache( 'YFL_Seasons_Model_Team' ); } protected function _getUserModel() { return $this->getModelFromCache( 'YFL_Seasons_Model_User' ); } protected function _getContractModel() { return $this->getModelFromCache( 'YFL_Seasons_Model_Contract' ); } protected function _getCompetitionModel() { return $this->getModelFromCache( 'YFL_Seasons_Model_Competition' ); } protected function _getPlayerModel() { return $this->getModelFromCache( 'YFL_Seasons_Model_Player' ); } }