[API] Ndrs Vault
#1
[API] Ndrs Vault
Descripción:
  • Esta api te permite guardar datos a una db sqlite fácilmente
Requisitos: Contenido:
Código PHP:
#if defined _ndrs_vault
    #endinput
#endif
#define _ndrs_vault

#define MAX_TABLE_LENGTH 64
#define MAX_FIELD_LENGTH 64
#define MAX_VALUE_LENGTH 33

enum NdrsKeyType
{
    
NDRS_NAME=0,
    
NDRS_STEAMID,
    
NDRS_IP
}

enum NdrsType
{
    
NDRS_INT=0,
    
NDRS_FLOAT,
    
NDRS_BOOL,
    
NDRS_STRING
}

enum NdrsReturn
{
    
NDRS_SUCCESS 1,
    
NDRS_FAIL
}

/**
 * Prepara la tabla a usar
 * 
 * @note Solo puedes usar letras y números sin espacios
 * 
 * @param szTable       Nombre de la tabla
 * @param nKeyType      Modo de guardado
 *     
 * @return              Retorna un valor del enum NdrsReturn
 */
native NdrsReturn:ndrs_start(const szTable[MAX_TABLE_LENGTH], NdrsKeyType:nKeyType)

/**
 * Prepara las columnas a usar
 * 
 * @note Solo puedes usar letras y números sin espacios
 * 
 * @param ...           Agrega el nombre de las columnas a usar
 *  
 * @return              Retorna un valor del enum NdrsReturn
 */
native NdrsReturn:ndrs_register_fields(any:...)

/**
 * Crea o actualiza segun el id del jugador
 * 
 * @note Solo puedes usar letras y números sin espacios
 * 
 * @param id            Index del jugador
 * @param szField       Columna a setear
 * @param iType         Tipo de dato a setear
 * @param ...           Valor a setear
 *     
 * @return              Retorna un valor del enum NdrsReturn
 */
native NdrsReturn:ndrs_set(id, const szField[], const NdrsType:iTypeany:...)

/**
 * Obtiene el valor de una columna segun el id  del jugador
 * 
 * @note Solo puedes usar letras y números sin espacios
 * 
 * @param id            Index del jugador
 * @param szField       Columna a usar
 * @param ...           Ejemplos para obtener diferentes valores
 *                      Integer:
 *                      new iNum = ndrs_get(id, szField)
 *                      Float:
 *                      new Float:fNum
 *                      ndrs_get(id, szField, fNum)
 *                      String:
 *                      new szBuffer[32]
 *                      ndrs_get(id, szField, szBuffer, charsmax(szBuffer))
 *     
 * @return              Retorna un valor del enum NdrsReturn en caso de error
 */
native any:ndrs_get(id, const szField[], {Float,_}:...) 

Ejemplo de uso:
Código PHP:
#include <amxmodx>
#include <ndrs_vault>

#define PLUGIN  "Test Ndrs Vault"
#define VERSION "1.0"
#define AUTHOR  "[N]drs"

#define TABLE "test"

#define FIELD_ENTERO "entero"
#define FIELD_FLOTANTE "flotante"
#define FIELD_BOOLEANO "booleano"
#define FIELD_STRING "string"

public plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
ndrs_start(TABLENDRS_NAME)
    
ndrs_register_fields(FIELD_ENTEROFIELD_FLOTANTEFIELD_BOOLEANOFIELD_STRING)
}

public 
client_putinserver(id)
{
    
load(id)
}

public 
client_disconnected(idbool:dropmessage[], maxlen)
{
    
save(id)
}

save(id)
{
    new 
iEntero 58
    
new Float:fFlotante 3.14
    
new bool:bBooleano true
    
new szString[15] = "Test Mensaje"

    
ndrs_set(idFIELD_ENTERONDRS_INTiEntero)
    
ndrs_set(idFIELD_FLOTANTENDRS_FLOATfFlotante)
    
ndrs_set(idFIELD_BOOLEANONDRS_BOOLbBooleano)
    
ndrs_set(idFIELD_STRINGNDRS_STRINGszString)
}

load(id)
{
    new 
iEnteroX
    
new Float:fFlotanteX
    
new bool:bBooleanoX
    
new szStringX[15]

    
iEnteroX ndrs_get(idFIELD_ENTERO)
    
server_print("Valor: %d"iEnteroX)

    
ndrs_get(idFIELD_FLOTANTEfFlotanteX)
    
server_print("Valor: %f"fFlotanteX)

    
bBooleanoX ndrs_get(idFIELD_BOOLEANO)
    
server_print("Valor: %s"bBooleanoX "true" "false")

    
ndrs_get(idFIELD_STRINGszStringXcharsmax(szStringX))
    
server_print("Valor: %s"szStringX)


Por ahora solo tiene las funciones básicas de un guardado, si hay apoyo agregaré nuevas funciones


Archivos adjuntos
.inc   ndrs_vault.inc (Tamaño: 2.21 KB / Descargas: 14)
.sma   Descargar AMXX / ndrs_vault.sma (Tamaño: 8.78 KB / Descargas: 18)
Responder
#2
Se ve bastante bien, se me hace mucho más entendible y fácil de usar que los otros vault.
La única recomendación que yo haría es el poder guardar strings con espacios (entendí que no lo hace) para el tema de los sistemas de cuentas que se guarden por nick

Buen aporte Nothingdohere
Responder
#3
(24/05/2022, 03:56 PM)GabsHp escribió: Se ve bastante bien, se me hace mucho más entendible y fácil de usar que los otros vault.
La única recomendación que yo haría es el poder guardar strings con espacios (entendí que no lo hace) para el tema de los sistemas de cuentas que se guarden por nick

Buen aporte  Nothingdohere
Si se puede guardar string con espacios o no sé a que te refieres y
Con solo ingresar el id en ndrs_set, el plugin guardará según como hayas establecido en ndrs_start
Código:
enum NdrsKeyType
{
    NDRS_NAME=0, // Guarda segun el nombre
    NDRS_STEAMID, // guarda segun el steamid
    NDRS_IP // guarda segun la ip
}

// El plugin almacena automáticamente esos datos en la tabla

Código PHP:
/**
 * Prepara la tabla a usar
 * 
 * @note Solo puedes usar letras y números sin espacios
 * 
 * @param szTable       Nombre de la tabla
 * @param nKeyType      Modo de guardado
 *     
 * @return              Retorna un valor del enum NdrsReturn
 */
native NdrsReturn:ndrs_start(const szTable[MAX_TABLE_LENGTH], NdrsKeyType:nKeyType

(24/05/2022, 03:56 PM)GabsHp escribió: Se ve bastante bien, se me hace mucho más entendible y fácil de usar que los otros vault.
La única recomendación que yo haría es el poder guardar strings con espacios (entendí que no lo hace) para el tema de los sistemas de cuentas que se guarden por nick

Buen aporte  Nothingdohere

Código PHP:
#include <amxmodx>
#include <ndrs_vault>

#define PLUGIN  "New Plug-In"
#define VERSION "1.0.0-1"
#define AUTHOR  "Author"

public plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
ndrs_start("accounts"NDRS_NAME)
    
ndrs_register_fields("password")
}

public 
login(id)
{
    new const 
szPassInput[] = "hs65ssjk"

    
new szPassDb[20]
    
ndrs_get(id"password"szPassDbcharsmax(szPassDb))

    if(
equal(szPassDbszPassInput))
    {
        
//logueo con exito
    
}

Responder
#4
un select por cada get?
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#5
(24/05/2022, 05:05 PM)Hinami escribió: un select por cada get?

Asies, el único fin de mi api es que los guardados en los plugins sean fáciles de hacer
Responder
#6
Sería bueno buscar otra manera de acceder a la data, hacer un select* por campo no es la mejor de la ideas. Whatever
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#7
(24/05/2022, 05:19 PM)Hinami escribió: Sería bueno buscar otra manera de acceder a la data, hacer un select* por campo no es la mejor de la ideas. Whatever

Sé que hay formas más eficientes, pero eso también agregaría usar más natives para el que programe y mi punto es que sea lo más rápido y fácil de usar.
Para guardar una variable de exp o rango está más que bien, ahora si quieres armar un sistema complejo que requiera obtener datos constantemente lo mejor es armar sus propias consultas.
Además no es que se vaya a tardar una eternidad en obtener datos de un archivo sqlite que está en el mismo sv
(Solo sé lo fundamental de sql así que tal vez estoy flasheando)
Responder
#8
Partamos de la base del uso que le das a una base de datos relacional haciendo un insert/select por campo, ahí ya le das un mal uso, y si es facil de comprender mira que hago un guardado para mi ctf versión venezuela que guarda como 50 campos y va 32/32 haré como 1k y la madre consultas si el modulo las resuelve asincronamente pues no hay tanto problema pero si no se va 1x1 solo dios sabe cuanto tardaría eso, pasamos de ejecutar una consulta 32 veces a 50 consultas 32 veces, y si hablaramos de un caso real de un desarrollo equisde.

La idea esta buena un tipo orm para cs, pero no esta bien planteado y no lo recomendaría usar, si alguien no sabe sql quedense en archivos planos.
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#9
Yo lo veo bastante bien. Solo sugiero mejorar las natives para obtener/actualizar datos, para permitir que se puedan manipular varias columnas con una sola consulta.
Buen trabajo!
Responder
#10
Me cayó como anillo en el dedo, servirá mucho para futuros proyectos.

Muchas gracias, excelente aporte.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)