diff --git a/application/core/Players/PlayerDataManager.php b/application/core/Players/PlayerDataManager.php new file mode 100644 index 00000000..95e3df5a --- /dev/null +++ b/application/core/Players/PlayerDataManager.php @@ -0,0 +1,292 @@ +maniaControl = $maniaControl; + $this->initTables(); + + // Store Stats MetaData + //$this->storeMetaData(); + } + + /** + * Defines the Player-Data MetaData + * + * @param $object + * @param $dataName + * @param $default + * @param $dataDescription (optional) + * @return bool + */ + public function defineMetaData($object, $dataName, $default, $dataDescription = '') { + $mysqli = $this->maniaControl->database->mysqli; + $className = $this->getClassName($object); + + $query = "INSERT INTO `" . self::TABLE_PLAYERDATAMETADATA . "` ( + `class`, + `dataName`, + `type`, + `defaultValue`, + `description` + ) VALUES ( + ?, ?, ?, ?, ? + ) ON DUPLICATE KEY UPDATE + `type` = VALUES(`type`), + `defaultValue` = VALUES(`defaultValue`), + `description` = VALUES(`description`);"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; + } + $type = $this->getType($default); + + $statement->bind_param('sssss', $className, $dataName, $type, $default, $dataDescription); + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error); + $statement->close(); + return false; + } + $statement->close(); + return true; + } + + /** + * Store Meta Data from the Database in the Ram + */ + private function storeMetaData() { + $mysqli = $this->maniaControl->database->mysqli; + + $query = "SELECT * FROM `" . self::TABLE_PLAYERDATAMETADATA . "`;"; + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return; + } + + while($row = $result->fetch_object()) { + $this->metaData[$row->class . $row->dataName] = $row; + } + $result->close(); + } + + + /** + * Inserts a PlayerData to a specific defined statMetaData + * + * @param $object + * @param $statName + * @param Player $player + * @param $value + * @param $serverIndex (let it empty if its global) + * @return bool + */ + public function insertPlayerData($object, $statName, Player $player, $value, $serverIndex = -1) { + $className = $this->getClassName($object); + if (!$player) { + return false; + } + + $dataId = $this->getMetaDataId($className, $statName); + if (!$dataId) { + return false; + } + + $mysqli = $this->maniaControl->database->mysqli; + $query = "INSERT INTO `" . self::TABLE_PLAYERDATA . "` ( + `serverIndex`, + `playerId`, + `dataId`, + `value` + ) VALUES ( + ?, ?, ?, ? + ) ON DUPLICATE KEY UPDATE + `value` = VALUES(`value`);"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; + } + $statement->bind_param('iiis', $serverIndex, $player->index, $dataId, $value); + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error); + $statement->close(); + return false; + } + $statement->close(); + return true; + } + + /** + * Return the Id of the MetaData + * + * @param $statName + * @return int + */ + private function getMetaDataId($className, $statName) { + if (isset($this->metaData[$className . $statName])) { + $stat = $this->metaData[$className . $statName]; + return (int)$stat->dataId; + } + return null; + } + + /** + * Initialize necessary database tables + * + * @return bool + */ + private function initTables() { + $mysqli = $this->maniaControl->database->mysqli; + $defaultType = "'" . self::TYPE_STRING . "'"; + $typeSet = $defaultType . ",'" . self::TYPE_INT . "','" . self::TYPE_REAL . "','" . self::TYPE_BOOL . "','" . self::TYPE_ARRAY . "'"; + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERDATAMETADATA . "` ( + `dataId` int(11) NOT NULL AUTO_INCREMENT, + `class` varchar(100) NOT NULL, + `dataName` varchar(100) NOT NULL, + `type` set({$typeSet}) NOT NULL DEFAULT {$defaultType}, + `defaultValue` varchar(150) NOT NULL, + `description` varchar(150) NOT NULL, + PRIMARY KEY (`dataId`), + UNIQUE KEY `name` (`class`, `dataName`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Player-Data MetaData' AUTO_INCREMENT=1;"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error, E_USER_ERROR); + return false; + } + $statement->close(); + + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERDATA . "` ( + `index` int(11) NOT NULL AUTO_INCREMENT, + `serverIndex` int(11) NOT NULL, + `playerId` int(11) NOT NULL, + `dataId` int(11) NOT NULL, + `value` varchar(150) NOT NULL, + `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`index`), + UNIQUE KEY `unique` (`dataId`,`playerId`,`serverIndex`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Player Data' AUTO_INCREMENT=1;"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error, E_USER_ERROR); + return false; + } + $statement->close(); + return true; + } + + /** + * Get Type of a Parameter + * + * @param mixed $param + * @return string + */ + private function getType($param) { + if (is_int($param)) { + return self::TYPE_INT; + } + if (is_real($param)) { + return self::TYPE_REAL; + } + if (is_bool($param)) { + return self::TYPE_BOOL; + } + if (is_string($param)) { + return self::TYPE_STRING; + } + if (is_array($param)) { + return self::TYPE_ARRAY; + } + trigger_error('Unsupported setting type. ' . print_r($param, true)); + return null; + } + + /** + * Cast a Setting to the given Type + * + * @param string $type + * @param mixed $value + * @return mixed + */ + private function castSetting($type, $value) { + if ($type === self::TYPE_INT) { + return (int)$value; + } + if ($type === self::TYPE_REAL) { + return (float)$value; + } + if ($type === self::TYPE_BOOL) { + return (bool)$value; + } + if ($type === self::TYPE_STRING) { + return (string)$value; + } + if ($type === self::TYPE_ARRAY) { + return explode($this->arrayDelimiter, $value); + } + trigger_error('Unsupported setting type. ' . print_r($type, true)); + return $value; + } + + /** + * Get Class Name of a Parameter + * + * @param mixed $param + * @return string + */ + private function getClassName($param) { + if (is_object($param)) { + return get_class($param); + } + if (is_string($param)) { + return $param; + } + trigger_error('Invalid class param. ' . $param); + return (string)$param; + } +} \ No newline at end of file diff --git a/application/core/Players/PlayerManager.php b/application/core/Players/PlayerManager.php index 2d84eee5..5c4cd278 100644 --- a/application/core/Players/PlayerManager.php +++ b/application/core/Players/PlayerManager.php @@ -54,11 +54,12 @@ class PlayerManager implements CallbackListener, TimerListener { $this->maniaControl = $maniaControl; $this->initTables(); - $this->playerCommands = new PlayerCommands($maniaControl); - $this->playerActions = new PlayerActions($maniaControl); - $this->playerDetailed = new PlayerDetailed($maniaControl); - $this->playerList = new PlayerList($this->maniaControl); - $this->adminLists = new AdminLists($this->maniaControl); + $this->playerCommands = new PlayerCommands($maniaControl); + $this->playerActions = new PlayerActions($maniaControl); + $this->playerDetailed = new PlayerDetailed($maniaControl); + $this->playerDataManager = new PlayerDataManager($maniaControl); + $this->playerList = new PlayerList($maniaControl); + $this->adminLists = new AdminLists($maniaControl); // Init settings $this->maniaControl->settingManager->initSetting($this, self::SETTING_JOIN_LEAVE_MESSAGES, true); @@ -171,8 +172,9 @@ class PlayerManager implements CallbackListener, TimerListener { // Trigger own callback $this->maniaControl->callbackManager->triggerCallback(self::CB_PLAYERDISCONNECT, $player); - if ($player->isFakePlayer()) + if ($player->isFakePlayer()) { return; + } $played = Formatter::formatTimeH(time() - $player->joinTime); $logMessage = "Player left: {$player->login} / {$player->nickname} Playtime: {$played}"; diff --git a/application/plugins/Karma.php b/application/plugins/Karma.php index ff9fa734..5eeb9bb1 100644 --- a/application/plugins/Karma.php +++ b/application/plugins/Karma.php @@ -178,6 +178,10 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { * @param $time */ public function handle1Second($time) { + $this->maniaControl->playerManager->playerDataManager->defineMetaData($this, "Player Balance", 0.25, "hallo"); + + $this->maniaControl->playerManager->playerDataManager->insertPlayerData($this, "Player Balance", $this->maniaControl->playerManager->getPlayer("kremsy"), 200, $this->maniaControl->server->index); + if (!$this->updateManialink) { return; }