#include <amxmodx>
DB_Init(){
state mysql;
new szDB[32];
get_cvar_string("amx_drstats_db", szDB, 31);
if(contain(szDB, ".") > 0)
state sqlite;
SQLx_Init();
}
loadRunnerData(id){
if(!gbAuthorized[id]) return;
new data[1];
data[0] = id;
formatex(gszQuery, charsmax(gszQuery), "SELECT * FROM `results` WHERE id=%d AND mid=%d", giPid[id], gMid);
SQL_ThreadQuery(gTuple, "handleLoadData", gszQuery, data, sizeof(data));
}
saveRunnerData(id, updateBest = 0){
if(!gbAuthorized[id]) return;
if(updateBest){
giBestTime[id] = updateBest;
get_time("%Y-%m-%d %H:%M:%S", gszRecordTime[id], charsmax(gszRecordTime[]));
}
formatex(gszQuery, charsmax(gszQuery),
"UPDATE `results` SET besttime=%d, games=%d, playedtime=%d, deaths=%d, recorddate='%s' \
WHERE id=%d AND mid=%d",
giBestTime[id], giPlayedGames[id], getPlayedTime(id), getPlayerDeaths(id), gszRecordTime[id],
giPid[id], gMid);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
//Create Handler
public handleCreateQuery(failstate, Handle:query, error[], errnum, data[], size)<mysql, sqlite>{
if(failstate != TQUERY_SUCCESS)
log_amx("SQL Creation error: %s",error);
}
public handleStandard(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL error: %s",error);
return;
}
}
loadPlayerId(id){
if(!gMid) return;
new szAuth[64];
new szField[32];
switch(get_pcvar_num(gcvarSave)){
case 1:{
get_user_authid(id, szAuth, 31);
szField = "steamid";
}
case 2:{
get_user_name(id, szAuth, 31);
SQL_PrepareString(szAuth, szAuth, 63);
szField = "nickname";
}
case 3:{
get_user_ip(id, szAuth, 31, 1);
szField = "ip";
}
}
new data[1];
data[0] = id;
formatex(gszQuery, charsmax(gszQuery), "SELECT id, ip, nationality FROM `runners` WHERE %s='%s'",szField, szAuth);
SQL_ThreadQuery(gTuple, "handleSelectRunner", gszQuery, data, sizeof(data));
}
getNationality(id, const szIP[], szCode[5]){
new szTemp[3];
if(geoip_code2_ex( szIP, szTemp)){
copy(szCode, 4, szTemp);
}
else{
get_user_info(id, "lang", szCode, 2);
SQL_PrepareString(szCode, szCode, 4);
}
}
public handleSelectRunner(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
if(!is_user_connected(id)) return;
new szCode[5];
if(SQL_MoreResults(query)){
client_authorized_db(id, SQL_ReadResult(query, 0));
SQL_ReadResult(query, 2, szCode, 1)
if(szCode[0] == 0){
new szIP[32];
SQL_ReadResult(query, 1, szIP, 31);
getNationality(id, szIP, szCode);
formatex(gszQuery, charsmax(gszQuery), "UPDATE `runners` SET nationality='%s' WHERE id=%d",szCode, giPid[id]);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
}else{
new szAuth[32];
get_user_authid(id, szAuth, 31);
new szIP[32];
get_user_ip(id, szIP, 31, 1)
new szName[64];
get_user_name(id, szName, 31);
SQL_PrepareString(szName, szName, 63);
getNationality(id, szIP, szCode);
formatex(gszQuery, charsmax(gszQuery), "INSERT INTO `runners` VALUES (0, '%s', '%s', '%s', '%s')", szAuth, szName, szIP, szCode);
SQL_ThreadQuery(gTuple, "handleInsertRunner", gszQuery, data, size);
}
}
public handleInsertRunner(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
if(!is_user_connected(id)) return;
client_authorized_db(id , SQL_GetInsertId(query));
}
public handleLoadData(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
if(!is_user_connected(id)) return;
if(SQL_MoreResults(query)){
giBestTime[id] = SQL_ReadResult(query, 2);
giPlayedGames[id] = SQL_ReadResult(query, 3) + 1;
giPlayedTime[id] = SQL_ReadResult(query, 4);
giDeaths[id] = SQL_ReadResult(query, 5);
SQL_ReadResult(query, 6, gszRecordTime[id], charsmax(gszRecordTime[]));
}else{
giBestTime[id] = 0;
giPlayedGames[id] = 1;
giPlayedTime[id] = 0;
giDeaths[id] = 0;
gszRecordTime[id] = "";
formatex(gszQuery, charsmax(gszQuery), "INSERT INTO `results` VALUES (%d, %d, 0, 1, 0, 0, NULL)", giPid[id], gMid);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
}
saveFinishOrigin(){
if(pev_valid(gEntFinish)){
new Float:fOrigin[3], iOrigin[3];
pev(gEntFinish, pev_origin, fOrigin);
FVecIVec(fOrigin, iOrigin);
formatex(gszQuery, charsmax(gszQuery), "UPDATE `maps` SET finishX = %d, finishY=%d, finishZ=%d WHERE mid=%d",
iOrigin[0], iOrigin[1], iOrigin[2], gMid);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
}
loadRank(id, const szFunc[]){
new fun = get_func_id(szFunc);
if(!fun) return;
formatex(gszQuery, charsmax(gszQuery), "SELECT COUNT(*) FROM `results` WHERE mid=%d AND besttime > 0 AND besttime < %d",
gMid, giBestTime[id]);
new data[2];
data[0] = id;
data[1] = fun;
SQL_ThreadQuery(gTuple, "handleLoadRank", gszQuery, data, sizeof(data));
}
public handleLoadRank(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
new fun = data[1];
new rank = SQL_ReadResult(query, 0);
if(callfunc_begin_i(fun)){
callfunc_push_int(id);
callfunc_push_int(rank+1);
callfunc_end();
}
}
loadNshowTop15(id){
formatex(gszQuery, charsmax(gszQuery), "SELECT nickname, besttime FROM `results` JOIN `runners` ON `runners`.id=`results`.id WHERE mid=%d AND besttime ORDER BY besttime ASC LIMIT 15",
gMid, giBestTime[id]);
new data[1];
data[0] = id;
SQL_ThreadQuery(gTuple, "handleLoadTop15", gszQuery, data, sizeof(data));
}
public handleLoadTop15(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
}
new id = data[0];
if(!is_user_connected(id) && id!=0) return;
new iLen = 0, iMax = charsmax(gszMotd);
iLen += formatex(gszMotd[iLen], iMax-iLen, "<pre>");
iLen += formatex(gszMotd[iLen], iMax-iLen, "%L %L %L^n", id, "WORD_POS", id, "WORD_PLAYER", id, "WORD_TIME");
new i=1;
new iTime, szName[32], szTime[32];
while(SQL_MoreResults(query)){
SQL_ReadResult(query, 0, szName, 31);
iTime = SQL_ReadResult(query, 1);
getFormatedTime(iTime, szTime, 31);
iLen += formatex(gszMotd[iLen], iMax-iLen, "%-3d %-32s ", i, szName);
if(i == 1){
giBestTimeofMap = iTime;
iLen += formatex(gszMotd[iLen], iMax-iLen, " %-15s ", szTime);
if(id == 0) return;
}else{
iLen += formatex(gszMotd[iLen], iMax-iLen, " %-15s ", szTime);
getFormatedTime(iTime-giBestTimeofMap , szTime, 31);
iLen += formatex(gszMotd[iLen], iMax-iLen, "+%-15s", szTime);
}
iLen += formatex(gszMotd[iLen], iMax-iLen, "^n");
i++;
SQL_NextRow(query);
}
iLen += formatex(gszMotd[iLen], iMax-iLen, "</pre>");
show_motd(id, gszMotd, "Top15");
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/