All pastes #252701 Raw Edit

Anonymous

public text v1 · immutable
#252701 ·published 2006-11-19 21:33 UTC
rendered paste body
#include <a_samp>
#include <dutils>

#define MAX_FILTERS 500
enum FILTER_MAIN {
	FILTER_ACTIVE,
	FILTER_FILENAME[128],
	FILTER_REPCHAR[3],
	FILTER_COUNT
};
new gFilterProps[FILTER_MAIN];
new gFilter[MAX_FILTERS][MAX_STRING];

public OnFilterScriptInit() {
	print("\n\n==== Filterscript: Simple Language Filter (SLF) by Betamaster ====");
	gFilterProps[FILTER_ACTIVE] = true;
	gFilterProps[FILTER_FILENAME][0]=0; set(gFilterProps[FILTER_FILENAME],"FS_SLFDef.inc");
	gFilterProps[FILTER_REPCHAR][0]=0;  set(gFilterProps[FILTER_REPCHAR],"*");
	print("----------------------------------------------------------------");
	printf("Processing file '%s' (replacement char: '%s')...",gFilterProps[FILTER_FILENAME],gFilterProps[FILTER_REPCHAR]);
	LoadFilters();
	printf("%d filter definitions loaded.",gFilterProps[FILTER_COUNT]-1);
	print("----------------------------------------------------------------\n");
}

public OnFilterScriptExit() {
	print("\n\n==== Filterscript: SLF ... Exited ====");
}

public OnPlayerCommandText(playerid, cmdtext[]) {
	new cmd[MAX_STRING], tmp[MAX_STRING], i;
	cmd = strtok(cmdtext,i);
	if(equal(cmd,"/slf",false)) {
		if(!IsPlayerAdmin(playerid)) {
			SendClientMsg(playerid,"You must be an admin to use this feature.");
			return 1;
		}
		tmp = strtok(cmdtext,i);
		if(!tmp[0]) {
			SendClientMessage(playerid,0xFFFFFFAA,"USAGE: /slf [on/off/add [filter]/remove [filter]/reload]");
		} else {
			if(equal(tmp,"on",false)) {
				gFilterProps[FILTER_ACTIVE] = true;
				SendClientMsg(playerid,"Enabled");
			} else if(equal(tmp,"off",false)) {
				gFilterProps[FILTER_ACTIVE] = false;
				SendClientMsg(playerid,"Disabled");
			} else if(equal(tmp,"add",false)) {
				set(tmp,right(cmdtext,strlen(cmdtext)-i));
				AddFilter(playerid,tmp);
			} else if(equal(tmp,"remove",false)) {
				set(tmp,right(cmdtext,strlen(cmdtext)-i));
				RemoveFilter(playerid,tmp);
			} else if(equal(tmp,"reload",false)) {
				new string[MAX_STRING];
				LoadFilters();
				format(string,MAX_STRING,"%d filter definitions loaded.",gFilterProps[FILTER_COUNT]);
				SendClientMsg(playerid,string);
			}
		}
		return 1;
	}
	return 0;
}

public OnPlayerText(playerid, text[]) {
	if(gFilterProps[FILTER_ACTIVE]) format(text,MAX_STRING,"%s",SLF_Parse(text));
	return 1;
}

public OnPlayerPrivmsg(playerid, senderid, text[]) {
	if(gFilterProps[FILTER_ACTIVE]) format(text,MAX_STRING,"%s",SLF_Parse(text));
	return 1;
}

//------------------------------------------------------------------------------------------------------

LoadFilters() {
	new File:fhnd, tmp[MAX_STRING];
	if(fexist(gFilterProps[FILTER_FILENAME])) {
		fhnd = fopen(gFilterProps[FILTER_FILENAME],io_read);
		fread(fhnd,tmp);
		StripNewLine(tmp);
		gFilterProps[FILTER_COUNT]=0;
		while(tmp[0]!=0 && gFilterProps[FILTER_COUNT]<MAX_FILTERS) {
			gFilter[gFilterProps[FILTER_COUNT]] = tmp;
			gFilterProps[FILTER_COUNT]++;
			fread(fhnd,tmp);
			StripNewLine(tmp);
		}
		fclose(fhnd);
	} else {
		printf("*** CRITICAL ERROR: File '%s' not found. ***", gFilterProps[FILTER_FILENAME]);
		OnFilterScriptExit();
	}
}

AddFilter(playerid, filter[]) {
	new string[MAX_STRING];
	if(gFilterProps[FILTER_COUNT]>=MAX_FILTERS) {
		format(string,MAX_STRING,"Filter '%s' not added. Maximum filter buffer reached.",filter);
	} else {
		for(new i=0; i<gFilterProps[FILTER_COUNT]; i++) {
			if(equal(gFilter[i],filter,false)) {
				format(string,MAX_STRING,"Filter '%s' not added. It already exists.",filter);
				SendClientMsg(playerid,string);
				return;
			}
		}
		format(gFilter[gFilterProps[FILTER_COUNT]],MAX_STRING,"%s",filter);
		gFilterProps[FILTER_COUNT]++;
		if(SaveFilters()) {
			format(string,MAX_STRING,"Filter '%s' successfully added.",filter);
		} else {
			format(string,MAX_STRING,"Filter '%s' not added (file write error).",filter);
		}
	}
	SendClientMsg(playerid,string);
}

RemoveFilter(playerid, filter[]) {
	new string[MAX_STRING];
	for(new i=0; i<gFilterProps[FILTER_COUNT]; i++) {
		if(equal(gFilter[i],filter,false)) {
			for(new j=i; j<MAX_FILTERS-1; j++) gFilter[j] = gFilter[j+1];
			gFilter[MAX_FILTERS-1] = "\0";
			gFilterProps[FILTER_COUNT]--;
			if(SaveFilters()) {
				format(string,MAX_STRING,"Filter '%s' successfully removed.",filter);
			} else {
				format(string,MAX_STRING,"Filter '%s' not removed (file write error).",filter);
			}
			SendClientMsg(playerid,string);
			return;
		}
	}
	format(string,MAX_STRING,"Filter '%s' not removed. It was not found.",filter);
	SendClientMsg(playerid,string);
}

SaveFilters() {
	new File:fhnd, tmp[MAX_STRING];
	if(fexist(gFilterProps[FILTER_FILENAME])) {
		fhnd = fopen(gFilterProps[FILTER_FILENAME],io_write);
		for(new i=0; i<gFilterProps[FILTER_COUNT]; i++) {
			tmp[0]=0;
			strcat(tmp,gFilter[i]);
			if(i<gFilterProps[FILTER_COUNT]-1) strcat(tmp,"\r\n");
			fwrite(fhnd,tmp);
		}
		fclose(fhnd);
		return true;
	}
	return false;
}

SLF_Parse(text[]) {
	new i,j,tmp[MAX_STRING],newtmp[MAX_STRING],repstr[MAX_STRING],replen,pos;
	set(tmp,text);
	for(i=0; i<gFilterProps[FILTER_COUNT]; i++) {
		newtmp[0]=0;
		repstr[0]=0;
		replen = strlen(gFilter[i]);
		for(j=0;j<replen;j++) strcat(repstr,gFilterProps[FILTER_REPCHAR]);
		pos = strfind(tmp,gFilter[i],true);
		while(pos>=0) {
			strcat(newtmp,left(tmp,pos));
			strcat(newtmp,repstr);
			tmp = right(tmp,strlen(tmp)-pos-replen);
			pos = strfind(tmp,gFilter[i],true);
		}
		strcat(newtmp,tmp);
		set(tmp,newtmp);
	}
	return tmp;
}

left(source[], len) {  // By Alex "Y_Less" Cole
	new tmp[MAX_STRING];
	strmid(tmp,source,0,len,MAX_STRING);
	return tmp;
}

right(source[], len) {  // By Alex "Y_Less" Cole
	new tmp[MAX_STRING], srclen=strlen(source);
	strmid(tmp,source,srclen-len,srclen,MAX_STRING);
	return tmp;
}

SendClientMsg(playerid, string[]) {
	new tmp[MAX_STRING];
	format(tmp,MAX_STRING,"[SLF] %s", string);
	SendClientMessage(playerid,0xFFFFFFAA,tmp);
}