09/11/2019, 11:20 AM
Estoy utilizando el sistema de r0ma y queria saber como podria ponerle algun callback al menu de registro, tipo si el nombre esta registrado la opcion de Registrar no se pueda utilizar..
(09/11/2019, 11:28 AM)Niper.-. escribió: [ -> ]y el code?
#include < amxmodx >
#include < sqlx >
#define PLUGIN "Sistema de cuentas MySQL/SQLite"
#define VERSION "1.1.5"
#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 Estado[33]
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 );
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;
}