• 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 пользователей онлайн

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

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

    • nazpol9
      От nazpol9
      Привет всем.

      У меня имеется мод для самп сервера и VPS с Ubuntu, на котором я пытаюсь его запустить.

      В чем суть проблемы: при запуске samp03svr, сервер запускается, но на версии 0.3.DL R-1. Когда я пытаюсь запустить этот же мод локально на Windows, сервер работает на версии 0.3.7 и я могу зайти на него без клиента 0.3.DL.

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

      Если у кого-то будут какие-либо догадки, прошу ими поделиться, если понадобится больше информации - я постараюсь её предоставить.
    • Talex
      От Talex
      Всем привет, сливаю первый мод!
      Информация о моде:

      — Основа Gamenix.
      — Мод переведен на Mysql R39, теперь ни каких слётов нет, мод работает стабильно с онлайном 160+.
      — Новый автосалон на TextDraw.
      — Система 3-х автомобилей (1 можно купить по дефолту, 2 и 3 за донат).
      — Автомобили у игроков теперь не пропадают (Id'ы авто сбивались, с номерами теперь тоже всё в порядке).
      — Оформление сервера полностью переработано, теперь оно более красивое.
      — Защита от копирования карты.
      — в меню сервера добавлен пункт визуальных настроек.
      — Номера на транспорт теперь можно приобрести в /donate.
      — Сделан новый красивый спидометр.
      — При получении номера, добавлен выбор региона.
      — Сделана система радаров и промокодов, создание прямо из игры.
      — Новый интерьер казино.
      — Магазин скинов теперь на TextDraw.
      — Автошкола полностью функционирует.
      — Добавлена информация после коннекта о последнем входе в собственный аккаунт.
      — Приватная защита от всех видов DDoS атак и DoS атак.                                                                                                                                    
      — пароль от АП (/alog) теперь у каждого администратора индивидуальный.
      — Изменено оформление самого мода
      Это не все изменения мода, их ещё очень много. все не упомнишь. 
      Автор мода: Неизвестен
      CUNBERS RP 8.4.3.rar
       

    • Tufxgod
      От Tufxgod
      Пойду на проект в качестве разработчика.
      Опыт в павн 2 года, умею писать системы любой сложности, владею mysql.
      Пишите в лс!