/*_______________________________________________________________
					||| MySQL BanSystem R2 |||
						(с) Splav ,
						2011 - 2012

Все права защищены

Авторскими правами на данный FilterScript обладает Splav (Richart_Alpert)


FilterScript создан специально для forum.pawno.ru
Распространение скрипта на сторонние ресурсы без указания автора запрещено

Разрешено: любое использование скрипта (редактирование, обновление и т.п.)
Запрещено: выдача скрипта за свой собственный, любая продажа скрипта
__________________________________________________________________*/

#include <a_samp>
#include <sscanf2>
#include <a_mysql>

#define HOST "..." // тут необходимо указать IP, на котором расположена База Данных MySQL
#define USER "..." // тут необходимо указать ник пользователя
#define DBNAME "..." // тут необходимо указать имя базу данных
#define PASS "..." // тут пароль для доступа к базе Данных

#define DIALOG_BAN_INFO 500 // Здесь ID желаемого диалога
#define DIALOG_UNBAN 501 // Здесь ID желаемого диалога

new	year, month, day,
	sendername[32], giveplayer[32], str[255],
	player[MAX_PLAYERS][21];

public OnFilterScriptInit()
{
	mysql_connect(HOST, USER, DBNAME, PASS);
    mysql_set_charset("utf8_general_ci");
	return true;
}

public OnPlayerConnect(playerid)
{
    CheckBanList(playerid);
	return true;
}

public OnPlayerDisconnect(playerid)
{
	return true;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    new cmd[32], params[128];
   	sscanf(cmdtext, "s[32]s[128]", cmd, params);
   	
	if(!strcmp(cmd, "/ban", true))
	{
	    if(!IsPlayerAdmin(playerid)) return true;
	    new giveplayerid, days, text[255], ip[32], date[16], unbandate;
	    if(sscanf(params, "uds", giveplayerid, days, text)) return SendClientMessage(playerid, 0xFF0000AA, "{FFFF00}*Подсказка*: {FFFFFF}/ban [ID игрока] [Кол-во дней] [Причина]");
	    if(!IsPlayerConnected(giveplayerid) || giveplayerid == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFF0000AA, "{FFFF00}*Внимание*: {FFFFFF}данный игрок не в сети");
	    if(days > 30) return SendClientMessage(playerid, 0xFF0000AA, "Внимание: срок бана - не больше 30 дней!");
		GetPlayerName(playerid, sendername, 32);
		GetPlayerName(giveplayerid, giveplayer, 32);
		GetPlayerIp(giveplayerid, ip, 32);
		format(str, sizeof(str), "* %s(%d) забанен администрацией сервера. Срок бана в днях: %d. Причина: %s *", giveplayer, giveplayerid, days, text);
		SendClientMessageToAll(0xFFFF00AA, str);
		unbandate = gettime() + days*86400;
		
		getdate(year, month, day);
		format(date, 16, "%02d.%02d.%04d", day, month, year);
		format(str, sizeof(str), "INSERT INTO bans (name, ip, bandate, time, unbandate, reason) VALUES ('%s', '%s', '%s', %d, %d, '%s')", giveplayer, ip, date, days, unbandate, text);
		mysql_query(str);
		Kick(giveplayerid);
		return 1;
	}

	if(!strcmp(cmd, "/unban", true))
	{
	    if(!IsPlayerAdmin(playerid)) return true;
	    new text[32];
		if(sscanf(params, "s", text)) return SendClientMessage(playerid, 0xFF0000AA, "{FFFF00}*Подсказка*: {FFFFFF}/unban [ID игрока]");
		format(str, sizeof(str), "SELECT * FROM bans WHERE name = '%s'", text);
		if(mysql_query(str) && mysql_store_result())
		{
			if(!mysql_num_rows()) return SendClientMessage(playerid, 0xFF0000AA, "{FFFF00}*Внимание*: {FFFFFF}Данного игрока нет в бан листе!");
			format(str, sizeof(str), "DELETE FROM bans WHERE name = '%s'", text);
		    mysql_query(str);
			format(str, sizeof(str), "{00FF00}Вы успешно разбанили {FFFFFF}%s", text);
			SendClientMessage(playerid, 0xFF0000AA, str);
		}
		mysql_free_result();
		return 1;
	}

	if(!strcmp(cmd, "/banlist", true))
	{
	    if(!IsPlayerAdmin(playerid)) return true;
	    new banlist[1000];
	    new name[21], line[30];
		mysql_query("SELECT name FROM bans");
		if(mysql_store_result())
		{
			for(new i; i<mysql_num_rows(); i++)
			{
				if(mysql_fetch_row_format(name))
				{
					format(line, sizeof(line), "{FF0000}%s\n", name);
					strcat(banlist, line);
				}
			}
			ShowPlayerDialog(playerid, DIALOG_BAN_INFO, DIALOG_STYLE_LIST, "БанЛист", banlist, "Выбрать", "Закрыть");
		}
		mysql_free_result();
		return 1;
	}

	if(!strcmp(cmd, "/cbanlist", true))
	{
	    if(!IsPlayerAdmin(playerid)) return true;
	    format(str, sizeof(str), "DELETE FROM bans WHERE unbandate < %d", gettime());
		mysql_query(str);
		format(str, sizeof(str), "Чистка выполнена. Удалено: %d записей", mysql_affected_rows());
		SendClientMessage(playerid, 0xFF0000AA, str);
		return 1;
	}
	return 0;
}

stock CheckBanList(playerid)
{
	new unbandate, bool:ban, ip[32];
	GetPlayerName(playerid, sendername, 32);
	GetPlayerIp(playerid, ip, 32);
	
	format(str, sizeof(str), "SELECT unbandate FROM bans WHERE name = '%s'", sendername);
	if(mysql_query(str) && mysql_store_result())
	{
		if(mysql_num_rows())
		{
			unbandate = mysql_fetch_int();
			if(unbandate > gettime()) ban = true;
		}
	}
	mysql_free_result();

	if(!ban)
	{
		format(str, sizeof(str), "SELECT unbandate FROM bans WHERE ip = '%s'", ip);
		if(mysql_query(str) && mysql_store_result())
		{
			if(mysql_num_rows())
			{
				unbandate = mysql_fetch_int();
				if(unbandate > gettime()) ban = true;
			}
		}
		mysql_free_result();
	}
	
	if(ban)
	{
  		format(str, sizeof(str), "{FF0000}Ваш аккаунт заблокирован! {FFFF00}Разбан: {FFFFFF}%s", fromUnixTime(unbandate));
  		SendClientMessage(playerid, 0xFF0000FF, str);
 		Kick(playerid);
	}
	return true;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == DIALOG_BAN_INFO && response)
	{
		new dialog[500], name[21], ip[16], bandate[15], id,
			time, unbandate, reason[100], result[255];
		format(str, sizeof(str), "SELECT * FROM bans WHERE name = '%s'", inputtext);
		if(mysql_query(str) && mysql_store_result())
		{
		    if(mysql_fetch_row_format(result))
		    {
		        sscanf(result, "p<|>ds[21]s[16]s[15]dds[100]",
		            id, name, ip, bandate, time, unbandate, reason);
		  		strmid(player[playerid], inputtext, 0, 20, 21);

		  		format(str, sizeof(str), "{FFFF00}Ник: {FFFFFF}%s. {FFFF00}IP: {FFFFFF}%s\n", name, ip);
		  		strcat(dialog, str);
		  		format(str, sizeof(str), "{FFFF00}Дата бана: {FFFFFF}%s\n", bandate);
		  		strcat(dialog, str);
		  		format(str, sizeof(str), "{FFFF00}Срок бана: {FFFFFF}%d\n", time);
		  		strcat(dialog, str);
		  		format(str, sizeof(str), "{FFFF00}Разбан: {FFFFFF}%s\n", fromUnixTime(unbandate));
		  		strcat(dialog, str);
		  		format(str, sizeof(str), "{FFFF00}Причина бана: {FFFFFF}%s", reason);
		        strcat(dialog, str);
				ShowPlayerDialog(playerid, DIALOG_UNBAN, DIALOG_STYLE_MSGBOX, "БанЛист", dialog, "Закрыть", "Разбанить");
			}
		}
		mysql_free_result();
		return true;
	}
	if(dialogid == DIALOG_UNBAN && !response)
	{
	    format(str, sizeof(str), "DELETE FROM bans WHERE name = '%s'", player[playerid]);
		mysql_query(str);
		format(str, sizeof(str), "Аккаунт %s разблокирован!", player[playerid]);
		SendClientMessage(playerid, 0xFF0000AA, str);
	    return true;
	}
	return false;
}

stock fromUnixTime(time)
{
	new unbantime[25];
	format(str, sizeof(str), "SELECT FROM_UNIXTIME( %d )", time);
	if(mysql_query(str) && mysql_store_result())
	{
		mysql_fetch_row_format(unbantime);
	}
	mysql_free_result();
	return unbantime;
}

