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

Вопрос || Unix-time

Рекомендованные сообщения



Не найдено.

10 posts in this topic

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

Эту строку: 

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
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
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
Share on other sites
4 часа назад, Новый сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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
Share on other sites
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
Share on other sites
В 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
Share on other sites

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

 

Share this post


Link to post
Share on other sites
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

    • Feris
      By Feris
      Приветствую всех, Вы ищете SA-MP серверы Freeroam ? Вот, пожалуйста!

      Языковые серверы: Английский/Чешский/Словацкий

      Посетите наши SA-MP серверы :

      Сервер 1 0.3.7 Клиентский сервер:
      Для подключения: play.superparba.eu:7777

      Сервер 2 0.3DL Клиентский сервер собственные острова и новые сюжетные миссии:
      Для подключения: Dl.superparba.eu:7777

      Сайт сервера: SuperParba.eu

      Discord: https://discord.com/invite/VRrtbsCJgb

      Почему вы должны играть на наших игровых серверах?

      SuperParba построен на создании сообщества и его характера, в котором вы можете управлять своим собственным
      бизнесом, покупать недвижимость, компании, быть членом банды - участвовать в гонках, бороться за территорию, захватывать склады в уникальной игре GANG.
      захватывать склады в уникальной системе GANG. Множество различных мероприятий от команды администрации, таких как
      Fallout, Sky (street) races, Color Dash, Runners VS Riders, Shooters VS Riders, Random events, Hit & Run,
      Тюнинг события, Дерби, Смертельные события, DM ... будут проходить каждый день и дополняться МЕГА
      событиями, которые проходят в течение нескольких недель! Мы работаем с 2008 года, сервер прошел
      через сотни полноценных обновлений из предложений по улучшению сервера от игрового
      сообщества! PARTY СЕРВЕР с игровым режимом RZE 10.1 режим попадает прямо под кожу, такова
      SuperParba!

      - Профессиональная команда администраторов, которая следит за порядком, создает веселье и помогает игрокам с любой проблемой.
      Если вы не знаете, как справиться с чем-то, используйте /ask, чтобы отправить свой вопрос напрямую к
      Администраторам, и вы получите ответ в кратчайшие сроки.

      - Для новичков был добавлен краткий учебник. Для навигации к месту запуска используйте команду
      /tutorial. Завершив учебник с 0 часов игры, новичок получит 7 дней
      премиум классик бесплатно.

      - Игроки нашли много веселья, эмоций, поворотов, друзей, новостей и воспоминаний за эти 12
      лет. Есть даже несколько реальных отношений, с которыми они познакомились в SuperParba. Это будет
      безумие, когда они расскажут об этом своим детям. Игроки рады вернуться на наш сервер, так что приходите и присоединяйтесь к нашей
      семье!

      Спасибо, что читаете.
    • panda1999
      By panda1999
      Ищу команду для открытие Торговой площадки Котороя готова вложиться на разработку писать в лс на сайте или вк https://vk.com/panda131999
      Скрин шот главной страницы


    • bdbsnnsd
      By bdbsnnsd
      Не могу найти куда в бд написать пароль от админки.