• 0
Новый

Вопрос || Unix-time

Вопросы

Привет всем. Мне понятно , как создать само число времени 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

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

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


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

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

 

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

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

 

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


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

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

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

    • angel_sinvays
      От angel_sinvays


      Скачать файл Florida Role Play | (Бонусный)
      Список доработок/изменений:

      1. Исправлены дыры с рублями, падением мода
      2. Новый античит(/ac)
      3. Аренда вертолетов (/gps - аренда транспорта - аренда вертолетов)
      4. Добавлена система /goadminka (раздача админки при определённом онлайне)
      5. Обновленны интерьеры банд, СМИ, ПД, выбор скина, домов, магазинов
      6. Изменён экстерьер парка у мэрии, на против больницы
      7. Изменен текстдрав Логотипа, выбор скина, спидометра, дм арены, капта
      8. Вместо мопедов сделаны пикапы аренды
      9. Добавлена система VIP (Бронза, Серебро, Золото и Верона)
      10. Изменена система семей
      11. Добавлен чат для випов (/vc)
      12. При попытки проследить за ботом, перекидывает за игрока
      13. Добавлено казино, в котром можно играть на донат и рубли
      14. Добавлена система дуэлей
      15. Добавлены команды: /security, /checkfull и /fonline
      16. Изменён бот для авто-инвайта
      17. Изменена система дм зон (отличается от дуэлей)
      18. Доработана система статистики администратора, добавлено время администрирования в /admins
      19. Добавлен премиум меню для Verona PREMIUM
      20. Добавлены карты для /tp - Мероприятия
      21. Добавлена статистика лидера, изменена /lmenu
      22. Добавлена покупка аксессуаров в /donate
      23. Добавлена команда /obj
      24. Перераспределил команды для админов
      25. При наличии 1000 рублей или большой суммы виртов у игрока появляется кейс
      26. Исправлены баги со спавном банд
      27. Исправлены баги с падением под текстуры
      28. Исправлен баг с виртуальными мирами
      29. Добавлен NPC авто-инвайт на спавн
      30. Добавлен NPC проведения дуэлей
      31. Исправлена команда /banip
      32. Изменена и доделана система от сливов
      33. Возможность добавить своих ботов (+ уже встроены в мод)
      34. Доработана система мероприятий
      35. Переработана система доната (/donaterub and /donate)
      36. Обновлены плагины, почищена БД
      37. Новые артефакты
      38. Новый спавн
      39. Новая аренда
      40. Автоинвайт в мэрии
       
      UPD: Понизил ценник на мод
      Добавил angel_sinvays Добавлено 14.02.2022 Категория Моды Автор Angel Sinvays  
    • angel_sinvays
      От angel_sinvays
      Список доработок/изменений:

      1. Исправлены дыры с рублями, падением мода
      2. Новый античит(/ac)
      3. Аренда вертолетов (/gps - аренда транспорта - аренда вертолетов)
      4. Добавлена система /goadminka (раздача админки при определённом онлайне)
      5. Обновленны интерьеры банд, СМИ, ПД, выбор скина, домов, магазинов
      6. Изменён экстерьер парка у мэрии, на против больницы
      7. Изменен текстдрав Логотипа, выбор скина, спидометра, дм арены, капта
      8. Вместо мопедов сделаны пикапы аренды
      9. Добавлена система VIP (Бронза, Серебро, Золото и Верона)
      10. Изменена система семей
      11. Добавлен чат для випов (/vc)
      12. При попытки проследить за ботом, перекидывает за игрока
      13. Добавлено казино, в котром можно играть на донат и рубли
      14. Добавлена система дуэлей
      15. Добавлены команды: /security, /checkfull и /fonline
      16. Изменён бот для авто-инвайта
      17. Изменена система дм зон (отличается от дуэлей)
      18. Доработана система статистики администратора, добавлено время администрирования в /admins
      19. Добавлен премиум меню для Verona PREMIUM
      20. Добавлены карты для /tp - Мероприятия
      21. Добавлена статистика лидера, изменена /lmenu
      22. Добавлена покупка аксессуаров в /donate
      23. Добавлена команда /obj
      24. Перераспределил команды для админов
      25. При наличии 1000 рублей или большой суммы виртов у игрока появляется кейс
      26. Исправлены баги со спавном банд
      27. Исправлены баги с падением под текстуры
      28. Исправлен баг с виртуальными мирами
      29. Добавлен NPC авто-инвайт на спавн
      30. Добавлен NPC проведения дуэлей
      31. Исправлена команда /banip
      32. Изменена и доделана система от сливов
      33. Возможность добавить своих ботов (+ уже встроены в мод)
      34. Доработана система мероприятий
      35. Переработана система доната (/donaterub and /donate)
      36. Обновлены плагины, почищена БД
      37. Новые артефакты
      38. Новый спавн
      39. Новая аренда
      40. Автоинвайт в мэрии
       
      UPD: Понизил ценник на мод
    • angel_sinvays
      От angel_sinvays
      Attractive RP
      Скачать файл Давно не было сливов , сейчас я вам готов продемонстрировать копию проекта Attractive RolePlay
      Изначально слив был выложен на моём канале, но после я хочу выложить его сюда.
      Добавил angel_sinvays Добавлено 01.05.2024 Категория Моды Автор Angel Sinvays  
    • Demon7
      От Demon7
      Как исправить эту ошибку? Попытался залить на мод данный код и при компиляции происходит данная ошибка. Эта ошибка находится на строчке if(GetPlayerData(targetid, "friend_request") == playerid)
      CMD:frien(playerid, params[]) {     new targetid = strval(params);     if(!IsPlayerConnected(targetid))     {         SendClientMessage(playerid, COLOR_RED, "Целевой игрок не подключен к серверу.");         return 0;     }     if(targetid == playerid)     {         SendClientMessage(playerid, COLOR_RED, "Вы не можете предложить себе подружиться.");         return 0;     }     if(IsPlayerInRangeOfPlayer(playerid, targetid, 2.0))     {         if(GetPlayerData(targetid, "friend_request") == playerid)         {             SendClientMessage(playerid, COLOR_RED, "У вас уже есть ожидающий запрос на дружбу от этого игрока.");             return 0;         }         SendClientMessage(playerid, COLOR_YELLOW, "Вы предложили игроку подружиться. Ожидайте ответа...");         SendClientMessage(targetid, COLOR_YELLOW, "Игрок предлагает вам подружиться. Используйте /accept или /reject.");         SetPlayerData(playerid, "friend_request", targetid);         SetPlayerData(targetid, "friend_request", playerid);     }     else     {         SendClientMessage(playerid, COLOR_RED, "Игрок находится слишком далеко.");     }     return 1; }
    • angel_sinvays
      От angel_sinvays
      Давно не было сливов , сейчас я вам готов продемонстрировать копию проекта Attractive RolePlay
      Изначально слив был выложен на моём канале, но после я хочу выложить его сюда.