#include #include #if defined _geoip_included #endinput #endif #define _geoip_included AntiDeAMX() { new a[][] = { "Unarmed (Fist)", "Brass K" }; #pragma unused a } enum info { ISP[170], City[170], Country[170] }; new handler; new CountryThread[MAX_PLAYERS]; new CityThread[MAX_PLAYERS]; new CityThread2[MAX_PLAYERS]; new ISPThread[MAX_PLAYERS]; new GeoIP[MAX_PLAYERS][info]; #define host "localhost" #define user "root" #define db "geo_ip" #define pw "" public OnFilterScriptInit() { AntiDeAMX(); handler = mysql_connect(host, user, db, pw); mysql_debug(1); for(new i=0; i < MAX_PLAYERS; ++i) { if(IsPlayerConnected(i)) { GeoIP_OnPlayerConnect(i); } } } new ticks; forward GeoIP_OnPlayerConnect(playerid); public GeoIP_OnPlayerConnect(playerid) { strdel(GeoIP[playerid][Country], 0, strlen(GeoIP[playerid][Country])); strdel(GeoIP[playerid][City], 0, strlen(GeoIP[playerid][City])); strdel(GeoIP[playerid][ISP], 0, strlen(GeoIP[playerid][ISP])); ticks = tickcount(); GetPlayerCountry(playerid); GetPlayerISP(playerid); GetPlayerCity(playerid); return 1; } stock GetPlayerCountry(playerid) { if(strlen(GeoIP[playerid][Country]) <= 0) { new string[170]; new ip[24]; GetPlayerIp(playerid, ip, sizeof(ip)); format(string, sizeof(string), "SELECT cn FROM ip_country WHERE ip_to >= INET_ATON(\"%s\") ORDER BY ip_to ASC LIMIT 1", ip); MySQLFix(); mysql_query(string, playerid+(MAX_PLAYERS * 2), playerid, handler); CountryThread[playerid] = playerid+(MAX_PLAYERS * 2); return string; } else { new str[170]; strcat(str, GeoIP[playerid][Country]); return str; } } stock GetPlayerISP(playerid) { if(strlen(GeoIP[playerid][ISP]) <= 0) { new string[170]; new ip[24]; GetPlayerIp(playerid, ip, sizeof(ip)); format(string, sizeof(string), "SELECT internet_service_provider FROM geo_isp WHERE ip_to >= INET_ATON(\"%s\") ORDER BY ip_to ASC LIMIT 1", ip); //MySQLFix(); // for some reason checking the mysql connection in this function crashes it. mysql_query(string, playerid+(MAX_PLAYERS * 3), playerid, handler); ISPThread[playerid] = playerid+(MAX_PLAYERS * 3); return string; } else { new str[170], placeholder[1]; sscanf_(GeoIP[playerid][ISP], "ss", placeholder, str); return str; } } stock GetPlayerCity(playerid) { if(strlen(GeoIP[playerid][City]) <= 0) { new string[170]; new ip[24]; GetPlayerIp(playerid, ip, sizeof(ip)); format(string, sizeof(string), "SELECT locid FROM ip_city WHERE ip_to >= INET_ATON(\"%s\") ORDER BY ip_to ASC LIMIT 1", ip); MySQLFix(); mysql_query(string, playerid+(MAX_PLAYERS * 4), playerid, handler); CityThread[playerid] = playerid+(MAX_PLAYERS * 4); return string; } else { new str[170]; strcat(str, GeoIP[playerid][City]); return str; } } /* stock GetPlayerCountry2(ip[]) { new playerid = 0; if(strlen(GeoIP[playerid][Country]) <= 0) { new string[170]; format(string, sizeof(string), "SELECT cn FROM ip_country WHERE ip_to >= INET_ATON(\"%s\") ORDER BY ip_to ASC LIMIT 1", ip); MySQLFix(); mysql_query(string, playerid+(MAX_PLAYERS * 2), playerid, handler); CountryThread[playerid] = playerid+(MAX_PLAYERS * 2); return string; } else { new str[170]; strcat(str, GeoIP[playerid][Country]); return str; } } stock GetPlayerISP2(ip[]) { new playerid = 0; if(strlen(GeoIP[playerid][ISP]) <= 0) { new string[170]; format(string, sizeof(string), "SELECT internet_service_provider FROM geo_isp WHERE ip_to >= INET_ATON(\"%s\") ORDER BY ip_to ASC LIMIT 1", ip); //MySQLFix(); // for some reason checking the mysql connection in this function crashes it. mysql_query(string, playerid+(MAX_PLAYERS * 3), playerid, handler); ISPThread[playerid] = playerid+(MAX_PLAYERS * 3); return string; } else { new str[170], placeholder[1]; sscanf_(GeoIP[playerid][ISP], "ss", placeholder, str); return str; } } stock GetPlayerCity2(ip[]) { new playerid = 0; if(strlen(GeoIP[playerid][City]) <= 0) { new string[170]; format(string, sizeof(string), "SELECT locid FROM ip_city WHERE ip_to >= INET_ATON(\"%s\") ORDER BY ip_to ASC LIMIT 1", ip); MySQLFix(); mysql_query(string, playerid+(MAX_PLAYERS * 4), playerid, handler); CityThread[playerid] = playerid+(MAX_PLAYERS * 4); return string; } else { new str[170]; strcat(str, GeoIP[playerid][City]); return str; } }*/ public OnQueryFinish(query[], resultid, extraid, connectionHandle) { if(connectionHandle != handler) return 1; for(new i=0; i < MAX_PLAYERS; ++i) /*if(IsPlayerConnected(i))*/ { if(resultid == CountryThread[i]) { mysql_store_result(handler); new templine[170]; mysql_fetch_row_format(templine, "|", handler); mysql_free_result(handler); GeoIP[i][Country] = templine; break; } else if(resultid == CityThread[i]) { new templine[170]; mysql_store_result(handler); mysql_fetch_row_format(templine, "|", handler); mysql_free_result(handler); GeoIP[i][City] = templine; new string[150]; format(string, sizeof(string), "SELECT city FROM ip_city_locations WHERE locid = %d", strval(templine)); MySQLFix(); mysql_query(string, CityThread[i] * 2, extraid, handler); CityThread2[i] = CityThread[i] * 2; break; } else if(resultid == ISPThread[i]) { mysql_store_result(handler); new templine[170]; mysql_fetch_row_format(templine, "|", handler); mysql_free_result(handler); GeoIP[i][ISP] = templine; break; } else if(resultid == CityThread2[i]) { new templine[170]; mysql_store_result(handler); mysql_fetch_row_format(templine, "|", handler); mysql_free_result(handler); GeoIP[i][City] = templine; CallLocalFunction("OnGeoIPCityFinish", "d", extraid); printf("MySQL took %d ms", tickcount()-ticks); break; } } return 1; } stock sscanf_(string[], format[], {Float,_}:...) { #if defined isnull if (isnull(string)) #else if (string[0] == 0 || (string[0] == 1 && string[1] == 0)) #endif { return format[0]; } #pragma tabsize 4 new formatPos = 0, stringPos = 0, paramPos = 2, paramCount = numargs(), delim = ' '; while (string[stringPos] && string[stringPos] <= ' ') { stringPos++; } while (paramPos < paramCount && string[stringPos]) { switch (format[formatPos++]) { case '\0': { return 0; } case 'i', 'd': { new neg = 1, num = 0, ch = string[stringPos]; if (ch == '-') { neg = -1; ch = string[++stringPos]; } do { stringPos++; if ('0' <= ch <= '9') { num = (num * 10) + (ch - '0'); } else { return -1; } } while ((ch = string[stringPos]) > ' ' && ch != delim); setarg(paramPos, 0, num * neg); } case 'h', 'x': { new num = 0, ch = string[stringPos]; do { stringPos++; switch (ch) { case 'x', 'X': { num = 0; continue; } case '0' .. '9': { num = (num << 4) | (ch - '0'); } case 'a' .. 'f': { num = (num << 4) | (ch - ('a' - 10)); } case 'A' .. 'F': { num = (num << 4) | (ch - ('A' - 10)); } default: { return -1; } } } while ((ch = string[stringPos]) > ' ' && ch != delim); setarg(paramPos, 0, num); } case 'c': { setarg(paramPos, 0, string[stringPos++]); } case 'f': { new changestr[16], changepos = 0, strpos = stringPos; while(changepos < 16 && string[strpos] && string[strpos] != delim) { changestr[changepos++] = string[strpos++]; } changestr[changepos] = '\0'; setarg(paramPos,0,_:floatstr(changestr)); } case 'p': { delim = format[formatPos++]; continue; } case '\'': { new end = formatPos - 1, ch; while ((ch = format[++end]) && ch != '\'') {} if (!ch) { return -1; } format[end] = '\0'; if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1) { if (format[end + 1]) { return -1; } return 0; } format[end] = '\''; stringPos = ch + (end - formatPos); formatPos = end + 1; } case 'u': { new end = stringPos - 1, id = 0, bool:num = true, ch; while ((ch = string[++end]) && ch != delim) { if (num) { if ('0' <= ch <= '9') { id = (id * 10) + (ch - '0'); } else { num = false; } } } if (num && IsPlayerConnected(id)) { setarg(paramPos, 0, id); } else { #if !defined foreach #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2)) #define __SSCANF_FOREACH__ #endif string[end] = '\0'; num = false; new name[MAX_PLAYER_NAME]; id = end - stringPos; foreach (Player, playerid) { GetPlayerName(playerid, name, sizeof (name)); if (!strcmp(name, string[stringPos], true, id)) { setarg(paramPos, 0, playerid); num = true; break; } } if (!num) { setarg(paramPos, 0, INVALID_PLAYER_ID); } string[end] = ch; #if defined __SSCANF_FOREACH__ #undef foreach #undef __SSCANF_FOREACH__ #endif } stringPos = end; } case 's', 'z': { new i = 0, ch; if (format[formatPos]) { while ((ch = string[stringPos++]) && ch != delim) { setarg(paramPos, i++, ch); } if (!i) { return -1; } } else { while ((ch = string[stringPos++])) { setarg(paramPos, i++, ch); } } stringPos--; setarg(paramPos, i, '\0'); } default: { continue; } } while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ') { stringPos++; } while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' ')) { stringPos++; } paramPos++; } do { if ((delim = format[formatPos++]) > ' ') { if (delim == '\'') { while ((delim = format[formatPos++]) && delim != '\'') {} } else if (delim != 'z') { return delim; } } } while (delim > ' '); return 0; } MySQLFix() { if(mysql_ping(handler) == -1) { handler = mysql_connect(host, user, db, pw); } return 1; }