* * One character's actions (comment, gender, visibility, rename, delete) on a * single dedicated page instead of a dropdown+submit combo on myaccount.php. * Reuses the exact same server-side rules as myaccount.php's own switch, just * scoped to the character validated below instead of a posted selector. */ protect_page(); $char_name = getValue($_GET['character'] ?? null); $char_id = $char_name !== false ? user_character_id($char_name) : false; if ($char_name === false || $char_id === false || (int)user_character_account_id($char_name) !== (int)$session_user_id) { echo '

' . t('page.not_found') . '

'; return; } $errors = []; $notice = null; $deleted = false; if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST' && !empty($_POST['action'])) { if (!Token::isValid($_POST['token'] ?? null)) { exit(); } $action = getValue($_POST['action'] ?? null); switch ($action) { case 'toggle_hide': $hide = (user_character_hide($char_name) == 1 ? 0 : 1); user_character_set_hide($char_id, $hide); break; case 'change_gender': if (!user_is_online_10($char_id)) { $tickets = shop_account_gender_tickets($session_user_id); $tickets = is_array($tickets) ? $tickets : array(); if (!empty($tickets) || $config['free_sex_change'] == true) { $infinite = false; $tks = 0; foreach ($tickets as $ticket) { if ($ticket['count'] == 0) $infinite = true; else if ((int)$ticket['count'] > 0 && $infinite === false) $tks += (int)$ticket['count']; } if ($infinite === true) $tks = 0; $dbid = isset($tickets[0]['id']) ? (int)$tickets[0]['id'] : 0; if ($dbid > 0 && $tickets[0]['count'] > 1) { $tks--; shop_update_row_count($dbid, ((int)$tickets[0]['count'] - 1)); } else if ($dbid > 0 && $tickets[0]['count'] == 1) { shop_delete_row_order($dbid); $tks--; } user_character_change_gender($char_name); $notice = t('acc.gender_changed', ['name' => $char_name]); if ($tks > 0) $notice .= ' ' . t('acc.gender_tickets_left', ['n' => $tks]); else if ($infinite !== true) $notice .= ' ' . t('acc.gender_tickets_out'); } else { $errors[] = t('acc.no_gender_tickets'); } } else { $errors[] = t('acc.must_be_offline'); } break; case 'update_comment': user_update_comment($char_id, getValue($_POST['comment'] ?? null)); $notice = t('acc.comment_updated'); break; case 'change_name': $newname = isset($_POST['newName']) ? getValue($_POST['newName'] ?? null) : ''; if (user_is_online_10($char_id)) { $errors[] = t('acc.must_be_offline'); } $order = db()->fetchOne( "SELECT `id`, `account_id` FROM `znote_shop_orders` WHERE `type` = 4 AND `account_id` = ? LIMIT 1;", [(int)$session_user_id] ); if ($order === false) { $errors[] = t('acc.no_name_tickets'); } $validated = validate_name($newname); if ($validated === false) { $errors[] = t('acc.name_max_words'); } else { $newname = $validated; if (empty($newname)) { $errors[] = t('acc.name_required'); } else if (user_character_exist($newname) !== false) { $errors[] = t('acc.name_taken'); } else if (!preg_match("/^[a-zA-Z_ ]+$/", $newname)) { $errors[] = t('acc.name_letters'); } else if (strlen($newname) < $config['minL'] || strlen($newname) > $config['maxL']) { $errors[] = t('acc.name_length', ['min' => $config['minL'], 'max' => $config['maxL']]); } else if (!ctype_upper($newname[0])) { $errors[] = t('acc.name_capital'); } $resname = explode(' ', (string)($_POST['newName'] ?? '')); foreach ($resname as $res) { if (in_array(strtolower($res), $config['invalidNameTags'])) { $errors[] = t('reg.restricted_word'); } else if (strlen($res) == 1) { $errors[] = t('reg.words_too_short'); } } } if (empty($errors) && !empty($newname)) { $db = db(); if (!$db->beginTransaction()) { $errors[] = t('acc.sync_failed'); } else { $ok = $db->execute("UPDATE `players` SET `name` = ? WHERE `id` = ? LIMIT 1;", [$newname, $char_id]); $ok = $ok && $db->execute("DELETE FROM `znote_shop_orders` WHERE `id` = ? LIMIT 1;", [(int)$order['id']]); if ($ok) { $db->commit(); $char_name = $newname; $notice = t('acc.name_changed', ['name' => $newname]); } else { $db->rollback(); $errors[] = t('acc.sync_failed'); } } } break; case 'delete_character': if (!user_is_online_10($char_id)) { if (guild_leader_gid($char_id) === false) { user_delete_character_soft($char_id); $deleted = true; } else { $errors[] = t('acc.is_guild_leader'); } } else { $errors[] = t('acc.must_be_offline'); } break; } } $char = null; $gender = null; $comment_data = null; if (!$deleted) { $rows = user_character_list($session_user_id); if (is_array($rows)) { foreach ($rows as $row) { if ($row['name'] === $char_name) { $char = $row; break; } } } $gender = user_character_data($char_id, 'sex'); $comment_data = user_znote_character_data($char_id, 'comment'); } $nameTicketCount = (int)(db()->fetchOne( "SELECT COUNT(*) AS `c` FROM `znote_shop_orders` WHERE `type` = 4 AND `account_id` = ?;", [(int)$session_user_id] )['c'] ?? 0); $genderTickets = shop_account_gender_tickets($session_user_id); $genderTickets = is_array($genderTickets) ? $genderTickets : array(); $genderTicketInfinite = false; $genderTicketCount = 0; foreach ($genderTickets as $ticket) { if ($ticket['count'] == 0) $genderTicketInfinite = true; else if ((int)$ticket['count'] > 0 && $genderTicketInfinite === false) $genderTicketCount += (int)$ticket['count']; } ?>
«

—
0): ?>
0): ?>