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); } } }
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; } }
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(); }