Иконка ресурса

REGEX Word Filter 1.2

kv.acid

Участник
Сообщения
2,025
Реакции
755
AlmazON Оффтоп
 

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
AlmazON, помню, было дело с таким фильтром. Дня два искал маты ваши :D
Только вот админам с тех пор как-то больше доверяю, ибо слово "бл*" входило в состав "граблями" и в конце концов игрок, произнеся слово, матом не являющееся, получал наказание.
 

CTe6eJIeK_vRn

Участник
Сообщения
2,114
Реакции
1,867
Кстати, забыл о "главном": исходник при компиляции выдаёт 1 предупреждение, всё же выдавая итоговый файл-плагин. Кто допилит?

Попробуй:
PHP:
#include <sourcemod>
#include <adt_trie>
#include <regex>

public Plugin:myinfo = 
{
	name = "REGEX word filter",
	author = "Twilight Suzuka",
	description = "Filter words via Regular Expressions",
	version = "1.2",
	url = "http://www.sourcemod.net/"
};

new Handle:CvarEnable = INVALID_HANDLE;

new Handle:REGEXSections = INVALID_HANDLE;

new Handle:ChatREGEXList = INVALID_HANDLE;
new Handle:CmdREGEXList = INVALID_HANDLE;
new Handle:NameREGEXList = INVALID_HANDLE;

new Handle:ClientLimits[33];

public OnPluginStart()
{
	CvarEnable = CreateConVar("regexfilter_enable","1","REGEXFILTER Enabled",FCVAR_PLUGIN|FCVAR_REPLICATED|FCVAR_NOTIFY);
	
	REGEXSections = CreateArray();
	
	ChatREGEXList = CreateArray(2);
	CmdREGEXList = CreateArray(2);
	NameREGEXList = CreateArray(2);
	
	decl String:mapname[64];
	GetCurrentMap(mapname, sizeof(mapname));
	Format(mapname,sizeof(mapname),"configs/regexrestrict_%s.cfg",mapname);
	
	LoadExpressions("configs/regexrestrict.cfg");
	LoadExpressions(mapname);
	
	RegConsoleCmd("say", Command_SayHandle);
	RegConsoleCmd("say_team", Command_SayHandle);
}

public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
	decl String:regexfile[128];
	
	BuildPath(Path_SM, regexfile ,sizeof(regexfile),"configs/regexrestrict.cfg");
	new bool:load = FileExists(regexfile);

	decl String:mapname[64];
	GetCurrentMap(mapname, sizeof(mapname));
	BuildPath(Path_SM, regexfile ,sizeof(regexfile),"configs/regexrestrict_%s.cfg",mapname);
	
	new bool:load2 = FileExists(regexfile);

	if( (load == false) && (load2 == false) ) 
	{
		LogMessage("REGEXFilter has no file to filter based on. Powering down...");	
		return APLRes_Failure;
	}
	return APLRes_Success;
}

public OnMapStart() ClientLimits[0] = CreateTrie();
public OnMapEnd() CloseHandle(ClientLimits[0]);

public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
{
	ClientLimits[client] = CreateTrie();
	return true;
}

public OnClientDisconnect(client)
{
	CloseHandle(ClientLimits[client]);
}

public Action:Command_SayHandle(client, args)
{
	if(!GetConVarInt(CvarEnable)) return Plugin_Continue;
	
	decl String:text[192];
	if (IsChatTrigger() || GetCmdArgString(text, sizeof(text)) < 1)
	{
		return Plugin_Continue;
	}
	
	new begin, end = GetArraySize(ChatREGEXList), RegexError:ret = REGEX_ERROR_NONE, bool:changed = false;
	decl arr[2], Handle:CurrRegex, Handle:CurrInfo, any:val
	decl String:strval[192];
	
	while(begin != end)
	{
		GetArrayArray(ChatREGEXList,begin,arr,2)
		CurrRegex = Handle:arr[0];
		CurrInfo = Handle:arr[1];
		
		val = MatchRegex(CurrRegex, text, ret);
		if( (val > 0) && (ret == REGEX_ERROR_NONE) )
		{
			if(GetTrieValue(CurrInfo, "immunity", val))
			{
				if(CheckCommandAccess(client,"", val, true) ) return Plugin_Continue;
			}
			
			if(GetTrieString(CurrInfo, "warn", strval, sizeof(strval) ))
			{
				if(!client) PrintToServer("[RegexFilter] %s",strval);
				else PrintToChat(client, "[RegexFilter] %s",strval);
			}
			
			if(GetTrieString(CurrInfo, "action", strval, sizeof(strval) ))
			{
				ParseAndExecute(client, strval, sizeof(strval));
			}

			if(GetTrieValue(CurrInfo, "limit", val))
			{
				new any:at;
				FormatEx(strval, sizeof(strval), "%i", CurrRegex);
				GetTrieValue(ClientLimits[client], strval, at);
					
				at++;
				
				new mod;
				if(GetTrieValue(CurrInfo, "forgive", mod))
				{
					new Float:datiem;
					FormatEx(strval, sizeof(strval), "%i-limit", CurrRegex);
					if(!GetTrieValue(ClientLimits[client], strval, any:datiem))
					{
						datiem = GetGameTime();
						SetTrieValue(ClientLimits[client], strval, any:datiem)
					}	

					datiem = GetGameTime() - datiem;
					new datiemint = RoundToCeil(datiem);
					
					at = at - (datiemint % mod);
				}
				
				SetTrieValue(ClientLimits[client], strval, at);
				
				if(at > val)
				{
					if(GetTrieString(CurrInfo, "punish", strval, sizeof(strval) ))
					{
						ParseAndExecute(client,strval, sizeof(strval) );
					}
					return Plugin_Handled;
				}
			}
						
			if(GetTrieValue(CurrInfo, "block", val))
			{
				return Plugin_Handled;
			}
			
			if(GetTrieValue(CurrInfo, "replace", val))
			{
				changed = true;
				new rand = GetRandomInt(0, GetArraySize(Handle:val) - 1);
				
				new Handle:dp = GetArrayCell(Handle:val,rand);
				ResetPack(dp);
				new Handle:cregex = Handle:ReadPackCell(dp);
				ReadPackString(dp,strval, sizeof(strval) );
				
				if(cregex == INVALID_HANDLE) cregex = CurrRegex;
				
				rand = MatchRegex(cregex, text, ret);
				if( (rand > 0) && (ret == REGEX_ERROR_NONE))
				{
					decl String:strarray[rand][192];
					for(new a = 0; a < rand; a++)
					{
						GetRegexSubString(cregex, a, strarray[a], sizeof(strval) );
					}
					
					for(new a = 0; a < rand; a++)
					{
						ReplaceString(text, sizeof(text), strarray[a], strval);
					}
					
					begin = 0;
				}
			}
		}
		begin++;
	}
	
	if(changed == true) 
	{
		if(client != 0) 
		{
			FakeClientCommand(client,"say %s", text);
			return Plugin_Continue;
		}
		else
		{
			ServerCommand("say %s", text);
			return Plugin_Handled;
		}
	}
	
	return Plugin_Continue;
}

stock LoadExpressions(String:file[])
{
	decl String:regexfile[128];
	BuildPath(Path_SM, regexfile ,sizeof(regexfile), file);
	
	if(!FileExists(regexfile)) 
	{
		LogMessage("%s not parsed...file doesnt exist!", file);
		return 0;
	}
	
	new Handle:Parser = SMC_CreateParser();
	SMC_SetReaders(Parser, HandleNewSection, HandleKeyValue, HandleEndSection);
	SMC_SetParseEnd(Parser, HandleEnd);
	SMC_ParseFile(Parser, regexfile);
	CloseHandle(Parser);
	
	return 1;
}
	

public HandleEnd(Handle:smc, bool:halted, bool:failed)
{
	if (halted)
		LogError("REGEXFilter file partially parsed, please check for errors. Continuing...");
	if (failed)
		LogError("REGEXFilter file failed to parse!");
}

new Handle:CurrentSection = INVALID_HANDLE;
	
public SMCResult:HandleNewSection(Handle:smc, const String:name[], bool:opt_quotes)
{
	CurrentSection = CreateTrie();
	SetTrieString(CurrentSection, "name", name);
	PushArrayCell(REGEXSections,CurrentSection);
}

public SMCResult:HandleKeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
{
	if(!strcmp(key, "chatpattern", false)) 
	{
		RegisterExpression(value, CurrentSection, ChatREGEXList);
	}
	else if(!strcmp(key, "cmdpattern", false) || !strcmp(key, "commandkeyword", false))
	{
		RegisterExpression(value, CurrentSection, CmdREGEXList);
	}
	else if(!strcmp(key, "namepattern", false))
	{
		RegisterExpression(value, CurrentSection, NameREGEXList);
	}
	else if(!strcmp(key, "replace", false))
	{
		new any:val;
		if(!GetTrieValue(CurrentSection, "replace", val))
		{
			val = CreateArray();
			SetTrieValue(CurrentSection,"replace",val);
		}
		AddReplacement(value,val);
	}
	else if(!strcmp(key, "replacepattern", false))
	{
		new any:val;
		if(!GetTrieValue(CurrentSection, "replace", val))
		{
			val = CreateArray();
			SetTrieValue(CurrentSection,"replace",val);
		}
		AddPatternReplacement(value,val);
	}
	else if(!strcmp(key, "block", false))
	{
		SetTrieValue(CurrentSection,"block",1);
	}
	else if(!strcmp(key, "action", false))
	{
		SetTrieString(CurrentSection,"action",value);
	}
	else if(!strcmp(key, "warn", false))
	{
		SetTrieString(CurrentSection,"warn",value);
	}
	else if(!strcmp(key, "limit", false))
	{
		SetTrieValue(CurrentSection,"limit",StringToInt(value));
	}
	else if(!strcmp(key, "forgive", false))
	{
		SetTrieValue(CurrentSection,"forgive",StringToInt(value));
	}
	else if(!strcmp(key, "punish", false))
	{
		SetTrieString(CurrentSection,"punish",value);
	}
	else if(!strcmp(key, "immunity", false))
	{
		SetTrieValue(CurrentSection,"immunity",ReadFlagString(value));
	}
}

public SMCResult:HandleEndSection (Handle:smc)
{
	CurrentSection = INVALID_HANDLE;
}

stock RegisterExpression(const String:key[], Handle:curr, Handle:array)
{
	decl String:expression[192];
	new flags = ParseExpression(key, expression, sizeof(expression) );
	if(flags == -1) return;
	
	decl String:errno[128], RegexError:errcode;
	new Handle:compiled = CompileRegex(expression, flags, errno, sizeof(errno), errcode);
	
	if(compiled == INVALID_HANDLE)
	{
		LogMessage("Error occured while compiling expression %s with flags %s, error: %s, errcode: %d", 
			expression, flags, errno, errcode);
	}
	else 
	{
		decl arr[2];
		arr[0] = _:compiled;
		arr[1] = _:curr;
		PushArrayArray(array, arr, 2);
	}
}

stock ParseExpression(const String:key[], String:expression[], len)
{
	strcopy(expression, len, key);
	TrimString(expression);
	
	new flags, a, b, c
	if(expression[strlen(expression) - 1] == '\'')
	{
		for(; expression[flags] != '\0'; flags++)
		{
			if(expression[flags] == '\'')
			{
				a++;
				b = c;
				c = flags;
			}
		}
		
		if(a < 2) 
		{
			LogError("REGEXFilter file line malformed: %s, please check for errors. Continuing...",key);
			return -1;
		}
		else
		{
			expression[b] = '\0'
			expression[c] = '\0';
			flags = FindREGEXFlags(expression[b + 1]);
			
			TrimString(expression);
			
			if(a > 2 && expression[0] == '\'')
			{
				strcopy(expression, strlen(expression) - 1, expression[1]);
			}
		}
	}
	
	return flags;
}

stock FindREGEXFlags(const String:flags[])
{
	decl String:buffer[7][16];
	buffer[0][0] = '\0';
	buffer[1][0] = '\0';
	buffer[2][0] = '\0';
	buffer[3][0] = '\0';
	buffer[4][0] = '\0';
	buffer[5][0] = '\0';
	buffer[6][0] = '\0';

	ExplodeString(flags, "|", buffer, 7, 16 );

	new intflags = 0;
	for(new i = 0; i < 7; i++)
	{
		if(buffer[i][0] == '\0') continue;
		
		if(!strcmp(buffer[i],"CASELESS",false) ) intflags |= PCRE_CASELESS;
		else if(!strcmp(buffer[i],"MULTILINE",false) ) intflags |= PCRE_MULTILINE;
		else if(!strcmp(buffer[i],"DOTALL",false) ) intflags |= PCRE_DOTALL;
		else if(!strcmp(buffer[i],"EXTENDED",false) ) intflags |= PCRE_EXTENDED;
		else if(!strcmp(buffer[i],"UNGREEDY",false) ) intflags |= PCRE_UNGREEDY;
		else if(!strcmp(buffer[i],"UTF8",false) ) intflags |= PCRE_UTF8 ;
		else if(!strcmp(buffer[i],"NO_UTF8_CHECK",false) ) intflags |= PCRE_NO_UTF8_CHECK;
	}
	
	return intflags;
}

stock AddReplacement(const String:val[], Handle:array)
{
	new Handle:dp = CreateDataPack();
	WritePackCell(dp, _:INVALID_HANDLE);
	WritePackString(dp, val);
	
	PushArrayCell(array,dp);
}

stock AddPatternReplacement(const String:val[], Handle:array)
{
	decl String:expression[192];
	new flags = ParseExpression(val, expression, sizeof(expression) );
	if(flags == -1) return;
	
	decl String:errno[128], RegexError:errcode;
	new Handle:compiled = CompileRegex(expression, flags, errno, sizeof(errno), errcode);
	
	if(compiled == INVALID_HANDLE)
	{
		LogMessage("Error occured while compiling expression %s with flags %s, error: %s, errcode: %d", 
			expression, flags, errno, errcode);
	}
	else
	{
		new Handle:dp = CreateDataPack();
		WritePackCell(dp,_:compiled);
		WritePackString(dp, "");
	
		PushArrayCell(array,dp);
	}
}

stock ParseAndExecute(client, String:cmd[], len)
{
	decl String:repl[192];
	
	if(client == 0) FormatEx(repl, sizeof(repl), "0");
	else FormatEx(repl, sizeof(repl), "%i", GetClientUserId(client))
	ReplaceString(cmd, len, "%u", repl);
	
	if(client != 0) FormatEx(repl, sizeof(repl), "%i", client)
	ReplaceString(cmd, len, "%i", repl);
	
	GetClientName(client, repl, sizeof(repl));
	ReplaceString(cmd, len, "%n", repl);
	
	ServerCommand(cmd);
}
 

SenatoR

Участник
Сообщения
773
Реакции
344
Попробуй:
PHP:
#include <sourcemod>#include <adt_trie>#include <regex>
public Plugin:myinfo = {	name = "REGEX word filter",	author = "Twilight Suzuka",	description = "Filter words via Regular Expressions",	version = "1.2",	url = "http://www.sourcemod.net/"};
new Handle:CvarEnable = INVALID_HANDLE;
new Handle:REGEXSections = INVALID_HANDLE;
new Handle:ChatREGEXList = INVALID_HANDLE;new Handle:CmdREGEXList = INVALID_HANDLE;new Handle:NameREGEXList = INVALID_HANDLE;
new Handle:ClientLimits[33];
public OnPluginStart(){	CvarEnable = CreateConVar("regexfilter_enable","1","REGEXFILTER Enabled",FCVAR_PLUGIN|FCVAR_REPLICATED|FCVAR_NOTIFY);		REGEXSections = CreateArray();		ChatREGEXList = CreateArray(2);	CmdREGEXList = CreateArray(2);	NameREGEXList = CreateArray(2);		decl String:mapname[64];	GetCurrentMap(mapname, sizeof(mapname));	Format(mapname,sizeof(mapname),"configs/regexrestrict_%s.cfg",mapname);		LoadExpressions("configs/regexrestrict.cfg");	LoadExpressions(mapname);		RegConsoleCmd("say", Command_SayHandle);	RegConsoleCmd("say_team", Command_SayHandle);}
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max){	decl String:regexfile[128];		BuildPath(Path_SM, regexfile ,sizeof(regexfile),"configs/regexrestrict.cfg");	new bool:load = FileExists(regexfile);
	decl String:mapname[64];	GetCurrentMap(mapname, sizeof(mapname));	BuildPath(Path_SM, regexfile ,sizeof(regexfile),"configs/regexrestrict_%s.cfg",mapname);		new bool:load2 = FileExists(regexfile);
	if( (load == false) && (load2 == false) ) 	{		LogMessage("REGEXFilter has no file to filter based on. Powering down...");			return APLRes_Failure;	}	return APLRes_Success;}
public OnMapStart() ClientLimits[0] = CreateTrie();public OnMapEnd() CloseHandle(ClientLimits[0]);
public bool:OnClientConnect(client, String:rejectmsg[], maxlen){	ClientLimits[client] = CreateTrie();	return true;}
public OnClientDisconnect(client){	CloseHandle(ClientLimits[client]);}
public Action:Command_SayHandle(client, args){	if(!GetConVarInt(CvarEnable)) return Plugin_Continue;		decl String:text[192];	if (IsChatTrigger() || GetCmdArgString(text, sizeof(text)) < 1)	{		return Plugin_Continue;	}		new begin, end = GetArraySize(ChatREGEXList), RegexError:ret = REGEX_ERROR_NONE, bool:changed = false;	decl arr[2], Handle:CurrRegex, Handle:CurrInfo, any:val	decl String:strval[192];		while(begin != end)	{		GetArrayArray(ChatREGEXList,begin,arr,2)		CurrRegex = Handle:arr[0];		CurrInfo = Handle:arr[1];				val = MatchRegex(CurrRegex, text, ret);		if( (val > 0) && (ret == REGEX_ERROR_NONE) )		{			if(GetTrieValue(CurrInfo, "immunity", val))			{				if(CheckCommandAccess(client,"", val, true) ) return Plugin_Continue;			}						if(GetTrieString(CurrInfo, "warn", strval, sizeof(strval) ))			{				if(!client) PrintToServer("[RegexFilter] %s",strval);				else PrintToChat(client, "[RegexFilter] %s",strval);			}						if(GetTrieString(CurrInfo, "action", strval, sizeof(strval) ))			{				ParseAndExecute(client, strval, sizeof(strval));			}
			if(GetTrieValue(CurrInfo, "limit", val))			{				new any:at;				FormatEx(strval, sizeof(strval), "%i", CurrRegex);				GetTrieValue(ClientLimits[client], strval, at);									at++;								new mod;				if(GetTrieValue(CurrInfo, "forgive", mod))				{					new Float:datiem;					FormatEx(strval, sizeof(strval), "%i-limit", CurrRegex);					if(!GetTrieValue(ClientLimits[client], strval, any:datiem))					{						datiem = GetGameTime();						SetTrieValue(ClientLimits[client], strval, any:datiem)					}	
					datiem = GetGameTime() - datiem;					new datiemint = RoundToCeil(datiem);										at = at - (datiemint % mod);				}								SetTrieValue(ClientLimits[client], strval, at);								if(at > val)				{					if(GetTrieString(CurrInfo, "punish", strval, sizeof(strval) ))					{						ParseAndExecute(client,strval, sizeof(strval) );					}					return Plugin_Handled;				}			}									if(GetTrieValue(CurrInfo, "block", val))			{				return Plugin_Handled;			}						if(GetTrieValue(CurrInfo, "replace", val))			{				changed = true;				new rand = GetRandomInt(0, GetArraySize(Handle:val) - 1);								new Handle:dp = GetArrayCell(Handle:val,rand);				ResetPack(dp);				new Handle:cregex = Handle:ReadPackCell(dp);				ReadPackString(dp,strval, sizeof(strval) );								if(cregex == INVALID_HANDLE) cregex = CurrRegex;								rand = MatchRegex(cregex, text, ret);				if( (rand > 0) && (ret == REGEX_ERROR_NONE))				{					decl String:strarray[rand][192];					for(new a = 0; a < rand; a++)					{						GetRegexSubString(cregex, a, strarray[a], sizeof(strval) );					}										for(new a = 0; a < rand; a++)					{						ReplaceString(text, sizeof(text), strarray[a], strval);					}										begin = 0;				}			}		}		begin++;	}		if(changed == true) 	{		if(client != 0) 		{			FakeClientCommand(client,"say %s", text);			return Plugin_Continue;		}		else		{			ServerCommand("say %s", text);			return Plugin_Handled;		}	}		return Plugin_Continue;}
stock LoadExpressions(String:file[]){	decl String:regexfile[128];	BuildPath(Path_SM, regexfile ,sizeof(regexfile), file);		if(!FileExists(regexfile)) 	{		LogMessage("%s not parsed...file doesnt exist!", file);		return 0;	}		new Handle:Parser = SMC_CreateParser();	SMC_SetReaders(Parser, HandleNewSection, HandleKeyValue, HandleEndSection);	SMC_SetParseEnd(Parser, HandleEnd);	SMC_ParseFile(Parser, regexfile);	CloseHandle(Parser);		return 1;}	
public HandleEnd(Handle:smc, bool:halted, bool:failed){	if (halted)		LogError("REGEXFilter file partially parsed, please check for errors. Continuing...");	if (failed)		LogError("REGEXFilter file failed to parse!");}
new Handle:CurrentSection = INVALID_HANDLE;	public SMCResult:HandleNewSection(Handle:smc, const String:name[], bool:opt_quotes){	CurrentSection = CreateTrie();	SetTrieString(CurrentSection, "name", name);	PushArrayCell(REGEXSections,CurrentSection);}
public SMCResult:HandleKeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes){	if(!strcmp(key, "chatpattern", false)) 	{		RegisterExpression(value, CurrentSection, ChatREGEXList);	}	else if(!strcmp(key, "cmdpattern", false) || !strcmp(key, "commandkeyword", false))	{		RegisterExpression(value, CurrentSection, CmdREGEXList);	}	else if(!strcmp(key, "namepattern", false))	{		RegisterExpression(value, CurrentSection, NameREGEXList);	}	else if(!strcmp(key, "replace", false))	{		new any:val;		if(!GetTrieValue(CurrentSection, "replace", val))		{			val = CreateArray();			SetTrieValue(CurrentSection,"replace",val);		}		AddReplacement(value,val);	}	else if(!strcmp(key, "replacepattern", false))	{		new any:val;		if(!GetTrieValue(CurrentSection, "replace", val))		{			val = CreateArray();			SetTrieValue(CurrentSection,"replace",val);		}		AddPatternReplacement(value,val);	}	else if(!strcmp(key, "block", false))	{		SetTrieValue(CurrentSection,"block",1);	}	else if(!strcmp(key, "action", false))	{		SetTrieString(CurrentSection,"action",value);	}	else if(!strcmp(key, "warn", false))	{		SetTrieString(CurrentSection,"warn",value);	}	else if(!strcmp(key, "limit", false))	{		SetTrieValue(CurrentSection,"limit",StringToInt(value));	}	else if(!strcmp(key, "forgive", false))	{		SetTrieValue(CurrentSection,"forgive",StringToInt(value));	}	else if(!strcmp(key, "punish", false))	{		SetTrieString(CurrentSection,"punish",value);	}	else if(!strcmp(key, "immunity", false))	{		SetTrieValue(CurrentSection,"immunity",ReadFlagString(value));	}}
public SMCResult:HandleEndSection (Handle:smc){	CurrentSection = INVALID_HANDLE;}
stock RegisterExpression(const String:key[], Handle:curr, Handle:array){	decl String:expression[192];	new flags = ParseExpression(key, expression, sizeof(expression) );	if(flags == -1) return;		decl String:errno[128], RegexError:errcode;	new Handle:compiled = CompileRegex(expression, flags, errno, sizeof(errno), errcode);		if(compiled == INVALID_HANDLE)	{		LogMessage("Error occured while compiling expression %s with flags %s, error: %s, errcode: %d", 			expression, flags, errno, errcode);	}	else 	{		decl arr[2];		arr[0] = _:compiled;		arr[1] = _:curr;		PushArrayArray(array, arr, 2);	}}
stock ParseExpression(const String:key[], String:expression[], len){	strcopy(expression, len, key);	TrimString(expression);		new flags, a, b, c	if(expression[strlen(expression) - 1] == '\'')	{		for(; expression[flags] != '\0'; flags++)		{			if(expression[flags] == '\'')			{				a++;				b = c;				c = flags;			}		}				if(a < 2) 		{			LogError("REGEXFilter file line malformed: %s, please check for errors. Continuing...",key);			return -1;		}		else		{			expression[b] = '\0'			expression[c] = '\0';			flags = FindREGEXFlags(expression[b + 1]);						TrimString(expression);						if(a > 2 && expression[0] == '\'')			{				strcopy(expression, strlen(expression) - 1, expression[1]);			}		}	}		return flags;}
stock FindREGEXFlags(const String:flags[]){	decl String:buffer[7][16];	buffer[0][0] = '\0';	buffer[1][0] = '\0';	buffer[2][0] = '\0';	buffer[3][0] = '\0';	buffer[4][0] = '\0';	buffer[5][0] = '\0';	buffer[6][0] = '\0';
	ExplodeString(flags, "|", buffer, 7, 16 );
	new intflags = 0;	for(new i = 0; i < 7; i++)	{		if(buffer[i][0] == '\0') continue;				if(!strcmp(buffer[i],"CASELESS",false) ) intflags |= PCRE_CASELESS;		else if(!strcmp(buffer[i],"MULTILINE",false) ) intflags |= PCRE_MULTILINE;		else if(!strcmp(buffer[i],"DOTALL",false) ) intflags |= PCRE_DOTALL;		else if(!strcmp(buffer[i],"EXTENDED",false) ) intflags |= PCRE_EXTENDED;		else if(!strcmp(buffer[i],"UNGREEDY",false) ) intflags |= PCRE_UNGREEDY;		else if(!strcmp(buffer[i],"UTF8",false) ) intflags |= PCRE_UTF8 ;		else if(!strcmp(buffer[i],"NO_UTF8_CHECK",false) ) intflags |= PCRE_NO_UTF8_CHECK;	}		return intflags;}
stock AddReplacement(const String:val[], Handle:array){	new Handle:dp = CreateDataPack();	WritePackCell(dp, _:INVALID_HANDLE);	WritePackString(dp, val);		PushArrayCell(array,dp);}
stock AddPatternReplacement(const String:val[], Handle:array){	decl String:expression[192];	new flags = ParseExpression(val, expression, sizeof(expression) );	if(flags == -1) return;		decl String:errno[128], RegexError:errcode;	new Handle:compiled = CompileRegex(expression, flags, errno, sizeof(errno), errcode);		if(compiled == INVALID_HANDLE)	{		LogMessage("Error occured while compiling expression %s with flags %s, error: %s, errcode: %d", 			expression, flags, errno, errcode);	}	else	{		new Handle:dp = CreateDataPack();		WritePackCell(dp,_:compiled);		WritePackString(dp, "");			PushArrayCell(array,dp);	}}
stock ParseAndExecute(client, String:cmd[], len){	decl String:repl[192];		if(client == 0) FormatEx(repl, sizeof(repl), "0");	else FormatEx(repl, sizeof(repl), "%i", GetClientUserId(client))	ReplaceString(cmd, len, "%u", repl);		if(client != 0) FormatEx(repl, sizeof(repl), "%i", client)	ReplaceString(cmd, len, "%i", repl);		GetClientName(client, repl, sizeof(repl));	ReplaceString(cmd, len, "%n", repl);		ServerCommand(cmd);}

лучше бы ты это в файле кинул....
 

CTe6eJIeK_vRn

Участник
Сообщения
2,114
Реакции
1,867
ой ё-маё, не заметил, это chrome скривил, в лисе такого не бывает у меня
 

Вложения

  • sm_regexfilter.sp
    11.5 КБ · Просмотры: 57

vectorserver

♥♥♥♥♥ by game.cominet.ru
Сообщения
201
Реакции
246
CTe6eJIeK_vRn, ну что работает (похер на регистр нусских слов)???
 

CTe6eJIeK_vRn

Участник
Сообщения
2,114
Реакции
1,867
я не пишу плагины, я могу исправить некоторые ошибки в них :)
 

WestFucK

Участник
Сообщения
57
Реакции
5
Ребята подскажите как настроить данный плагин чтобы он выкидывал из игры рекламщиков?или посоветуйте какой нибудь плагин на сурс мод
 

Snip80

Участник
Сообщения
49
Реакции
10
Тандемная реклама, обрабатываемая этим плагином, вызывает стабильный сбой плагина и часто - краш сервера. Если в конфиге плагина за рекламу предусмотрен sm_slap - используется игроками для запрыгивания на текстуры (например - Dust2, над ямой выступ, по нему разгоняются, биндят рекламу на клавишу, прыжок + клавиша - и ты на текстурах карты). Одним словом - трабла серьезная. Выкладывать в паблик пример тандемной рекламы - думаю не стоит - сервера массово в краш пойдут. Кому интересно - в личку.
 

Snip80

Участник
Сообщения
49
Реакции
10
AlmazON:
1. Ты обратил внимание на мою формулировку причины сбоя плагина? Тандемная реклама. Не думаю, что ты сможешь привести пример тандемной рекламы. Отсюда вывод - не знаешь - не пиши бред.
2. Никто ничего не мешает делать. Я только дал пример использования некоторых функций плагина, вносящих сбой в работу сервера. Если ты про это знал - почему не описал траблу? Отсюда вывод - указали на траблу, сделай выводы и скажи спасибо.
3. То, что плагин нужный - это даже не обсуждается. Вывод - твой третий пост - бред.

P.S. AlmazON. Если нечего сказать - промолчи, будешь умнее выглядеть.
 

FrozDark

Участник
Сообщения
1,769
Реакции
2,050
Если в конфиге плагина за рекламу предусмотрен sm_slap - используется игроками для запрыгивания на текстуры (например - Dust2, над ямой выступ, по нему разгоняются, биндят рекламу на клавишу, прыжок + клавиша - и ты на текстурах карты).
так значит багнутый плагин использовать не надо, а багнутые карты грех выбросить?
 

Snip80

Участник
Сообщения
49
Реакции
10
AlmazON, я всего лишь по русски пишу. Не по "Официально такого понятия", а по русски.
FrozDark, просто в плагине не нужно использовать команду sm_slap - причину уже описал. А на счет багнутой карты - жаль будет прощаться с de_dust2. И с cs_office и.т.д.
 

jeamaniy

Участник
Сообщения
1
Реакции
0
Не фига этот плагин не работает,народ как рекламил так и рекламит,не кикает,про бан я вообще молчу.
 

and_luk

Участник
Сообщения
18
Реакции
1
Не могу понять, куда его пихать.
Базу создал матов... около 1000 слов.
Вот теперь хочу установить и чето допереть не могу :(
Подскажите пожалуйста.

P.S. Заранее благодарен!

--------
Вот кому надо обширная база матов Посмотреть вложение regexrestrict.cfg
 

Snip80

Участник
Сообщения
49
Реакции
10
and_luk, а ты не подумал, как будет тормозить твой сервак на каждое слово в общем чате? Плагин отрабатывает любые сообщения игроков в чате. Представь - игрок написал предложение из 10 слов, а плагин делает сканирование каждого слова по твоей базе матов из 1000 слов. Это я к тому, что контр страйк - это игра, а не институт благородных девиц. Кто захочет написать матом - он все равно напишет. А грузит сервер подобной сранью - я считаю, это - маразм.
 

and_luk

Участник
Сообщения
18
Реакции
1
and_luk, а ты не подумал, как будет тормозить твой сервак на каждое слово в общем чате? Плагин отрабатывает любые сообщения игроков в чате. Представь - игрок написал предложение из 10 слов, а плагин делает сканирование каждого слова по твоей базе матов из 1000 слов. Это я к тому, что контр страйк - это игра, а не институт благородных девиц. Кто захочет написать матом - он все равно напишет. А грузит сервер подобной сранью - я считаю, это - маразм.

Ну посмотрю уже в работе.
Под сервер стоит:
Core i5
Reid из двух по 500гиг (64Мб кэша на винт)
16Гб оперы DDR3 1300МHz

Подскажите же, как его установить.
 

1Stas1

Участник
Сообщения
10
Реакции
10
Предупреждение за мат, с выводом сообщения, что он малыш
Кик за IP и ссылку
Путь, куда закидывать файлы
 

Вложения

  • regexrestrict.rar
    14.3 КБ · Просмотры: 107
Сверху Снизу