Exemple #1
0
function GetRussianOwnerRealms($region)
{
    global $db, $caughtKill;
    $ruID = 0;
    $ruSlug = '';
    $ruToRun = array();
    $stmt = $db->prepare('select id, slug from tblRealm where region=? and locale=\'ru_RU\' and ownerrealm is null');
    $stmt->bind_param('s', $region);
    $stmt->execute();
    $stmt->bind_result($ruID, $ruSlug);
    while ($stmt->fetch()) {
        heartbeat();
        if ($caughtKill) {
            return;
        }
        DebugMessage("Getting ownerrealm for russian slug {$ruSlug}");
        $url = GetBattleNetURL($region, 'wow/realm/status?realms=' . $ruSlug . '&locale=ru_RU');
        $ruRealm = json_decode(FetchHTTP($url), true, 512, JSON_BIGINT_AS_STRING);
        if (json_last_error() != JSON_ERROR_NONE) {
            DebugMessage("{$url} did not return valid JSON");
            continue;
        }
        if (!isset($ruRealm['realms']) || count($ruRealm['realms']) == 0) {
            DebugMessage("{$url} returned no realms");
            continue;
        }
        $ruOwner = str_replace(' ', '', $ruRealm['realms'][0]['name']);
        $ruToRun[] = sprintf('update tblRealm set ownerrealm = \'%s\' where id = %d', $db->escape_string($ruOwner), $ruID);
    }
    $stmt->close();
    if ($caughtKill) {
        return;
    }
    foreach ($ruToRun as $sql) {
        heartbeat();
        if ($caughtKill) {
            return;
        }
        if (!$db->real_query($sql)) {
            DebugMessage(sprintf("%s: %s", $sql, $db->error), E_USER_WARNING);
        }
    }
}
Exemple #2
0
function FetchHTTP($url, $inHeaders = array(), &$outHeaders = array())
{
    static $isRetry = false;
    global $fetchHTTPErrorCaught;
    $wasRetry = $isRetry;
    $isRetry = false;
    $fetchHTTPErrorCaught = false;
    if (!isset($inHeaders['Connection'])) {
        $inHeaders['Connection'] = 'Keep-Alive';
    }
    $inHeaders['Accept-Encoding'] = 'gzip';
    $http_opt = array('timeout' => 60, 'connecttimeout' => 6, 'headers' => $inHeaders, 'compress' => true, 'redirect' => 3);
    //if ($eTag) $http_opt['etag'] = $eTag;
    $http_info = array();
    $fetchHTTPErrorCaught = false;
    $oldErrorReporting = error_reporting(error_reporting() | E_WARNING);
    set_error_handler('FetchHTTPError', E_WARNING);
    $data = http_parse_message(http_get($url, $http_opt, $http_info));
    restore_error_handler();
    error_reporting($oldErrorReporting);
    unset($oldErrorReporting);
    if (!$data) {
        $outHeaders = array();
        return false;
    }
    $outHeaders = array_merge(array('httpVersion' => $data->httpVersion, 'responseCode' => $data->responseCode, 'responseStatus' => $data->responseStatus), $data->headers);
    //if (isset($data->headers['Etag']))
    //    $eTag = $data->headers['Etag'];
    if ($fetchHTTPErrorCaught) {
        return false;
    }
    if (preg_match('/^2\\d\\d$/', $http_info['response_code']) > 0) {
        return $data->body;
    } elseif (!$wasRetry && isset($data->headers['Retry-After'])) {
        $delay = intval($data->headers['Retry-After'], 10);
        DebugMessage("Asked to wait {$delay} seconds for {$url}", E_USER_NOTICE);
        if ($delay > 0 && $delay <= 10) {
            sleep($delay);
        }
        $isRetry = true;
        return FetchHTTP($url, $inHeaders, $outHeaders);
    } else {
        return false;
    }
}
Exemple #3
0
function GetGuild(&$characterNames, $guild, $realmName)
{
    global $db, $caughtKill, $allRealms;
    heartbeat();
    if ($caughtKill) {
        return;
    }
    if (!isset($allRealms[$realmName])) {
        DebugMessage('Could not find realm ' . $realmName);
        return;
    }
    $guildId = 0;
    $scanned = 0;
    $stmt = $db->prepare('select id, ifnull(scanned,\'2000-01-01\') from tblGuild where realm = ? and name = ?');
    $stmt->bind_param('is', $allRealms[$realmName]['id'], $guild);
    $stmt->execute();
    $stmt->bind_result($guildId, $scanned);
    $hasRow = $stmt->fetch() === true;
    $stmt->close();
    if ($hasRow) {
        if (strtotime($scanned) >= time() - 14 * 24 * 60 * 60) {
            return;
        }
    } else {
        $stmt = $db->prepare('insert into tblGuild (realm, name) values (?, ?)');
        $stmt->bind_param('is', $allRealms[$realmName]['id'], $guild);
        $stmt->execute();
        $stmt->close();
        $guildId = $db->insert_id;
    }
    DebugMessage("Getting guild <{$guild}> on {$realmName}");
    $url = GetBattleNetURL($allRealms[$realmName]['region'], "wow/guild/" . $allRealms[$realmName]['slug'] . "/" . rawurlencode($guild) . "?fields=members");
    $json = FetchHTTP($url);
    if (!$json) {
        return;
    }
    heartbeat();
    if ($caughtKill) {
        return;
    }
    $dta = json_decode($json, true);
    if (json_last_error() != JSON_ERROR_NONE) {
        return;
    }
    if (!isset($dta['members'])) {
        return;
    }
    $charCount = 0;
    $side = $dta['side'] + 1;
    foreach ($dta['members'] as $member) {
        if (!isset($member['character'])) {
            continue;
        }
        if (!isset($member['character']['name'])) {
            continue;
        }
        if (!isset($member['character']['realm'])) {
            continue;
        }
        if (!isset($allRealms[$member['character']['realm']])) {
            continue;
        }
        $charCount++;
        $member['character']['gender']++;
        // line up with db enum
        $stmt = $db->prepare('insert into tblCharacter (name, realm, scanned, race, class, gender, level) values (?, ?, NOW(), ?, ?, ?, ?) on duplicate key update lastmodified=null, scanned=values(scanned), race=values(race), class=values(class), gender=values(gender), level=values(level)');
        $stmt->bind_param('siiiii', $member['character']['name'], $allRealms[$member['character']['realm']]['id'], $member['character']['race'], $member['character']['class'], $member['character']['gender'], $member['character']['level']);
        $stmt->execute();
        $stmt->close();
        unset($characterNames[$allRealms[$member['character']['realm']]['ownerrealm']][$member['character']['name']]);
    }
    $stmt = $db->prepare('update tblGuild set scanned=now(), side=?, members=? where id = ?');
    $stmt->bind_param('iii', $side, $charCount, $guildId);
    $stmt->execute();
    $stmt->close();
}