<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>