tilde.chat/stats/index.php

73 lines
2.6 KiB
PHP

<?php
$title="stats page";
$desc="stats about tilde.chat and its channels";
$stats = json_decode(file_get_contents("../stats.json"));
$members = json_decode(file_get_contents("https://tildeverse.org/members.json", false, stream_context_create(['socket' => ['bindto' => '0:0']])))->members;
include __DIR__."/../header.php";
?>
<h1>channels</h1>
<h3><a href="https://tildeverse.org/members/">member tildes</a></h3>
<?php foreach($members as $member) {
$chans = explode(", ", $member->channel); ?>
<div class="btn-group">
<a class="btn btn-default" href="<?=$member->link?>"><?=$member->name?></a>
<?php foreach ($chans as $chan) { ?>
<a class="btn btn-primary" href="https://kiwi.tilde.chat/<?=$chan?>"><?=$chan?></a>
<?php } ?>
</div>
<?php } ?>
<hr>
<h3>full channel stats</h3>
<p>there are <?=$stats->usercount?> users across <?=$stats->channelcount?> channels.</p>
<p>if the channel is set with <a href="https://docs.inspircd.org/3/modes/#channel-modes">chanmode +s</a> it will be omitted from this list.</p>
<p>the table is sortable by clicking on the column headers</p>
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>Name</th>
<th>Users</th>
<th>Topic</th>
</tr>
</thead>
<tbody data-link="row" class="rowlink">
<?php foreach($stats->channels as $channel): ?>
<tr>
<td><a href="<?=$channel->webchatlink?>"><?=$channel->name?></a></td>
<td><?=$channel->usercount?></td>
<td style="word-wrap: break-word; white-space: pre-wrap; max-width:700px"><?=$channel->topic?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<hr>
<p>also available as <a href="/stats.json">json</a>.</p>
<script>
// sort stats page
const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent;
const comparer = (idx, asc) => (a, b) => ((v1, v2) =>
v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)
)(getCellValue(asc ? b : a, idx), getCellValue(asc ? a : b, idx));
// do the work...
document.querySelectorAll('th').forEach(function(th) {
th.addEventListener('click', (() => {
const table = th.closest('table').querySelector("tbody");
Array.from(table.querySelectorAll('tr'))
.sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc))
.forEach(tr => table.appendChild(tr) );
}));
th.style.cursor = 'pointer';
});
</script>
<?php include __DIR__."/../footer.php"; ?>