[Tutorial] Команда /kick + логирование через MySQL
#1

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

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

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

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

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

Начнем!

Для начала нам необходимо создать таблицу в которой будут сохранятся наши логи:
PHP Code:
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 Code:
id            Идентификатор в БД
kicked_name   
Никнейм игрока которого кикнули
kicker_name   
Никнейм игрока который кикнул 
reason        
Причина кика
date          
Дата и время кика 
Перейдем к нашему моду:
PHP Code:
KickEx(playeridkicker[], reason[])      // Создаем нашу функцию c тремя аргументами
{
    if(!
IsPlayerConnected(playerid)) return true;     // Тут мы проверяем присоединен ли игрок к серверу
    
new minutesechourdaymonthyeardates[32], mysql_string[300], name[MAX_PLAYER_NAME];     // Создаем переменные
    
     
gettime(hourminutesec);     // Получаем время
     
getdate(yearmonthday);      // Получаем дату
     
GetPlayerName(playeridnameMAX_PLAYER_NAME);
     
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')"namekickerreasondates);     // Тут мы форматируем запрос добавляя в него наши данные
    
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 Code:

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 Code:
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;

Reply
#2

За такой способ хранить дату нужно анально карать!
Reply
#3

Quote:

За такой способ хранить дату нужно анально карать!

Обоснуй!
Reply
#4

Quote:
Originally Posted by Whiteman
View Post
Обоснуй!
Ну, он, наверное, сторонник использования специально предназначенных типов данных для хранения даты и времени, либо хочет, чтобы ты хранил это в формате unixtime.

А еще у тебя в коде какая-то непонятная функция GetName и массивчик description не объявлен нигде.
Reply
#5

Quote:

А еще у тебя в коде какая-то непонятная функция GetName и массивчик description не объявлен нигде.

Исправил.
Reply
#6

Quote:
Originally Posted by Whiteman
View Post
Обоснуй!
unxtime проще и удобней.
  • Кросплатформенный.
  • Проще работать, нежели со строкой.
  • Проще хранить.
  • Занимает меньше места.
  • Проще пробразовывать в различные форматы.
Список можно продолжать...

Наглядный пример очевидного:
PHP Code:
KickEx(playeridkicker[], reason[]) { // Создаем нашу функцию c тремя аргументами
    
if (!IsPlayerConnected(playerid)) return 1// Тут мы проверяем присоединен ли игрок к серверу
    
new mysql_string[300]; // Создаем переменные
    
GetPlayerName(playeridmysql_stringMAX_PLAYER_NAME); 
    
format(mysql_stringsizeof(mysql_string), "INSERT INTO `kick_log` (`kicked_name`, `kicker_name`, `reason`, `date`) VALUES ('%s', '%s', '%s', %d)"mysql_stringkickerreasongettime()); // Тут мы форматируем запрос добавляя в него наши данные
    
mysql_tquery(connectsmysql_string); // Теперь отправляем запрос
    
SetTimerEx("PlayerKick"300"d"playerid); // И напоследок создаем таймер на 30 мс, который вызывает public с функцией Kick(playerid)
    
return 1;

ЗЫ Вообще хорошей практикой считается смотреть на современные тенденции, и забивать на своё эго.
Reply
#7

Что, кстати мешает заюзать перехваты?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)