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

    Статус
    Оффлайн
    Регистрация
    18.07.2016
    Сообщений
    17
    Репутация:
    3 ±

    Система блокировки аккаунта по дням с авторазбаном [MySQL R39-6]

    Здравствуйте, уважаемые пользователи форума Pro-Pawn.
    Сегодня я решил написать для Вас систему блокировки аккаунта по дням с авторазбаном на MySQL R39-6.
    В интернете я нашел пару таких систем, но они очень старой реализации и, к тому же, на данном форуме такой темы я не обнаружил.
    Мы будем использовать MySQL R39-6, DC_CMD (можете использовать и другой, кроме стандартного, к примеру ZCMD, Pawn.CMD и так далее), sscanf 2.8.2, а также понадобится фикс для функции Kick (можете использовать фикс от Daniel_Cortez или другой).

    Важно: Плюс ко всему нужен будет фикс кодировки MySQL от $continue$, чтобы в базу данных верно записывались буквы русского алфавита.

    Необходимые файлы:
    MySQL R39-6
    DC_CMD v2.8
    dc_kickfix
    sscanf v2.8.2
    banlist.sql


    Собственно, приступим.

    В OnPlayerConnect, в самое начало:
    PHP код:
        static const auto_query_string[] =
            
    "SELECT * FROM `banlist` WHERE `Name` = '%s'";
        new
            
    playerid_name[MAX_PLAYER_NAME 1],
            
    query_string[sizeof(auto_query_string) - MAX_PLAYER_NAME 1];

        
    GetPlayerName(playeridplayerid_nameMAX_PLAYER_NAME);
        
    format(query_stringsizeof(query_string), auto_query_stringplayerid_name);
        
    mysql_function_query(1query_stringtrue"OnPlayerFindInBanlist""d"playerid); 
    Ко всем public добавляем следующие два:
    PHP код:
    forward OnPlayerUnban(playeridtargetid_name[]);
    public 
    OnPlayerUnban(playeridtargetid_name[])
    {
        new
            
    rows,
            
    fields;
            
        
    cache_get_data(rowsfields);

        if(!
    rows)
            return 
    SendClientMessage(playerid, -1, !"Аккаунт не найден.");
        
        static const 
    auto_query_string[] =
            
    "DELETE FROM `banlist` WHERE `Name` = '%s'";
        new
            
    query_string[sizeof(auto_query_string) - MAX_PLAYER_NAME 1];
            
        
    format(query_stringsizeof(query_string), auto_query_stringtargetid_name);
        
    mysql_function_query(1query_stringfalse"""");
        
        
    format(query_stringsizeof(query_string), "Аккаунт %s разбанен."targetid_name);
        
    SendClientMessage(playerid, -1query_string);
        return 
    1;

    PHP код:
    forward OnPlayerFindInBanlist(playerid);
    public 
    OnPlayerFindInBanlist(playerid)
    {
        new
            
    rows,
            
    fields,
            
    unbanunixtime;

        
    cache_get_data(rowsfields);
        
        if(
    rows)
        {
            
    unbanunixtime cache_get_field_content_int(0, !"UnbanUNIXTime"1);
            
            new
                
    playerid_name[MAX_PLAYER_NAME 1],
                
    admin_name[MAX_PLAYER_NAME 1];
                
            
    GetPlayerName(playeridplayerid_nameMAX_PLAYER_NAME);
            
            if(
    gettime() >= unbanunixtime)
            {
                static const 
    auto_query_string[] =
                    
    "DELETE FROM `banlist` WHERE `Name` = '%s'";
                new
                    
    query_string[sizeof(auto_query_string) - MAX_PLAYER_NAME 1];
                    
                
    format(query_stringsizeof(query_string), auto_query_stringplayerid_name);
                
    mysql_function_query(1query_stringfalse"""");
                return 
    1;
            }
            
            static const 
    auto_string[] =
                
    "Ваш аккаунт заблокирован Администратором {ff6347}%s. {ffffff}Причина: {ff6347}%s.";
            new
                
    string[sizeof(auto_string) - MAX_PLAYER_NAME 32 1],
                
    days_string[4+1],
                
    word_string[8+1],
                
    reason[32+1],
                
    days = (unbanunixtime gettime()) / 86400 1;

            
    cache_get_field_content(0, !"Admin"admin_name);
            
    cache_get_field_content(0, !"Reason"reason);
            
            
    GetDeclensionWord(word_stringsizeof(word_string), days"Остался""Осталось""Осталось");
            
    GetDeclensionWord(days_stringsizeof(days_string), days"день""дня""дней");
        
            
    format(stringsizeof(string), auto_stringadmin_namereason);
            
    SendClientMessage(playerid, -1string);
            
            
    format(stringsizeof(string), "%s {ff6347}%d %s {ffffff}до разблокировки."word_stringdaysdays_string);
            
    SendClientMessage(playerid, -1string);
            
            
    Kick(playerid);
        }
        return 
    1;

    Ко всем stock:
    PHP код:
    stock GetDeclensionWord(result[], const size sizeof(result), numword_1[], word_2[], word_3[]) 

        
    num %= 100

        if (
    num 19) { 
            
    num %= 10
        } 

        
    result[0] = '\0'
        switch (
    num) { 
            case 
    1: { 
                
    strcat(resultword_1size); 
            } 
            case 
    2..4: { 
                
    strcat(resultword_2size); 
            } 
            default: { 
                
    strcat(resultword_3size); 
            } 
        } 

    И последний шаг - добавляем две команды бана и разбана игрока (либо в конец мода, либо там, где все Ваши команды):
    PHP код:
    CMD:ban(playeridparams[])
    {
    //    if(!IsPlayerAdmin(playerid)) return 1;
        
        
    new
            
    targetid,
            
    days,
            
    days_string[4+1],
            
    targetid_name[MAX_PLAYER_NAME+1],
            
    playerid_name[MAX_PLAYER_NAME+1];
        
        if(
    sscanf(params, !"uds[120]"targetiddaysparams[0]))
            return 
    SendClientMessage(playerid, -1, !"Использование: /ban [ID/Ник] [Кол-во дней] [Причина]");
        if(
    targetid == INVALID_PLAYER_ID)
            return 
    SendClientMessage(playerid, -1, !"Игрок не найден.");
        if(!(
    <= days <= 100))
            return 
    SendClientMessage(playerid, -1, !"Неверное количество дней. Доступно: 1-100.");
        if(
    strlen(params[0]) > 32)
            return 
    SendClientMessage(playerid, -1, !"Длина причины должна быть не больше 32х символов.");
            
        
    GetPlayerName(playeridplayerid_nameMAX_PLAYER_NAME);
        
    GetPlayerName(targetidtargetid_nameMAX_PLAYER_NAME);
        
        
    GetDeclensionWord(days_stringsizeof(days_string), days"день""дня""дней");
        
        static const 
    auto_string[] =
            
    "Администратор %s[%d] забанил(а) %s[%d] на %d %s. Причина: %s";
        new
            
    string[sizeof(auto_string) - MAX_PLAYER_NAME MAX_PLAYER_NAME 32 1],
            
    unbanunixtime gettime() + days 86400;

        
    format(stringsizeof(string), auto_stringplayerid_nameplayeridtargetid_nametargetiddaysdays_stringparams[0]);
        
    SendClientMessageToAll(-1string);
        
        static const 
    auto_query_string[] =
            
    "INSERT INTO `banlist` (`Name`, `Reason`, `Admin`, `BanDate`, `UnbanUNIXTime`) "\
            
    "VALUES ('%s', '%s', '%s', '%s', '%d')";
        new
            
    query_string[sizeof(auto_query_string) - MAX_PLAYER_NAME 32 MAX_PLAYER_NAME 20 11 1],
            
    date_string[20+1],
            
    year,
            
    month,
            
    day,
            
    hour,
            
    minute,
            
    second;

        
    getdate(yearmonthday);
        
    gettime(hourminutesecond);
        
    format(date_stringsizeof(date_string), "%02d.%02d.%d, %02d:%02d:%02d"daymonthyearhourminutesecond);

        
    format(query_stringsizeof(query_string), auto_query_stringtargetid_nameparams[0], playerid_namedate_stringunbanunixtime);
        
    mysql_function_query(1query_stringfalse"""");

        
    TogglePlayerControllable(targetid0);
        
    Kick(targetid);
        return 
    1;

    PHP код:
    CMD:unban(playeridparams[])
    {
    //    if(!IsPlayerAdmin(playerid)) return 1;

        
    if(isnull(params))
            return 
    SendClientMessage(playerid, -1, !"Использование: /unban [Ник]");

        if(
    strlen(params) > MAX_PLAYER_NAME)
            return 
    SendClientMessage(playerid, -1, !"Длина ника не должна превышать 24х символов.");

        static 
    auto_query_string[] =
            
    "SELECT * FROM `banlist` WHERE `Name` = '%e'";
        new
            
    query_string[sizeof(auto_query_string) - MAX_PLAYER_NAME 1];

        
    mysql_format(1query_stringsizeof(query_string), auto_query_stringparams);
        
    mysql_function_query(1query_stringtrue, !"OnPlayerUnban""ds"playeridparams);
        return 
    1;

    Скриншоты:
      Открыть/закрыть






    Примечание:
    Проверку на администратора выставьте свою, ибо у каждого она разная, для примера я показал как сделать эти команды только для RCON администратора.


    Если есть какие-нибудь ошибки/недочеты или же пожелания и дополнения, то с радостью Вас выслушаю. :)


    При копировании урока на другие порталы, просьба указывать автора.

    Автор: Skull
    Последний раз редактировалось Skull; 30.08.2016 в 15:27.

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

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Почему ты упаковываешь строки в SendClientMessage, но остальные строки ты не упаковываешь? Либо упаковывай все, либо ничего, хотя для упакованных тебе придется format на strcet поменять еще.



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  3. #3
    Аватар для Son of the Moon
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2016
    Сообщений
    52
    Репутация:
    2 ±
    хватит уже блоки делать по одному же и тому принципу, сделайте плагин на сериал или еще что-то, и уже будет что-то новое.

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

    Статус
    Оффлайн
    Регистрация
    18.07.2016
    Сообщений
    17
    Репутация:
    3 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Почему ты упаковываешь строки в SendClientMessage, но остальные строки ты не упаковываешь? Либо упаковывай все, либо ничего, хотя для упакованных тебе придется format на strcet поменять еще.
    format не поддерживает запакованные строки.

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

    Цитата Сообщение от Son of the Moon Посмотреть сообщение
    хватит уже блоки делать по одному же и тому принципу, сделайте плагин на сериал или еще что-то, и уже будет что-то новое.
    Сказал тот, кто выложил древнейшую систему логирования на данный форум. Не суть. Это простейшая система, которая должна быть у каждого на сервере.

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

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    printf, format - эти функции сделал сам Kalcor (что уже говорит о том, что в них должно быть что-то нерабочее и это что-то никогда не будет исправлено потому что "владельцы крупных серверов решают всё за него").
    В этих функциях упакованные строки не поддерживаются ни в форматной строке, ни в последующих аргументах.
    ...
    Если строка, которую вы хотите упаковать, используется в одной из перечисленных выше функций, её следует оставить неупакованной.
    Вот поэтому.
    Последний раз редактировалось Skull; 28.08.2016 в 19:22.

  5. #5
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    +1 лишнее, sizeof возвращает как раз таки эту единицу.
    Последний раз редактировалось DeimoS; 28.08.2016 в 20:51.

  6. #6
    Аватар для Son of the Moon
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2016
    Сообщений
    52
    Репутация:
    2 ±
    Цитата Сообщение от Skull Посмотреть сообщение
    Сказал тот, кто выложил древнейшую систему логирования на данный форум. Не суть. Это простейшая система, которая должна быть у каждого на сервере.
    У тебя новизна зашкаливает. на MySQL перевел и все, цены прям нет, на твою систему.

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

    Статус
    Оффлайн
    Регистрация
    01.01.2016
    Адрес
    minsk
    Сообщений
    40
    Репутация:
    2 ±
    Сделай на ORM

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

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    236
    Репутация:
    19 ±
    Цитата Сообщение от Igor_Stalker Посмотреть сообщение
    Сделай на ORM
    ORM априори говно. Хочешь им обмазаться? Дерзай.

    Паблики
    PHP код:
    OnPlayerFindInBanlistOnPlayerUnban 
    вообще не нужны.

    Объясню почему: в данном случае тебя не нужна "псевдомногопоточность" и с ней, в данном случае, скорее всего, ты больше проиграешь, чем выиграешь. Можно все оформить в одну функцию и несколько раз обращаться к ней, нежели нагромождать код.

  9. #9
    Аватар для Igor_Stalker
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.01.2016
    Адрес
    minsk
    Сообщений
    40
    Репутация:
    2 ±
    и чем же ORM говно?

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

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    236
    Репутация:
    19 ±
    Цитата Сообщение от Igor_Stalker Посмотреть сообщение
    и чем же ORM говно?
    Ты тратишь больше времени и памяти на отправку запроса. Взять хотя бы то, что ORM, это тот же макрос или функция, не более.

    И да, олдфаги мускула любят ручками составлять запросы, а не одной функцией. ИМХО.

 

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

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

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

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

Ваши права

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