Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5

Тема: ScanMessage()

  1. #1
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±

    ScanMessage()

    SCAN MESSAGE
    Фильтр строк

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

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

    Функция:

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

      PHP код:
      new const black_list[][] =
      {
          
      "cerf",
          
      "дайадминку"// как пример поиска по словосочетаниям
          
      ":7777"
          
      // и т.д.
      }; 
      * в одно слово мы лепим потому, что функция получает указанную нами строку, копирует ее в локальный массив и дальше работает с этим массивом, предварительно очистив этот массив от пробелов.

    2. В любое удобное для вас место добавляем функцию ScanMessage().
      PHP код:
      stock ScanMessage(text[])
      {
          static 
      pospos2c;
          new 
      default_text[145];
          
      strcat(default_texttext);
          for (
      pos 0pos2 0;; ++pos)
          {
              switch (
      default_text[pos])
              {
                  case 
      ' ': continue;
                  case 
      '\0':
                  {
                      
      default_text[pos2] = '\0';
                      break;
                  }
              }
              
      default_text[pos2++] = c;
          }
          for (new 
      jstrlen(default_text); tj++)
          {
              for (new 
      ksizeof(black_list); ++)
              {
                  if (
      strfind(default_text[j], black_list[k], true) != -1)
                  {
                       return 
      0;
                  }
              }
          }
          return 
      1;



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

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

    Запрещается выкладывать куда-либо без разрешения автора!
    Последний раз редактировалось Desulaid; 13.03.2016 в 16:21.

  2. 3 пользователя(ей) сказали cпасибо:
    Glant (19.12.2015) Salvacore (18.12.2015) [ForD] (19.01.2016)
  3. #2
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    : 7777 - обойдет
    . ru- обойдет
    и т.д.

  4. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Seregamil Посмотреть сообщение
    : 7777 - обойдет
    . ru- обойдет
    и т.д.
    Не обойдёт, там пробелы удаляются, хоть тот алгоритм по удалению и далёк от совершенства (а ведь всего месяц назад на другом форуме было обсуждение этой темы).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #4
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Не обойдёт, там пробелы удаляются, хоть тот алгоритм по удалению и далёк от совершенства (а ведь всего месяц назад на другом форуме было обсуждение этой темы).
    Я искал твою функцию, но не смог найти. Нашел код с твоим методом профилированием кода, но твоей функции я там не нашел. То ли я такой зраячий, то ли действительно твоей функции нет. Сейчас я нашел твою функции и переделаю уборку проблеов :)

  6. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Я искал твою функцию, но не смог найти. Нашел код с твоим методом профилированием кода, но твоей функции я там не нашел. То ли я такой зраячий, то ли действительно твоей функции нет. Сейчас я нашел твою функции и переделаю уборку проблеов :)
    PHP код:
    RemoveSpaces_DC(string[])
    {
        static 
    pospos2c;
        for (
    pos 0pos2 0;; ++pos)
        {
            switch (
    string[pos])
            {
                case 
    ' ': continue;
                case 
    '\0':
                {
                    
    string[pos2] = '\0';
                    return;
                }
            }
            
    string[pos2++] = c;
        }

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

  7. 2 пользователя(ей) сказали cпасибо:
    Desulaid (18.12.2015) Nurick (18.12.2015)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •