[FilterScript] Login & Registro em SQLite + Pawn.CMD
#1

Boa tarde. Criei esse script de exemplo para aprender sobre o uso do SQLite, que por sinal й muito rбpido, fбcil e pratico de usar. Como foi sу para aprender nгo tem mais utilidade pra mim, por isso resolvi postar para estimular "atualmente" o uso de SQLite no SAMP.



• Caracterнsticas

O filterscript salva, Nome, IP, senha, level, dinheiro, skin, matou, morreu, vip, e admin.
Esse ultimo com alguns comandos bбsicos para dar e tirar admin, com o uso do plugin Pawn.CMD
sгo esses;

Код:
/viraradmin  // Logado RCON
/daradmin
/tiraradmin
/liberar // para liberar o player a trocar de senha/nome
Para saber mais sobre o uso do Pawn.CMD de uma olhada nesse tutorial: Usando processador de comandos PawnCMD



• Manipulando o salvamento SQLite

Para gerenciar os dados eu uso o programa SQL Manager
Link oficial do criador Bruno: SQLite Manager - Gerenciar Dados


• Script

PHP код:
/*
    Filterscript criado por Cleyson Stein.
    Criei para estudo do SQLite e depois resolvi implementar e postar.
    Bom proveito !!
*/
// == Includes
#include <a_samp>
#include <sscanf2>
#include <Pawn.CMD>
// == Defines
#define DIALOG_REGISTRO     1512
#define DIALOG_LOGIN        1513
#define DIALOG_SENHA         1514
#define DIALOG_NOME            1515
// == Cores
#define VERMELHO                0xFF030FFF
#define LARANJA                 0xF97804FF
#define AZUL_CLARO              0x00C2ECFF
#define CINZA                   0xCECECEFF
// == Variaveis globais
new CMD_ADMIN_DONO 1;
enum pInfo
{
    
IDdb,
    
Nome[24],
    
IP[26],
    
Senha[20],
    
Level,
    
Dinheiro,
    
Skin,
    
Matou,
    
Morreu,
    
Admin,
    
Vip,
    
bool:Liberado,
    
bool:Logado
};
new 
PlayerInfo[MAX_PLAYERS][pInfo];
// == Sql
new DB:DatabaseDB_Query[1000];
// == Script
public OnFilterScriptInit()
{
    
ConectarDB();
    return 
1;
}
public 
OnFilterScriptExit()
{
    
db_close(Database);
    return 
1;
}
public 
OnPlayerConnect(playerid)
{
    
GetPlayerName(playeridPlayerInfo[playerid][Nome], 24);
    
GetPlayerIp(playeridPlayerInfo[playerid][IP], 26); 
    
    new 
DBResult:ResultDialog[240]; 
    
format(DB_Querysizeof(DB_Query), "SELECT * FROM CONTAS WHERE NOME = '%s'"PlayerInfo[playerid][Nome]);
    
Result db_query(DatabaseDB_Query);
    
    if(
db_num_rows(Result))
    {
        
db_get_field_assoc(Result"SENHA"PlayerInfo[playerid][Senha], 20);
        
        
format(Dialogsizeof(Dialog),"{F8F8FF}Bem vindo(a) ao servidor {058AFF}%s{F8F8FF}\n\nVocк ja tem uma conta registrada\n\nDigite sua senha para logar\n\nStatus: {1E90FF}Registrado{F8F8FF}\n\nIP: {058AFF}%s"PlayerInfo[playerid][Nome], PlayerInfo[playerid][IP]);
        
ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"LOGIN"Dialog"Logar""Cancelar");
        
        } else {
        
        
format(Dialogsizeof(Dialog),"{F8F8FF}Bem vindo(a) ao servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma conta registrada\n\nDigite uma senha para registrar\n\nStatus: {058AFF}Nгo registrado{F8F8FF}\n\nIP: {058AFF}%s"PlayerInfo[playerid][Nome], PlayerInfo[playerid][IP]);
        
ShowPlayerDialog(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"REGISTRO"Dialog"Registrar""Cancelar");
    }
    
db_free_result(Result);
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    
SalvarDB(playerid);
    return 
1;
}
public 
OnPlayerDeath(playeridkilleridreason)
{
    
PlayerInfo[playerid][Morreu]++;
    
PlayerInfo[killerid][Matou]++;
    return 
1;
}
public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    switch(
dialogid)
    {
        case 
DIALOG_REGISTRO:
        {
            if(!
response) return Kick(playerid);
            if(
strlen(inputtext) < || strlen(inputtext) > 20)
            {
                
SendClientMessage(playeridVERMELHO"ERRO: A senha deve conter de 4 a 20 caracteres!");
                new 
Dialog[240]; 
                
format(Dialogsizeof(Dialog),"{F8F8FF}Bem vindo(a) ao servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma conta registrada\n\nDigite uma senha para registrar\n\nStatus: {058AFF}Nгo registrado{F8F8FF}\n\nIP: {058AFF}%s"PlayerInfo[playerid][Nome], PlayerInfo[playerid][IP]);
                
ShowPlayerDialog(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"REGISTRO"Dialog"Registrar""Cancelar");
                } else {
                
                
format(PlayerInfo[playerid][Senha], 20inputtext);
                
RegistrarDB(playerid);
            }
        }
        case 
DIALOG_LOGIN:
        {
            if(!
response) return Kick(playerid); 
            
            if(!
strcmp(PlayerInfo[playerid][Senha], inputtexttrue20))
            { 
                
CarregarDB(playerid);
                } else {
                
                new 
Dialog[240];
                
SendClientMessage(playeridVERMELHO"ERRO: Senha incorreta !");
                
format(Dialogsizeof(Dialog),"{F8F8FF}Bem vindo(a) ao servidor {058AFF}%s{F8F8FF}\n\nVocк ja tem uma conta registrada\n\nDigite sua senha para logar\n\nStatus: {1E90FF}Registrado{F8F8FF}\n\nIP: {058AFF}%s"PlayerInfo[playerid][Nome], PlayerInfo[playerid][IP]);
                
ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"LOGIN"Dialog"Logar""Cancelar");
            }
        }
        
        case 
DIALOG_SENHA:
        {
             if(!
response) return 1;
            if(
strlen(inputtext) < || strlen(inputtext) > 20)
            {
                
SendClientMessage(playeridVERMELHO"ERRO: A senha deve conter de 4 a 20 caracteres!");
                
ShowPlayerDialog(playeridDIALOG_SENHADIALOG_STYLE_PASSWORD"Digite uma senha:""Digite sua nova senha abaixo\n\nObs: Ela deve conter no mнnimo 4 e no mбximo 16 caracteres.""Trocar""Voltar");
                } else {
                
format(PlayerInfo[playerid][Senha], 20inputtext);
                new 
String[75];
                
format(Stringsizeof(String), "ADMIN: Sua senha foi alterada com sucesso, nova senha: %s"PlayerInfo[playerid][Senha]);
                
SendClientMessage(playeridCINZAString);
                return 
1;
            }
            return 
1;
        }
        case 
DIALOG_NOME:
        {
            if(!
response) return 1;
            if(
strlen(inputtext) > 24)
            {
                
SendClientMessage(playeridVERMELHO"ERRO: Seu novo nome deve conter no maximo 24 caracteres.");
                
ShowPlayerDialog(playeridDIALOG_NOMEDIALOG_STYLE_PASSWORD"Digite um novo nome:""Digite seu novo nome abaixo\n\nObs: Ele deve conter no mбximo 24 caracteres.""Trocar""Voltar");
                } else {
                
                
SetPlayerName(playeridinputtext);
                
format(PlayerInfo[playerid][Nome], 20inputtext);
                
                new 
String[75];
                
format(Stringsizeof(String), "ADMIN: Seu nome foi alterado com sucesso, novo nome: %s"PlayerInfo[playerid][Nome]);
                
SendClientMessage(playeridCINZAString);
                return 
1;
            }
        }
    }
    return 
1;
}
ConectarDB()
{
    if((
Database db_open("Salvamento.db")) == DB:0)
    {
        
SendRconCommand("exit");
        print(
"Falha ao se conectar a DataBase SQlite"); // DEBUG
        
        
} else {
        
        print(
"Conectado com sucesso a DataBase SQlite."); // DEBUG
        
        
format(DB_Querysizeof(DB_Query), "");
        
strcat(DB_Query"CREATE TABLE IF NOT EXISTS CONTAS (");
        
strcat(DB_Query"ID INTEGER PRIMARY KEY AUTOINCREMENT,");
        
strcat(DB_Query"NOME TEXT DEFAULT '',");
        
strcat(DB_Query"IP TEXT DEFAULT '',");
        
strcat(DB_Query"SENHA TEXT DEFAULT '',");
        
strcat(DB_Query"LEVEL INTEGER DEFAULT 0,");
        
strcat(DB_Query"DINHEIRO INTEGER DEFAULT 0,");
        
strcat(DB_Query"SKIN INTEGER DEFAULT 0,");
        
strcat(DB_Query"MATOU INTEGER DEFAULT 0,");
        
strcat(DB_Query"MORREU INTEGER DEFAULT 0,");
        
strcat(DB_Query"ADMIN INTEGER DEFAULT 0,");
        
strcat(DB_Query"VIP INTEGER DEFAULT 0)");
        
db_query(DatabaseDB_Query);
    }
    return 
1;
}
RegistrarDB(playerid)
{
    new 
str[80];
    
format(DB_Querysizeof(DB_Query), "INSERT INTO CONTAS (NOME, IP, SENHA) VALUES ");
    
format(strsizeof(str), "('%s',"PlayerInfo[playerid][Nome]);     strcat(DB_Querystr);
    
format(strsizeof(str), "'%s',"PlayerInfo[playerid][IP]);         strcat(DB_Querystr);
    
format(strsizeof(str), "'%s')"PlayerInfo[playerid][Senha]);     strcat(DB_Querystr);
    
db_query(DatabaseDB_Query);
    
    new 
DBResult:Result;
    
format(DB_Querysizeof(DB_Query), "SELECT ID FROM CONTAS WHERE NOME = '%s'"PlayerInfo[playerid][Nome]);
    
Result db_query(DatabaseDB_Query);
    if(
db_num_rows(Result))
    {
        
PlayerInfo[playerid][IDdb] = db_get_field_assoc_int(Result"ID");
    }
    
db_free_result(Result);
    
    
PlayerInfo[playerid][Level] = 10;
    
PlayerInfo[playerid][Dinheiro] = 1000;
    
PlayerInfo[playerid][Skin] = 50;
    
PlayerInfo[playerid][Logado] = true;
    
SetPlayerScore(playeridPlayerInfo[playerid][Level]);
    
GivePlayerMoney(playeridPlayerInfo[playerid][Dinheiro]);
    
SetSpawnInfo(playerid0PlayerInfo[playerid][Skin], 1958.331343.1215.36269.1500000);
    return 
1;
}
CarregarDB(playerid)
{
    new 
DBResult:Result;
    
format(DB_Querysizeof(DB_Query), "SELECT * FROM CONTAS WHERE NOME = '%s'"PlayerInfo[playerid][Nome]);
    
Result db_query(DatabaseDB_Query);
    if(
db_num_rows(Result))
    {
        
PlayerInfo[playerid][IDdb] = db_get_field_assoc_int(Result"ID");
        
PlayerInfo[playerid][Level] = db_get_field_assoc_int(Result"LEVEL");
        
PlayerInfo[playerid][Dinheiro] = db_get_field_assoc_int(Result"DINHEIRO");
        
PlayerInfo[playerid][Skin] = db_get_field_assoc_int(Result"SKIN");
        
PlayerInfo[playerid][Matou] = db_get_field_assoc_int(Result"MATOU");
        
PlayerInfo[playerid][Morreu] = db_get_field_assoc_int(Result"MORREU");
        
PlayerInfo[playerid][Admin] = db_get_field_assoc_int(Result"ADMIN");
        
PlayerInfo[playerid][Vip] = db_get_field_assoc_int(Result"VIP");
    }
    
db_free_result(Result);
    
    
PlayerInfo[playerid][Logado] = true;
    
SetPlayerScore(playeridPlayerInfo[playerid][Level]);
    
GivePlayerMoney(playeridPlayerInfo[playerid][Dinheiro]);
    
SetSpawnInfo(playerid1PlayerInfo[playerid][Skin], 1958.331343.1215.36269.1500000);
    return 
1;
}
SalvarDB(playerid)
{
    if(
PlayerInfo[playerid][Logado] == false) return 1;
    
    new 
str[64];
    
format(DB_Querysizeof(DB_Query), "");
    
strcat(DB_Query"UPDATE CONTAS SET ");
    
    
format(str64"IP = '%s',"PlayerInfo[playerid][IP]);                 strcat(DB_Querystr);
    
format(str64"NOME = '%s',"PlayerInfo[playerid][Nome]);             strcat(DB_Querystr);
    
format(str64"SENHA = '%s',"PlayerInfo[playerid][Senha]);          strcat(DB_Querystr);
    
format(str64"LEVEL = '%d',"PlayerInfo[playerid][Level]);              strcat(DB_Querystr);
    
format(str64"DINHEIRO = '%d',"PlayerInfo[playerid][Dinheiro]);     strcat(DB_Querystr);
    
format(str64"SKIN = '%d',"PlayerInfo[playerid][Skin]);             strcat(DB_Querystr);
    
format(str64"MATOU = '%d',"PlayerInfo[playerid][Matou]);             strcat(DB_Querystr);
    
format(str64"MORREU = '%d',"PlayerInfo[playerid][Morreu]);         strcat(DB_Querystr);
    
format(str64"ADMIN = '%d',"PlayerInfo[playerid][Admin]);             strcat(DB_Querystr);
    
format(str64"VIP = '%d'"PlayerInfo[playerid][Vip]);                 strcat(DB_Querystr);
    
format(str64" WHERE ID = '%d'"PlayerInfo[playerid][IDdb]);             strcat(DB_Querystr);
    
db_query(DatabaseDB_Query);
    
    
PlayerInfo[playerid][Logado] = false;
    return 
1;
}
forward Kickar(playerid);
public 
Kickar(playerid) return Kick(playerid);
CMD:viraradmin(playeridparams[])
{
    if(!
IsPlayerAdmin(playerid)) return SendClientMessage(playeridVERMELHO"ERRO, comando restrito a administradores RCON.");
    
SendClientMessage(playeridAZUL_CLARO"ADMIN: Bem vindo a administraзгo do servidor.");
    
PlayerInfo[playerid][Admin] = 5;
    return 
1;
}
CMD:daradmin(playeridparams[])
{
    new 
IDnivelString[128];
    if(
sscanf(params"ud"IDnivel)) return SendClientMessage(playeridCINZA"ADMIN: Use /daradmin [ID] [nivel]");
    if(!
IsPlayerConnected(ID)) return SendClientMessage(playeridVERMELHO"ERRO: ID invalido");
    
format(Stringsizeof(String), "O jogador {1B95E0}%s{00C2EC} й o mais novo admin do servidor!"PlayerInfo[ID][Nome]);
    
SendClientMessageToAll(AZUL_CLAROString);
    
    
PlayerInfo[ID][Admin] = nivel;
    
SendClientMessage(playeridLARANJA"ADMIN: Comando efetuado com sucesso !");
    return 
1;
}
CMD:tiraradmin(playeridparams[])
{
    new 
IDString[128];
    if(
sscanf(params"u"ID)) return SendClientMessage(playeridCINZA"ADMIN: Use /tirar [ID]");
    if(
PlayerInfo[ID][Admin] == 0) return SendClientMessage(playeridVERMELHO"ERRO: Esse player nгo e admin!");
    if(!
IsPlayerConnected(ID)) return SendClientMessage(playeridVERMELHO"ERRO: ID invalido");
    
    
format(Stringsizeof(String), "ADMIN: O Admin dono {1B95E0}%s{00C2EC} tirou o admin de {1B95E0}%s{00C2EC}"PlayerInfo[playerid][Nome], PlayerInfo[ID][Nome]);
    
SendClientMessageToAll(AZUL_CLAROString);
    
    
PlayerInfo[ID][Admin] = 0;
    return 
1;
}
CMD:liberar(playeridparams[])
{
    new 
ID;
    if(
sscanf(params"u"ID)) return SendClientMessage(playeridCINZA"ADMIN: Use /liberar [ID]");
    if(!
IsPlayerConnected(ID)) return SendClientMessage(playeridVERMELHO"ERRO: ID invalido");
    
SendClientMessage(IDAZUL_CLARO"ADMIN: Vocк esta liberado a trocar de senha/nome use /trocarsenha ou /trocarnome");
    
PlayerInfo[ID][Liberado] = true;
    
SendClientMessage(playeridLARANJA"ADMIN: Comando efetuado com sucesso !");
    return 
1;
}
CMD:trocarsenha(playeridparams[])
{
    if(
PlayerInfo[playerid][Liberado] == false) return SendClientMessage(playeridVERMELHO"ERRO: Para trocar senha vocк deve pedir permissгo a um admin.");
    
SendClientMessage(playeridAZUL_CLARO"ADMIN: Digite a nova senha a ser usada.");
    
    
ShowPlayerDialog(playeridDIALOG_SENHADIALOG_STYLE_PASSWORD"Digite uma nova senha:""Digite sua nova senha abaixo\n\nObs: Ela deve conter no mнnimo 4 e no mбximo 20 caracteres.""Trocar""Voltar");
    return 
1;
}
CMD:trocarnome(playeridparams[])
{
    if(
PlayerInfo[playerid][Liberado] == false) return SendClientMessage(playeridVERMELHO"ERRO: Para trocar nome vocк deve pedir permissгo a um admin.");
    
SendClientMessage(playeridAZUL_CLARO"ADMIN: Digite o novo nome a ser usado. Lembre-se de alterar no SAMP.");
    
    
ShowPlayerDialog(playeridDIALOG_NOMEDIALOG_STYLE_INPUT"Digite um novo nome:""Digite seu novo nome abaixo\n\nObs: Ele deve conter no mбximo 24 caracteres.""Trocar""Voltar");
    return 
1;
}
// ========  Comandos Admin Dono
flags:daradmin(CMD_ADMIN_DONO);
flags:tiraradmin(CMD_ADMIN_DONO);
flags:liberar(CMD_ADMIN_DONO);
public 
OnPlayerCommandPerformed(playeridcmd[], params[], resultflags)
{
    if(
result == -1)
    {
        
SendClientMessage(playeridVERMELHO"ERRO, comando inexistente.");
        return 
0;
    }
    return 
1;
}
public 
OnPlayerCommandReceived(playeridcmd[], params[], flags)
{
    if((
flags CMD_ADMIN_DONO) && PlayerInfo[playerid][Admin] > 5)
    {
        
SendClientMessage(playeridVERMELHO"ERRO, comando restrito a administradores donos.");
         return 
0;
    }
    return 
1;


• Bom proveito. Qualquer dъvida estou a disposiзгo.
Reply
#2

Tб bem interessante pelo que vi, mas no comando trocarnome o estilo da dialog estб como DIALOG_STYLE_PASSWORD nгo seria melhor DIALOG_STYLE_INPUT?
E vocк pode utilizar enums para as dialogs e tambйm para a variбvel CMD_ADMIN_DONO.
Enfim, bom trabalho +REP.
Reply
#3

Quote:
Originally Posted by ViDaLoKa1
Посмотреть сообщение
Tб bem interessante pelo que vi, mas no comando trocarnome o estilo da dialog estб como DIALOG_STYLE_PASSWORD nгo seria melhor DIALOG_STYLE_INPUT?
E vocк pode utilizar enums para as dialogs e tambйm para a variбvel CMD_ADMIN_DONO.
Enfim, bom trabalho +REP.
Com toda certeza DIALOG_STYLE_INPUT, й que passou despercebido.
Sobre as dialog й mais uma questгo pessoal mesmo.

Mas obrigado
Reply
#4

@Carlos001

Sobre as linhas nunca se sabe o tamanho do salvamento que sera feito no futuro
entгo pra evitar linhas grandes uso strcat e tambйm por questгo estйtica e organizada.

Obrigado pelo feedback e dicas :3
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)