function setRanks($round_id, $force = false) { global $database; if (!$round_id) { jTipsLogger::_log('setRanks - no round_id passed in!', 'ERROR'); return; } //optimizing //only process this round if the number of users in the round (in history) does not equal the outof $query = "SELECT COUNT(*) total, outof from #__jtips_history WHERE round_id = " . $database->Quote($round_id) . " GROUP BY round_id"; //jTipsDebug($query); $database->setQuery($query); $rows = $database->loadAssocList(); $row = array_shift($rows); //jTipsDebug($row); //die(); if (!$force and $row['total'] == $row['outof']) { //no need to reprocess this round! jTipsLogger::_log('setRanks: round does not need to be processed'); return; } ////////////////////////////// // BUG 87 - Incorrect User Ranks and Scores // //$query = "SELECT user_id, SUM(`points`) AS total_points, SUM(`precision`) AS total_precision " . //"FROM #__jtips_history GROUP BY user_id ORDER BY total_points DESC, total_precision ASC"; $getSeasonQuery = "SELECT season_id, `round` FROM #__jtips_rounds WHERE id = {$round_id}"; $database->setQuery($getSeasonQuery); $rounds = $database->loadAssocList(); $round = array_shift($rounds); $roundIDQuery = "SELECT id FROM #__jtips_rounds WHERE season_id = '" . $round['season_id'] . "' AND `round` <= '" . $round['round'] . "'"; //$roundIDQuery = "SELECT id FROM #__jtips_rounds WHERE season_id = '" .$round['season_id']. "' AND start_time <= '" .$round['start_time']. "'"; $database->setQuery($roundIDQuery); $round_ids_array = $database->loadResultArray(); if (empty($round_ids_array)) { jTipsLogger::_log('setRanks - no rounds found! Something went wrong!', 'ERROR'); return; } $round_ids = implode(', ', $round_ids_array); $query = "SELECT user_id, SUM(points) AS total_points, SUM(`precision`) AS total_precision " . "FROM #__jtips_history WHERE round_id IN ({$round_ids}) GROUP BY user_id " . "ORDER BY total_points DESC, total_precision ASC"; // END BUG 87 ////////////////////////////////// jTipsLogger::_log("SETRANKS QUERY: " . $query); $database->setQuery($query); $rows = $database->loadResultArray(); $outof = count($rows); $rank = 1; foreach ($rows as $id) { $params = array('user_id' => $id, 'round_id' => $round_id); $jHistory = new jHistory($database); $jHistory->loadByParams($params); $jHistory->rank = $rank; $jHistory->outof = $outof; if (!$id) { jTipsLogger::_log("NO USER ID!: U:{$id} R:{$rank} O:{$outof} Q:{$query}"); } jTipsLogger::_log("Setting rank for user {$id} to {$rank} out of {$outof}"); //jTipsLogger::_log($jHistory); $jHistory->save(); if (!empty($jHistory->_error)) { jTipsLogger::_log($jHistory->_error, 'ERROR'); } $rank++; } }
function getDefaultPoints($user_id) { global $database, $jTips; if (!$this->default_points) { jTipsLogger::_log('no default points should be allocated. aborting'); return; } else { if ($this->default_points == 'low') { $limit = "LIMIT 1"; } else { $limit = ""; } jTipsLogger::_log('setting default points for user ' . $user_id . ' using method -' . $this->default_points . '-'); $round_id = $this->getLastRound(); $query = "SELECT id FROM #__jtips_rounds WHERE season_id = '" . $this->id . "'"; $database->setQuery($query); $rids = $database->loadResultArray(); $query = "SELECT SUM(points) lpt, SUM(`precision`) lpr FROM #__jtips_history WHERE round_id IN ('" . implode("', '", $rids) . "') GROUP BY user_id ORDER BY lpt ASC {$limit}"; jTipsLogger::_log("getDefaultPoints: ({$user_id}) " . $query); $database->setQuery($query); $database->query(); //only create a jhistory record if at least 1 round is complete if ($database->getNumRows() > 0) { $jHistory = new jHistory($database); $jHistory->user_id = $user_id; $jHistory->round_id = $round_id; if ($limit) { //BUG 279 - no such function as loadAssoc $res = $database->loadAssocList(); $jHistory->points = $res[0]['lpt']; $jHistory->precision = $res[0]['lpr']; } else { $res = $database->loadAssocList(); //loop and get averages for each $points = 0; $precision = 0; foreach ($res as $row) { $points += $row['lpt']; $precision += $row['lpr']; } $jHistory->points = $points / count($res); $jHistory->precision = $precision / count($res); //rank will be different for averages! } //rank query $query = "SELECT outof FROM #__jtips_history WHERE round_id = '{$round_id}'"; $database->setQuery($query); $max = $database->loadResult(); $jHistory->outof = $max + 1; $jHistory->rank = $max + 1; $jHistory->save(); $jHistory->setRanks($round_id, true); //update outof /*$query = "UPDATE #__jtips_history SET outof = '" .($max+1). "', updated = CURRENT_TIMESTAMP WHERE round_id = '$round_id'"; jTipsLogger::_log('update ranks after adding user'); $database->setQuery($query); $database->query();*/ } } return 0; }
function process() { global $database, $jTips, $mosConfig_absolute_path; $this->clearHistory(); $params = array('round_id' => $this->id); $jSeason = new jSeason($database); $jSeason->load($this->season_id); $jGame = new jGame($database); $jGames = forceArray($jGame->loadByParams($params)); $params = array('season_id' => $this->season_id); $jTipsUser = new jTipsUser($database); $jTipsUsers = forceArray($jTipsUser->loadByParams($params)); $noTips = $scores = $worst_precision = array(); $played = count($jGames); foreach ($jTipsUsers as $jTipsUser) { jTipsLogger::_log("Processing scores for user " . $jTipsUser->id); $score = $matching = $precision = $allAwayScore = 0; if ($jTipsUser->hasTipped($this->id)) { jTipsLogger::_log($jTipsUser->id . " has tipped in round " . $this->id); foreach ($jGames as $jGame) { jTipsLogger::_log("Processing game " . $jGame->id); $params = array('user_id' => $jTipsUser->id, 'game_id' => $jGame->id); $jTip = new jTip($database); $jTip->loadByParams($params); // make sure this is not a bye game if (!$jGame->home_id or !$jGame->away_id or !$jGame->winner_id) { jTipsLogger::_log('attempting to process tips on a bye game, skipping', 'INFO'); continue; } /* * Feature Request 101 - Team Starts * Determine the winner when we take the starts into account * We only care about the starts for picking the winner/draw * For picking the margins and scores, use the actual winner */ if ($jSeason->team_starts) { jTipsLogger::_log('processing team starts'); $homeScore = $awayScore = 0; $homeScore = $jGame->home_score + ($jGame->home_start + 0); $awayScore = $jGame->away_score + ($jGame->away_start + 0); if ($homeScore > $awayScore) { $winnerID = $jGame->home_id; } else { if ($homeScore < $awayScore) { $winnerID = $jGame->away_id; } else { if ($homeScore == $awayScore) { $winnerID = -1; } } } jTipsLogger::_log('feature 101: With starts, the winner is ' . $winnerID . ', otherwise the winner is ' . $jGame->winner_id . " HOME {$homeScore} v AWAY {$awayScore}"); } else { $winnerID = $jGame->winner_id; } if ($jTip->tip_id == $winnerID) { //User tipped right! jTipsLogger::_log("CORRECT TIP by " . $jTipsUser->id . " in round_id " . $this->id . " in game_id " . $jGame->id); //BUG 248 - Add ToughScore if enabled if ($jSeason->tough_score and $jGame->tough_score) { $score += $jGame->tough_score; } if ($winnerID == -1) { $score += isset($jSeason->user_draw) ? $jSeason->user_draw : 0; jTipsLogger::_log("Draw correctly picked!"); } else { $score += isset($jSeason->user_correct) ? $jSeason->user_correct : 0; } $matching++; } if ($winnerID == $jGame->away_id) { $allAwayScore += $jSeason->user_correct; } //Check for correct margins and handle precision score gathering if ($jSeason->pick_margin == 1 and $jGame->has_margin == 1) { $margin = abs($jGame->home_score - $jGame->away_score); if ($jTip->margin == $margin) { $score += isset($jSeason->user_pick_margin) ? $jSeason->user_pick_margin : 0; jTipsLogger::_log("correct margin picked!"); } if ($jSeason->precision_score == 1) { if ($jGame->winner_id == $jTip->tip_id) { $margin_offset = abs($margin - $jTip->margin); } else { $margin_offset = abs($margin + $jTip->margin); } if (isset($worst_precision[$jGame->id]) && $margin_offset > $worst_precision[$jGame->id] || empty($worst_precision[$jGame->id])) { $worst_precision[$jGame->id] = $margin_offset; } $precision += $margin_offset; jTipsLogger::_log("PICK_MARGIN: Adding {$margin_offset} to precision of {$precision}"); } } //Check for correct scores and handle precision score gathering if ($jSeason->pick_score == 1 and $jGame->has_score == 1) { $margin = abs($jGame->home_score - $jGame->away_score); if ($jTip->home_score == $jGame->home_score and $jTip->away_score == $jGame->away_score) { $score += isset($jSeason->user_pick_score) ? $jSeason->user_pick_score : 0; jTipsLogger::_log("Correct scores picked!"); } if ($jSeason->precision_score == 1) { $pickedScoreMargin = abs($jTip->home_score - $jTips->away_score); if ($jGame->winner_id == $jTip->tip_id) { $score_offset = abs($margin - $pickedScoreMargin); } else { $score_offset = abs($margin + $pickedScoreMargin); } if (isset($worst_precision[$jGame->id]) and $score_offset > $worst_precision[$jGame->id] or empty($worst_precision[$jGame->id])) { $worst_precision[$jGame->id] = $score_offset; } $precision += $score_offset; jTipsLogger::_log("PICK_SCORE: Adding {$score_offset} to precision of {$precision}"); jTipsLogger::_log("PREC DEBUG: {$jTipsUser->id}-{$jTipsUser->user_id} Picked Margin: {$pickedScoreMargin}. Actual Margin: {$margin}. Applied Precision: {$score_offset}. Running Precision: {$precision}", 'INFO'); } } //Check for a bonus team selection if ($jSeason->pick_bonus >= 1 and $jGame->has_bonus == 1) { if ($jTip->bonus_id == $jGame->bonus_id && $jGame->bonus_id != -1) { $score += isset($jSeason->user_pick_bonus) ? $jSeason->user_pick_bonus : 0; } } } //was a perfect round picked? if ($matching == $played) { $score += isset($jSeason->user_bonus) ? $jSeason->user_bonus : 0; } //did the user use their 'doubleup' if ($jTipsUser->doubleup == $this->id and $jTips['DoubleUp'] == 1) { $score = $score * 2; } $scores[] = $score; //Save the data to the history object $jHistory = new jHistory($database); $jHistory->user_id = $jTipsUser->id; $jHistory->round_id = $this->id; jTipsLogger::_log("Score for user_id " . $jTipsUser->id . " in round_id " . $this->id . " is {$score}"); $jHistory->points = $score; //Update rank after all users have been saved $jHistory->outof = count($jTipsUsers); //$jHistory->comment = $jTipsUser->comment; if ($jSeason->precision_score == 1) { jTipsLogger::_log("setting precision to {$precision} for user_id " . $jTipsUser->id . " in round_id " . $this->id); $jHistory->precision = $precision; } else { $jHistory->precision = 0; } if ($jHistory->save() !== false) { $results[] = 1; } else { jTipsLogger::_log("Error saving history: " . $jHistory->_error); $results[] = 0; } //remove the current comment $jTipsUser->comment = null; $jTipsUser->save(); // Check if the AlphaUserPoints config option is set if (isJoomla15()) { $api_AUP = JPATH_SITE . DS . 'components' . DS . 'com_alphauserpoints' . DS . 'helper.php'; } else { $api_AUP = $mosConfig_absolute_path . 'components/com_alphauserpoints/helper.php'; } if (!$this->scored and $jTips['AlphaUserPoints'] and jTipsFileExists($api_AUP)) { require_once $api_AUP; jTipsLogger::_log('sending ' . $score . ' points for user ' . $jTipsUser->user_id, 'INFO'); $refID = AlphaUserPointsHelper::getAnyUserReferreID($jTipsUser->user_id); AlphaUserPointsHelper::newpoints('plgaup_jtips_total_points', $refID, '', '', $score); } if (!$this->scored and $jTips['JomSocialActivities'] and $jTips['JomSocialUserResults']) { global $mosConfig_absolute_path; require_once $mosConfig_absolute_path . '/administrator/components/com_jtips/utils/jTipsJomSocial.php'; jTipsJomSocial::writeRoundResult($jSeason, $this, $jTipsUser->user_id, $score); } } else { $noTips[] = $jTipsUser; } } if (count($noTips) > 0) { ///////////////////////////////////////////////// // Feature Request 71 // Allow users that did not to be assigned // all the away teams // /*if ($jSeason->user_none != -1) { $thisRound = $jSeason->user_none; } else if (is_array($scores) && count($scores) > 0) { $thisRound = min($scores); } else { $thisRound = 0; }*/ if ($jSeason->user_none == -2) { //handle all away teams $thisRound = $allAwayScore; jTipsLogger::_log("didn't tip? You'll be stuck with the away teams. You got {$thisRound}"); } else { if ($jSeason->user_none == -1) { //handle lowest possible score if (is_array($scores) and count($scores) > 0) { $thisRound = min($scores); jTipsLogger::_log("didn't tip? You'll be stuck with the lowest score this round, {$thisRound}"); } else { $thisRound = 0; jTipsLogger::_log("didn't tip? You'll be stuck {$thisRound}"); } } else { //handle allocated score $thisRound = $jSeason->user_none; jTipsLogger::_log("didn't tip? You're getting {$thisRound}"); } } // // END Feature Request 71 //////////////////////////////////////////////////// foreach ($noTips as $jTipsUser) { $jHistory = new jHistory($database); $jHistory->user_id = $jTipsUser->id; $jHistory->round_id = $this->id; $jHistory->points = $thisRound; $jHistory->precision = array_sum($worst_precision); //$jHistory->outof = count($jTipsUsers); //$jHistory->comment = $jTipsUser->comment; if ($jHistory->save() !== false) { $results[] = 1; } else { $results[] = 0; } $jTipsUser->save(); // Check if the AlphaUserPoints config option is set if (isJoomla15()) { $api_AUP = JPATH_SITE . DS . 'components' . DS . 'com_alphauserpoints' . DS . 'helper.php'; } else { $api_AUP = $mosConfig_absolute_path . 'components/com_alphauserpoints/helper.php'; } if (!$this->scored and $jTips['AlphaUserPoints'] and jTipsFileExists($api_AUP)) { require_once $api_AUP; jTipsLogger::_log('sending ' . $score . ' points for user ' . $jTipsUser->user_id, 'INFO'); $refID = AlphaUserPointsHelper::getAnyUserReferreID($jTipsUser->user_id); AlphaUserPointsHelper::newpoints('plgaup_jtips_total_points', $refID, '', '', $thisRound); } if (!$this->scored and $jTips['JomSocialActivities']) { global $mosConfig_absolute_path; require_once $mosConfig_absolute_path . '/administrator/components/com_jtips/utils/jTipsJomSocial.php'; if ($jTips['JomSocialUserResults']) { jTipsJomSocial::writeRoundResult($jSeason, $this, $jTipsUser->user_id, $score); } if ($jTips['JomSocialOnNoTips']) { jTipsJomSocial::writeOnNoTips($jTipsUser->user_id, $jSeason, $this); } } } } $jHistory = new jHistory($database); $jHistory->setRanks($this->id, true); if (!$this->scored and $jTips['JomSocialActivities']) { // find out who won the round and write it to the JomSocial stream $winners = $this->getRoundWinners(); jTipsJomSocial::writeRoundWinners($winners, $this, $jSeason); } $this->scored = 1; $result = $this->save(); //if ($this->scored != 1) { jTeam::updateLadder($this, $jSeason); //} //$this->scored = 1; //return $this->save(); return $result; }