Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Nazwa: Register & Login
- * Autor: l0nger (aka AXV) <[email protected] | [email protected]>
- * Wersja: 1.1.132011
- *
- * Wymagane technologie baz danych: MySQL
- * Wymagane wtyczki: sscanf 2.8.1
- * (C) <2013>, <[email protected] | pawno.pl>
- **/
- #pragma dynamic 4096
- #pragma compress 1
- // naglowek SAMP
- #include a_samp
- #define ALREADY_REDEFINED_MAXPLAYERS
- #if defined ALREADY_REDEFINED_MAXPLAYERS
- #undef MAX_PLAYERS
- #define MAX_PLAYERS (5) // Prosze tutaj wpisac liczbe slotow serwera
- #endif
- // naglowki technologiczne
- #include sscanf // Y_Less > 2.8.1
- #include mysql // StrickenKid > 2.1.1
- // makrorozwieniecia
- #define outputChatMsg(%1,%2,%3) SendClientMessage(%1, %2, %3)
- #define hidePlayerDialog(%1) ShowPlayerDialog(%1, -1, NULL, {NULL}, {NULL}, {NULL}, {NULL})
- #define ResetVariablesInEnum(%0,%1) for(new __rvine; %1:__rvine != %1; __rvine++) %0[%1:__rvine]=0
- // Dane do polaczenia z MySQL
- #define SQL_HOSTNAME "localhost" // host
- #define SQL_USERNAME "username" // uzytkownik
- #define SQL_PASSWORD "password" // haslo
- #define SQL_DATABASE "database" // baza danych
- // Prefiks tabel
- #define PREFIX_DB "px_"
- // Zmienne stale, wyliczeniowe i nie tylko...
- const MAX_LOGIN_ATTEMPTS = (5); // maksymalnie 5 prob logowan
- const NULL = (0); // miejsce zerowe!
- enum {
- dialog_info = 0,
- dialog_login,
- dialog_register
- };
- enum E_PLAYER_DATA {
- /* bool */
- bool:loggedIn,
- /* chars */
- nickname[24],
- ipv4[16],
- /* int */
- timeOnline,
- score,
- money,
- kills,
- deaths,
- suicides,
- loginAttempts // max. 5 prob
- };
- new
- PlayerData[MAX_PLAYERS][E_PLAYER_DATA],
- MySQL:hMySQL;
- // Funkcje publiczne
- public OnFilterScriptInit() {
- hMySQL = mysql_init(LOG_ONLY_ERRORS);
- new mysqlHandle = mysql_connect(SQL_HOSTNAME, SQL_USERNAME, SQL_PASSWORD, SQL_DATABASE, hMySQL, true);
- if(mysqlHandle) {
- CreateDatabase();
- print(" [REG&LOG]: Polaczono z baza danych!");
- } else print(" [REG&LOG]: Nie mozna nawiazac polaczenia z baza danych! Sprawdz dane konfiguracyjne."), SendRconCommand("exit");
- print(" Skrypt Register & Login - zaladowany poprawnie!");
- return 1;
- }
- public OnFilterScriptExit() {
- mysql_close(hMySQL);
- return 1;
- }
- public OnPlayerConnect(playerid) {
- ResetVariablesInEnum(PlayerData[playerid], E_PLAYER_DATA);
- PlayerData[playerid][timeOnline]=gettime();
- GetPlayerName(playerid, PlayerData[playerid][nickname], 24);
- GetPlayerIp(playerid, PlayerData[playerid][ipv4], 16);
- new
- s_buf[120+MAX_PLAYER_NAME];
- if(PlayerExistsInDatabase(playerid)) {
- format(s_buf, sizeof(s_buf), "Witaj, %s!\nTwoje konto jest zarejestrowane.\nProszę wpisać hasło w poniższe okno, a następnie kliknąć przycisk 'ZALOGUJ'", PlayerData[playerid][nickname]);
- ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Panel > Logowanie", s_buf, "Zaloguj", "Opusc");
- } else {
- format(s_buf, sizeof(s_buf), "Witaj, %s!\nTwoje konto nie jest zarejestrowane.\nProszę wpisać hasło w poniższe okno, a następnie kliknąć przycisk 'REJESTRUJ'", PlayerData[playerid][nickname]);
- ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_PASSWORD, "Panel > Rejestracja", s_buf, "Rejestruj", "");
- }
- return 1;
- }
- public OnPlayerDisconnect(playerid, reason) {
- SavePlayerData(playerid, .leaving=1);
- }
- public OnPlayerDeath(playerid, killerid, reason) {
- if(killerid != INVALID_PLAYER_ID) {
- PlayerData[killerid][kills]++;
- PlayerData[playerid][deaths]++;
- } else {
- PlayerData[playerid][deaths]++;
- PlayerData[playerid][suicides]++;
- }
- }
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
- static
- s_buf[120+MAX_PLAYER_NAME];
- switch(dialogid) {
- case dialog_info: return 1;
- case dialog_login: {
- if(!response) {
- outputChatMsg(playerid, -1, "Anulowales logowanie.");
- hidePlayerDialog(playerid);
- kickPlayer(playerid);
- return 0;
- }
- if(!OnPlayerLogin(playerid, inputtext)) {
- format(s_buf, sizeof(s_buf), "Witaj, %s!\nTwoje konto jest zarejestrowane.\nProszę wpisać hasło w poniższe okno, a następnie kliknąć przycisk 'ZALOGUJ'", PlayerData[playerid][nickname]);
- ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Panel > Logowanie", s_buf, "Zaloguj", "Opusc");
- }
- }
- case dialog_register: {
- if(!response) return 1;
- if(!OnPlayerRegister(playerid, inputtext)) {
- format(s_buf, sizeof(s_buf), "Witaj, %s!\nTwoje konto nie jest zarejestrowane.\nProszę wpisać hasło w poniższe okno, a następnie kliknąć przycisk 'REJESTRUJ'", PlayerData[playerid][nickname]);
- ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_PASSWORD, "Panel > Rejestracja", s_buf, "Rejestruj", "");
- }
- }
- }
- return 1;
- }
- /**
- * @name: OnPlayerLogin
- * @desc: Funkcja sprawdza, czy haslo jest poprawne - jezeli tak - nastepuje wczytanie danych i wywolanie spawnu gracza
- * @params: playerid=id gracza, password=wpisywane haslo w GUI
- * @returns: brak
- **/
- stock OnPlayerLogin(playerid, password[]) {
- if(!password[0] || password[0] && !password[1]) {
- PlayerData[playerid][loginAttempts]++;
- return false;
- }
- // -- SPRAWDZANIE POPRAWNOSCI HASLA --
- for(new i, j = strlen(password); i<j; i++) {
- switch(password[i]) {
- case 'a' .. 'z', 'A' .. 'Z', '0' .. '9', ';', '!', '@', '#', '$', '^', '&', '*', '(', ')': continue;
- default: return false;
- }
- }
- new
- esc_password[32], // 25+7 na znaki escapowane
- esc_nickname[24+5], // to co wyzej
- s_buf[160];
- mysql_real_escape_string(PlayerData[playerid][nickname], esc_nickname);
- mysql_real_escape_string(password, esc_password);
- format(s_buf, sizeof(s_buf), "SELECT (password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, '%s'))))) AS valid FROM "PREFIX_DB"players WHERE nickname = '%s' LIMIT 1;", esc_password, esc_nickname);
- printf(s_buf);
- mysql_query(s_buf);
- mysql_store_result();
- new valid=mysql_fetch_int();
- mysql_free_result();
- if(!valid) {
- format(s_buf, sizeof(s_buf), "proba zalogowania sie na konto %s", PlayerData[playerid][nickname]);
- RegisterLogWithIP(PlayerData[playerid][ipv4], s_buf);
- if(++PlayerData[playerid][loginAttempts]>=MAX_LOGIN_ATTEMPTS-1) {
- format(s_buf, sizeof(s_buf), "proba zalogowania sie na konto %s - wyrzucony", PlayerData[playerid][nickname]);
- RegisterLogWithIP(PlayerData[playerid][ipv4], s_buf);
- hidePlayerDialog(playerid);
- kickPlayer(playerid);
- outputChatMsg(playerid, -1, "Wykorzystales limit prob zalogowan na konto. {ff0000}Zostales wyrzucony.");
- return false;
- }
- outputChatMsg(playerid, -1, "Podane haslo jest nieprawidlowe.");
- return false;
- } else {
- format(s_buf, sizeof(s_buf), "zalogowano sie na konto %s", PlayerData[playerid][nickname]);
- RegisterLogWithIP(PlayerData[playerid][ipv4], s_buf);
- PlayerData[playerid][loggedIn]=true;
- }
- format(s_buf, sizeof(s_buf), "UPDATE "PREFIX_DB"players SET is_online=1, ts_activelast=NOW(), address_ip='%s', logons=logons+1 WHERE nickname='%s';", PlayerData[playerid][ipv4], PlayerData[playerid][nickname]);
- mysql_query(s_buf);
- FetchPlayerData(playerid);
- format(s_buf, sizeof(s_buf), "%s! Jest to Twoja %d wizyta na tym serwerze.", PlayerData[playerid][nickname], GetPlayerIntegerData(playerid, "logons"));
- outputChatMsg(playerid, -1, s_buf);
- SpawnPlayer(playerid);
- return true;
- }
- /**
- * @name: OnPlayerRegister
- * @desc: Funkcja, ma za zadanie zarejestrowac gracza do bazy danych. Funkcja takze ma za zadanie sprawdzac znaki w hasle, czy nie sa nieprawidlowe
- * @params: playerid=id gracza, password=wpisywane haslo w GUI
- * @returns: false=jezeli haslo bedzie puste, lub nieprawidlowe, true=jezeli proces rejestracji przebiegnie prawidlowo
- **/
- stock OnPlayerRegister(playerid, const password[]) {
- if(!password[0] || password[0] && !password[1]) return false;
- // -- SPRAWDZANIE POPRAWNOSCI HASLA --
- for(new i, j = strlen(password); i<j; i++) {
- switch(password[i]) {
- case 'a' .. 'z', 'A' .. 'Z', '0' .. '9', ';', '!', '@', '#', '$', '^', '&', '*', '(', ')': continue;
- case ':', '<', '>', '/', '[', ']': continue;
- default: return false;
- }
- }
- new
- s_salt[5],
- esc_password[32], // 25+7 na znaki escapowane
- esc_nickname[24+5], // to co wyzej
- s_buf[250];
- // -- GENEROWANIE SOLI --
- new i_salt;
- while(i_salt<sizeof(s_salt)-1) {
- s_salt[i_salt]=random(2)?(random(26)+(random(2)?'a':'A')):(random(10)+'0');
- i_salt++;
- }
- print(s_salt);
- mysql_real_escape_string(password, esc_password);
- mysql_real_escape_string(PlayerData[playerid][nickname], esc_nickname);
- format(s_buf, sizeof(s_buf), "INSERT INTO "PREFIX_DB"players (nickname, salt, password, address_ip, ts_register, ts_activelast) VALUES ('%s', '%s', SHA1(CONCAT('%s', SHA1(CONCAT('%s', '%s')))), '%s', NOW(), NOW());", esc_nickname, s_salt, s_salt, s_salt, esc_password, PlayerData[playerid][ipv4]);
- if(mysql_query(s_buf) || !mysql_affected_rows()) {
- format(s_buf, sizeof(s_buf), "proba rejestracji konta: %s - nieudana, blad z polaczeniem mysql", PlayerData[playerid][nickname]);
- RegisterLogWithIP(PlayerData[playerid][ipv4], s_buf);
- outputChatMsg(playerid, -1, "Wystapil blad podczas wysylania formularza danych. Sprobuj ponownie!");
- hidePlayerDialog(playerid);
- kickPlayer(playerid);
- return false;
- }
- format(s_buf, sizeof(s_buf), "zarejestrowano konto: %s", PlayerData[playerid][nickname]);
- RegisterLogWithIP(PlayerData[playerid][ipv4], s_buf);
- format(s_buf, sizeof(s_buf), "Zarejestrowales konto: %s! Twoje haslo: %s - zapamietaj je do przyszlego logowania!", PlayerData[playerid][nickname], password);
- outputChatMsg(playerid, -1, s_buf);
- PlayerData[playerid][loggedIn]=true;
- SpawnPlayer(playerid);
- return true;
- }
- /**
- * @name: RegisterLogWithIP
- * @desc: Zapisywanie danych do logu rejestracji i logowan, lacznie z adresem ip
- * @params: ivp4=IP gracza, desc=opis przebiegu logu
- * @returns: brak
- **/
- stock RegisterLogWithIP(const address_ip[], const desc[]) {
- new
- s_buf[160];
- format(s_buf, sizeof(s_buf), "INSERT INTO "PREFIX_DB"logins_logs (ts, address_ip, opis) VALUES (NOW(), '%s', '%s');", address_ip, desc);
- mysql_query(s_buf);
- printf(" [REG&LOG]: Zarejestrowano zdarzenie id: %d -> %s, %s", mysql_insert_id(), desc, address_ip);
- }
- /**
- * @name: PlayerExistsInDatabase
- * @desc: Funkcja sprawdza, czy w bazie danych konto o podanym nicku istnieje
- * @params: playerid=id gracza
- * @returns: false=jezeli konto nie istnieje, true=jezeli konto istnieje
- **/
- stock PlayerExistsInDatabase(playerid) {
- new
- s_buf[100];
- format(s_buf, sizeof(s_buf), "SELECT 1 FROM "PREFIX_DB"players WHERE nickname='%s' LIMIT 1;", PlayerData[playerid][nickname]);
- mysql_query(s_buf);
- mysql_store_result();
- new exid=mysql_num_rows() && mysql_fetch_int()>=1;
- mysql_free_result();
- return exid;
- }
- /**
- * @name: SavePlayerData
- * @desc: Funkcja zapisuje podstawowe dane gracza
- * @params: playerid=id gracza, leaving=czy juz wychodzi (potrzebne do zmiany is_online)
- * @returns: brak
- **/
- stock SavePlayerData(playerid, leaving=0) {
- new
- s_buf[128];
- format(s_buf, sizeof(s_buf), "UPDATE "PREFIX_DB"players SET time_online=%d, score=%d, money=%d, deaths=%d, suicides=%d, kills=%d, is_online=%d WHERE nickname='%s';",
- gettime()-PlayerData[playerid][timeOnline],
- PlayerData[playerid][score],
- PlayerData[playerid][money],
- PlayerData[playerid][deaths],
- PlayerData[playerid][suicides],
- PlayerData[playerid][kills],
- (leaving==0)?1:0,
- PlayerData[playerid][nickname]
- );
- mysql_query(s_buf);
- }
- /**
- * @name: FetchPlayerData
- * @desc: Funkcja pobiera wszystkie potrzebne dane, do wyswietlenia
- * @params: playerid=id gracza
- * @returns: brak
- **/
- stock FetchPlayerData(playerid) {
- new
- s_buf[127],
- tmpTime;
- format(s_buf, 127, "SELECT money, score, kills, time_online, deaths, suicides FROM "PREFIX_DB"players WHERE nickname='%s' LIMIT 1;", PlayerData[playerid][nickname]);
- mysql_query(s_buf);
- mysql_store_result();
- if(mysql_fetch_row(s_buf, "|")) {
- sscanf(s_buf, "p<|>dddddd",
- PlayerData[playerid][money],
- PlayerData[playerid][score],
- PlayerData[playerid][kills],
- tmpTime,
- PlayerData[playerid][deaths],
- PlayerData[playerid][suicides]
- );
- }
- mysql_free_result();
- PlayerData[playerid][timeOnline]+=tmpTime;
- SetPlayerScore(playerid, PlayerData[playerid][score]);
- GivePlayerMoney(playerid, PlayerData[playerid][money]);
- }
- /**
- * @name: GetPlayerIntegerData
- * @desc: Funkcja pobiera dane w postaci liczbowej z podanej kolumny (arg. column)
- * @params: playerid=id gracza, column=kolumna ISTNIEJACA w tabeli players
- * @returns: zwroci otrzymana wartosc
- **/
- stock GetPlayerIntegerData(playerid, const column[]) {
- new
- s_buf[127];
- format(s_buf, 127, "SELECT %s FROM "PREFIX_DB"players WHERE nickname='%s' LIMIT 1;", column, PlayerData[playerid][nickname]);
- mysql_query(s_buf);
- mysql_store_result();
- mysql_fetch_row(s_buf);
- mysql_free_result();
- return strval(s_buf);
- }
- /**
- * @name: CreateDatabase
- * @desc: Funkcja, ma za zadanie stworzyc tabele
- * @params: option=opcja tworzenia (0=tworzy, jezeli ich nie ma, 1=usuwa tabele)
- * @returns: brak
- **/
- stock CreateDatabase(option=0) {
- if(option==1) {
- mysql_query("DROP TABLE "PREFIX_DB"players, "PREFIX_DB"logins_logs;");
- }
- new
- s_buf[1024] = "CREATE TABLE IF NOT EXISTS "PREFIX_DB"players(";
- strcat(s_buf, "id INT NOT NULL AUTO_INCREMENT,");
- strcat(s_buf, "nickname VARCHAR(24) NOT NULL,");
- strcat(s_buf, "password VARCHAR(48) NOT NULL,");
- strcat(s_buf, "salt VARCHAR(5) NOT NULL,");
- strcat(s_buf, "address_ip VARCHAR(16) NOT NULL DEFAULT '0.0.0.0',");
- strcat(s_buf, "ts_register TIMESTAMP NOT NULL,");
- strcat(s_buf, "ts_activelast TIMESTAMP NOT NULL,");
- strcat(s_buf, "logons SMALLINT NOT NULL DEFAULT '1',");
- strcat(s_buf, "time_online INT NOT NULL DEFAULT '0',");
- strcat(s_buf, "score INT NOT NULL DEFAULT '1',");
- strcat(s_buf, "money INT NOT NULL DEFAULT '1',");
- strcat(s_buf, "deaths INT NOT NULL DEFAULT '0',");
- strcat(s_buf, "suicides INT NOT NULL DEFAULT '0',");
- strcat(s_buf, "kills INT NOT NULL DEFAULT '0',");
- strcat(s_buf, "is_online TINYINT(1) NOT NULL DEFAULT '0',");
- strcat(s_buf, "PRIMARY KEY (`id`), UNIQUE KEY `nickname` (`nickname`), KEY `score` (`score`));");
- mysql_query(s_buf);
- s_buf="CREATE TABLE IF NOT EXISTS "PREFIX_DB"logins_logs(";
- strcat(s_buf, "id INT NOT NULL AUTO_INCREMENT,");
- strcat(s_buf, "ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,");
- strcat(s_buf, "address_ip VARCHAR(16) NOT NULL DEFAULT '0.0.0.0',");
- strcat(s_buf, "opis VARCHAR(100) NOT NULL DEFAULT 'brak zarejestrowanego opisu',");
- strcat(s_buf, "PRIMARY KEY (`id`));");
- mysql_query(s_buf);
- }
- // Implementacja kickfix
- stock kickPlayer(playerid) {
- SetTimerEx("func_kickPlayer", 100, 0, "i", playerid);
- }
- forward func_kickPlayer(playerid);
- public func_kickPlayer(playerid) {
- if(IsPlayerConnected(playerid)) {
- Kick(playerid);
- return 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment