#include <amxmodx>
#include <amxmisc>

#define PLUGIN			"Antyreklama"
#define VERSION			"1.0"
#define AUTHOR			"Play"

#define TID_NAMEPUNISH	1000
#define TID_SAYMENU		2000
#define TID_NAMEMENU	3000

#define MAX_SPAM_MSGS	10

new BLOCKED_MESSAGES[ 128 ][ 192 ],
	BLOCKED_NAMES[ 128 ][ 32 ],
	BLOCKED_KEYS[ 128 ][ 12 ]

new bool:g_saykey_used[ 33 ], bool:g_namekey_used[ 33 ]
	
new g_spam_messages[ 33 ][ MAX_SPAM_MSGS + 1 ][ 192 ], 
	g_spam_count[ 33 ], 
	g_namemenu_displayed[ 33 ], 
	g_cheatkey_warns[ 33 ]

new pcv_immunity_flag, 
    pcv_immunity_steam,
    pcv_sayguard_mode, 
    pcv_sayguard_repeat, 
    pcv_sayguard_repeat_len,
    pcv_nameguard_mode, 
    pcv_keyguard_enable, 
    pcv_keyguard_warns,
    pcv_keyguard_bantime,
    pcv_keyguard_punish

new g_configs_dir[ 64 ], g_maxplayers, g_bindkeys_line

new cvar, zezwolone[32]	

public plugin_init()
{	
	register_plugin( PLUGIN, VERSION, AUTHOR )
	
	register_event( "ResetHUD", "event_resethud", "b" )
	
	register_clcmd( "KSGkey", "cheatkey_punish" )
	
	register_clcmd( "say", "hook_say" )
	register_clcmd( "say_team", "hook_say" )
	
	pcv_immunity_flag			= register_cvar( "ksg_immunity_flag", "a" )
	pcv_immunity_steam			= register_cvar( "ksg_immunity_steam", "1" )
	pcv_sayguard_mode			= register_cvar( "ksg_sayguard_mode", "2" )
	pcv_sayguard_repeat			= register_cvar( "ksg_sayguard_repeat", "1" )
	pcv_sayguard_repeat_len			= register_cvar( "ksg_sayguard_repeat_len", "13" )
	pcv_nameguard_mode			= register_cvar( "ksg_nameguard_mode", "2" )
	pcv_keyguard_enable			= register_cvar( "ksg_keyguard_enable", "1" )
	pcv_keyguard_warns			= register_cvar( "ksg_keyguard_warns", "3" )
	pcv_keyguard_bantime			= register_cvar( "ksg_keyguard_bantime", "240" )
	pcv_keyguard_punish			= register_cvar( "ksg_keyguard_punish", "kick %userid% %reason%" )
	cvar 					= register_cvar( "ksg_dozwolona_reklama","Gracz | CSGramy.eu" )
	
	register_cvar( "ksg_version", VERSION, FCVAR_SPONLY | FCVAR_SERVER )
	set_cvar_string( "ksg_version", VERSION )

	register_menu( "show_sayguard_menu", -1, "handler_sayguard_menu" )
	
	g_maxplayers = get_maxplayers()

	set_task( 5.0, "task_bind_keys", _, _, _, "b" )
	set_task( 1.0, "task_plugin_init" )
}

public plugin_cfg()
{
	get_configsdir( g_configs_dir, 64 )
	server_cmd( "exec %s/Reklama/config.cfg", g_configs_dir )
}

public task_plugin_init()
{
	new temp[ 64 ]; format( temp, 63, "%s/Reklama/Wiadomosci.ini", g_configs_dir )
	
	if( file_exists( temp ) )
	{
		new line, textsize, text[ 128 ], i
		while( read_file( temp, line, text, 255, textsize ) )
		{
			BLOCKED_MESSAGES[ i ++ ] = text
			line ++
		}
	}
	
	format( temp, 63, "%s/Reklama/Nazwy.ini", g_configs_dir )
	if( file_exists( temp ) )
	{
		new line, textsize, text[ 32 ], i
		while( read_file( temp, line, text, 255, textsize ) )
		{
			BLOCKED_NAMES[ i ++ ] = text
			line ++
		}
	}
	
	format( temp, 63, "%s/Reklama/Keys.ini", g_configs_dir )
	if( file_exists( temp ) )
	{
		new textsize, text[ 12 ], i
		while( read_file( temp, g_bindkeys_line, text, 255, textsize ) )
		{
			BLOCKED_KEYS[ i ++ ] = text
			g_bindkeys_line ++
		}
	}
}

public task_bind_keys()
{
	for( new id = 1; id <= g_maxplayers; id ++ )
	{
		if( is_user_connected( id ) )
		{
			if( !is_user_steam( id )  )
			{
				if( !get_client_status( id ) )
					bind_keys( id )
			}
		}
	}
}

public bind_keys( id )
{
	for( new i; i < g_bindkeys_line; i ++ )
	{
		if( !equali( BLOCKED_KEYS[ i ], " " ) )
			client_cmd( id, "bind ^"%s^" ^"%s^"", BLOCKED_KEYS[ i ], BLOCKED_KEYS[ i ] )
	}
}

public client_connect( id )
{
	g_namekey_used[ id ] 		= false
	g_saykey_used[ id ] 		= false
	g_namemenu_displayed[ id ] 	= 0
	g_spam_count[ id ] 		= 0
	g_cheatkey_warns[ id ] 		= 0
}


public event_resethud( id )
{
	if( get_pcvar_num( pcv_nameguard_mode ) )
	{
		if( is_user_alive( id ) )
		{
			if( !get_client_status( id ) )
				set_task( 0.1, "name_punish", id + TID_NAMEPUNISH )
		}
	}
}
public name_punish( id )
{
	id -= TID_NAMEPUNISH
	new nameguard_mode = get_pcvar_num( pcv_nameguard_mode )
	
	new name[ 32 ]; get_user_name( id, name, 31 )
	get_pcvar_string(cvar,zezwolone,31)
	if(containi(name,zezwolone) != -1)
	{
		return PLUGIN_HANDLED
	}
	if( nameguard_mode )
	{
		
		new userid = get_user_userid( id )

		for( new i = 0; i < sizeof( BLOCKED_NAMES ); i ++ )
		{
			if( containi( name, BLOCKED_NAMES[ i ] ) != -1 )
			{

				server_cmd( "kick #%d ^"[AntyReklama] Twoj nick zawiera reklame !^"", userid )
						
			}
		}
	}
	return PLUGIN_CONTINUE
}
public hook_say( id )
{
	new sayguard_mode = get_pcvar_num( pcv_sayguard_mode )
	new sayguard_repeat = get_pcvar_num( pcv_sayguard_repeat )
	
	if( sayguard_mode || sayguard_repeat )
	{
		if( !get_client_status( id ) )
		{
			new said[ 192 ]
			read_args( said, 191 )
			remove_quotes( said )

			if( sayguard_mode )
			{
				for( new i; i < sizeof( BLOCKED_MESSAGES ); i ++ )
				{
					if( containi( said, BLOCKED_MESSAGES[ i ] ) != -1 )
					{

						set_task( 0.1, "say_punish_menu", id + TID_SAYMENU, said, 192 )
						return PLUGIN_HANDLED
					}
				}
			}

			if( sayguard_repeat )
			{
				if( strlen( said ) > get_pcvar_num( pcv_sayguard_repeat_len ) )
				{
					for( new i; i <= MAX_SPAM_MSGS; i ++ )
					{
						if( equal( g_spam_messages[ id ][ i ], said ) )
						{
							new file[ 256 ], log[ 128 ], name[ 32 ], authid[ 35 ], ip[ 23 ]
							get_user_name( id, name, 31 ); get_user_authid( id, authid, 34 ); get_user_ip( id, ip, 22, 1 )
							format( log, 127, "%s: %s (AuthID:[%s], IP:[%s])", name, said , authid, ip )
							format( file, 255, "%s/Reklama/PowtarzaneWiadomosci.txt", g_configs_dir )
							log_to_file( file, log )
							
							return PLUGIN_HANDLED
						}
					}
					
					if( g_spam_count[ id ] == MAX_SPAM_MSGS )
						g_spam_count[ id ] = 0
					
					g_spam_count[ id ] ++
					
					g_spam_messages[ id ][ g_spam_count[ id ] ] = said
				}
			}
		}
	}
	
	return PLUGIN_CONTINUE
}


public say_punish_menu( said[], id )
{
	id -= TID_SAYMENU
	
	new menu[ 512 ], len, keys = MENU_KEY_1 + MENU_KEY_2
	
	len = formatex( menu, charsmax( menu ), "\dAntyReklama by\r %s^n", AUTHOR )
	len += formatex( menu[ len ], charsmax( menu ) - len, "^n\y Reklamowanie na tym serwerze jest zabronione !" )
	len += formatex( menu[ len ], charsmax( menu ) - len, "^n\w^"%s^"", said )
	len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n\y Zresetowac ustawienia do wartosci domyslnych?" )

	len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n\r1.\w Tak" )
	len += formatex( menu[ len ], charsmax( menu ) - len, "^n\r2.\w Nie \r(Kick)" )

	show_menu( id, keys, menu, _, "show_sayguard_menu" )
}
public handler_sayguard_menu( id, key )
{
	key ++

	switch( key )
	{
		case 1: restore_config( id )
		case 2: client_cmd( id, "disconnect" )
	}
}
public cheatkey_punish( id )
{
	new keyguard = get_pcvar_num( pcv_keyguard_enable )
	
	if( keyguard )
	{
		if( !get_client_status( id ) )
		{
			new key[ 8 ]; 			read_args( key, 7 )
			new name[ 32 ]; 		get_user_name( id, name, 31 )
			new ip[ 16 ]; 			get_user_ip( id, ip, 15, 1 )
			new steamid[ 35 ]; 		get_user_authid( id, steamid, 34 )
			new punish[ 256 ];		get_pcvar_string( pcv_keyguard_punish, punish, 255 )
			new bantime[ 16 ];		get_pcvar_string( pcv_keyguard_bantime, bantime, 15 )
			new userid = 			get_user_userid( id )

			switch( keyguard )
			{
				case 1:
				{
					for( new i = 1; i <= g_maxplayers; i ++ )
					{
						if( is_user_connected( i ) && is_user_admin( i ) )
							client_printcolor( i, "^1[^4AntyReklama^1] Gracz %s uzyl klawisza: %s", name, key )
					}
				}
				
				case 2:
				{
					for( new i = 1; i <= g_maxplayers; i ++ )
					{
						if( is_user_connected( i ) && is_user_admin( i ) )
							client_printcolor( i, "^1[^4AntyReklama^1] Gracz %s uzyl klawisza: %s", name, key )
					}
					
					g_cheatkey_warns[ id ] ++
					
					if( g_cheatkey_warns[ id ] > get_pcvar_num( pcv_keyguard_warns ) )
					{
						new name_temp[ 36 ], reason_temp[ 128 ], userid_temp[ 37 ]
						
						format( name_temp, charsmax( name_temp ), "^"%s^"", name )
						replace_all( punish, charsmax( punish ), "%username%", name )
						
						format( reason_temp, charsmax( reason_temp ), "^"[AntyReklama] Uzywany Klucz!^"")
						replace_all( punish, charsmax( punish ), "%reason%", reason_temp )
						
						format( userid_temp, charsmax( userid_temp ), "#%d", userid )
						replace_all( punish, charsmax( punish ), "%userid%", userid_temp )
						
						replace_all( punish, charsmax( punish ), "%userip%", ip )
						replace_all( punish, charsmax( punish ), "%steamid%", steamid )
						replace_all( punish, charsmax( punish ), "%bantime%", bantime )
						
						server_cmd( punish )
						
						return PLUGIN_HANDLED
					}
					
					client_printcolor( id, "^1[^4AntyReklama^1] Nie uzywaj uzywanych kluczy ! Bo zostaniesz Ukarany!" )
				}
			}
		}
	}
	
	return PLUGIN_HANDLED
}

public restore_config( id )
{
	client_cmd( id, "unbindall" )
	client_cmd( id, "bind ^"TAB^" ^"+showscores^"" )
	client_cmd( id, "bind ^"ENTER^" ^"+attack^"" )
	client_cmd( id, "bind ^"ESCAPE^" ^"escape^"" )
	client_cmd( id, "bind ^"SPACE^" ^"+jump^"" )
	client_cmd( id, "bind ^"'^" ^"+moveup^"" )
	client_cmd( id, "bind ^"+^" ^"sizeup^"" )
	client_cmd( id, "bind ^",^" ^"buyammo1^"" )
	client_cmd( id, "bind ^"-^" ^"sizedown^"" )
	client_cmd( id, "bind ^".^" ^"buyammo2^"" )
	client_cmd( id, "bind ^"/^" ^"+movedown^"" )
	client_cmd( id, "bind ^"0^" ^"slot10^"" )
	client_cmd( id, "bind ^"1^" ^"slot1^"" )
	client_cmd( id, "bind ^"2^" ^"slot2^"" )
	client_cmd( id, "bind ^"3^" ^"slot3^"" )
	client_cmd( id, "bind ^"4^" ^"slot4^"" )
	client_cmd( id, "bind ^"5^" ^"slot5^"" )
	client_cmd( id, "bind ^"6^" ^"slot6^"" )
	client_cmd( id, "bind ^"7^" ^"slot7^"" )
	client_cmd( id, "bind ^"8^" ^"slot8^"" )
	client_cmd( id, "bind ^"9^" ^"slot9^"" )
	client_cmd( id, "bind ^";^" ^"+mlook^"" )
	client_cmd( id, "bind ^"=^" ^"sizeup^"" )
	client_cmd( id, "bind ^"a^" ^"+moveleft^"" )
	client_cmd( id, "bind ^"b^" ^"buy^"" )
	client_cmd( id, "bind ^"c^" ^"radio3^"" )
	client_cmd( id, "bind ^"d^" ^"+moveright^"" )
	client_cmd( id, "bind ^"e^" ^"+use^"" )
	client_cmd( id, "bind ^"f^" ^"impulse 100^"" )
	client_cmd( id, "bind ^"g^" ^"drop^"" )
	client_cmd( id, "bind ^"h^" ^"+commandmenu^"" )
	client_cmd( id, "bind ^"i^" ^"showbriefing^"" )
	client_cmd( id, "bind ^"j^" ^"cheer^"" )
	client_cmd( id, "bind ^"k^" ^"+voicerecord^"" )
	client_cmd( id, "bind ^"m^" ^"chooseteam^"" )
	client_cmd( id, "bind ^"n^" ^"nightvision^"" )
	client_cmd( id, "bind ^"o^" ^"buyequip^"" )
	client_cmd( id, "bind ^"q^" ^"lastinv^"" )
	client_cmd( id, "bind ^"r^" ^"+reload^"" )
	client_cmd( id, "bind ^"s^" ^"+back^"" )
	client_cmd( id, "bind ^"t^" ^"impulse 201^"" )
	client_cmd( id, "bind ^"u^" ^"messagemode2^"" )
	client_cmd( id, "bind ^"w^" ^"+forward^"" )
	client_cmd( id, "bind ^"x^" ^"radio2^"" )
	client_cmd( id, "bind ^"y^" ^"messagemode^"" )
	client_cmd( id, "bind ^"z^" ^"radio1^"" )
	client_cmd( id, "bind ^"[^" ^"invprev^"" )
	client_cmd( id, "bind ^"]^" ^"invnext^"" )
	client_cmd( id, "bind ^"`^" ^"toggleconsole^"" )
	client_cmd( id, "bind ^"~^" ^"toggleconsole^"" )
	client_cmd( id, "bind ^"UPARROW^" ^"+forward^"" )
	client_cmd( id, "bind ^"DOWNARROW^" ^"+back^"" )
	client_cmd( id, "bind ^"LEFTARROW^" ^"+left^"" )
	client_cmd( id, "bind ^"RIGHTARROW^" ^"+right^"" )
	client_cmd( id, "bind ^"ALT^" ^"+strafe^"" )
	client_cmd( id, "bind ^"CTRL^" ^"+duck^"" )
	client_cmd( id, "bind ^"SHIFT^" ^"+speed^"" )
	client_cmd( id, "bind ^"F1^" ^"autobuy^"" )
	client_cmd( id, "bind ^"F2^" ^"rebuy^"" )
	client_cmd( id, "bind ^"F5^" ^"snapshot^"" )
	client_cmd( id, "bind ^"F6^" ^"save quick^"" )
	client_cmd( id, "bind ^"F7^" ^"load quick^"" )
	client_cmd( id, "bind ^"F10^" ^"quit prompt^"" )
	client_cmd( id, "bind ^"INS^" ^"+klook^"" )
	client_cmd( id, "bind ^"PGDN^" ^"+lookdown^"" )
	client_cmd( id, "bind ^"PGUP^" ^"+lookup^"" )
	client_cmd( id, "bind ^"END^" ^"centerview^"" )
	client_cmd( id, "bind ^"MWHEELDOWN^" ^"invnext^"" )
	client_cmd( id, "bind ^"MWHEELUP^" ^"invprev^"" )
	client_cmd( id, "bind ^"MOUSE1^" ^"+attack^"" )
	client_cmd( id, "bind ^"MOUSE2^" ^"+attack2^"" )
	client_cmd( id, "bind ^"PAUSE^" ^"pause^"" )
	
	bind_keys( id )
}


stock get_client_status( id )
{
	if( is_user_bot( id ) ) return 1
	else if( is_user_hltv( id ) ) return 2
	
	new flags[ 23 ]; get_pcvar_string( pcv_immunity_flag, flags, charsmax( flags ) )
	
	if( get_user_flags( id ) & read_flags( flags ) ) return 3
	
	return 0
}

stock bool:is_user_steam( id ) // ty, Sh0oter
{
	if( get_pcvar_num( pcv_immunity_steam ) )
	{
		static dp_pointer
		if( dp_pointer || ( dp_pointer = get_cvar_pointer( "dp_r_id_provider" ) ) )
		{
			server_cmd( "dp_clientinfo %d", id )
			server_exec()
			return ( get_pcvar_num( dp_pointer ) == 2 ) ? true : false
		}
		
		return false
	}
	
	return true
}

stock client_printcolor( const id, const input[], any:... )
{
	new count = 1, players[ 32 ]
	static msg[ 191 ]
	vformat( msg, 190, input, 3 )
    
	replace_all( msg, 190, "!g", "^4" ) // Green Color
	replace_all( msg, 190, "!n", "^1" ) // Default Color
	replace_all( msg, 190, "!t", "^3" ) // Team Color
    
	if( id ) players[ 0 ] = id; else get_players( players, count, "ch" )
	{
		for( new i = 0; i < count; i ++ )
		{
			if( is_user_connected( players[ i ] ) )
			{
				message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, players[ i ] )
				write_byte( players[ i ] )
				write_string( msg )
				message_end()
			}
		}
	}
}
