diff --git a/config.php b/config.php
index 44a0423..7513fd2 100644
--- a/config.php
+++ b/config.php
@@ -161,6 +161,8 @@
'status_port' => "7171",
);
+ $config['delete_character_interval'] = '3 DAY'; // Delay after user character delete request is executed eg. 1 DAY, 2 HOUR, 3 MONTH etc.
+
$config['validate_IP'] = true; // Only allow legal IP addresses to register and create character.
$config['salt'] = false; // Some noob 0.3.6 servers don't support salt.
diff --git a/engine/database/connect.php b/engine/database/connect.php
index b64ae59..00d7b27 100644
--- a/engine/database/connect.php
+++ b/engine/database/connect.php
@@ -205,6 +205,15 @@ CREATE TABLE IF NOT EXISTS `znote_forum_posts` (
`updated` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
+
+CREATE TABLE IF NOT EXISTS `znote_deleted_characters` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `original_account_id` int(11) NOT NULL,
+ `character_name` varchar(255) NOT NULL,
+ `time` datetime NOT NULL,
+ `done` tinyint(1) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
diff --git a/engine/function/users.php b/engine/function/users.php
index cc04e78..35da1f8 100644
--- a/engine/function/users.php
+++ b/engine/function/users.php
@@ -759,6 +759,31 @@ function user_delete_character($char_id) {
mysql_delete("DELETE FROM `znote_players` WHERE `player_id`='$char_id';");
}
+// Delete character with supplied id with a delay.
+function user_delete_character_soft($char_id) {
+ $char_id = (int)$char_id;
+
+ $char_name = user_character_name($char_id);
+ $original_acc_id = user_character_account_id($char_name);
+ if(!user_character_pending_delete($char_name))
+ mysql_insert('INSERT INTO `znote_deleted_characters`(`original_account_id`, `character_name`, `time`, `done`) VALUES(' . $original_acc_id . ', "' . $char_name . '", (NOW() + INTERVAL ' . Config('delete_character_interval') . '), 0)');
+ else
+ return false;
+}
+
+// Check if character will be deleted soon.
+function user_character_pending_delete($char_name) {
+ $char_name = sanitize($char_name);
+ $result = mysql_select_single('SELECT `done` FROM `znote_deleted_characters` WHERE `character_name` = "' . $char_name . '"');
+ return ($result === false) ? false : !$result['done'];
+}
+
+// Get pending character deletes for supplied account id.
+function user_pending_deletes($acc_id) {
+ $acc_id = (int)$acc_id;
+ return mysql_select_multi('SELECT `id`, `character_name`, `time` FROM `znote_deleted_characters` WHERE `original_account_id` = ' . $acc_id . ' AND `done` = 0');
+}
+
// Parameter: accounts.id returns: An array containing detailed information of every character on the account.
// Array: [0] = name, [1] = level, [2] = vocation, [3] = town_id, [4] = lastlogin, [5] = online
function user_character_list($account_id) {
@@ -1372,6 +1397,14 @@ function user_character_id($charname) {
else return false;
}
+// Get character name from character ID
+function user_character_name($charID) {
+ $charID = (int)$charID;
+ $char = mysql_select_single('SELECT `name` FROM `players` WHERE `id` = ' . $charID);
+ if ($char !== false) return $char['name'];
+ else return false;
+}
+
// Hide user character.
function user_character_hide($username) {
$username = sanitize($username);
diff --git a/myaccount.php b/myaccount.php
index aa3bdca..717d3b0 100644
--- a/myaccount.php
+++ b/myaccount.php
@@ -32,13 +32,13 @@ if (!empty($_POST['selected_delete'])) {
if ($charid !== false) {
if ($config['TFSVersion'] === 'TFS_10') {
if (!user_is_online_10($charid)) {
- if (guild_leader_gid($charid) === false) user_delete_character($charid);
+ if (guild_leader_gid($charid) === false) user_delete_character_soft($charid);
else echo 'Character is leader of a guild, you must disband the guild or change leadership before deleting character.';
} echo 'Character must be offline first.';
} else {
$chr_data = user_character_data($charid, 'online');
if ($chr_data['online'] != 1) {
- if (guild_leader_gid($charid) === false) user_delete_character($charid);
+ if (guild_leader_gid($charid) === false) user_delete_character_soft($charid);
else echo 'Character is leader of a guild, you must disband the guild or change leadership before deleting character.';
} else echo 'Character must be offline first.';
}
@@ -46,6 +46,19 @@ if (!empty($_POST['selected_delete'])) {
}
}
// end
+
+#region CANCEL CHARACTER DELETE
+$undelete_id = @$_GET['cancel_delete_id'];
+if($undelete_id) {
+ $undelete_id = (int)$undelete_id;
+ $undelete_q1 = mysql_select_single('SELECT `character_name` FROM `znote_deleted_characters` WHERE `done` = 0 AND `id` = ' . $undelete_id . ' AND `original_account_id` = ' . $session_user_id . ' AND NOW() < `time`');
+ if($undelete_q1) {
+ mysql_delete('DELETE FROM `znote_deleted_characters` WHERE `id` = ' . $undelete_id);
+ echo 'Pending delete of ' . $undelete_q1['character_name'] . ' has been successfully cancelled.
';
+ }
+}
+#endregion
+
// CHANGE character name
if (!empty($_POST['change_name'])) {
if (!Token::isValid($_POST['token'])) {
@@ -179,6 +192,17 @@ if (!empty($_POST['selected_comment'])) {
} else {
// end
$char_count = user_character_list_count($session_user_id);
+ $pending_delete = user_pending_deletes($session_user_id);
+ if($pending_delete)
+ foreach($pending_delete as $delete) {
+ if(new DateTime($delete['time']) > new DateTime())
+ echo 'CAUTION! Your character with name ' . $delete['character_name'] . ' will be deleted on ' . $delete['time'] . '. Cancel this operation.
';
+ else {
+ user_delete_character(user_character_id($delete['character_name']));
+ mysql_update('UPDATE `znote_deleted_characters` SET `done` = 1');
+ echo 'Character ' . $delete['character_name'] . ' has been deleted. This operation was requested by owner of this account.';
+ }
+ }
?>
My account