diff --git a/application/core/Statistics/StatisticManager.php b/application/core/Statistics/StatisticManager.php index b37ce8c5..fef00c75 100644 --- a/application/core/Statistics/StatisticManager.php +++ b/application/core/Statistics/StatisticManager.php @@ -1,34 +1,175 @@ maniaControl = $maniaControl; + $this->mysqli = $this->maniaControl->database->mysqli; $this->initTables(); + + $this->statisticCollector = new StatisticCollector($maniaControl); + + //Store Stats MetaData + $this->storeStatMetaData(); + } + + /** + * Get the value of an statistic + * + * @param $statName + * @param $playerId + * @param bool $serverLogin + * @return int + */ + public function getStatisticData($statName, $playerId, $serverLogin = false) { + $statId = $this->getStatId($statName); + + if($statId == null) { + return -1; + } + + if(!$serverLogin) { + $query = "SELECT SUM(value) as value FROM `" . self::TABLE_STATISTICS . "` WHERE `statId` = " . $statId . " AND `playerId` = " . $playerId . ";"; + } else { + $query = "SELECT value FROM `" . self::TABLE_STATISTICS . "` WHERE `statId` = " . $statId . " AND `playerId` = " . $playerId . " AND `serverLogin` = '" . $serverLogin . "';"; + } + + $result = $this->mysqli->query($query); + if(!$result) { + trigger_error($this->mysqli->error); + } + + $row = $result->fetch_object(); + + $result->close(); + return $row->value; + } + + /** + * Store Stats Meta Data from the Database + */ + private function storeStatMetaData() { + $query = "SELECT * FROM `" . self::TABLE_STATMETADATA . "`;"; + $result = $this->mysqli->query($query); + if(!$result) { + trigger_error($this->mysqli->error); + } + + while($row = $result->fetch_object()) { + $this->stats[$row->name] = $row; + } + + $result->close(); + } + + /** + * Returns the Stats Id + * + * @param $statName + * @return int + */ + private function getStatId($statName) { + if(isset($this->stats[$statName])) { + $stat = $this->stats[$statName]; + return $stat->index; + } else { + return null; + } + } + + /** + * Inserts a Stat into the database + * + * @param $statName + * @param Player $player + * @param string $serverLogin + * @param $value , value to Add + * @param string $statType + */ + public function insertStat($statName, Player $player, $serverLogin, $value, $statType = self::STAT_TYPE_INT) { + $statId = $this->getStatId($statName); + + if($statId == null) { + return false; + } + + if($player->isFakePlayer()) { + return true; + } + + $query = "INSERT INTO `" . self::TABLE_STATISTICS . "` ( + `serverLogin`, + `playerId`, + `statId`, + `value` + ) VALUES ( + ?, ?, ?, ? + ) ON DUPLICATE KEY UPDATE + `value` = `value` + VALUES(`value`);"; + + $statement = $this->mysqli->prepare($query); + if($this->mysqli->error) { + trigger_error($this->mysqli->error); + return false; + } + $statement->bind_param('siii', $serverLogin, $player->index, $statId, $value); + $statement->execute(); + if($statement->error) { + trigger_error($statement->error); + $statement->close(); + return false; + } + + $statement->close(); + return true; + } + + /** + * Increments a Statistic by one + * + * @param $statName + * @param Player $playerId + * @param $serverLogin + * @return bool + */ + public function incrementStat($statName, Player $player, $serverLogin) { + return $this->insertStat($statName, $player, $serverLogin, 1); } /** @@ -36,39 +177,36 @@ class StatisticManager { * * @param string $statName * @param string $statDescription - * @return bool */ public function defineStatMetaData($statName, $statDescription = '') { - $mysqli = $this->maniaControl->database->mysqli; - $query = "INSERT IGNORE INTO `" . self::TABLE_STATMETADATA . "` ( - `name`, - `description` + $query = "INSERT IGNORE INTO `" . self::TABLE_STATMETADATA . "` ( + `name`, + `description` ) VALUES ( - ?, ? + ?, ? );"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error); + $statement = $this->mysqli->prepare($query); + if($this->mysqli->error) { + trigger_error($this->mysqli->error); return false; } $statement->bind_param('ss', $statName, $statDescription); $statement->execute(); - if ($statement->error) { + if($statement->error) { trigger_error($statement->error); $statement->close(); return false; } + $statement->close(); - return true; } /** - * Initialize necessary Database Tables + * Initialize necessary database tables * * @return bool */ private function initTables() { - $mysqli = $this->maniaControl->database->mysqli; $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATMETADATA . "` ( `index` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, @@ -76,36 +214,43 @@ class StatisticManager { PRIMARY KEY (`index`), UNIQUE KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Statistics Meta Data' AUTO_INCREMENT=1;"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); + + $statement = $this->mysqli->prepare($query); + if($this->mysqli->error) { + trigger_error($this->mysqli->error, E_USER_ERROR); + return false; } $statement->execute(); - if ($statement->error) { + if($statement->error) { trigger_error($statement->error, E_USER_ERROR); + return false; } $statement->close(); - + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATISTICS . "` ( - `statId` int(11) NOT NULL AUTO_INCREMENT, + `index` int(11) NOT NULL AUTO_INCREMENT, + `serverLogin` varchar(50) NOT NULL, `playerId` int(11) NOT NULL, - `serverId` int(11) NOT NULL, + `statId` int(11) NOT NULL, `value` int(20) COLLATE utf8_unicode_ci NOT NULL, - UNIQUE KEY `unique` (`statId`,`playerId`,`serverId`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Statistics Data' AUTO_INCREMENT=1;"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); + PRIMARY KEY (`index`), + UNIQUE KEY `unique` (`statId`,`playerId`,`serverLogin`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Statistics' AUTO_INCREMENT=1;"; + + $statement = $this->mysqli->prepare($query); + if($this->mysqli->error) { + trigger_error($this->mysqli->error, E_USER_ERROR); + return false; } $statement->execute(); - if ($statement->error) { + if($statement->error) { trigger_error($statement->error, E_USER_ERROR); + return false; } $statement->close(); - return true; } -} +} \ No newline at end of file