Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для Johnny_Wallace
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.03.2017
    Сообщений
    5
    Репутация:
    0 ±

    Создание команды.

    Доброго времени суток всем. Сегодня пришёл к Вам с парой вопросов и, почитав темы на форуме, убедился, что люди тут знающие сидят.
    Я работаю с Pawn не так уж и давно, знаю достаточно мало, но всё же стараюсь пополнять знания.
    На этот раз скачал мод и работаю в нём уже пару недель, чтобы уже окончательно более-менее разобраться в Pawn языке. Плагины, установленные в моде до меня - <zcmd> и <sscanf2>. Ими и будем пользоваться.

    Итак, предыстории достаточно, к делу.

    Я переписывал систему администрирования в моде и вырезал стандартную авторизацию /alogin, дабы создать другую. На данный момент это последнее, что осталось сделать по админ. командам, но и самое сложное для меня.
    В моих планах было сделать команду /duty [пароль] (всего паролей будет 7, под каждый уровень администрирования) и здесь-то я и просел.
    Если написание стандартных команд /ban, /offban, /hpall, /a, /admins, /setmp и подобное я сделал, то тут сложнее получилось.

    Я перечитал достаточно информации на форумах и понял, что придется юзать bool или static const для хранения паролей (но это не точно) и реализовывать каждый пароль для своего уровня админки через switch. Примерно, обзаведясь этими данными, подумал, что всё проще простого, но... нет.

    Смотрим код, что я намудрил.

    Ко всем new (прикладываю два варианта, что использовал)
    PHP код:
    static const AdminDuty [7] =
    {
        
    3117896,
        
    3937140,
        
    9945800,
        
    5464133,
        
    9856641,
        
    9286298,
        
    1269818
    }; 

    И

    PHP код:
    new AdminDuty[1][7]=
    {
        {
    3117896393714099458005464133985664192862981269818}
    }; 
    То бишь эти переменные и будут хранить наши пароли.
    Теперь команды.
    Первая версия была с использованием static const и запрашиванием этих паролей через params[0], приравнивая их к AdminDuty[]. Но забыл, что подобное провернуть будет невозможно (но это не точно). Смотрим код.
    PHP код:
    CMD:duty(playerid,params[])
    {
        if(
    gLogAcc[playerid] == false) return 1// Буду пояснять на первый раз за каждую строку. В данном случае это обычная проверка на авторизацию на сервере
        
    if(PlayerInfo[playerid][pAdmin] < 1) return 1// Тут всё и без того ясно
        
    if(sscanf(params"d"params[0])) return 1// Используем params[0] как /duty params[0] (пароль), а затем приравниваем его (ниже)
        
    if(params[0] == AdminDuty[]) // Здесь и сел, ибо как мне кажется подобное нельзя провернуть (я про выбор нужного пароля AdminDuty из тех, что мы прописываем в /duty [пароль] (но это не точно)).
        
    {
            
    gAdminLogged[playerid] = true// Админ авторизация
            //Оповещение об авторизации администратора в админ чат
        
    }
        return 
    1;

    Вторая версия.
    Пробовал использовать stock'и (здесь я static const и new AdminDuty в глобальных new временно закомментировал).
    Ко всем командам:
    PHP код:
    CMD:duty(playeridparams[])
    {
        if(
    gLogAcc[playerid] == false) return 1;
        if(
    PlayerInfo[playerid][pAdmin] < 1) return 1;
        if(
    sscanf(params"d"params[0])) return 1;
        
    AdminDuty(playerid);
        return 
    1;

    К stock'ам:
    PHP код:
    stock AdminDuty(playerid)
    {
        
    Send(playeridC_WHITE"Вы ввели команду"); // намеренно добавил это чтобы проверить, а работает ли вообще такая версия. В итоге текст мне выводило, но ни авторизации, ни оповещения в админ чат не было (проверял со второго аккаунта с админой).
        
    new adminpass[6][7]= // Фактически вырезал из слитого мода Arizona RP (Не реклама), но там лажа в том, что подобная функция (ниже)
            // if(!GetString(adminpass[Pass_num][PlayerInfo[playerid][pAdmin]], inputtextsave)) return 1;
            // просто не работала. Что-то там про "GetString" на Wiki пишут, типа не рабочая больше, а как сделать иначе - не догнал.
        
    {
            {
    3117896393714099458005464133985664192862981269818},
            {
    3117896393714099458005464133985664192862981269818},
            {
    3117896393714099458005464133985664192862981269818},
            {
    3117896393714099458005464133985664192862981269818},
            {
    3117896393714099458005464133985664192862981269818},
            {
    3117896393714099458005464133985664192862981269818}
        };
        if(
    inputtext == PlayerInfo[playerid][pDostup])
        {
            
    gAdminLogged[playerid] = true;
            
    //Оповещение об авторизации администратора в админ чат
        
    }
        return 
    1;

    Пробовал брать старую версию /alogin'a в моде, но там беда в том, что в самой команде через ShowPlayerDialog идёт обращение к case в OnDialogResponse. Так как я не использую ShowPlayerDialog, то мне и делать нечего в этом case'е.

    Также пытался найти хоть какую-либо подобную систему (всегда так делаю, когда не знаю как самому написать), затем разобрать её, понять смысл работы и сделать своё, самому. Однако, увы, как я понял, всех всегда устраивала обычная авторизация схожая с авторизацией на SAMP RP (не реклама) через ShowPlayerDialog и case в OnDialogResponse или же другая версия, когда админ.авторизация проходит автоматически при вводе пароля от аккаунта (как на ARP, к примеру != Реклама).
    Однако я всё же нашёл пару подобных моментов, прикладываю:
    http://pawno-info.ru/showthread.php?t=257148&attempt=1 // здесь в комментариях люди отписывались, что нужно юзать switch, а не создавать по 20 команд /duty. Однако как реализовать это я не знаю.
    http://pro-pawn.ru/showthread.php?12...BE%D0%BB%D1%8C // а вот здесь я брал за идею первую версию, но через данный способ можно сделать /duty лишь на один пароль, на один уровень админки. Я проверял, работает, но это не то, чего я добиваюсь.

    Знаю, что сейчас могут вылезти особые личности кричащие мне "Мы должны за тебя всё сделать?" и т.д.
    Однако поймите одно, что необязательно писать мне готовую команду. Мне нужна лишь та самая часть, отвечающая за проверку введенного пароля и авторизацию на нужный уровень через него или хотя бы просто порассуждать тут как я могу сам решить эту проблему с Вашей помощью.
    Последний раз редактировалось Johnny_Wallace; 02.03.2017 в 23:51. Причина: Исправление опечаток

  2. #2
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    Если бы мне это нужно было, то сделал бы как-то так:
    PHP код:
    static const __admin_alogin_password[3] = {
        
    123,// Первый админ уровень
        
    132,// Второй админ уровень
        
    312 // Третий админ уровень
    };

    CMD:admin_login(playerid)
    {
        if(
    PlayerInfo[playerid][player_Admin] <= 0)
            return 
    1;
            
        
    ShowPlayerDialog(...); //открываем нужный нам диалог
            
        
    return 1;
    }

    public 
    OnDialogResponse(...)
    {
        
    //...
        
    case admin_login:
        {
            if(!
    response)
                return 
    1;
                
            if(
    strval(inputtext) == __admin_alogin_password[PlayerInfo[playerid][player_Admin] - 1])
            {
                
    // Авторизируем и прочие действия
            
    }
            else
            {
                
    // Пароль не совпадает
            
    }
        }
        
    //...

    А вообще, лучше персонально каждому игроку генерировать рандомный пароль, после чего сообщать ему его и сделать какой-либо способ восстановления со сменой его. Как-то так. ))

  3. #3
    Аватар для Johnny_Wallace
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.03.2017
    Сообщений
    5
    Репутация:
    0 ±
    Привет, спасибо, что откликнулся. Давай разбираться в твоём коде?
    Итак, ты предлагаешь мне использовать static const для хранения паролей, а дальше в CMD через ShowPlayerDialog вызывать саму функцию команды в case на OnDialogResponse.
    Однако, увы, как я и описывал в теме при её создании - подобная система меня не интересует. Написание авторизации через SPD и ODR, создание и восстановление паролей уже есть в паблике тысячами темами от людей, что каждый присваивает себе её авторство.
    Меня очень заинтересовал данный вид авторизации, а именно через саму команду. То бишь ты вводишь: /duty [пароль один из 7] и сервер, прочитав этот пароль, уже авторизовывает тебя под уровнем админки, для которого он предназначен. Без ShowPlayerDialog и, возможно, без OnDialogResponse (но это не точно).
    Ход событий, как это должно происходить.
    PHP код:
    1пишем в чат"/duty 9856641"
    2получаем от сервера админ авторизацию на наш уровень и это в чат"[A] %s вошёл в админ панель [%d lvl] || IP: [%s] | Reg-IP: [%s]" 
    Как это выглядит в игре (прикрепляю фрапс свой старый)
      Открыть/закрыть


    Что мы видим на фрапсе? Мне выдают 5 уровень, при этом никакие пароли мне не сообщаются, не выдаются и не нужно регистрировать свой личный пароль. В ЛС мне лишь указывают где брать пароли и всё.
      Открыть/закрыть




    А затем, введя пароль от своей админки, я авторизовываюсь на сервере и мне доступно всё, как и показано на фрапсе (мут снял себе).

    То бишь в моих интересах повторить это, ибо подобного я больше нигде и не видел кроме как на этом сервере. Хочется уже разобраться в написании данной системы.

    А если по делу, то нужно создавать хранение паролей, команду, а затем писать систему авторизации на switch либо в (forward) public, либо в stock (но это не точно).
    Последний раз редактировалось Johnny_Wallace; 03.03.2017 в 09:57. Причина: Дополнил ответ.

  4. #4
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    PHP код:
    static const AdminDuty [7] = 

        
    3117896
        
    3937140
        
    9945800
        
    5464133
        
    9856641
        
    9286298
        
    1269818 
    };  

    CMD:duty(playeridparams[]) 

        if(!
    PlayerInfo[playerid][pAdmin]) 
            return 
    1;

        if(
    sscanf(params"d"params[0])) 
            return 
    1;

        if(
    params[0] == AdminDuty[PlayerInfo[playerid][pAdmin] - 1]) 
            
    gAdminLogged[playerid] = true;

        return 
    1


  5. Пользователь сказал cпасибо:
    Johnny_Wallace (04.03.2017)
  6. #5
    Аватар для Johnny_Wallace
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.03.2017
    Сообщений
    5
    Репутация:
    0 ±
    Привет, спасибо, что откликнулся.
    Я обязательно проверю твою версию и уже вижу, что должно вроде бы сработать.
    Однако, как мне кажется, введя любой из этих паролей ты просто авторизуешься под уровнем админки, что прописан у тебя в БД.
    Возможно ли в static const приравнять сейчас каждый из паролей к определённому уровню админки? Чтобы, допустим, введя пароль от 3-го уровня, а у тебя 4-у по БД, ничего не происходило.

  7. #6
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Цитата Сообщение от Johnny_Wallace Посмотреть сообщение
    Привет, спасибо, что откликнулся.
    Я обязательно проверю твою версию и уже вижу, что должно вроде бы сработать.
    Однако, как мне кажется, введя любой из этих паролей ты просто авторизуешься под уровнем админки, что прописан у тебя в БД.
    Возможно ли в static const приравнять сейчас каждый из паролей к определённому уровню админки? Чтобы, допустим, введя пароль от 3-го уровня, а у тебя 4-у по БД, ничего не происходило.
    Это учтено. В массиве пароли идут от первого уровня к последнему (следует это учесть, если уровней сейчас больше 7, тогда будет выход за пределы массива), если ввести пароль не от своего уровня, ничего не произойдет.

  8. Пользователь сказал cпасибо:
    Johnny_Wallace (04.03.2017)
  9. #7
    Аватар для Johnny_Wallace
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.03.2017
    Сообщений
    5
    Репутация:
    0 ±
    Благодарю, обязательно попробую всё, что ты написал.
    Модераторы, тему пока что не закрывайте.

  10. #8
    Аватар для Johnny_Wallace
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.03.2017
    Сообщений
    5
    Репутация:
    0 ±
    Отлично, всё как и задумывалось. Команда работает на "ура".
    По сути, я просто недоработал одну строчку из своей первой версии. Буду знать.
    Закрыто.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •