You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
8.8 KiB

<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/main.css" id="theme">
<script src="/js/jquery.js"></script>
<script src="./js/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js"></script>
<script src="./js/Chart.Financial.js" type="text/javascript"></script>
<title>rtbw readout</title>
</head>
<body onload='begin();'>
<div id='status' style="position: fixed; right: 10; top: 5" class='status'>Connecting...</div>
<h1>Real-Time Board Watcher readout</h1>
<div style='position: relative'>
<div class='indentbar' style='background-color: red !important;'> </div>
<h4 style='position:relative;' onclick='$("#pageinfo").fadeToggle();' class='subheader'>4chan board statistic aggregator.</h4>
<!--TODO: Make it work like this -> $("#pageinfo").slideToggle(1000,function(){$("#_info").fadeToggle();}); but look nicer></-->
</div>
<div>
<div class='expshare2' hidden id='pageinfo'>
<div class='indentbar'> </div>
<div style='padding-left: 17px'>
<p class='info' id='_info'> <!--TODO: Make this hidden for fade-in></-->
This software monitors a 4chan board for various properties, mostly relating to post speed and type, and aggregates them into graphs and charts.<br />
The main use is of `Sessions'. When you load the page you start a session, the client then adds all data it receives from the server into a section for the current session until you close the page or lose connection (the top-right text tells the status of the connection). There are also sections containing a server-maintained set of information from the total uptime of the server; and a section of averages over larger timespans (Aggregate section). There is also a `Live' section which shows each `cycle' of the aggregator and has information on a per-cycle basis.<br />
A cycle is the interval at which the server receives information from the backend archiver and sends it to the client, a cycle contains the information required to construct a chart or display a piece of information in a statistical way.<br />
In the `Aggregate stats' section, a server-maintained average of all cycles in a select timeframe is displayed. The client adds its own data to this when the session starts but a backlog on the server is maintained for an amount of time. <!--TODO: Make the section links that jump to # values in url></-->
</p>
</div>
</div>
</div>
<hr></hr>
<p>
Spidering board: <em id='board'></em><br />
Server up since: <em id='uptime'></em><br />
Cycle interval: <em id='interval'></em><br />
Archiver interval: <em id='binterval'></em><br />
Server buffer purge interval: <em id='pinterval'></em><br />
Server aggregate buffer max size: <em id='spinterval'></em><br />
</p>
<hr></hr>
<h2>Total uptime stats</h2>
<ul>
<li>Total server cycles: <em id='at_upcycle'></em></li>
<li>Last no.: <em id='at_last'></em></li>
<li>Posts: <em id='at_posts'></em></li><!-- TODO: fill this out></-->
<li>Flag share: <em id='at_flagshare'></em> <a class='expand' id='at_flagshare_exp'>+</a></li>
<li>Avg. posts per cycle: <em id='at_avg'>0</em></li>
</ul>
<div style='padding-left: 10px'>
<!-- TODO: Change these to expshare2></-->
<div class='expshare' hidden id='at_flagshare_container' style="overflow-y: auto; height: 200px;">
<ul>
</ul>
</div>
</div>
<h3>Posts by flag</h3>
<div style="height: 340px; ">
<div class='contain' style="height: 300px; width:80%; float:left;">
<canvas id='tPostsByFlag'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:right;">
<canvas id='tPostsByFlagPie'></canvas>
</div>
</div>
<h3>Other shares</h3>
<div style="height: 340px;">
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tNmaes'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tImages'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tThreads'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tIds'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tSubjects'></canvas>
</div>
</div>
Identity breakdown: <a class='expand' id='at_ident_bd_expand'>+</a>
<div>
<div class='expshare2' hidden id='at_idbd_share'>
<div class='indentbar'> </div>
<div style='padding-left: 17px'>
<div class='contain' style="height: 300px; width:20%;">
<canvas id='tNmaesDetailed'></canvas>
</div>
Show Anon <input type='checkbox' checked id='at_idbd_showanon' />
</div>
</div>
</div>
<hr></hr>
<h2>Session stats</h2>
<ul>
<li>Session started: <em id='s_started'></em></li>
<li>Total session cycles: <em id='s_upcycle'></em></li>
<li>Posts: <em id='s_posts'></em></li><!-- TODO: fill this out></-->
<li>Flag share: <em id='s_flagshare'></em> <a class='expand' id='s_flagshare_exp'>+</a></li>
<li>Avg. posts per cycle: <em id='s_avg'>0</em></li><!--TODO: Move this into another `This session' section></-->
</ul>
<div style='padding-left: 10px'>
<div class='expshare' hidden id='s_flagshare_container' style="overflow-y: auto; height: 200px;">
<ul>
</ul>
</div>
</div>
<h3>Posts by flag</h3>
<div style="height: 340px; ">
<div class='contain' style="height: 300px; width:80%; float:left;">
<canvas id='tsPostsByFlag'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:right;">
<canvas id='tsPostsByFlagPie'></canvas>
</div>
</div>
<h3>Other shares</h3>
<div style="height: 340px;">
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tsNmaes'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tsImages'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tsThreads'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tsIds'></canvas>
</div>
<div class='contain' style="height: 300px; width:20%; float:left;">
<canvas id='tsSubjects'></canvas>
</div>
</div>
Identity breakdown: <a class='expand' id='s_ident_bd_expand'>+</a>
<div>
<div class='expshare2' hidden id='s_idbd_share'>
<div class='indentbar'> </div>
<div style='padding-left: 17px'>
<div class='contain' style="height: 300px; width:20%;">
<canvas id='tsNmaesDetailed'></canvas>
</div>
Show Anon <input type='checkbox' checked id='s_idbd_showanon' />
</div>
</div>
</div>
<h3>Average comparisons</h3>
<div class='contain' style="height: 300px; width:100%;">
<canvas id='tsCycleSpeed'></canvas>
</div>
<div class='ctlcont'><input id='cs_purge' type='button' value='Purge' /> Rollover at: <input type='textbox' id='cs_rlat' /> <em id='e_cs_rlat' class='error'></em></div>
<hr></hr>
<h2>Aggregate stats</h2>
<div class='contain' style="height: 300px; width:100%;">
<canvas id='tAgLine'></canvas>
</div>
<div class='contain' style="height: 300px; width:100%;">
<canvas id='tAgCandle'></canvas>
</div>
<div class='ctlcont'><input id='ag_shift' value=">>" type='button' /></div>
<hr></hr>
<h2>Live stats</h2>
<div class='contain' id='cycleSpeedC' style='overflox-x: scroll; position: relative; width: 100%; height: 300px;'>
<canvas id='cycleSpeed'></canvas>
</div>
<!-- style='position: absolute; left: 0; top: 0;pointer-events:none;'></-->
<div class='contain' style="height: 300px; width:100%;">
<canvas id='cycleBar'></canvas>
</div>
<div>
<div class='tab' style="overflow-y: auto; height: 200px; ">
<table id='cytb' style='width: 100%;'>
<thead>
<tr id='cytb_headers'>
<th>Timestamp</th>
<th>Last no.</th>
<th>Posts</th>
<th>% of avg.</th>
<th>Flag share</th>
<th>Names</th>
<th>Trips</th>
<th>Names+trips</th>
</tr>
</thead>
<tbody id='cytb_body'>
<tr hidden></tr>
</tbody>
</table>
</div>
<div class='ctlcont'><input id='cytb_purge' type='button' value='Purge' /> Rollover at: <input type='textbox' id='cytb_rlat' /> <em id='e_rlat' class='error'></em></div>
</div>
<hr></hr>
<div class='footer'>
<p>Backend source: <a target=_blank href='https://github.com/notflan/rtbwpy'>rtbwpy</a><br />
Frontend source: <a title=" As it stands the code is, frankly, embarrassingly bad and is in need of a lot of refactoring.">I will release this when it is of an acceptable quality.</a></p>
<em>This page is served statically.</em>
</div>
<script src="js/cyclefunc.js"></script>
<script src="js/client.js"></script>
<script src="js/renderer.js"></script>
</body>
</html>