From bc85a3f1cf8030f1d6400f24b70ea16f717350bd Mon Sep 17 00:00:00 2001 From: BlueRaja Date: Sun, 13 Jan 2013 00:43:23 -0600 Subject: don't mind me; minor cleanup --- includes/datas.php | 2 -- 1 file changed, 2 deletions(-) (limited to 'includes/datas.php') diff --git a/includes/datas.php b/includes/datas.php index e99e347..ef978c8 100644 --- a/includes/datas.php +++ b/includes/datas.php @@ -781,8 +781,6 @@ function trackMOTDstats($mapType) { return true; } - - //Select Members function getMembers($order, $pageNumber = 1, $pageDivide = 50) { -- cgit v1.2.3 From 468e9a700736166f175b974e185d24d0d2a4f33e Mon Sep 17 00:00:00 2001 From: BlueRaja Date: Sun, 13 Jan 2013 00:48:07 -0600 Subject: db.inc.php now only contains the database login info; the actual connection to the DB has been moved to includes/sqlEmbedded. This was done so we don't need to have the db info in two separate files (one of which is in the repo, derp) --- app.php | 2 +- do.php | 4 ++-- globe.php | 4 ++-- includes/datas.php | 4 ++-- includes/mapoftheday.php | 2 +- includes/maps.php | 6 +++--- includes/sqlEmbedded.php | 7 +++++++ includes/sqli.php | 10 +--------- index.php | 2 +- pages/achievements.php | 2 +- pages/admin.php | 2 +- pages/challenge.php | 2 +- pages/challengelist.php | 2 +- pages/cp.php | 2 +- pages/feedback.php | 2 +- pages/gallery.php | 2 +- pages/home.php | 2 +- pages/leaderboard.php | 2 +- pages/login.php | 2 +- pages/massemail.php | 4 ++-- pages/memberlist.php | 2 +- pages/tutorial.php | 2 +- 22 files changed, 34 insertions(+), 35 deletions(-) create mode 100644 includes/sqlEmbedded.php (limited to 'includes/datas.php') diff --git a/app.php b/app.php index d799a97..7f0ab30 100644 --- a/app.php +++ b/app.php @@ -1,7 +1,7 @@ \ No newline at end of file + \ No newline at end of file diff --git a/includes/maps.php b/includes/maps.php index 6a831c8..03bcd81 100644 --- a/includes/maps.php +++ b/includes/maps.php @@ -769,7 +769,7 @@ function formSolution($solution) { //Returns the best solution. function getSolution($userID, $mapID) { - include_once('db.inc.php'); + include_once('sqlEmbedded.php'); $sql = "SELECT `solution`, `moves` FROM `solutions` WHERE `userID` = '$userID' AND @@ -782,7 +782,7 @@ function getSolution($userID, $mapID) { } function getChallengeSolution($userID, $challengeID) { - include_once('db.inc.php'); + include_once('sqlEmbedded.php'); $sql = "SELECT `solution`, `moves` FROM `challengeSolutions` WHERE `userID` = '$userID' AND @@ -795,7 +795,7 @@ function getChallengeSolution($userID, $challengeID) { } function getMapCode($mapID) { - include_once('db.inc.php'); + include_once('sqlEmbedded.php'); $sql = "SELECT `code` FROM `maps` WHERE `ID` = '$mapID' diff --git a/includes/sqlEmbedded.php b/includes/sqlEmbedded.php new file mode 100644 index 0000000..b7a32b5 --- /dev/null +++ b/includes/sqlEmbedded.php @@ -0,0 +1,7 @@ + diff --git a/includes/sqli.php b/includes/sqli.php index 0974380..d19069b 100644 --- a/includes/sqli.php +++ b/includes/sqli.php @@ -1,12 +1,4 @@ \ No newline at end of file diff --git a/index.php b/index.php index 4a69a4e..88172e3 100644 --- a/index.php +++ b/index.php @@ -27,7 +27,7 @@ if (isset($_SESSION['accepted']) AND $_SESSION['accepted'] == 1) //TODO: We could store this data in the session if ($accepted) { $userID = $_SESSION['userID']; - include_once ('./includes/db.inc.php'); + include_once ('./includes/sqlEmbedded.php'); $sql = " SELECT userData.wallColor, diff --git a/pages/achievements.php b/pages/achievements.php index ac7aded..1bb2195 100644 --- a/pages/achievements.php +++ b/pages/achievements.php @@ -7,7 +7,7 @@ htmlHeader(array('profile'), 'Pathery Achievements'); __get('identity'); //I know just where to put this stuff! - require './includes/db.inc.php'; + require './includes/sqlEmbedded.php'; //Unless I already have this information... //* Modify this to WHERE `email` //$sql = "SELECT `ID`, `isAdmin`, `openID`, `displayName` FROM `users` WHERE `email` = '$email'"; diff --git a/pages/massemail.php b/pages/massemail.php index a861500..d45588b 100644 --- a/pages/massemail.php +++ b/pages/massemail.php @@ -6,7 +6,7 @@ htmlHeader(); topbar($Links); include('./includes/datas.php'); -include('./includes/db.inc.php'); +include('./includes/sqlEmbedded.php'); if (isset($_POST['massemail']) AND isset($_SESSION['accepted'])) { @@ -22,7 +22,7 @@ if (isset($_POST['massemail']) AND isset($_SESSION['accepted'])) { if (!is_int($userID)) return; - include_once "includes/db.inc.php"; + include_once "includes/sqlEmbedded.php"; $sql = "SELECT `email` FROM `users` WHERE `ID` = '$userID'"; $result = mysql_query($sql); diff --git a/pages/memberlist.php b/pages/memberlist.php index 22d88b4..3baf456 100644 --- a/pages/memberlist.php +++ b/pages/memberlist.php @@ -13,7 +13,7 @@ htmlHeader( topbar($Links); -include_once ('./includes/db.inc.php'); +include_once ('./includes/sqlEmbedded.php'); include_once ('./includes/datas.php'); diff --git a/pages/tutorial.php b/pages/tutorial.php index 4d2446f..5208a57 100644 --- a/pages/tutorial.php +++ b/pages/tutorial.php @@ -13,7 +13,7 @@ topbar($Links); //TODO: Turn this into a function? if ($accepted) { - include_once ('./includes/db.inc.php'); + include_once ('./includes/sqlEmbedded.php'); $userID = $_SESSION['userID']; $sql = " -- cgit v1.2.3 From 28dab5d36ab1b593ef395e64973d40d24f574dcd Mon Sep 17 00:00:00 2001 From: BlueRaja Date: Sun, 13 Jan 2013 15:06:04 -0600 Subject: Replaced wins with champion points on the achievements page & achievement unlocks --- includes/datas.php | 36 +++++++++++++++++------------------- pages/achievements.php | 4 ++-- 2 files changed, 19 insertions(+), 21 deletions(-) (limited to 'includes/datas.php') diff --git a/includes/datas.php b/includes/datas.php index 690b83a..6d73230 100644 --- a/includes/datas.php +++ b/includes/datas.php @@ -114,7 +114,7 @@ function getNotified($userID) { $aTypeCurrency[1] = "total moves mazed"; $aTypeCurrency[2] = "mazes played"; $aTypeCurrency[3] = "mazes with (tied) top score"; - $aTypeCurrency[4] = "maze wins"; + $aTypeCurrency[4] = "challenge points"; $aName = $aTypeNames[$aType]; $currency = $aTypeCurrency[$aType]; @@ -555,7 +555,7 @@ function getAchievementCurrency($userID, $aType) { // 1, Total Moves "Path Career" //Backdated // 2, Total Solutions (Total maps played) "Mazes Career" //Backdated // 3, Tie Top-Score on a map "Maze Mastery" //Tracked (no backdate) -// 4, Rank#1 Win Top-Score on a map "Wins" //Tracked +// 4, Champion Points! $r = 0; $sql = ''; switch ($aType) { @@ -579,11 +579,9 @@ function getAchievementCurrency($userID, $aType) { AND `type` IN (1, 2, 3, 4)"; break; case 4: - $sql = "SELECT - SUM(`value`) as t - FROM `statistics` - WHERE `userID` = '$userID' - AND `type` IN (32, 33, 34, 35)"; + $sql = "SELECT championPoints + FROM `users` + WHERE `ID` = '$userID'"; break; } if ($sql == '') @@ -618,7 +616,7 @@ function getAchievementsArray($type) { if ($type == 3) return getMazeMasteryArray(); if ($type == 4) - return getWinsArray(); + return getChampionPointsArray(); //Tutorial if ($type == 32) { $r[1] = array(1, 1, '#4444ff', 'Blue'); @@ -697,17 +695,17 @@ function getMazeMasteryArray() { } //TYPE 4 -function getWinsArray() { - //$cp[0] = array(requiredmazewins, type, 'value', 'name'); - $r[1] = array(1, 2, 'DiagonalCover_B.png', 'Light Diagnol Cover', 0); - $r[2] = array(5, 1, '#22aaaa', 'Teal'); - $r[3] = array(15, 2, 'OffsetStripesDiagonal_B.png', 'Dark Diagonal Stripes', 0); - $r[4] = array(30, 2, 'DiamondLargeDonut_W_I.png', 'Inverted Light Annulated Diamond', 0); - $r[5] = array(50, 2, 'StarsR_B.png', 'Dark Stars', 0); - $r[6] = array(75, 2, 'OffsetStripesHorizontal_B_I.png', 'Inverted Dark Horizontal Stripes', 0); - $r[7] = array(100, 2, 'CrossXLDonut_B_I.png', 'Inverted Dark Large Intersection', 0); - $r[8] = array(150, 2, 'DiamondLarge_B.png', 'Dark Large Diamond', 0); - $r[9] = array(225, 1, '#22ff22', 'Neon Lime', 1); +function getChampionPointsArray() { + //$cp[0] = array(requiredpoints, type, 'value', 'name'); + $r[1] = array(100, 2, 'DiagonalCover_B.png', 'Light Diagnol Cover', 0); + $r[2] = array(250, 1, '#22aaaa', 'Teal'); + $r[3] = array(500, 2, 'OffsetStripesDiagonal_B.png', 'Dark Diagonal Stripes', 0); + $r[4] = array(1000, 2, 'DiamondLargeDonut_W_I.png', 'Inverted Light Annulated Diamond', 0); + $r[5] = array(2000, 2, 'StarsR_B.png', 'Dark Stars', 0); + $r[6] = array(4000, 2, 'OffsetStripesHorizontal_B_I.png', 'Inverted Dark Horizontal Stripes', 0); + $r[7] = array(8000, 2, 'CrossXLDonut_B_I.png', 'Inverted Dark Large Intersection', 0); + $r[8] = array(16000, 2, 'DiamondLarge_B.png', 'Dark Large Diamond', 0); + $r[9] = array(32000, 1, '#22ff22', 'Neon Lime', 1); //$r[7] = array(75, 2, 'CircleSmall_W_I.png', 'Inverted Bright Small Circle', 0); return $r; diff --git a/pages/achievements.php b/pages/achievements.php index 1bb2195..6dbabe7 100644 --- a/pages/achievements.php +++ b/pages/achievements.php @@ -499,13 +499,13 @@ foreach($achievements as $aType => $a) { $aTypeNames[1] = "Path Career Level $aLevel!"; $aTypeNames[2] = "Mazes Career Level $aLevel!"; $aTypeNames[3] = "Maze Mastery Level $aLevel!"; - $aTypeNames[4] = "Champion Level $aLevel!"; + $aTypeNames[4] = "Champion Level $aLevel!"; $aTypeNames[32] = 'Tutorial Complete!'; $aTypeCurrency[1] = "total moves mazed"; $aTypeCurrency[2] = "mazes played"; $aTypeCurrency[3] = "mazes with (tied) top score"; - $aTypeCurrency[4] = "maze wins"; + $aTypeCurrency[4] = "champion points"; $name = $aTypeNames[$aType]; $currency = $aTypeCurrency[$aType]; -- cgit v1.2.3 From 099e2d5ab8effe07b0e5d8c59e18c81f519fd833 Mon Sep 17 00:00:00 2001 From: BlueRaja Date: Sun, 13 Jan 2013 19:27:39 -0600 Subject: Added totalWins and totalTies columns to the users table. Also, removed all references to the 'statistics' table - it's not needed anymore. --- includes/championPoints.php | 204 --------------------------------- includes/datas.php | 82 +------------- includes/mapoftheday.php | 2 +- includes/playerStats.php | 271 ++++++++++++++++++++++++++++++++++++++++++++ pages/admin.php | 10 +- pages/faq.php | 2 +- pages/memberlist.php | 5 +- 7 files changed, 285 insertions(+), 291 deletions(-) delete mode 100644 includes/championPoints.php create mode 100644 includes/playerStats.php (limited to 'includes/datas.php') diff --git a/includes/championPoints.php b/includes/championPoints.php deleted file mode 100644 index 28b2b78..0000000 --- a/includes/championPoints.php +++ /dev/null @@ -1,204 +0,0 @@ -= '$fromDate' - ) - "; - - mysql_query($sql); -} - -/** - * Calculates the worth of all maps' champion points from after the given date - * @param $fromDate The earliest date to count from. Use SQL date-string format. - * Pass in yesterday's date, for example, to add champion points from yesterday's maps - */ -function calculateMapsChampionPointWorth($fromDate) -{ - $fromDate = mysql_escape_string($fromDate); - - //We take the worth of the map, multiply by the number of people who tied the high score, then divide by the - //total number of people who attempted the map (minus 1) - $sql = " - UPDATE mapOfTheDay - SET championPointsWorth = GREATEST(".CP_MIN_WORTH.", - ( - CASE mapType - WHEN 1 THEN ".CP_MAX_WORTH_SIMPLE." - WHEN 2 THEN ".CP_MAX_WORTH_NORMAL." - WHEN 3 THEN ".CP_MAX_WORTH_COMPLEX." - WHEN 4 THEN ".CP_MAX_WORTH_SPECIAL." - WHEN 5 THEN ".CP_MAX_WORTH_WEEKLY." - ELSE 0 - END - ) * ( - SELECT COUNT(*) - FROM solutions - WHERE solutions.mapID = mapOfTheDay.mapID - AND solutions.moves < - ( - SELECT MAX(moves) - FROM solutions AS s2 - WHERE s2.mapId = mapOfTheDay.mapID - ) - ) / ( - SELECT GREATEST(COUNT(*)-1, 1) - FROM solutions - WHERE solutions.mapID = mapOfTheDay.mapID - )) - WHERE mapDate >= '$fromDate' - "; - - mysql_query($sql); -} - -/** - * Adds the champion points for each player for every day after the given date, but before today. - * Thus, if you're using this to add points from yesterday's maps, this should be done - * after the date has changed. - * @param $fromDate The earliest date to count from. SQL date-string format. - * Pass in yesterday's date, for example, to add champion points from yesterday's maps - */ -function addPlayerChampionPointsForMapsOfTheDay($fromDate) -{ - $fromDate = mysql_escape_string($fromDate); - - //TODO: How do you know when an ultra-complex map has completed? - - //Weird syntax of these queries is necessary due to a bug in MySQL with updating a table and selecting a table - //in the same query. See http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/ - $sql1 = " - -- Add the points for tying the map - UPDATE solutions - INNER JOIN - ( - SELECT mapID, moves - FROM solutions AS s2 - WHERE isHighScore = 1 - ) AS maxMoves ON maxMoves.mapID = solutions.mapID - INNER JOIN mapOfTheDay ON mapOfTheDay.mapID = solutions.mapID - SET solutions.championPointsWorth = mapOfTheDay.championPointsWorth - WHERE mapOfTheDay.mapDate >= '$fromDate' - AND mapOfTheDay.mapType <> 5 - AND solutions.moves = maxMoves.moves - "; - - $sql2 = " - -- Add the extra for being the first to tie the map - UPDATE solutions - SET solutions.championPointsWorth = solutions.championPointsWorth * (1 + ".CP_EXTRA_PERCENT_FOR_FIRST.") - WHERE solutions.isHighScore = 1 - AND solutions.dateModified >= $fromDate - "; - - //TODO: This doesn't work right, weekly maps last more than a day... - $sql3 = " - -- Add the points for doing the weekly maps - UPDATE solutions - SET championPointsWorth = championPointsWorth + - ( - SELECT IFNULL(SUM(".CP_MAX_WORTH_WEEKLY." * - ( - SELECT COUNT(*) - FROM (SELECT * FROM solutions) AS s2 - WHERE s2.mapID = mapOfTheDay.mapID - AND s2.moves < usersSolutions.moves - ) / ( - SELECT GREATEST(COUNT(*)-1, 1) - FROM (SELECT * FROM solutions) AS s2 - WHERE s2.mapID = mapOfTheDay.mapID - ) + ".CP_MIN_WORTH_WEEKLY."), 0) - FROM mapOfTheDay - INNER JOIN (SELECT * FROM solutions) AS usersSolutions ON usersSolutions.mapID = mapOfTheDay.mapID - WHERE usersSolutions.ID = solutions.ID - AND mapOfTheDay.mapType = 5 - AND mapOfTheDay.mapDate >= '$fromDate' - ) - WHERE solutions.dateModified >= $fromDate; - "; - - $sql4 = " - -- Add the points for attempting the map - UPDATE solutions - SET championPointsWorth = ".CP_POINTS_FOR_ATTEMPTING." - WHERE championPointsWorth = 0 - AND dateModified >= $fromDate - AND dateModified < CURDATE() - "; - - //TODO: Points for doing challenges too - //TODO: Is summing the entire table every time slow? If so, we should just add the points instead - $sql5 = " - -- Simply re-sum all the points - UPDATE users - SET championPoints = - ( - SELECT SUM(championPointsWorth) - FROM solutions - WHERE solutions.userID = users.ID - ) - "; - - mysql_query($sql1); - mysql_query($sql2); - mysql_query($sql3); - mysql_query($sql4); - mysql_query($sql5); -} - -/** - * Calculates the worth of the maps for yesterday, and distributes points for them - */ -function addChampionPointsForYesterdaysMaps() -{ - $yesterday = strtotime('-1 day', time()); - $yesterdayStr = date('Y-m-d', $yesterday); - setIsHighScoreFlag($yesterday); - calculateMapsChampionPointWorth($yesterdayStr); - addPlayerChampionPointsForMapsOfTheDay($yesterdayStr); -} - -/** - * Recalculates all player's total champion points. - * Will probably be extremely slow, so should not be called often! - */ -function recalculateAllPlayersChampionPoints() -{ - setIsHighScoreFlag(CP_EARLIEST_DATE); - calculateMapsChampionPointWorth(CP_EARLIEST_DATE); - addPlayerChampionPointsForMapsOfTheDay(CP_EARLIEST_DATE); - //TODO: Champion points for challenges! -} -?> diff --git a/includes/datas.php b/includes/datas.php index 6d73230..b29f1c9 100644 --- a/includes/datas.php +++ b/includes/datas.php @@ -572,11 +572,9 @@ function getAchievementCurrency($userID, $aType) { WHERE userID = '$userID'"; break; case 3: - $sql = "SELECT - SUM(`value`) as t - FROM `statistics` - WHERE `userID` = '$userID' - AND `type` IN (1, 2, 3, 4)"; + $sql = "SELECT totalTies + FROM `users` + WHERE `userID` = '$userID'"; break; case 4: $sql = "SELECT championPoints @@ -711,74 +709,6 @@ function getChampionPointsArray() { return $r; } -//Used to track statistics on who wins or ties maps at the end of a day. -function trackMOTDstats($mapType) { - // Our rather massive query to get the data we need. - $sql = "SELECT - users.ID as userID, - SUM(solutions.moves) as Moves, - timediff(MAX(dateModified), maps.dateCreated) as Timetaken - FROM `maps` - JOIN `solutions` - ON maps.ID = solutions.mapID - JOIN `users` - ON solutions.userID = users.ID - JOIN `mapOfTheDay` - ON maps.ID = mapOfTheDay.mapID - WHERE - DATE_ADD(CURDATE(), INTERVAL -1 DAY) = - DATE_FORMAT(solutions.dateModified,'%Y-%m-%d') - AND DATE_ADD(CURDATE(), INTERVAL -1 DAY) = - DATE_FORMAT(maps.dateCreated,'%Y-%m-%d') - AND `mapType` = '$mapType' - GROUP BY solutions.userID - ORDER BY Moves DESC, MAX(dateModified) ASC, solutions.ID DESC - "; - - $mainResult = mysql_query($sql); - if ($mainResult) { - $first = true; - while (list($userID, $uMoves, $uTimeTaken) = mysql_fetch_row($mainResult)) { - //echo "$first : userID: $userID uMoves: $uMoves uTimeTaken: $uTimeTaken mapType: $mapType
"; - do { - //If it's the rank #1 user, we need to repeat to also award him the tie stat. - $repeatThis = false; - $sType = $mapType; - if ($first) { - $bestMoves = $uMoves; - $sType = 31 + $mapType; - $repeatThis = true; - } - if ($uMoves == $bestMoves) { - $sql = "SELECT `ID` FROM `statistics` - WHERE `userID` = '$userID' AND `type` = '$sType'"; - $result = mysql_query($sql); - - if (mysql_num_rows($result) == 0) { - $sql = "INSERT INTO `statistics` (`userID`, `type`, `value`) - VALUES ('$userID', '$sType', 1)"; - $result = mysql_query($sql); - if (!$result) - return false; - } else { - $sql = "UPDATE `statistics` - SET `value` = `value` + 1 - WHERE `userID` = '$userID' AND `type` = '$sType'"; - $result = mysql_query($sql); - if (!$result) - return false; - } - - } else { - break 2; - } - $first = false; - } while ($repeatThis); - } - } - return true; -} - //Select Members function getMembers($order, $pageNumber = 1, $pageDivide = 50) { @@ -826,8 +756,8 @@ function getMembers($order, $pageNumber = 1, $pageDivide = 50) { WHERE solutions.userID = users.ID AND solutions.dateModified < CURRENT_DATE) , 0) AS totalMazes, - SUM(CASE WHEN statistics.type IN (32, 33, 34, 35) THEN statistics.value ELSE 0 END) as totalWins, - SUM(CASE WHEN statistics.type IN (1, 2, 3, 4) THEN statistics.value ELSE 0 END) as totalTies, + users.totalWins, + users.totalTies, IfNull(userData.wallColor, '#666666') as wallColor, IfNull(userData.displayColor, '#cccccc'), userData.wallEmblem as wallEmblem, @@ -835,8 +765,6 @@ function getMembers($order, $pageNumber = 1, $pageDivide = 50) { users.dateLogin as dateLogin FROM `users` LEFT JOIN `userData` ON users.ID = userData.userID - LEFT JOIN `statistics` ON users.ID = statistics.userID - GROUP BY users.ID $order LIMIT $limitTop, $pageDivide "; diff --git a/includes/mapoftheday.php b/includes/mapoftheday.php index 3a472ba..178dc64 100644 --- a/includes/mapoftheday.php +++ b/includes/mapoftheday.php @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/includes/playerStats.php b/includes/playerStats.php new file mode 100644 index 0000000..b302812 --- /dev/null +++ b/includes/playerStats.php @@ -0,0 +1,271 @@ += '$fromDate' + ) + "; + + mysql_query($sql); +} + +/** + * Calculates the worth of all maps' champion points from after the given date + * @param $fromDate The earliest date to count from. Use SQL date-string format. + * Pass in yesterday's date, for example, to add champion points from yesterday's maps + */ +function calculateMapsChampionPointWorth($fromDate) +{ + $fromDate = mysql_escape_string($fromDate); + + //We take the worth of the map, multiply by the number of people who tied the high score, then divide by the + //total number of people who attempted the map (minus 1) + $sql = " + UPDATE mapOfTheDay + SET championPointsWorth = GREATEST(".CP_MIN_WORTH.", + ( + CASE mapType + WHEN 1 THEN ".CP_MAX_WORTH_SIMPLE." + WHEN 2 THEN ".CP_MAX_WORTH_NORMAL." + WHEN 3 THEN ".CP_MAX_WORTH_COMPLEX." + WHEN 4 THEN ".CP_MAX_WORTH_SPECIAL." + WHEN 5 THEN ".CP_MAX_WORTH_WEEKLY." + ELSE 0 + END + ) * ( + SELECT COUNT(*) + FROM solutions + WHERE solutions.mapID = mapOfTheDay.mapID + AND solutions.moves < + ( + SELECT MAX(moves) + FROM solutions AS s2 + WHERE s2.mapId = mapOfTheDay.mapID + ) + ) / ( + SELECT GREATEST(COUNT(*)-1, 1) + FROM solutions + WHERE solutions.mapID = mapOfTheDay.mapID + )) + WHERE mapDate >= '$fromDate' + "; + + mysql_query($sql); +} + +/** + * Adds the champion points for each player for every day after the given date, but before today. + * Thus, if you're using this to add points from yesterday's maps, this should be done + * after the date has changed. + * @param $fromDate The earliest date to count from. SQL date-string format. + * Pass in yesterday's date, for example, to add champion points from yesterday's maps + */ +function addPlayerChampionPointsForMapsOfTheDay($fromDate) +{ + $fromDate = mysql_escape_string($fromDate); + + //TODO: How do you know when an ultra-complex map has completed? + + //Weird syntax of these queries is necessary due to a bug in MySQL with updating a table and selecting a table + //in the same query. See http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/ + $sql1 = " + -- Add the points for tying the map + UPDATE solutions + INNER JOIN + ( + SELECT mapID, moves + FROM solutions AS s2 + WHERE isHighScore = 1 + ) AS maxMoves ON maxMoves.mapID = solutions.mapID + INNER JOIN mapOfTheDay ON mapOfTheDay.mapID = solutions.mapID + SET solutions.championPointsWorth = mapOfTheDay.championPointsWorth + WHERE mapOfTheDay.mapDate >= '$fromDate' + AND mapOfTheDay.mapDate < CURDATE() + AND mapOfTheDay.mapType <> 5 + AND solutions.moves = maxMoves.moves + "; + + $sql2 = " + -- Add the extra for being the first to tie the map + UPDATE solutions + SET solutions.championPointsWorth = solutions.championPointsWorth * (1 + ".CP_EXTRA_PERCENT_FOR_FIRST.") + WHERE solutions.isHighScore = 1 + AND solutions.dateModified >= $fromDate + AND solutions.dateModified < CURDATE() + "; + + //TODO: This doesn't work right, weekly maps last more than a day... + $sql3 = " + -- Add the points for doing the weekly maps + UPDATE solutions + SET championPointsWorth = championPointsWorth + + ( + SELECT IFNULL(SUM(".CP_MAX_WORTH_WEEKLY." * + ( + SELECT COUNT(*) + FROM (SELECT * FROM solutions) AS s2 + WHERE s2.mapID = mapOfTheDay.mapID + AND s2.moves < usersSolutions.moves + ) / ( + SELECT GREATEST(COUNT(*)-1, 1) + FROM (SELECT * FROM solutions) AS s2 + WHERE s2.mapID = mapOfTheDay.mapID + ) + ".CP_MIN_WORTH_WEEKLY."), 0) + FROM mapOfTheDay + INNER JOIN (SELECT * FROM solutions) AS usersSolutions ON usersSolutions.mapID = mapOfTheDay.mapID + WHERE usersSolutions.ID = solutions.ID + AND mapOfTheDay.mapType = 5 + AND mapOfTheDay.mapDate >= '$fromDate' + AND mapOfTheDay.mapDate < CURDATE() + ) + WHERE solutions.dateModified >= $fromDate; + AND mapOfTheDay.mapDate < CURDATE() + "; + + $sql4 = " + -- Add the points for attempting the map + UPDATE solutions + SET championPointsWorth = ".CP_POINTS_FOR_ATTEMPTING." + WHERE championPointsWorth = 0 + AND dateModified >= $fromDate + AND dateModified < CURDATE() + "; + + //TODO: Points for doing challenges too + //TODO: Is summing the entire table every time slow? If so, we should just add the points instead + $sql5 = " + -- Simply re-sum all the points + UPDATE users + SET championPoints = + ( + SELECT SUM(championPointsWorth) + FROM solutions + WHERE solutions.userID = users.ID + ) + "; + + mysql_query($sql1); + mysql_query($sql2); + mysql_query($sql3); + mysql_query($sql4); + mysql_query($sql5); +} + +/** + * Sets all players wins and draws to 0. Should be done before a total recalculation + */ +function clearWinsAndTies() +{ + $sql = " + UPDATE users + SET totalWins = 0, totalTies = 0; + "; + + mysql_query($sql); +} + +/** + * Calculates players' total wins and draws, adding from the given date + */ +function addWinsAndTies($fromDate) +{ + $sql1 = " + -- Add the players' latest wins + UPDATE users + SET totalWins = totalWins + + ( + SELECT COUNT(*) + FROM solutions + INNER JOIN mapOfTheDay ON solutions.mapID = mapOfTheDay.mapID + WHERE solutions.isHighScore = 1 + AND mapOfTheDay.mapDate >= '$fromDate' + AND mapOfTheDay.mapDate < CURDATE() + AND solutions.userID = users.ID + ); + "; + + $sql2 = " + -- Add the players' latest ties + UPDATE users + SET totalTies = totalTies + + ( + SELECT COUNT(*) + FROM solutions + INNER JOIN mapOfTheDay ON solutions.mapID = mapOfTheDay.mapID + WHERE mapOfTheDay.mapDate >= '$fromDate' + AND mapOfTheDay.mapDate < CURDATE() + AND solutions.userID = users.ID + AND solutions.moves = + ( + SELECT moves + FROM solutions AS s2 + WHERE s2.mapID = mapOfTheDay.mapID + AND s2.isHighScore = 1 + LIMIT 1 + ) + ); + "; + + mysql_query($sql1); + mysql_query($sql2); +} + +/** + * Calculates the worth of the maps for yesterday, and distributes points for them. Also adds wins and ties to + * the correct players + */ +function addStatsForYesterdaysMaps() +{ + $yesterday = strtotime('-1 day', time()); + $yesterdayStr = date('Y-m-d', $yesterday); + setIsHighScoreFlag($yesterday); + calculateMapsChampionPointWorth($yesterdayStr); + addPlayerChampionPointsForMapsOfTheDay($yesterdayStr); + addWinsAndTies($yesterdayStr); +} + +/** + * Recalculates all player's total champion points, wins, and ties. + * Will probably be extremely slow, so should not be called often! + */ +function recalculateStatsForAllPlayers() +{ + setIsHighScoreFlag(CP_EARLIEST_DATE); + calculateMapsChampionPointWorth(CP_EARLIEST_DATE); + addPlayerChampionPointsForMapsOfTheDay(CP_EARLIEST_DATE); + //TODO: Champion points for challenges! + clearWinsAndTies(); + addWinsAndTies(CP_EARLIEST_DATE); +} +?> diff --git a/pages/admin.php b/pages/admin.php index afc6418..0f54285 100644 --- a/pages/admin.php +++ b/pages/admin.php @@ -10,7 +10,7 @@ include_once('./includes/datas.php'); include_once('./includes/maps.php'); include_once('./includes/mapoftheday.php'); include_once('./includes/sqlEmbedded.php'); -include_once('./includes/championPoints.php'); +include_once('./includes/playerStats.php'); if ($_GET['applyall'] == 'true') { echo "Apply-All command heard. Executing..."; @@ -27,10 +27,10 @@ if ($_GET['applyall'] == 'true') { echo "Execution complete!"; } -else if ($_GET['recalcChamp'] == 'true') { - echo "Recalculating champion points..."; +else if ($_GET['recalcStats'] == 'true') { + echo "Recalculating all player stats..."; - recalculateAllPlayersChampionPoints(); + recalculateStatsForAllPlayers(); echo "Complete!"; } @@ -45,7 +45,7 @@ echo '

News:

Buttons:
- +

Hello admins, this is our current userlist.

diff --git a/pages/faq.php b/pages/faq.php index e9d8e5f..95b0b87 100644 --- a/pages/faq.php +++ b/pages/faq.php @@ -8,7 +8,7 @@ echo soundManager2(); topbar($Links); include_once('./includes/maps.php'); -include_once('./includes/championPoints.php'); +include_once('./includes/playerStats.php'); // Demo maps: diff --git a/pages/memberlist.php b/pages/memberlist.php index 3baf456..2fa2cdc 100644 --- a/pages/memberlist.php +++ b/pages/memberlist.php @@ -115,8 +115,8 @@ $sql = "SELECT WHERE solutions.userID = users.ID AND solutions.dateModified BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY) AND CURRENT_DATE) AS totalMovesThisWeek, (SELECT COUNT(*) FROM solutions WHERE solutions.userID = users.ID AND solutions.dateModified < CURRENT_DATE) AS totalMazes, - SUM(CASE WHEN statistics.type IN (32, 33, 34, 35) THEN statistics.value ELSE 0 END) as totalWins, - SUM(CASE WHEN statistics.type IN (1, 2, 3, 4) THEN statistics.value ELSE 0 END) as totalTies, + users.totalWins, + users.totalTies, IfNull(userData.wallColor, '#666666') as wallColor, IfNull(userData.displayColor, '#cccccc'), userData.wallEmblem, @@ -124,7 +124,6 @@ $sql = "SELECT users.dateLogin as dateLogin FROM `users` LEFT JOIN `userData` ON users.ID = userData.userID -LEFT JOIN `statistics` ON users.ID = statistics.userID GROUP BY users.ID $order "; -- cgit v1.2.3 From d2a9bf56c2625b71016f1ce879aaf10ade57754a Mon Sep 17 00:00:00 2001 From: BlueRaja Date: Sun, 13 Jan 2013 20:02:50 -0600 Subject: Small bugfix for not loading disabled challenges --- includes/datas.php | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'includes/datas.php') diff --git a/includes/datas.php b/includes/datas.php index b29f1c9..66c816b 100644 --- a/includes/datas.php +++ b/includes/datas.php @@ -1058,22 +1058,13 @@ function loadChallengesForMap($mapIdUnsanitized, $userIdUnsanitized) function loadChallengeListing($userIdUnsanitized) { $userID = mysql_escape_string($userIdUnsanitized); - $sql = " - SELECT maps.ID AS mapID, maps.challengeTier, maps.name AS name, - challengeSolutions.dateSolved, challengeSolutions.challengeID AS challengeID - FROM maps - INNER JOIN challenges ON maps.ID = challenges.mapID - LEFT JOIN challengeSolutions ON challenges.ID = challengeSolutions.challengeID - WHERE maps.isChallenge = 1 AND challenges.enabled = 1 - AND (challengeSolutions.userID IS NULL OR challengeSolutions.userID = '$userID') - AND maps.challengeTier <= (SELECT challengeTier FROM users WHERE users.ID = '$userID') - ORDER BY maps.challengeTier, maps.challengeSuborder, challenges.ordering - "; + $sql = " SELECT maps.ID AS mapID, maps.challengeTier, maps.name AS name, challengeSolutions.dateSolved, challengeSolutions.challengeID AS challengeID FROM challenges LEFT JOIN maps ON challenges.mapID = maps.ID LEFT JOIN challengeSolutions ON challenges.ID = challengeSolutions.challengeID AND challengeSolutions.userID = '$userID' + WHERE challenges.enabled = 1 ORDER BY maps.challengeTier, maps.challengeSuborder, challenges.ordering"; $result = mysql_query($sql); -- cgit v1.2.3