Sistemas de cuenta MySQL
#1
Editado, cierren.
#2
el modulo se activa solo automaticamente al cagar el plugin , vos tenes que fijarte si vas a usarlo por mysql o por sqlite , en el caso de ser mysql tenes que tener una base de datos que es externa al servidor , si es sqlite usas la base de datos interna que va en data/sqlite3 el archivo llamado cuentas.sq3
#3
(14/01/2018, 11:13 AM)Nelo escribió: el modulo se activa solo automaticamente al cagar el plugin , vos tenes que fijarte si vas a usarlo por mysql o por sqlite , en el caso de ser mysql tenes que tener una base de datos que es externa al servidor , si es sqlite usas la base de datos interna que va en data/sqlite3 el archivo llamado cuentas.sq3

Ya la conexión la he hecho, desde el phpmyadmin de mi hosting me gustaría saber, como puedo hacer que el sistema de cuentas sea puro MySQL este es el código

Código:
#include < amxmodx >
#include < sqlx >

#define PLUGIN "Sistema de cuentas MySQL/SQLite"
#define VERSION "1.1.2"
#define AUTHOR "r0ma"

/*

Changelog:

    1.0.0:
        -Posteo del plugin.
        
    1.0.1:
        -Opitmizacion en el chequeo de una celda de un array.
        
    1.0.2:
        -Proteccion SQL Injection.
        
    1.0.3:
        -SQL_PrepareQuery --> SQL_ThreadQuery.
        -Optimizacion de tabla MYSQL/SQLITE.
        -Fix en la conexión SQLite.
        
    1.0.4:
        -Proteccion: No se permiten ingresar caracteres especiales.
        -Optimización: Se borraron los condicionales de chequeo de " " y TABLE.
          
    1.0.5
        -Bugfix: Con SQL_ThreadQuery no se usa SQL_Connect
    
    1.0.6
        -Varios fixes de errores generales.
        
    1.0.7
        -Revisado & fixeado por r0ma
        
    1.0.8
        -Fix bug que entran al juego sin loguearse arreglado
        
    1.0.9
        -Fix bug: Ham_Spawn deberia estar en post
        -Fix de variable no definida
        -Update ZP version
    
    1.1.0
        -Fix bug: Se bugean los menu despues de loguear.
        -Fix bug: La parte de md5 estaba mal echa.
        -Removido el Spawn ya no sirve.
        -Fix errores
    1.1.1
        -Removido contain_special_characters ( ahora encripta el user y la pw )
        -Modificaciones, fix
    1.1.2
        -Removido el hook de "menuselect"
        -Ahora usa menos querys
        -Modificada la variable "g_estado"
    
    Creditos:
        shinoda
        Kiske
        Javivi
        ILUSION
        fearAR
        rak
        Neeeeeeeeeel.-
*/

//#define MYSQL

#if defined MYSQL

#define MYSQL_HOST "127.0.0.1"
#define MYSQL_USER "root"
#define MYSQL_PASS ""
#define MYSQL_DATEBASE "cuentas"

#else

#define SQLITE_DATEBASE "cuentas"

#endif

new const szTable[ ] = "cuentas";
new const szPrefix[ ] = "[Cuentas]";

new Handle:g_hTuple;
new g_maxplayers;

new g_estado;
new g_id[ 33 ];
new g_usuario[ 33 ][ 34 ];
new g_password[ 33 ][ 34 ];
new g_playername[ 33 ][ 33 ];

new g_experiencia[ 33 ];

enum
{
    REGISTRAR_CUENTA,
    LOGUEAR_CUENTA,
    CARGAR_DATOS,
    GUARDAR_DATOS
};

/* consulta MYSQL:
CREATE TABLE cuentas
(
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    Usuario varchar(34) NOT NULL UNIQUE KEY,
    Password varchar(34) NOT NULL,
    Pj varchar(32) NOT NULL UNIQUE KEY,
    Experiencia int(10) NOT NULL DEFAULT '0'
)
*/

/* consulta SQLite:
CREATE TABLE "cuentas"
(
    "id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,
    "Usuario" VARCHAR NOT NULL  UNIQUE,
    "Password" VARCHAR NOT NULL,
    "Pj" VARCHAR NOT NULL  UNIQUE,
    "Experiencia" INTEGER DEFAULT 0
)
*/


public plugin_init( )  {
    register_plugin( PLUGIN, VERSION, AUTHOR );

    register_clcmd( "CREAR_USUARIO", "reg_usuario" );
    register_clcmd( "CREAR_PASSWORD", "reg_password" );
    register_clcmd( "LOGUEAR_USUARIO", "log_usuario" );
    register_clcmd( "LOGUEAR_PASSWORD", "log_password" );
    
    register_clcmd( "chooseteam", "clcmd_changeteam" );
    register_clcmd( "jointeam", "clcmd_changeteam" );
    
    register_message( get_user_msgid( "ShowMenu" ), "message_ShowMenu" );
    register_message( get_user_msgid( "VGUIMenu" ), "message_VGUIMenu" );
    
    register_event( "HLTV", "event_round_start", "a", "1=0", "2=0" );
    
    g_maxplayers = get_maxplayers( );
    
    MySQLx_Init( );
}

public message_VGUIMenu( iMsgid, iDest, id ) {
    if( g_estado & (1<<id) ||  get_msg_arg_int( 1 ) != 2 )
        return PLUGIN_CONTINUE;
    
    show_login_menu( id );
    return PLUGIN_HANDLED;
}

public message_ShowMenu( iMsgid, iDest, id ) {
    if( g_estado & (1<<id) )
        return PLUGIN_CONTINUE;
    
    static sMenuCode[ 33 ];
    get_msg_arg_string( 4, sMenuCode, charsmax( sMenuCode ) );
    
    if( containi( sMenuCode, "Team_Select" ) != -1 ) {
        show_login_menu( id );
        return PLUGIN_HANDLED;
    }
    
    return PLUGIN_CONTINUE;
}

public clcmd_changeteam( id ) {
    if( ~g_estado & (1<<id) ) {
        show_login_menu( id );
        
        return PLUGIN_HANDLED;
    }
    
    return PLUGIN_CONTINUE;
}

public show_login_menu( id ) {
    new menu = menu_create( "Menu de cuentas", "login_menu" );
    
    menu_additem( menu, "Crear cuenta" );
    menu_additem( menu, "Ingresar" );
    
    menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER );
    
    menu_display( id, menu );
    
    return PLUGIN_HANDLED;
}

public login_menu( id, menu, item ) {
    
    switch( item ) {
        case 0: client_cmd( id, "messagemode CREAR_USUARIO" );
        case 1: client_cmd( id, "messagemode LOGUEAR_USUARIO" );
    }
    
    return PLUGIN_HANDLED;
}

public reg_usuario( id ) {
    read_args( g_usuario[ id ], charsmax( g_usuario[ ] ) );
    remove_quotes( g_usuario[ id ] );
    trim( g_usuario[ id ] );
    
    md5( g_usuario[ id ], g_usuario[ id ] );
    
    client_cmd( id, "messagemode CREAR_PASSWORD" );
    
    return PLUGIN_HANDLED;
}

public reg_password( id ) {
    read_args( g_password[ id ], charsmax( g_password[ ] ) );
    remove_quotes( g_password[ id ] );
    trim( g_password[ id ] );
    md5( g_password[ id ], g_password[ id ] );
    
    new szQuery[ 256 ], iData[ 2 ];
    
    iData[ 0 ] = id;
    iData[ 1 ] = REGISTRAR_CUENTA;
    
    get_user_name( id, g_playername[ id ], charsmax( g_playername[ ] ) );
    
    formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s (Usuario, Password, Pj) VALUES (^"%s^", ^"%s^", ^"%s^")", szTable, g_usuario[ id ], g_password[ id ], g_playername[ id ] );
    SQL_ThreadQuery(g_hTuple, "DataHandler", szQuery, iData, 2);
    
    return PLUGIN_HANDLED;
}

public log_usuario( id ) {
    read_args( g_usuario[ id ], charsmax( g_usuario[ ] ) );
    remove_quotes( g_usuario[ id ] );
    trim( g_usuario[ id ] );
    md5( g_usuario[ id ], g_usuario[ id ] );
    
    client_cmd( id, "messagemode LOGUEAR_PASSWORD" );
    
    return PLUGIN_HANDLED;
}

public log_password( id ) {
    read_args( g_password[ id ], charsmax( g_password[ ] ) );
    remove_quotes( g_password[ id ] );
    trim( g_password[ id ] );
    md5( g_password[ id ], g_password[ id ] );
    
    new szQuery[ 128 ], iData[ 2 ];
    
    iData[ 0 ] = id;
    iData[ 1 ] = LOGUEAR_CUENTA;
    
    formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^" AND Password=^"%s^"", szTable, g_usuario[ id ], g_password[ id ] );
    SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
    
    return PLUGIN_HANDLED;
}

public guardar_datos( id ) {
    new szQuery[ 128 ], iData[ 2 ];
    
    iData[ 0 ] = id;
    iData[ 1 ] = GUARDAR_DATOS;
    
    formatex( szQuery, charsmax( szQuery ), "UPDATE %s SET Experiencia='%d' WHERE id='%d'", szTable, g_experiencia[ id ], g_id[ id ] );
    SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
}

public DataHandler( failstate, Handle:Query, error[ ], error2, data[ ], datasize, Float:time ) {
    static id;
    id = data[ 0 ];
    
    if( !is_user_connected( id ) )
        return;

    switch( failstate ) {
        case TQUERY_CONNECT_FAILED: {
            log_to_file( "SQL_LOG_TQ.txt", "Error en la conexion al MySQL [%i]: %s", error2, error );
            return;
        }
        case TQUERY_QUERY_FAILED:
            log_to_file( "SQL_LOG_TQ.txt", "Error en la consulta al MySQL [%i]: %s", error2, error );
    }
    
    switch( data[ 1 ] ) {
        case REGISTRAR_CUENTA: {
            if( failstate < TQUERY_SUCCESS ) {
                if( containi( error, "Usuario" ) != -1 )
                    client_print( id, print_chat, "%s El usuario ya existe.", szPrefix );

                else if( containi( error, "Pj" ) != -1 )
                    client_print( id, print_chat, "%s El nombre de personaje esta en uso.", szPrefix );
                else
                    client_print( id, print_chat, "%s Error al crear la cuenta. Intente nuevamente.", szPrefix );
                
                client_cmd( id, "spk buttons/button10.wav" );
                
                show_login_menu( id );
            }
            else {
                client_print( id, print_chat, "%s Tu cuenta ha sido creada correctamente.", szPrefix );
                
                new szQuery[ 128 ], iData[ 2 ];
                
                iData[ 0 ] = id;
                iData[ 1 ] = CARGAR_DATOS;
                
                formatex( szQuery, charsmax( szQuery ), "SELECT id FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
                SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
            }
            
        }
        case LOGUEAR_CUENTA: {
            if( SQL_NumResults( Query ) ) {
                g_id[ id ] = SQL_ReadResult( Query, 0 );
                SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) );                    
                
                // Cargamos datos
                g_experiencia[ id ] = SQL_ReadResult( Query, 4 );
                
                func_login_success( id );
            }
            else {
                client_print( id, print_chat, "%s Usuario o Contraseñ incorrecta.", szPrefix );
                client_cmd( id, "spk buttons/button10.wav" );
                
                show_login_menu( id );
            }
        }
        case CARGAR_DATOS: {
            if( SQL_NumResults( Query ) ) {
                g_id[ id ] = SQL_ReadResult( Query, 0 );
                
                // Ponemos la exp en 0 para el nuevo usuario.
                g_experiencia[ id ] = 0;
                
                func_login_success( id );
            }
            else {
                client_print( id, print_chat, "%s Error al cargar los datos, intente nuevamente.", szPrefix );
                show_login_menu( id );
            }
        }
        case GUARDAR_DATOS: {
            if( failstate < TQUERY_SUCCESS )
                console_print( id, "%s Error en el guardado de datos.", szPrefix );
            
            else
                console_print( id, "%s Datos guardados.", szPrefix );
        }
    }
}

public func_login_success( id ) {
    engclient_cmd( id, "jointeam", "5" );
    engclient_cmd( id, "joinclass", "5" );
    
    g_estado |= (1<<id);
    
    set_user_info( id, "name", g_playername[ id ] );
}

public event_round_start( ) {
    for( new i = 1; i <= g_maxplayers; i++ ) {
        if( g_estado & (1<<i) && is_user_connected( i ) )
            guardar_datos( i );
    }
}        

public client_infochanged( id ) {
    if( ~g_estado & (1<<id) )
        return PLUGIN_CONTINUE;
    
    static name[ 33 ];
    get_user_info( id, "name", name, charsmax( name ) );
    
    if( !equal( g_playername[ id ], name ) ) {
        set_user_info( id, "name", g_playername[ id ] );
        
        return PLUGIN_HANDLED;
    }
    
    return PLUGIN_CONTINUE;
}

public client_disconnect(  id ) {
    
    if( g_estado & (1<<id) ) {
        guardar_datos( id );
        
        g_estado &= ~(1<<id);
    }
    
    g_usuario[ id ][ 0 ] = '^0';
    g_password[ id ][ 0 ] = '^0';
}

#if defined MYSQL
public MySQLx_Init( )
{
    g_hTuple = SQL_MakeDbTuple( MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATEBASE );
    
    if( !g_hTuple )
    {
        log_to_file( "SQL_ERROR.txt", "No se pudo conectar con la base de datos." );
        return pause( "a" );
    }
    
    return PLUGIN_CONTINUE;
}
#else

// Gracias ILUSION por fixear la conexión
public MySQLx_Init( )
{
    new get_type[ 12 ];
    
    SQL_SetAffinity( "sqlite" );
    
    SQL_GetAffinity( get_type, sizeof get_type );

    if( !equali( get_type, "sqlite" ) )
    {
        log_to_file( "SQLITE_ERROR.txt", "Error de conexion" );
        return pause( "a" );
    }
    
    g_hTuple = SQL_MakeDbTuple( "", "", "", SQLITE_DATEBASE );
    
    return PLUGIN_CONTINUE
}
#endif

public plugin_end( )
    SQL_FreeHandle( g_hTuple );
#4
//#define MYSQL sacale el //


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)