Cambiar accesos de Admins..
#1
Hola, hice esto: Pero me gustaría saber si se podría hacer de otra manera. Lo que quiero es cambiar todo el sist. de Admins y hacer uno más diferente.
Pero no sé si así sería la mejor forma de hacerlo.
Código PHP:
LoadAdmins(id)
{
    new 
szFile[64]; copy(szFilecharsmax(szFile), DIR_ADMINS);
    
    if(!
file_exists(szFile)) {
        
write_file(szFile"; ^"NOMBRE^" ^"CONTRASENIA^" ^"TIPO^"", -1);
        
write_file(szFile"; Rangos: - PREMIUM - STAFF - ADMIN - FUNDADOR", -1);
        
write_file(szFile"; Ejemplo:", -1);
        
write_file(szFile"; ^"heNK'^" ^"supermariobros^" ^"FUNDADOR^"", -1);
    }
    new file = fopen(szFile, "rt");
    
    if(file) {
        new Nombre[32], Password[64], Tipo[20];
        
        while(!feof(file)) {
            static szBuffer[256];
            fgets(file, szBuffer, charsmax(szBuffer));
            
            if(szBuffer[0] == '
;' || (szBuffer[0] == '/' && szBuffer[1] == '/') || !szBuffer[0])
                continue;
            
            Nombre[0] = Password[0] = Tipo[0] = EOS;
                        
            parse(szBuffer, Nombre, charsmax(Nombre), Password, charsmax(Password), Tipo, charsmax(Tipo));    
            
            if(equal(Tipo, "FUNDADOR")) {
                g_AdminType[id][FUNDADOR] = true;
                admins_push(Nombre, Password, read_flags("abcdefghijklmnopqrstu"), read_flags("ab"));
            }
            else if(equal(Tipo, "ADMIN")) {
                g_AdminType[id][ADMIN] = true;
                admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstu"), read_flags("ab"));
            }
            else if(equal(Tipo, "PREMIUM")) {
                g_AdminType[id][PREMIUM] = true;
                admins_push(Nombre, Password, read_flags("bcdefghijkmnopqrstu"), read_flags("ab"));
            }
            else if(equal(Tipo, "STAFF")) {
                g_AdminType[id][STAFF] = true;
                admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstuv"), read_flags("ab"));
            }
            
            
            g_AdminCount++;
                
        }
        fclose(file);
    }else    fclose(file);
    
    server_print("%s Se encontraron %d admin%s cargados", PREFIX_CONSOLE, g_AdminCount, g_AdminCount == 1 ? "" : "s");
    

Responder
#2
puedes harcodear los tipos de admins y las flags, hacer un switch, meter un default, que lance logs de que algo esta mal escrito Whatever

Eso haria yo, ademas de simplificar la var admintypes
[Imagen: bvpq9q-6.png]

NO DOY AYUDA VIA MENSAJE PRIVADO

* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook
Responder
#3
edit: no uses eso jajaja me volvi fue loco, supongo que cargas siempre en putinserver la lista
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder
#4
(07/07/2019, 12:59 PM)kikizon2 escribió: puedes harcodear los tipos de admins y las flags, hacer un switch, meter un default, que lance logs de que algo esta mal escrito Whatever

Eso haria yo, ademas de simplificar la var admintypes

Mi idea de g_AdminTypes es para luego hacer un hook say con ello.
Código PHP:
public hook_say(id) {
    new 
say[192], Prefix[64];
    
read_args(saycharsmax(say));
    
remove_quotes(say);
    
trim(say);
    
    
replace_all(saycharsmax(say), "#""");
    
replace_all(saycharsmax(say), "%""");
    
    new 
Nombre[32];
    
get_user_name(idNombrecharsmax(Nombre));
    
    new 
alive[12];
    if(
is_user_alive(id))
        
alive "";
    else    
alive "*MUERTO* ";
    
    
    if(
strlen(say) > 0) {
        if(
g_AdminType[id][FUNDADOR])
            
copy(Prefixcharsmax(Prefix), "*FUNDADOR*");
        else if(
g_AdminType[id][STAFF]) 
            
copy(Prefixcharsmax(Prefix), "*STAFF*");
        else if(
g_AdminType[id][ADMIN]) 
            
copy(Prefixcharsmax(Prefix), "*ADMIN*"); 
        else if(
g_AdminType[id][PREMIUM])
            
copy(Prefixcharsmax(Prefix), "*PREMIUM*");
        else    
copy(Prefixcharsmax(Prefix), "");
        
        if(
is_user_admin(id))
            
format(saycharsmax(say), "^1%s^4%s ^3%s ^1: ^4%s"alivePrefixNombresay);
        else    
format(saycharsmax(say), "^1%s^3%s ^1: %s"aliveNombresay);
        for(new 
1<= g_maxplayersi++) {
            if(
is_user_connected(i)) {
                if(
is_user_alive(id) && is_user_alive(i) || !is_user_alive(id) || !is_user_alive(i))
                    
ColorChat(0GREENsay);
            }
        }
    }
    
    return 
PLUGIN_HANDLED_MAIN

Por eso, utilizo bool = true;
LoadAdmins(id); lo utilizo en client_putinserver. Una vez usado el LoadAdmins(id); hago el hook say donde chequeo su g_AdminType, y le agrego el prefijo. Entonces. Sí en una dirección ej: "admins.ini" tengo esto.
Cita:"heNK'" "password" "PREMIUM" Su g_AdminType se pone en TRUE y lo agrego al prefix.
"heNK'" "password" "STAFF" Su g_AdminType se pone en TRUE y lo agrego al prefix.
Quedaría "*STAFF*" "*PREMIUM*" etc.. Por eso utilizo g_AdminType[id][RANGO].
Responder
#5
Código PHP:
#define MAX_ADMINS 10

enum _:ADMINS_CONSTS
{
    
CONSTS_ALIAS[30],
    
CONSTS_ACCESS[20]
}

public 
client_putinserver(id)
{
    
fw_LoadAdmins(id"addons/amxmodx/configs/users.ini")
}

enum _:ADMINS_ALIAS
{
    
ALIAS_FUNDADOR,
    
ALIAS_ADMIN,
    
ALIAS_STAFF,
    
ALIAS_PREMIUM
}

new const 
Struct_Admins[][ADMINS_CONSTS] =
{
    { 
"FUNDADOR",     "abcde" },
    { 
"ADMIN",     "abcdefghijkl" },
    { 
"STAFF",     "abcdef" },
    { 
"PREMIUM",     "a" }
}

new 
bool:g_iAdminType[MAX_PLAYERS][ADMINS_ALIAS]

fw_LoadAdmins(iddir_admins[64])
{
    
remove_user_flags(id)
    
arrayset(g_iAdminType[id], falseADMINS_ALIAS)
    
    static 
sName_Db[MAX_ADMINS][33]
    static 
sPass_Db[MAX_ADMINS][25]
    static 
sAccs_Db[MAX_ADMINS][20]
    
    if(
sName_Db[0][0])
    {
        new 
sName[33]/*, sAuthid[35], sIp[20]*/ibool:bExist false
        
        get_user_name
(idsNamecharsmax(sName))
        
//get_user_ip(id, sIp, charsmax(sIp))
        //get_user_authid(id, sAuthid, charsmax(sAuthid))
        
        
replace_string(sNamecharsmax(sName), " "" "false// 0xFF Sin testear.
        
        
for(0MAX_ADMINSi++)
        {
            if(
strcmp(sNamesName_Db[i]) == 0/* || strcmp(sAuthid, sName_Db[i]) == 0 || strcmp(sIp, sName_Db[i]) == 0*/)
            {
                
bExist true
                
if(sPass_Db[i][0] && !CheckPassword(idsPass_Db[i]))
                {
                    
server_cmd("kick #%i ^"La clave de tu admin es incorrecta prro :v^""get_user_userid(id))
                    
server_exec()
                    break
                }
                switch(
sAccs_Db[i][0])
                {
                    case 
'F'g_iAdminType[id][ALIAS_FUNDADOR] = bool:(set_user_flags(idread_flags(Struct_Admins[0][CONSTS_ACCESS])))
                    case 
'A'g_iAdminType[id][ALIAS_ADMIN] = bool:(set_user_flags(idread_flags(Struct_Admins[1][CONSTS_ACCESS])))
                    case 
'P'g_iAdminType[id][ALIAS_PREMIUM] = bool:(set_user_flags(idread_flags(Struct_Admins[3][CONSTS_ACCESS])))
                    case 
'S'g_iAdminType[id][ALIAS_STAFF] = bool:(set_user_flags(idread_flags(Struct_Admins[2][CONSTS_ACCESS])))
                }
                
//log_amx("<%s><%s><%s> Se ha conectado.", sName, sAuthid, sIp)
                
break
            }
        }
        
        if(!
bExist)
        {
            
set_user_flags(idread_flags("z"))
        }
    }
    else
    {
        new 
iFile fopen(dir_admins"r"), sLines[90], i
        
if(iFile)
        {
            while(!
feof(iFile))
            {
                
fgets(iFilesLinescharsmax(sLines))
                if(
sLines[0] == ';' || (sLines[0] == '/' && sLines[1] == '/') || !sLines[0])
                {
                    continue
                }
                if(
MAX_ADMINS)
                {
                    
log_error(AMX_ERR_STACKERR"Sobrepasaste los limites aumenta MAX_ADMINS.")
                    break
                }
                
parse(sLinessName_Db[i], charsmax(sName_Db[]), sPass_Db[i], charsmax(sPass_Db[]), sAccs_Db[i], charsmax(sAccs_Db[]))
                
replace_string(sName_Db[i], charsmax(sName_Db[]), " "" "false// 0xFF Sin testear.
                
i++
            }
            
fclose(iFile)
            
log_amx("Se consigui%s %d administrador%s.""eron" "o"i"es" "")
        }
        else
        {
            
fclose(iFile)
        }
        if(
== 0)
        {
            
set_user_flags(idread_flags("z"))
            return
        }
        
fw_LoadAdmins(id"addons/amxmodx/configs/users.ini")
    }
}

bool:CheckPassword(idsPass_Db[])
{
    new 
sPass[25]
    
get_user_info(id"_pw"sPasscharsmax(sPass))
    
    return 
bool:(strcmp(sPasssPass_Db) == 0)


Edit: 7:59 PM, le hice un par de cambios..

La clave si realmente hay una simplemente hará los chequeos previos.

Dale buen uso hombre Proud
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder
#6
En vez de set_user_flags, sería admins_push, no? Ya que, si bien, le otorgas los flags. Falta el Nombre & la Password que eso se ve después con admins_lookup. Que eso sería el chequeo de la clave, nombre y accesos.
Yo lo deje así el LoadAdmins.
Código PHP:
enum
{
    
FUNDADOR,
    
STAFF,
    
ADMIN,
    
PREMIUM
};
new 
g_AdminType[33][4];

LoadAdmins(id)
{
    new 
szFile[64]; copy(szFilecharsmax(szFile), DIR_ADMINS);
    
    if(!
file_exists(szFile)) {
        
write_file(szFile"; ^"NOMBRE^" ^"CONTRASENIA^" ^"TIPO^"", -1);
        
write_file(szFile"; Rangos: - PREMIUM - STAFF - ADMIN - FUNDADOR", -1);
        
write_file(szFile"; Ejemplo:", -1);
        
write_file(szFile"; ^"heNK'^" ^"supermariobros^" ^"FUNDADOR^"", -1);
    }
    new file = fopen(szFile, "rt");
    
    if(file) {
        new Nombre[32], Password[64], Tipo[20];
        
        while(!feof(file)) {
            static szBuffer[256];
            fgets(file, szBuffer, charsmax(szBuffer));
            trim(szBuffer);
            
            if(szBuffer[0] == '
;' || (szBuffer[0] == '/' && szBuffer[1] == '/') || !szBuffer[0])
                continue;
            
            Nombre[0] = Password[0] = Tipo[0] = EOS;
                        
            parse(szBuffer, Nombre, charsmax(Nombre), Password, charsmax(Password), Tipo, charsmax(Tipo));    
            
            switch(Tipo[0]) {
                case '
F': {
                    g_AdminType[id][FUNDADOR] = true; 
                    admins_push(Nombre, Password, read_flags("abcdefghijklmnopqrstu"), read_flags("ab"));
                }
                case '
A': {
                    g_AdminType[id][ADMIN] = true;
                    admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstu"), read_flags("ab"));
                }
                case '
P': {
                    g_AdminType[id][PREMIUM] = true;
                    admins_push(Nombre, Password, read_flags("bcdefghijkmnopqrstu"), read_flags("ab"));
                }
                case '
S': {
                    g_AdminType[id][STAFF] = true;
                    admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstuv"), read_flags("ab"));
                }
                
            }
            g_AdminCount++;
                
        }
        fclose(file);
    }else    fclose(file);
    
    server_print("%s Se encontraron %d admin%s cargados", PREFIX_CONSOLE, g_AdminCount, g_AdminCount == 1 ? "" : "s");

Responder
#7
De hecho te lo hice de esa forma por que pensé que no usarías mas admin.amxx, además de la forma en tu la tienes, Estás cargando una y otra ves la lista cada ves que un player ingresa al servidor si no me equivoco lo llamas en putinserver. Creo que al usar el código que te pase ya estaría sin uso las natives: admins_push@lookup y todas las que se asocien, excepto get_user_flags(). YYY aclaro que sólo funciona con nombres y no con steamids, pero se puede sólo tendrías que hacer otro chequeo más.

edit: lo acabo de editar.
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder
#8
(07/07/2019, 02:49 PM)OsweRRR escribió: De hecho te lo hice de esa forma por que pensé que no usarías mas admin.amxx, además de la forma en tu la tienes, Estás cargando una y otra ves la lista cada ves que un player ingresa al servidor si no me equivoco lo llamas en putinserver. Creo que al usar el código que te pase ya estaría sin uso las natives: admins_push@lookup y todas las que se asocien, excepto get_user_flags(). YYY aclaro que sólo funciona con nombres y no con steamids, pero se puede sólo tendrías que hacer otro chequeo más.

edit: lo acabo de editar.

Es cambiar el sistema, por ende, admin.amxx no tendría que existir..
Volviendo al tema. fw_LoadAdmins lo estas ejecutando 2 veces. Por qué haces eso? No estarías básicamente repitiendolo constantemente el fw_LoadAdmins?
PD: Entonces set_user_flags por admins_push sería?
Código PHP:
if(== 0)
        {
            
set_user_flags(idread_flags("z"))
            return
        }
        
fw_LoadAdmins(id"addons/amxmodx/configs/users.ini"
Responder
#9
Nop, velo bien, si sName_Db no tiene nada, va y carga los admins y luego devuelvo en esa linea la fw, y el caso i == 0 si no cargó ningún admin simplemente le da la flag z al player y retorno para que no se cree un bucle y pin pun pan crash server. YYY si puedes hacer eso, set_user_flags en ves de admins_push, échale un ojo a admin.amxx.
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder
#10
Avísame si te pudo funcionar, actualice el código Pepe
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder
#11
No probe tu código, pero guiandome de él hice esto. Aclaro que no sé si esta bien, porque no tengo para testear :c.
Lo que hice, es mediante equal y get_user_name chequear si en el archivo es el mismo nombre del conectado. Debido a que LoadAdmins se llama en client_putinserver.
Luego, si es el correcto, chequeo si su password es también correcta. Sí no lo es, lo kickeo.
Luego, chequeo su rango (accesos) y le otorgo los flags.
Y para terminar, chequeo de vencimiento.
PD: Oswer, g_AdminType[id][RANGO] = true, porque como dije, es para luego usarlo en hooksay.
Edit: Lo que ahora faltaría para no hacerla tan larga, es detectar el cambio de nombre, porque si lo detecto siempre que llamo LoadAdmins, sería horrible. Qué otra forma puede haber?
LoadAdmins(id);
Código PHP:
LoadAdmins(id
{
    new 
szFile[64]; copy(szFilecharsmax(szFile), DIR_ADMINS);
    
    new 
file fopen(szFile"r");
    new 
lineabool:bExists;
    
    new 
szPass[32]; get_user_info(idPASSWORDszPasscharsmax(szPass));
    new 
szName[32]; get_user_name(idszNamecharsmax(szName));
    
    
remove_user_flags(id);
    
    if(
file) {
        new 
Nombre[32], Password[64], Tipo[20], Vencimiento[64];
        
        while(!
feof(file)) {
            static 
szBuffer[256];
            
fgets(fileszBuffercharsmax(szBuffer));
            
trim(szBuffer);
            
            
linea++;
            
            if(
szBuffer[0] == ';' || (szBuffer[0] == '/' && szBuffer[1] == '/') || !szBuffer[0])
                continue;
            
            
Nombre[0] = Password[0] = Tipo[0] = EOS;
            
            
parse(szBufferNombrecharsmax(Nombre), Passwordcharsmax(Password), Tipocharsmax(Tipo), Vencimientocharsmax(Vencimiento));
            
            if(
equal(szNameNombre)) {
                
bExists true;
                if(
equal(szPassPassword)) {
                    
log_amx("Se conecto el admin %s"szName);
                }else{
                    
server_cmd("kick #%d ^"Ingrese la contrasenia de tu ADMIN/PREMIUM^""get_user_userid(id));
                    break;
                }
        
                switch(
Tipo[0]) {
                    case 
'F': {
                        
g_AdminType[id][FUNDADOR] = true
                        
set_user_flags(idread_flags("abcdefghijklmnopqrstu"));
                    }
                    case 
'A': {
                        
g_AdminType[id][ADMIN] = true;
                        
set_user_flags(idread_flags("abcdefghijkmnopqrstu"));
                    }
                    case 
'P': {
                        
g_AdminType[id][PREMIUM] = true;
                        
set_user_flags(idread_flags("bcdefghijkmnopqrstu"));
                    }
                    case 
'S': {
                        
g_AdminType[id][STAFF] = true;
                        
set_user_flags(idread_flags("abcdefghijkmnopqrstuv"));
                    }
                }
            
                
                if(!
Vencimiento[0])
                    continue;
                
                
replace_all(Vencimientocharsmax(Vencimiento), "/"" ");
                new 
dia[3], mes[3], anio[5];
                
parse(Vencimientodiacharsmax(dia), mescharsmax(mes), aniocharsmax(anio));
                
                if(
get_systime() >= TimeToUnix(str_to_num(anio), str_to_num(mes), str_to_num(dia), 000UT_TIMEZONE_SERVER)) {
                    
format(szBuffercharsmax(szBuffer), "; ADMIN %s(%s) vencio en la fecha %s/%s/%s"NombreTipo,  diamesanio);
                    
write_file(DIR_ADMINSszBufferlinea 1);
                }else {
                    
replace_all(Vencimientocharsmax(Vencimiento), " ""/");
                    
TrieSetString(g_tVencimientoNombreVencimiento);
                }
                
g_AdminCount++;    
            }
        }
        if(!
bExists)
            
set_user_flags(idread_flags("z"));
        
fclose(file);
    }else    
fclose(file);
    
    
server_print("%s Se encontraron %d admin%s cargados"PREFIX_CONSOLEg_AdminCountg_AdminCount == "" "s");

HookSay(id);
Código PHP:
public hook_say(id) {
    new 
say[192], Prefix[64];
    
read_args(saycharsmax(say));
    
remove_quotes(say);
    
trim(say);
    
    
replace_all(saycharsmax(say), "#""");
    
replace_all(saycharsmax(say), "%""");
    
    new 
Nombre[32];
    
get_user_name(idNombrecharsmax(Nombre));
    
    new 
alive[12];
    if(
is_user_alive(id))
        
alive "";
    else    
alive "*MUERTO* ";
    
    
    if(
strlen(say) > || strlen(say) < 192) {
        if(
g_AdminType[id][FUNDADOR])
            
copy(Prefixcharsmax(Prefix), "*FUNDADOR*");
        else if(
g_AdminType[id][STAFF]) 
            
copy(Prefixcharsmax(Prefix), "*STAFF*");
        else if(
g_AdminType[id][ADMIN]) 
            
copy(Prefixcharsmax(Prefix), "*ADMIN*"); 
        else if(
g_AdminType[id][PREMIUM])
            
copy(Prefixcharsmax(Prefix), "*PREMIUM*");
        else    
copy(Prefixcharsmax(Prefix), "");
        
        if(
is_user_admin(id))
            
format(saycharsmax(say), "^1%s^4%s ^3%s ^1: ^4%s"alivePrefixNombresay);
        else    
format(saycharsmax(say), "^1%s^3%s ^1: %s"aliveNombresay);
        for(new 
1<= g_maxplayersi++) {
            if(
is_user_connected(i)) {
                if(
g_AdminType[id][FUNDADOR] || g_AdminType[id][STAFF] || is_user_alive(id) && is_user_alive(i) || !is_user_alive(id) || !is_user_alive(i))
                {
                    
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"),_,i)
                    
write_byte(id)
                    
write_string(say)
                    
message_end()    
                }
        
            }
        }
    }
    
    return 
PLUGIN_HANDLED_MAIN

Responder
#12
Lo mejor en ese caso, cargar tu lista de admins en el inicio del mapa y almacenarlas en alguna variable, luego hacer los respectivos chequeos en infochanged y putinserver. Whatever
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)