Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 20

Тема: Команда /kick + логирование через MySQL

  1. #1
    Пользователь Аватар для Dominik_48
    Регистрация
    17.11.2014
    Сообщений
    40
    Репутация: 2

    Звание: пока не определено

    Команда /kick + логирование через MySQL

    Привет всем жителям форума Pawno.su

    Решил с вами поделится функцией из своего мода, который сейчас я разрабатываю.

    Автор урока: Dominik_48 (Dominik_Shakur)



    Для данного урока нам понадобится плагин от BlueG MySQL R39-2:

    * Ссылка на плагин MySQL R39-2

    И небольшое представление о том что такое MySQL




    Начнем!

    Для начала нам необходимо создать таблицу в которой будут сохранятся наши логи:
    PHP код:
    CREATE TABLE IF NOT EXISTS `kick_log` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    kicked_namevarchar(24NOT NULL,
      `
    kicker_namevarchar(24NOT NULL,
      `
    reasonvarchar(64NOT NULL,
      `
    datevarchar(32NOT NULL,
      
    PRIMARY KEY (`id`)
    ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=
    Объясню, что к чему:

    PHP код:
    id            Идентификатор в БД
    kicked_name   
    Никнейм игрока которого кикнули
    kicker_name   
    Никнейм игрока который кикнул 
    reason        
    Причина кика
    date          
    Дата и время кика 
    Перейдем к нашему моду:
    PHP код:
    KickEx(playeridkicker[], reason[])      // Создаем нашу функцию c тремя аргументами
    {
        if(!
    IsPlayerConnected(playerid)) return true;     // Тут мы проверяем присоединен ли игрок к серверу
        
    new minutesechourdaymonthyeardates[32], mysql_string[300];     // Создаем переменные
        
         
    gettime(hourminutesec);     // Получаем время
         
    getdate(yearmonthday);      // Получаем дату
         
         
    format(datessizeof(dates), "%02d:%02d:%02d | %02d.%02d.%02d"hourminutesecdaymonthyear);      // Форматируем время и дату и записываем все в переменную
        
    format(mysql_stringsizeof(mysql_string), "INSERT INTO `kick_log` (`kicked_name`, `kicker_name`, `reason`, `date`) VALUES ('%s', '%s', '%s', '%s')"GetName(playerid), kickerdescriptiondates);     // Тут мы форматируем запрос добавляя в него наши данные
        
    mysql_tquery(connectsmysql_string"""");     // Теперь отправляем запрос
        
        
    SetTimerEx("PlayerKick"30false"d"playerid);     // И напоследок создаем таймер на 30 мс, который вызывает public с функцией Kick(playerid) 
        
    return true;
    }

    forward PlayerKick(playerid);
    public 
    PlayerKick(playerid) return Kick(playerid);   // Данный public мы создали, чтобы игрок которого кикнули успел увидеть сообщение с причиной по которой его кикнули 
    Теперь я приведу несколько примеров использования данной функции:
    Создаем команду с помощью dc_cmd:
    PHP код:

    CMD
    :kick(playeridparams[])    // Создаем команду
    {
        if(
    PlayerInfo[playerid][pAdmin] >= 1)      // Проверяем есть ли у игрока который вводит команду админка
        
    {
            new 
    reason[64];
            if(
    sscanf(params"us[64]"params[0], params[1])) return SendClientMessage(playerid, -1" Введите: /kick [id][reason]");  // Сравниваем аргументы команды с введенными аргументами в чате
            
    format(reasonsizeof(reason), "Вы были кикнуты администратором %s Причина: %s"PlayerInfo[playerid][pName], params[1]);    
            
    SendClientMessage(playerid, -1reason);
            
    KickEx(params[0], PlayerInfo[playerid][pName], params[1]);    // И тут мы используем нашу функцию (params[0] - id игрока кого нужно кикнуть, PlayerInfo[playerid][pName] - Имя игрока который вводит команду, params[1] - Причина по которой мы кикаем игрока)
        

        return 
    true;

    Еще один способ, на примере антифлуда:
    PHP код:
    public OnPlayerText(playeridtext[])    // Public который вызывается когда игрок пишет что-то в чат
    {
        if(
    IsPlayerConnected(playerid))     // Проверяем присоединен ли игрок к серверу 
        
    {
            if(
    GetPVarInt(playerid"AntiFlood") > gettime())     // Сравниваем PVar "AntiFlood"  который в данном случае является счетчиком с полученым временем
            
    {
                
    KickEx(playerid"Server""You have been kicked for flood!");     // Кикаем игрока от имени сервера с причиной которую вы пожелаете
                
    return 0;
            }
            
    SetPVarInt(playerid"AntiFlood"gettime() + 1);
        }
        return 
    1;



    Все вопросы по поводу данной функции, обсуждать в данной теме.

  2. 1 пользователь сказал cпасибо Dominik_48 за это полезное сообщение:

    MAY (01.09.2015)

  3. #2
    Пользователь Аватар для Tensa_Zangetsu
    Регистрация
    06.08.2015
    Сообщений
    4
    Репутация: 10

    Звание: на пути к лучшему

    Re: Команда /kick + логирование через MySQL

    А можно же сделать вот так? Чтобы сразу узнать имя того, кого мы какаем и кто кикает.

    PHP код:
    stock kick_log(playeridkickeridreason[])
    {
        
    // playerid - id кого кикаем
        // kickerid - id тот кто кикает
        // reason - причина
        
        
    new minutesechour
            
    daymonthyear,
            
    kicked_name[MAX_PLAYER_NAME],
            
    kicker_name[MAX_PLAYER_NAME],
            
    date_log[13], time_log[9]; // считал примерно
            
        
    gettime(hourminutesec);
        
    getdate(yearmonthday);
        
        
    GetPlayerName(playeridkicked_nameMAX_PLAYER_NAME);
        
    GetPlayerName(kickeridkicker_nameMAX_PLAYER_NAME);
        
        
    format(date_logsizeof(date_log), "%d.%d.%d"yearmonthday);
        
    format(time_logsizeof(time_log), "%d.%d.%d"minutesechour);
        
        
    format(save_resulsizeof(save_resul), "INSERT INTO `kick_log` (`kicked_name`, `kicker_name`, `reason`, `time`, `date`) VALUES \
        ('%s', '%s', '%s', '%d', '%s', '%s')"
    kicked_namekicker_namereasontime_logdate_log);
        
    mysql_tquery(connectssave_resul"""");
        
        return 
    1;

    Да и все было бы проще. Вот например

    PHP код:
    CMD:kick(playeridparams[])
    {
        if(
    PlayerInfo[playerid][pAdmin] >= 1)
        {
            if(
    sscanf(params"us[64]"params[0], params[1])) 
            return 
    SendClientMessage(playerid, -1" Введите: /kick [id][reason]");
            new 
    reason[64];
            
    format(reasonsizeof(reason), "Вы были кикнуты администратором %s Причина: %s"PlayerInfo[playerid][pName], params[1]);    
            
    SendClientMessage(playerid, -1reason);
            
    kick_log(params[0], playeridparams[1]);
            
    // А кикнуть то мы его забыли?! :D
        

        return 
    1;

    По мне так было бы удобнее. :bk:

  4. #3
    ыыыыы Аватар для Mexanizm
    Регистрация
    16.01.2012
    Адрес
    Россия. Воронеж
    Возраст
    30
    Сообщений
    2,450
    Репутация: 287

    Звание: как роза среди колючек

    Re: Команда /kick + логирование через MySQL

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

    http://prntscr.com/81iwji
    Modern RP





  5. 2 пользователей сказали cпасибо Mexanizm за это полезное сообщение:

    Dominik_48 (06.08.2015), FanHamMer (06.08.2015)

  6. #4
    Пользователь Аватар для Dominik_48
    Регистрация
    17.11.2014
    Сообщений
    40
    Репутация: 2

    Звание: пока не определено

    Re: Команда /kick + логирование через MySQL

    Цитата Сообщение от Tensa_Zangetsu Посмотреть сообщение
    кого мы какаем
    :facespa:

    Цитата Сообщение от Tensa_Zangetsu Посмотреть сообщение
    По мне так было бы удобнее. :bk:
    Смотри ты сразу получаешь два никнейма, а у меня смысл в том, что ты можешь эту функцию вставить везде где у тебя
    PHP код:
    Kick(playerid
    От имени сервера. И написать причину за что кинуло игрока.
    PHP код:
    KickEx(playerid"Server""You have been kicked for flood!"); 
    У тебя же в функции такой возможности не будет.

    Цитата Сообщение от Tensa_Zangetsu Посмотреть сообщение
    // А кикнуть то мы его забыли?!
    И кстати да, ты забыл кикнуть игрока просто отправил запрос к БД. + Намудрил в самом запросе. :facespa:

  7. #5
    Nothing Аватар для Privies
    Регистрация
    25.03.2011
    Адрес
    Рига
    Сообщений
    2,978
    Репутация: 411

    Звание: - очень-очень хороший человек

    Re: Команда /kick + логирование через MySQL

    Но ведь сначала тебя кикнет, а потом выведет текст. Разве нет?

  8. #6
    МАМБА ХУЯМБА Аватар для FanHamMer
    Регистрация
    27.03.2011
    Адрес
    Москва
    Возраст
    20
    Сообщений
    2,635
    Репутация: 272

    Звание: как роза среди колючек

    Re: Команда /kick + логирование через MySQL

    Цитата Сообщение от Privies Посмотреть сообщение
    Но ведь сначала тебя кикнет, а потом выведет текст. Разве нет?
    Но в коде же сначала вызывается KickEx, затем таймер на 30мс который запускает основную функцию кика(PlayerKick). Разве нет?

  9. #7
    Джентльмен лжец Аватар для Fallen A.
    Регистрация
    03.09.2011
    Адрес
    Минск, БССР
    Возраст
    29
    Сообщений
    2,409
    Репутация: 337

    Звание: как роза среди колючек

    Re: Команда /kick + логирование через MySQL

    Цитата Сообщение от FanHamMer Посмотреть сообщение
    Но в коде же сначала вызывается KickEx, затем таймер на 30мс который запускает основную функцию кика(PlayerKick). Разве нет?
    А разве не пофиксили то, что кик идет гораздо раньше?

  10. #8
    Активный пользователь Аватар для anonimniy
    Регистрация
    20.08.2011
    Адрес
    St. Petersburg
    Сообщений
    466
    Репутация: 28

    Звание: на пути к лучшему

    Re: Команда /kick + логирование через MySQL

    Логи в бд? Серьезно? А обычный текстовой файл в scripfiles уже не в моде?

  11. #9
    Пользователь Аватар для Tensa_Zangetsu
    Регистрация
    06.08.2015
    Сообщений
    4
    Репутация: 10

    Звание: на пути к лучшему

    Re: Команда /kick + логирование через MySQL

    Если честно, то не совсем уж вижу явное применения всего этого как функции. Все можно было бы тупо пихнуть при команде. Использование таймера как вызов одной функции - бред. Таймер вызывает функцию каждые 0.30 секунд. С этой же легкостью можно было бы использовать OnPlayerUpdate, который вызывается каждые 0.25 секунд.

    Мои ошибки были из-за того, что я был не у себя дома, а у друга. Он не кодер, поэтому из всех редакторов есть только блокнот Подсветка синтаксиса - вот основная причина этих ошибок, а именно ее отсутствие.:ao:

    Совет: не комментируй ты очевидные участки кода, убого. И задавай имена кода нормальные. А то функция KickEx мало о чем говорит.

  12. #10
    МАМБА ХУЯМБА Аватар для FanHamMer
    Регистрация
    27.03.2011
    Адрес
    Москва
    Возраст
    20
    Сообщений
    2,635
    Репутация: 272

    Звание: как роза среди колючек

    Re: Команда /kick + логирование через MySQL

    Цитата Сообщение от anonimniy Посмотреть сообщение
    Логи в бд? Серьезно? А обычный текстовой файл в scripfiles уже не в моде?
    С помощью записей в БД, можно выводить инфу на сайт.
    С файлом тоже конечно можно, но кто таким извращенством займётся?

  13. 1 пользователь сказал cпасибо FanHamMer за это полезное сообщение:

    Dominik_48 (06.08.2015)

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

Похожие темы

  1. Команда /addmoder MySQL
    от Maerovich в разделе Вопросы по скриптингу
    Ответов: 12
    Последнее сообщение: 20.12.2014, 20:35
  2. Не сохраняется пароль после Kick.
    от Helix в разделе Вопросы по скриптингу
    Ответов: 4
    Последнее сообщение: 08.03.2014, 21:04
  3. Таймер на команду /ban /kick /warn
    от sergo3101 в разделе Вопросы по скриптингу
    Ответов: 7
    Последнее сообщение: 31.08.2013, 17:54
  4. [GF] cmd /kick | вход с любым паролем
    от GFMode в разделе Вопросы по скриптингу
    Ответов: 2
    Последнее сообщение: 28.05.2013, 14:43
  5. /kick
    от MarikT в разделе Вопросы по скриптингу
    Ответов: 5
    Последнее сообщение: 27.04.2013, 16:20

Ваши права

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