Pawn. Отличный антимат для SA-MP сервера.

Давным давно хотел написать антимат, но так руки и не доходили, пока не попросили функцию на одном форуме. Этот антимат проверяет строку на запрещённые слова, учитывая исключения(оскорблять, например). Найденные плохие слова заменяет на *(сколько в слове символов, столько и звёздочек).

Исходный код функции

stock remove_bad_word(text[])
{
	static words[][32] = {"bla","cyk"};
	static exceptions[][32] = {"vobla", "krabla", "mobla","picyk","mucyk"};
 
	new i, j, k, pos, epos, len, epos_buf;
	for (i = 0; i < sizeof(words); i++)
	{
		while ( (pos = strfind(text, words[i], true, pos+1)) != -1 )
		{
			len = strlen(words[i]);
 
			for (j = 0; j < sizeof(exceptions); j++)
			{
				epos = strfind(text, exceptions[j], true, epos+1);
				if ( epos != pos - (strlen(exceptions[j]) - len) )
				{
					epos = epos_buf;
					if (j == sizeof(exceptions)-1)
					{
						for (k = pos; k < pos+len; k++)
						{
							text[k] = '*';
						}
					}
					continue;
				}
				else
				{
					break;
				}
			}
			epos_buf = epos;
		}
	}
}

Исходник на pastebin.com

Пример использования

public OnPlayerText(playerid, text[])
{
	remove_bad_word(text);
	return 1;
}
  • Bugagaska

    ;D боюсь нереально создать словарь где будут все маты которые умудряется придумать наш человек

    • ну да, но самые популярные можно вписать:)

  • Какая разница

    ZIGGI, давай побольше уроков в pawn))

    • Каких, например?

  • diman777

    Привет ZiGGi)
    Это конечно не реально вписывать слова исключения.
    И если их не использовать (в приведенном коде), то конечно же будут ложные срабатывания.
    Я щас сам мучаюсь с этой проблемой и хочу разобраться.
    Предлагаю выход из этой проблемки такой — использовать разделители . :)(;?,!*»‘-+=
    Т.е. «словом» будет считаться набор символов разделенным одним или несколькими пробелами ‘ ‘.
    Тем самым мы избавляемся от ложных срабатываний, например:
    Пусть слово «привет» у нас будет ключевым для поиска.
    При следующем написании ключевое слово не ищем в строке:
    тестприветтест
    тест приветтест
    тестпривет
    Поиск будет считаться успешным, если хотя бы один пробел ‘ ‘ пропечатан в строке между ключевым слово «привет».
    Иными словами нужна ф-ия, которая проведёт посимвольную проверку в строке.
    Я пытался сделать, но не вышло, покажу отрывок где есть цикл и условие:

    // Работа со строками
     
    // Исходная строка
    static text_source[] = "тест привет тест";
     
    // Слова, которые будем искать в строке text_source
    static const words_find[][] = {
    	"привет",
    	"мячик",
    	"трава",
    	"солнце",
    	"руки",
    	"сон",
    	"велосипед",
    	"окно",
    	"утка",
    	"салют"
    };
     
    // Функция поиска
    stock find_words_in_string(text[])
    {
    	new rezult[MAX_STRING];
     
    	for(new i = 0; i < sizeof(words_find); ++i)
    	{
    		// В строке нашли слово
    		if(strfind(text, words_find[i], true)!= -1)
    		{
    			// Связываем последовательность
    			strcat(rezult, words_find[i]);
    			strcat(rezult, ", ");
    		}
    	}
    	return rezult;
    }
     
    // Печать
    text_init() {
     
    	new string[MAX_STRING], len;
     
    	format(string, sizeof(string), "В строке '%s' найдены ключевые слова: '%s'", text_source, find_words_in_string(text_source));
     
    	// Узнаем длину строки string
    	len = strlen(string);
     
    	// Отсекаем лишнее
    	strdel(string, len-3, len-1);
     
    	printf(string);
    }
     
    public OnGameModeInit() {
     text_init();
     return 1;
    }

    Данная ф-ия find_words_in_string найдёт все слова, которые встретились в исходной строке, записывая их в строчку через запятую.
    Но ф-ия будет реагировать если например вся строка написана слитно.
    Помоги решить эту проблему, чтобы не использовать слова исключений и прочее.

  • diman777

    ZiGGi можешь отредактировать моё сообщение, там где павн код?
    Пытался вставить атрибут, но не получилось))
    На всякий случай заливаю на pastebin — http://pastebin.com/nku5DPri

Перейти к верхней панели