#include #include "geoip_amxx.h" GeoIP *gi = NULL; inline void StripPort(char *ip) { char *tmp = strchr(ip, ':'); if (!tmp) return; *tmp = '\0'; } static cell AMX_NATIVE_CALL amx_geoip_code2(AMX *amx, cell *params) { int len = 0; char *ip = MF_GetAmxString(amx, params[1], 0, &len); StripPort(ip); const char *ccode = GeoIP_country_code_by_addr(gi, ip); return MF_SetAmxString(amx, params[2], ccode?ccode:"error", 3); } static cell AMX_NATIVE_CALL amx_geoip_code3(AMX *amx, cell *params) { int len = 0; char *ip = MF_GetAmxString(amx, params[1], 0, &len); StripPort(ip); const char *ccode = GeoIP_country_code3_by_addr(gi, ip); return MF_SetAmxString(amx, params[2], ccode?ccode:"error", 4); } static cell AMX_NATIVE_CALL amx_geoip_country(AMX *amx, cell *params) { int len = 0; char *ip = MF_GetAmxString(amx, params[1], 0, &len); StripPort(ip); const char *ccode = GeoIP_country_name_by_addr(gi, ip); return MF_SetAmxString(amx, params[2], ccode?ccode:"error", params[3]); } void OnAmxxAttach() { char *path = MF_BuildPathname("%s/GeoIP.dat",MF_GetLocalInfo("amxx_datadir", "addons/amxmodx/data")); gi = GeoIP_open(path, GEOIP_MEMORY_CACHE); if (gi == NULL) { MF_Log("Failed to instantiate GeoIP!"); return; } char *db_info = GeoIP_database_info(gi); MF_Log("Database info: %s", db_info); MF_AddNatives(geoip_natives); } void OnAmxxDetach() { GeoIP_delete(gi); gi = NULL; } AMX_NATIVE_INFO geoip_natives[] = { {"geoip_code2", amx_geoip_code2}, {"geoip_code3", amx_geoip_code3}, {"geoip_country", amx_geoip_country}, {NULL, NULL}, };