function recv() { global $_SERVER; $ip = $_SERVER['REMOTE_ADDR']; # get data $type = g('type', 'pageview'); $uid = readSecureId(g('u', ''), "userid"); if ($uid == -1) { return; } $location = trim(g('l', '')); if (strlen($location) == 0) { return; } $referer = trim(g('r', '')); $width = gi('w', 0); $height = gi('h', 0); $historylen = gi('hl', 0); $agent = g('a', ''); $cookies = strtolower(trim(g('c', 'na'))); if ($cookies != 'na' && $cookies != 'y' && $cookies != 'n') { $cookies = 'na'; } # split domain info $url = parseurl($location); if ($url === false) { return; } $time = time(); $ispro = isPro($uid); $eventid = LOG_EVENT_PAGEVIEW; if ($type == 'adclick') { $eventid = LOG_EVENT_ADCLICK; } if (!$ispro && $eventid != LOG_EVENT_PAGEVIEW) { return; } # Log the visit. We assign a new event ID to every logged event. # Note that PHP running on 32 bit systems will overflow the ID soon # or later. $r = redisLink(); $logid = $r->incr("global:nextLogId"); $aux = array("time" => $time, "user_id" => $uid, "event_id" => $eventid, "location" => $location, "proto" => $url['proto'], "domain" => $url['domain'], "path" => $url['path'], "query" => $url['query'], "ref" => $referer, "swidth" => $width, "sheight" => $height, "cookies" => $cookies, "ip" => $ip, "agent" => $agent, "historylen" => $historylen, "id" => $logid); # Insert new $r->push("last:{$uid}", serialize($aux), false); # History length is different for PRO / non PRO user. $r->ltrim("last:{$uid}", 0, $ispro ? 1000 : 50); if ($eventid != LOG_EVENT_PAGEVIEW) { return; } # Update stats $nv = gi('nv', 0); $rv = gi('rv', 0); $t = time(); $t = $t - $t % (3600 * 24); # Update unique visits if ($nv) { $r->incr("day:uv:{$uid}:{$t}"); if ($rv) { $r->incr("day:rv:{$uid}:{$t}"); } } $r->incr("day:pv:{$uid}:{$t}"); }
<div id="usernav"> <span class="username"><?php echo htmlentities(userName()); if (isPro()) { echo " [pro]"; } ?> </span> | <?php function userNav() { global $_COOKIE; $n['View realtime logs'] = "/"; $n['Settings'] = "/settings"; $n['Feedbacks'] = "/feedbacks"; if (isAdmin()) { $n['Admin'] = "/admin"; } $c = 1; foreach ($n as $title => $link) { if ($_SERVER['REQUEST_URI'] == $link || strpos($_SERVER['REQUEST_URI'], $link . "?") === 0) { echo "<strong>" . htmlentities($title) . "</strong> "; } else { echo "<a href=\"{$link}\">" . htmlentities($title) . "</a> "; } if ($c++ != count($n)) { echo " | "; } } $allowed = getAllowed(); if (count($allowed)) {
{ echo $e->getCode(), '--', $e->getFile(), '--' . $e->getFile(); } // set_exception_handler('hydrogenExceptionHandler'); } if (!function_exists('isPro')) { function isPro() { return defined('ENV') && ENV === 'production'; } } if ('cgi' == php_sapi_name() && !function_exists('isTest')) { function isTest() { return defined('ENV') && ENV === 'test'; } } if (!function_exists('isDev')) { function isDev() { return !defined('ENV') || ENV === 'development'; } } if (!function_exists('pre') && !isPro()) { function pre($var) { echo "<pre>"; print_r($var); echo "</pre>"; } }
<?php require "../lib.php"; if (!isLoggedIn()) { exit; } if (g("username") === false || strlen(trim(g("username"))) == 0) { echo "ERR: Please specify the username to allow"; exit; } if (isPro() || count(getAllowing()) < 1) { $uid = getIdFromUsername(g("username")); if ($uid == -1) { echo "ERR: The username specified does not exist"; } else { addAllowed(userId(), $uid); echo "OK"; } } else { echo "ERR: Free accounts can only allow a single user. Upgrade to PRO in order to allow infinite users."; }
function poll() { $numres = 1; $r = redisLink(); $uid = reqUserId(); $minid = gi("minid", 0); $proto = gi("proto", 1); $loadhistory = 0; if ($minid == 0) { # First client request. Just return the latest entry $latest = unserialize($r->lindex("last:{$uid}", 0)); $minid = $latest['id']; } else { if ($minid < 0) { # minid < 0 means: load history, with abs(minid) elements $numres = abs($minid); if ($numres > 1000) { $numres = 1000; } $loadhistory = 1; } } $rows = $r->lrange("last:{$uid}", 0, $numres - 1); # Handle free accounts timeouts. # NOTE: this is actually disabled, left here for historical reasons # and because the javascript still handles it. $ispro = isPro($uid); if (0 && !$ispro) { $startpoll = $r->get("startpoll:{$uid}"); if (!$startpoll) { $r->set("startpoll:{$uid}", time()); } else { $delta = time() - $r->get("startpoll:{$uid}"); if ($delta > FREE_MAXTIME + FREE_WAIT) { $r->delete("startpoll:{$uid}"); } else { if ($delta > FREE_MAXTIME) { echo "TRYLATER:" . floor(1 + (FREE_MAXTIME + FREE_WAIT - $delta) / 60); exit; } } } } # Empty list? if (count($rows) == 0) { echo "NODATA"; exit; } # Check if even the most recent element (the first one) # is still too old. If so, no new data to return. $latest = unserialize($rows[0]); if ($latest['id'] < $minid) { echo "NODATA"; exit; } # Try to get all the data required. Up to 50 elements for request while (!$loadhistory) { $oldest = unserialize($rows[count($rows) - 1]); if ($oldest['id'] > $minid && $numres < 50) { # We need more data $numres = ($numres + 1) * 2; if ($numres > 50) { $numres = 50; } $rows = $r->lrange("last:{$uid}", 0, $numres - 1); } else { break; } } # Ok now reverse the array to sort ascending and return data to ajax. $rows = array_reverse($rows); $gi = geoip_open("geoipdata/GeoIP.dat", GEOIP_STANDARD); foreach ($rows as $srow) { $row = unserialize($srow); if ($row['id'] < $minid) { continue; } $keys = array("time", "location", "domain", "ref", "swidth", "sheight", "cookies", "ip", "agent", "historylen"); $aux = array(); foreach ($keys as $k) { $aux[$k] = $row[$k]; } $aux['country'] = geoip_country_name_by_addr($gi, $aux['ip']); $aux['type'] = 'pageview'; # At some point LLOOGG supported the ability to display user clicks # adsense ADs. Now the javascript we inject no longer support this # but the support inside LLOOGG itself remains. if ($row['event_id'] == LOG_EVENT_ADCLICK) { $aux['type'] = 'adclick'; } $t[] = $aux; if ($row['id'] > $maxid) { $maxid = $row['id']; } } geoip_close($gi); $t[] = $maxid + 1; if ($proto >= 2) { $t[] = logTodayVisitors(); $t[] = logTodayPageviews(); } $json = new Services_JSON(); $output = $json->encode($t); echo $output; }