From 4da1b9638960a20abac5a34b788488179e50100a Mon Sep 17 00:00:00 2001 From: Repellent Date: Tue, 18 Oct 2016 20:01:10 +0300 Subject: [PATCH] Upload new file --- whoisonline/module.php | 198 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 whoisonline/module.php diff --git a/whoisonline/module.php b/whoisonline/module.php new file mode 100644 index 0000000..d8668f9 --- /dev/null +++ b/whoisonline/module.php @@ -0,0 +1,198 @@ + "Who is online", + 'ModuleSysName' => "whoisonline", + 'ModuleVersion' => "1.0", + 'ModuleDescription' => "Данный модуль предназначен для отображения присутствующих на сайте пользователей с гео-информацией.", + 'ModuleAutor' => "AVE.cms Team", + 'ModuleCopyright' => "© AVE.cms Team 2016", + 'ModuleStatus' => 1, + 'ModuleIsFunction' => 1, + 'ModuleTemplate' => 0, + 'ModuleAdminEdit' => 0, + 'ModuleFunction' => 'mod_online', + 'ModuleTag' => '[mod_online]', + 'ModuleTagLink' => null, + 'ModuleAveTag' => '#\\\[mod_online]#', + 'ModulePHPTag' => "" + ]; + +function mod_online() +{ +?> + + +
+
Loading..
+
+
онлайн
+
+
+(.*)<\/' . $tag . '>$/imU', $xml, $match); + + return $match[1]; + } + + function is_bot() + { + /* This function will check whether the visitor is a search engine robot */ + + $botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi", + "looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory", + "Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot", + "crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp", + "msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz", + "Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot", + "Mediapartners-Google", "Sogou web spider", "WebAlta Crawler", + "TweetmemeBot", "Butterfly", "Twitturls", "Me.dium", "Twiceler"); + + foreach ($botlist as $bot) + { + if (strpos($_SERVER['HTTP_USER_AGENT'], $bot) !== false) return true; // Is a bot + } + + return false; // Not a bot + } + + if (empty($_REQUEST['action']) || is_bot()) die(); + + switch ($_REQUEST['action']) + { + case 'online': + $stringIp = $_SERVER['REMOTE_ADDR']; + + $intIp = ip2long($stringIp); + + // Checking wheter the visitor is already marked as being online: + $counted = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_module_who_is_online + WHERE ip = " . $intIp + )->NumRows(); + + if (! $counted) + { + // This user is not in the database, so we must fetch + // the geoip data and insert it into the online table: + + if (! empty($_COOKIE['geoData'])) + { + // A "geoData" cookie has been previously set by the script, so we will use it + + // Always escape any user input, including cookies: + list($city, $countryName, $countryAbbrev) = explode('|', stripslashes(strip_tags($_COOKIE['geoData']))); + } + else + { + // Making an API call to Hostip: + + $xml = json_decode(file_get_contents('http://freegeoip.net/json/' . $stringIp), true); + + $city = $xml['city']; + $countryName = $xml['country_name']; + $countryAbbrev = $xml['country_code']; + + // Setting a cookie with the data, which is set to expire in a month: + setcookie('geoData', $city . '|' . $countryName . '|' . $countryAbbrev, time()+60*60*24*30,'/'); + } + + //$countryName = str_replace('(Unknown Country?)', 'UNKNOWN', $countryName); + + // In case the Hostip API fails: + + if (! $countryName) + { + $countryName = 'UNKNOWN'; + $countryAbbrev = 'XX'; + $city = '(Unknown City?)'; + } + + $AVE_DB->Query(" + INSERT INTO " . PREFIX . "_module_who_is_online + SET + ip = " . $intIp . ", + city = '" . addslashes($city) . "', + country = '" . addslashes($countryName) . "', + countrycode = '" . addslashes($countryAbbrev) . "' + "); + } + else + { + // If the visitor is already online, just update the dt value of the row: + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_who_is_online + SET dt = NOW() + WHERE ip = " . $intIp + ); + } + + // Removing entries not updated in the last 10 minutes: + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_who_is_online + WHERE dt < SUBTIME(NOW(),'0 0:10:0') + "); + + // Counting all the online visitors: + list($totalOnline) = $AVE_DB->Query(" + SELECT COUNT(*) + FROM " . PREFIX . "_module_who_is_online + ")->FetchArray(); + + // Outputting the number as plain text: + echo $totalOnline; + exit; + + case 'geodata': + // Selecting the top 15 countries with the most visitors: + $sql = $AVE_DB->Query(" + SELECT + countryCode, + country, + COUNT(*) AS total + FROM " . PREFIX . "_module_who_is_online + GROUP BY countryCode + ORDER BY total DESC + LIMIT 15 + "); + while ($row = $sql->FetchRow()) + { + echo ' +
+
+
' . $row->country . '
+
' . $row->total . '
+
+ '; + } + exit; + } + exit; +} + +?> \ No newline at end of file