#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <sqlx>
#include <cstrike>
 
#define MAXPLAYERS 33
#define MAXRANK 5 //maximum rang
#define Tablename "tablaaaaaa" //tabla neve
 
#define OWNER ADMIN_IMMUNITY
#define ADMIN ADMIN_MAP
#define VIP ADMIN_LEVEL_H
 
new const cPrefix[] = "PREFIX";
 
enum _:eRank{eRankNum, eRankName[64], eRankTime,};
new const cRanks[MAXRANK][eRank] ={
    {0, "Újonc", 0},//(rang száma), (rang neve), (rang ideje mpben. [30 perc = 1800mp | 60 perc = 3600mp] ..stb)
    {1, "Valamit tud", 3600},//60perc
    {2, "Kiezte", 7200},//120perc
    {3, "Profi", 14400},//240perc
    {4, "Veterán", 28800}//480perc
}
 
new SayText;
 
enum _:ePlayer{eTime, eRanks,};
new g_ePlayer[ePlayer][MAXPLAYERS];
new Handle:g_SqlTuple;
 
public plugin_init(){
    register_plugin("TimeRank", "1.0", "asdasd!!");
    
    register_clcmd("say /ji", "time_p");//jatek ido chatre jeleniti meg
    register_clcmd("say /rangom", "rank_p");//rangod
    register_clcmd("say /rangok", "ranks_p");//rangok
    
    SayText = get_user_msgid("SayText");
    
    register_clcmd("say", "sayhook");
    register_clcmd("say_team", "saythook");
    
    register_forward (FM_PlayerPreThink, "fm_prethink");
}
public ranks_p(id)
{
    new sText[1024], iTimes[4], iRow[8];
    format(sText, charsmax(sText), "\r%s \d| \w Ranglista", cPrefix);
    new iMenu = menu_create(sText, "ranks_p_h");
    
    for(new i = 1; i < sizeof(cRanks); i++)
    {
        iTimes[0] = cRanks[i][eRankTime];
        iTimes[1] = iTimes[0] / 60;
        iTimes[2] = iTimes[1] / 60;
        iTimes[3] = iTimes[2] / 24;
        iTimes[0] = iTimes[0] - iTimes[1] * 60;
        iTimes[1] = iTimes[1] - iTimes[2] * 60;
        iTimes[2] = iTimes[2] - iTimes[3] * 24;
        num_to_str(i, iRow, charsmax(iRow));
        format(sText, charsmax(sText), "\y%d. \w%s\w -\r %d\w nap\r %d\w óra\r %d\w perc\r %d\w mp", i, cRanks[i][eRankName], iTimes[3], iTimes[2], iTimes[1], iTimes[0]);
        menu_additem(iMenu, sText, iRow);
    }
    
    menu_setprop(iMenu, MPROP_BACKNAME, "\wVissza");
    menu_setprop(iMenu, MPROP_NEXTNAME, "\wKövetkező");
    menu_setprop(iMenu, MPROP_EXITNAME, "Kilépés");
    menu_display(id, iMenu, 0);
}
public ranks_p_h(id, iMenu, iItem){if(iItem == MENU_EXIT){menu_destroy(iMenu);return;}}
public fm_prethink(id)
{
    if(is_user_connected(id))
        CheckRank_p(id);
}
public CheckRank_p(id)
{
    if(g_ePlayer[eRanks][id] == MAXRANK)
        return FMRES_IGNORED;
    
    new sName[64], iTime;
    
    iTime = g_ePlayer[eTime][id] + get_user_time(id);
    get_user_name(id, sName, charsmax(sName));
    
    if(iTime >= cRanks[g_ePlayer[eRanks][id]+1][eRankTime])
    {
        g_ePlayer[eRanks][id]++;
        client_printcolor(id, "^4[%s]^3 %s^4 %s^1 rangba lépett!", cPrefix, sName, cRanks[g_ePlayer[eRanks][id]][eRankName]);
        return FMRES_SUPERCEDE;
    }
    return FMRES_SUPERCEDE;
}
public time_p(id)
{
    new iTimes[4];
    iTimes[0] = g_ePlayer[eTime][id] + get_user_time(id);
    iTimes[1] = iTimes[0] / 60;
    iTimes[2] = iTimes[1] / 60;
    iTimes[3] = iTimes[2] / 24;
    iTimes[0] = iTimes[0] - iTimes[1] * 60;
    iTimes[1] = iTimes[1] - iTimes[2] * 60;
    iTimes[2] = iTimes[2] - iTimes[3] * 24;
    
    client_printcolor(id, "^4[%s]^1 A szerveren töltött időd:^3 %d^1 nap,^3 %d^1 óra,^3 %d^1 perc,^3 %d^1 másodperc.", cPrefix, iTimes[3], iTimes[2], iTimes[1], iTimes[0]);
}
public rank_p(id)
{
    new sMax[32];
    format(sMax, charsmax(sMax), g_ePlayer[eRanks][id] == MAXRANK ? "Nincs következő rang":"%s", cRanks[g_ePlayer[eRanks][id]+1][eRankName]);
    client_printcolor(id, "^4[%s]^1 Rangod:^3 %s^4 |^1 Következő rangod:^3 %s", cPrefix, cRanks[g_ePlayer[eRanks][id]][eRankName], sMax);
}
public sayhook(id)
{
    new sMessage[512], sText[128], sDeath[16], iLen, sName[64];
    read_args(sMessage, charsmax(sMessage));
    remove_quotes(sMessage);
    
    if(strlen(sMessage) == 0 || sMessage[0] == '/' || sMessage[0] == '@')
        return PLUGIN_HANDLED;
    
    format(sDeath, charsmax(sDeath), is_user_alive(id) ? "":"*Halott*");
    iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^1%s", sDeath);
    if(get_user_flags(id) & OWNER)
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[Tulajdonos]");
    else if(get_user_flags(id) & ADMIN)
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[Admin^3]");
    else if(get_user_flags(id) & VIP)
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[4VIP^3]");
    else
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[Játékos^3]");
    
    iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[%s]", cRanks[g_ePlayer[eRanks][id]][eRankName]);
    
    get_user_name(id, sName, charsmax(sName));
    format(sMessage, charsmax(sMessage), "%s ^1%s ^3»^3 %s", sText, sName, sMessage);
    
    for(new i; i < get_maxplayers(); i++)
    {
        if(!is_user_connected(i))
            continue;
        
        client_printcolor(i, sMessage);
    }
    return PLUGIN_HANDLED;
}
public saythook(id)
{
    new sMessage[512], sText[128], sDeath[16], iLen, sName[64];
    read_args(sMessage, charsmax(sMessage));
    remove_quotes(sMessage);
    
    if(strlen(sMessage) == 0 || sMessage[0] == '/' || sMessage[0] == '@')
        return PLUGIN_HANDLED;
    
    new iTeam, sTeam[32];
    iTeam = get_user_team(id, sTeam, charsmax(sTeam));
    
    switch(iTeam)
    {
        case CS_TEAM_CT: {sTeam = "Terrorelhárító";}
        case CS_TEAM_T: {sTeam = "Terrorista";}
        case CS_TEAM_SPECTATOR: {sTeam = "Nézelődő";}
    }
    
    format(sDeath, charsmax(sDeath), is_user_alive(id) ? "":"*Halott*");
    iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^3(%s)", sTeam);
    iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^1%s", sDeath);
    
    if(get_user_flags(id) & OWNER)
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[Tulajdonos]");
    else if(get_user_flags(id) & ADMIN)
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[Admin^3]");
    else if(get_user_flags(id) & VIP)
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[4VIP^3]");
    else
        iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[Játékos^3]");
    
    iLen += formatex(sText[iLen], charsmax(sText)-iLen, "^4[%s]", cRanks[g_ePlayer[eRanks][id]][eRankName]);
    
    get_user_name(id, sName, charsmax(sName));
    format(sMessage, charsmax(sMessage), "%s ^1%s ^3»^3 %s", sText, sName, sMessage);
    
    for(new i; i < get_maxplayers(); i++)
    {
        if(!is_user_connected(i))
            continue;
        
        if(cs_get_user_team(id) == CS_TEAM_CT)
            client_printcolor(i, sMessage);
        else if(cs_get_user_team(id) == CS_TEAM_T)
            client_printcolor(i,sMessage);
        else
            client_printcolor(i, sMessage);
    }
    return PLUGIN_HANDLED;
}
public client_authorized(id)
{
    if(is_user_bot(id))
        return PLUGIN_HANDLED;
    
    g_ePlayer[eTime][id] = 0;
    g_ePlayer[eRanks][id] = 0;
    
    SelectDataTable(id);
    
    return PLUGIN_HANDLED;
}
public client_disconnect(id)
{
    if(is_user_bot(id))
        return PLUGIN_HANDLED;
    
    TableUpdate(id);
    
    return PLUGIN_HANDLED;
}
public plugin_cfg()
{
    //Kiszolgáló | Felhasználó | Jelszó | Adatbázis
    
    g_SqlTuple = SQL_MakeDbTuple("", "", "", "");
    CreateTable();
}
public CreateTable(){
    new iLen;
    static sQuery[2048];
    
    iLen += formatex(sQuery[iLen], charsmax(sQuery), "CREATE TABLE IF NOT EXISTS `%s` ", Tablename);
    iLen += formatex(sQuery[iLen], charsmax(sQuery)-iLen, "( ");
    iLen += formatex(sQuery[iLen], charsmax(sQuery)-iLen, "`Id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,");
    iLen += formatex(sQuery[iLen], charsmax(sQuery)-iLen, "`SteamId` varchar(64) NOT NULL,");
    iLen += formatex(sQuery[iLen], charsmax(sQuery)-iLen, "`qTime` int(11) NOT NULL,");
    iLen += formatex(sQuery[iLen], charsmax(sQuery)-iLen, "`qRanks` int(11) NOT NULL)");
    
    SQL_ThreadQuery(g_SqlTuple, "TableCreateThread", sQuery);
}
public TableUpdate(id)
{
    static sQuery[2048];
    new iLen, sSteamID[64];
    get_user_authid(id, sSteamID, charsmax(sSteamID));
    
    iLen += formatex(sQuery[iLen], charsmax(sQuery), "UPDATE `%s` SET ", Tablename);
    iLen += formatex(sQuery[iLen], charsmax(sQuery)-iLen, "qTime = ^"%i^",", g_ePlayer[eTime][id] + get_user_time(id));
    
    iLen += formatex(sQuery[iLen], charsmax(sQuery)-iLen, "qRanks = ^"%i^" WHERE `SteamId` = ^"%s^";", g_ePlayer[eRanks][id], sSteamID);
    SQL_ThreadQuery(g_SqlTuple, "QuerySetDataTable", sQuery);
}
public TableCreateThread(iFailState, Handle:sQuery, sError[], iErrcode, sData[], iDataSize, Float:fQueuetime)
{
    if(iFailState == TQUERY_CONNECT_FAILED)
        set_fail_state("[Create] Nem lehet csatlakozni az adatbazishoz!");
    else if(iFailState == TQUERY_QUERY_FAILED)
        set_fail_state("[Create] Lekerdezesi hiba");
    if(iErrcode)
        log_amx("[Create] Hiba:**!! %s !!**", sError);
}
public TableInsert(id)
{
    static sQuery[2048], sSteamID[64];
    
    get_user_authid(id, sSteamID, charsmax(sSteamID));
    formatex(sQuery, charsmax(sQuery), "INSERT INTO `%s` (`SteamId`) VALUES (^"%s^");", Tablename, sSteamID);
    SQL_ThreadQuery(g_SqlTuple, "QuerySetDataTable", sQuery);
}
public SelectDataTable(id)
{
    static sQuery[2048];
    new sData[1], sSteamID[64];
    sData[0] = id;
    
    get_user_authid(id, sSteamID, charsmax(sSteamID));
    
    formatex(sQuery, charsmax(sQuery), "SELECT * FROM `%s` WHERE SteamId = ^"%s^";", Tablename, sSteamID);
    SQL_ThreadQuery(g_SqlTuple, "QuerySelectDataTable", sQuery, sData, 1);
}
public QuerySelectDataTable(iFailState, Handle:sQuery, sError[], iErrcode, sData[], iDataSize, Float:fQueuetime)
{
    if(iFailState == TQUERY_CONNECT_FAILED || iFailState == TQUERY_QUERY_FAILED)
    {
        log_amx("[Insert] Hiba:**!! %s !!**", sError);
        return;
    }
    else
    {
        new id = sData[0];
        
        if(SQL_NumRows(sQuery) > 0)
        {
            g_ePlayer[eTime][id] = SQL_ReadResult(sQuery, SQL_FieldNameToNum(sQuery, "qTime"));
            g_ePlayer[eRanks][id] = SQL_ReadResult(sQuery, SQL_FieldNameToNum(sQuery, "qRanks"));
        }
        else
            TableInsert(id);
    }
}
public QuerySetDataTable(iFailState, Handle:sQuery, sError[], iErrcode, sData[], iDataSize, Float:fQueuetime)
{
    if(iFailState == TQUERY_CONNECT_FAILED || iFailState == TQUERY_QUERY_FAILED)
    {
        log_amx("[SetData] Hiba:**!! %s !!**", sError);
        return;
    }
}
stock client_printcolor(const id, const input[], any:...)
{
    new count = 1, players[32];
    static msg[256];
    vformat(msg, charsmax(msg), input, 3);
    
    replace_all(msg, charsmax(msg), "!g", "^4");
    replace_all(msg, charsmax(msg), "!y", "^1");
    replace_all(msg, charsmax(msg), "!t", "^3");
    
    if (id) players[0] = id; else get_players(players, count, "ch");{
    for ( new i = 0; i < count; i++ )
    {
        if ( is_user_connected(players[i]) )
        {
            message_begin(MSG_ONE_UNRELIABLE, SayText, _, players[i]);
            write_byte(players[i]);
            write_string(msg);
            message_end();
        }
    }
}
}