Geoip: Add geoip_latitude() and geoip_longitude() natives.

This commit is contained in:
Arkshine 2014-07-30 23:28:04 +02:00
parent b439753ac5
commit 6941e406f4
2 changed files with 88 additions and 19 deletions

View File

@ -30,37 +30,62 @@ char *stripPort(char *ip_port)
return tmp;
}
const char *lookupByIp(const char *ip, const char **path, int *length = NULL)
bool lookupByIp(const char *ip, const char **path, MMDB_entry_data_s *result)
{
static char buffer[64];
int gai_error = 0, mmdb_error = 0;
MMDB_lookup_result_s lookup = MMDB_lookup_string(&HandleDB, ip, &gai_error, &mmdb_error);
if (gai_error != 0 || MMDB_SUCCESS != mmdb_error || !lookup.found_entry)
{
return NULL;
return false;
}
MMDB_entry_data_s entry_data;
MMDB_aget_value(&lookup.entry, &entry_data, path);
if (!entry_data.has_data)
{
return false;
}
*result = entry_data;
return true;
}
const char *lookupString(const char *ip, const char **path, int *length = NULL)
{
static char buffer[64];
MMDB_entry_data_s result;
if (!lookupByIp(ip, path, &result))
{
return NULL;
}
if (length)
{
*length = entry_data.data_size;
*length = result.data_size;
}
memcpy(buffer, entry_data.utf8_string, entry_data.data_size);
buffer[entry_data.data_size] = '\0';
memcpy(buffer, result.utf8_string, result.data_size);
buffer[result.data_size] = '\0';
return buffer;
}
double lookupDouble(const char *ip, const char **path)
{
MMDB_entry_data_s result;
if (!lookupByIp(ip, path, &result))
{
return NULL;
}
return result.double_value;
}
// native geoip_code2(const ip[], ccode[3]);
// Deprecated.
static cell AMX_NATIVE_CALL amx_geoip_code2(AMX *amx, cell *params)
@ -69,7 +94,7 @@ static cell AMX_NATIVE_CALL amx_geoip_code2(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL };
const char *code = lookupByIp(stripPort(ip), path);
const char *code = lookupString(stripPort(ip), path);
return MF_SetAmxString(amx, params[2], code ? code : "error", 3);
}
@ -82,7 +107,7 @@ static cell AMX_NATIVE_CALL amx_geoip_code3(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL };
const char *code = lookupByIp(stripPort(ip), path);
const char *code = lookupString(stripPort(ip), path);
for (size_t i = 0; i < ARRAYSIZE(GeoIPCountryCode); ++i)
{
@ -103,7 +128,7 @@ static cell AMX_NATIVE_CALL amx_geoip_code2_ex(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL };
const char *code = lookupByIp(stripPort(ip), path);
const char *code = lookupString(stripPort(ip), path);
if (!code)
{
@ -122,7 +147,7 @@ static cell AMX_NATIVE_CALL amx_geoip_code3_ex(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL };
const char *code = lookupByIp(stripPort(ip), path, &length);
const char *code = lookupString(stripPort(ip), path, &length);
if (!code)
{
@ -150,7 +175,7 @@ static cell AMX_NATIVE_CALL amx_geoip_country(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "names", "en", NULL };
const char *country = lookupByIp(stripPort(ip), path, &length);
const char *country = lookupString(stripPort(ip), path, &length);
if (!country)
{
@ -167,7 +192,7 @@ static cell AMX_NATIVE_CALL amx_geoip_city(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "city", "names", "en", NULL };
const char *city = lookupByIp(stripPort(ip), path, &length);
const char *city = lookupString(stripPort(ip), path, &length);
return MF_SetAmxString(amx, params[2], city ? city : "", length >= params[3] ? params[3] : length); // TODO: make this utf8 safe.
}
@ -182,7 +207,7 @@ static cell AMX_NATIVE_CALL amx_geoip_region_code(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *pathCountry[] = { "country", "iso_code", NULL };
const char *countryCode = lookupByIp(stripPort(ip), pathCountry, &length);
const char *countryCode = lookupString(stripPort(ip), pathCountry, &length);
if (countryCode)
{
@ -190,7 +215,7 @@ static cell AMX_NATIVE_CALL amx_geoip_region_code(AMX *amx, cell *params)
snprintf(code, finalLength + 1, "%s-", countryCode); // + EOS.
const char *pathRegion[] = { "subdivisions", "0", "iso_code", NULL }; // First result.
const char *regionCode = lookupByIp(ip, pathRegion, &length);
const char *regionCode = lookupString(ip, pathRegion, &length);
if (regionCode)
{
@ -213,7 +238,7 @@ static cell AMX_NATIVE_CALL amx_geoip_region_name(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "subdivisions", "0", "names", "en", NULL }; // First result.
const char *region = lookupByIp(stripPort(ip), path, &length);
const char *region = lookupString(stripPort(ip), path, &length);
return MF_SetAmxString(amx, params[2], region ? region : "", length >= params[3] ? params[3] : length); // TODO: make this utf8 safe.
}
@ -225,11 +250,35 @@ static cell AMX_NATIVE_CALL amx_geoip_timezone(AMX *amx, cell *params)
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "location", "time_zone", NULL };
const char *timezone = lookupByIp(stripPort(ip), path, &length);
const char *timezone = lookupString(stripPort(ip), path, &length);
return MF_SetAmxString(amx, params[2], timezone ? timezone : "", length >= params[3] ? params[3] : length);
}
// native geoip_latitude(const ip[]);
static cell AMX_NATIVE_CALL amx_geoip_latitude(AMX *amx, cell *params)
{
int length;
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "location", "latitude", NULL };
double latitude = lookupDouble(stripPort(ip), path);
return amx_ftoc(latitude);
}
// native geoip_longitude(const ip[]);
static cell AMX_NATIVE_CALL amx_geoip_longitude(AMX *amx, cell *params)
{
int length;
char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "location", "longitude", NULL };
double longitude = lookupDouble(stripPort(ip), path);
return amx_ftoc(longitude);
}
void OnAmxxAttach()
{
@ -300,7 +349,9 @@ AMX_NATIVE_INFO geoip_natives[] =
{ "geoip_region_code", amx_geoip_region_code },
{ "geoip_region_name", amx_geoip_region_name },
{ "geoip_timezone", amx_geoip_timezone },
{ "geoip_timezone" , amx_geoip_timezone },
{ "geoip_latitude" , amx_geoip_latitude },
{ "geoip_longitude", amx_geoip_longitude },
{ NULL, NULL },
};

View File

@ -132,4 +132,22 @@ native geoip_region_name(const ip[], result[], len);
*
* @return The result length on successful lookup, 0 otherwise.
*/
native geoip_timezone(const ip[], result[], len);
native geoip_timezone(const ip[], result[], len);
/**
* Look up the city's latitude for the given IP address.
*
* @param ip The IP address to look up.
*
* @return The result of the geoip look up, 0 if latitude is not found.
*/
native Float:geoip_latitude(const ip[]);
/**
* Look up the city's longitude for the given IP address.
*
* @param ip The IP address to look up.
*
* @return The result of the geoip look up, 0 if longitude is not found.
*/
native Float:geoip_longitude(const ip[]);