Procházet zdrojové kódy

Now uses “../lib/ckratelimit.php”; minor changes

pezcurrel před 1 měsícem
rodič
revize
ed2d7182d9
1 změnil soubory, kde provedl 34 přidání a 47 odebrání
  1. 34 47
      web/clitools/getinstinfo.php

+ 34 - 47
web/clitools/getinstinfo.php

@@ -19,21 +19,22 @@
 const N="\n";
 const RN="\r\n";
 define('SNAME',basename(__FILE__));
-const LIBDP='/../lib';
-
-require __DIR__.LIBDP.'/parsetime.php';
-require __DIR__.LIBDP.'/gurl.php';
-require __DIR__.LIBDP.'/gethttpcode.php';
-require __DIR__.LIBDP.'/tables.php';
-require __DIR__.LIBDP.'/mb_ucfirst.php';
-require __DIR__.LIBDP.'/mb_lcfirst.php';
-require __DIR__.LIBDP.'/ghs.php';
-require __DIR__.LIBDP.'/ght.php';
-require __DIR__.LIBDP.'/fnum.php';
-require __DIR__.LIBDP.'/supplangs.php';
-require __DIR__.LIBDP.'/gettlds.php';
-require __DIR__.LIBDP.'/mastodon_postlen.php';
-require __DIR__.LIBDP.'/vendor/autoload.php';
+
+chdir(__DIR__);
+require '../lib/parsetime.php';
+require '../lib/gurl.php';
+require '../lib/gethttpcode.php';
+require '../lib/tables.php';
+require '../lib/mb_ucfirst.php';
+require '../lib/mb_lcfirst.php';
+require '../lib/ghs.php';
+require '../lib/ght.php';
+require '../lib/fnum.php';
+require '../lib/supplangs.php';
+require '../lib/gettlds.php';
+require '../lib/mastodon_postlen.php';
+require '../lib/ckratelimit.php';
+require '../lib/vendor/autoload.php';
 use LanguageDetection\Language;
 
 use function mysqli_real_escape_string as myesc;
@@ -362,7 +363,7 @@ if ($idata['IsMastodon'] && !is_null($idata['Version']) && $idata['Version']>='4
 	eecho(0,'«'.$opts['hostname'].'»: trying to fetch instance info from API v2...'.N);
 	$buf=@gurl('https://'.$opts['hostname'].'/api/v2/instance',$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$opts['hostname']}»");
+		ckrl($buf['headers'],"«{$opts['hostname']}»");
 		$buf=@json_decode($buf['cont'],true);
 		if (is_array($buf)) {
 			if (make(['domain', 'title', 'version', 'source_url', 'description', 'usage', 'thumbnail', 'languages', 'configuration', 'registrations', 'contact', 'rules'],$buf)) {
@@ -423,7 +424,7 @@ if ($idata['IsMastodon'] && !is_null($idata['Version']) && $idata['Version']>='4
 	eecho(0,'«'.$opts['hostname'].'»: trying to fetch domain count from API v1...'.N);
 	$buf=@gurl('https://'.$opts['hostname'].'/api/v1/instance',$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$opts['hostname']}»");
+		ckrl($buf['headers'],"«{$opts['hostname']}»");
 		$buf=@json_decode($buf['cont'],true);
 		if (is_array($buf)) {
 			eecho(1,'«'.$opts['hostname'].'»: got instance info from API v1 :-)'.N);
@@ -438,7 +439,7 @@ if ($idata['IsMastodon'] && !is_null($idata['Version']) && $idata['Version']>='4
 	eecho(0,'«'.$opts['hostname'].'»: trying to fetch extended description from API v1...'.N);
 	$buf=@gurl('https://'.$opts['hostname'].'/api/v1/instance/extended_description',$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$opts['hostname']}»");
+		ckrl($buf['headers'],"«{$opts['hostname']}»");
 		$buf=@json_decode($buf['cont'],true);
 		if (is_array($buf)) {
 			eecho(1,'«'.$opts['hostname'].'»: got extended description from API v1 :-)'.N);
@@ -453,7 +454,7 @@ if ($idata['IsMastodon'] && !is_null($idata['Version']) && $idata['Version']>='4
 	eecho(0,'«'.$opts['hostname'].'»: trying to fetch instance domain blocks from API v1...'.N);
 	$buf=@gurl('https://'.$opts['hostname'].'/api/v1/instance/domain_blocks',$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$opts['hostname']}»");
+		ckrl($buf['headers'],"«{$opts['hostname']}»");
 		$buf=@json_decode($buf['cont'],true);
 		if (is_array($buf)) {
 			eecho(1,'«'.$opts['hostname'].'»: got instance domain blocks from API v1 :-)'.N);
@@ -495,7 +496,7 @@ if ($idata['IsMastodon'] && !is_null($idata['Version']) && $idata['Version']>='4
 	eecho(0,'«'.$opts['hostname'].'»: trying to fetch instance info from API v1...'.N);
 	$buf=@gurl('https://'.$opts['hostname'].'/api/v1/instance',$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$opts['hostname']}»");
+		ckrl($buf['headers'],"«{$opts['hostname']}»");
 		$buf=@json_decode($buf['cont'],true);
 		if (is_array($buf)) {
 			if (make(['uri', 'title', 'short_description', 'description', 'email', 'version', 'urls', 'stats', 'thumbnail', 'languages', 'registrations', 'approval_required', 'contact_account'],$buf)) {
@@ -574,7 +575,7 @@ if ($idata['IsMastodon'] && !is_null($idata['Version']) && $idata['Version']>='2
 	eecho(0,'«'.$opts['hostname'].'»: trying to fetch instance activity info from API v1...'.N);
 	$buf=@gurl('https://'.$opts['hostname'].'/api/v1/instance/activity',$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$opts['hostname']}»");
+		ckrl($buf['headers'],"«{$opts['hostname']}»");
 		$buf=@json_decode($buf['cont'],true);
 		if (is_array($buf)) {
 			eecho(1,'«'.$opts['hostname'].'»: got instance activity info from API v1 :-)'.N);
@@ -593,7 +594,7 @@ if ($idata['IsMastodon'] && !is_null($idata['Version']) && $idata['Version']>='3
 	if ($idata['Version']>='3.5.0') $url.='/tags';
 	$buf=@gurl($url,$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$opts['hostname']}»");
+		ckrl($buf['headers'],"«{$opts['hostname']}»");
 		$buf=@json_decode($buf['cont'],true);
 		if (is_array($buf)) {
 			eecho(1,'«'.$opts['hostname'].'»: got instance tags trends info from API v1 :-)'.N);
@@ -904,8 +905,8 @@ if ($instanswered && $opts['fetchusers'] && $idata['IsMastodon'] && !is_null($id
 			eecho(0,'«'.$opts['hostname'].'»: trying to fetch chunk '.($chunk+1).' of users info from directory API (attempt '.($att+1).'/'.$opts['udiratts'].')...'.N);
 			$buf=@gurl('https://'.$opts['hostname'].'/api/v1/directory?local=1&order=new&limit='.$limit.'&offset='.$offset,$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 			if ($buf['cont']!==false) {
-				$xrlr=ckratelimit($buf['headers'],"«{$opts['hostname']}»");
-				eecho(1,'«'.$opts['hostname'].'»: got chunk '.($chunk+1).' of users info from directory API on attempt '.($att+1).'/'.$opts['udiratts'].' (xrlr: '.$xrlr.') :-)'.N);
+				ckrl($buf['headers'],"«{$opts['hostname']}»");
+				eecho(1,'«'.$opts['hostname'].'»: got chunk '.($chunk+1).' of users info from directory API on attempt '.($att+1).'/'.$opts['udiratts'].' :-)'.N);
 				$buf=@json_decode($buf['cont'],true);
 				if (is_array($buf)) {
 					//print_r($buf);
@@ -947,7 +948,7 @@ if ($instanswered && $opts['fetchusers'] && $idata['IsMastodon'] && !is_null($id
 								eecho(0,'«'.$opts['hostname'].'»: trying to fetch tags for user «'.$user['username'].'»...'.N);
 								$tags=@gurl('https://'.$opts['hostname'].'/api/v1/accounts/'.$user['id'].'/featured_tags',$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 								if ($tags['cont']!==false) {
-									ckratelimit($tags['headers'],"«{$opts['hostname']}»");
+									ckrl($tags['headers'],"«{$opts['hostname']}»");
 									$tags=@json_decode($tags['cont'],true);
 									if (is_array($tags) && count($tags)>0) {
 										eecho(1,'«'.$opts['hostname'].'»: got '.count($tags).' tag(s) for user «'.$user['username'].'» :-)'.N);
@@ -1200,28 +1201,14 @@ function datetots($date) {
 	return(mktime(0,0,0,$date[1],$date[2],$date[0]));
 }
 
-function ckratelimit($headers,$ctx) {
+function ckrl($headers,$ctx) {
 	$headers=explode("\r\n",$headers);
-	$buff=[];
-	array_shift($headers);
-	foreach ($headers as $header)
-		if (preg_match('/^([^:]+):(.*)$/Uu',$header,$matches)===1)
-			$buff[strtolower($matches[1])]=trim($matches[2]);
-	$headers=$buff;
-	if (isset($headers['date']) && isset($headers['x-ratelimit-reset']) && isset($headers['x-ratelimit-remaining'])) {
-		if ($headers['x-ratelimit-remaining']==0) {
-			$stosl=strtotime($headers['x-ratelimit-reset'])-strtotime($headers['date'])+1;
-			eecho(2,$ctx.': reached rate limit, sleeping for '.ght($stosl,null,0).' ...'.N);
-			sleep($stosl);
-		}
-		return($headers['x-ratelimit-remaining']);
-	} else {
-		$missing=[];
-		if (!isset($headers['date'])) $missing[]='date';
-		if (!isset($headers['x-ratelimit-reset'])) $missing[]='x-ratelimit-reset';
-		if (!isset($headers['x-ratelimit-remaining'])) $missing[]='x-ratelimit-remaining';
-		eecho(2,$ctx.': ckratelimit: headers did not contain «'.implode('», «',$missing).'» item(s)!'.N);
-		return(false);
+	$res=ckratelimit($headers);
+	if (!$res['ok']) {
+		eecho(2,"{$ctx}: ckratelimit: {$res['error']}.\n");
+	} elseif ($res['sleep']>0) {
+		eecho(2,"{$ctx}: ckratelimit: x-ratelimit-remaining is 0, sleeping for ".ght($res['sleep']).' (until '.date('c',time()+$res['sleep']).") ...\n");
+		sleep($res['sleep']);
 	}
 }
 
@@ -1237,7 +1224,7 @@ function get_api($host, $path) {
 	global $opts;
 	$buf = @gurl('https://'.$host.$path,$opts['conntimeout'],$opts['functimeout'],['Accept: application/json'],$opts['proxy']);
 	if ($buf['cont']!==false) {
-		ckratelimit($buf['headers'],"«{$host}»");
+		ckrl($buf['headers'],"«{$host}»");
 		$data = json_decode($buf['cont'], true);
 		return $data;
 	} else {