this.'); exit(0); } $bt=microtime(true); $dlanguc=strtoupper($dlang); require('mustard/include/n2es.php'); require('mustard/include/gracetime.php'); require('lib/fnum.php'); use function mysqli_real_escape_string as myesc; /*$dlang='fr'; $dtzbl=array('ca'=>'Europe/Madrid','en'=>'Europe/London','es'=>'Europe/Madrid','fr'=>'Europe/Paris','it'=>'Europe/Rome'); date_default_timezone_set($dtzbl[$dlang]);*/ $debug=''; $debug.='REQUEST_URI: '.$_SERVER['REQUEST_URI'].N; $debug.='$_GET: '.print_r($_GET,1); $debug.='LOCALE: '.$locale.N; // an instance is displayed as "New" if its age, relative to the InsertTS field, is less or equal than this (currently 31 days) $oldline=30*24*60*60; // an instance is considered dead if the last time it responded is before the graceline (see code below); we fix it at start of today - $gracetime // $gracetime is defined in mustard/include/gracetime.php $bti=round($bt); $graceline=gmmktime(0,0,0,gmdate('n',$bti),gmdate('j',$bti),gmdate('Y',$bti))-$gracetime; if (array_key_exists('id',$_GET) && preg_match('/^\d+$/',$_GET['id'])) { $_GET['id']+=0; $single=true; } else { $single=false; } //$getc=count($_GET); //forcing $getc to 1 to never display the explanation of search engine workings $getc=1; $minudef=10; $minumax=4294967295; $maxudef=30000; $maxumax=4294967295; $minaudef=10; $minaumax=4294967295; $mincdef=''; $mincmax=16777215; $link=mysqli_connect($conf['db_host'],$conf['db_user_name'],$conf['db_user_password'],$conf['db_name'],$conf['db_port'],$conf['db_socket']) or muorimeglio(_('Couldn’t connect to database: ').mysqli_connect_error().' ['.mysqli_connect_errno().']',false); mysqli_set_charset($link,'utf8mb4'); // if and when ... put it soon after below /*

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

*/ echo('
'.N); if ($single) { echo('

↑ '._('Go to search').'

'.N); $p=1; $que='SELECT * FROM Instances WHERE ID='.$_GET['id']; } else { echo('

'._('Instances').'

'.N); $res=mysqli_query($link,'SELECT COUNT(Instances.ID) AS Unknown, SUM(Instances.UserCount) AS UnknownU FROM Instances WHERE Instances.IsMastodon=1 AND Instances.BlockListAvailable=0 AND Instances.LastOkCheckTS>='.$graceline) or muorimeglio(__LINE__.': '.mysqli_error($link),true); $row=mysqli_fetch_assoc($res); $metastats['unknown']=['instances'=>$row['Unknown'], 'users'=>nulltozero($row['UnknownU'])]; $res=mysqli_query($link,'SELECT COUNT(Instances.ID) AS Suspending, SUM(Instances.UserCount) AS SuspendingU FROM Instances LEFT JOIN InstBlocks ON InstBlocks.InstID=Instances.ID WHERE Instances.IsMastodon=1 AND Instances.BlockListAvailable=1 AND Instances.LastOkCheckTS>='.$graceline.' AND (InstBlocks.Domain LIKE "%.threads.net" OR InstBlocks.Domain="threads.net") AND InstBlocks.Severity="suspend"') or muorimeglio(__LINE__.': '.mysqli_error($link),true); $row=mysqli_fetch_assoc($res); $metastats['suspending']=['instances'=>$row['Suspending'], 'users'=>nulltozero($row['SuspendingU'])]; $res=mysqli_query($link,'SELECT COUNT(Instances.ID) AS Silencing, SUM(Instances.UserCount) AS SilencingU FROM Instances LEFT JOIN InstBlocks ON InstBlocks.InstID=Instances.ID WHERE Instances.IsMastodon=1 AND Instances.BlockListAvailable=1 AND Instances.LastOkCheckTS>='.$graceline.' AND (InstBlocks.Domain LIKE "%.threads.net" OR InstBlocks.Domain="threads.net") AND InstBlocks.Severity="silence"') or muorimeglio(__LINE__.': '.mysqli_error($link),true); $row=mysqli_fetch_assoc($res); $metastats['silencing']=['instances'=>$row['Silencing'], 'users'=>nulltozero($row['SilencingU'])]; $res=mysqli_query($link,'SELECT COUNT(ID) AS tinsts, SUM(UserCount) AS tusers, SUM(StatusCount) AS tstatuses, SUM(ActiveUsersMonth) AS tactusers FROM Instances WHERE Instances.IsMastodon=1 AND Instances.LastOkCheckTS>='.$graceline) or muorimeglio(__LINE__.': '.mysqli_error($link),true); $row=mysqli_fetch_assoc($res); echo(_('

This search engine for Mastodon instances is based on a database that gets updated by our crawler every night (CET). Instances are considered new for 30 days after they are discovered. When an instance has not responded to our daily checks for more than 30 days it’s no longer considered in statistics and searches and it gets checked only on the first of the month, rather than daily, until it possibly responds again. “Random ordering” of results varies daily.

Default search criteria reflect our fondness for a decentralized and egalitarian Fediverse and our attempt to exclude instances accepting fascist, racist, sexist, ableist or sovereignist contents by marking them as noxious.

').N); printf(_('

We currently count %s Mastodon instances, with %s users (%s active during last month) and %s published statuses. [Show Threads suspension / limitation stats].

').N, fnum($row['tinsts'],0,$dlang), fnum($row['tusers'],0,$dlang), fnum($row['tactusers'],0,$dlang), fnum($row['tstatuses'],0,$dlang)); $metastats['known']=[ 'instances'=>$row['tinsts']-$metastats['unknown']['instances'], 'users'=>$row['tusers']-$metastats['unknown']['users'], ]; $metastats['known']['iperc']=100/$row['tinsts']*$metastats['known']['instances']; $metastats['known']['uperc']=100/$row['tusers']*$metastats['known']['users']; $metastats['unknown']['iperc']=100/$row['tinsts']*$metastats['unknown']['instances']; $metastats['unknown']['uperc']=100/$row['tusers']*$metastats['unknown']['users']; $metastats['suspending']['iperc']=100/$row['tinsts']*$metastats['suspending']['instances']; $metastats['suspending']['uperc']=100/$row['tusers']*$metastats['suspending']['users']; $metastats['suspending']['kiperc']=100/$metastats['known']['instances']*$metastats['suspending']['instances']; $metastats['suspending']['kuperc']=100/$metastats['known']['users']*$metastats['suspending']['users']; $metastats['silencing']['iperc']=100/$row['tinsts']*$metastats['silencing']['instances']; $metastats['silencing']['uperc']=100/$row['tusers']*$metastats['silencing']['users']; $metastats['silencing']['kiperc']=100/$metastats['known']['instances']*$metastats['silencing']['instances']; $metastats['silencing']['kuperc']=100/$metastats['known']['users']*$metastats['silencing']['users']; $metastats['notsuspsil']=[ 'instances'=>$row['tinsts']-$metastats['unknown']['instances']-$metastats['suspending']['instances']-$metastats['silencing']['instances'], 'users'=>$row['tusers']-$metastats['unknown']['users']-$metastats['suspending']['users']-$metastats['silencing']['users'] ]; $metastats['notsuspsil']['iperc']=100/$row['tinsts']*$metastats['notsuspsil']['instances']; $metastats['notsuspsil']['uperc']=100/$row['tusers']*$metastats['notsuspsil']['users']; $metastats['notsuspsil']['kiperc']=100/$metastats['known']['instances']*$metastats['notsuspsil']['instances']; $metastats['notsuspsil']['kuperc']=100/$metastats['known']['users']*$metastats['notsuspsil']['users']; $metastats['suspsil']=[ 'instances'=>$metastats['suspending']['instances']+$metastats['silencing']['instances'], 'users'=>$metastats['suspending']['users']+$metastats['silencing']['users'] ]; $metastats['suspsil']['iperc']=100/$row['tinsts']*$metastats['suspsil']['instances']; $metastats['suspsil']['uperc']=100/$row['tusers']*$metastats['suspsil']['users']; $metastats['suspsil']['kiperc']=100/$metastats['known']['instances']*$metastats['suspsil']['instances']; $metastats['suspsil']['kuperc']=100/$metastats['known']['users']*$metastats['suspsil']['users']; echo '
'._('Stats relative to instances with accessible list of moderated instances').'
 '._('Instances suspending Threads').': '.fnum($metastats['suspending']['instances'],0,$dlang).' / '.fnum($metastats['known']['instances'],0,$dlang).' ('.fnum($metastats['suspending']['kiperc'],2,$dlang).'%)
 '._('Instances limiting Threads').': '.fnum($metastats['silencing']['instances'],0,$dlang).' / '.fnum($metastats['known']['instances'],0,$dlang).' ('.fnum($metastats['silencing']['kiperc'],2,$dlang).'%)
+ '._('Instances suspending or limiting Threads').': '.fnum($metastats['suspending']['instances']+$metastats['silencing']['instances'],0,$dlang).' / '.fnum($metastats['known']['instances'],0,$dlang).' ('.fnum($metastats['suspending']['kiperc']+$metastats['silencing']['kiperc'],2,$dlang).'%)
 '._('Instances not suspending or limiting Threads').': '.fnum($metastats['notsuspsil']['instances'],0,$dlang).' / '.fnum($metastats['known']['instances'],0,$dlang).' ('.fnum($metastats['notsuspsil']['kiperc'],2,$dlang).'%)
 '._('Users on instances suspending Threads').': '.fnum($metastats['suspending']['users'],0,$dlang).' / '.fnum($metastats['known']['users'],0,$dlang).' ('.fnum($metastats['suspending']['kuperc'],2,$dlang).'%)
 '._('Users on instances limiting Threads').': '.fnum($metastats['silencing']['users'],0,$dlang).' / '.fnum($metastats['known']['users'],0,$dlang).' ('.fnum($metastats['silencing']['kuperc'],2,$dlang).'%)
+ '._('Users on instances suspending or limiting Threads').': '.fnum($metastats['suspending']['users']+$metastats['silencing']['users'],0,$dlang).' / '.fnum($metastats['known']['instances'],0,$dlang).' ('.fnum($metastats['suspending']['kuperc']+$metastats['silencing']['kuperc'],2,$dlang).'%)
 '._('Users on instances not suspending or limiting Threads').': '.fnum($metastats['notsuspsil']['users'],0,$dlang).' / '.fnum($metastats['known']['users'],0,$dlang).' ('.fnum($metastats['notsuspsil']['kuperc'],2,$dlang).'%)
'._('Stats relative to all instances').'
 '._('Instances suspending Threads').': '.fnum($metastats['suspending']['instances'],0,$dlang).' / '.fnum($row['tinsts'],0,$dlang).' ('.fnum($metastats['suspending']['iperc'],2,$dlang).'%)
 '._('Instances limiting Threads').': '.fnum($metastats['silencing']['instances'],0,$dlang).' / '.fnum($row['tinsts'],0,$dlang).' ('.fnum($metastats['silencing']['iperc'],2,$dlang).'%)
+ '._('Instances suspending or limiting Threads').': '.fnum($metastats['suspending']['instances']+$metastats['silencing']['instances'],0,$dlang).' / '.fnum($row['tinsts'],0,$dlang).' ('.fnum($metastats['suspending']['iperc']+$metastats['silencing']['iperc'],2,$dlang).'%)
 '._('Instances not suspending or limiting Threads').': '.fnum($metastats['notsuspsil']['instances'],0,$dlang).' / '.fnum($row['tinsts'],0,$dlang).' ('.fnum($metastats['notsuspsil']['iperc'],2,$dlang).'%)
 '._('Instances with unaccessible list of moderated instances').': '.fnum($metastats['unknown']['instances'],0,$dlang).' / '.fnum($row['tinsts'],0,$dlang).' ('.fnum($metastats['unknown']['iperc'],2,$dlang).'%)
 '._('Users on instances suspending Threads').': '.fnum($metastats['suspending']['users'],0,$dlang).' / '.fnum($row['tusers'],0,$dlang).' ('.fnum($metastats['suspending']['uperc'],2,$dlang).'%)
 '._('Users on instances limiting Threads').': '.fnum($metastats['silencing']['users'],0,$dlang).' / '.fnum($row['tusers'],0,$dlang).' ('.fnum($metastats['silencing']['uperc'],2,$dlang).'%)
+ '._('Users on instances suspending or limiting Threads').': '.fnum($metastats['suspending']['users']+$metastats['silencing']['users'],0,$dlang).' / '.fnum($row['tusers'],0,$dlang).' ('.fnum($metastats['suspending']['uperc']+$metastats['silencing']['uperc'],2,$dlang).'%)
 '._('Users on instances not suspending or limiting Threads').': '.fnum($metastats['notsuspsil']['users'],0,$dlang).' / '.fnum($row['tusers'],0,$dlang).' ('.fnum($metastats['notsuspsil']['uperc'],2,$dlang).'%)
 '._('Users on instances with unaccessible list of moderated instances').': '.fnum($metastats['unknown']['users'],0,$dlang).' / '.fnum($row['tusers'],0,$dlang).' ('.fnum($metastats['unknown']['uperc'],2,$dlang).'%)
'.N; if ((array_key_exists('exnox',$_GET) && $_GET['exnox']=='1') || !array_key_exists('exnox',$_GET)) { $_GET['cbexnox']=' checked'; $_GET['exnox']=1; } else { $_GET['cbexnox']=''; $_GET['exnox']=0; } if ((array_key_exists('exregc',$_GET) && $_GET['exregc']=='1') || !array_key_exists('exregc',$_GET)) { $_GET['cbexregc']=' checked'; $_GET['exregc']=1; } else { $_GET['cbexregc']=''; $_GET['exregc']=0; } if (array_key_exists('exappr',$_GET) && $_GET['exappr']=='1') { $_GET['cbexappr']=' checked'; $_GET['exappr']=1; } else { $_GET['cbexappr']=''; $_GET['exappr']=0; } if (array_key_exists('exlcko',$_GET) && $_GET['exlcko']=='1') { $_GET['cbexlcko']=' checked'; $_GET['exlcko']=1; } else { $_GET['cbexlcko']=''; $_GET['exlcko']=0; } if (array_key_exists('lang',$_GET)) { if (preg_match('#^[0-9]+$#',$_GET['lang'])===1) $_GET['lang']=$_GET['lang']+0; else $_GET['lang']=0; } else { $res=mysqli_query($link,'SELECT ID FROM Languages WHERE Code="'.$dlang.'"') or muorimeglio(__LINE__.': '.mysqli_error($link),true); if (mysqli_num_rows($res)>0) { $row=mysqli_fetch_assoc($res); $_GET['lang']=$row['ID']; } else { $_GET['lang']=0; } } if ($_GET['lang']>5000000000) $_GET['lang']=0; if (array_key_exists('desc',$_GET) && preg_match('#^.+$#',$_GET['lang'])===1) $_GET['desc']=trim(n2es($_GET['desc'])); else $_GET['desc']=''; if (mb_strlen($_GET['desc'])>64) $_GET['desc']=''; ckgnum('minu',$minudef,$minumax); ckgnum('maxu',$maxudef,$maxumax); if (is_int($_GET['maxu']) && is_int($_GET['minu']) && $_GET['maxu']<$_GET['minu']) $_GET['maxu']=$_GET['minu']; ckgnum('minau',$minaudef,$minaumax); ckgnum('minc',$mincdef,$mincmax); $order=array( 'rand'=>array('t'=>_('Random, recommended first'),'q'=>'Instances.Priority DESC, Instances.RPos ASC'), 'invold'=>array('t'=>_('By users’ involvement (active users / users), descending'),'q'=>'(Instances.ActiveUsersMonth / Instances.UserCount) DESC'), 'invola'=>array('t'=>_('By users’ involvement (active users / users), ascending'),'q'=>'(Instances.ActiveUsersMonth / Instances.UserCount) ASC'), 'fseend'=>array('t'=>_('By date and time of first sighting, descending'),'q'=>'Instances.FirstSeen DESC'), 'fseena'=>array('t'=>_('By date and time of first sighting, ascending'),'q'=>'Instances.FirstSeen ASC'), 'tusersd'=>array('t'=>_('By number of users, descending'),'q'=>'Instances.UserCount DESC'), 'tusersa'=>array('t'=>_('By number of users, ascending'),'q'=>'Instances.UserCount ASC'), 'ausersd'=>array('t'=>_('By number of active users, descending'),'q'=>'Instances.ActiveUsersMonth DESC'), 'ausersa'=>array('t'=>_('By number of active users, ascending'),'q'=>'Instances.ActiveUsersMonth ASC'), 'checksd'=>array('t'=>_('By responsiveness to our checks, descending'),'q'=>'(Instances.OkChecks / Instances.TotChecks) DESC, Instances.TotChecks DESC'), 'checksa'=>array('t'=>_('By responsiveness to our checks, ascending'),'q'=>'(Instances.OkChecks / Instances.TotChecks) ASC, Instances.TotChecks ASC'), 'charsd'=>array('t'=>_('By available characters per post, descending'),'q'=>'Instances.MaxTootChars DESC'), 'charsa'=>array('t'=>_('By available characters per post, ascending'),'q'=>'Instances.MaxTootChars ASC'), 'noxd'=>array('t'=>_('Noxious first (switches off “Exclude noxious”)'),'q'=>'Instances.Noxious DESC') ); if (!array_key_exists('ord',$_GET) || !array_key_exists($_GET['ord'],$order)) $_GET['ord']='rand'; // we have recommended instances only for it language, so... $withreclangids=[306]; if (!in_array($_GET['lang'],$withreclangids)) $order['rand']=array('t'=>_('Random'),'q'=>'Instances.RPos ASC'); $p=1; if (array_key_exists('p',$_GET) && preg_match('#^[0-9]+$#',$_GET['p'])===1) $p=$_GET['p']+0; echo('

'._('Search instances').'

'.N); ($_GET['lang']==0) ? $selected=' selected' : $selected=''; echo('
'._('Search criteria').'
'._('Show instances where...').'
'._('Order of results').'
'.N); $joins=array(); $wheres=array(); $wheres[]='Instances.IsMastodon=1 AND Instances.LastOkCheckTS>='.$graceline; if ($_GET['exnox']==1) $wheres[]='Instances.Noxious=0'; if ($_GET['exregc']==1) $wheres[]='Instances.RegOpen=1'; if ($_GET['exappr']==1) $wheres[]='Instances.RegReqApproval=0'; if ($_GET['exlcko']==1) $wheres[]='Instances.WasLastCheckOk=1'; /*if ($_GET['exlcko']==1) { $joins[]='LEFT JOIN InstChecks AS InstChecks ON InstChecks.InstID=Instances.ID AND InstChecks.Time=(SELECT MAX(InstChecks.Time) AS MaxTime FROM InstChecks WHERE InstChecks.InstID=Instances.ID)'; $wheres[]='InstChecks.Status=1'; }*/ if ($_GET['lang']>0) { $joins[]='LEFT JOIN InstOurLangs ON InstOurLangs.InstID=Instances.ID'; $wheres[]='(InstOurLangs.OurLangID='.$_GET['lang'].' AND InstOurLangs.Pos=1)'; } $buf=preg_replace('#%#','\%',myesc($link,$_GET['desc'])); if ($_GET['desc']!='') $wheres[]='(Instances.URI LIKE "%'.$buf.'%" OR Instances.Title LIKE "%'.$buf.'%" OR Instances.ShortDesc LIKE "%'.$buf.'%" OR Instances.LongDesc LIKE "%'.$buf.'%")'; if ($_GET['minu']!='') $wheres[]='Instances.UserCount>='.$_GET['minu']; if ($_GET['maxu']!='') $wheres[]='Instances.UserCount<='.$_GET['maxu']; if ($_GET['minau']!='') $wheres[]='Instances.ActiveUsersMonth>='.$_GET['minau']; if ($_GET['minc']!='' && $_GET['minc']!='""') $wheres[]='Instances.MaxTootChars>='.$_GET['minc']; $joins=implode(' ',$joins); $wheres='WHERE '.implode(' AND ',$wheres); $que='SELECT * FROM Instances '.$joins.' '.$wheres.' ORDER BY '.$order[$_GET['ord']]['q']; } $debug.='QUERY: «'.$que.'»'.N; $qbt=microtime(true); $res=mysqli_query($link,$que) or muorimeglio(__LINE__.': '.mysqli_error($link),true); $debug.='MAIN QUERY EXEC TIME: '.(microtime(true)-$qbt).' sec.'.N; $itot=mysqli_num_rows($res); $debug.='RESULTS: '.$itot.N; /*if ($itot==0) { echo(_('No instance matches with the search criteria.').N.'
'.N.'
'.N.'
'.N.''.N.''.N); exit(0); }*/ $ipp=10;// istanze per pagina $if=$ipp*($p-1); if ($if>=$itot) { $if=0; $p=1; } $il=$if+$ipp; function tquery($query,$line) { global $link, $debug; $bt=microtime(true); $res=mysqli_query($link,$query) or muorimeglio($line.': '.mysqli_error($link),true); $debug.=(microtime(true)-$bt).' secs. for query «'.$query.'»'.N; return($res); } $dfmt=datefmt_create($blang,IntlDateFormatter::MEDIUM,IntlDateFormatter::NONE,'UTC',IntlDateFormatter::GREGORIAN); $defmt=datefmt_create($blang,IntlDateFormatter::SHORT,IntlDateFormatter::MEDIUM,'UTC',IntlDateFormatter::GREGORIAN); $wrfss=1602633600;// we record FirstSeen since October 14, 2020, 0:0:0 UTC $wrfsstxt=datefmt_format($dfmt,$wrfss).' UTC'; mysqli_data_seek($res,$if); while ($if<$il && $row=mysqli_fetch_assoc($res)) { $if++; $out='
'.hspech($row['URI']).''; if (!$single) $out.=' ('.$if.'/'.$itot.')'; $out.='
'.N; ($if<$il) ? $out.='
'.N : $out.='
'.N; $qbt=microtime(true); $rres=tquery('SELECT CONCAT(Languages.Name'.$dlanguc.'," (",Languages.Code,")") AS Lang FROM InstOurLangs LEFT JOIN Languages ON Languages.ID=InstOurLangs.OurLangID WHERE InstOurLangs.InstID='.$row['ID'].' ORDER BY InstOurLangs.Pos ASC',__LINE__); $buf=array(); while ($rrow=mysqli_fetch_assoc($rres)) $buf[]=hspech($rrow['Lang']); ($row['Thumb']=='unavailable') ? $thumb=$prepath.'imgs/InstThumbUnavailable.svg' : $thumb=$row['Thumb']; $out.='
'; // if (!is_null($row['Priority'])) $out.=''; if (!is_null($row['Priority'])) $out.='
'._('Recommended').'
'; if ($row['Thumb']=='unavailable' && $row['WasLastCheckOk']==1) $out.='
'._('It seems like this instance’s server thumbnail’s URL points to a non existent file. This is usually easily fixable by the instance’s admin(s) by uploading again the image to their server. Note that the change won’t be displayed here before the nightly automatic update of this instance’s infos occurs.').'
'; $out.='
'.N; $out.='
'.N; $out.='
'._('Name').' '.nully(hspech($row['Title'])).'
'.N; /*$out.='
'._('Consigliata').' '; (!is_null($row['Priority'])) ? $out.=''._('Si!').'' : $out.=_('No'); $out.='
'.N;*/ $out.='
'._('Languages').' '.nully(implode(', ',$buf)).'
'.N; $out.='
'._('Users').' '.nully(fnum($row['UserCount'],0,$dlang)).'
'.N; $out.='
'._('Active users (last month)').' '.nully(fnum($row['ActiveUsersMonth'],0,$dlang)).'
'.N; $out.='
'._('Active users (last six months)').' '.nully(fnum($row['ActiveUsersHalfYear'],0,$dlang)).'
'.N; $out.='
'._('Characters per post (max)').' '; if (nullemp(fnum($row['MaxTootChars'],0,$dlang))) $out.='500'; else $out.=$row['MaxTootChars']; $out.='
'.N; $out.='
'._('Known instances').' '.nully(fnum($row['DomainCount'],0,$dlang)).'
'.N; $out.='
'.N; $out.='
'.N; if (is_null($row['FirstSeen'])) {// can't currently happen, but we put it there in any event $fdate=''._('Not available{singular}').''; } elseif ($row['FirstSeen']<$wrfss) { $fdate=''._('Before').' '.$wrfsstxt.''; } else { $fdate=datefmt_format($dfmt,$row['FirstSeen']).' UTC'; } $out.='
'._('First sight').' '.$fdate.'
'.N; (is_null($row['LastOkCheckTS'])) ? $fdate=''._('Not available{singular}').'' : $fdate=datefmt_format($dfmt,$row['LastOkCheckTS']).' UTC'; $out.='
'._('Last successful check').' '.$fdate.'
'.N; $out.='
'._('Noxious').' '; ($row['Noxious']==1) ? $out.=''._('Yes (see why below)').'' : $out.=''._('No').''; $out.='
'.N; $out.='
'._('New').' '; ($bt-$row['InsertTS']<=$oldline) ? $out.=''._('Yes!').'' : $out.=_('No'); $out.='
'.N; $software=''; if (!is_null($row['Software'])) $software.=ucfirst($row['Software']); if (!is_null($row['Version'])) $software.=' '.$row['Version']; $out.='
'._('Software').' '.nully(hspech($software)).'
'.N; $out.='
'._('Registrations').' '; ($row['RegReqApproval']==1) ? $buf=' ('._('by admin approval').')' : $buf=''; if (nullemp($row['RegOpen'])) $out.=''._('Not available{singular}').''; elseif ($row['RegOpen']==1) $out.=''._('Open').''.$buf; else $out.=''._('Closed').''; $out.='
'.N; $out.='
'._('E-mail').' '; if (nullemp($row['Email'])) $out.=''._('Not available{singular}').''; else $out.=''.$row['Email'].''; $out.='
'.N; $out.='
'.N; $out.='
'._('Meta’s Threads moderation').' '; if ($row['BlockListAvailable']==1) { $mmres=tquery('SELECT Domain, Severity, Comment FROM InstBlocks WHERE InstID='.$row['ID'],__LINE__); if (mysqli_num_rows($mmres)>0) { $tm=false;// tmk: threads moderation while ($rrow=mysqli_fetch_assoc($mmres)) { if (preg_match('#^(threads.net|.*\.threads.net)$#i',$rrow['Domain'])==1) { if ($rrow['Severity']=='suspend') $out.=_('Threads is suspended'); elseif ($rrow['Severity']=='silence') $out.=_('Threads is limited'); else $out.=_('Unknown value').': «'.htmlentities($rrow['Severity']).'»'; $tm=true; break; } } if (!$tm) $out.=_('Threads is neither suspended nor limited'); } else { $out.=_('Threads is neither suspended nor limited'); $mmres=false; } } else { $out.=''._('Unknown (moderated servers list is unaccessible)').''; $mmres=false; } $out.='
'.N; $out.='
'._('Most used hashtags (last week)').' '; $rres=tquery('SELECT * FROM InstTrends WHERE InstID='.$row['ID'].' ORDER BY Pos ASC',__LINE__); if (mysqli_num_rows($rres)>0) { $buf=array(); while ($rrow=mysqli_fetch_assoc($rres)) $buf[]=''.hspech($rrow['Name']).''; $out.=implode(', ',$buf); } else { $out.=''._('Not available{plural}').''; } $out.='
'.N; if ($row['Noxious']) { $out.='
'._('Why we consider this instance noxious').'
'.nully(strip($row['NoxReason'],$row['URI'])).'
'.N; } $out.='
'._('Short description').'
'.nully(strip($row['ShortDesc'],$row['URI'])).'
'.N; $out.='
'._('Long description').'
'.nully(strip($row['LongDesc'],$row['URI'])).'
'.N; $out.='
'._('Server rules').'
'; $rres=tquery('SELECT Text FROM InstRules WHERE InstID='.$row['ID'],__LINE__); if (mysqli_num_rows($rres)>0) { $out.='
    '.N; while ($rrow=mysqli_fetch_assoc($rres)) $out.='
  1. '.hspech($rrow['Text']).'
  2. '.N;// no strip, do hspech, because server rules don’t support html nor markdown in mastodon $out.='
'.N; } else { $out.=''._('Not available{plural}').''; } $out.='
'.N; $out.='
'._('Moderated servers').'
'; $sevmap=['silence'=>_('limited'), 'suspend'=>_('sospeso')]; if ($mmres!=false) { $out.='
    '.N; while ($rrow=mysqli_fetch_assoc($mmres)) { $out.='
  • '.hspech($rrow['Domain']).': '.$sevmap[$rrow['Severity']]; if (!is_null($rrow['Comment'])) $out.=' - '.hspech($rrow['Comment']);// no strip, do hspech, because moredated server comments don’t support html nor markdown in mastodon $out.='
  • '.N; } $out.='
'.N; } else { $out.=''._('Not available{plural}').''; } $out.='
'.N; $admacc=nully(null); $thumb=$prepath.'imgs/AdmAccThumbUnavailable.svg'; if (!is_null($row['AdmAccount']) && $row['AdmAccount']!='OPTED OUT') { $admacc=''.hspech($row['AdmAccount']).'@'.hspech($row['URI']).''; if ($row['AdmAvatar']!='unavailable') $thumb=$row['AdmAvatar']; } elseif ($row['AdmAccount']=='OPTED OUT') { $admacc=''._('Opted out of search engines indexing').''; } (is_null($row['AdmCreatedAt'])) ? $fdate=''._('Not available{singular}').'' : $fdate=datefmt_format($dfmt,$row['AdmCreatedAt']).' UTC'; $out.='
'._('Admin account').' '.$admacc.'
'._('Date of creation').' '.$fdate.'
'._('Display name').' '.nully(hspech($row['AdmDisplayName'])).'
'._('Bio').'
'.nully(strip($row['AdmNote'],$row['URI'])).'
'.N; $out.='
'; $out.='
'._('Stats').'
'; $rres=tquery('SELECT COUNT(InstID) AS cnt, SUM(Statuses) AS tstatuses, SUM(Logins) AS tlogins, SUM(Registrations) AS tregs FROM InstActivity WHERE InstID='.$row['ID'],__LINE__); $out.='
'._('Last 12 weeks activity'); if (mysqli_num_rows($rres)>0) { $rrow=mysqli_fetch_assoc($rres); if ($rrow['cnt']>0) $out.=' ('._('totals:').' '.$rrow['tstatuses'].' '._('statuses').', '.$rrow['tlogins'].' '._('logins').', '.$rrow['tregs'].' '._('registrations').')'; } $out.='
'.N; $rres=tquery('SELECT * FROM InstActivity WHERE InstID='.$row['ID'].' ORDER BY Week ASC',__LINE__); $out.=''; $tot=mysqli_num_rows($rres); if ($tot>0) { while ($rrow=mysqli_fetch_assoc($rres)) // initials for Statuses, Logins, Registrations $out.=''; } else { $out.=''; } $out.='
'._('S').': '.$rrow['Statuses'].'
'._('L').': '.$rrow['Logins'].'
'._('R').': '.$rrow['Registrations'].'
'._('Not available{singular}').'
'.N; $rres=tquery('SELECT * FROM InstChecks WHERE InstID='.$row['ID'].' ORDER BY Time DESC LIMIT 0,8',__LINE__); $tot=mysqli_num_rows($rres); $buf=array(); while ($rrow=mysqli_fetch_assoc($rres)) $buf[]=$rrow; $out.='
'._('Last checks (green: OK; red: KO)').'
'; for ($i=$tot-1; $i>=0; $i--) { $out.='
'; } $out.='
'.N; $out.='
'._('Succesful checks').': '.$row['OkChecks'].'/'.$row['TotChecks'].' ('.round(100 / $row['TotChecks'] * $row['OkChecks'], 2).'%)
'.N; $out.='
'.N; $out.='
'.N; echo($out); } mysqli_close($link); echo(''.N); $ptot=ceil($itot/$ipp); if ($ptot>1) { echo('
'.N); echo('
'.N); $pnav=''; if ($p>1) $pnav.=''; else $pnav.=''; //$pnav.=''; $pnav.=''.N; if ($p<$ptot) $pnav.=''; else $pnav.=''; $pnav.='
Page '.$p.'/'.$ptot.'
'.N; echo($pnav); echo('
'.N); } echo('
'.N); echo(''.N); $debug.='TOTAL RENDERING TIME: '.(microtime(true)-$bt).N; if (array_key_exists('debug',$_GET) && $_GET['debug']=='1') echo(''.N); // functions function ckgnum($key,$def,$max) { if (array_key_exists($key,$_GET)) { $_GET[$key]=trim($_GET[$key]); if (preg_match('#^\d+$#',$_GET[$key])===1) { $_GET[$key]=$_GET[$key]+0; if ($_GET[$key]>$max) $_GET[$key]=$max; } elseif ($_GET[$key]!='') { $_GET[$key]=$def; } } else { $_GET[$key]=$def; } } function nullemp($inp) { if (is_null($inp) || preg_match('/^\s*$/',$inp)===1) return(true); return(false); } function nulltozero($inp) { if (is_null($inp)) return 0; return $inp; } function hspech($str) { if (nullemp($str)) return(null); return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8')); } function muorimeglio($msg,$close) { global $link; if ($close) mysqli_close($link); echo('

'.$msg.'

'.N.''.N.''.N.''.N.''.N); exit(2); } function nully($str) { // "Not available" in singular form - translators, please omit "{singular}" from translation, // it's there just to diversify this "Not available" from the next one if (nullemp($str)) return(''._('Not available{singular}').''); return($str); } function nullyp($str) { // "Not available" in plural form - translators, please omit "{plural}" from translation, // it's there just to diversify this "Not available" from the previous one if (nullemp($str)) return(''._('Not available{plural}').''); return($str); } function strip($str,$uri) { if (nullemp($str)) return(null); $str=preg_replace('#]*)?>.*#is','',$str); $str=preg_replace('#','

'],$str); $str=preg_replace(['#


#i','#
#i','#
#i','#','
$#i', '#]*>(.*)$#i'],['

$1

', '
    $1
', '
    $1
', '
$1
'],$str); return($str); } ?>