Слет аккаунтов
#1

Ребят вопрос конечно хорош, начну с кода:

Код:
#include <mxINI>
#include <md5>

enum pInfo{
pBank,
pAdmin,
pScore,};

forward SaveAccounts();

stock SaveAccount(playerid){
new PlayerName[MAX_PLAYER_NAME], account[128];
GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
format(account,sizeof(account), "users/%s.ini", PlayerName);
new iniFile = ini_openFile(account);
ini_setInteger(iniFile, "Bank", Player[playerid][pBank]);
ini_setInteger(iniFile, "Score", GetPlayerScore(playerid));
ini_setInteger(iniFile, "Level", Player[playerid][pAdmin]);
ini_closeFile(iniFile);
return true;}

pubblic OnPlayerConnect(playerid){
new PlayerName[MAX_PLAYER_NAME];
GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
new account[128];
format(account,sizeof(account),"users/%s.ini",PlayerName);
if(!fexist(account)) {
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Зарегистрируйтесь! Введите пароль", "ок", "");
}else{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "{FFFFFF}Àâòîðèçàöèÿ", "Авторизуйтесь! Введите пароль", "ок", "");}
return true;}

public OnPlayerDisconnect(playerid, reason){
new PlayerName[MAX_PLAYER_NAME], account[128];
GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
format(account,sizeof(account), "users/%s.ini", PlayerName);
new iniFile = ini_openFile(account);
ini_setInteger(iniFile, "Bank", Player[playerid][pBank]);
ini_setInteger(iniFile, "Score", GetPlayerScore(playerid));
ini_closeFile(iniFile);
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]){
if(dialogid == 1){
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Зарегистрируйтесь! Введите пароль", "ок", "");
if(response){
if(IsPlayerConnected(playerid)){
new PlayerName[MAX_PLAYER_NAME];
GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
new account[128];
format(account,sizeof(account),"users/%s.ini",PlayerName);
if(fexist(account)) return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Авторизуйтесь! Введите пароль", "ок", "");
new iniFile = ini_createFile(account);
if(iniFile < 0) ini_openFile (account);{
ini_setString(iniFile,"Ïàðîëü",inputtext);
ini_setInteger(iniFile, "Bank", 0);
ini_setInteger(iniFile, "Score", 0);
ini_setInteger(iniFile, "Level", 0);
ini_closeFile(iniFile);
SetPVarInt(playerid, "Logged", 0);
if(fexist(account)) return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Авторизуйтесь! Введите пароль", "ок", ""); }
}else{
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Зарегистрируйтесь! Введите пароль", "ок", "");}}}

if(dialogid == 2){
if(!strlen(inputtext)) return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Авторизуйтесь! Введите пароль", "ок", ""); 
if(response){
new PlayerName[MAX_PLAYER_NAME], password[64];
GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
new account[128];
format(account,sizeof(account),"users/%s.ini",PlayerName);
if(IsPlayerNPC(playerid))return true;
new iniFile = ini_openFile(account);
ini_getString(iniFile, "Пароль",password);
if(!strcmp(inputtext, password, true)){
ini_getInteger(iniFile, "Bank", Player[playerid][pBank]);
ini_getInteger(iniFile, "Score", Player[playerid][pScore]);
ini_getInteger(iniFile, "Level", Player[playerid][pAdmin]);
SetPlayerScore(playerid, Player[playerid][pScore]);
GivePlayerMoney(playerid, Player[playerid][pMoney]);
ini_closeFile(iniFile);
logged[playerid] = 1;
GameTextForPlayer(playerid, "~y~Logged in!",2000,1);
PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
if(Player[playerid][pAdmin] == 0){
GetPlayerName(playerid, PlayerName, 30);
format(string, sizeof(string), "Загруженный как: %s, игрок", PlayerName);
SendClientMessage(playerid, 0x33AA33AA, string);}
if(Player[playerid][pAdmin] == 100){
GetPlayerName(playerid, PlayerName, 30);
format(string, sizeof(string), "Загруженный как: %s, уровень 1 (Администратор)", PlayerName);
SendClientMessage(playerid, 0x33AA33AA, string);}
if(Player[playerid][pAdmin] == 101){
GetPlayerName(playerid, PlayerName, 30);
format(string, sizeof(string), "Загруженный как: %s, уровень 2 (Владелец ресурса)", PlayerName);
SendClientMessage(playerid, 0x33AA33AA, string);}
return true;
}else{
SendClientMessage(playerid, 0xFF0000AA, "Неверно указан пароль! Попробуйте еще раз");
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Авторизуйтесь! Введите пароль", "ок", ""); 
return true;}
}else{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Авторизуйтесь! Введите пароль", "ок", ""); 
return false;}}
return false;}

public SaveAccounts(){
for(new f; f < GetMaxPlayers(); f++){
if(!IsPlayerConnected(f))continue;
SaveAccount(f);}}
Сама суть проблемы:
В данном коде указана система регистрации. Проблема в том, что через некоторое время (примерно день или пол дня) аккаунт недееспособен.
К примеру:
Вчера был я админом с 100 фрагами, сегодня захожу - бац обычный игрок и фрагов нет. При этом аккаунт на хосте не тронут. После перезагрузки сервера все становится обратно. Все бы ничего, но получается что не грузит файл аккаунта.
Помогите кто-нибудь разобраться. Голову изломал не могу решения найти.

Стоит учесть что путь акков таков: users/%s.ini (папка scriptfiles)
Reply
#2

Файл закрывается только при выполнении условия
Код:
if(!strcmp(inputtext, password, true))
И не закрывается при несовпадении пароля. Поэтому при нескольких вводах неправильного пароля на любом аккаунте (2 при дефолтных настройках mxINI), не остается свободных дескрипторов. Файл нужно закрывать и перед
Код:
SendClientMessage(playerid, 0xFF0000AA, "Неверно указан пароль! Попробуйте еще раз");
Reply
#3

эммм примеряясь к коду я так и не допер.
Quote:

if(!strlen(inputtext)) return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Авторизуйтесь! Введите пароль", "ок", "");

указывает на то что если вы эскейт то иди еще раз автоизуйся вроде как

я конечно не профи, но я бы был бы блыгодарен, если кто-то изменил бы мой код и указал контекстно, где изменение, дабы учение чтоб прошло для моего ума.
Reply
#4

Просьба! Укажите верный путь кода
Reply
#5

вроде как всё по полочкам разжевали... что если игрок вводит неверный пароль, то надо так же точно закрывать файл аккаунт как и в случае если игрок ввёл верный пароль.
Reply
#6

Говоря проще, найдите
Код:
SendClientMessage(playerid, 0xFF0000AA, "Неверно указан пароль! Попробуйте еще раз");
замените на
Код:
ini_closeFile(iniFile);
SendClientMessage(playerid, 0xFF0000AA, "Неверно указан пароль! Попробуйте еще раз");
Вообще же, лучше бы соблюдать табуляцию и пересмотреть алгоритм авторизации - много лишнего и ненужного кода.
Reply
#7

Запомните несколько простых правил:

pawn Код:
new File = ini_openFile(...);
if(File >= 0) //перед обращением к файлу и закрытием его, проверяем, открылся ли он. Это очень важно
{
    //работаем с содержимым файла. Никаких остановок выполнения кода, до закрытия файла, не должно быть!
    ini_closeFile(File);
}
Reply
#8

спасибо
Reply
#9

Опять слетает, итого 6 часов. Может я что то упустил или не правильно делаю. Подскажите еще варианты
Reply
#10

Что значит "аккаунт на хосте не тронут"?
Дата и время изменения не удовлетворяет тем, когда якобы должна произойти запись?

Если так, проверяйте коды возврата функций ini_openFile и ini_createFile (то есть, проверьте, является ли дескриптор действительным). Если же нет, проверяйте везде закрытие дескрипторов.

И рекомендую глянуть на настройки mxINI. Если я не ошибаюсь, стандартно там выделяется мало дескрипторов, - надо выделить побольше.

P.S.

И перепишите код.
Отсутствие лесенки и ошибки вроде "pubblic" снижают градус интереса чтения.

И здесь: if(!strcmp(inputtext, password, true)) замените true на false - вам ведь нужен точный пароль, с учетом регистра
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)