From bc8daf62e46c623df17314cef0b1869f4480912e Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 25 Nov 2015 17:34:32 -0500 Subject: [PATCH] Ladder refactor --- js/client-chat.js | 2 +- ladder.php | 2 +- lib/dispatcher.lib.php | 14 +++++---- lib/ntbb-ladder.lib.php | 63 ++++++++++++++++++++--------------------- lib/ntbb-ladder.sql | 45 ++++++++++++++--------------- 5 files changed, 62 insertions(+), 64 deletions(-) diff --git a/js/client-chat.js b/js/client-chat.js index 193a8b531..5c447e74a 100644 --- a/js/client-chat.js +++ b/js/client-chat.js @@ -690,7 +690,7 @@ buffer += ''; hiddenFormats.push(row.formatid); } - buffer += '' + row.formatid + '' + Math.round(row.acre) + '' + Math.round(row.gxe, 1) + ''; + buffer += '' + row.formatid + '' + Math.round(row.elo) + '' + Math.round(row.gxe, 1) + ''; if (row.rprd > 100) { buffer += '' + Math.round(row.rpr) + ' ± ' + Math.round(row.rprd) + ' (provisional)'; } else { diff --git a/ladder.php b/ladder.php index 33fa5d0f5..a158efb56 100644 --- a/ladder.php +++ b/ladder.php @@ -43,7 +43,7 @@ foreach ($toplist as $row) $N=$row['w']+$row['l']+$row['t']; ?> 100) echo ' style="color:#999"'; */ ?>> - + '.round($row['rpr']).' ± '.round($row['rprd']).''; /* if (floatval($row['rprd']) > 100) echo ' (provisional)'; */ ?> findServer(); - if (!$server) { - $out['errorip'] = $dispatcher->getIp(); + if (!$server || $server['id'] !== 'showdown') { + $out['errorip'] = "Your version of PS is too old for this ladder system. Please update."; return; } @@ -526,7 +526,9 @@ class LadderActionHandler { include_once dirname(__FILE__) . '/ntbb-ladder.lib.php'; $server = @$PokemonServers[@$reqData['serverid']]; - if (!$server) die; + if (!$server || $server['id'] !== 'showdown') { + die; + } $ladder = new NTBBLadder($server['id'], @$reqData['format']); $user = $this->getUserData(@$reqData['user']); @@ -540,8 +542,8 @@ class LadderActionHandler { include_once dirname(__FILE__) . '/ntbb-ladder.lib.php'; $server = $dispatcher->findServer(); - if (!$server) { - $out['errorip'] = $dispatcher->getIp(); + if (!$server || $server['id'] !== 'showdown') { + $out['errorip'] = "Your version of PS is too old for this ladder system. Please update."; return; } @@ -551,7 +553,7 @@ class LadderActionHandler { if ($user) { $ladder->getRating($user); if (@$user['rating']) { - $out = intval($user['rating']['acre']); + $out = intval($user['rating']['elo']); } } } diff --git a/lib/ntbb-ladder.lib.php b/lib/ntbb-ladder.lib.php index 9cd50ef1a..662c9de64 100755 --- a/lib/ntbb-ladder.lib.php +++ b/lib/ntbb-ladder.lib.php @@ -112,14 +112,13 @@ class GlickoPlayer { } class NTBBLadder { - var $serverid; var $formatid; var $rplen; var $rpoffset; function __construct($serverid, $formatid) { + // serverid is no longer used $this->formatid = preg_replace('/[^a-z0-9]+/', '', strtolower($formatid)); - $this->serverid = preg_replace('/[^a-z0-9]+/', '', strtolower($serverid)); $this->rplen = 24*60*60; $this->rpoffset = 9*60*60; } @@ -136,7 +135,7 @@ class NTBBLadder { function getRating(&$user, $create=false) { global $ladderdb; if (!@$user['rating']) { - $res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `serverid` = '{$this->serverid}' AND `formatid` = '{$this->formatid}' AND `userid` = '".$ladderdb->escape($user['userid'])."' LIMIT 1"); + $res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `userid` = '".$ladderdb->escape($user['userid'])."' AND `formatid` = '{$this->formatid}' LIMIT 1"); if (!$res) { return false; } @@ -148,7 +147,7 @@ class NTBBLadder { } //echo "INSERT INTO `{$ladderdb->prefix}ladder` (`formatid`,`userid`,`username`) VALUES ('{$this->formatid}','".$ladderdb->escape($user['userid'])."','".$ladderdb->escape($user['username'])."')"; $rp = $this->getrp(); - $ladderdb->query("INSERT INTO `{$ladderdb->prefix}ladder` (`formatid`,`serverid`,`userid`,`username`,`rptime`) VALUES ('{$this->formatid}','{$this->serverid}','".$ladderdb->escape($user['userid'])."','".$ladderdb->escape($user['username'])."',".$rp.")"); + $ladderdb->query("INSERT INTO `{$ladderdb->prefix}ladder` (`formatid`,`userid`,`username`,`rptime`) VALUES ('{$this->formatid}','".$ladderdb->escape($user['userid'])."','".$ladderdb->escape($user['username'])."',".$rp.")"); $user['rating'] = array( 'entryid' => $ladderdb->insert_id(), 'formatid' => $this->formatid, @@ -166,8 +165,8 @@ class NTBBLadder { 'l' => 0, 't' => 0, 'gxe' => 50, - 'acre' => 1000, - 'lacre' => 1000, + 'elo' => 1000, + 'col1' => 1000, ); return true; } @@ -180,7 +179,7 @@ class NTBBLadder { function getAllRatings(&$user) { global $ladderdb; if (!@$user['ratings']) { - $res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `serverid` = '{$this->serverid}' AND `userid` = '".$ladderdb->escape($user['userid'])."'"); + $res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `userid` = '".$ladderdb->escape($user['userid'])."'"); if (!$res) { return false; } @@ -212,12 +211,12 @@ class NTBBLadder { // $limit = 1000; // } - $res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}' AND `serverid` = '{$this->serverid}' ORDER BY `lacre` DESC LIMIT $limit"); + $res = $ladderdb->query("SELECT * FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}' ORDER BY `elo` DESC LIMIT $limit"); $j = 0; while ($row = $ladderdb->fetch_assoc($res)) { $j++; - // if ($row['lacre'] < 0 && $j > 50) break; + // if ($row['col1'] < 0 && $j > 50) break; $user = array( 'username' => $row['username'], 'userid' => $row['userid'], @@ -239,14 +238,14 @@ class NTBBLadder { function clearAllRatings() { global $ladderdb; - $res = $ladderdb->query("DELETE FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}' AND `serverid` = '{$this->serverid}'"); + $res = $ladderdb->query("DELETE FROM `{$ladderdb->prefix}ladder` WHERE `formatid` = '{$this->formatid}'"); } function saveRating($user) { global $ladderdb; if (!$user['rating']) return false; - return !!$ladderdb->query("UPDATE `{$ladderdb->prefix}ladder` SET `w`={$user['rating']['w']}, `l`={$user['rating']['l']}, `t`={$user['rating']['t']}, `r`={$user['rating']['r']}, `rd`={$user['rating']['rd']}, `sigma`={$user['rating']['sigma']}, `rptime`={$user['rating']['rptime']}, `rpr`={$user['rating']['rpr']}, `rprd`={$user['rating']['rprd']}, `rpsigma`={$user['rating']['rpsigma']}, `rpdata`='".$ladderdb->escape($user['rating']['rpdata'])."', `gxe`={$user['rating']['gxe']}, `acre`={$user['rating']['acre']}, `lacre`={$user['rating']['lacre']} WHERE `entryid` = {$user['rating']['entryid']} LIMIT 1"); + return !!$ladderdb->query("UPDATE `{$ladderdb->prefix}ladder` SET `w`={$user['rating']['w']}, `l`={$user['rating']['l']}, `t`={$user['rating']['t']}, `r`={$user['rating']['r']}, `rd`={$user['rating']['rd']}, `sigma`={$user['rating']['sigma']}, `rptime`={$user['rating']['rptime']}, `rpr`={$user['rating']['rpr']}, `rprd`={$user['rating']['rprd']}, `rpsigma`={$user['rating']['rpsigma']}, `rpdata`='".$ladderdb->escape($user['rating']['rpdata'])."', `gxe`={$user['rating']['gxe']}, `elo`={$user['rating']['elo']} WHERE `entryid` = {$user['rating']['entryid']} LIMIT 1"); } function update(&$user, $newM = false, $newMelo = 1000, $force = false) { @@ -257,7 +256,7 @@ class NTBBLadder { return false; } - $elo = $user['rating']['acre']; + $elo = $user['rating']['elo']; $rating = new GlickoPlayer($user['rating']['r'], $user['rating']['rd']); if ($user['rating']['rpdata']) { @@ -294,7 +293,7 @@ class NTBBLadder { } $user['rating']['r'] = $rating->rating; $user['rating']['rd'] = $rating->rd; - $user['rating']['lacre'] = $user['rating']['acre'] = $elo; + $$user['rating']['elo'] = $elo; } if ($newM) { @@ -324,25 +323,25 @@ class NTBBLadder { // $user['rating']['gxe'] = round(100 / (1 + pow(10,((1500 - $rating->rating) * pi() / sqrt(3 * log(10)*log(10) * $rating->rd*$rating->rd + 2500 * (64 * pi()*pi() + 147 * log(10)*log(10)))))), 1); $user['rating']['gxe'] = round(100 / (1 + pow(10,((1500 - $rating->rating) / 400 / sqrt(1 + 0.0000100724 * ($rating->rd*$rating->rd + 130*130))))), 1); - if ($newM) { - // compensate for Glicko2 bug: don't lose rating on win, don't gain rating on lose - // if ($newM['score'] > .9 && $rating->rating < $oldrpr) { - // $delta = $oldrpr - $rating->rating; - // $offset += $delta; - // $user['rating']['rpr'] += $delta; - // } - // if ($newM['score'] < .1 && $rating->rating > $oldrpr) { - // $delta = $oldrpr - $rating->rating; - // $offset += $delta; - // $user['rating']['rpr'] += $delta; - // } - } + // if ($newM) { + // // compensate for Glicko2 bug: don't lose rating on win, don't gain rating on lose + // if ($newM['score'] > .9 && $rating->rating < $oldrpr) { + // $delta = $oldrpr - $rating->rating; + // $offset += $delta; + // $user['rating']['rpr'] += $delta; + // } + // if ($newM['score'] < .1 && $rating->rating > $oldrpr) { + // $delta = $oldrpr - $rating->rating; + // $offset += $delta; + // $user['rating']['rpr'] += $delta; + // } + // } if ($offset) { $user['rating']['rpdata'] .= '##'.$offset; } if ($newM) { - $user['rating']['oldacre'] = $elo; + $user['rating']['oldelo'] = $elo; $K = 50; if ($elo < 1100) { @@ -362,7 +361,7 @@ class NTBBLadder { if ($elo < 1000) $elo = 1000; - $user['rating']['lacre'] = $user['rating']['acre'] = $elo; + $user['rating']['elo'] = $elo; } return true; @@ -381,11 +380,11 @@ class NTBBLadder { } $p1M['score'] = $p1score; $p2M['score'] = 1 - $p1score; - $p1Macre = $p2['rating']['acre']; - $p2Macre = $p1['rating']['acre']; + $p1Melo = $p2['rating']['elo']; + $p2Melo = $p1['rating']['elo']; - $this->update($p1, $p1M, $p1Macre); - $this->update($p2, $p2M, $p2Macre); + $this->update($p1, $p1M, $p1Melo); + $this->update($p2, $p2M, $p2Melo); $this->saveRating($p1); $this->saveRating($p2); diff --git a/lib/ntbb-ladder.sql b/lib/ntbb-ladder.sql index 22d582a7e..71c587a07 100644 --- a/lib/ntbb-ladder.sql +++ b/lib/ntbb-ladder.sql @@ -1,16 +1,14 @@ --- phpMyAdmin SQL Dump --- version 3.3.10.4 --- http://www.phpmyadmin.net --- --- Host: mysql.pokemonshowdown.com --- Generation Time: Jan 23, 2013 at 04:24 PM --- Server version: 5.1.39 --- PHP Version: 5.3.13 +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET time_zone = "+00:00"; -SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; -- --- Database: `pokemonshowdown` +-- Database: `showdown` -- -- -------------------------------------------------------- @@ -21,10 +19,9 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; CREATE TABLE IF NOT EXISTS `ntbb_ladder` ( `entryid` int(11) NOT NULL AUTO_INCREMENT, - `serverid` varchar(255) NOT NULL, - `formatid` varchar(255) NOT NULL, - `userid` varchar(255) NOT NULL, - `username` varchar(255) NOT NULL, + `formatid` varchar(63) CHARACTER SET ascii COLLATE ascii_bin NOT NULL, + `userid` varchar(63) CHARACTER SET ascii COLLATE ascii_bin NOT NULL, + `username` varchar(63) COLLATE utf8mb4_bin NOT NULL, `w` int(11) NOT NULL DEFAULT '0', `l` int(11) NOT NULL DEFAULT '0', `t` int(11) NOT NULL DEFAULT '0', @@ -36,14 +33,14 @@ CREATE TABLE IF NOT EXISTS `ntbb_ladder` ( `rpr` double NOT NULL DEFAULT '1500', `rprd` double NOT NULL DEFAULT '350', `rpsigma` double NOT NULL DEFAULT '0.06', - `rpdata` text NOT NULL, - `acre` double NOT NULL DEFAULT '1000', - `lacre` double NOT NULL, + `rpdata` mediumtext CHARACTER SET ascii COLLATE ascii_bin NOT NULL, + `elo` double NOT NULL DEFAULT '1000', + `col1` double NOT NULL, PRIMARY KEY (`entryid`), - KEY `ladderid` (`formatid`,`userid`,`gxe`), - KEY `serverid` (`serverid`), - KEY `acre` (`acre`), - KEY `lacre` (`lacre`), - KEY `userid` (`userid`), - KEY `formatid` (`formatid`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=424968 ; + UNIQUE KEY `userformats` (`userid`,`formatid`), + KEY `formattoplist` (`formatid`,`elo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1 ; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;