'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; //$getc=count($_GET); //forzo $getc a 1 per non mostrare mai la spiega di come funziona il motore di ricerca $getc=1; if (array_key_exists('advc',$_GET)) { ($_GET['advc']=='1') ? $_GET['advc']=1 : $_GET['advc']=0; } else { $_GET['advc']=0; } echo('

'._('Instances').'

'.N); function nullemp($inp) { if (is_null($inp) || preg_match('/^\s*$/',$inp)===1) return(true); return(false); } function ldate($ts,$dateonly=false) { if (nullemp($ts)) return(null); $ts=round($ts); if (!$dateonly) return(gmdate('d/m/Y H:i:s e',$ts)); else return(gmdate('d/m/Y',$ts)); } 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); while (preg_match('#^\s*#',$str)===1) $str=preg_replace('#^\s*#','',$str); while (preg_match('#\s*$#',$str)===1) $str=preg_replace('#\s*$#','',$str); while (preg_match('#\s*#s',$str)===1) $str=preg_replace('#\s*#s','
',$str); $str=preg_replace('#]*)?>.*#s','',$str); $str=preg_replace('#

This is our search engine for Mastodon instances. It works this way: data of already indexed instances gets updated every night, and a shuffling occurs for the “random ordering”; also, once a week, during the night between Tuesday and Wednesday, new instances get searched for and added to the database.

Advanced search criteria are customizable, but by default they reflect our fondness for a decentralized and egalitarian Fediverse, and we try to exclude instances accepting fascist, racist, sexist, ableist, sovereignist contents.

').N); printf(_('

We currently count %s Mastodon instances, with %s users (%s active during last month) and %s published statuses.

').N, fnum($row['tinsts'],0,$dlang), fnum($row['tusers'],0,$dlang), fnum($row['tactusers'],0,$dlang), fnum($row['tstatuses'],0,$dlang)); //

Nella prima versione stabile daremo a* admin delle istanze compatibili con questa politica la possibilità di descrivere ulteriormente la propria istanza con questi campi, tutti facoltativi: “Descrizione in inglese” (per le istanze la cui descrizione è in altre lingue), “Località” (se l’istanza è particolarmente legata a un territorio), “Lingue” (se le lingue utilizzate prevalentemente sull’istanza non corrispondono a quelle rilevate automaticamente dal nostro crawler), “Modalità di copertura dei costi” (per esempio “Autonoma”, “Sottoscrizioni volontarie degli utenti”, “Iniziative benefit”), “Regole sui contenuti” (per esempio “Tag NSFW per i nudi”, “No link a siti di partiti politici”, “No pubblicità”, “Content Warning prima degli spoiler”), e “Categorie” (per esempio “Generalista”, “Astronomia”, “Politica”, “Musica folk”).

// daremo la possibilità di segnalarci le istanze su cui sono accettati contenuti di questo tipo // Le istanze che non rispondono da più di due mesi vengono dichiarate “morte” nel database e non vengono più mostrate tra i risultati della ricerca, ma una volta all’anno, nella notte di Halloween (31 ottobre), vengono nuovamente controllate e, se rispondono, “resuscitate” $maxuinp=10000000000; if ((array_key_exists('noxious',$_GET) && $_GET['noxious']=='1') || !array_key_exists('noxious',$_GET)) { $_GET['cbnoxious']=' checked'; $_GET['noxious']=1; } else { $_GET['cbnoxious']=''; $_GET['noxious']=0; } //echo('

noxious: '.$_GET['noxious'].'

'); if ((array_key_exists('creg',$_GET) && $_GET['creg']=='1') || !array_key_exists('creg',$_GET)) { $_GET['cbcreg']=' checked'; $_GET['creg']=1; } else { $_GET['cbcreg']=''; $_GET['creg']=0; } if (array_key_exists('appr',$_GET) && $_GET['appr']=='1') { $_GET['cbappr']=' checked'; $_GET['appr']=1; } else { $_GET['cbappr']=''; $_GET['appr']=0; } if (array_key_exists('lcok',$_GET) && $_GET['lcok']=='1') { $_GET['cblcok']=' checked'; $_GET['lcok']=1; } else { $_GET['cblcok']=''; $_GET['lcok']=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']=''; if (array_key_exists('minu',$_GET) && preg_match('#^[0-9]+$#',$_GET['minu'])===1) $_GET['minu']=$_GET['minu']+0; else $_GET['minu']=10; if ($_GET['minu']>$maxuinp) $_GET['minu']=$maxuinp; if (array_key_exists('maxu',$_GET) && preg_match('#^[0-9]+$#',$_GET['maxu'])===1) $_GET['maxu']=$_GET['maxu']+0; else $_GET['maxu']=30000; if ($_GET['maxu']>$maxuinp) $_GET['maxu']=$maxuinp; if ($_GET['maxu']<$_GET['minu']) $_GET['maxu']=$_GET['minu']; if (array_key_exists('minau',$_GET) && preg_match('#^[0-9]+$#',$_GET['minau'])===1) $_GET['minau']=$_GET['minau']+0; else $_GET['minau']=10; if ($_GET['minau']>10000000) $_GET['minau']=10000000; if (array_key_exists('minki',$_GET) && preg_match('#^[0-9]+$#',$_GET['minki'])===1) $_GET['minki']=$_GET['minki']+0; else $_GET['minki']=500; if ($_GET['minki']>100000) $_GET['minki']=100000; $order=array( 'rand'=>array('t'=>_('Random, recommended first'),'q'=>'Instances.Priority DESC, Instances.RPos ASC'), // 'feat'=>array('t'=>_('Prima le consigliate'),'q'=>'Instances.Priority DESC'), // partecipazione: totusers/activeusers // 'part'=>array('t'=>_('Partecipazione (decr.)'),'q'=>'(Instances.UserCount / Instances.ActiveUsersMonth) ASC'), 'tusersa'=>array('t'=>_('By number of users, ascending'),'q'=>'Instances.UserCount ASC'), 'tusersd'=>array('t'=>_('By number of users, descending'),'q'=>'Instances.UserCount DESC'), 'ausersd'=>array('t'=>_('By number of active users, descending'),'q'=>'Instances.ActiveUsersMonth DESC'), 'kinstsd'=>array('t'=>_('By number of known instances, descending'),'q'=>'Instances.DomainCount DESC'), 'charsd'=>array('t'=>_('By maximum number of characters per toot, descending'),'q'=>'Instances.MaxTootChars DESC'), // 'open'=>array('t'=>_('Prima quelle con iscriz. aperte'),'q'=>'Instances.RegOpen DESC, Instances.RegReqApproval ASC'), // 'alph'=>array('t'=>_('Alfabetico'),'q'=>'Instances.URI ASC'), // new non ha senso di esistere visto che c'è firstseen // 'new'=>array('t'=>_('Prima le nuove'),'q'=>'Instances.New DESC'), // 'name'=>array('t'=>_('Nome (crescente)'),'q'=>'Instances.Title ASC'), // 'admc'=>array('t'=>_('Data creazione account admin'),'q'=>'IF (Instances.AdmCreatedAt IS NULL, 9999999999, Instances.AdmCreatedAt) ASC'), // 'fseena'=>array('t'=>_('Data di “avvistamento” cresc.'),'q'=>'Instances.FirstSeen ASC'), // 'fseend'=>array('t'=>_('Data di “avvistamento” decr.'),'q'=>'Instances.FirstSeen DESC'), ); if (!(array_key_exists('ord',$_GET) && array_key_exists($_GET['ord'],$order))) $_GET['ord']='rand'; if ($_GET['lang']==0) $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('
'.N); ($_GET['lang']==0) ? $selected=' selected' : $selected=''; echo('
'._('Search criteria').'
'._('Order of results').'
'.N); $joins=array(); $wheres=array(); $wheres[]='Instances.Dead=0 AND Instances.IsMastodon=1 AND Instances.FirstSeen IS NOT NULL'; if ($_GET['noxious']==1) $wheres[]='Instances.Noxious=0'; if ($_GET['creg']==1) $wheres[]='Instances.RegOpen=1'; if ($_GET['appr']==1) $wheres[]='Instances.RegReqApproval=0'; if ($_GET['lcok']==1) $wheres[]='Instances.LastCheckOk=1'; /*if ($_GET['lcok']==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']>0) $wheres[]='Instances.UserCount>='.$_GET['minu']; if ($_GET['maxu']>0) $wheres[]='Instances.UserCount<='.$_GET['maxu']; if ($_GET['minau']>0) $wheres[]='Instances.ActiveUsersMonth>='.$_GET['minau']; if ($_GET['minki']>0) $wheres[]='Instances.DomainCount>='.$_GET['minki']; $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; //echo('
'.N); $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); } mysqli_data_seek($res,$if); while ($if<$il && $row=mysqli_fetch_assoc($res)) { $if++; $out='
'.hspech($row['URI']).' ('.$if.'/'.$itot.')
'.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']); $out.='
'; // if (!is_null($row['Priority'])) $out.=''; if (!is_null($row['Priority'])) $out.='
'._('Recommended').'
'; $out.='
'.N; $out.='
'.N; $out.=''.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.='
'._('Known instances').' '.nully(fnum($row['DomainCount'],0,$dlang)).'
'.N; $out.='
'.N; $out.='
'.N; $out.='
'._('Characters per toot (max)').' '; if (nullemp(fnum($row['MaxTootChars'],0,$dlang))) $out.='500'; else $out.=$row['MaxTootChars']; $out.='
'.N; $out.='
'._('Noxious').' '; ($row['Noxious']==1) ? $out.=''._('Yes (see why below)').'' : $out.=''._('No').''; $out.='
'.N; $out.='
'._('New').' '; ($row['New']==1) ? $out.=''._('Yes!').'' : $out.=_('No'); $out.='
'.N; $out.='
'._('Mastodon version').' '.nully(hspech($row['Version'])).'
'.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.='
'._('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(nl2br(trim(n2es($row['NoxReason'])),false),$row['URI'])).'
'.N; } $out.='
'._('Short description').'
'.nully(strip(nl2br(trim(n2es($row['ShortDesc'])),false),$row['URI'])).'
'.N; $out.='
'._('Long description').'
'.nully(strip(trim(n2es($row['LongDesc'])),$row['URI'])).'
'.N; $out.='
'._('Admin account').' '.nully(hspech($row['AdmAccount'])).'
'._('Date of creation').' '.nully(ldate($row['AdmCreatedAt'],true)).'
'._('Admin name').' '.nully(hspech($row['AdmDisplayName'])).'
'._('Admin notes').'
'.nullyp(strip(trim(n2es($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.='
'.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; //echo(''.N); ?>