mirror of
https://github.com/slawkens/myaac.git
synced 2025-12-16 22:07:10 +01:00
Merge branch 'main' into feature/pot-hook-filter
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -26,10 +26,11 @@ use MyAAC\Cache\Cache;
|
||||
*/
|
||||
class OTS_DB_MySQL extends OTS_Base_DB
|
||||
{
|
||||
private $has_table_cache = array();
|
||||
private $has_column_cache = array();
|
||||
private array $has_table_cache = [];
|
||||
private array $has_column_cache = [];
|
||||
private array $get_column_info_cache = [];
|
||||
|
||||
private $clearCacheAfter = false;
|
||||
private bool $clearCacheAfter = false;
|
||||
/**
|
||||
* Creates database connection.
|
||||
*
|
||||
@@ -119,6 +120,11 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
if($cache->fetch('database_columns', $tmp) && $tmp) {
|
||||
$this->has_column_cache = unserialize($tmp);
|
||||
}
|
||||
|
||||
$tmp = null;
|
||||
if($cache->fetch('database_columns_info', $tmp) && $tmp) {
|
||||
$this->get_column_info_cache = unserialize($tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,11 +161,13 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
if ($this->clearCacheAfter) {
|
||||
$cache->delete('database_tables');
|
||||
$cache->delete('database_columns');
|
||||
$cache->delete('database_columns_info');
|
||||
$cache->delete('database_checksum');
|
||||
}
|
||||
else {
|
||||
$cache->set('database_tables', serialize($this->has_table_cache), 3600);
|
||||
$cache->set('database_columns', serialize($this->has_column_cache), 3600);
|
||||
$cache->set('database_columns_info', serialize($this->get_column_info_cache), 3600);
|
||||
$cache->set('database_checksum', serialize(sha1($config['database_host'] . '.' . $config['database_name'])), 3600);
|
||||
}
|
||||
}
|
||||
@@ -209,7 +217,8 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
return $sql;
|
||||
}
|
||||
|
||||
public function hasTable($name) {
|
||||
public function hasTable($name): bool
|
||||
{
|
||||
if(isset($this->has_table_cache[$name])) {
|
||||
return $this->has_table_cache[$name];
|
||||
}
|
||||
@@ -217,12 +226,13 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
return $this->hasTableInternal($name);
|
||||
}
|
||||
|
||||
private function hasTableInternal($name) {
|
||||
global $config;
|
||||
return ($this->has_table_cache[$name] = $this->query('SELECT `TABLE_NAME` FROM `information_schema`.`tables` WHERE `TABLE_SCHEMA` = ' . $this->quote($config['database_name']) . ' AND `TABLE_NAME` = ' . $this->quote($name) . ' LIMIT 1;')->rowCount() > 0);
|
||||
private function hasTableInternal($name): bool
|
||||
{
|
||||
return ($this->has_table_cache[$name] = $this->query('SELECT `TABLE_NAME` FROM `information_schema`.`tables` WHERE `TABLE_SCHEMA` = ' . $this->quote(config('database_name')) . ' AND `TABLE_NAME` = ' . $this->quote($name) . ' LIMIT 1;')->rowCount() > 0);
|
||||
}
|
||||
|
||||
public function hasColumn($table, $column) {
|
||||
public function hasColumn($table, $column): bool
|
||||
{
|
||||
if(isset($this->has_column_cache[$table . '.' . $column])) {
|
||||
return $this->has_column_cache[$table . '.' . $column];
|
||||
}
|
||||
@@ -230,8 +240,8 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
return $this->hasColumnInternal($table, $column);
|
||||
}
|
||||
|
||||
private function hasColumnInternal($table, $column) {
|
||||
return $this->hasTable($table) && ($this->has_column_cache[$table . '.' . $column] = count($this->query('SHOW COLUMNS FROM `' . $table . "` LIKE '" . $column . "'")->fetchAll()) > 0);
|
||||
private function hasColumnInternal($table, $column): bool {
|
||||
return $this->hasTable($table) && ($this->has_column_cache[$table . '.' . $column] = count($this->query('SHOW COLUMNS FROM `' . $table . "` LIKE " . $this->quote($column))->fetchAll()) > 0);
|
||||
}
|
||||
|
||||
public function hasTableAndColumns(string $table, array $columns = []): bool
|
||||
@@ -247,7 +257,53 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
return true;
|
||||
}
|
||||
|
||||
public function revalidateCache() {
|
||||
public function getColumnInfo(string $table, string $column): bool|array
|
||||
{
|
||||
if(isset($this->get_column_info_cache[$table . '.' . $column])) {
|
||||
return $this->get_column_info_cache[$table . '.' . $column];
|
||||
}
|
||||
|
||||
return $this->getColumnInfoInternal($table, $column);
|
||||
}
|
||||
|
||||
private function getColumnInfoInternal(string $table, string $column): bool|array
|
||||
{
|
||||
if (!$this->hasTable($table) || !$this->hasColumn($table, $column)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$formatResult = function ($result) {
|
||||
return [
|
||||
'field' => $result['Field'],
|
||||
'type' => $result['Type'],
|
||||
'null' => strtolower($result['Null']),
|
||||
'default' => $result['Default'],
|
||||
'extra' => $result['Extra'],
|
||||
];
|
||||
};
|
||||
|
||||
$query = $this->query('SHOW COLUMNS FROM `' . $table . "` LIKE " . $this->quote($column));
|
||||
$rowCount = $query->rowCount();
|
||||
if ($rowCount > 1) {
|
||||
$tmp = [];
|
||||
|
||||
$results = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||
foreach ($results as $result) {
|
||||
$tmp[] = $formatResult($result);
|
||||
}
|
||||
|
||||
return ($this->get_column_info_cache[$table . '.' . $column] = $tmp);
|
||||
}
|
||||
else if ($rowCount == 1) {
|
||||
$result = $query->fetch(PDO::FETCH_ASSOC);
|
||||
return ($this->get_column_info_cache[$table . '.' . $column] = $formatResult($result));
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
public function revalidateCache(): void
|
||||
{
|
||||
foreach($this->has_table_cache as $key => $value) {
|
||||
$this->hasTableInternal($key);
|
||||
}
|
||||
@@ -262,6 +318,21 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
$this->hasColumnInternal($explode[0], $explode[1]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach($this->get_column_info_cache as $key => $value) {
|
||||
$explode = explode('.', $key);
|
||||
if(!isset($this->has_table_cache[$explode[0]])) { // first check if table exist
|
||||
$this->hasTableInternal($explode[0]);
|
||||
}
|
||||
|
||||
if($this->has_table_cache[$explode[0]]) {
|
||||
$this->hasColumnInternal($explode[0], $explode[1]);
|
||||
}
|
||||
|
||||
if($this->has_table_cache[$explode[0]]) {
|
||||
$this->getColumnInfoInternal($explode[0], $explode[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function setClearCacheAfter($clearCache)
|
||||
|
||||
@@ -2919,6 +2919,32 @@ class OTS_Player extends OTS_Row_DAO
|
||||
$this->data['banned'] = $ban['active'];
|
||||
$this->data['banned_time'] = $ban['expires'];
|
||||
}
|
||||
|
||||
public function isNameLocked(): bool
|
||||
{
|
||||
// nothing can't be banned
|
||||
if( !$this->isLoaded() ) {
|
||||
throw new E_OTS_NotLoaded();
|
||||
}
|
||||
|
||||
if($this->db->hasTable('player_namelocks')) {
|
||||
$ban = $this->db->query('SELECT 1 FROM `player_namelocks` WHERE `player_id` = ' . $this->data['id'])->fetch(PDO::FETCH_ASSOC);
|
||||
return (isset($ban['1']));
|
||||
}
|
||||
else if($this->db->hasTable('bans')) {
|
||||
if($this->db->hasColumn('bans', 'active')) {
|
||||
$ban = $this->db->query('SELECT `active`, `expires` FROM `bans` WHERE `type` = 2 AND `active` = 1 AND `value` = ' . $this->data['id'] . ' AND (`expires` > ' . time() .' OR `expires` = -1) ORDER BY `expires` DESC')->fetch();
|
||||
return isset($ban['active']);
|
||||
}
|
||||
else { // tfs 0.2
|
||||
$ban = $this->db->query('SELECT `time` FROM `bans` WHERE `type` = 2 AND `account` = ' . $this->data['account_id'] . ' AND (`time` > ' . time() .' OR `time` = -1) ORDER BY `time` DESC')->fetch();
|
||||
|
||||
return isset($ban['time']) && ($ban['time'] == -1 || $ban['time'] > 0);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Deletes player.
|
||||
*
|
||||
@@ -2953,21 +2979,14 @@ class OTS_Player extends OTS_Row_DAO
|
||||
* @return string Player proffesion name.
|
||||
* @throws E_OTS_NotLoaded If player is not loaded or global vocations list is not loaded.
|
||||
*/
|
||||
public function getVocationName()
|
||||
public function getVocationName(): string
|
||||
{
|
||||
if( !isset($this->data['vocation']) )
|
||||
{
|
||||
throw new E_OTS_NotLoaded();
|
||||
}
|
||||
|
||||
global $config;
|
||||
$voc = $this->getVocation();
|
||||
if(!isset($config['vocations'][$voc])) {
|
||||
return 'Unknown';
|
||||
}
|
||||
|
||||
return $config['vocations'][$voc];
|
||||
//return POT::getInstance()->getVocationsList()->getVocationName($this->data['vocation']);
|
||||
return OTS_Toolbox::getVocationName($this->data['vocation'], $this->data['promotion'] ?? 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -97,6 +97,8 @@ class OTS_ServerInfo
|
||||
return new OTS_Buffer($data);
|
||||
}
|
||||
|
||||
log_append('status-error.log', "Cannot connect to {$this->server}:{$this->port} - Error code: $error, message: $message");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
/**
|
||||
* Toolbox for common operations.
|
||||
*
|
||||
*
|
||||
* @package POT
|
||||
* @version 0.1.5
|
||||
*/
|
||||
@@ -23,41 +23,41 @@ class OTS_Toolbox
|
||||
{
|
||||
/**
|
||||
* Calculates experience points needed for given level.
|
||||
*
|
||||
*
|
||||
* @param int $level Level for which experience should be calculated.
|
||||
* @param int $experience Current experience points.
|
||||
* @return int Experience points for level.
|
||||
*/
|
||||
public static function experienceForLevel($level, $experience = 0)
|
||||
{
|
||||
//return 50 * ($level - 1) * ($level * $level - 5 * $level + 12) / 3 - $experience;
|
||||
{
|
||||
//return 50 * ($level - 1) * ($level * $level - 5 * $level + 12) / 3 - $experience;
|
||||
$level = $level - 1;
|
||||
return ((50 * $level * $level * $level) - (150 * $level * $level) + (400 * $level)) / 3;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds out which level user have basing on his/her experience.
|
||||
*
|
||||
*
|
||||
* <p>
|
||||
* PHP doesn't support complex numbers natively so solving third-level polynomials would be quite hard. Rather then doing this, this method iterates calculating experience for next levels until it finds one which requires enought experience we have. Because of that, for high experience values this function can take relatively long time to be executed.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param int $experience Current experience points.
|
||||
* @return int Experience level.
|
||||
*/
|
||||
public static function levelForExperience($experience)
|
||||
{
|
||||
// default level
|
||||
$level = 1;
|
||||
public static function levelForExperience($experience)
|
||||
{
|
||||
// default level
|
||||
$level = 1;
|
||||
|
||||
// until we will find level which requires more experience then we have we will step to next
|
||||
while( self::experienceForLevel($level + 1) <= $experience)
|
||||
{
|
||||
$level++;
|
||||
}
|
||||
// until we will find level which requires more experience then we have we will step to next
|
||||
while( self::experienceForLevel($level + 1) <= $experience)
|
||||
{
|
||||
$level++;
|
||||
}
|
||||
|
||||
return $level;
|
||||
}
|
||||
return $level;
|
||||
}
|
||||
|
||||
/**
|
||||
* @version 0.1.5
|
||||
@@ -65,25 +65,25 @@ class OTS_Toolbox
|
||||
* @return OTS_Players_List Filtered list.
|
||||
* @deprecated 0.1.5 Use OTS_PlayerBans_List.
|
||||
*/
|
||||
public static function bannedPlayers()
|
||||
{
|
||||
// creates filter
|
||||
$filter = new OTS_SQLFilter();
|
||||
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_PLAYER);
|
||||
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
||||
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'players') );
|
||||
public static function bannedPlayers()
|
||||
{
|
||||
// creates filter
|
||||
$filter = new OTS_SQLFilter();
|
||||
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_PLAYER);
|
||||
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
||||
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'players') );
|
||||
|
||||
// selects only active bans
|
||||
$actives = new OTS_SQLFilter();
|
||||
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
||||
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
||||
$filter->addFilter($actives);
|
||||
// selects only active bans
|
||||
$actives = new OTS_SQLFilter();
|
||||
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
||||
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
||||
$filter->addFilter($actives);
|
||||
|
||||
// creates list and aplies filter
|
||||
$list = new OTS_Players_List();
|
||||
$list->setFilter($filter);
|
||||
return $list;
|
||||
}
|
||||
// creates list and aplies filter
|
||||
$list = new OTS_Players_List();
|
||||
$list->setFilter($filter);
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* @version 0.1.5
|
||||
@@ -91,25 +91,34 @@ class OTS_Toolbox
|
||||
* @return OTS_Accounts_List Filtered list.
|
||||
* @deprecated 0.1.5 Use OTS_AccountBans_List.
|
||||
*/
|
||||
public static function bannedAccounts()
|
||||
{
|
||||
// creates filter
|
||||
$filter = new OTS_SQLFilter();
|
||||
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_ACCOUNT);
|
||||
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
||||
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'accounts') );
|
||||
public static function bannedAccounts()
|
||||
{
|
||||
// creates filter
|
||||
$filter = new OTS_SQLFilter();
|
||||
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_ACCOUNT);
|
||||
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
||||
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'accounts') );
|
||||
|
||||
// selects only active bans
|
||||
$actives = new OTS_SQLFilter();
|
||||
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
||||
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
||||
$filter->addFilter($actives);
|
||||
// selects only active bans
|
||||
$actives = new OTS_SQLFilter();
|
||||
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
||||
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
||||
$filter->addFilter($actives);
|
||||
|
||||
// creates list and aplies filter
|
||||
$list = new OTS_Accounts_List();
|
||||
$list->setFilter($filter);
|
||||
return $list;
|
||||
}
|
||||
// creates list and aplies filter
|
||||
$list = new OTS_Accounts_List();
|
||||
$list->setFilter($filter);
|
||||
return $list;
|
||||
}
|
||||
|
||||
public static function getVocationName($id, $promotion = 0): string
|
||||
{
|
||||
if($promotion > 0) {
|
||||
$id = ($id + ($promotion * config('vocations_amount')));
|
||||
}
|
||||
|
||||
return config('vocations')[$id] ?? 'Unknown';
|
||||
}
|
||||
}
|
||||
|
||||
/**#@-*/
|
||||
|
||||
Reference in New Issue
Block a user