$error_error
";
    } elseif (!empty($input)) {
        $error_error = $input;
    }
}
function success_msg($input = false)
{
    global $success_msg;
    if (!empty($success_msg)) {
        echo "$success_msg
";
    } elseif (!empty($input)) {
        $success_msg = $input;
    }
}
function GetRaceID($race)
{
    switch ($race) {
        case "HUMAN":
            return 1;
        case "ORC":
            return 2;
        case "DWARF":
            return 3;
        case "NIGHTELF":
            return 4;
        case "SCOURGE":
            return 5;
        case "TAUREN":
            return 6;
        case "GNOME":
            return 7;
        case "TROLL":
            return 8;
        case "BLOODELF":
            return 10;
        case "DRAENEI":
            return 11;
        default:
            exit("error");
    }
}
function GetClassID($class)
{
    switch ($class) {
        case "WARRIOR":
            return 1;
        case "PALADIN":
            return 2;
        case "HUNTER":
            return 3;
        case "ROGUE":
            return 4;
        case "PRIEST":
            return 5;
        case "DEATHKNIGHT":
            return 6;
        case "SHAMAN":
            return 7;
        case "MAGE":
            return 8;
        case "WARLOCK":
            return 9;
        case "DRUID":
            return 11;
        default:
            exit("
YOUR CHARACTER CLASS IS NOT BLIZZLIKE FOR 3.3.5a
");
    }
}
function get_human_time_from_sec($seconds)
{
    $interval = new DateInterval("PT{$seconds}S");
    $now = new DateTimeImmutable('now', new DateTimeZone('utc'));
    return $now->diff($now->add($interval))->format('%a:%h:%i');
}
function send_phpmailer($email, $subject, $message)
{
    try {
        $mail = new PHPMailer(true);
        if (get_config('debug_mode')) {
            $mail->SMTPDebug = 2;
        }
        $mail->isSMTP();
        $mail->Host = get_config('smtp_host');
        $mail->SMTPAuth = get_config('smtp_auth');
        $mail->Username = get_config('smtp_user');
        $mail->Password = get_config('smtp_pass');
        $mail->SMTPSecure = get_config('smtp_secure');
        $mail->Port = get_config('smtp_port');
        //Recipients
        $mail->setFrom(get_config('smtp_mail'));
        $mail->addAddress($email);     // Add a recipient
        $mail->addReplyTo(get_config('smtp_mail'));
        // Content
        $mail->isHTML(true);
        $mail->Subject = $subject;
        $mail->Body = $message;
        $mail->send();
    } catch (Exception $e) {
        if (get_config('debug_mode')) {
            echo 'Message: ' . $e->getMessage();
        }
    }
    return true;
}
function generateRandomString($length = 10)
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}
function RemoteCommandWithSOAP($COMMAND)
{
    global $soap_connection_info;
    if (empty($COMMAND)) {
        return false;
    }
    try {
        $conn = new SoapClient(NULL, array(
            'location' => 'http://' . get_config('soap_host') . ':' . get_config('soap_port') . '/',
            'uri' => get_config('soap_uri'),
            'style' => get_config('soap_style'),
            'login' => get_config('soap_username'),
            'password' => get_config('soap_password')
        ));
        $conn->executeCommand(new SoapParam($COMMAND, 'command'));
        unset($conn);
        return true;
    } catch (Exception $e) {
        return false;
    }
}
function validate_hcaptcha($value)
{
    try {
        $data = array(
            'secret' => get_config('captcha_secret'),
            'response' => $_POST['h-captcha-response']
        );
        $verify = curl_init();
        curl_setopt($verify, CURLOPT_URL, "https://hcaptcha.com/siteverify");
        curl_setopt($verify, CURLOPT_POST, true);
        curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($verify);
        $responseData = json_decode($response);
        if ($responseData->success) {
            return true;
        }
    } catch (Exception $e) {
    }
    return false;
}
function validate_recaptcha($value)
{
    try {
        $verify = curl_init();
        curl_setopt($verify, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify?secret=" . get_config('captcha_secret') . "&response=" . $_POST['g-recaptcha-response']);
        curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($verify);
        $responseData = json_decode($response, true);
        if ($responseData["success"] == true) {
            return true;
        }
    } catch (Exception $e) {
    }
    return false;
}
function captcha_validation()
{
    if (empty(get_config('captcha_type')) && !empty($_POST['captcha']) && !empty($_SESSION['captcha'])) {
        if (strtolower($_SESSION['captcha']) != strtolower($_POST['captcha'])) {
            error_msg('Captcha is not valid.');
            return false;
        }
        unset($_SESSION['captcha']);
    } else if (!empty(get_config('captcha_type')) && get_config('captcha_type') > 2) {
        return true;
    } elseif (!empty(get_config('captcha_type')) && get_config('captcha_type') == 1 && !empty($_POST['h-captcha-response'])) {
        if (!validate_hcaptcha($_POST['h-captcha-response'])) {
            error_msg('HCaptcha is not valid.');
            return false;
        }
    } elseif (!empty(get_config('captcha_type')) && get_config('captcha_type') == 2 && !empty($_POST['g-recaptcha-response'])) {
        if (!validate_recaptcha($_POST['g-recaptcha-response'])) {
            error_msg('ReCaptcha is not valid.');
            return false;
        }
    } else {
        error_msg('Captcha is required.');
        return false;
    }
    return true;
}
function getCaptchaJS()
{
    if (!empty(get_config('captcha_type'))) {
        if (get_config('captcha_type') == 1) {
            return '';
        } else if (get_config('captcha_type') == 2) {
            return '';
        }
    }
    return '';
}
function GetCaptchaHTML()
{
    if (!empty(get_config('captcha_type'))) {
        if (get_config('captcha_type') == 1) {
            return '';
        } else if (get_config('captcha_type') == 2) {
            return '';
        } else {
            return '';
        }
    }
    return 'Captcha
 . ')
';
}
// Its from Trinitycore/account-creator
function calculateSRP6Verifier($username, $password, $salt)
{
    // algorithm constants
    $g = gmp_init(7);
    $N = gmp_init('894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7', 16);
    // calculate first hash
    $h1 = sha1(strtoupper($username . ':' . $password), TRUE);
    // calculate second hash
    $h2 = sha1($salt . $h1, TRUE);
    // convert to integer (little-endian)
    $h2 = gmp_import($h2, 1, GMP_LSW_FIRST);
    // g^h2 mod N
    $verifier = gmp_powm($g, $h2, $N);
    // convert back to a byte array (little-endian)
    $verifier = gmp_export($verifier, 1, GMP_LSW_FIRST);
    // pad to 32 bytes, remember that zeros go on the end in little-endian!
    $verifier = str_pad($verifier, 32, chr(0), STR_PAD_RIGHT);
    // done!
    return $verifier;
}
// Returns SRP6 parameters to register this username/password combination with
function getRegistrationData($username, $password)
{
    // generate a random salt
    $salt = random_bytes(32);
    // calculate verifier using this salt
    $verifier = calculateSRP6Verifier($username, $password, $salt);
    // done - this is what you put in the account table!
    return array($salt, $verifier);
}
//From TrinityCore/AOWOW
function verifySRP6($user, $pass, $salt, $verifier)
{
    $g = gmp_init(7);
    $N = gmp_init('894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7', 16);
    $x = gmp_import(
        sha1($salt . sha1(strtoupper($user . ':' . $pass), TRUE), TRUE),
        1,
        GMP_LSW_FIRST
    );
    $v = gmp_powm($g, $x, $N);
    return ($verifier === str_pad(gmp_export($v, 1, GMP_LSW_FIRST), 32, chr(0), STR_PAD_RIGHT));
}