Refactor OTS_Account save(), fixing premium days on canary

This commit is contained in:
slawkens
2026-01-21 22:31:13 +01:00
parent 8d7c36e3eb
commit 87509ffe16
4 changed files with 111 additions and 73 deletions

View File

@@ -183,39 +183,7 @@ else if (isset($_REQUEST['search'])) {
$account->setName($name); $account->setName($name);
} }
if ($hasTypeColumn) {
$account->setCustomField('type', $group);
} elseif ($hasGroupColumn) {
$account->setCustomField('group_id', $group);
}
if ($hasSecretColumn) {
$account->setCustomField('secret', $secret);
}
$account->setCustomField('key', $key);
$account->setEMail($email); $account->setEMail($email);
if (HAS_ACCOUNT_COINS) {
$account->setCustomField('coins', $t_coins);
}
if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
$account->setCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN, $t_coins_transferable);
}
$lastDay = 0;
if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
$lastDay = time();
} else if ($lastDay != 0) {
$lastDay = 0;
}
$account->setPremDays($p_days);
$account->setLastLogin($lastDay);
if ($hasPointsColumn) {
$account->setCustomField('premium_points', $p_points);
}
$account->setRLName($rl_name); $account->setRLName($rl_name);
$account->setLocation($rl_loca); $account->setLocation($rl_loca);
@@ -223,9 +191,18 @@ else if (isset($_REQUEST['search'])) {
$account->setCountry($rl_country); $account->setCountry($rl_country);
} }
$account->setCustomField('created', $created);
$account->setWebFlags($web_flags); $account->setWebFlags($web_flags);
$account->setCustomField('web_lastlogin', $web_lastlogin);
if (!isCanary()) {
$lastDay = 0;
if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
$lastDay = time();
}
$account->setLastLogin($lastDay);
}
$account->setPremDays($p_days);
if (isset($password)) { if (isset($password)) {
if (USE_ACCOUNT_SALT) { if (USE_ACCOUNT_SALT) {
@@ -239,6 +216,34 @@ else if (isset($_REQUEST['search'])) {
} }
$account->save(); $account->save();
if ($hasTypeColumn) {
$account->setCustomField('type', $group);
} elseif ($hasGroupColumn) {
$account->setCustomField('group_id', $group);
}
if ($hasSecretColumn) {
$account->setCustomField('secret', $secret);
}
$account->setCustomField('key', $key);
if (HAS_ACCOUNT_COINS) {
$account->setCustomField('coins', $t_coins);
}
if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
$account->setCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN, $t_coins_transferable);
}
if ($hasPointsColumn) {
$account->setCustomField('premium_points', $p_points);
}
$account->setCustomField('created', $created);
$account->setCustomField('web_lastlogin', $web_lastlogin);
echo_success('Account saved at: ' . date('G:i')); echo_success('Account saved at: ' . date('G:i'));
} }
} }

View File

@@ -1812,8 +1812,8 @@ function getAccountIdentityColumn(): string
function isCanary(): bool function isCanary(): bool
{ {
$vipSystemEnabled = configLua('vipSystemEnabled'); $dataPackDirectory = configLua('dataPackDirectory');
return isset($vipSystemEnabled); return isset($dataPackDirectory);
} }
function getStatusUptimeReadable(int $uptime): string function getStatusUptimeReadable(int $uptime): string

View File

@@ -12,6 +12,7 @@
* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3 * @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3
*/ */
use MyAAC\Models\Account as AccountModel;
use MyAAC\Models\AccountAction; use MyAAC\Models\AccountAction;
/** /**
@@ -42,7 +43,11 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
*/ */
private $data = array('email' => '', 'rlname' => '','location' => '', 'country' => '','web_flags' => 0, 'lastday' => 0, 'premdays' => 0, 'created' => 0); private $data = array('email' => '', 'rlname' => '','location' => '', 'country' => '','web_flags' => 0, 'lastday' => 0, 'premdays' => 0, 'created' => 0);
public static $cache = array(); private array $columns = ['password', 'email', 'rlname', 'location', 'country', 'web_flags', 'created'];
private array $optionalColumns = ['name', 'number', 'lastday', 'premdays', 'premium_ends_at', 'premend'];
public static array $cache = [];
const GRATIS_PREMIUM_DAYS = 65535; const GRATIS_PREMIUM_DAYS = 65535;
/** /**
@@ -327,27 +332,50 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
*/ */
public function save() public function save()
{ {
if( !isset($this->data['id']) ) if (!isset($this->data['id'])) {
{
throw new E_OTS_NotLoaded(); throw new E_OTS_NotLoaded();
} }
$field = 'lastday'; $defaultValues = [
if($this->db->hasColumn('accounts', 'premend')) { // othire 'premium_ends_at' => 0,
$field = 'premend'; 'lastday' => 0,
if(!isset($this->data['premend'])) { 'premend' => 0,
$this->data['premend'] = 0; 'premdays' => 0,
} ];
}
else if($this->db->hasColumn('accounts', 'premium_ends_at')) { foreach ($defaultValues as $key => $value) {
$field = 'premium_ends_at'; if (!isset($this->data[$key])) {
if(!isset($this->data['premium_ends_at'])) { $this->data[$key] = $value;
$this->data['premium_ends_at'] = 0;
} }
} }
// UPDATE query on database $columns = $this->columns;
$this->db->exec('UPDATE `accounts` SET ' . ($this->db->hasColumn('accounts', 'name') ? '`name` = ' . $this->db->quote($this->data['name']) . ',' : '') . '`password` = ' . $this->db->quote($this->data['password']) . ', `email` = ' . $this->db->quote($this->data['email']) . ', `rlname` = ' . $this->db->quote($this->data['rlname']) . ', `location` = ' . $this->db->quote($this->data['location']) . ', `country` = ' . $this->db->quote($this->data['country']) . ', `web_flags` = ' . (int) $this->data['web_flags'] . ', ' . ($this->db->hasColumn('accounts', 'premdays') ? '`premdays` = ' . (int) $this->data['premdays'] . ',' : '') . '`' . $field . '` = ' . (int) $this->data[$field] . ' WHERE `id` = ' . $this->data['id']); foreach ($this->optionalColumns as $column) {
if ($this->db->hasColumn('accounts', $column)) {
$columns[] = $column;
}
}
$values = [];
foreach ($columns as $column) {
$value = $this->data[$column];
$values[$column] = $value;
}
// updates existing player
if( isset($this->data['id']) ) {
AccountModel::where('id', $this->data['id'])->update($values);
}
// creates new player
else {
$values['created'] = time();
$account = AccountModel::create($values);
// ID of new player
$this->data['id'] = $account->id;
}
} }
/** /**
@@ -506,11 +534,17 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
* @since 0.7.5 * @since 0.7.5
* @throws E_OTS_NotLoaded If account is not loaded. * @throws E_OTS_NotLoaded If account is not loaded.
*/ */
public function setPremDays($premdays) public function setPremDays($premdays): void
{ {
$this->data['premdays'] = (int) $premdays; $this->data['premdays'] = (int) $premdays;
$this->data['premend'] = time() + ($premdays * 24 * 60 * 60);
$this->data['premium_ends_at'] = time() + ($premdays * 24 * 60 * 60); $premiumTimeInSeconds = time() + ($premdays * 24 * 60 * 60);
$this->data['premend'] = $premiumTimeInSeconds;
$this->data['premium_ends_at'] = $premiumTimeInSeconds;
if (isCanary()) {
$this->data['lastday'] = $premiumTimeInSeconds;
}
} }
public function setRLName($name) public function setRLName($name)

View File

@@ -192,6 +192,21 @@ if($save)
$new_account->setPassword(encrypt($password)); $new_account->setPassword(encrypt($password));
$new_account->setEMail($email); $new_account->setEMail($email);
$settingAccountPremiumDays = setting('core.account_premium_days');
if($settingAccountPremiumDays && $settingAccountPremiumDays > 0) {
$new_account->setPremDays($settingAccountPremiumDays);
if (!isCanary()) {
$lastDay = 0;
if($settingAccountPremiumDays != 0 && $settingAccountPremiumDays != OTS_Account::GRATIS_PREMIUM_DAYS) {
$lastDay = time();
}
$new_account->setLastLogin($lastDay);
}
}
$new_account->save(); $new_account->save();
$hooks->trigger(HOOK_ACCOUNT_CREATE_AFTER_SAVED, ['account' => $new_account]); $hooks->trigger(HOOK_ACCOUNT_CREATE_AFTER_SAVED, ['account' => $new_account]);
@@ -206,22 +221,6 @@ if($save)
$new_account->setCustomField('country', $country); $new_account->setCustomField('country', $country);
} }
$settingAccountPremiumDays = setting('core.account_premium_days');
if($settingAccountPremiumDays && $settingAccountPremiumDays > 0) {
if($db->hasColumn('accounts', 'premend')) { // othire
$new_account->setCustomField('premend', time() + $settingAccountPremiumDays * 86400);
}
else { // rest
if ($db->hasColumn('accounts', 'premium_ends_at')) { // TFS 1.4+
$new_account->setCustomField('premium_ends_at', time() + $settingAccountPremiumDays * (60 * 60 * 24));
}
else {
$new_account->setCustomField('premdays', $settingAccountPremiumDays);
$new_account->setCustomField('lastday', time());
}
}
}
$accountDefaultPremiumPoints = setting('core.account_premium_points'); $accountDefaultPremiumPoints = setting('core.account_premium_points');
if($accountDefaultPremiumPoints > 0) { if($accountDefaultPremiumPoints > 0) {
$new_account->setCustomField('premium_points', $accountDefaultPremiumPoints); $new_account->setCustomField('premium_points', $accountDefaultPremiumPoints);