Question

Всем привет, такая ситуация как сделать так чтобы админ-пароль выдавался в базе данных моя система админки устроена так "Когда вы выдаете игроку админку пароль выдаётся рандомный даже когда вы его допустим повысите пароль выдаётся другой, даже когда вы выдаете один и тот же лвл пароль всё равно выдаётся другой + чтобы в админку нужно было авторизовываться заново" В общем как сделать так чтобы пароль выдавался(При выдаче админки) и изменялся (При изменении лвла админки)?

 

CMD:madmin(playerid, params[])
{
    new randPassword[6];
	randPassword[0] = getLowerLatinLetter();
	randPassword[1] = getLowerLatinLetter();
	randPassword[2] = getDigit();
	randPassword[3] = getDigit();
	randPassword[4] = getDigit();
	randPassword[5] = getDigit();
    new string[256];
   	if(PlayerLogged[playerid] == 0) return 1;
   	if(PlayerInfo[playerid][pAdmin] < 10 || AdminLogged[playerid] == false) return 1;
	new admin[MAX_PLAYER_NAME];
	GetPlayerName(playerid, admin, sizeof(admin));
	{
        if(sscanf(params, "ud", params[0],params[1])) return SendMes(playerid, COLOR_WHITE, "Ââåäèòå: /madmin [playerid] [level(1-7)]");
   	    if(params[1] > 10 || params[1] < 0) return SendClientMessage(playerid, COLOR_GREY, "Óðîâåíü àäìèíêè äîëæåí áûòü îò 1 äî 10.");
   	    if(params[1] == 0) return PlayerInfo[params[0]][pAdmin] = params[1],AdminLogged[params[0]] = false,SendMes(playerid,0x3bd1d1ff, " Âû íàçíà÷èëè %s àäìèíèñòðàòîðîì óðîâíÿ {FF0000}0.", sendername(params[0])),SendMes(params[0],0x3bd1d1ff, " Âû áûëè íàçíà÷åíû àäìèíèñòðàòîðîì óðîâíÿ {FF0000}0");
        if(params[0] == playerid) return SendClientMessage(playerid, COLOR_GREY, "Âû íå ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó íà ñåáå.");
		format(string, 128, "%s íàçíà÷èë íîâîãî àäìèíèñòðàòîðà %s", PlayerInfo[playerid][pSendername], sendername(params[0]));
		SendAdminMessage(COLOR_YELLOW, string);
       	format(totalstring, 100, " Âû íàçíà÷èëè %s àäìèíèñòðàòîðîì óðîâíÿ {FF0000}%d.",sendername(params[0]), params[1]);
		SendClientMessage(playerid,0x3BD1D1FF, totalstring);
		format(totalstring, 100, " Âû áûëè íàçíà÷åíû àäìèíèñòðàòîðîì óðîâíÿ {FF0000}%d",params[1]);
		SendClientMessage(params[0],0x3BD1D1FF, totalstring);
		PlayerInfo[params[0]][pAdmin] = params[1];
		SendMes(params[0], 0xF272DDFF, " Âàø ïàðîëü ê àäìèí.äîñòóïó: {FFFFFF}%s",randPassword);
	}
	return 1;
}

 

Share this post


Link to post

22 answers to this question

  • 1

Хм, видимо strcat ничего не записал в переменную, возможно из-за того, что она изначально пустая. 

Попробуйте заменить строку со strcat в команде на такую строчку

format(PlayerInfo[params[0]][pDostup], 24"%s", randPassword);

Это, наверное, будет более правильным решением, так как пароль должен перезаписаться, а не дозаписаться.

format, насколько я помню, как раз очищает строчку перед записью в нее. 

Share this post


Link to post
  • 0

@R0m4ik, я правильно понимаю, что суть вопроса кроется в двух проблемах?

  1. При изменении прав администратора новый пароль администратора не сохраняется в базе данных.
  2. Администратор не может авторизоваться с тем паролем, который ему выдала система?

Share this post


Link to post
  • 0

@Снеговик Про 2 не совсем когда выдаю повышаю админку 0 реакций я как и был авторизован в админке так и  остаюсь.

а 1 да пароль как и не изменяется так и не выдаётся 

Share this post


Link to post
  • 0

@R0m4ik, покажите код, связанный с авторизацией администратора.

Share this post


Link to post
  • 0

@Снеговик 

CMD:alogin(playerid, params[])
{
	if(PlayerLogged[playerid] == 0) return 1;
    if(PlayerInfo[playerid][pAdmin] < 1) return 1;//AdminLogged[playerid] = true
    if(AdminLogged[playerid] == true) return SendClientMessage(playerid, COLOR_GREY, "Âû óæå àâòîðèçîâàíû!");
	format(totalstring, 256, "{ffffff}Ââåäèòå Âàø ïàðîëü îò àäìèí.äîñòóïà",PlayerInfo[playerid][pSendername],PlayerInfo[playerid][pAdmin]);
	ShowPlayerDialog(playerid, D_ALOGIN, 1, "{ffffff}Àâòîðèçàöèÿ", totalstring, "Äàëåå",">>>");
	return true;
}

		case D_ALOGIN:
	    {
	        if(response)
			{
	        	if(!strlen(inputtext))
				{
                    format(totalstring, 256, "{ffffff}Ââåäèòå Âàø ïàðîëü îò àäìèí.äîñòóïà",PlayerInfo[playerid][pSendername],PlayerInfo[playerid][pAdmin]);
					ShowPlayerDialog(playerid, D_ALOGIN, 1, "{ffffff}Àâòîðèçàöèÿ", totalstring, "Äàëåå",">>>");
				}
               	else if(!strcmp(inputtext, GetAccount(PlayerInfo[playerid][pSendername], "dostup"), true))
		  		{
		  			AdminLogged[playerid] = true;
					SendClientMessage(playerid, COLOR_GREY, " Âû àâòîðèçîâàëèñü!");
		  			return 1;
		  		}
                else
				{
					SendClientMessage(playerid,COLOR_LIGHTRED, " Âû ââåëè íåâåðíûé ïàðîëü!");
					//Kick(playerid);
					//format(string, 128, " %s ?? ?????? ??????????? ? ?????.?????? ( IP: 255.255.255.255 )",PlayerInfo[playerid][pSendername]);
					//SendAdminMessage(0xFF4FD9FF, string);

				}
			}
		}

 

Share this post


Link to post
  • 0

@R0m4ik, у вас вообще в базе данных есть поле для хранения пароля администратора?

Share this post


Link to post
  • 0

@Снеговик Есть только вот эта строка которая отвечает за пароль раньше был пароль админки по умолчанию сейчас временно выдаю вручную.

73    dostup     varchar(11)     utf8_bin      Нет    Нет   Изменить Изменить Удалить Удалить Показать больше операций Ещё

Share this post


Link to post
  • 0

@Cawfee Ответьте!

Заметка от DEST , создано

Не нужно упоминать конкретного участника форума, это не совсем вежливо.
Если хотите напомнить о своей теме, просто отправьте сообщение с текстом "Up". Это поднимет вашу тему выше, и участники форума смогут вновь ее заметить. По правилам форума такое сообщение разрешено оставлять не чаще, чем раз в 24 часа.

Share this post


Link to post
  • 0

в команду madmin перед этой строкой

В 05.01.2022 в 18:00, R0m4ik сказал:

SendMes(params[0], 0xF272DDFF, " Âàø ïàðîëü ê àäìèí.äîñòóïó: {FFFFFF}%s",randPassword);

добавить

strcat(PlayerInfo[params[0]][pDostup], randPassword);

это запишет сгенерированный пароль в параметры игрока.

Сейчас в этой команде просто выводится пароль в чат, но никуда не записывается.

После перезахода он должен будет сохраниться в базу данных, проверьте это. 

И, да, когда копируете текст из редактора PAWNO, нужно делать это на русской раскладке, чтобы квакозябриков не было, читать неудобно. 

Share this post


Link to post
  • 0

C:\Users\Roma\Desktop\REVENT RP BY SOSED\gamemodes\justice.pwn(68991) : warning 217: loose indentation
C:\Users\Roma\Desktop\REVENT RP BY SOSED\gamemodes\justice.pwn(68991) : error 029: invalid expression, assumed zero
C:\Users\Roma\Desktop\REVENT RP BY SOSED\gamemodes\justice.pwn(68992) : warning 217: loose indentation

Share this post


Link to post
  • 0

@R0m4ik когда прикладываете ошибки, выкладывайте и код, который к ним относится, с пометкой строк, на которые ошибка. 

В данном случае необходимо приложить строчки 68991 и 68992, а также 10 строк сверху них и 10 строк снизу. 

Share this post


Link to post
  • 0
        if(params[1] > 10 || params[1] < 0) return SendClientMessage(playerid, COLOR_GREY, "Уровень админки должен быть от 1 до 10.");
        if(params[1] == 0) return PlayerInfo[params[0]][pAdmin] = params[1],AdminLogged[params[0]] = false,SendMes(playerid,0x3bd1d1ff, " Вы назначили %s администратором уровня {FF0000}0.", sendername(params[0])),SendMes(params[0],0x3bd1d1ff, " Вы были назначены администратором уровня {FF0000}0");
        if(params[0] == playerid) return SendClientMessage(playerid, COLOR_GREY, "Вы не можете использовать эту команду на себе.");
        format(string, 128, "%s назначил нового администратора %s", PlayerInfo[playerid][pSendername], sendername(params[0]));
        SendAdminMessage(COLOR_YELLOW, string);
        format(totalstring, 100, " Вы назначили %s администратором уровня {FF0000}%d.",sendername(params[0]), params[1]);
        SendClientMessage(playerid,0x3BD1D1FF, totalstring);
        format(totalstring, 100, " Вы были назначены администратором уровня {FF0000}%d",params[1]);
        SendClientMessage(params[0],0x3BD1D1FF, totalstring);
        PlayerInfo[params[0]][pAdmin] = params[1];
        strcat(PlayerInfo[params[0]][pDostup], randPassword);//Ошибка/варнинг
        SendMes(params[0], 0xF272DDFF, " Ваш пароль к админ.доступу: {FFFFFF}%s",randPassword);//варнинг

 

Share this post


Link to post
  • 0

@R0m4ik а pDostup есть еще где-то в моде? 

Share this post


Link to post
  • 0

Да есть

в pInfo

 

pDostup[24],

 

в LoadAccount

 

PlayerInfo[playerid][pDostup],

 

в SaveAccount

 

format(src,sizeof(src),"dostup='%s',",PlayerInfo[playerid][pDostup]);

strcat(query,src,sizeof(query));

 

и в Стоке ResetStats

 

PlayerInfo[playerid][pDostup] = EOS

 

И я походу уже догадался в чём проблема случайно не в playerid перед Playerinfo

Share this post


Link to post
  • 0

@R0m4ik скиньте полностью команду

Share this post


Link to post
  • 0
CMD:madmin(playerid, params[])
{
    new randPassword[7];
    randPassword[0] = getLowerLatinLetter();
    randPassword[1] = getLowerLatinLetter();
    randPassword[2] = getDigit();
    randPassword[3] = getDigit();
    randPassword[4] = getDigit();
    randPassword[5] = getDigit();
    new string[256];
    if(PlayerLogged[playerid] == 0) return 1;
    if(PlayerInfo[playerid][pAdmin] < 10 || AdminLogged[playerid] == false) return 1;
    new admin[MAX_PLAYER_NAME];
    GetPlayerName(playerid, admin, sizeof(admin));
    {
        if(sscanf(params, "ud", params[0],params[1])) return SendMes(playerid, COLOR_WHITE, "Введите: /madmin [playerid] [level(1-7)]");
        if(params[1] > 10 || params[1] < 0) return SendClientMessage(playerid, COLOR_GREY, "Уровень админки должен быть от 1 до 10.");
        if(params[1] == 0) return PlayerInfo[params[0]][pAdmin] = params[1],AdminLogged[params[0]] = false,SendMes(playerid,0x3bd1d1ff, " Вы назначили %s администратором уровня {FF0000}0.", sendername(params[0])),SendMes(params[0],0x3bd1d1ff, " Вы были назначены администратором уровня {FF0000}0");
        if(params[0] == playerid) return SendClientMessage(playerid, COLOR_GREY, "Вы не можете использовать эту команду на себе.");
        format(string, 128, "%s назначил нового администратора %s", PlayerInfo[playerid][pSendername], sendername(params[0]));
        SendAdminMessage(COLOR_YELLOW, string);
        format(totalstring, 100, " Вы назначили %s администратором уровня {FF0000}%d.",sendername(params[0]), params[1]);
        SendClientMessage(playerid,0x3BD1D1FF, totalstring);
        format(totalstring, 100, " Вы были назначены администратором уровня {FF0000}%d",params[1]);
        SendClientMessage(params[0],0x3BD1D1FF, totalstring);
        PlayerInfo[params[0]][pAdmin] = params[1];
    `   strcat(PlayerInfo[params[0]][pDostup], randPassword);
        SendMes(params[0], 0xF272DDFF, " Ваш пароль к админ.доступу: {FFFFFF}%s",randPassword);
    }
    return 1;
}

 

Share this post


Link to post
  • 0
6 минут назад, R0m4ik сказал:

   `   strcat(P

внимательней копируйте, у вас тут кавычка затесалась `, удалите ее и будет счастье :) 

Share this post


Link to post
  • 0

Я думал это пятнышко на мониторе какое-то спасибо!

Share this post


Link to post
  • 0

К сожалению способ который вы мне скинули не сработал может ли это быть связано с тем что 1.Это готовый мод с интернета 2.Это мод 2013-2015 года 3.Версия MySQL R5

Share this post


Link to post
  • 0

С шагом написания кода программы мы справились, теперь переходим ко второму, почти всегда неминуемому - отладке написанной программы. 

Отлаживать будем с помощью printf, то есть будем печатать в консоль сервера интересующие нас значения.

 

Перед вот этими двумя строчками 

1 час назад, R0m4ik сказал:

format(src,sizeof(src),"dostup='%s',",PlayerInfo[playerid][pDostup]);

strcat(query,src,sizeof(query));

Которые в SaveAccount, добавим отладочный вывод: 

printf("[DEBUG] PlayerInfo[%d][pDostup] = %s", playerid, PlayerInfo[playerid][pDostup]);

После запустите мод, выдайте админку, выйдите с сервера, сервер не выключайте, посмотрите в консоль и найдите эту строчку там, скиньте сюда. 

Share this post


Link to post
  • 0

[DEBUG] PlayerInfo[0][pDostup] =

Share this post


Link to post
  • 0

Отлично всё работает!

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0