Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 38
  1. #1
    Аватар для underwoker
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.03.2014
    Сообщений
    331
    Репутация:
    47 ±

    Система бана [MySQL R8]

    И так, всем доброго времени суток! Надеюсь кому нибудь этот мануальчик будет полезен. Старался все расписать более менее подробно и настолько чтобы нубам было понятно.
    Ув. Модераторы и пользователи, если увидите макрос который не указан в теме, напишите пожалуйста. А так же приветствуется адекватная критика.
    Начнемс. Учтите, что нам понадобится инклуд и плагин mysql,sscanf,mxdate и DC_CMD.

    Добавим пару макросов, переменных и массивов в начало мода, дабы было удобнее далее их использовать. Если у вас есть уже они, то не добавляйте, а измените на свои.
    PHP код:
    #define NewKick(%0) SetTimerEx("DelayedKick", 1000, false, "d", (%0))
    #define fpub:%0(%1)             forward %0(%1); public %0(%1)
    #define GetName(%1)  pPlayerName[%1]
    new querybans[200];
    new 
    pPlayerName[MAX_PLAYERS][MAX_PLAYER_NAME]; 
    В конец мода добавим этот паблик и форвард:
    PHP код:
    forward DelayedKick(playerid);
    public 
    DelayedKick(playerid) return Kick(playerid); // Этот паблик относится к таймеру, который был объявлен макросом в начале мануала. Тут мы кикаем игрока через 1000 милисекунд. 
    Добавим в OnPlayerConnect, после проверки на то, есть ли аккаунт игрока на сервере, запросы в бд, на нахождение ника в списке банов и IP адреса.
    PHP код:
    GetPlayerName(playeridpPlayerName[playerid], MAX_PLAYER_NAME);
    format(querybanssizeof(querybans), "SELECT * FROM `Bans` WHERE `Nick` = '%s'"GetName(playerid)); // Форматируем запрос в бд
    mysql_function_query(1querybanstrue"CheckBan""d"playerid); // Отправляем запрос. 
    new ipStr[16];
    GetPlayerIpplayeridipStr16 );
    format(querybanssizeof(querybans), "SELECT * FROM `Bans` WHERE `IP` = '%s'"ipStr);  // Форматируем запрос в бд
    mysql_function_query(1querybanstrue"CheckBanIP""d"playerid); // Отправляем запрос. 
    Добавим паблики в конец мода, так же, в которых будем брать данные из БД после запроса который сделали в OnPlayerConnect
    PHP код:
    fpub:CheckBanIP(playerid

        new 
    unbandate
        new 
    rows,fields
        
    cache_get_data(rowsfields); 
        if(
    rows
        { 
            
    unbandate cache_get_field_content_int(0"UnbanDate"); 
            if(
    gettime() >= unbandate)// Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока 
            

                
    format(querybanssizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // Форматируем.  
                
    mysql_function_query(1querybansfalse"",""); // Отправляем запрос.  
                
    return true
            } 
            else
    // Иначе выводим диалог что посиди еще в бане, время не вышло. 
            

                new 
    str[100];
                
    format(strsizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
                
    ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok",""); 
                
    NewKick(playerid); 
            } 
        } 
        return 
    true


    fpub:CheckBan(playerid

        new 
    rows,fields
        new 
    unbandate
        
    cache_get_data(rowsfields); 
        if(
    rows
        { 
            
    unbandate cache_get_field_content_int(0"UnbanDate"); // 
            
    if(gettime() >= unbandate// Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока 
            

                
    format(querybanssizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // форматируем.  
                
    mysql_function_query(1querybansfalse"","");// Отправляем запрос.  
                
    return true
            } 
            else 
    // Иначе выводим диалог что посиди еще в бане, время не вышло. 
            

                new 
    str[100];
                
    format(strsizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
                
    ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok",""); 
                
    NewKick(playerid); 
            } 
        } 
        return 
    true


    fpub:GetBan(playerid

        new 
    rows,fields
        new 
    str[100],unbandate;
        
    cache_get_data(rowsfields); 
        if(
    rows//Если в бд строки найдены 
        

                    
    unbandate cache_get_field_content_int(0"UnbanDate");
            
    format(strsizeof(str),"Аккаунт заблокирован. Дата разблокировки: %s",date("%dd/%mm/%yyyy Время: %hh:%ii:%ss",unbandate));
            
    SendClientMessage(playerid, -1str); 
            return 
    true
        } 
        else return 
    SendClientMessage(playerid, -1"Аккаунт не в бане");// иначе пишем игроку что не заблокирован. 


    fpub:GetBanIP(playeridip[])
    {
        new 
    rows,fields;
            new 
    str[100],unbandate;
        
    cache_get_data(rowsfields);
        if(
    rows//Если в бд строки найдены
        
    {
                    
    unbandate cache_get_field_content_int(0"UnbanDate");
                    
    format(strsizeof(str),"IP заблокирован. Дата разблокировки: %s",date("%dd/%mm/%yyyy Время: %hh:%ii:%ss",unbandate));
            
    SendClientMessage(playerid, -1str);
            return 
    true;
        }
        else return 
    SendClientMessage(playerid, -1"IP не заблокирован."); // иначе пишем игроку что не заблокирован.
    }

    fpub:Unban(i,nick[])
    {
        new 
    rows,fields;
        
    cache_get_data(rowsfields);
        if(!
    rows// Если в бд строки не найдены
        
    {
            
    SendClientMessage(i,-1,"Нету игрока с таким ником в бане!");
        }
        else 
    // Иначе(если найдены)
        
    {
            new 
    string[31+24];
            
    format(querybanssizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",nick);// Форматируем запрос в бд
            
    mysql_function_query(1querybansfalse"",""); // отправляем запрос.
            
    format(stringsizeof(string), "Вы успешно разбанили игрока %s!",nick); //форматируем
            
    SendClientMessage(i,-1,string);// отправляем
        
    }
        return 
    true;

    Добавим команды бана, разбана, проверки на бан(Показываю на примере DC_CMD):
    PHP код:
    CMD:getban_player(playeridparams[])
    {
        
    //if(PINFO[playerid][pAdminLVL] < 1) return true; // Данную строчку расскоментируйте и измените переменную админки на свою.
        
    if(sscanf(params,"s[25]",params[0])) return SendClientMessage(playerid0x00D900C8"- Подсказка:{FFFFFF} /getban_player [Ник]");
        
    format(querybanssizeof(querybans), "SELECT * FROM `Bans` WHERE `Nick` = '%s'"params[0]);// Форматируем запрос в бд
        
    mysql_function_query(1querybanstrue"GetBan""d"playerid); // отправляем запрос.
        
    return true;
    }

    CMD:getban_playerip(playeridparams[])
    {
        
    //if(PINFO[playerid][pAdminLVL] < 1) return true; // Данную строчку расскоментируйте и измените переменную админки на свою.
        
    if(sscanf(params,"s[20]",params[0])) return SendClientMessage(playerid0x00D900C8"- Подсказка:{FFFFFF} /getban_playerip [ip]");
        
    format(querybanssizeof(querybans), "SELECT * FROM `Bans` WHERE `IP` = '%s'"params[0]);// Форматируем запрос в бд
        
    mysql_function_query(1querybanstrue"GetBanIP""ds"playeridparams[0]); // отправляем запрос.
        
    return true;
    }

    CMD:ban(playeridparams[])
    {
        
    //if(gPlayerLogged[playerid] == false) return true; //Переменная авторизации игрока поменяйте на свою
        //if(PINFO[playerid][pAdminLVL] <= 0) return SendClientMessage(playerid, 0xFF0000AA, "Недостаточно прав!");// Данную строчку расскоментируйте и измените переменную админки на свою.
        
    new string[144],id,days,unbandate2;
        if(
    sscanf(params,"dds[99]",id,days)) return SendClientMessage(playerid, -1"Используй: /ban [id] [Дни] [причина]"); //
        //if(PINFO[params[0]][pAdminLVL] > PINFO[playerid][pAdminLVL]) return SendClientMessage(playerid,-1,"Нельзя забанить администратора");// Данную строчку расскоментируйте и измените переменную админки на свою.
        
    if(!IsPlayerConnected(id)) return SendClientMessage(playerid0xFF0000AA"Ошибка! Введёный id не верен или не в сети!"); // Проверка на онлайн игрока
        
    if(days 30 || days 1) return SendClientMessage(playerid0xFF0000AA"Ошибка! Дней от 1-30"); // Проверка на введенные дни
        
    unbandate2 gettime() + days*86400// Бан на дни. Записываем нынешнюю дату + число умноженное на 86400 = дни бана. 
        
    format(querybanssizeof(querybans), "INSERT INTO `Bans` (`Nick`, `UnbanDate`) VALUES ('%s', '%d')",GetName(id),unbandate2); // Форматируем запрос в бд
        
    mysql_function_query(1querybansfalse"",""); Отправляем запрос в бд
        format
    (stringsizeof(string), "%s забанил [ID:%d]%s на %d дней(я)",GetName(playerid),idGetName(id),days);// Форматируем
        
    SendClientMessageToAll(-1string);// отправляем всем форматированное сообщение.
        
    NewKick(id); // кикаем игрока
        
    return true
    }

    CMD:unban(playeridparams[])
    {
        
    //if(gPlayerLogged[playerid] == false) return true; //Переменная авторизации игрока поменяйте на свою и расскоментируйте
        //if(PINFO[playerid][pAdminLVL] < 5) return SendClientMessage(playerid, -1, YouCanNot); // Данную строчку расскоментируйте и измените переменную админки на свою.
        
    if(sscanf(params,"s[24]",params[0])) return SendClientMessage(playerid, -1"Используйте: /unban [Ник]");
        
    format(querybans,sizeof(querybans),"SELECT * FROM Bans WHERE Nick = '%s'"params[0]);// Форматируем запрос в бд
        
    mysql_function_query(1querybanstrue"Unban""ds",playeridparams[0]); // отправляем запрос в бд
        
    return true;

    Скачать саму таблицу Bans для Базы данных:
    Тык

    Автор мануала: underwoker aka Be3yXa
    Последний раз редактировалось underwoker; 27.07.2014 в 23:13. Причина: корректировка.

  2. #2
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    PHP код:
    publics:GetBan(playerid)
    {
        new 
    rows,fields;
        new 
    string[144];
        
    cache_get_data(rowsfields);
        if(
    rows//Если в бд строки найдены
        
    {
            
    SendClientMessage(playerid, -1"Аккаунт заблокирован");
            return 
    true;
        }
        else return 
    SendClientMessage(playerid, -1"Аккаунт не в бане");// иначе пишем игроку что не заблокирован.

    Для чего ты объявляешь тут string?

    PHP код:
    enum name_info 
    {
        
    pPlayerName[MAX_PLAYER_NAME]
    }
    new 
    PlayerNames[MAX_PLAYERS][name_info];   // данные ника игрока 
    Эм?

    PHP код:
    new pPlayerName[MAX_PLAYERS][24]; 

    Не плохо бы добавить дату разбана, с помощью функции конвертирования из unix в обычное время.

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

    Статус
    Оффлайн
    Регистрация
    07.03.2014
    Сообщений
    331
    Репутация:
    47 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    PHP код:
    publics:GetBan(playerid)
    {
        new 
    rows,fields;
        new 
    string[144];
        
    cache_get_data(rowsfields);
        if(
    rows//Если в бд строки найдены
        
    {
            
    SendClientMessage(playerid, -1"Аккаунт заблокирован");
            return 
    true;
        }
        else return 
    SendClientMessage(playerid, -1"Аккаунт не в бане");// иначе пишем игроку что не заблокирован.

    Для чего ты объявляешь тут string?

    PHP код:
    enum name_info 
    {
        
    pPlayerName[MAX_PLAYER_NAME]
    }
    new 
    PlayerNames[MAX_PLAYERS][name_info];   // данные ника игрока 
    Эм?

    PHP код:
    new pPlayerName[MAX_PLAYERS][24]; 

    Не плохо бы добавить дату разбана, с помощью функции конвертирования из unix в обычное время.
    Исправил. Стринг я забыл убрать. А вот о массиве для имени игрока не подумал ;D. Спать хотел, время публикации то вон какое.
    Последний раз редактировалось underwoker; 24.07.2014 в 14:29.

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

    Статус
    Оффлайн
    Регистрация
    07.03.2014
    Сообщений
    331
    Репутация:
    47 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    Не плохо бы добавить дату разбана, с помощью функции конвертирования из unix в обычное время.
    Дату разбана сделаю сегодня как приду.

    - - - Добавлено - - -

    Готово, дата разбана сделана.
    "Власть, кровь, няш-мяш, кровь, власть, Крым наш!" - (c) Наталья Поклонская.

    Критик должен быть готов и способен в любой момент и по первому требованию занять место критикуемого им и выполнять его дело продуктивно и компетентно. В противном случае критика превращается в наглую, самодовлеющую силу и становится тормозом на пути прогресса. (с) AXE

  5. #5
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от underwoker Посмотреть сообщение
    Исправил. Стринг я забыл убрать. А вот о массиве для имени игрока не подумал ;D. Спать хотел, время публикации то вон какое.
    Куда делась теперь переменная с ником? Или сейчас тоже спать хочешь?

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

    Статус
    Оффлайн
    Регистрация
    10.01.2014
    Сообщений
    110
    Репутация:
    29 ±
    А где сама функция date?

    PHP код:
    publics:CheckBan(playerid

        new 
    rows,fields
        new 
    unbandate
        
    cache_get_data(rowsfields); 
        if(
    rows
        { 
            
    unbandate cache_get_field_content_int(0"UnbanDate"); // 
            
    if(gettime() >= unbandate// Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока 
            

                
    format(querybans90"DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // форматируем.  
                
    mysql_function_query(1querybansfalse"","");// Отправляем запрос.  
                
    return true
            } 
            else 
    // Иначе выводим диалог что посиди еще в бане, время не вышло. 
            

                new 
    str[100];
                
    format(strsizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
                
    ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok",""); 
                
    NewKick(playerid); 
            } 
        } 
        return 
    true


  7. #7
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от MR_BEN Посмотреть сообщение
    А где сама функция date?

    PHP код:
    publics:CheckBan(playerid

        new 
    rows,fields
        new 
    unbandate
        
    cache_get_data(rowsfields); 
        if(
    rows
        { 
            
    unbandate cache_get_field_content_int(0"UnbanDate"); // 
            
    if(gettime() >= unbandate// Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока 
            

                
    format(querybans90"DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // форматируем.  
                
    mysql_function_query(1querybansfalse"","");// Отправляем запрос.  
                
    return true
            } 
            else 
    // Иначе выводим диалог что посиди еще в бане, время не вышло. 
            

                new 
    str[100];
                
    format(strsizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
                
    ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok",""); 
                
    NewKick(playerid); 
            } 
        } 
        return 
    true

    mxdate.inc

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

    Статус
    Оффлайн
    Регистрация
    07.03.2014
    Сообщений
    331
    Репутация:
    47 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    Куда делась теперь переменная с ником? Или сейчас тоже спать хочешь?
    Похоже уже не я. Т.к. она используется выше в макросе.

    - - - Добавлено - - -

    Цитата Сообщение от MR_BEN Посмотреть сообщение
    А где сама функция date?

    PHP код:
    publics:CheckBan(playerid

        new 
    rows,fields
        new 
    unbandate
        
    cache_get_data(rowsfields); 
        if(
    rows
        { 
            
    unbandate cache_get_field_content_int(0"UnbanDate"); // 
            
    if(gettime() >= unbandate// Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока 
            

                
    format(querybans90"DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // форматируем.  
                
    mysql_function_query(1querybansfalse"","");// Отправляем запрос.  
                
    return true
            } 
            else 
    // Иначе выводим диалог что посиди еще в бане, время не вышло. 
            

                new 
    str[100];
                
    format(strsizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
                
    ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok",""); 
                
    NewKick(playerid); 
            } 
        } 
        return 
    true

    Выше описаны инклуды которые используются в системе.
    "Власть, кровь, няш-мяш, кровь, власть, Крым наш!" - (c) Наталья Поклонская.

    Критик должен быть готов и способен в любой момент и по первому требованию занять место критикуемого им и выполнять его дело продуктивно и компетентно. В противном случае критика превращается в наглую, самодовлеющую силу и становится тормозом на пути прогресса. (с) AXE

  9. #9
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от underwoker Посмотреть сообщение
    Похоже уже не я. Т.к. она используется выше в макросе.

    - - - Добавлено - - -


    Выше описаны инклуды которые используются в системе.
    PHP код:
    #define GetName(%1)  pPlayerName[%1][MAX_PLAYER_NAME]; 
    Ты об этом макросе?

    Все-равно он не верный.

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

    Статус
    Оффлайн
    Регистрация
    07.03.2014
    Сообщений
    331
    Репутация:
    47 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    PHP код:
    #define GetName(%1)  pPlayerName[%1][MAX_PLAYER_NAME]; 
    Ты об этом макросе?

    Все-равно он не верный.
    Эээ, оказывается каким-то образом не сохранились мои изменения в первом посте O_o. Скорее всего когда правили модеры пост.
    Все, исправил.
    "Власть, кровь, няш-мяш, кровь, власть, Крым наш!" - (c) Наталья Поклонская.

    Критик должен быть готов и способен в любой момент и по первому требованию занять место критикуемого им и выполнять его дело продуктивно и компетентно. В противном случае критика превращается в наглую, самодовлеющую силу и становится тормозом на пути прогресса. (с) AXE

 

 
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя

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

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

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

Ваши права

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