|
Member
Join Date: Apr 2012
Location: Argentina
|

08-14-2013
, 18:53
Re: [SQL] Duda
|
#10
|
Code completo:
PHP Code:
#include < amxmodx > #include < sqlx > #include < hamsandwich > #include < cstrike >
#define PLUGIN "Sistema de cuentas MySQL/SQLite" #define VERSION "1.0.8" #define AUTHOR "Neeeeeeeeeel.- & 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 Creditos: shinoda Kiske Javivi ILUSION fearAR rak r0ma */
// #define MYSQL // sacarle las // a la linea de arriba para activar MySQL
// si quieren que el registro sea mas seguro descomenten esta linea para encriptar las contraseñas // #define SECURITY
#if defined MYSQL
// modificar estos datos acorde a los suyos si quieren usar mysql #define MYSQL_HOST "127.0.0.1" #define MYSQL_USER "root" #define MYSQL_PASS "root" #define MYSQL_DATEBASE "cuentas"
#else
#define SQLITE_DATEBASE "cuentas"
#endif
#define TABLE "cuentas"
// comentar esta linea para desactivar la proteccion de caracteres especiales //#define CHARACTERS_PROTECTION
#define TAG "[Cuentas]" new Handle:g_hTuple; new g_maxplayers; new g_usuario[ 33 ][ 33 ]; new g_password[ 33 ][ 35 ]; new g_estado[ 33 ]; new g_playername[ 33 ][ 33 ]; new g_id[ 33 ]; new g_experiencia[ 33 ];
enum { OFFLINE = 0, REGISTRAR_USUARIO, REGISTRAR_PASSWORD, LOGUEAR_USUARIO, LOGUEAR_PASSWORD, CARGAR_DATOS, GUARDAR_DATOS, LOGUEADO };
// esto es del team join de exolent stock const FIRST_JOIN_MSG[ ] = "#Team_Select"; stock const FIRST_JOIN_MSG_SPEC[ ] = "#Team_Select_Spect"; stock const INGAME_JOIN_MSG[ ] = "#IG_Team_Select"; stock const INGAME_JOIN_MSG_SPEC[ ] = "#IG_Team_Select_Spect"; const iMaxLen = sizeof( INGAME_JOIN_MSG_SPEC ); stock const VGUI_JOIN_TEAM_NUM = 2;
/* consulta MYSQL: CREATE TABLE cuentas ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , Usuario varchar(32) NOT NULL UNIQUE KEY, Password varchar(35) 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" ); RegisterHam( Ham_Spawn, "player", "fw_PlayerSpawn", true ); g_maxplayers = get_maxplayers( ); MySQLx_Init( ); }
public fw_PlayerSpawn( id ) { if( is_user_alive( id ) && g_estado[ id ] != LOGUEADO ) set_task( 2.0, "go_login", id ); }
public go_login( id ) { user_silentkill( id ); cs_set_user_team( id, CS_TEAM_SPECTATOR ); show_login_menu( id ); }
public message_VGUIMenu( iMsgid, iDest, id ) { if( get_msg_arg_int( 1 ) != VGUI_JOIN_TEAM_NUM ) return PLUGIN_CONTINUE; if( is_user_connected( id ) && g_estado[ id ] != LOGUEADO ) { show_login_menu( id ); return PLUGIN_HANDLED; } return PLUGIN_HANDLED; }
public message_ShowMenu( iMsgid, iDest, id ) { static sMenuCode[ iMaxLen ]; get_msg_arg_string( 4, sMenuCode, sizeof( sMenuCode ) - 1 ) if( equal( sMenuCode, FIRST_JOIN_MSG ) || equal( sMenuCode, FIRST_JOIN_MSG_SPEC ) || equal( sMenuCode, INGAME_JOIN_MSG ) || equal( sMenuCode, INGAME_JOIN_MSG_SPEC ) ) { if( is_user_connected( id ) && g_estado[ id ] != LOGUEADO ) { show_login_menu( id ); return PLUGIN_HANDLED; } } return PLUGIN_HANDLED; }
public clcmd_changeteam( id ) { if( g_estado[ id ] != LOGUEADO ) { show_login_menu( id ); return PLUGIN_HANDLED; } return PLUGIN_HANDLED; }
public show_login_menu( id ) { new menu = menu_create( "Menu de cuentas", "login_menu" ); menu_additem( menu, "Crear cuenta", "1" ); menu_additem( menu, "Ingresar", "2" ); menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER ); menu_display( id, menu ); }
public login_menu( id, menu, item ) client_cmd( id, "messagemode %s", item ? "LOGUEAR_USUARIO" : "CREAR_USUARIO" );
public reg_usuario( id ) { read_args( g_usuario[ id ], charsmax( g_usuario[ ] ) ); remove_quotes( g_usuario[ id ] ); trim( g_usuario[ id ] );
#if defined CHARACTERS_PROTECTION set_hudmessage( 255, 0, 0, 0.12, 0.24, 0, 6.0, 12.0 ); show_hudmessage( id, "Solo se pueden usar nombres con numeros y letras" ); if( contain_special_characters( id, g_usuario[ id ], "el usuario" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } #endif static szQuery[ 64 ], iData[ 2 ]; iData[ 0 ] = id; iData[ 1 ] = REGISTRAR_USUARIO; formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", TABLE, g_usuario[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 ); return PLUGIN_HANDLED; }
public reg_password( id ) { read_args( g_password[ id ], charsmax( g_password[ ] ) ); remove_quotes( g_password[ id ] ); trim( g_password[ id ] ); #if defined CHARACTERS_PROTECTION if( contain_special_characters( id, g_password[ id ], "la password" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } else if( contain_special_characters( id, g_playername[ id ], "el nombre" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } #endif static szQuery[ 128 ], iData[ 2 ]; iData[ 0 ] = id; iData[ 1 ] = REGISTRAR_PASSWORD; #if defined SECURITY static szBuffer[ 34 ]; md5( g_password[ id ], szBuffer ); formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s (Usuario, Password, Pj) VALUES (^"%s^", ^"%s^", ^"%s^")", TABLE, g_usuario[ id ], szBuffer, g_playername[ id ] ); #else formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s (Usuario, Password, Pj) VALUES (^"%s^", ^"%s^", ^"%s^")", TABLE, g_usuario[ id ], g_password[ id ], g_playername[ id ] ); #endif 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 ] ); #if defined CHARACTERS_PROTECTION set_hudmessage( 255, 0, 0, 0.12, 0.24, 0, 6.0, 8.0 ); show_hudmessage( id, "Solo se pueden usar nombres con numeros y letras" ); if(contain_special_characters( id, g_usuario[ id ], "el usuario" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } #endif
static szQuery[ 64 ], iData[ 2 ]; iData[ 0 ] = id; iData[ 1 ] = LOGUEAR_USUARIO; formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", TABLE, g_usuario[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 ); return PLUGIN_HANDLED; }
public log_password( id ) { read_args( g_password[ id ], charsmax( g_password[ ] ) ); remove_quotes( g_password[ id ] ); trim( g_password[ id ] ); #if defined CHARACTERS_PROTECTION if( contain_special_characters( id, g_password[ id ], "la password" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } #endif static szQuery[ 64 ], iData[ 2 ]; iData[ 0 ] = id; iData[ 1 ] = LOGUEAR_PASSWORD; formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", TABLE, g_usuario[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 ); return PLUGIN_HANDLED; }
public guardar_datos( id ) { if( g_estado[ id ] != LOGUEADO ) return; static szQuery[ 128 ], iData[ 2 ]; iData[ 0 ] = id; iData[ 1 ] = GUARDAR_DATOS; formatex( szQuery, charsmax( szQuery ), "UPDATE %s SET Experiencia='%d' WHERE id='%d'", TABLE, g_experiencia[ id ], g_id[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 ); }
public cargar_datos( id ) { static szQuery[ 128 ], iData[ 2 ]; iData[ 0 ] = id; iData[ 1 ] = CARGAR_DATOS; formatex( szQuery, charsmax( szQuery ), "SELECT id, Experiencia FROM %s WHERE Usuario=^"%s^"", TABLE, g_usuario[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 ); }
// Javivi code:D public DataHandler( failstate, Handle:Query, error[ ], error2, data[ ], datasize, Float:time ) { static id; id = data[ 0 ]; if( !is_user_connected( id ) ) return PLUGIN_HANDLED
switch( failstate ) { case TQUERY_CONNECT_FAILED: { log_to_file( "SQL_LOG_TQ.txt", "Error en la conexion al MySQL [%i]: %s", error2, error ); return PLUGIN_CONTINUE; } 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_USUARIO: { if( !SQL_NumResults( Query ) ) client_cmd( id, "messagemode CREAR_PASSWORD" ); else { client_print( id, print_chat, "%s El usuario ya existe.", TAG ); client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); } } case REGISTRAR_PASSWORD: { if( failstate < TQUERY_SUCCESS ) { if( strfind( error, "Duplicate" ) != -1 ) { if( strfind( error, "Usuario" ) != -1 ) client_print( id, print_chat, "%s El usuario ya existe.", TAG );
else if( strfind( error, "Pj" ) != -1 ) client_print( id, print_chat, "%s El nombre de personaje esta en uso.", TAG ); } else client_print( id, print_chat, "%s Error al crear la cuenta. Intente nuevamente.", TAG ); client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); } else { client_print( id, print_chat, "%s Tu cuenta ha sido creada correctamente.", TAG ); cargar_datos( id ); } } case LOGUEAR_USUARIO: { if( SQL_NumResults( Query ) ) client_cmd( id, "messagemode LOGUEAR_PASSWORD" ); else { client_print( id, print_chat, "%s El usuario no existe.", TAG ); client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); } } case LOGUEAR_PASSWORD: { if( SQL_NumResults( Query ) ) { static szPass[ 33 ]; SQL_ReadResult( Query, 2, szPass, charsmax( szPass ) ); #if defined SECURITY static szBuffer[ 34 ]; md5( szPass, szBuffer ); if( equal( szBuffer, szPass ) ) #else if( equal( g_password[ id ], szPass ) ) #endif { SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) ); cargar_datos( id ); } else { client_print( id, print_chat, "[Cuenta] Contrasenia incorrecta." ); client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); } } } // Ejemplo de como cargar y guardar datos. case CARGAR_DATOS: { if( SQL_NumResults( Query ) ) { g_id[ id ] = SQL_ReadResult( Query, 0 ); // Cargamos los datos de al columna 'Experiencia' en la variable global g_experiencia g_experiencia[ id ] = SQL_ReadResult( Query, 1 ); func_login_success( id ); } else { client_print( id, print_chat, "%s Error al cargar los datos, intente nuevamente.", TAG ); g_estado[id] = OFFLINE; show_login_menu( id ); } } case GUARDAR_DATOS: { if( failstate < TQUERY_SUCCESS ) console_print( id, "%s Error en el guardado de datos.", TAG ); else console_print( id, "%s Datos guardados.", TAG ); } } return PLUGIN_CONTINUE; }
public func_login_success( id ) { // esto lo manda a un team random (con 1 a TT, con 2 a CT y creo que con 6 a SPEC.) static msg_block; msg_block = get_msg_block( id ); set_msg_block( id, BLOCK_SET ); engclient_cmd( id, "jointeam", "5" ); engclient_cmd( id, "joinclass", "5" ); set_msg_block( id, msg_block ); g_estado[id] = LOGUEADO; client_cmd( id, "name ^"%s^"", g_playername[ id ] ); }
stock contain_special_characters( id, const str[ ], const type[ ] ) { static iLen; iLen = strlen( str ) for( new i = 0; i < iLen; i++ ) { if( !isalpha( str[ i ] ) && !isdigit( str[ i ] ) ) { client_print( id, print_chat, "%s Caracter especial invalido en %s: ^"%c^"", TAG, type, str[ i ] ); console_print( id, "%s Caracter especial invalido en %s: ^"%c^"", TAG, type, str[ i ] ); return 1; } } return 0; }
public event_round_start() { for(new i = 1; i <= g_maxplayers; i++) { if(is_user_connected(i)) guardar_datos(i) } }
public client_infochanged( id ) { if( !is_user_connected( id ) ) return PLUGIN_HANDLED; static szNewname[ 33 ], szNewname2[ 33 ]; get_user_info( id, "name", szNewname, charsmax( szNewname ) ); get_user_name( id, szNewname2, charsmax(szNewname2 ) ); if( ( !equal( g_playername[ id ], szNewname[ id ] ) || !equal( g_playername[ id ], szNewname2[ id ] ) ) && g_estado[ id ] == LOGUEADO) { set_user_info( id, "name", g_playername[ id ] ); client_cmd( id, "name ^"%s^"", g_playername[ id ] ); return PLUGIN_HANDLED; } return PLUGIN_CONTINUE; }
public client_putinserver( id ) { g_estado[ id ] = OFFLINE; get_user_name( id, g_playername[ id ], charsmax( g_playername[ ] ) ); show_login_menu( id ); }
public client_disconnect(id) guardar_datos(id)
#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 );
Parte de cargar:
PHP Code:
public cargar_datos( id ) { static szQuery[ 128 ], iData[ 2 ]; iData[ 0 ] = id; iData[ 1 ] = CARGAR_DATOS; formatex( szQuery, charsmax( szQuery ), "SELECT id, Experiencia FROM %s WHERE Usuario=^"%s^"", TABLE, g_usuario[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 ); }
Es que cuando comente no me apareció la explicación de matians. Buenisima la explicación, la entendi bastante bien
|
|