//------------------------------------------------------------------------------
//       WWW.PAWNO.RU - ЛУЧШИЙ,РУССКИЙ ПОРТАЛ О PAWN СКРИПТИНГЕ В PAWNO
//------------------------------------------------------------------------------
#include <a_samp>
//                   НАСТРОЙКИ
#define w_pawno_ru 0xFFFFFFFF //Белый
#define y_pawno_ru 0xFFAA00FF //Желтый
#define p_pawno_ru 0xFF00FFFF //Розовый
#define r_pawno_ru 0xFF1100FF //Красный
#define g_pawno_ru 0x908080FF //Серый
#define PAWNO_RU_SPAM 4 //После 4 спамчега в чат , игрока выебнет с сервера
#define PAWNO_RU_LIMIT 8 //Интервал 8 секунд между сообщениями и игрока кикнет
#define PAWNO_RU_MAT 3 //3 мата в чат и игроку пизда
#define PAWNO_RU_PEKLAMA 2
#define COLOR_LIGHTRED 0xFF6347AA
//               ФОРВАРДЫ
forward FIP(playerid,const string[]);
forward FISWO(buffer[],pattern[],offset);
forward ISPR(testCharacter);
//                ПЕРЕМЕННЫЕ
new PlohieSlova[500][64];
new KolvoSlov = 0;
new Predupreshdenie=false;
enum Dannie
{
	KolvoSpama,
	BpemyaSpama,
	KolvoMaToB,
	KolvoPeKlaM
};
new Igrok[MAX_PLAYERS][Dannie];

public OnFilterScriptInit()
{
	print("\n--------------------------------------------------------------------------");
	new File:uwfile;
	new string[64];
	print(" *** Был загружен скрипт АНТИМАТА и АНТИФЛУДА ");
	print(" *** Автор MySAN (www.pawno.ru) ");
	print(" *** С использование изначального кода от RMF ");
	if((uwfile = fopen("materstvo.pwn",io_read)))
	{
		while(fread(uwfile,string))
		{
		    for(new i = 0, j = strlen(string); i < j; i++)
				if(string[i] == '\n' || string[i] == '\r')
					string[i] = '\0';
  			PlohieSlova[KolvoSlov] = string;
            KolvoSlov++;
		}
		fclose(uwfile);
		printf(" *** Сейчас скрип загрузил %d  матов... ", KolvoSlov);
	}
	print("\n--------------------------------------------------------------------------");
	return 1;
}

public OnPlayerConnect(playerid)
{
	Igrok[playerid][KolvoSpama] = 0;
	Igrok[playerid][BpemyaSpama] = 0;
	Igrok[playerid][KolvoMaToB] = 0;
	Igrok[playerid][KolvoPeKlaM] = 0;
	return 1;
}

stock TimeStamp()
{
	new time = GetTickCount() / 1000;
	return time;
}

public OnPlayerText(playerid,text[])
{
	if(!IsPlayerConnected(playerid))
		return 0;
	new ver_string[256];
	strmid(ver_string, text, 0, strlen(text));
	if(FIP(playerid,ver_string))
	{
		new playerName[24];
		GetPlayerName(playerid,playerName,24);
		SendPlayerMessageToPlayer(playerid,playerid,text);
		Igrok[playerid][KolvoPeKlaM]++;
		if(Igrok[playerid][KolvoPeKlaM] > PAWNO_RU_PEKLAMA)
			Kick(playerid);
  		return 0;
	}

	if(Igrok[playerid][KolvoSpama] == 0)
		Igrok[playerid][BpemyaSpama] = TimeStamp();

    Igrok[playerid][KolvoSpama]++;
	if(TimeStamp() - Igrok[playerid][BpemyaSpama] > PAWNO_RU_LIMIT)
	{ 
		Igrok[playerid][KolvoSpama] = 0;
		Igrok[playerid][BpemyaSpama] = TimeStamp();
	}
	else
		if(Igrok[playerid][KolvoSpama] > PAWNO_RU_SPAM)
		{
			new playername[128];
 			GetPlayerName(playerid, playername, sizeof(playername));
			new string[64]; format(string,sizeof(string),"%s кикнут Energy's Anticheat,причина: Флуд", playername);
			SendClientMessageToAll(COLOR_LIGHTRED,string);
			print(string);
			Kick(playerid);
		}
		else
			if(Igrok[playerid][KolvoSpama] == PAWNO_RU_SPAM)
			{
				if(Predupreshdenie)
					SendClientMessage(playerid,r_pawno_ru,"Пожалуйста не флуди, а то тебя кикнет!");
			}
	new actualKolvoMaToB=Igrok[playerid][KolvoMaToB];
	new playerSwear_pawno_ru=false;
    new origString[512];
    new k;
    for(k=0; k<strlen(text); k++)
		origString[k]=text[k];
	origString[k]=0;
 	for(new s = 0; s < KolvoSlov; s++)
    {
		new pos=-1;
		while((pos = FISWO(text,PlohieSlova[s],pos+1)) != -1)
		{
		    new goAhead=false;
		    if(pos==0) 
		    {
		        if(strlen(text)==strlen(PlohieSlova[s])) 
		            goAhead=true;
				else 
				{
				    if(ISPR(text[strlen(PlohieSlova[s])]))
						goAhead=true;
				}
		    }
		    else
		    {
		        if(pos==strlen(text)-strlen(PlohieSlova[s])) 
		        {
		            if(ISPR(text[pos-1]))
						goAhead=true;
		        }
		        else 
		        {
		            if( ISPR(text[pos-1]) && ISPR(text[pos+strlen(PlohieSlova[s])]) )
		                goAhead=true;
		        }
		    }
			if(goAhead)
			{
			    playerSwear_pawno_ru=true;
				for(new i = pos, j = pos + strlen(PlohieSlova[s]); i < j; i++) text[i] = ' ';
				Igrok[playerid][KolvoMaToB]++;
			}
		}
	}
	if(Igrok[playerid][KolvoMaToB] > PAWNO_RU_MAT)
	{
		new playername[128];
		GetPlayerName(playerid, playername, sizeof(playername));
		new string[256];
		format(string,sizeof(string),"%s кикнут Energy's Anticheat,причина: мат", playername);
		SendClientMessageToAll(COLOR_LIGHTRED,string);
		print(string);
	    Kick(playerid);
		return 0;
	}
	if(actualKolvoMaToB<Igrok[playerid][KolvoMaToB])
	{
			new string[256];
			new warningsLeft = PAWNO_RU_MAT-Igrok[playerid][KolvoMaToB];
			if(Predupreshdenie)
			{
				format(string,sizeof(string),"Пожалуйста не матерись, а то тебя кикнет! (У вас %d предупреждений)",warningsLeft);
				SendClientMessage(playerid,r_pawno_ru,string);
			}
	}
	if(playerSwear_pawno_ru)
	{
		for(k=0;k<MAX_PLAYERS;k++)
		    if(IsPlayerConnected(k))
		        if(k==playerid)
		        		SendPlayerMessageToPlayer(k,playerid,origString);
				else
		        		SendPlayerMessageToPlayer(k,playerid,text);
		return 0;
	}
	else
		return 1;
}



public ISPR(testCharacter)
{
	new retval=false;
	new i;
	for(i=32;i<48;i++)
	    if(i==testCharacter)
	        retval=true;
	for(i=58;i<65;i++)
	    if(i==testCharacter)
	        retval=true;
	for(i=91;i<97;i++)
	    if(i==testCharacter)
	        retval=true;
	for(i=123;i<127;i++)
	    if(i==testCharacter)
	        retval=true;
 	return retval;
}

public FISWO(buffer[],pattern[],offset)
{
	new retval=-1;
	if(strlen(buffer)<(strlen(pattern)+offset) || strlen(pattern)==0)
		return -1;
	for(new i=offset; i<(strlen(buffer)-strlen(pattern)+1);i++)
	{
	    if( buffer[i]==pattern[0] || buffer[i]==pattern[0]-32 )
	    {
			new foundPattern=true;
			for(new j=0; j<strlen(pattern); j++)
			{
			    if(buffer[i+j]!=pattern[j]&& buffer[i+j]!= pattern[j]-32)
			        foundPattern=false;
			}
			if(foundPattern)
			{
			    retval=i;
			    i=strlen(buffer);
			}
	    }
   	}
	return retval;
}
public FIP(playerid,const string[])
{
	new stringNumeric=false;
	new stringBegin;
	new ipDigits=0;
	for(new i=0; i<strlen(string); i++)
	{
	    if(string[i]<='9' && string[i]>='0')
	    {
	        if(!stringNumeric)
	        {
	            stringNumeric=true;
	            stringBegin=i;
		 	    if(i==strlen(string)-1) 
		 	    {
			        ipDigits++;
			        if(ipDigits>3) 
			            return 1;
		 	    }
	        }
	        else
		 	{
		 	    if(i==strlen(string)-1) 
		 	    {
	           		new stringn[256];
    	       		new number;
					for(new j=stringBegin; j<i+1; j++)
					    stringn[j-stringBegin]=string[j];
			        stringn[i-stringBegin+1]=0;
			        number=strval(stringn);
				    if(number>=0 && number<256) 
				    {
				        ipDigits++;
				        if(ipDigits>3) 
				            return 1;
				    }
		 	    }
		 	}
	    }
	    else
	    {
	        if(stringNumeric) 
	        {
	            stringNumeric=false;
           		new stringn[256];
           		new number;
				for(new j=stringBegin; j<i; j++)
				    stringn[j-stringBegin]=string[j];
		        stringn[i-stringBegin]=0;
		        number=strval(stringn);
			    if(number>=0 && number<256) 
			    {
			        ipDigits++;
			        if(ipDigits>3) 
			            return 1;
			    }
			    else 
			        ipDigits=0;
	        }
	    }
	}
	return 0;
}
