#include < amxmodx >
#include < sqlx >
#define PLUGIN "Sistema de cuentas MySQL/SQLite"
#define VERSION "1.1.1"
#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
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 szTables[ ][ 12 ] = { "cuentas", "datos" };
new const szPrefix[ ] = "[Cuentas]";
new Handle:g_hTuple;
new g_maxplayers;
new g_id[ 33 ];
new g_estado[ 33 ];
new g_usuario[ 33 ][ 34 ];
new g_password[ 33 ][ 34 ];
new g_playername[ 33 ][ 33 ];
new g_experiencia[ 33 ];
enum {
OFFLINE,
LOGUEADO
};
enum
{
REGISTRAR_USUARIO,
REGISTRAR_PASSWORD,
LOGUEAR_USUARIO,
LOGUEAR_PASSWORD,
CARGAR_DATOS,
GUARDAR_DATOS
};
enum {
TABLA_CUENTAS,
TABLA_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,
)
*/
/* 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
)
*/
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_clcmd( "menuselect", "menu_select" );
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[ id ] == LOGUEADO || 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[ id ] == LOGUEADO )
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[ id ] != LOGUEADO ) {
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", "1" );
menu_additem( menu, "Ingresar", "2" );
menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER );
menu_display( id, menu );
menu_destroy( menu );
}
public login_menu( id, menu, item ) {
}
public menu_select( id ) {
if( g_estado[ id ] == OFFLINE ) {
new args[ 3 ];
read_args( args, charsmax( args ) );
if( str_to_num( args ) == 1 )
client_cmd( id, "messagemode CREAR_USUARIO" );
else
client_cmd( id, "messagemode LOGUEAR_USUARIO" );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
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 ] );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = REGISTRAR_USUARIO;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", szTables[ TABLA_CUENTAS ], 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 ] );
md5( g_password[ id ], g_password[ id ] );
new szQuery[ 256 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = REGISTRAR_PASSWORD;
get_user_name( id, g_playername[ id ], charsmax( g_playername[ ] ) );
#if defined MYSQL
formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s (Usuario, Password, Pj) VALUES (^"%s^", ^"%s^", ^"%s^"); INSERT INTO %s ( id ) VALUES ( LAST_INSERT_ID( ) )", szTables[ TABLA_CUENTAS ], g_usuario[ id ], g_password[ id ], g_playername[ id ], szTables[ TABLA_DATOS ] );
#else
formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s (Usuario, Password, Pj) VALUES (^"%s^", ^"%s^", ^"%s^"); INSERT INTO %s ( id ) VALUES ( last_insert_rowid( ) )", szTables[ TABLA_CUENTAS ], g_usuario[ id ], g_password[ id ], g_playername[ id ], szTables[ TABLA_DATOS ] );
#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 ] );
md5( g_usuario[ id ], g_usuario[ id ] );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = LOGUEAR_USUARIO;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", szTables[ TABLA_CUENTAS ], 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 ] );
md5( g_password[ id ], g_password[ id ] );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = LOGUEAR_PASSWORD;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^" AND Password=^"%s^"", szTables[ TABLA_CUENTAS ], g_usuario[ id ], g_password[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
return PLUGIN_HANDLED;
}
public cargar_datos( id ) {
new szQuery[ 256 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = CARGAR_DATOS;
formatex( szQuery, charsmax( szQuery ), "SELECT %s.id, %s.Pj, %s.Experiencia FROM %s LEFT JOIN %s ON %s.id = %s.id WHERE %s.Usuario = ^"%s^"",
szTables[ TABLA_CUENTAS ], szTables[ TABLA_CUENTAS ], szTables[ TABLA_DATOS ], szTables[ TABLA_CUENTAS ], szTables[ TABLA_DATOS ], szTables[ TABLA_CUENTAS ], szTables[ TABLA_DATOS ], szTables[ TABLA_CUENTAS ], g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
/* Query:
SELECT * FROM cuentas.id, cuentas.PJ, datos.Experiencia FROM cuentas LEFT JOIN datos ON cuentas.id = datos.id WHERE cuentas.Usuario = "user"
*/
}
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'", szTables[ TABLA_DATOS ], 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_USUARIO: {
if( !SQL_NumResults( Query ) )
client_cmd( id, "messagemode CREAR_PASSWORD" );
else {
client_print( id, print_chat, "%s El usuario ya existe.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
case REGISTRAR_PASSWORD: {
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 );
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.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
case LOGUEAR_PASSWORD: {
if( SQL_NumResults( Query ) ) {
cargar_datos( id );
}
else {
client_print( id, print_chat, "%s Contrasenia 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 );
SQL_ReadResult( Query, 1, g_playername[ id ], charsmax( g_playername[ ] ) );
g_experiencia[ id ] = SQL_ReadResult( Query, 2 );
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 ) {
/*new 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;
set_user_info( id, "name", g_playername[ id ] );
}
public event_round_start( ) {
for( new i = 1; i <= g_maxplayers; i++ ) {
if( g_estado[ i ] == LOGUEADO && is_user_connected( i ) )
guardar_datos( i );
}
}
public client_infochanged( id ) {
if( g_estado[ id ] == OFFLINE )
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_putinserver( id ) {
show_login_menu( id );
}
public client_disconnect( id ) {
if( g_estado[ id ] == LOGUEADO ) {
guardar_datos( id );
g_estado[ id ] = OFFLINE;
}
}
#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 );