[Mysql] Detectar cuando el nick este guardado
#1
Estoy tratando de hacer que si el nick ya este registrado en la base de datos y otro user quiera entrar con ese mismo nick lo kicke, lo tengo en el guardado ya que al entrar y spawnear tengo para que le guarte sus stats
Código:
public handler_actualizar(FailState, Handle:Query, Error[], Errcode, data[], DataSize) {
    new id = data[0];

    if(FailState < TQUERY_SUCCESS) {
        if(containi(Error, "name") != -1) {
            server_cmd("kick #%d ^"Nick ya registrado, cambialo.^"", get_user_userid(id));
            return;
        }
        else {
            server_cmd("kick #%d ^"Al parecer ocurrio un error, reporta el error: 552148 en nuestro grupo: google.com^"", get_user_userid(id));
            return;
        }
    }

    if(fail_query(FailState, Error, Errcode)) {
        console_print(id, "Error al registrar.");
        return;
    }
    SQL_FreeHandle(Query);
    if(!is_user_connected(id)) {
        return;
    }
    console_print(id, "Datos Actualizados.");
}

El problema es que no me kickea y me deja entrar.

tabla
Código:
public CheckTabla() {
    new szTemp[1500], len = 0;
    len += formatex(szTemp[len], charsmax(szTemp)-len,
    "CREATE TABLE IF NOT EXISTS %s \
    (id int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, \
    steamid varchar(40) NOT NULL,\
    name varchar(33) NOT NULL UNIQUE KEY, \
    rangos int(5) NOT NULL DEFAULT '0',\
    frags int(10) NOT NULL DEFAULT '0', ", SQLX_TABLA);
    
    len += formatex(szTemp[len], charsmax(szTemp)-len,
    "deaths int(10) NOT NULL DEFAULT '0', \
    headshots int(10) NOT NULL DEFAULT '0', \
    cuchillo int(10) NOT NULL DEFAULT '0', \
    captured int(10) NOT NULL DEFAULT '0', \
    returned int(10) NOT NULL DEFAULT '0',");

    len += formatex(szTemp[len], charsmax(szTemp)-len,
    "rankname varchar(64) NOT NULL, \
    rankurl varchar(130) NOT NULL, \
    ProfileImg varchar(170) NOT NULL, \
    ProfileUrl varchar(128) NOT NULL);");

    SQL_ThreadQuery(g_tuple, "handler_checktable", szTemp);
}
Responder
#2
(16/08/2022, 06:21 PM)alexiways escribió: Pregunta cómo estás obteniendo ahí el name en tu base dedatos?

lo hago mediante php
Código PHP:
$query $db->query('SELECT rankurl, ProfileImg, ProfileUrl, name, frags, rankname, deaths, headshots, cuchillo, captured, returned FROM '.$dbTable.' ORDER BY frags DESC LIMIT '.$desde.', '.$por_pagina.'') or die ("Error en la consulta: ".mysqli_error($db));
            while (
$top $query->fetch_array(MYSQLI_ASSOC))
            {
                <td><?php echo substr($top['name'], 015?></td>
            } 
Responder
#3
Y otra cosa cómo haces la consulta sql? Xq sino como estás obteniendo el name de columa 'name'.?

Eso es php? No entendí o que estás haciendo exactamente.
Responder
#4
(16/08/2022, 06:24 PM)alexiways escribió: Y otra cosa cómo haces la consulta sql? Xq sino como estás obteniendo el name de columa 'name'.?

Eso es php? No entendí o que estás haciendo exactamente.

Código PHP:
public CheckTabla() {
    new 
szTemp[1500], len 0;
    
len += formatex(szTemp[len], charsmax(szTemp)-len
    
"CREATE TABLE IF NOT EXISTS %s \
    (id int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, \
    steamid varchar(40) NOT NULL,\
    name varchar(33) NOT NULL UNIQUE KEY, \
    rangos int(5) NOT NULL DEFAULT '0',\
    frags int(10) NOT NULL DEFAULT '0', "
SQLX_TABLA);
    
    
len += formatex(szTemp[len], charsmax(szTemp)-len
    
"deaths int(10) NOT NULL DEFAULT '0', \
    headshots int(10) NOT NULL DEFAULT '0', \
    cuchillo int(10) NOT NULL DEFAULT '0', \
    captured int(10) NOT NULL DEFAULT '0', \
    returned int(10) NOT NULL DEFAULT '0',"
);

    
len += formatex(szTemp[len], charsmax(szTemp)-len,
    
"rankname varchar(64) NOT NULL, \
    rankurl varchar(130) NOT NULL, \
    ProfileImg varchar(170) NOT NULL, \
    ProfileUrl varchar(128) NOT NULL);"
);

    
SQL_ThreadQuery(g_tuple"handler_checktable"szTemp);
}

public 
handler_checktable(FailStateHandle:QueryError[], ErrcodeData[], DataSize) {
    if(
fail_query(FailStateErrorErrcode)) {
        
server_print("Error al crear la tabla.");
        return 
PLUGIN_HANDLED;
    }
    
server_print("Tabla creada.");
    return 
PLUGIN_CONTINUE;
}

PlayerLoad(index) {
    new 
szTemp[100], data[2], szAuthid[64];

    if(
is_user_steam(index))
    {
        
get_user_authid(indexszAuthidcharsmax(szAuthid));
    }
    else
    {
        
copy(szAuthidcharsmax(szAuthid), g_PlayerStats[index][Player_Nombre]);
    }
    
formatex(szTempcharsmax(szTemp), "SELECT * FROM %s WHERE steamid = ^"%s^""SQLX_TABLAszAuthid);
    
data[0] = index;
    
data[1] = get_user_userid(index); // Por si se desconecta y entra otro jugador con el mismo id
    
SQL_ThreadQuery(g_tuple"handler_cargar"szTempdata2);
}

public 
handler_cargar(FailStateHandle:QueryError[], ErrcodeData[], DataSize) {
    new 
index Data[0];

    if(
index != find_player("k"Data[1])) {
        
SQL_FreeHandle(Query);
        return;
    }
    if(
fail_query(FailStateErrorErrcode)) {
        
console_print(index"Error al registrar");
        return;
    }
    if(
SQL_NumResults(Query)) {
        
g_PlayerStats[index][Player_ID] = SQL_ReadResult(Query0);
        
g_PlayerStats[index][Player_Rangos] = SQL_ReadResult(Query3);
        
g_PlayerStats[index][Player_Frags] = SQL_ReadResult(Query4);
        
g_PlayerStats[index][Player_Deaths] = SQL_ReadResult(Query5);
        
g_PlayerStats[index][Player_Headshots] = SQL_ReadResult(Query6);
        
g_PlayerStats[index][Player_Cuchillo] = SQL_ReadResult(Query7);
        
g_PlayerStats[index][Player_FlagCaptured] = SQL_ReadResult(Query8);
        
g_PlayerStats[index][Player_FlagReturned] = SQL_ReadResult(Query9);
        
g_iStatus[index] = LOGUEADO;
    }
    else {
        
PlayerRegister(index);
    }
    
SQL_FreeHandle(Query);
}

public 
PlayerRegister(index) {
    new 
szTemp[4048], data[1]; 
    static 
szAuthid[64];

    if(
is_user_steam(index))
    {
        
get_user_authid(indexszAuthidcharsmax(szAuthid));
    }
    else
    {
        
copy(szAuthidcharsmax(szAuthid), g_PlayerStats[index][Player_Nombre]);
    }

    
formatex(szTempcharsmax(szTemp), 
        
"INSERT INTO %s (steamid,name,frags,rangos,deaths,headshots,cuchillo,captured,returned,rankname,rankurl,ProfileImg,ProfileUrl)\
        VALUES (^"
%s^",^"%s^",%d,%d,%d,%d,%d,%d,%d,^"%s^",^"%s^",^"%s^",^"%s^")",
        
SQLX_TABLA,
        
szAuthid,
        
g_PlayerStats[index][Player_Nombre],
        
g_PlayerStats[index][Player_Rangos],
        
g_PlayerStats[index][Player_Frags],
        
g_PlayerStats[index][Player_Deaths],
        
g_PlayerStats[index][Player_Headshots],
        
g_PlayerStats[index][Player_Cuchillo],
        
g_PlayerStats[index][Player_FlagCaptured],
        
g_PlayerStats[index][Player_FlagReturned],
        
Rangos[g_PlayerStats[index][Player_Rangos]][RangoName],
        
Rangos[g_PlayerStats[index][Player_Rangos]][Url_Rango],
        
PlayerImg[index],
        
PlayerUrl[index]);

    
data[0] = index;
    
SQL_ThreadQuery(g_tuple"handler_registrar"szTempdata1);
}

public 
handler_registrar(FailStateHandle:QueryError[], ErrcodeData[], DataSize) {
    new 
id Data[0];

    if(
fail_query(FailStateErrorErrcode)) {
        
console_print(id"Error al registrar");
        return 
PLUGIN_HANDLED;
    }
    
console_print(id"Cuenta creada.");
    
g_iStatus[id] = LOGUEADO;
    return 
PLUGIN_CONTINUE;
}

public 
SaveGlobalPlayerData(index) {
    if(
g_iStatus[index] != LOGUEADO || !is_user_connected(index) || is_user_bot(index) || is_user_hltv(index)) {
        return;
    }

    static 
szTemp[4080], data[1], szAuthid[64];

    if(
is_user_steam(index)) {
        
get_user_authid(indexszAuthidcharsmax(szAuthid));
    }
    else {
        
copy(szAuthidcharsmax(szAuthid), g_PlayerStats[index][Player_Nombre]);
    }

    
formatex(szTempcharsmax(szTemp), 
        
"UPDATE %s SET `name`=^"%s^",`rangos`=^"%d^",`frags`=^"%d^",`deaths`=^"%d^",`headshots`=^"%d^",`cuchillo`=^"%d^",`captured`=^"%d^",`returned`=^"%d^",`rankname`=^"%s^",`rankurl`=^"%s^",`ProfileImg`=^"%s^",`ProfileUrl`=^"%s^" WHERE `steamid` = ^"%s^"",
        
SQLX_TABLA,
        
g_PlayerStats[index][Player_Nombre],
        
g_PlayerStats[index][Player_Rangos],
        
g_PlayerStats[index][Player_Frags],
        
g_PlayerStats[index][Player_Deaths],
        
g_PlayerStats[index][Player_Headshots],
        
g_PlayerStats[index][Player_Cuchillo],
        
g_PlayerStats[index][Player_FlagCaptured],
        
g_PlayerStats[index][Player_FlagReturned],
        
Rangos[g_PlayerStats[index][Player_Rangos]][RangoName],
        
Rangos[g_PlayerStats[index][Player_Rangos]][Url_Rango],
        
PlayerImg[index],
        
PlayerUrl[index],
        
szAuthid);

    
data[0] = index;
    
SQL_ThreadQuery(g_tuple"handler_actualizar"szTempdata1);
}

public 
handler_actualizar(FailStateHandle:QueryError[], Errcodedata[], DataSize) {
    new 
id data[0];

    if(
fail_query(FailStateErrorErrcode)) {
        
console_print(id"Error al registrar.");
        return;
    }
    
SQL_FreeHandle(Query);
    if(!
is_user_connected(id)) {
        return;
    }
    
console_print(id"Datos Actualizados.");


(16/08/2022, 06:24 PM)alexiways escribió: Y otra cosa cómo haces la consulta sql? Xq sino como estás obteniendo el name de columa 'name'.?

Eso es php? No entendí o que estás haciendo exactamente.

Osea en el sma hago todo el guardado pero para obtener esos datos lo hago por medio de php ya que estoy mostrando stats en una pagina
Responder
#5
Perdón, pero no entendí bien tu codex. Pero a ver vos querés que cada vez que cada jugador entre se cheequee que si el name que usa otro jugador "ya registrado" no lo esté usando, en caso que lo usé kickear al jugador nuevo con ese Nick ya en uso. No?

Si es el caso, apenas cargas los datos del jugador, verifica que su name no esté registrado en tu dba. Y haces una consulta sql, con un WHERE, con el name y authid del jugador si te da resultado es xq está registrado sino, puede usarlo.
Responder
#6
(16/08/2022, 06:32 PM)alexiways escribió: Perdón, pero no entendí bien tu codex. Pero a ver vos querés que cada vez que cada jugador entre se cheequee que si el name que usa otro jugador "ya registrado" no lo esté usando, en caso que lo usé kickear al jugador nuevo con ese Nick ya en uso. No?

Si es el caso, apenas cargas los datos del jugador, verifica que su name no esté registrado en tu dba. Y haces una consulta sql, con un WHERE, con el name y authid del jugador si te da resultado es xq está registrado sino, puede usarlo.

Osea lo que trato es que chekee que si ya el name esta registrado este kickee al jugador que intenta entrar con el name ya registrado
Responder
#7
Claro, una consulta sql, que haga WHERE al name. Si detecta que ya está registrado, en el habler comparas si el authid del jugador si es el mismo que el q tenés registras y sino son iguales kickeas al jugador.

SELECT * FROM %s WHERE name = ^"%s^"

Y en el handler, te fijas si te da resultado esa consulta sql, comparas si el authid está asociado al name registrado, sino lo está, kickealo.

if(SQL_NumResults(Query)) {
new authid[64], new t_authid[64]
get_user_authid( id, authid, charsmax(authid))
SQL_ReadResult(Query, 2, t_authid, charsmax(authid))
if!(equal(authid, t_authid)
server_cmd("kick #%d ^"Nick ya registrado, cambialo.^"", get_user_userid(id));
}
Responder
#8
(16/08/2022, 07:01 PM)alexiways escribió: Claro, una consulta sql, que haga WHERE al name. Si detecta que ya está registrado, en el habler comparas si el authid del jugador si es el mismo que el q tenés registras y sino son iguales kickeas al jugador.

SELECT * FROM %s WHERE name = ^"%s^"

Y en el handler, te fijas si te da resultado esa consulta sql, comparas si el authid está asociado al name registrado, sino lo está, kickealo.

if(SQL_NumResults(Query)) {
    new authid[64], new t_authid[64]
    get_user_authid( id, authid, charsmax(authid))
    SQL_ReadResult(Query, 2, t_authid, charsmax(authid))
  if!(equal(authid, t_authid)
      server_cmd("kick #%d ^"Nick ya registrado, cambialo.^"", get_user_userid(id));
}

En cual handler?
Responder
#9
Crea uno, para chequear el name. Cuando el jugador ingresa a tu server.
Responder
#10
no veo el "login" x ningun lado! segun queres kickear al jugador con un nick ya registrado sin antes verificar si es genuino? osea entra por primera vez y luego cuando quiera volver a entrar te autokickea porque ya esta registrado? WTF Whatever creo que para eso debes autentificar que sea el mismo player antes del kick! quizas este code te sirva de referencia

https://amxmodx-es.com/Thread-Sistema-de...SQL-SQLITE
Responder
#11
(16/08/2022, 08:30 PM)mlibre escribió: no veo el "login" x ningun lado! segun queres kickear al jugador con un nick ya registrado sin antes verificar si es genuino? osea entra por primera vez y luego cuando quiera volver a entrar te autokickea porque ya esta registrado? WTF Whatever creo que para eso debes autentificar que sea el mismo player antes del kick! quizas este code te sirva de referencia

https://amxmodx-es.com/Thread-Sistema-de...SQL-SQLITE

Lo que pasa es que me salta este log cuando entro con un nick que ya esta guardado en la base de datos
Código:
L 08/16/2022 - 21:38:52: Log file started (file "cstrike/addons/amxmodx/logs/sql_logs.log") (game "cstrike") (amx "1.9.0.5294")
L 08/16/2022 - 21:38:52: Error en la consulta [1062] [Duplicate entry 'Teq' for key 'name']
como puedo solucionar para que no salga ese logs, la idea que tenia es que si otro jugador entra este lle kicke y la otra que le salga un mensaje cuando entra al servidor que este nick ya esta registrado, como lo podria hacer
Responder
#12
creo q te estas complicando mucho, deverias de ulizar ese plugin q paso mlibre e editarlo a tu gusto.
Responder
#13
(16/08/2022, 10:48 PM)alexiways escribió: creo q te estas complicando mucho, deverias de ulizar ese plugin q paso mlibre e editarlo a tu gusto.

Lo intentare gracias
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)