11.11.2018, 17:19
(
Last edited by Calisthenics; 10/04/2020 at 02:30 PM.
Reason: Updated `MAX_COUNTRY_LENGTH` and credits
)
GeoLite (SQLite)
It is based on the free product GeoLite2 by MaxMind.
I was updating the country database every month for MySQL and decided to update the GeoIp databases by Whitetiger's include as many people requested. It turned out I was unable to, the way the databases were structured. I converted my version to SQLite and started comparing the two includes with geolite.inc being victorious. But this was to be expected with not only the good database structure and the use of indexes but also the appropriate queries to avoid range scans. Even though latest database provide more data than last year, it did not affect the performance in any way.
The past days, I managed to import Autonomous System (AS) and City databases with the original databases having big flows.
Installation
Repository: https://github.com/George480/geolite
Releases: https://github.com/George480/geolite/releases
Include: https://raw.githubusercontent.com/Ge...er/geolite.inc
Save as geolite.inc into pawno\include folder. Include in your code and begin using the library:
Place the database you want to use into scriptfiles folder.
Functions
IP-Based Functions:
Extra Notes
127.0.0.1 is given as "Unknown" as it is a private IP.
Country, City and ASN databases will be updated every first Wednesday of every month.
It opens the databases on startup according to which database exists in scriptfiles folder, therefore if you prefer to use the Country database only, place maxmind_country.db into scriptfiles folder and not the other two databases.
It only detects public proxies and not VPNs.
A MySQL version would require non-threaded queries to keep the same usage of functions. If you have any suggestion, please inform me.
Constants:
Requirements
sscanf: https://github.com/maddinat0r/sscanf/releases
Credits
It is based on the free product GeoLite2 by MaxMind.
I was updating the country database every month for MySQL and decided to update the GeoIp databases by Whitetiger's include as many people requested. It turned out I was unable to, the way the databases were structured. I converted my version to SQLite and started comparing the two includes with geolite.inc being victorious. But this was to be expected with not only the good database structure and the use of indexes but also the appropriate queries to avoid range scans. Even though latest database provide more data than last year, it did not affect the performance in any way.
The past days, I managed to import Autonomous System (AS) and City databases with the original databases having big flows.
- Certain organizations in Autonomous System list did have many unique identifiers (ASN - Autonomous System Number) registered to IANA. All duplicates were removed and kept only their initial ASN.
- Certain ip ranges in City database:
- did not provide a city name. Country name was used in replacement.
- did not provide a city name, nor a country name. Continent name was used in replacement.
- Antarctica, Asia and Europe have time zone set as +00:00
- Cities with country name as replacement have central standard time set mostly, with few exceptions. Some examples are:
- United States is set to have UTC -05:00 (Washington, DC) whereas Central Standard Time is in Chicago (-06:00)
- Russia is set to Moscow Standard Time (+03:00)
Installation
Repository: https://github.com/George480/geolite
Releases: https://github.com/George480/geolite/releases
Include: https://raw.githubusercontent.com/Ge...er/geolite.inc
Save as geolite.inc into pawno\include folder. Include in your code and begin using the library:
Code:
#include <geolite>
Functions
IP-Based Functions:
- GetIpAutonomousSystem(const geolite_ip[], geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the Autonomous System organization (ISP is an Autonomous System) according to given IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder) or 0 on failure.
- GetIpCountry(const geolite_ip[], geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the Country name according to given IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder) or 0 on failure.
- GetIpCity(const geolite_ip[], geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the City name according to given IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder) or 0 on failure.
- GetIpUTC(const geolite_ip[], geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the UTC offset according to given IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder) or 0 on failure.
- IsIpProxy(const geolite_ip[])
- Requires country database.
- Returns 1 if the given ip is public proxy otherwise 0. It will also return 0 if database file does not exist in scriptfiles folder.
- GetPlayerAutonomousSystem(playerid, geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the Autonomous System organization (ISP is an Autonomous System) according to given player's IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder and player is connected) or 0 on failure.
- GetPlayerCountry(playerid, geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the Country name according to given player's IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder and player is connected) or 0 on failure.
- GetPlayerCity(playerid, geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the City name according to given player's IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder and player is connected) or 0 on failure.
- GetPlayerUTC(playerid, geolite_dest[], geolite_len = sizeof (geolite_dest))
- Stores the UTC offset according to given player's IP, passed by reference.
- Returns 1 on success (database file exists in scriptfiles folder and player is connected) or 0 on failure.
- IsPlayerUsingProxy(playerid)
- Requires country database.
- Returns 1 if the ip of the given player is public proxy otherwise 0. It will also return 0 if database file does not exist in scriptfiles folder.
pawn Code:
#include <a_samp>
#include <sscanf2>
#include <geolite>
main() {}
public OnPlayerConnect(playerid)
{
new player_name[MAX_PLAYER_NAME], player_country[MAX_COUNTRY_LENGTH], connection_text[80];
GetPlayerName(playerid, player_name, MAX_PLAYER_NAME);
GetPlayerCountry(playerid, player_country, MAX_COUNTRY_LENGTH);
format(connection_text, sizeof (connection_text), "%s joined from %s", player_name, player_country);
SendClientMessageToAll(0xFFFF00FF, connection_text);
return 1;
}
127.0.0.1 is given as "Unknown" as it is a private IP.
Country, City and ASN databases will be updated every first Wednesday of every month.
It opens the databases on startup according to which database exists in scriptfiles folder, therefore if you prefer to use the Country database only, place maxmind_country.db into scriptfiles folder and not the other two databases.
It only detects public proxies and not VPNs.
A MySQL version would require non-threaded queries to keep the same usage of functions. If you have any suggestion, please inform me.
Constants:
pawn Code:
#define MAX_AUTONOMOUS_SYSTEM_LENGTH 95
#define MAX_COUNTRY_LENGTH 45
#define MAX_CITY_LENGTH 109
#define MAX_UTC_LENGTH 7
sscanf: https://github.com/maddinat0r/sscanf/releases
Credits
- MaxMind - GeoLite2
- TimeZoneDB.com - time zones
- Alex "Y-Less" Cole - sscanf
- Andy Skelton - ordering by `ip_to` (avoidance of range scan)
- Nikolay Bachiyski - ordering by `ip_to` (avoidance of range scan)
- Mark Robson - highest `ip_from` which is less than or equal to the given IP (avoidance of next country returned due to gaps)