PDA

Просмотр полной версии : [Function] ScanMessage()



Desulaid
17.12.2015, 19:34
SCAN MESSAGE
Фильтр строк

Назначение:

Функция ищет в строке указанные заранее вами слова.

Описание:

Я задумывал эту функцию как антимат (фильтр запрещенных слов на сервере). Но ее можно использовать в разных случаях: запрещать писать ip в чате, маты или "дай админку". Даже, если слово "cerf" написаноe как "c e rf", функция все равно его поймает.

Функция:


Для начала вам нужно включить в реестр запрещенные слова.


new const black_list[][] =
{
"cerf",
"дайадминку", // как пример поиска по словосочетаниям
":7777"
// и т.д.
};

* в одно слово мы лепим потому, что функция получает указанную нами строку, копирует ее в локальный массив и дальше работает с этим массивом, предварительно очистив этот массив от пробелов.


В любое удобное для вас место добавляем функцию ScanMessage().

stock ScanMessage(text[])
{
static pos, pos2, c;
new default_text[145];
strcat(default_text, text);
for (pos = 0, pos2 = 0;; ++pos)
{
switch (c = default_text[pos])
{
case ' ': continue;
case '\0':
{
default_text[pos2] = '\0';
break;
}
}
default_text[pos2++] = c;
}
for (new j, t = strlen(default_text); j < t; j++)
{
for (new k; k < sizeof(black_list); k ++)
{
if (strfind(default_text[j], black_list[k], true) != -1)
{
return 0;
}
}
}
return 1;
}



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

COMMAND:test(playerid, params[])
{
if (sscanf(params, "s[144]", params)) return 0;
if (ScanMessage(playerid, params))
return SendClientMessage(playerid, -1, "Слово в черном списке!");
return SendClientMessage(playerid, -1, "Ваше сообщение не содержит ничего эдакого =)");;
}

Пример системы (клицк) (http://pastebin.com/W3sVWmEj): запрещаем указывать ссылки на сторонние ресурсы.


Запрещается выкладывать куда-либо без разрешения автора!

Seregamil
18.12.2015, 07:15
: 7777 - обойдет
. ru- обойдет
и т.д.

Daniel_Cortez
18.12.2015, 12:57
: 7777 - обойдет
. ru- обойдет
и т.д.
Не обойдёт, там пробелы удаляются, хоть тот алгоритм по удалению и далёк от совершенства (а ведь всего месяц назад на другом форуме было обсуждение этой темы).

Desulaid
18.12.2015, 15:15
Не обойдёт, там пробелы удаляются, хоть тот алгоритм по удалению и далёк от совершенства (а ведь всего месяц назад на другом форуме было обсуждение этой темы).

Я искал твою функцию, но не смог найти. Нашел код с твоим методом профилированием кода, но твоей функции я там не нашел. То ли я такой зраячий, то ли действительно твоей функции нет. Сейчас я нашел твою функции и переделаю уборку проблеов :)

Daniel_Cortez
18.12.2015, 16:09
Я искал твою функцию, но не смог найти. Нашел код с твоим методом профилированием кода, но твоей функции я там не нашел. То ли я такой зраячий, то ли действительно твоей функции нет. Сейчас я нашел твою функции и переделаю уборку проблеов :)


RemoveSpaces_DC(string[])
{
static pos, pos2, c;
for (pos = 0, pos2 = 0;; ++pos)
{
switch (c = string[pos])
{
case ' ': continue;
case '\0':
{
string[pos2] = '\0';
return;
}
}
string[pos2++] = c;
}
}

Я нигде не публиковал этот вариант, т.к. на тот момент тема уже изрядно устарела (а теперь и вовсе закрыта). В сравнении с прошлым вариантом, удалось немного поднять производительность: "c = string[pos]" и "switch(c)" объединены в одно действие (в компиляторе Pawn оптимизация никакая, всё нужно делать вручную), а вместо выхода из цикла к точке возврата из функции (break) возврат производится сразу при встрече нуль-символа.