I started with a register system too and because I have tried so many until now, I chose SQLite, it is very easy and I can provide you my first registration system. If you want to use it, go ahead!
pawn Код:
#include < a_samp >
#define MAX_INI_ENTRY_TEXT 80
#define SERVER_DATABASE "server.db"
#define DIALOG_REGISTER 2100
#define DIALOG_LOGIN 2150
#define COL_CYAN "{96FFFF}"
#define COL_GREEN "{00FF00}"
#define COL_RED "{FF0000}"
#define COL_SERVER_TIP "{96FF96}"
#define COL_WHITE "{FFFFFF}"
#define COL_YELLOW "{FFFF00}"
native WP_Hash( buffer[ ], len, const str[ ] );
new
DB:Database,
Query[ 512 ],
ip[ 16 ],
hashed_password[ 129 ],
DBResult:Result
;
main( ) { }
public OnGameModeInit( )
{
Database = db_open( SERVER_DATABASE );
db_free_result( db_query( Database, "CREATE TABLE IF NOT EXISTS `USERS` (`NAME`, `PASSWORD`, `IP`, `SCORE`)" ) );
return 1;
}
public OnGameModeExit( )
{
db_close( Database );
return 1;
}
public OnPlayerConnect( playerid )
{
format( Query, sizeof( Query ), "SELECT * FROM `USERS` WHERE `NAME` = '%s'", GetName( playerid ) );
Result = db_query( Database, Query );
if( db_num_rows( Result ) )
{
format( Query, sizeof( Query ), ""COL_WHITE"Hey, "COL_CYAN"%s"COL_WHITE"! \nYour account is registered.\nPlease enter the password to log in!", GetName( playerid ) );
ShowPlayerDialog( playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, ""COL_YELLOW"Login", Query, "Login", "Leave" );
}
else
{
format( Query, sizeof( Query ), ""COL_WHITE"Hey, "COL_CYAN"%s"COL_WHITE"! \nYour account is not registered. \nPlease register to continue!", GetName( playerid ) );
ShowPlayerDialog( playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_YELLOW"Register", Query, "Register", "" );
}
return 1;
}
public OnPlayerDisconnect( playerid, reason )
{
OnPlayerLogout( playerid );
return 1;
}
public OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
{
switch( dialogid )
{
case DIALOG_REGISTER: if( response ) return OnPlayerRegister( playerid, inputtext );
case DIALOG_LOGIN:
{
if( !response ) return Kick( playerid );
if( response ) return OnPlayerLogin( playerid, inputtext );
}
}
return 0;
}
OnPlayerRegister( playerid, password[ ] )
{
if( !strlen( password ) )
{
SendClientMessage( playerid, -1, "You have entered an invalid password." );
ShowPlayerDialog( playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_YELLOW"Register", ""COL_WHITE"Your account is not registered. \nPlease register to continue!", "Register", "" );
return 1;
}
GetPlayerIp( playerid, ip, sizeof( ip ) );
WP_Hash( hashed_password, 129, password );
format( Query, sizeof( Query ), "SELECT * FROM `USERS` WHERE `NAME` = '%s'", GetName( playerid ) );
Result = db_query( Database, Query );
if( !db_num_rows( Result ) )
{
format( Query, sizeof( Query ), "INSERT INTO `USERS` (`NAME`, `PASSWORD`, `IP`, `SCORE`) VALUES('%s','%s','%s','%d')", GetName( playerid ), DB_Escape( hashed_password ), DB_Escape( ip ), 0 );
db_free_result( db_query( Database, Query ) );
SendClientMessage( playerid, -1, "Successful Registration." );
}
return 1;
}
OnPlayerLogin( playerid, password[ ] )
{
GetPlayerIp( playerid, ip, sizeof( ip ) );
WP_Hash( hashed_password, 129, password );
format( Query, sizeof( Query ), "SELECT * FROM `USERS` WHERE `NAME` = '%s' AND `PASSWORD` = '%s'", GetName( playerid ), DB_Escape( hashed_password ) );
Result = db_query( Database, Query );
if( db_num_rows( Result ) )
{
new
Field[ 30 ]
;
db_get_field_assoc( Result, "SCORE", Field, 30 );
SetPlayerScore( playerid, strval( Field ) );
SendClientMessage( playerid, -1, "Correct Password." );
}
else
{
SendClientMessage( playerid, -1, "Incorrect password." );
ShowPlayerDialog( playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, ""COL_YELLOW"Login", ""COL_WHITE"! \nYour account is registered.\nPlease enter the password to log in!", "Login", "Leave" );
return 1;
}
return 1;
}
OnPlayerLogout( playerid )
{
GetPlayerIp( playerid, ip, sizeof( ip ) );
format( Query, sizeof( Query ), "SELECT * FROM `USERS` WHERE `NAME` = '%s'", GetName( playerid ) );
Result = db_query( Database, Query );
if( db_num_rows( Result ) )
{
format( Query, sizeof( Query ), "UPDATE `USERS` SET IP = '%s', SCORE = '%d' WHERE `NAME` = '%s'", DB_Escape( ip ), GetPlayerScore( playerid ), GetName( playerid ) );
db_free_result( db_query( Database, Query ) );
}
return 1;
}
DB_Escape( text[ ] )
{
new
ret[ MAX_INI_ENTRY_TEXT * 2 ],
ch,
i,
j
;
while( ( ch = text[ i ++ ] ) && j < sizeof( ret ) )
{
if( ch == '\'' )
{
if( j < sizeof( ret ) - 2 )
{
ret[ j ++ ] = '\'';
ret[ j ++ ] = '\'';
}
}
else if( j < sizeof( ret ) ) ret[ j ++ ] = ch;
else j ++;
}
ret[ sizeof( ret ) - 1 ] = '\0';
return ret;
}
GetName( playerid )
{
new
pname[ MAX_PLAYER_NAME ]
;
GetPlayerName( playerid, pname, sizeof( pname ) );
return pname;
}