Merge pull request #44 from Kuzirashi/master

Added character deletion delay and fixed errors in Marketplace.
This commit is contained in:
Stefan A. Brannfjell 2014-04-19 15:12:43 +02:00
commit b0e40e4ccd
5 changed files with 73 additions and 5 deletions

View File

@ -161,6 +161,8 @@
'status_port' => "7171", '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['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. $config['salt'] = false; // Some noob 0.3.6 servers don't support salt.

View File

@ -205,6 +205,15 @@ CREATE TABLE IF NOT EXISTS `znote_forum_posts` (
`updated` int(11) NOT NULL, `updated` int(11) NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; ) 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 ;
</textarea> </textarea>
</li> </li>
<li> <li>

View File

@ -759,6 +759,31 @@ function user_delete_character($char_id) {
mysql_delete("DELETE FROM `znote_players` WHERE `player_id`='$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. // 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 // Array: [0] = name, [1] = level, [2] = vocation, [3] = town_id, [4] = lastlogin, [5] = online
function user_character_list($account_id) { function user_character_list($account_id) {
@ -1372,6 +1397,14 @@ function user_character_id($charname) {
else return false; 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. // Hide user character.
function user_character_hide($username) { function user_character_hide($username) {
$username = sanitize($username); $username = sanitize($username);

View File

@ -3,7 +3,7 @@
$server = $config['shop']['imageServer']; $server = $config['shop']['imageServer'];
$imageType = $config['shop']['imageType']; $imageType = $config['shop']['imageType'];
$compare = getValue($_GET['compare']); $compare = getValue(@$_GET['compare']);
// If you are not comparing any items, present the list. // If you are not comparing any items, present the list.
if (!$compare) { if (!$compare) {
@ -33,7 +33,7 @@ if (!$compare) {
<td>Compare</td> <td>Compare</td>
</tr> </tr>
<?php <?php
foreach ($offers['wts'] as $o) { foreach (($offers['wts'] ? $offers['wts'] : array()) as $o) {
?> ?>
<tr> <tr>
<td><img src="<?php echo "http://".$server."/".$o['item_id'].".".$imageType; ?>" alt="Item Image"></td> <td><img src="<?php echo "http://".$server."/".$o['item_id'].".".$imageType; ?>" alt="Item Image"></td>
@ -58,7 +58,7 @@ if (!$compare) {
<td>Compare</td> <td>Compare</td>
</tr> </tr>
<?php <?php
foreach ($offers['wtb'] as $o) { foreach (($offers['wtb'] ? $offers['wtb'] : array()) as $o) {
?> ?>
<tr> <tr>
<td><img src="<?php echo "http://".$server."/".$o['item_id'].".".$imageType; ?>" alt="Item Image"></td> <td><img src="<?php echo "http://".$server."/".$o['item_id'].".".$imageType; ?>" alt="Item Image"></td>

View File

@ -32,13 +32,13 @@ if (!empty($_POST['selected_delete'])) {
if ($charid !== false) { if ($charid !== false) {
if ($config['TFSVersion'] === 'TFS_10') { if ($config['TFSVersion'] === 'TFS_10') {
if (!user_is_online_10($charid)) { 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.'; 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.'; } echo 'Character must be offline first.';
} else { } else {
$chr_data = user_character_data($charid, 'online'); $chr_data = user_character_data($charid, 'online');
if ($chr_data['online'] != 1) { 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 is leader of a guild, you must disband the guild or change leadership before deleting character.';
} else echo 'Character must be offline first.'; } else echo 'Character must be offline first.';
} }
@ -46,6 +46,19 @@ if (!empty($_POST['selected_delete'])) {
} }
} }
// end // 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.<br/>';
}
}
#endregion
// CHANGE character name // CHANGE character name
if (!empty($_POST['change_name'])) { if (!empty($_POST['change_name'])) {
if (!Token::isValid($_POST['token'])) { if (!Token::isValid($_POST['token'])) {
@ -179,6 +192,17 @@ if (!empty($_POST['selected_comment'])) {
} else { } else {
// end // end
$char_count = user_character_list_count($session_user_id); $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 '<b>CAUTION!</b> Your character with name <b>' . $delete['character_name'] . ' will be deleted on ' . $delete['time'] . '</b>. <a href="myaccount.php?cancel_delete_id=' . $delete['id'] . '">Cancel this operation.</a><br/>';
else {
user_delete_character(user_character_id($delete['character_name']));
mysql_update('UPDATE `znote_deleted_characters` SET `done` = 1');
echo '<b>Character ' . $delete['character_name'] . ' has been deleted</b>. This operation was requested by owner of this account.';
}
}
?> ?>
<div id="myaccount"> <div id="myaccount">
<h1>My account</h1> <h1>My account</h1>