• 0
Sign in to follow this  
Followers 0
Новый

Вопрос || Unix-time

Question

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

Edited by Новый
Причина: Перенёс в спойлер

Share this post


Link to post

9 answers to this question

  • 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-времени разбана. 

Share this post


Link to post
  • 0

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

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

 

Share this post


Link to post
  • 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-времени разбана. 

 

Share this post


Link to post
  • 0
4 часа назад, Новый сказал:

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

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

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 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);
}

 

 

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

Share this post


Link to post
  • 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);
}

 

 

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

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

Share this post


Link to post
  • 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);
не работает.

 

Share this post


Link to post
  • 0

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

 

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Dexter Nomad
      By Dexter Nomad
      При попытке компиляции кода возникает ошибка:
      error 076: syntax error in the expression, or invalid function call
      Не могу найти причину, буду благодарен, если не только укажете, где сама ошибка, но еще и исправите ее.
      Сам код:
          if(strcmp(cmd, "/carsharing", true) == 0)     {         if(IsPlayerConnected(playerid))         {             if(PlayerInfo[playerid][CarLic] == 0) return SCM(playerid, COLOR_RED, "У вас нет вод.прав! Вы можете получить их в автошколе!");         }     }  
    • Sanya_Greison
      By Sanya_Greison
      Куплю РП мод под сервер без бонуса. Бюджет до 150 $
      А также скриптера с Украины
      мой вк vk.com/i_am_sashko
    • Михаил Майоров
      By Михаил Майоров
      Т.к. я начинающий скриптер, хочу поделится для незнающих людей командами, которые написал сам. Да, они простые, но начинающие не всегда понимают.
      Понадобится плагин DC_cmd.
      CMD:sethp(playerid, params[]) {     //Далее тут проверка. Если нужна, могу залить.     static const MSG_USE_CMD[] = !"Введите /sethp [ID] [Кол-во HP]";     if(isnull(params))         return SendClientMessage(playerid, -1, MSG_USE_CMD) & 0;     new id, Float:health;     if(sscanf(params, "uf(0.0)", id, health))         return SendClientMessage(playerid, -1, MSG_USE_CMD) & 0;     else if(id == INVALID_PLAYER_ID)         return SendClientMessage(playerid, -1, !"Игрока с таким ID нет на сервере") & 0;     else if(!(0.0 <= health <= 150.0))         return SendClientMessage(playerid, -1, !"[Ошибка] Установите не менее 0 и не более 150!") & 0;     SetPlayerHealth(id, health);     return 1; } Это ещё не всё. Буду дополнять. Пока только 1 команда
    • lanserq
      By lanserq
      Нашел тему где рассказывают как увеличить скорость, но я не знаю как увеличить для определенной машины,подскажите пожалуйста, вот сама функция : 
      stock SetVehicleSpeed(vehicleid,mph) { new Float:Vx, Float:Vy, Float:Vz ,Float:speeds, Float:multiple; GetVehicleVelocity(vehicleid,Vx,Vy,Vz); speeds = floatsqroot(Vx*Vx + Vy*Vy + Vz*Vz); if(speeds > 0) { multiple = (mph / (speeds * 250)); return SetVehicleVelocity(vehicleid, Vx*multiple, Vy*multiple, Vz*multiple); } return 0; }