#include < amxmodx >
#include < sqlx >
 
new const g_sPrefix[ ] = "RegSystem";
new const g_sSQL_INFOS[ ][ ] =
{
    "",     // HOST
    "",     // USERNAME
    "",     // PASSWORD
    ""  // DATABASE
};
new Handle: g_iSqlTuple, g_sUserName[ 33 ][ 32 ], g_sPassword[ 33 ][ 32 ], g_iLoggedIn[ 33 ];
 
public plugin_init( )
{
    register_plugin( "Sql Reg System", "1.0", "Demon" );
    
    g_iSqlTuple = SQL_MakeDbTuple( g_sSQL_INFOS[ 0 ], g_sSQL_INFOS[ 1 ], g_sSQL_INFOS[ 2 ], g_sSQL_INFOS[ 3 ] );
 
    new sThread[ 512 ];
    formatex( sThread, charsmax( sThread ), "CREATE TABLE IF NOT EXISTS `reg_users` (`username` varchar( 32 ) NOT NULL, `password` varchar( 32 ) NOT NULL, `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY );" );
    
    SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sThread, { 0 }, 1 );
    
    register_clcmd( "Felhasznalonev", "GetUserName" );
    register_clcmd( "Jelszo", "GetPassword" );
    
    register_clcmd( "say /reg", "cmdReg" );
}
 
public cmdReg( iId ) { MainMenu( iId, 0 ); }
 
public MainMenu( iId, iMenu )
{
    static sTxt[ 256 ], iMenuId, sItemId[ 8 ];
    static const iNum = charsmax( sTxt );
    
    formatex( sTxt, iNum, "\r[\w%s\r]\y ", g_sPrefix );
    
    switch( iMenu )
    {
        case 0:
        {
            add( sTxt, iNum, "Regisztracios menu" );
            iMenuId = menu_create( sTxt, "MainMenuH" );
            
            if ( g_iLoggedIn[ iId ] == 3 ) menu_additem( iMenuId, "Kijelentkezes", "0 0" );
            else
            {
                menu_additem( iMenuId, "Regisztracio", "1 0" );
                menu_additem( iMenuId, "Bejelentkezes", "2 0" );
            }
        }
        case 1, 2:
        {
            add( sTxt, iNum, iMenu == 1 ? "Regisztracio" : "Bejelentkezes" );
            iMenuId = menu_create( sTxt, "MainMenuH" );
            
            formatex( sTxt, iNum, "Felhasznalonev: \r%s", g_sUserName[ iId ] );
            formatex( sItemId, charsmax( sItemId ), "1 %d", iMenu );
            menu_additem( iMenuId, sTxt, sItemId );
            
            formatex( sTxt, iNum, "Jelszo: \r%s^n", g_sPassword[ iId ] );
            formatex( sItemId, charsmax( sItemId ), "2 %d", iMenu );
            menu_additem( iMenuId, sTxt, sItemId );
            
            formatex( sItemId, charsmax( sItemId ), "3 %d", iMenu );
            menu_additem( iMenuId, iMenu == 1 ? "Regisztralas" : "Bejelentkezes", sItemId );
        }
    }
    menu_display( iId, iMenuId, 0 );
}
 
public MainMenuH( iId, iMenuId, iItem )
{
    if ( iItem != MENU_EXIT )
    {
        new sMenuName[ 78 ], sInfo[ 32 ], sDatas[ 2 ][ 16 ], iKey, iMenuNum;
        menu_item_getinfo( iMenuId, iItem, iKey, sInfo, charsmax( sInfo ), sMenuName, charsmax( sMenuName ), iMenuNum );
        parse( sInfo, sDatas[ 0 ], charsmax( sDatas[ ] ), sDatas[ 1 ], charsmax( sDatas[ ] ) );
        iKey = str_to_num( sDatas[ 0 ] );
        iMenuNum = str_to_num( sDatas[ 1 ] );
        
        
        switch( iMenuNum )
        {
            case 0:
            {
                if ( ( g_iLoggedIn[ iId ] = iKey ) == 0 ) ChatColor( iId, "Sikeresen kijelentkeztel." );
                else MainMenu( iId, ( g_iLoggedIn[ iId ] = iKey ) );
            }
            case 1, 2:
            {
                switch( iKey )
                {
                    case 1: { client_cmd( iId, "messagemode Felhasznalonev" ); }
                    case 2: { client_cmd( iId, "messagemode Jelszo" ); }
                    case 3: { LoadDatas( iId, iMenuNum ); }
                }
            }
        }
    }
    menu_destroy( iMenuId );
    return PLUGIN_HANDLED;
}
 
public SaveDatas( iId )
{
    static sText[ 128 ];
    
    formatex( sText, charsmax( sText ), "INSERT INTO `reg_users` (`username`, `password`) VALUES (^"%s^", ^"%s^");", g_sUserName[ iId ], g_sPassword[ iId ] );
    
    SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sText, { 0 }, 1 );
}
 
public LoadDatas( iId, iMode )
{
    static sText[ 128 ], iArray[ 1 ];
    
    iArray[ 0 ] = iId;
    
    if ( iMode == 1 )
    {
        formatex( sText, charsmax( sText ), "SELECT * FROM `reg_users` WHERE username = ^"%s^";", g_sUserName[ iId ] );
        iArray[ 0 ] += 100;
    }
    else formatex( sText, charsmax( sText ), "SELECT * FROM `reg_users` WHERE username = ^"%s^" AND password = ^"%s^";", g_sUserName[ iId ], g_sPassword[ iId ] );
    
    SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sText, iArray, sizeof( iArray ) );
}
 
public ThreadHandler( iFailState, Handle:iQuery, const sErrorMsg[ ], iErrorCode, const iARRAY[ ], iArraySize, Float:fQueueTime )
{
    if ( iFailState == TQUERY_CONNECT_FAILED )
    {
        set_fail_state( "Nem tudtam csatlakozni az adatbazishoz." );
        return;
    }
    else if ( iFailState == TQUERY_QUERY_FAILED )
    {
        set_fail_state( "Query Error" );
        return;
    }
    
    if ( iErrorCode )
    {
        log_amx( "%i - %s", iErrorCode, sErrorMsg );
        return;
    }
    
    new iId = iARRAY[ 0 ];
    if ( iId )
    {
        if ( iId > 100 )
        {
            iId -= 100;
            if ( SQL_NumResults( iQuery ) > 0 )
            {
                g_iLoggedIn[ iId ] = 3;
                ChatColor( iId, "Sikeresen bejelentkeztel." );
                MainMenu( iId, 0 );
            }
            else 
            {
                ChatColor( iId, "Hibas felhasznalonev es/vagy jelszo." );
                MainMenu( iId, 2 );
            }
        }
        else 
        {
            if ( SQL_NumResults( iQuery ) > 0 ) 
            {
                ChatColor( iId, "Ez a felhasznalonev mar foglalt." );
                MainMenu( iId, 1 );
            }
            else
            {
                g_iLoggedIn[ iId ] = 3;
                ChatColor( iId, "Sikeresen regisztraltal. Felhasznaloneved: %s, Jelszavad: %s.", g_sUserName[ iId ], g_sPassword[ iId ] );
                SaveDatas( iId );
                MainMenu( iId, 0 );
            }
        }
    }
    
    return;
}
 
public GetUserName( iId )
{
    static sUser[ 32 ];
    read_args( sUser, charsmax( sUser ) );
    remove_quotes( sUser );
    if ( strlen( sUser ) < 5 )
    {
        ChatColor( iId, "A felhasznalonevednek hosszabb kell hogy legyen mint 5 karakter!" );
        client_cmd( iId, "messagemode Felhasznalonev" );
    }
    else copy( g_sUserName[ iId ], charsmax( g_sUserName[ ] ), sUser );
    
    MainMenu( iId, g_iLoggedIn[ iId ] );
}
 
public GetPassword( iId )
{
    static sPass[ 32 ];
    read_args( sPass, charsmax( sPass ) );
    remove_quotes( sPass );
    if ( strlen( sPass ) < 5 )
    {
        ChatColor( iId, "A jelszavad hosszabb kell hogy legyen mint 5 karakter!" );
        client_cmd( iId, "messagemode Jelszo" );
    }
    else copy( g_sPassword[ iId ], charsmax( g_sPassword[ ] ), sPass );
 
    MainMenu( iId, g_iLoggedIn[ iId ] );
}
 
public client_putinserver( iId )
{
    g_iLoggedIn[ iId ] = 0;
    g_sUserName[ iId ] = "";
    g_sPassword[ iId ] = "";
}
 
public plugin_end( ) { SQL_FreeHandle( g_iSqlTuple ); }
 
stock ChatColor( iId, const sMessage[ ], any:... )
{
    static iPlrNum, iPlayers[ 32 ], sMsg[ 256 ], iIdMsg, iMsgLen = charsmax( sMsg );
    
    vformat( sMsg, iMsgLen, sMessage, 3 );
    format( sMsg, iMsgLen, "^4[%s]^1 %s", g_sPrefix, sMsg );
    
    if ( !iIdMsg ) iIdMsg = get_user_msgid( "SayText" );
    
    if ( iId )
    {
        iPlayers[ 0 ] = iId;
        iPlrNum = 1;
    }
    else get_players( iPlayers, iPlrNum, "ch" );
    
    for ( new i, iPId; i < iPlrNum; ++i )
    {
        iPId = iPlayers[ i ];
        
        if ( !is_user_connected( iPId ) ) continue;
        
        message_begin( MSG_ONE, iIdMsg, _, iPId );
        write_byte( iPId );
        write_string( sMsg );
        message_end( );
    }
}