'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); $nottrans=['ca','es','fr']; $locale=$dlang; if (in_array($locale,$nottrans)) $locale='en'; $blocale='en_US.UTF-8'; //putenv('LC_ALL='.$blocale); setlocale(LC_ALL,$blocale); bindtextdomain('custard','./locale/'.$locale); textdomain('custard'); $debug.='LOCALE: '.$locale.N; $getc=count($_GET); if (array_key_exists('advc',$_GET)) { ($_GET['advc']=='1') ? $_GET['advc']=1 : $_GET['advc']=0; } else { $_GET['advc']=0; } //non spostarli sopra sennò gettext non funge (css si può anche, ma tanto vale tenere insieme) echo('

'._('Istanze').'

'.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); 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) { if (nullemp($str)) return(''._('Non disponibile').''); return($str); } function nullyp($str) { if (nullemp($str)) return(''._('Non disponibili').''); 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('#

Questa è una versione beta del nostro motore di ricerca di istanze Mastodon. Funziona così: i dati relativi alle istanze già indicizzate vengono aggiornati ogni notte (alla fine di questo aggiornamento avviene anche il rimescolamento per l’ordinamento casuale, che quindi varia quotidianamente); una volta alla settimana, nella notte tra martedì e mercoledì, vengono inoltre cercate e aggiunte al database le nuove istanze.

I criteri di ricerca avanzati sono modificabili, ma per preimpostazione riflettono la nostra predilezione per un Fediverso decentralizzato ed egualitario; in particolare cerchiamo, con la nostra blacklist, di non dare visibilità a istanze su cui sono accettati contenuti fascisti, razzisti, sessisti, abilisti, sovranisti.

').N); printf(_('

Al momento contiamo %s istanze Mastodon, con %s utenti (%s attiv* nell’ultimo mese) e %s stati pubblicati.

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

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('black',$_GET) && $_GET['black']=='1') || !array_key_exists('black',$_GET)) { $_GET['cbblack']=' checked'; $_GET['black']=1; } else { $_GET['cbblack']=''; $_GET['black']=0; } //echo('

black: '.$_GET['black'].'

'); 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') || !array_key_exists('appr',$_GET)) { $_GET['cbappr']=' checked'; $_GET['appr']=1; } else { $_GET['cbappr']=''; $_GET['appr']=0; } if ((array_key_exists('lcok',$_GET) && $_GET['lcok']=='1') || !array_key_exists('lcok',$_GET)) { $_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($_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'=>_('Casuale, prima le consigliate'),'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'=>_('Per numero di utenti, crescente'),'q'=>'Instances.UserCount ASC'), 'tusersd'=>array('t'=>_('Per numero di utenti, decrescente'),'q'=>'Instances.UserCount DESC'), 'ausersd'=>array('t'=>_('Per numero di utenti attivi, decrescente'),'q'=>'Instances.ActiveUsersMonth DESC'), 'kinstsd'=>array('t'=>_('Per numero di istanze note, decrescente'),'q'=>'Instances.DomainCount DESC'), 'charsd'=>array('t'=>_('Per numero massimo di caratteri per toot, decrescente'),'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'=>_('Casuale'),'q'=>'Instances.RPos ASC'); $p=1; if (array_key_exists('p',$_GET) && preg_match('#^[0-9]+$#',$_GET['p'])===1) $p=$_GET['p']+0; ($_GET['lang']==0) ? $selected=' selected' : $selected=''; echo('
'._('Criteri di ricerca').'
'._('Ordinamento dei risultati').'
'.N); $joins=array(); $wheres=array(); $wheres[]='Instances.Dead=0 AND Instances.IsMastodon=1 AND Instances.FirstSeen IS NOT NULL'; if ($_GET['black']==1) $wheres[]='Instances.Blacklisted=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.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: «'.hspech($que).'»'.N; $qit=microtime(true); $res=mysqli_query($link,$que) or muorimeglio(__LINE__.': '.mysqli_error($link),true); $debug.='MAIN QUERY EXEC TIME: '.(microtime(true)-$qit).' sec.'.N; $itot=mysqli_num_rows($res); $debug.='RESULTS: '.$itot; //echo('
'.N); $ipp=10;// istanze per pagina $if=$ipp*($p-1); if ($if>=$itot) { $if=0; $p=1; } $il=$if+$ipp; $ptot=ceil($itot/$ipp); //echo('ptot: '.$ptot.'
'.N); if ($ptot>1) { $out='
'.N; $out.=''.N; $out.='
'.N; echo($out); } else { echo(''.N); } mysqli_data_seek($res,$if); while ($if<$il && $row=mysqli_fetch_assoc($res)) { $if++; $out='
'.hspech($row['URI']).' ('.$if.'/'.$itot.')
'.N; $out.='
'.N; $rres=mysqli_query($link,'SELECT CONCAT(Languages.Name'.strtoupper($dlang).'," (",Languages.Code,")") AS Lang FROM InstOurLangs LEFT JOIN Languages ON Languages.ID=InstOurLangs.OurLangID WHERE InstOurLangs.InstID='.$row['ID'].' ORDER BY InstOurLangs.Pos ASC') or muorimeglio(__LINE__.': '.mysqli_error($link),true); $buf=array(); while ($rrow=mysqli_fetch_assoc($rres)) $buf[]=hspech($rrow['Lang']); $out.='
'; if (!is_null($row['Priority'])) $out.=''; $out.='
'.N; $out.='
'.N; $out.=''.N; /*$out.='
'._('Consigliata').' '; (!is_null($row['Priority'])) ? $out.=''._('Si!').'' : $out.=_('No'); $out.='
'.N;*/ $out.='
'._('Lingue').' '.nully(implode(', ',$buf)).'
'.N; $out.='
'._('Utenti').' '.nully($row['UserCount']).'
'.N; $out.='
'._('Utenti attiv* nell’ultimo mese').' '.nully($row['ActiveUsersMonth']).'
'.N; $out.='
'._('Utenti attiv* negli ultimi sei mesi').' '.nully($row['ActiveUsersHalfYear']).'
'.N; $out.='
'._('Istanze note a questa istanza').' '.nully($row['DomainCount']).'
'.N; $out.='
'.N; $out.='
'.N; $out.='
'._('Caratteri per toot (max)').' '; if (nullemp($row['MaxTootChars'])) $out.='500'; else $out.=$row['MaxTootChars']; $out.='
'.N; $out.='
'._('Nella blacklist').' '; ($row['Blacklisted']==1) ? $out.=''._('Si').'' : $out.=''._('No').''; $out.='
'.N; $out.='
'._('Nuova').' '; ($row['New']==1) ? $out.=''._('Si!').'' : $out.=_('No'); $out.='
'.N; $out.='
'._('Versione mastodon').' '.nully(hspech($row['Version'])).'
'.N; $out.='
'._('Iscrizioni').' '; ($row['RegReqApproval']==1) ? $buf=' ('._('con approvazione admin').')' : $buf=''; if (nullemp($row['RegOpen'])) $out.=''._('Non disponibile').''; elseif ($row['RegOpen']==1) $out.=''._('Aperte').''.$buf; else $out.=''._('Chiuse').''; $out.='
'.N; $out.='
'._('E-mail').' '; if (nullemp($row['Email'])) $out.=''._('Non disponibile').''; else $out.=''.$row['Email'].''; $out.='
'.N; $out.='
'.N; $out.='
'._('Hashtag più usati (ult. settimana)').' '; $rres=mysqli_query($link,'SELECT * FROM InstTrends WHERE InstID='.$row['ID'].' ORDER BY Pos ASC') or muorimeglio(__LINE__.': '.mysqli_error($link),true); if (mysqli_num_rows($rres)>0) { $buf=array(); while ($rrow=mysqli_fetch_assoc($rres)) $buf[]=''.hspech($rrow['Name']).''; $out.=implode(', ',$buf); } else { $out.=''._('Non disponibili').''; } $out.='
'.N; $out.='
'._('Descrizione breve').'
'.nully(strip(nl2br(trim($row['ShortDesc']),false),$row['URI'])).'
'.N; $out.='
'._('Descrizione lunga').'
'.nully(strip(trim($row['LongDesc']),$row['URI'])).'
'.N; $out.='
'._('Account admin').' '.nully(hspech($row['AdmAccount'])).'
'._('Data di creazione').' '.nully(ldate($row['AdmCreatedAt'],true)).'
'._('Nome admin').' '.nully(hspech($row['AdmDisplayName'])).'
'._('Note admin').'
'.nullyp(strip(trim($row['AdmNote']),$row['URI'])).'
'.N; $out.='
'; $out.='
'._('Statistiche').'
'; $rres=mysqli_query($link,'SELECT COUNT(InstID) AS cnt, SUM(Statuses) AS tstatuses, SUM(Logins) AS tlogins, SUM(Registrations) AS tregs FROM InstActivity WHERE InstID='.$row['ID']) or muorimeglio(__LINE__.': '.mysqli_error($link),true); $out.='
'._('Attività delle ultime 12 settimane'); if (mysqli_num_rows($rres)>0) { $rrow=mysqli_fetch_assoc($rres); if ($rrow['cnt']>0) $out.=' ('._('totali:').' '.$rrow['tstatuses'].' '._('stati').', '.$rrow['tlogins'].' '._('accessi').', '.$rrow['tregs'].' '._('iscrizioni').')'; } $out.='
'.N; $rres=mysqli_query($link,'SELECT * FROM InstActivity WHERE InstID='.$row['ID'].' ORDER BY Week ASC') or muorimeglio(__LINE__.': '.mysqli_error($link),true); $out.=''; $tot=mysqli_num_rows($rres); if ($tot>0) { while ($rrow=mysqli_fetch_assoc($rres)) // initials for Statuses (Toots), Logins, Registrations $out.=''; } else { $out.=''; } $out.='
'._('S').': '.$rrow['Statuses'].'
'._('A').': '.$rrow['Logins'].'
'._('I').': '.$rrow['Registrations'].'
'._('Non disponibile').'
'.N; $rres=mysqli_query($link,'SELECT * FROM InstChecks WHERE InstID='.$row['ID'].' ORDER BY Time DESC LIMIT 0,8') or muorimeglio(__LINE__.': '.mysqli_error($link),true); $tot=mysqli_num_rows($rres); $buf=array(); while ($rrow=mysqli_fetch_assoc($rres)) $buf[]=$rrow; $out.='
'._('Ultimi check (verde: OK; rosso: KO)').'
'; for ($i=$tot-1; $i>=0; $i--) { $out.='
'; } $out.='
'.N; $out.='
'.N; $out.='
'.N; echo($out); } mysqli_close($link); ?>