Вопросы

Новый
Новичок

Привет всем. Мне понятно , как создать само число времени UNIX-TIME.
Но у меня таков вопрос: как надо отсчитывать это самое число. ( Будет использовано в команде /ban )
** Использую MYSQL R-41:3
* На скринах : Структура таблицы и значения.
 

Спойлер

#include <mxdate> // LOADED
CMD:ban(playerid, params[])
{
	if(pInfo[playerid][pAdmin] < 3)
	    return cmd_not_found(playerid);
	new id, days, reason[25], type;
	if(sscanf(params, "uds[25]d", id, days, reason, type)) return SendUseMessage(playerid, "/ban [ID] [Дней] [Причина] [Тип] || Доп. - /types");
	if(is_player_logged{playerid} == 0)
	    return SendErrorMessage(playerid, "указанный игрок не подключен к серверу!");
	if(days  < 0) return SendErrorMessage(playerid, "срок бана не может быть меньше нуля");
	//if(id == playerid)  return SendErrorMessage(playerid, "вы не можете забанить самого себя!");
	if(pInfo[id][pAdmin] > 0 && pInfo[playerid][pAdmin] < 3) return SendErrorMessage(playerid, "вы не можете забанить администратора");
	/////////////////////////////////////////////////////////////////////////////////
	new bant = 0, query[256], string[(MAX_PLAYER_NAME*2)+(3*2)+(2*4)+25+4+30];
	switch(type)
	{
	    case 1: bant = 86400 * days;
		case 2: bant = 63072000 * 5;
		default: return false;
	}
	format(query, sizeof(query), "INSERT INTO `ban` (`id`, `time`, `reason`, `ip`, `admin_nick`, `type_ban`) VALUES ('%d', '%d', '%s', 'none', '%s', '%d')", pInfo[id][pID], bant, reason, PlayerName(playerid), type);
	mysql_tquery(mysql_connect_ID, query, "","");
	format(string, sizeof(string), "%s[%d] забанил игрока %s[%d] на %d %s с причиной %s", PlayerName(playerid), playerid, PlayerName(id), id, days, Declension_ReturnWord(days, "день","дня", "дней"), reason );
    SendClientMessageToAll(color_server, string);
	ShowPlayerDialog(id, DIALOG_STYLE_MSGBOX, dBan, ""#c_white"Бан аккаунта", ""#c_white"Вы были забанены! если вы не согласны с решением администрации \n- просьба написать в группу сервера", "Ok", "");
	Tkick(id);
	return true;
}

 

 

Opera Снимок_2018-11-09_120613_mysql.eve-host.ru.png

Opera Снимок_2018-11-09_120630_mysql.eve-host.ru.png

Пробовал устанавливать любые типы строки time (заменил int(15)) не помогло. Либо я туп или что-то еще

Отредактировано пользователем Новый
Причина: Перенёс в спойлер

Поделиться сообщением


Ссылка на сообщение

9 ответов на этот вопрос

  • 0

Эту строку: 

format(query, sizeof(query), "INSERT INTO `ban` (`id`, `time`, `reason`, `ip`, `admin_nick`, `type_ban`) VALUES ('%d', '%d', '%s', 'none', '%s', '%d')", pInfo[id][pID], bant, reason, PlayerName(playerid), type);

замените на эту строку: 

format(query, sizeof(query), "INSERT INTO `ban` (`id`, `time`, `reason`, `ip`, `admin_nick`, `type_ban`) VALUES ('%d', '%d', '%s', 'none', '%s', '%d')", pInfo[id][pID], gettime()+bant, reason, PlayerName(playerid), type);

Тогда в базу данных будут попадать данные не о количестве забаненных дней, а сразу о UNIX-времени разбана. 

Поделиться сообщением


Ссылка на сообщение
  • 0
Новый
Новичок

Благодарю , заносится,

 но в базе-данных должно отображаться сколько осталось времени? Может надо сменить что-то в структуре таблицы?

 

Поделиться сообщением


Ссылка на сообщение
  • 0
Новый
Новичок
52 минуты назад, DEST сказал:

Эту строку: 


format(query, sizeof(query), "INSERT INTO `ban` (`id`, `time`, `reason`, `ip`, `admin_nick`, `type_ban`) VALUES ('%d', '%d', '%s', 'none', '%s', '%d')", pInfo[id][pID], bant, reason, PlayerName(playerid), type);

замените на эту строку: 


format(query, sizeof(query), "INSERT INTO `ban` (`id`, `time`, `reason`, `ip`, `admin_nick`, `type_ban`) VALUES ('%d', '%d', '%s', 'none', '%s', '%d')", pInfo[id][pID], gettime()+bant, reason, PlayerName(playerid), type);

Тогда в базу данных будут попадать данные не о количестве забаненных дней, а сразу о UNIX-времени разбана. 

 

Поделиться сообщением


Ссылка на сообщение
  • 0
4 часа назад, Новый сказал:

в базе-данных должно отображаться сколько осталось времени?

я не знаю как вам нужно сделать и как у вас реализована система разбана, поэтому этот вопрос вам

Поделиться сообщением


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

@Новый, а зачем у вас вообще хранится UNIX время разбана/бана? Мало того, что это ненаглядно, так еще и больше времени уходит на реализацию всяких функций для конвертации времени.

Поделиться сообщением


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

Пример более-менее адекватной реализации системы блокировки аккаунта. Данный пример может послужить в целом примером правильной работы со временем.

 

1. Для начала стоит понять (уяснить) для себя, какой именно вы хотите видеть данную систему. Мне, например, хотелось бы знать время, причину, дату бана, имя администратора, выдавшего бан аккаунта. На основе этих пожеланий создаем таблицу "players_bans" в базе данных:

  • "id" - идентификатор бана (уникальный ID, который присвоен данной блокировке).
  • "playerid" - идентификатор аккаунта игрока, который заблокирован. Обратите внимание: я собираюсь хранить именно идентификатор, а не nick-name, поскольку дублировать поля, содержащие имя игроков в нескольких таблицах (как минимум в нашей players_bans и таблице, где представлен список всех аккаунтов) не вижу смысла: это затратно в плане ресурсов, а также на поиск аккаунта методом сверки строк требуется больше времени. Вообще оперировать лучше всегда с идентификаторами, нежели со строками. Длина поля зависит от максимальной длины идентификатора аккаунта. Я поставил 5 (т.е. максимальный ID аккаунта - 99999).
  • "bandate" - дата блокировки аккаунта в формате TIMESTAMP ('yyyy-mm-dd hh:mm:ss'). В значение "по умолчанию" установите CURRENT_TIMESTAMP (то есть поле bandate примет значение времени, в которое была создана запись о блокировке. Это облегчит работу в плане того, что нам не придется это время бана выставлять вручную. При необходимости его можно менять, нет никаких ограничений в этом плане.
  • "reason" - текстовое поле, хранящее в себе причину блокировки аккаунта. Длина - максимальная длина причины бана (я поставлю 64).
  • "adminid" - идентификатор аккаунта администратора, который выдал блокировку.
  • "unbandate" - дата окончания блокировки аккаунта в формате TIMESTAMP ('yyyy-mm-dd hh:mm:ss'). В значение "по умолчанию" ничего не устанавливайте. Время окончания блокировки у всех игроков не будет зависеть от выдачи самой блокировки.

 

Спойлер

Структура таблицы.png

 

2. Приступим к работе на стороне мода. Создадим некоторые функции, исправляющие ошибки разработчиков San Andreas/Criminal Russia, а также макросы.

const
	SEC					= (1), // sec
	MIN					= (60),
	HOUR					= (MIN*60),
	DAY					= (HOUR*24),
	WEEK					= (DAY*7),
	MONTH					= (DAY*31),
	YEAR					= (MONTH*12),
	
	MAX_LENGTH_TIMESTAMP			= (19),
	MAX_LENGTH_ACCOUNTID			= (5),
	MAX_LENGTH_REASON_BAN			= (64);

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

Спойлер

/*
	Описание:
		Функция BanPlayerAccount блокирует аккаунт игрока.

	Аргументы:
		playerid - идентификатор аккаунта игрока, который мы блокируем.
		adminid - идентификатор аккаунта администратора, выдающего блокировку.
		bantime - срок блокировки аккаунта в днях
		reason[] - причина блокировки аккаунта (строка)

	Возвращаемые значения:
		1, если все внутренние функции выполнились успешно.
		0, если какая-либо внутренняя функция не выполнилась.
*/
stock BanPlayerAccount(playerid, adminid, bantime, reason[])
{
	static const
		MIN_BAN_TIME = 1, // минимальное время блокировки в минутах (1 минута)
		MAX_BAN_TIME = 31*12; // максимальное время блокировки (1 год)

	if(!IsPlayerConnected(playerid))
		return 0; // playerid не в сети
	if(!IsPlayerConnected(adminid))
		return 0; // администратор не в сети
	if(!(MIN_BAN_TIME <= bantime <= MAX_BAN_TIME))
		return 0; // время блокировки не удовлетворяет границам

	static const SQL_QUERY_BAN[] = "INSERT INTO players_bans (playerid, adminid, reason, unbandate) VALUES (%d, %d, '%s', NOW()+INTERVAL %d DAY)"; // запрос вынес в отдельную строку, чтобы в format не занимал много места

	new result = _:true,
		string[200]; // больше точно не понадобится. Но вообще для больших текстов я предпочитаю создавать глобальный массив в начале мода

	format(string, sizeof string, SQL_QUERY_BAN, playerid, adminid, reason, bantime); // форматируем запрос
	result &= mysql_tquery(db_handle, string); // отправляем запрос в базу данных. Этим создаем запись о блокировке

	format(string, sizeof string, "Администратор %s заблокировал(а) ваш аккаунт аккаунт на %d дней.\nПричина: %s.", g_player[adminid][NAME], bantime, reason);
	ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Блокировка аккаунта", string, "Понятно", "");

	format(string, sizeof string, "Вы заблокировали аккаунт игрока %s на %d дней.\nПричина: %s.", g_player[playerid][NAME], bantime, reason);
	ShowPlayerDialog(adminid, 0, DIALOG_STYLE_MSGBOX, "Блокировка аккаунта", string, "Понятно");

	result &= /*ваша функция блокировки*/;
	return result;
}

/*
	Описание:
		функция удаляет аккаунт из бан-листа

	Аргументы:
		playername[] - nick-name игрока, которого нужно разбанить

	Возвращаемые значения:
		всегда возвращает 1

*/
stock UnBanPlayerAccount(playername[])
{
	static const SQL_QUERY_UNBAN[] = "DELETE FROM players_bans WHERE playerid = (SELECT id FROM accounts WHERE name = '%s') LIMIT 1";

	new string[sizeof SQL_QUERY_UNBAN+(-2+MAX_PLAYER_NAME)+1];

	format(string, sizeof string, SQL_QUERY_UNBAN, playername); // форматируем запрос
	mysql_tquery(db_handle, string); // отправляем запрос на удаление аккаунта из бан-листа

	return 1;
}

/*
	Описание:
		функция проверяет, забанен ли аккаунт игрока

	Аргументы:
		playername[] - nick-name игрока, которого мы проверяем на блокировку

	Возвращаемые значения:
		1, если аккаунт забанен,
		0, если аккаунт не забанен
*/
stock IsPlayerAccountBanned(playername[])
{
	static const SQL_QUERY_FINDBAN[] = "SELECT pb.*, IF(pb.unbandate > NOW(), SELECT pb.unbandate-NOW() AS residue, DELETE FROM players_bans WHERE id = pb.id) FROM players_bans AS pb WHERE pb.playerid = (SELECT a.id FROM accounts AS a WHERE a.name = '%s') LIMIT 1";

	new string[sizeof SQL_QUERY_FINDBAN+(-2+MAX_PLAYER_NAME)+1];

	format(string, sizeof string, SQL_QUERY_FINDBAN, playername);
	new Cache:result = mysql_query(db_handle, string);

	if(!cache_num_rows())
		return -1;
	
	cache_get_value_name_int(0, "residue", _:result);
	return !(_:result == 0);
}

 

 

А дальше остается уже вставлять эти функции в нужные места, при необходимости что-то где-то подправить (я не проверял работоспособность кода, но все должно работать).

Поделиться сообщением


Ссылка на сообщение
  • 0
Новый
Новичок
7 часов назад, odosenok сказал:

Пример более-менее адекватной реализации системы блокировки аккаунта. Данный пример может послужить в целом примером правильной работы со временем.

 

1. Для начала стоит понять (уяснить) для себя, какой именно вы хотите видеть данную систему. Мне, например, хотелось бы знать время, причину, дату бана, имя администратора, выдавшего бан аккаунта. На основе этих пожеланий создаем таблицу "players_bans" в базе данных:

  • "id" - идентификатор бана (уникальный ID, который присвоен данной блокировке).
  • "playerid" - идентификатор аккаунта игрока, который заблокирован. Обратите внимание: я собираюсь хранить именно идентификатор, а не nick-name, поскольку дублировать поля, содержащие имя игроков в нескольких таблицах (как минимум в нашей players_bans и таблице, где представлен список всех аккаунтов) не вижу смысла: это затратно в плане ресурсов, а также на поиск аккаунта методом сверки строк требуется больше времени. Вообще оперировать лучше всегда с идентификаторами, нежели со строками. Длина поля зависит от максимальной длины идентификатора аккаунта. Я поставил 5 (т.е. максимальный ID аккаунта - 99999).
  • "bandate" - дата блокировки аккаунта в формате TIMESTAMP ('yyyy-mm-dd hh:mm:ss'). В значение "по умолчанию" установите CURRENT_TIMESTAMP (то есть поле bandate примет значение времени, в которое была создана запись о блокировке. Это облегчит работу в плане того, что нам не придется это время бана выставлять вручную. При необходимости его можно менять, нет никаких ограничений в этом плане.
  • "reason" - текстовое поле, хранящее в себе причину блокировки аккаунта. Длина - максимальная длина причины бана (я поставлю 64).
  • "adminid" - идентификатор аккаунта администратора, который выдал блокировку.
  • "unbandate" - дата окончания блокировки аккаунта в формате TIMESTAMP ('yyyy-mm-dd hh:mm:ss'). В значение "по умолчанию" ничего не устанавливайте. Время окончания блокировки у всех игроков не будет зависеть от выдачи самой блокировки.

 

  Структура таблицы (открыть спойлер)

Структура таблицы.png

 

2. Приступим к работе на стороне мода. Создадим некоторые функции, исправляющие ошибки разработчиков San Andreas/Criminal Russia, а также макросы.


const
	SEC					= (1), // sec
	MIN					= (60),
	HOUR					= (MIN*60),
	DAY					= (HOUR*24),
	WEEK					= (DAY*7),
	MONTH					= (DAY*31),
	YEAR					= (MONTH*12),
	
	MAX_LENGTH_TIMESTAMP			= (19),
	MAX_LENGTH_ACCOUNTID			= (5),
	MAX_LENGTH_REASON_BAN			= (64);

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

  Функция выдачи блокировки (закрыть спойлер)


/*
	Описание:
		Функция BanPlayerAccount блокирует аккаунт игрока.

	Аргументы:
		playerid - идентификатор аккаунта игрока, который мы блокируем.
		adminid - идентификатор аккаунта администратора, выдающего блокировку.
		bantime - срок блокировки аккаунта в днях
		reason[] - причина блокировки аккаунта (строка)

	Возвращаемые значения:
		1, если все внутренние функции выполнились успешно.
		0, если какая-либо внутренняя функция не выполнилась.
*/
stock BanPlayerAccount(playerid, adminid, bantime, reason[])
{
	static const
		MIN_BAN_TIME = 1, // минимальное время блокировки в минутах (1 минута)
		MAX_BAN_TIME = 31*12; // максимальное время блокировки (1 год)

	if(!IsPlayerConnected(playerid))
		return 0; // playerid не в сети
	if(!IsPlayerConnected(adminid))
		return 0; // администратор не в сети
	if(!(MIN_BAN_TIME <= bantime <= MAX_BAN_TIME))
		return 0; // время блокировки не удовлетворяет границам

	static const SQL_QUERY_BAN[] = "INSERT INTO players_bans (playerid, adminid, reason, unbandate) VALUES (%d, %d, '%s', NOW()+INTERVAL %d DAY)"; // запрос вынес в отдельную строку, чтобы в format не занимал много места

	new result = _:true,
		string[200]; // больше точно не понадобится. Но вообще для больших текстов я предпочитаю создавать глобальный массив в начале мода

	format(string, sizeof string, SQL_QUERY_BAN, playerid, adminid, reason, bantime); // форматируем запрос
	result &= mysql_tquery(db_handle, string); // отправляем запрос в базу данных. Этим создаем запись о блокировке

	format(string, sizeof string, "Администратор %s заблокировал(а) ваш аккаунт аккаунт на %d дней.\nПричина: %s.", g_player[adminid][NAME], bantime, reason);
	ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Блокировка аккаунта", string, "Понятно", "");

	format(string, sizeof string, "Вы заблокировали аккаунт игрока %s на %d дней.\nПричина: %s.", g_player[playerid][NAME], bantime, reason);
	ShowPlayerDialog(adminid, 0, DIALOG_STYLE_MSGBOX, "Блокировка аккаунта", string, "Понятно");

	result &= /*ваша функция блокировки*/;
	return result;
}

/*
	Описание:
		функция удаляет аккаунт из бан-листа

	Аргументы:
		playername[] - nick-name игрока, которого нужно разбанить

	Возвращаемые значения:
		всегда возвращает 1

*/
stock UnBanPlayerAccount(playername[])
{
	static const SQL_QUERY_UNBAN[] = "DELETE FROM players_bans WHERE playerid = (SELECT id FROM accounts WHERE name = '%s') LIMIT 1";

	new string[sizeof SQL_QUERY_UNBAN+(-2+MAX_PLAYER_NAME)+1];

	format(string, sizeof string, SQL_QUERY_UNBAN, playername); // форматируем запрос
	mysql_tquery(db_handle, string); // отправляем запрос на удаление аккаунта из бан-листа

	return 1;
}

/*
	Описание:
		функция проверяет, забанен ли аккаунт игрока

	Аргументы:
		playername[] - nick-name игрока, которого мы проверяем на блокировку

	Возвращаемые значения:
		1, если аккаунт забанен,
		0, если аккаунт не забанен
*/
stock IsPlayerAccountBanned(playername[])
{
	static const SQL_QUERY_FINDBAN[] = "SELECT pb.*, IF(pb.unbandate > NOW(), SELECT pb.unbandate-NOW() AS residue, DELETE FROM players_bans WHERE id = pb.id) FROM players_bans AS pb WHERE pb.playerid = (SELECT a.id FROM accounts AS a WHERE a.name = '%s') LIMIT 1";

	new string[sizeof SQL_QUERY_FINDBAN+(-2+MAX_PLAYER_NAME)+1];

	format(string, sizeof string, SQL_QUERY_FINDBAN, playername);
	new Cache:result = mysql_query(db_handle, string);

	if(!cache_num_rows())
		return -1;
	
	cache_get_value_name_int(0, "residue", _:result);
	return !(_:result == 0);
}

 

 

А дальше остается уже вставлять эти функции в нужные места, при необходимости что-то где-то подправить (я не проверял работоспособность кода, но все должно работать).

Большое спасибо, приду - попробуй.

Поделиться сообщением


Ссылка на сообщение
  • 0
Новый
Новичок
В 10.11.2018 в 03:17, odosenok сказал:

Пример более-менее адекватной реализации системы блокировки аккаунта. Данный пример может послужить в целом примером правильной работы со временем.

 

1. Для начала стоит понять (уяснить) для себя, какой именно вы хотите видеть данную систему. Мне, например, хотелось бы знать время, причину, дату бана, имя администратора, выдавшего бан аккаунта. На основе этих пожеланий создаем таблицу "players_bans" в базе данных:

  • "id" - идентификатор бана (уникальный ID, который присвоен данной блокировке).
  • "playerid" - идентификатор аккаунта игрока, который заблокирован. Обратите внимание: я собираюсь хранить именно идентификатор, а не nick-name, поскольку дублировать поля, содержащие имя игроков в нескольких таблицах (как минимум в нашей players_bans и таблице, где представлен список всех аккаунтов) не вижу смысла: это затратно в плане ресурсов, а также на поиск аккаунта методом сверки строк требуется больше времени. Вообще оперировать лучше всегда с идентификаторами, нежели со строками. Длина поля зависит от максимальной длины идентификатора аккаунта. Я поставил 5 (т.е. максимальный ID аккаунта - 99999).
  • "bandate" - дата блокировки аккаунта в формате TIMESTAMP ('yyyy-mm-dd hh:mm:ss'). В значение "по умолчанию" установите CURRENT_TIMESTAMP (то есть поле bandate примет значение времени, в которое была создана запись о блокировке. Это облегчит работу в плане того, что нам не придется это время бана выставлять вручную. При необходимости его можно менять, нет никаких ограничений в этом плане.
  • "reason" - текстовое поле, хранящее в себе причину блокировки аккаунта. Длина - максимальная длина причины бана (я поставлю 64).
  • "adminid" - идентификатор аккаунта администратора, который выдал блокировку.
  • "unbandate" - дата окончания блокировки аккаунта в формате TIMESTAMP ('yyyy-mm-dd hh:mm:ss'). В значение "по умолчанию" ничего не устанавливайте. Время окончания блокировки у всех игроков не будет зависеть от выдачи самой блокировки.

 

  Структура таблицы (открыть спойлер)

Структура таблицы.png

 

2. Приступим к работе на стороне мода. Создадим некоторые функции, исправляющие ошибки разработчиков San Andreas/Criminal Russia, а также макросы.


const
	SEC					= (1), // sec
	MIN					= (60),
	HOUR					= (MIN*60),
	DAY					= (HOUR*24),
	WEEK					= (DAY*7),
	MONTH					= (DAY*31),
	YEAR					= (MONTH*12),
	
	MAX_LENGTH_TIMESTAMP			= (19),
	MAX_LENGTH_ACCOUNTID			= (5),
	MAX_LENGTH_REASON_BAN			= (64);

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

  Функция выдачи блокировки (открыть спойлер)


/*
	Описание:
		Функция BanPlayerAccount блокирует аккаунт игрока.

	Аргументы:
		playerid - идентификатор аккаунта игрока, который мы блокируем.
		adminid - идентификатор аккаунта администратора, выдающего блокировку.
		bantime - срок блокировки аккаунта в днях
		reason[] - причина блокировки аккаунта (строка)

	Возвращаемые значения:
		1, если все внутренние функции выполнились успешно.
		0, если какая-либо внутренняя функция не выполнилась.
*/
stock BanPlayerAccount(playerid, adminid, bantime, reason[])
{
	static const
		MIN_BAN_TIME = 1, // минимальное время блокировки в минутах (1 минута)
		MAX_BAN_TIME = 31*12; // максимальное время блокировки (1 год)

	if(!IsPlayerConnected(playerid))
		return 0; // playerid не в сети
	if(!IsPlayerConnected(adminid))
		return 0; // администратор не в сети
	if(!(MIN_BAN_TIME <= bantime <= MAX_BAN_TIME))
		return 0; // время блокировки не удовлетворяет границам

	static const SQL_QUERY_BAN[] = "INSERT INTO players_bans (playerid, adminid, reason, unbandate) VALUES (%d, %d, '%s', NOW()+INTERVAL %d DAY)"; // запрос вынес в отдельную строку, чтобы в format не занимал много места

	new result = _:true,
		string[200]; // больше точно не понадобится. Но вообще для больших текстов я предпочитаю создавать глобальный массив в начале мода

	format(string, sizeof string, SQL_QUERY_BAN, playerid, adminid, reason, bantime); // форматируем запрос
	result &= mysql_tquery(db_handle, string); // отправляем запрос в базу данных. Этим создаем запись о блокировке

	format(string, sizeof string, "Администратор %s заблокировал(а) ваш аккаунт аккаунт на %d дней.\nПричина: %s.", g_player[adminid][NAME], bantime, reason);
	ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Блокировка аккаунта", string, "Понятно", "");

	format(string, sizeof string, "Вы заблокировали аккаунт игрока %s на %d дней.\nПричина: %s.", g_player[playerid][NAME], bantime, reason);
	ShowPlayerDialog(adminid, 0, DIALOG_STYLE_MSGBOX, "Блокировка аккаунта", string, "Понятно");

	result &= /*ваша функция блокировки*/;
	return result;
}

/*
	Описание:
		функция удаляет аккаунт из бан-листа

	Аргументы:
		playername[] - nick-name игрока, которого нужно разбанить

	Возвращаемые значения:
		всегда возвращает 1

*/
stock UnBanPlayerAccount(playername[])
{
	static const SQL_QUERY_UNBAN[] = "DELETE FROM players_bans WHERE playerid = (SELECT id FROM accounts WHERE name = '%s') LIMIT 1";

	new string[sizeof SQL_QUERY_UNBAN+(-2+MAX_PLAYER_NAME)+1];

	format(string, sizeof string, SQL_QUERY_UNBAN, playername); // форматируем запрос
	mysql_tquery(db_handle, string); // отправляем запрос на удаление аккаунта из бан-листа

	return 1;
}

/*
	Описание:
		функция проверяет, забанен ли аккаунт игрока

	Аргументы:
		playername[] - nick-name игрока, которого мы проверяем на блокировку

	Возвращаемые значения:
		1, если аккаунт забанен,
		0, если аккаунт не забанен
*/
stock IsPlayerAccountBanned(playername[])
{
	static const SQL_QUERY_FINDBAN[] = "SELECT pb.*, IF(pb.unbandate > NOW(), SELECT pb.unbandate-NOW() AS residue, DELETE FROM players_bans WHERE id = pb.id) FROM players_bans AS pb WHERE pb.playerid = (SELECT a.id FROM accounts AS a WHERE a.name = '%s') LIMIT 1";

	new string[sizeof SQL_QUERY_FINDBAN+(-2+MAX_PLAYER_NAME)+1];

	format(string, sizeof string, SQL_QUERY_FINDBAN, playername);
	new Cache:result = mysql_query(db_handle, string);

	if(!cache_num_rows())
		return -1;
	
	cache_get_value_name_int(0, "residue", _:result);
	return !(_:result == 0);
}

 

 

А дальше остается уже вставлять эти функции в нужные места, при необходимости что-то где-то подправить (я не проверял работоспособность кода, но все должно работать).

Еще один маааленький вопрос. Как отнять в формате это самое NOW();
* Для SendClientMessage

 

* Просто поставить format(string,sizeof(string), "%s-NOW()",band);
не работает.

 

Поделиться сообщением


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

@Новый, это стоит отнимать в самом запросе. Либо же использовать библиотеку mxdate (она стандартная, в папке include Вашего сервера должна быть).

 

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Helados
      От Helados
      Короче, мы протестировали наш GTA на другом хостинге — голосовой чат там работает, всё включается нормально. Также проверили на другом хостинге с нашим игровым модом — voice chat тоже работает.
      Но на нашем личном хостинге, который мы купили на OVH и установили панель, не получается запустить голосовой чат. Похоже, проблема связана с портами. После перезапуска сервер почему-то случайным образом выбирает порты сам и мы не можем это исправить.
      Если кто-то знает человека, который может помочь разобраться с этой проблемой, буду благодарен.
    • тимормо
      От тимормо
      Копия Diamond RP (основа State 99)
      Скачать файл Мод DIAMOND RP (ver. 1.0)
      Основа: State 99
      Автор мода: #TomSnow
      Вопросы/Баги: https://vk.com/etalon_dev
       
      Приветствую всех! На связи #TomSnow
       
      Я принял решение начать поэтапную разработку и восстановление легендарного мода Diamond RolePlay образца 2015–2017 годов, взяв за основу мод State 99 (оригинальная основа DRP).
       
      Каждая новая версия разрабатываемого мода будет публиковаться в открытом доступе для всех участников и подписчиков сообщества (https://vk.com/etalon_dev). Это позволит вам не только следить за процессом разработки, но и принимать непосредственное участие в развитии проекта: тестировать обновления, находить баги, сообщать о недоработках и помогать делать мод максимально качественным и стабильным.
       
      Если вам интересна данная тематика и вы хотите наблюдать за ходом разработки, подписывайтесь на нашу группу ВКонтакте (https://vk.com/etalon_dev) и ожидайте публикацию версий проекта.
       
      Спасибо всем за поддержку! Впереди нас ждёт много интересной работы и возвращение атмосферы классического Diamond RolePlay. 
       
      Информация о моде:
       
      Версия MySQL R 39-6
      Античит Nex-AC (Доработанный)
      Стример Streamer Plugin v2.9.4
      Командный процессор Pawn CMD
       
      Список обновлений мода
       
       
      Добавил тимормо Добавлено 07/15/26 Категория Моды Автор #TomSnow  
    • тимормо
      От тимормо
      Мод DIAMOND RP (ver. 1.0)
      Основа: State 99
      Автор мода: #TomSnow
      Вопросы/Баги: https://vk.com/etalon_dev
       
      Приветствую всех! На связи #TomSnow
       
      Я принял решение начать поэтапную разработку и восстановление легендарного мода Diamond RolePlay образца 2015–2017 годов, взяв за основу мод State 99 (оригинальная основа DRP).
       
      Каждая новая версия разрабатываемого мода будет публиковаться в открытом доступе для всех участников и подписчиков сообщества (https://vk.com/etalon_dev). Это позволит вам не только следить за процессом разработки, но и принимать непосредственное участие в развитии проекта: тестировать обновления, находить баги, сообщать о недоработках и помогать делать мод максимально качественным и стабильным.
       
      Если вам интересна данная тематика и вы хотите наблюдать за ходом разработки, подписывайтесь на нашу группу ВКонтакте (https://vk.com/etalon_dev) и ожидайте публикацию версий проекта.
       
      Спасибо всем за поддержку! Впереди нас ждёт много интересной работы и возвращение атмосферы классического Diamond RolePlay. 
       
      Информация о моде:
       
      Версия MySQL R 39-6
      Античит Nex-AC (Доработанный)
      Стример Streamer Plugin v2.9.4
      Командный процессор Pawn CMD
       
      Список обновлений мода
       
       
    • Gabriel C
      От Gabriel C
      Всем привет. Ищу клиентскую сборку Flin RP для ПК.
      Нужна полноценная версия клиента со всеми необходимыми файлами для запуска игры и подключения к серверу.
      Желательно сборку примерно 2023 года, так как по имеющимся файлам видно, что обновления клиента и систем Real Cars / Real Skins были сделаны в начале 2023 года.
      Нужна именно ПК-сборка/клиент Flin RP:
      лаунчер (если был); папка с игрой; ASI/плагины; cache/modpack с моделями. Если у кого-то осталась рабочая сборка или архив клиента — буду благодарен за помощь.