#include <amxmodx>
#include <amxmisc>
#include <ColorChat>
#include <engine>
#include <cstrike>
#include <sqlx>
 
#define TULAJ ADMIN_LEVEL_H
#define ADMIN ADMIN_LEVEL_D
#define VIP ADMIN_LEVEL_E
#define FOADMIN ADMIN_LEVEL_G
#define KONFIG ADMIN_LEVEL_F
#define HIRDETO ADMIN_LEVEL_C
 
#define ASD 15
 
//SQL MENTéS/REGRENDSZER
//**(exodus regrendszere és mentése)**//
new const SQLINFO[][] = { "", "", "", "" };
new name[33][32];
new Handle:g_SqlTuple;
new bool:Belepve[33], bool:Beirtjelszot[33], bool:Beirtjelszot1[33], bool:Beirtfelhasznalot[33], bool:Beirtfelhasznalot1[33], Regisztralt[33], Felhasznalonev[33][64], Jelszo[33][64], regJelszo[33][64], regFh[33][64];
 
new PLUGIN[] = "Rangok";
new VERSION[] = "0.1.0";
new AUTHOR[] = "asdasdasd";
 
new PREFIX[] = "##RippeR Team##";
 
new olesek[33], szint[33];
 
//**Chat is exodus chatje**//
new Temp[192];
 
new const szamok[ASD] = {
    100,
    300,
    550,
    1000,
    2000,
    4000,
    5000,
    6000,
    7000,
    8000,
    10000,
    12000,
    15000,
    18000,
    22000
}
 
new const rangok[ASD+1][] = {
    "Újonc(Lvl.1)",
    "Honvéd(Lvl.2)",
    "Őrvezető(Lvl.3)",
    "Tizedes(Lvl.4)",
    "Szakaszvezető(Lvl.5)",
    "Örmester(Lvl.6)",
    "Hadnagy(Lvl.7)",
    "Főhadnagy(Lvl.8)",
    "Százados(Lvl.9)",
    "Őrnagy(Lvl.10)",
    "Alezredes(Lvl.11)",
    "Ezredes(Lvl.12)",
    "Dandártábornok(Lvl.13)",
    "Vezérnagy(Lvl.14)",
    "Altábornok(Lvl.15)",
    "Vezérezredes(Lvl.16)"
}
public plugin_init()
{
    //regrendszer
    register_clcmd("Reg_Felhasznalonev", "regisztralas_felh");
    register_clcmd("Reg_Jelszo", "regisztralas_jelszo");
    register_clcmd("Log_Felhasznalonev", "bejelentkezes_felh");
    register_clcmd("Log_Jelszo", "bejelentkezes_jelszo");
    register_plugin(PLUGIN, VERSION, AUTHOR)
    //Parancsok
    register_clcmd("say /rang", "showrang");
    register_clcmd("say /reg", "Ellenorzes");
    register_clcmd("say_team /reg", "Ellenorzes");
    //Event
    register_event("DeathMsg", "halal", "a")
 
 
    //Ha a regrendszer menujet:
    //t beture szeretned
    //*register_impulse(201, "Ellenorzes");
    //f beture szeretned
    //*register_impulse(100, "Ellenorzes");
    //m beture szeretned
    //*register_clcmd("chooseteam", "Ellenorzes");
 
    //Ha valamelyik betére szeretnéd a menőt, akkor csak vedd el a --> // - jelet
 
    //**FONTOS!**//(maradjon alul)
    register_clcmd("say", "sayhook");
}
public halal(id)
{
    new killer = read_data(1);
    new victim = read_data(2);
 
 
    if(killer != victim)
        olesek[killer]++
 
    while(olesek[killer] >= szamok[szint[killer]])
    {
        szint[killer]++
    }
}
public showrang(id)
{
    if(szint[id] != ASD+1)
    {
        ColorChat(id, GREEN, "^4[%s] ^3Rang: ^4%s ^1| ^3Ölések: ^4%d ^1| ^3Kell még: ^4%d", PREFIX, rangok[szint[id]], olesek[id], szamok[szint[id]]-olesek[id]);
    }
    else
    {
        ColorChat(id, GREEN, "^4[%s] ^3Rang: ^4%s ^1| ^3Ölések: ^4%d", PREFIX, rangok[szint[id]], olesek[id]);
        ColorChat(id, GREEN, "^4[%s] ^1Elérted a legmagasabb ^3Rangot.", PREFIX);
    }
    return PLUGIN_HANDLED;
}
public Menu_Regisztracio(id)
{
    new String[121];
    formatex(String, charsmax(String), "[\d%s\y] \r- \dRegisztráció", PREFIX);
    new menu = menu_create(String, "Menu_Regisztracio_h");
 
    if(Regisztralt[id] == 0)
    {
        formatex(String, charsmax(String), "\wFelhasználónév: \r%s^n", regFh[id]);
        menu_additem(menu, String, "1",0);
        formatex(String, charsmax(String), "\wJelszó: \r%s^n", regJelszo[id]);
        menu_additem(menu, String, "2",0);
    }
    else
    {
        formatex(String, charsmax(String), "\rNév: \d%s^n\wTe már regisztráltál a szerverre.", name[id], regFh[id]);
        menu_additem(menu, String, "",0);
    }
 
    if(Beirtfelhasznalot[id] == true && Beirtjelszot[id] == true)
    {
        formatex(String, charsmax(String), "\yRegisztráció");
        menu_additem(menu, String, "3",0);
    }
 
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}
public Menu_Regisztracio_h(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return;
    }
 
    new data[9], szName[64];
    new access, callback;
    menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback);
    new key = str_to_num(data);
 
    switch(key)
    {
        case 1:
        {
            client_cmd(id, "messagemode Reg_Felhasznalonev");
        }
        case 2:
        {
            client_cmd(id, "messagemode Reg_Jelszo");
        }
        case 3:
        {
            Regisztralt[id] = 1;
            ColorChat(id, GREEN, "%s^1Sikeresen regisztráltál a szerverre.", PREFIX);
            Menu_Bejelentkezes(id);
            SQL_Update_Reg(id);
        }
    }
}
public Menu_Bejelentkezes(id)
{
    new String[121];
    formatex(String, charsmax(String), "[\d%s\y] \r- \dBejelentkezés^n", PREFIX);
    new menu = menu_create(String, "Menu_Bejelentkezes_h");
 
    formatex(String, charsmax(String), "Felhasználónév: \r%s^n", Felhasznalonev[id]);
    menu_additem(menu, String, "1",0);
    formatex(String, charsmax(String), "Jelszó: \r%s^n", Jelszo[id]);
    menu_additem(menu, String, "2",0);
 
    formatex(String, charsmax(String), "\yBejelentkezés^n");
    menu_additem(menu, String, "3",0);
 
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}
public Menu_Bejelentkezes_h(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return;
    }
 
    switch(item)
    {
        case 1:
        {
            client_cmd(id, "messagemode Log_Felhasznalonev");
        }
        case 2:
        {
            client_cmd(id, "messagemode Log_Jelszo");
        }
        case 3:
        {
            if(equali(Jelszo[id], regJelszo[id]) && (equali(Felhasznalonev[id], regFh[id])))
            {
                Belepve[id] = true;
                ColorChat(id, GREEN,"%s ^1Üdv újra itt ^4%s ^1!", PREFIX, name[id]);
            }
            else
            {
                ColorChat(id, GREEN,"%s ^1Hibás Felhasználónév vagy Jelszó.", PREFIX);
            }
        }
    }
}
public Menu_Fo(id)
{
    new String[121];
    formatex(String, charsmax(String), "[\d%s\y] \r- \dRegisztrációs rendszer", PREFIX);
    new menu = menu_create(String, "Menu_Fo_h");
 
    formatex(String, charsmax(String), "Regisztráció");
    menu_additem(menu, String, "2",0);
    formatex(String, charsmax(String), "Bejelentkezés^n");
    menu_additem(menu, String, "1",0);
 
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}
public Menu_Fo_h(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return;
    }
 
    switch(item)
    {
        case 1: Menu_Bejelentkezes(id);
        case 2: Menu_Regisztracio(id);
    }
}
public Ellenorzes(id)
{
    if(Belepve[id] == false)
    {
        Menu_Fo(id);
    }
    else
    {
        ColorChat(id, GREEN,"%s ^1Te mar beleptel 1x...", PREFIX);
    }
}
public regisztralas_felh(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5)
    {
        regFh[id] = adat;
        Beirtfelhasznalot[id] = true;
        Menu_Regisztracio(id);
    }
    else
    {
        regFh[id] = adat;
        Beirtfelhasznalot[id] = true;
        Menu_Regisztracio(id);
    }
    return PLUGIN_CONTINUE;
}
public regisztralas_jelszo(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5) {
        regJelszo[id] = adat;
        Beirtjelszot[id] = true;
        Menu_Regisztracio(id);
    }
    else {
        regJelszo[id] = adat;
        Beirtjelszot[id] = true;
        Menu_Regisztracio(id);
    }
    return PLUGIN_CONTINUE;
}
public bejelentkezes_jelszo(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5) {
        Jelszo[id] = adat;
        Beirtjelszot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    else {
        Jelszo[id] = adat;
        Beirtjelszot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    return PLUGIN_CONTINUE;
}
public bejelentkezes_felh(id)
{
    new adat[32];
    new hosszusag = strlen(adat);
    read_args(adat, charsmax(adat));
    remove_quotes(adat);
    if(hosszusag >= 5)
    {
        Felhasznalonev[id] = adat;
        Beirtfelhasznalot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    else
    {
        Felhasznalonev[id] = adat;
        Beirtfelhasznalot1[id] = true;
        Menu_Bejelentkezes(id);
    }
    return PLUGIN_CONTINUE;
}
public client_disconnect(id)
{
    if(!is_user_bot(id) && !is_user_hltv(id))
    {
        Update(id);
    }
    olesek[id] = 0;
    szint[id] = 0;
 
    Belepve[id] = false;
    Beirtjelszot[id] = false;
    Beirtjelszot1[id] = false;
    Beirtfelhasznalot[id] = false;
    Beirtfelhasznalot1[id] = false;
    regFh[id][0] = EOS;
    regJelszo[id][0] = EOS;
    Felhasznalonev[id][0] = EOS;
    Jelszo[id][0] = EOS;
 
    copy(name[id], charsmax(name[]), "");
}
public client_putinserver(id)
{
    if(!is_user_bot(id) && !is_user_hltv(id))
    {
        get_user_name(id, name[id], charsmax(name));
        Load(id);
    }
    Felhasznalonev[id] = "";
    Jelszo[id] = "";
}
public plugin_cfg()
{
    g_SqlTuple = SQL_MakeDbTuple(SQLINFO[0], SQLINFO[1], SQLINFO[2], SQLINFO[3]);
 
    static Query[10048];
    new Len;
 
    Len += formatex(Query[Len], charsmax(Query), "CREATE TABLE IF NOT EXISTS `rangok_mentes`");
    Len += formatex(Query[Len], charsmax(Query)-Len, "(`Nev` varchar(32) NOT NULL, ");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Felhasznalonev` varchar(32) NOT NULL,");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Jelszo` varchar(32) NOT NULL,");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Regisztralt` int(11) NOT NULL,");
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Olesek` int(11) NOT NULL,");
 
    Len += formatex(Query[Len], charsmax(Query)-Len, "`Szint` int(11) NOT NULL, `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY)");
 
    SQL_ThreadQuery(g_SqlTuple, "createTableThread", Query);
}
public Load(id)
{
    static Query[10048];
    new Data[1];
    Data[0] = id;
 
    formatex(Query, charsmax(Query), "SELECT * FROM `rangok_mentes` WHERE Nev = ^"%s^";", name[id]);
    SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", Query, Data, 1);
 
    set_task(1.0, "setRang", id ); // Így biztos az SQL után fut le
}
public setRang(id)
{
    if(is_user_connected(id))
    {
        while(olesek[id] >= szamok[szint[id]])
        {
            szint[id]++;
        }
    }
}
 
public QuerySelectData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
    if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
        log_amx("%s", Error);
        return;
    }
    else {
        new id = Data[0];
 
        if(SQL_NumRows(Query) > 0) {
            SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Felhasznalonev"), regFh[id], charsmax(regFh[]));
            SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Jelszo"), regJelszo[id], charsmax(regJelszo[]));
            Regisztralt[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Regisztralt"));
            olesek[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Olesek"));
 
            szint[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Szint"));
        }
        else
        {
            Save(id);
        }
    }
}
public Save(id)
{
    static Query[256];
 
    formatex(Query, charsmax(Query), "INSERT INTO `rangok_mentes` (`Nev`) VALUES (^"%s^");", name[id]);
 
    SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query);
}
public Update(id)
{
    static Query[10048];
    new Len;
 
    Len += formatex(Query[Len], charsmax(Query), "UPDATE `rangok_mentes` SET Olesek = ^"%i^", ",olesek[id]);
    Len += formatex(Query[Len], charsmax(Query)-Len, "Szint = ^"%i^" WHERE Nev = ^"%s^";", szint[id], name[id]);
 
    SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query);
}
public SQL_Update_Reg(id)
{
    static Query[10048];
    new Len;
 
    Len += formatex(Query[Len], charsmax(Query), "UPDATE `rangok_mentes` SET Felhasznalonev = ^"%s^", ", regFh[id]);
    Len += formatex(Query[Len], charsmax(Query)-Len, "Jelszo = ^"%s^", ", regJelszo[id]);
    Len += formatex(Query[Len], charsmax(Query)-Len, "Regisztralt = ^"%i^" WHERE Nev = ^"%s^";", Regisztralt[id], name[id]);
 
    SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query);
}
public createTableThread(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
    if(FailState == TQUERY_CONNECT_FAILED)
        set_fail_state("[HIBA*] NEM TUDTAM CSATLAKOZNI AZ ADATBAZISHOZ!");
    else if(FailState == TQUERY_QUERY_FAILED)
        set_fail_state("Query Error");
    if(Errcode)
        log_amx("[HIBA*] HIBAT DOBTAM: %s",Error);
}
public QuerySetData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
    if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
        log_amx("%s", Error);
        return;
    }
}
public sayhook(id)
{
    new message[192], none[2][32];
    read_args(message, 191);
    remove_quotes(message);
 
    formatex(none[0], 31, ""), formatex(none[1], 31, " ");
 
    if (message[0] == '@' || message[0] == '/' || message[0] == '#' || message[0] == '!' || equal (message, ""))
        return PLUGIN_HANDLED;
 
    if(!equali(message, none[0]) && !equali(message, none[1]))
    {
        if(is_user_alive(id))
        {
            if(Regisztralt[id] == 0)
                formatex(Temp, 191, "^x04[Nem Regisztrált]^x03%s^x01: %s", name[id], message);
            else if(get_user_flags(id) & TULAJ && Belepve[id] == true)
                formatex(Temp, 191, "^x04[Tulajdonos][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & FOADMIN && Belepve[id] == true)
                formatex(Temp, 191, "^x04[FőAdmin][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & ADMIN && Belepve[id] == true)
                formatex(Temp, 191, "^x04[Admin][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & KONFIG && Belepve[id] == true)
                formatex(Temp, 191, "^x04[SzerverFejlesztő][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & VIP && Belepve[id] == true)
                formatex(Temp, 191, "^x04[VIP][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & HIRDETO && Belepve[id] == true)
                formatex(Temp, 191, "^x04[Hírdető][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(Belepve[id] == true)
                formatex(Temp, 191, "^x04[%s]^x03 %s^x01: %s", rangok[szint[id]],  name[id], message);
            else if(Regisztralt[id] == 1)
                formatex(Temp, 191, "^x04[Kijelentkezve]^x03 %s^x01: %s", name[id], message);
        }
        else {
            if(Regisztralt[id] == 0)
                formatex(Temp, 191, "^x01*Halott*^x04[Nem Regisztrált]^x03 %s^x01: %s", name[id], message);
            else if(get_user_flags(id) & TULAJ && Belepve[id] == true)
                formatex(Temp, 191, "^x01*Halott*^x04[Tulajdonos][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & FOADMIN && Belepve[id] == true)
                formatex(Temp, 191, "^x01*Halott*^x04[FőAdmin][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & ADMIN && Belepve[id] == true)
                formatex(Temp, 191, "^x01*Halott*^x04[Admin][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & KONFIG && Belepve[id] == true)
                formatex(Temp, 191, "^x01*Halott*^x04[SzerverFejlesztő][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & VIP && Belepve[id] == true)
                formatex(Temp, 191, "^x01*Halott*^x04[VIP][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(get_user_flags(id) & HIRDETO && Belepve[id] == true)
                formatex(Temp, 191, "^x01*Halott*^x04[Hírdető][%s]^3%s^x04: %s", rangok[szint[id]], name[id], message);
            else if(Belepve[id] == true)
                formatex(Temp, 191, "^x01*Halott*^x04[%s]^x03 %s^x01: %s", rangok[szint[id]],  name[id], message);
            else if(Regisztralt[id] == 1)
                formatex(Temp, 191, "^x01*Halott*^x04[Kijelentkezve]^x03 %s^x01: %s", name[id], message);
        }
 
        switch(cs_get_user_team(id))
        {
            case 1: ColorChat(0, RED, Temp);
            case 2: ColorChat(0, BLUE, Temp);
            default: ColorChat(0, GREY, Temp);
        }
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}
 
public plugin_end()
{
    SQL_FreeHandle(g_SqlTuple);
}