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; 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; int gai_error = 0, mmdb_error = 0;
MMDB_lookup_result_s lookup = MMDB_lookup_string(&HandleDB, ip, &gai_error, &mmdb_error); 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) if (gai_error != 0 || MMDB_SUCCESS != mmdb_error || !lookup.found_entry)
{ {
return NULL; return false;
} }
MMDB_entry_data_s entry_data; MMDB_entry_data_s entry_data;
MMDB_aget_value(&lookup.entry, &entry_data, path); MMDB_aget_value(&lookup.entry, &entry_data, path);
if (!entry_data.has_data) 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; return NULL;
} }
if (length) if (length)
{ {
*length = entry_data.data_size; *length = result.data_size;
} }
memcpy(buffer, entry_data.utf8_string, entry_data.data_size); memcpy(buffer, result.utf8_string, result.data_size);
buffer[entry_data.data_size] = '\0'; buffer[result.data_size] = '\0';
return buffer; 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]); // native geoip_code2(const ip[], ccode[3]);
// Deprecated. // Deprecated.
static cell AMX_NATIVE_CALL amx_geoip_code2(AMX *amx, cell *params) 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL }; 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); 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL }; 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) 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL }; const char *path[] = { "country", "iso_code", NULL };
const char *code = lookupByIp(stripPort(ip), path); const char *code = lookupString(stripPort(ip), path);
if (!code) 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "iso_code", NULL }; 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) 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "country", "names", "en", NULL }; 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) 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "city", "names", "en", NULL }; 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. 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *pathCountry[] = { "country", "iso_code", NULL }; 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) 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. snprintf(code, finalLength + 1, "%s-", countryCode); // + EOS.
const char *pathRegion[] = { "subdivisions", "0", "iso_code", NULL }; // First result. 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) 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "subdivisions", "0", "names", "en", NULL }; // First result. 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. 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); char *ip = MF_GetAmxString(amx, params[1], 0, &length);
const char *path[] = { "location", "time_zone", NULL }; 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); 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() void OnAmxxAttach()
{ {
@ -300,7 +349,9 @@ AMX_NATIVE_INFO geoip_natives[] =
{ "geoip_region_code", amx_geoip_region_code }, { "geoip_region_code", amx_geoip_region_code },
{ "geoip_region_name", amx_geoip_region_name }, { "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 }, { NULL, NULL },
}; };

View File

@ -133,3 +133,21 @@ native geoip_region_name(const ip[], result[], len);
* @return The result length on successful lookup, 0 otherwise. * @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[]);