Junior Member
|
08-25-2012
, 19:16
Re: Sistema de cuentas MYSQL/SQLITE con/sin encriptación
|
#84
|
Saludos, espero que te encuentres bien.
Estoy probando tu sistema de Registro y me va bien, se registra y todo.
pero tengo varios problemitas.
1-si dejo activado el: #define CHARACTERS_PROTECTION NO me deja registrarme ya que dice que introduje caracteres invalidos, sale: solo letras y numeros. aun cuando introduje puras letras.
2-Para probar el guardado y cargado de datos, decididi agregarle algo simple: Ammopacks. el detalle es que no los carga, ni los guarda. aun estando en la DB, borre la tabla aver si almenos intentaba buscarla y si, no deja loguear porque no esta la tabla, la creo y loguea normal la cosa es que no carga ni guarda los datos del: g_ammopacks. aqui como lo modifique: me guie x el de los comentarios anteriores...
PHP Code:
#include <amxmodx> #include <sqlx>
#define PLUGIN "Sistema de cuentas MySQL/SQLite" #define VERSION "1.0.6" #define AUTHOR "Neeeeeeeeeel.-"
#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 "xxx" #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
new Handle:g_hTuple; new pcvar_saveround; new g_maxplayers; new Usuario[ 33 ][ 33 ]; new Password[ 33 ][ 35 ]; new g_status[ 33 ]; new g_playername[ 33 ][ 33 ]; new g_id[ 33 ]; new g_experiencia[ 33 ]; new g_ammopacks[ 33 ];
enum { OFFLINE, LOG_USER, LOG_PASSWORD, REG_USER, REG_PASSWORD, CARGAR_DATOS, GUARDAR_DATOS, LOGGED }
// 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" ); // Esta cvar activada hace que se guarden los datos cada vez que comienza una ronda pcvar_saveround = register_cvar( "guardar_por_rondas", "1" ); g_maxplayers = get_maxplayers( ); MySQLx_Init( ); register_clcmd( "test", "test" ); }
public test( id ) { g_experiencia[ id ]++; guardar_datos( 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_status[ id ] == OFFLINE ) { 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_status[ id ] == OFFLINE ) { show_login_menu( id ); return PLUGIN_HANDLED; } } return PLUGIN_HANDLED; }
public clcmd_changeteam( id ) { if( g_status[ id ] <= REG_PASSWORD ) { 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_display( id, menu, 0 ); }
public login_menu( id, menu, item) { new iData[ 6 ]; new iAccess; new iCallback; new iName[ 64 ]; menu_item_getinfo( menu, item, iAccess, iData, 5, iName, 63, iCallback ) ; switch( str_to_num( iData ) ) { case 1: client_cmd( id, "messagemode CREAR_USUARIO" ); case 2: client_cmd( id, "messagemode LOGUEAR_USUARIO" ); } }
public reg_usuario( id ) { new user[ 33 ]; read_args( user, charsmax( user ) ); remove_quotes( user ); trim( user );
#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, user, "el usuario" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } #endif copy( Usuario[ id ], charsmax( Usuario[ ] ), user ); new szQuery[ 64 ], iData[ 1 ]; iData[ 0 ] = id; formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", TABLE, user ); g_status[ id ] = REG_USER; SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 1 ); return PLUGIN_HANDLED; }
public reg_password( id ) { new pass[ 33 ]; read_args( pass, charsmax( pass ) ); remove_quotes( pass ); trim( pass ); #if defined CHARACTERS_PROTECTION if( contain_special_characters( id, pass, "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 new szQuery[ 128 ], iData[ 1 ]; iData[ 0 ] = id; g_status[ id ] = REG_PASSWORD; #if defined SECURITY new szBuffer[ 34 ]; md5( pass, szBuffer ); formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s ( Usuario, Password, Pj ) VALUES ( ^"%s^", ^"%s^", ^"%s^" )", TABLE, Usuario[ id ], szBuffer, g_playername[ id ] ); #else formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s ( Usuario, Password, Pj ) VALUES ( ^"%s^", ^"%s^", ^"%s^" )", TABLE, Usuario[ id ], pass, g_playername[ id ] ); #endif SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 1 ); return PLUGIN_HANDLED; }
public log_usuario( id ) { new user[ 33 ]; read_args( user, charsmax( user ) ); remove_quotes( user ); trim( user ); #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, user, "el usuario" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } #endif copy( Usuario[ id ], charsmax( Usuario[ ] ), user ); new szQuery[ 64 ], iData[ 1 ]; iData[ 0 ] = id; g_status[ id ] = LOG_USER; formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", TABLE, user ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 1 ); return PLUGIN_HANDLED; }
public log_password( id ) { new pass[ 33 ]; read_args( pass, charsmax( pass ) ); remove_quotes( pass ); trim( pass ); #if defined CHARACTERS_PROTECTION if( contain_special_characters( id, pass, "la password" ) ) { client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); return PLUGIN_HANDLED; } #endif copy( Password[ id ], charsmax( Password[ ] ), pass ); new szQuery[ 64 ], iData[ 1 ]; iData[ 0 ] = id; g_status[ id ] = LOG_PASSWORD; formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", TABLE, Usuario[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 1 ); return PLUGIN_HANDLED; }
public guardar_datos( id ) { g_status[ id ] = GUARDAR_DATOS; new szQuery[ 128 ], iData[ 1 ]; iData[ 0 ] = id; formatex( szQuery, charsmax( szQuery ), "UPDATE %s SET Experiencia='%d', APs='%d' WHERE id='%d'", TABLE, g_experiencia[ id ], g_ammopacks[id], g_id[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 1 ); }
public cargar_datos( id ) { g_status[ id ] = CARGAR_DATOS; new szQuery[ 128 ], iData[ 1 ]; iData[ 0 ] = id; formatex( szQuery, charsmax( szQuery ), "SELECT Experiencia, APs FROM %s WHERE id='%d'", TABLE, g_id[ id ] ); SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 1 ); }
// 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( g_status[ id ] ) { case REG_USER: { if( !SQL_NumResults( Query ) ) client_cmd( id, "messagemode CREAR_PASSWORD" ); else { client_print( id, print_chat, "[Cuentas] El usuario ya existe." ); client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); } } case REG_PASSWORD: { if( failstate < TQUERY_SUCCESS ) { if( strfind( error, "Duplicate" ) != -1 ) { if( strfind( error, "Usuario" ) != -1 ) client_print( id, print_chat, "[Cuentas] El usuario ya existe." );
else if( strfind( error, "Pj" ) != -1 ) client_print( id, print_chat, "[Cuentas] El nombre de personaje esta en uso." ); } else client_print( id, print_chat, "[Cuentas] Error al crear la cuenta. Intente nuevamente." ); client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); } else { client_print( id, print_chat, "[Cuentas] Tu cuenta ha sido creada correctamente." ); func_login_success( id ); } } case LOG_USER: { if( SQL_NumResults( Query ) ) client_cmd( id, "messagemode LOGUEAR_PASSWORD" ); else { client_print( id, print_chat, "[Cuentas] El usuario no existe." ); client_cmd( id, "spk buttons/button10.wav" ); show_login_menu( id ); } } case LOG_PASSWORD: { if( SQL_NumResults( Query ) ) { new szPass[ 33 ]; SQL_ReadResult( Query, 2, szPass, charsmax( szPass ) ); #if defined SECURITY new szBuffer[ 34 ]; md5( szPass, szBuffer ); if( equal( szBuffer, szPass ) ) #else if( equal( Password[ id ], szPass ) ) #endif { SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) ); g_id[ id ] = SQL_ReadResult( Query, 0 ); 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 ) ) { // Cargamos los datos de al columna 'Experiencia' en la variable global g_experiencia g_experiencia[ id ] = SQL_ReadResult( Query, 0 ); g_ammopacks[ id ] = SQL_ReadResult( Query, 1 ); func_login_success( id ); } else { client_print( id, print_chat, "[Cuentas] Error al cargar los datos, intente nuevamente." ); g_status[ id ] = OFFLINE; show_login_menu( id ); } } case GUARDAR_DATOS: { if( failstate < TQUERY_SUCCESS ) console_print( id, "[Cuentas] Error en el guardado de datos." ); else console_print( id, "[Cuentas] Datos guardados." ); g_status[ id ] = LOGGED; } } 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.) new 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_status[ id ] = LOGGED; client_cmd( id, "name ^"%s^"", g_playername[ id ] ); }
stock contain_special_characters( id, const str[ ], const type[ ] ) { static success = 0, iLen; iLen = strlen( str ); for(new i = 0; i < iLen; i++ ) { if( !isalpha( str[ i ] ) && !isdigit( str[ i ] ) ) { client_print( id, print_chat, "[Cuentas] Caracter especial invalido en %s: ^"%c^"", type, str[ i ] ); console_print( id, "[Cuentas] Caracter especial invalido en %s: ^"%c^"", type, str[ i ] ); success = 1; } } if( success ) return 1; else return 0; return -1; }
public event_round_start( ) { if( get_pcvar_num( pcvar_saveround ) ) { 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; get_user_name( id, g_playername[ id ], charsmax( g_playername[ ] ) ); // esto es para que no se pueda cambiar el nombre new 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_status[ id ] == LOGGED) { set_user_info( id, "name", g_playername[ id ] ); client_cmd( id, "name ^"%s^"", g_playername[ id ] ); return PLUGIN_HANDLED; } return PLUGIN_HANDLED; }
public client_putinserver( id ) { g_status[ id ] = OFFLINE; 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." ); // si no conecta pausea el plugin 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" ); // si no conecta pausea el plugin return pause( "a" ); } g_hTuple = SQL_MakeDbTuple( "", "", "", SQLITE_DATEBASE ); return PLUGIN_CONTINUE; } #endif
public plugin_end( ) SQL_FreeHandle( g_hTuple ); /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang11274\\ f0\\ fs16 \n\\ par } */
Gracias y que tengas un buen dia.
|
|