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

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

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

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

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

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

Начнем!

Для начала нам необходимо создать таблицу в которой будут сохранятся наши логи:
PHP Code:
CREATE TABLE IF NOT EXISTS `kick_log` (
  `
id` int(11) NOT NULL AUTO_INCREMENT,
  `
kicked_name` varchar(24) NOT NULL,
  `
kicker_name` varchar(24) NOT NULL,
  `
reason` varchar(64) NOT NULL,
  `
date` varchar(32) NOT NULL,
  
PRIMARY KEY (`id`)
) 
ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ; 
Объясню, что к чему:

PHP Code:
id            - Идентификатор в БД
kicked_name   
- Никнейм игрока которого кикнули
kicker_name   
- Никнейм игрока который кикнул 
reason        
- Причина кика
date          
- Дата и время кика 
Перейдем к нашему моду:
PHP Code:
KickEx(playerid, kicker[], reason[])      // Создаем нашу функцию c тремя аргументами
{
    if(!
IsPlayerConnected(playerid)) return true;     // Тут мы проверяем присоединен ли игрок к серверу
    
new minute, sec, hour, day, month, year, dates[32], mysql_string[300], name[MAX_PLAYER_NAME];     // Создаем переменные
    
     
gettime(hour, minute, sec);     // Получаем время
     
getdate(year, month, day);      // Получаем дату
     
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
     
format(dates, sizeof(dates), "%02d:%02d:%02d | %02d.%02d.%02d", hour, minute, sec, day, month, year);      // Форматируем время и дату и записываем все в переменную
    
format(mysql_string, sizeof(mysql_string), "INSERT INTO `kick_log` (`kicked_name`, `kicker_name`, `reason`, `date`) VALUES ('%s', '%s', '%s', '%s')", name, kicker, reason, dates);     // Тут мы форматируем запрос добавляя в него наши данные
    
mysql_tquery(connects, mysql_string, "", "");     // Теперь отправляем запрос
    
    
SetTimerEx("PlayerKick", 30, false, "d", playerid);     // И напоследок создаем таймер на 30 мс, который вызывает public с функцией Kick(playerid) 
    
return true;
}
forward PlayerKick(playerid);
public 
PlayerKick(playerid) return Kick(playerid);   // Данный public мы создали, чтобы игрок которого кикнули успел увидеть сообщение с причиной по которой его кикнули 
Теперь я приведу несколько примеров использования данной функции:
Создаем команду с помощью dc_cmd:
PHP Code:

CMD
:kick(playerid, params[])    // Создаем команду
{
    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(reason, sizeof(reason), "Вы были кикнуты администратором %s Причина: %s", PlayerInfo[playerid][pName], params[1]);    
        
SendClientMessage(playerid, -1, reason);
        
KickEx(params[0], PlayerInfo[playerid][pName], params[1]);    // И тут мы используем нашу функцию (params[0] - id игрока кого нужно кикнуть, PlayerInfo[playerid][pName] - Имя игрока который вводит команду, params[1] - Причина по которой мы кикаем игрока)
    
} 
    return 
true;
} 
Еще один способ, на примере антифлуда:
PHP Code:
public OnPlayerText(playerid, text[])    // 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(playerid, kicker[], reason[]) { // Создаем нашу функцию c тремя аргументами
    
if (!IsPlayerConnected(playerid)) return 1; // Тут мы проверяем присоединен ли игрок к серверу
    
new mysql_string[300]; // Создаем переменные
    
GetPlayerName(playerid, mysql_string, MAX_PLAYER_NAME); 
    
format(mysql_string, sizeof(mysql_string), "INSERT INTO `kick_log` (`kicked_name`, `kicker_name`, `reason`, `date`) VALUES ('%s', '%s', '%s', %d)", mysql_string, kicker, reason, gettime()); // Тут мы форматируем запрос добавляя в него наши данные
    
mysql_tquery(connects, mysql_string); // Теперь отправляем запрос
    
SetTimerEx("PlayerKick", 30, 0, "d", playerid); // И напоследок создаем таймер на 30 мс, который вызывает public с функцией Kick(playerid)
    
return 1;
} 
ЗЫ Вообще хорошей практикой считается смотреть на современные тенденции, и забивать на своё эго.
Reply
#7

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


Forum Jump:


Users browsing this thread: 1 Guest(s)