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()
+{
+?>
+
+
+
+(.*)<\/' . $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