Отлов определенных слов в чате

Тема в разделе "Программирование / Скриптинг", создана пользователем valerikov, 27 фев 2014.

  1. valerikov

    valerikov

    Сообщения:
    4
    Симпатии:
    2
    Всем привет!

    Нашел тут один пример кода который отлавливает слово в чате и автоматом на него отвечает

    PHP:
    #include <sourcemod>

    public OnPluginStart()
    {
           
    AddCommandListener(Command_Say"say");
           
    AddCommandListener(Command_Say"say_team");
    }

    public 
    Action:Command_Say(client, const String:command[], args)
    {
            if (!
    client)
            {
            return 
    Plugin_Continue;
            }

            
    decl String:text[192];
            
    GetCmdArgString(text192);

            new 
    startidx 0;
            if (
    text[strlen(text)-1] == '"')
            {
            
    text[strlen(text)-1] = '\0';
            
    startidx 1;
            }

            if(
    StrEqual(text[startidx], "привет")
            || 
    StrEqual(text[startidx], "Привет")
            || 
    StrEqual(text[startidx], "ку")
            || 
    StrEqual(text[startidx], "хай"))
            {
            
    CreateTimer(0.1responseclient,TIMER_FLAG_NO_MAPCHANGE);
            }
            return 
    Plugin_Continue;
    }

    public 
    Action:response(Handle:timerany:client)
    {
            if (!
    client)
            {
            return;
            }
            
    PrintToChat(client"\x04[\x01InTeam\x04] Здравствуй дружище)");
    }
    в принципе он работает, но есть одно но!? если написать в чате "Привет" то он определит это слово, а если написать "Всем привет" то он не поймает это слово.. т.е. получается так что он ловит только одно слово.

    Отсюда вопрос. Как сделать чтобы этот скрипт находил нужное нам слово среди других слов?
    К примеру "Всем привет ребята!" как бы определяем нужное слово несмотря на другие слова.
    ..Если конечно такое возможно.
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.004
    Симпатии:
    2.994
    valerikov, http://docs.sourcemod.net/api/index.php?fastload=show&id=615&

    Вместо
    PHP:
    if(StrEqual(text[startidx], "привет"
            || 
    StrEqual(text[startidx], "Привет"
            || 
    StrEqual(text[startidx], "ку"
            || 
    StrEqual(text[startidx], "хай"))
    Так:
    PHP:
    if(StrContains(text[startidx], "привет") != -1
            
    || StrContains(text[startidx], "Привет") != -1
            
    || StrContains(text[startidx], "ку") != -1
            
    || StrContains(text[startidx], "хай") != -1)
     
    valerikov нравится это.
  3. The Night Fury

    The Night Fury Администратор

    Сообщения:
    1.222
    Симпатии:
    916
    Где-то осуществлялось через explode, если не ошибаюсь, а где-то по аргументам подбирали. Плагина название, увы, уже не помню. Можно попробовать StrContains.
     
  4. valerikov

    valerikov

    Сообщения:
    4
    Симпатии:
    2
    R1KO при таком раскладе он на любой текст реагирует)) только что проверил, даже на цифры. Может чего не хватает к этой функции?

    Добавлено через 1 минуту
    стоп, вру, я сам не изменил как надо)) ща проверю ещё раз.

    Добавлено через 7 минут
    В принципе работает, но опять это но... если ввести не просто "привет" а "приветы" он реагирует :lol: если написать не "ку" а тупо "курица" он так же реагирует.. Может есть ещё какие функции?

    Добавлено через 26 минут
    А может как-то через сравнение строк попробовать? или это тупо?))
     
    Последнее редактирование: 27 фев 2014
  5. FrozDark

    FrozDark Команда сайта HLMod Модератор

    Сообщения:
    1.761
    Симпатии:
    1.915
    Explode не оптимальный вариант, причем неизвестно сколько будут пробелов (или другие знаки препинания). Думаю лучше с помощью StrContains получить индекс массива начала слова и затем скопировать содержимое следующих индексов до тех пор, пока не найдет пробел, точку или другие знаки препинания
     
  6. Monroe

    Monroe

    Сообщения:
    25
    Симпатии:
    35
    PHP:
    new const String:Hello[][] = {"привет""Привет""ку""хай"};

    public 
    Action:Command_Say(client, const String:command[], args)
    {
        if(!
    client) return Plugin_Continue;

        
    decl String:text[192]; GetCmdArgString(text192);

        new 
    startidx 0;
        if(
    text[strlen(text) - 1] == '"')
        {
            
    text[strlen(text) - 1] = '\0';
            
    startidx 1;
        }

        for(new 
    0sizeof(Hello); i++)
        {
            if(!
    strcmp(text[startidx], Hello[i]))
            {
                
    PrintToChat(client"Здравствуй дружище");
                break;
            }
        }
        
        return 
    Plugin_Continue;
    }

    Можно так попробовать
     
  7. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.004
    Симпатии:
    2.994
    Minus, это почти то же самое, что и его 1-й вариант, только более оптимизированый. Проблему это не решает.
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.004
    Симпатии:
    2.994
    Minus, да, но не решает эту:

     
  9. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    В таком случае используйте идею FrozDark,
    только желательно будет если индекс начального символа у нас не 0, то проверять предыдущую букву.
     
  10. FrozDark

    FrozDark Команда сайта HLMod Модератор

    Сообщения:
    1.761
    Симпатии:
    1.915
    так его код под спойлером в первом посте и есть то, что ты сделал

    накидал код того, что имел ввиду
    PHP:
    new const String:Hello[][] = {"привет""Привет""ку""хай"}; 

    public 
    Action:Command_Say(client, const String:command[], args

        if(!
    client) return Plugin_Continue

        
    decl String:text[192]; GetCmdArgString(text192); 

        new 
    index = -1;
        
    decl String:word[32];
        for(new 
    0sizeof(Hello); i++) 
        { 
            if ((
    index StrContains(textHello[i], false)) == -1) continue;
            
            new 
    0;
            while (
    text[index] != '\0' && text[index] != '\'' && text[index] != '"' && text[index] != '[' && text[index] != '{' && text[index] != ']' && text[index] != '}' && text[index] != '\\' && text[index] != '/' && text[index] != '|' && text[index] != ' ' && text[index] != '.' && text[index] != '?' && text[index] != '!' && text[index] != '(' && text[index] != ')' && text[index] != '_' && text[index] != '-' && text[index] != '+' && !IsCharNumeric(text[index]))
            {
                
    word[c++] = text[index++];
            }
            
    word[c] = '\0';
            
            if(!
    strcmp(wordHello[i], false)) 
            { 
                
    PrintToChat(client"Здравствуй дружище"); 
                break; 
            } 
        } 
         
        return 
    Plugin_Continue
    }
     
    Последнее редактирование: 28 фев 2014
    valerikov нравится это.
  11. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    FrozDark, предыдущий символ ещё проверяй, если не index больше 0, иначе среагирует на любое слово оканчивающееся на "ку"
     
  12. Monroe

    Monroe

    Сообщения:
    25
    Симпатии:
    35
    PHP:
    #include <sourcemod>
    #include <regex>

    new const String:Hello[][] = {"привет""Привет""ку""хай"};
    new const 
    String:Exclude[] = "[^А-Яа-яA-Za-z0-9]";

    public 
    OnPluginStart()
    {
       
    AddCommandListener(Command_Say"say");
       
    AddCommandListener(Command_Say"say_team");
    }

    public 
    Action:Command_Say(client, const String:command[], args)
    {
        if(!
    client) return Plugin_Continue;

        
    decl String:text[192]; GetCmdArgString(text192);

        new 
    startidx 0;
        if(
    text[strlen(text) - 1] == '"')
        {
            
    text[strlen(text) - 1] = '\0';
            
    startidx 1;
        }
        
        
    decl String:pattern[128];
        for(new 
    0sizeof(Hello); i++)
        {
            
    FormatEx(patternsizeof(pattern), "(%s|^)%s((%s)|$)"ExcludeHello[i], Exclude);
            
            if(
    SimpleRegexMatch(text[startidx], pattern) > 0)
            {                    
                
    PrintToChat(client"Здравствуй дружище");
                break;
            }
        }    
        
        return 
    Plugin_Continue;
    }

    Так попробуйте

    Добавлено через 4 часа 38 минут
    PHP:
    #include <sourcemod>
    #include <regex>

    new const String:Hello[][] = {"привет""Привет""ку""хай"};
    new const 
    String:Exclude[] = "[^А-Яа-яA-Za-z0-9]";

    public 
    OnPluginStart() HookEvent("player_say"OnPlayerSay);

    public 
    OnPlayerSay(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    decl String:text[192], String:pattern[128]; GetEventString(event"text"textsizeof(text));
        for(new 
    0sizeof(Hello); i++)
        {
            
    FormatEx(patternsizeof(pattern), "(%s|^)%s(%s|$)"ExcludeHello[i], Exclude);
            if(
    SimpleRegexMatch(textpattern) > 0)
            {
                
    PrintToChat(GetClientOfUserId(GetEventInt(event"userid")), "Здравствуй дружище");
                break;
            }
        }
    }
    Я бы еще сделал так
     
    Последнее редактирование: 28 фев 2014
    valerikov нравится это.
  13. valerikov

    valerikov

    Сообщения:
    4
    Симпатии:
    2
    Я проверил и ваш пример не реагирует.. вообще тишина.

    А вот эти два примера работают как надо)) второй даже компактней.
    Спасибо всем!
     
  14. Konstantin

    Konstantin

    Сообщения:
    1.789
    Симпатии:
    767
    А как добавить разные ответы на разные сообщения? Например: на "Привет" отвечает "Здравствуй, дружище", а на ":D" или ": )" — "Что смешного?"