Русское сообщество по скриптингу

Не блокирует сообщения другого чата плагин AntiSpam  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Re: Не блокирует сообщения другого чата плагин AntiSpam

Сообщение smetana » 28 июл 2018, 23:31

NoPM_N1Ck писал(а):Можно список плагинов?

Стоит Admin Prefixes это он мешает работе!
Пвтался с нативами но не чего не выходит(((
Аватара пользователя
smetana
 
Сообщения: 37
Зарегистрирован: 18 фев 2016, 05:54
Благодарил (а): 4 раз.
Поблагодарили: 1 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: Не блокирует сообщения другого чата плагин AntiSpam  [Решено]

Сообщение Mistrick » 28 июл 2018, 23:32

За 2 дня не додумали, что плагин блока надо ставить выше по списку чем префиксы?
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Не блокирует сообщения другого чата плагин AntiSpam

Сообщение smetana » 29 июл 2018, 00:42

Короче мучался целый час и не чего не сделал!
Вот что намудрил,
Код: Выделить всё
#pragma compress 1

#include <amxmodx>
#include <fakemeta>
#include <regex>

#define TIME_GAG_CHAT 120.0 // Длительность блокировки чата за спам или мат (в секундах).
#define CHANGE_NAME "9 DOJI6OE6" // Имя которое будет присваивается игроку, если он заходит с ником содержащим мат или спам.

#pragma semicolon 1

#define MAX_PLAYERS 32
#define MSG_SAY_TEXT 76
#define MSG_SEND_AUDIO 100

#define BIT_VALID(%1,%2) ((%1) & (1 << ((%2) - 1)))
#define BIT_ADD(%1,%2) ((%1) |= (1 << ((%2) - 1)))
#define BIT_SUB(%1,%2) ((%1) &= ~(1 << ((%2) - 1)))
#define BIT_NOT_VALID(%1,%2) (~(%1) & (1 << ((%2) - 1)))

new Array:g_aWhileList, g_iSizeWhileList;
new Array:g_aBlockName, g_iSizeBlockName;
new Array:g_aBlockChat, g_iSizeBlockChat;

new Regex:g_iPattern, iError;
new g_iBitClientAccess, g_iBitClientConnected, g_iWarning[MAX_PLAYERS + 1];

new const __UPPER_CASE[][] = { "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я" };
new const __LOWER_CASE[][] = { "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я" };

new const __CHARS_CASE = sizeof __UPPER_CASE;



public plugin_init()
{
    register_native ("get_my_info", "native_get_my_info", 1);
    register_plugin("AntiSpam UP", "0.1", "RESKJ.PRO");
    register_clcmd("say", "HookMessage");
    register_clcmd("say_team", "HookMessage");
    register_forward(FM_ClientUserInfoChanged, "ClientUserInfoChanged_Pre", 0);
    g_aWhileList = ArrayCreate(32);
    g_aBlockName = ArrayCreate(32);
    g_aBlockChat = ArrayCreate(32);
    new szError[32];
    g_iPattern = regex_compile("(?:\w{2,}\.[A-z]{2,4}\b|(?:\d+\W+){3})", iError, szError, charsmax(szError), "i");
    if(g_iPattern != REGEX_OK) log_amx("Regex error: %s (%d)", szError, iError);
}

public plugin_cfg()
{
    new szDirName[64], szFileName[128];
    get_localinfo("amxx_configsdir", szDirName, charsmax(szDirName));
    formatex(szFileName, charsmax(szFileName), "%s/sm_control/while_list.ini", szDirName);
    switch(file_exists(szFileName))
    {
        case 0: log_amx("File ^"%s^" not found", szFileName);
        case 1: ReadFile(szFileName, g_aWhileList);
    }
    formatex(szFileName, charsmax(szFileName), "%s/sm_control/block_name.ini", szDirName);
    switch(file_exists(szFileName))
    {
        case 0: log_amx("File ^"%s^" not found", szFileName);
        case 1: ReadFile(szFileName, g_aBlockName);
    }
    formatex(szFileName, charsmax(szFileName), "%s/sm_control/block_msg.ini", szDirName);
    switch(file_exists(szFileName))
    {
        case 0: log_amx("File ^"%s^" not found", szFileName);
        case 1: ReadFile(szFileName, g_aBlockChat);
    }
    g_iSizeWhileList = ArraySize(g_aWhileList);
    g_iSizeBlockName = ArraySize(g_aBlockName);
    g_iSizeBlockChat = ArraySize(g_aBlockChat);
}

ReadFile(szFileName[], Array:iData)
{
    new szBuffer[32], szFile = fopen(szFileName, "rt");
    while(!feof(szFile))
    {
        fgets(szFile, szBuffer, charsmax(szBuffer));
        trim(szBuffer);
        if(!szBuffer[0] || szBuffer[0] == '/' && szBuffer[1] == '/') continue;
        ArrayPushString(iData, szBuffer);
    }
    fclose(szFile);
}

public client_putinserver(id)
{
    BIT_ADD(g_iBitClientConnected, id);
    set_task(5.0, "client_access_add", id);
}
public client_access_add(id) BIT_ADD(g_iBitClientAccess, id);
public client_disconnect(id)
{
    g_iWarning[id] = 0;
    BIT_SUB(g_iBitClientAccess, id);
    BIT_SUB(g_iBitClientConnected, id);
    if(task_exists(id)) remove_task(id);
}

public ClientUserInfoChanged_Pre(id, szBuffer)
{
    static szNewName[32], szOldName[32];
    if(BIT_VALID(g_iBitClientConnected, id)) get_user_name(id, szOldName, charsmax(szOldName));
    else szOldName = CHANGE_NAME;
    engfunc(EngFunc_InfoKeyValue, szBuffer, "name", szNewName, charsmax(szNewName));
    if(CheckWhite(szNewName)) return FMRES_IGNORED;
    new iMatch = regex_match_c(szNewName, g_iPattern, iError);
    if(iMatch > 0 || CheckName(szNewName))
    {
        engfunc(EngFunc_SetClientKeyValue, id, szBuffer, "name", szOldName);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

bool:CheckName(szBuffer[])
{
    static szBlockLine[32];
    for(new i; i < g_iSizeBlockName; i++)
    {
        ArrayGetString(g_aBlockName, i, szBlockLine, charsmax(szBlockLine));
        if(strfind(utf_strtolower(szBuffer), utf_strtolower(szBlockLine)) != -1) return true;
    }
    return false;
}

public HookMessage(id)
{
    if(BIT_NOT_VALID(g_iBitClientAccess, id))
    {
        PrintChat(id, "!g[AntiSpam UP]!y У Тебя заблокирован чат на !g%i сек. !yЖди, ты сам виноват!g!", floatround(TIME_GAG_CHAT));
        return PLUGIN_HANDLED;
    }
    static szMessage[192];
    read_args(szMessage, charsmax(szMessage));
    remove_quotes(szMessage);
    strtolower(szMessage);
    if(CheckWhite(szMessage)) return PLUGIN_CONTINUE;
    static iMatch; iMatch = regex_match_c(szMessage, g_iPattern, iError);
    if(iMatch > 0 || CheckMessage(szMessage))
    {
        if(++g_iWarning[id] < 3)
        {
            SendAudio(id, "events/tutor_msg.wav");
            PrintChat(id, "!g[AntiSpam UP]!y У тебя !g%i/3 !yпредупреждений до блокировки чата!g!", g_iWarning[id]);
        }
        else
        
{
            BIT_SUB(g_iBitClientAccess, id);
            SendAudio(id, "events/friend_died.wav");
            PrintChat(id, "!g[AntiSpam UP]!y Чат заблокирован на !g%i !yсекунд!g!", floatround(TIME_GAG_CHAT));
            set_task(TIME_GAG_CHAT, "GagExpired", id);
        }
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

bool:CheckMessage(szBuffer[])
{
    static szBlockLine[32];
    for(new i; i < g_iSizeBlockChat; i++)
    {
        ArrayGetString(g_aBlockChat, i, szBlockLine, charsmax(szBlockLine));
        if(strfind(utf_strtolower(szBuffer), utf_strtolower(szBlockLine)) != -1) return true;
    }
    return false;
}

bool:CheckWhite(szBuffer[])
{
    static szBlockLine[32];
    for(new i; i < g_iSizeWhileList; i++)
    {
        ArrayGetString(g_aWhileList, i, szBlockLine, charsmax(szBlockLine));
        if(contain(szBuffer, szBlockLine) != -1) return true;
    }
    return false;
}

public GagExpired(id)
{
    BIT_ADD(g_iBitClientAccess, id);
    g_iWarning[id] = 0;
    SendAudio(id, "events/task_complete.wav");
    PrintChat(id, "!g[AntiSpam UP]!y Чат разблокирован !g!!! !yCпам или мат ЗАПРЕЩЕН !g!!!");
}

public plugin_end()
{
    regex_free(g_iPattern);
}

stock SendAudio(id, szDirSound[])
{
    message_begin(MSG_ONE_UNRELIABLE, MSG_SEND_AUDIO, _, id);
    write_byte(id);
    write_string(szDirSound);
    write_short(100);
    message_end();
}

stock PrintChat(const id, const szMessage[], any:...)
{
    if(!is_user_connected(id)) return;
    new szBuffer[190];
    vformat(szBuffer, charsmax(szBuffer), szMessage, 3);
    while(replace(szBuffer, charsmax(szBuffer), "!y", "^1")) {}
    while(replace(szBuffer, charsmax(szBuffer), "!t", "^3")) {}
    while(replace(szBuffer, charsmax(szBuffer), "!g", "^4")) {}
    message_begin(MSG_ONE, MSG_SAY_TEXT, _, id);
    write_byte(id);
    write_string(szBuffer);
    message_end();
}

stock utf_strtolower( const arg[] )
{
    new utf_string[192];
    copy( utf_string, 191, arg );
    
    for
( new i; i < __CHARS_CASE; ++) {
        replace_utf_char( utf_string, __UPPER_CASE[i], __LOWER_CASE[i] );
    }

    strtolower( utf_string );

    return( utf_string );
}

stock replace_utf_char( arg[], char_find[], char_replace[] )
{
    if( strlen( char_find ) != strlen( char_replace ) ) return;

    new pos, len = strlen( char_replace );

    while( ( pos = strfind( arg, char_find ) ) != -) {
        for( new i = pos; i < pos + len; ++) {
            arg[i] = char_replace[i-pos];
        }
    }
    
    return
;
    
}

public native_get_my_info(id,param) 
{
    return g_aBlockChat;

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <celltrie>
#include <cstrike>

#define VERSION "4.1"
#define FLAG_LOAD ADMIN_CFG
#define MAX_PREFIXES 33

new g_aBlockChat = get_my_info(param);
new g_listen, g_listen_flag;
new pre_ips_count = 0, pre_names_count = 0, pre_steamids_count, pre_flags_count = 0, temp_cvar[2];
new configs_dir[64], file_prefixes[128], text[128], prefix[32], type[2], key[32], length, line = 0, error[256];
new g_saytxt, g_maxplayers, CsTeams:g_team;
new g_typed[192], g_message[190], g_name[32];
new Trie:pre_ips_collect, Trie:pre_names_collect, Trie:pre_steamids_collect, Trie:client_prefix;
new str_id[16], temp_key[35], temp_prefix[32];
new Array:g_aFlagsCollect

new const say_team_info
[2][CsTeams][] =
{
    {"*Наблюдатель* ", "*Умер* ", "*Умер* ", "*Наблюдатель* "},
    {"", "", "", ""}
}

new const sayteam_team_info[2][CsTeams][] =
{
    {"(Наблюдатель) ", "*Умер*(Террорист) ", "*Умер*(Контр-Террорист) ", "(Наблюдатель) "},
    {"(Наблюдатель) ", "(Террорист) ", "(Контр-Террорист) ", "(Наблюдатель) "}
}

new const forbidden_say_symbols[] = {
    "/",
    "!",
    "%",
    "$"
}

new const separator[] = "************************************************"
new const in_prefix[] = "[АдминПрефиксы]"

public plugin_init()
{
    register_plugin("Admin Prefixes", VERSION, "m0skVi4a ;]")

    g_listen = register_cvar("ap_listen", "1")
    g_listen_flag = register_cvar("ap_listen_flag", "a")

    g_saytxt = get_user_msgid ("SayText")
    g_maxplayers = get_maxplayers()
    register_native("get_my_info", "native_get_my_info", 1)

    register_concmd("ap_reload_prefixes", "LoadPrefixes")
    register_clcmd("say", "HookSay")
    register_clcmd("say_team", "HookSayTeam")

    pre_ips_collect = TrieCreate()
    pre_names_collect = TrieCreate()
    pre_steamids_collect = TrieCreate()
    client_prefix = TrieCreate()
    g_aFlagsCollect = ArrayCreate ( 34 )

    register_dictionary("admin_prefixes.txt")

    get_configsdir(configs_dir, charsmax(configs_dir))
    formatex(file_prefixes, charsmax(file_prefixes), "%s/ap_prefixes.ini", configs_dir)

    LoadPrefixes(0)
}
    
public LoadPrefixes
(id)
{
    if(!(get_user_flags(id) & FLAG_LOAD))
    {
        console_print(id, "%L", LANG_SERVER, "PREFIX_PERMISSION", in_prefix)
        return PLUGIN_HANDLED
    
}

    TrieClear(pre_ips_collect)
    TrieClear(pre_names_collect)
    TrieClear(pre_steamids_collect)
    ArrayClear ( g_aFlagsCollect )

    line = 0, length = 0, pre_flags_count = 0, pre_ips_count = 0, pre_names_count = 0;

    if(!file_exists(file_prefixes)) 
    
{
        formatex(error, charsmax(error), "%L", LANG_SERVER, "PREFIX_NOT_FOUND", in_prefix, file_prefixes)
        set_fail_state(error)
    }

    server_print(separator)

    new sText[34]
    while(read_file(file_prefixes, line++ , text, charsmax(text), length) && (pre_ips_count + pre_names_count + pre_steamids_count + pre_flags_count) <= MAX_PREFIXES)
    {
        if(!text[0] || text[0] == '^n' || text[0] == ';' || (text[0] == '/' && text[1] == '/'))
            continue

        parse
(text, type, charsmax(type), key, charsmax(key), prefix, charsmax(prefix))
        trim(prefix)

        if(!type[0] || !prefix[0] || !key[0])
            continue

        replace_all
(prefix, charsmax(prefix), "!g", "^x04")
        replace_all(prefix, charsmax(prefix), "!t", "^x03")
        replace_all(prefix, charsmax(prefix), "!n", "^x01")

        switch(type[0])
        {
            case 'f':
            {
                pre_flags_count++
                formatex ( sText, charsmax ( sText ), "^"%s^" ^"%s^"", key, prefix )
                ArrayPushString ( g_aFlagsCollect, sText )
                server_print("%L", LANG_SERVER, "PREFIX_LOAD_FLAG", in_prefix, prefix, key[0])
            }
            case 'i':
            {
                pre_ips_count++
                TrieSetString(pre_ips_collect, key, prefix)
                server_print("%L", LANG_SERVER, "PREFIX_LOAD_IP", in_prefix, prefix, key)
            }
            case 's':
            {
                pre_steamids_count++
                TrieSetString(pre_steamids_collect, key, prefix)
                server_print("%L", LANG_SERVER, "PREFIX_LOAD_STEAMID", in_prefix, prefix, key)
            }
            case 'n':
            {
                pre_names_count++
                TrieSetString(pre_names_collect, key, prefix)
                server_print("%L", LANG_SERVER, "PREFIX_LOAD_NAME", in_prefix, prefix, key)
            }
            default:
            {
                continue
            
}
        }
    }

    if(pre_flags_count <= 0 && pre_ips_count <= 0 && pre_steamids_count <= 0 && pre_names_count <= 0)
    {
        server_print("%L", LANG_SERVER, "PREFIX_NO", in_prefix)
    }

    get_user_name(id, g_name, charsmax(g_name))
    server_print("%L", LANG_SERVER, "PREFIX_LOADED_BY", in_prefix, g_name)
    console_print(id, "%L", LANG_SERVER, "PREFIX_LOADED", in_prefix)

    server_print(separator)

    for(new i = 1; i <= g_maxplayers; i++)
    {
        num_to_str(i, str_id, charsmax(str_id))
        TrieDeleteKey(client_prefix, str_id)
        PutPrefix(i)
    }

    return PLUGIN_HANDLED
}

public client_putinserver(id)
{
    num_to_str(id, str_id, charsmax(str_id))
    TrieSetString(client_prefix, str_id, "")
    PutPrefix(id)
}

public HookSay(id)
{
    read_args(g_typed, charsmax(g_typed))
    remove_quotes(g_typed)

    trim(g_typed)

    if(equal(g_typed, "") || !is_user_connected(id))
        return PLUGIN_HANDLED_MAIN

    if
(check_say_characters(g_typed))
        return PLUGIN_HANDLED_MAIN

    num_to_str
(id, str_id, charsmax(str_id))
    TrieGetString(client_prefix, str_id, temp_prefix, charsmax(temp_prefix))

    get_user_name(id, g_name, charsmax(g_name))

    g_team = cs_get_user_team(id)

    if(temp_prefix[0])
    {
        formatex(g_message, charsmax(g_message), "^1%s^4%s^3 %s :^4 %s", say_team_info[is_user_alive(id)][g_team], temp_prefix, g_name, g_typed)
    }
    else
    
{
        formatex(g_message, charsmax(g_message), "^1%s^3%s :^1 %s", say_team_info[is_user_alive(id)][g_team], g_name, g_typed)
    }

    get_pcvar_string(g_listen_flag, temp_cvar, charsmax(temp_cvar))

    for(new i = 1; i <= g_maxplayers; i++)
    {
        if(!is_user_connected(i))
            continue

        if
(is_user_alive(id) && is_user_alive(i) || !is_user_alive(id) && !is_user_alive(i) || get_pcvar_num(g_listen) && get_user_flags(i) & read_flags(temp_cvar))
        {
            send_message(g_message, id, i)
        }
    }

    return PLUGIN_HANDLED_MAIN
}

public HookSayTeam(id)
{
    read_args(g_typed, charsmax(g_typed))
    remove_quotes(g_typed)

    trim(g_typed)

    if(equal(g_typed, "") || !is_user_connected(id))
        return PLUGIN_HANDLED_MAIN

    if
(check_say_characters(g_typed))
        return PLUGIN_HANDLED_MAIN

    num_to_str
(id, str_id, charsmax(str_id))
    TrieGetString(client_prefix, str_id, temp_prefix, charsmax(temp_prefix))

    get_user_name(id, g_name, charsmax(g_name))

    g_team = cs_get_user_team(id)

    if(temp_prefix[0])
    {
        formatex(g_message, charsmax(g_message), "^1%s^4%s^3 %s :^4 %s", sayteam_team_info[is_user_alive(id)][g_team], temp_prefix, g_name, g_typed)
    }
    else
    
{
        formatex(g_message, charsmax(g_message), "^1%s^3%s :^1 %s", sayteam_team_info[is_user_alive(id)][g_team], g_name, g_typed)
    }

    get_pcvar_string(g_listen_flag, temp_cvar, charsmax(temp_cvar))

    for(new i = 1; i <= g_maxplayers; i++)
    {
        if(!is_user_connected(i))
            continue

        if
(get_user_team(id) == get_user_team(i) || get_pcvar_num(g_listen) && get_user_flags(i) & read_flags(temp_cvar))
        {
            if(is_user_alive(id) && is_user_alive(i) || !is_user_alive(id) && !is_user_alive(i) || get_pcvar_num(g_listen) && get_user_flags(i) & read_flags(temp_cvar))
            {
                send_message(g_message, id, i)
            }
        }
    }

    return PLUGIN_HANDLED_MAIN
}

public client_infochanged(id)
{
    if(!is_user_connected(id))
        return PLUGIN_CONTINUE

    new g_old_name
[32];

    get_user_info(id, "name", g_name, charsmax(g_name))
    get_user_name(id, g_old_name, charsmax(g_old_name))

    if(!equal(g_name, g_old_name))
    {
        num_to_str(id, str_id, charsmax(str_id))
        TrieSetString(client_prefix, str_id, "")
        set_task(0.5, "PutPrefix", id)
        return PLUGIN_HANDLED
    
}

    return PLUGIN_CONTINUE
}

public PutPrefix(id)
{
    num_to_str(id, str_id, charsmax(str_id))
    TrieSetString(client_prefix, str_id, "")

    get_user_authid(id, temp_key, charsmax(temp_key))

    if(TrieGetString(pre_steamids_collect, temp_key, temp_prefix, charsmax(temp_prefix)))
    {
        TrieSetString(client_prefix, str_id, temp_prefix)
        return
    
}

    new sFlags[32]
    get_flags ( get_user_flags ( id ), sFlags, charsmax ( sFlags ) )

    if ( sFlags[0] && sFlags[0] != 'z' )
    {
        new iSize = ArraySize ( g_aFlagsCollect )
        new sBuff[34], sKey[2]
        for ( new i; i < iSize; i++ )
        {
            ArrayGetString ( g_aFlagsCollect, i, sBuff, charsmax ( sBuff ) )
            parse ( sBuff, sKey, 1, temp_prefix, charsmax ( temp_prefix ) )

            if ( contain ( sFlags, sKey ) != -)
            {
                TrieSetString ( client_prefix, str_id, temp_prefix )
                return
            
}
        }
    }
    
    get_user_ip
(id, temp_key, charsmax(temp_key), 1)

    if(TrieGetString(pre_ips_collect, temp_key, temp_prefix, charsmax(temp_prefix)))
    {
        TrieSetString(client_prefix, str_id, temp_prefix)
        return
    
}

    get_user_name(id, temp_key, charsmax(temp_key))

    if(TrieGetString(pre_names_collect, temp_key, temp_prefix, charsmax(temp_prefix)))
    {
        TrieSetString(client_prefix, str_id, temp_prefix)
    }
}

send_message(const message[], const id, const i)
{
    message_begin(MSG_ONE, g_saytxt, {0, 0, 0}, i)
    write_byte(id)
    write_string(message)
    message_end()
}

bool:check_say_characters(const check_message[])
{
    for(new i = 0; i < charsmax(forbidden_say_symbols); i++)
    {
        if(check_message[0] == forbidden_say_symbols[i])
        {
            return true
        
}
    }
    return false
}

public plugin_end ()
{
    ArrayDestroy ( g_aFlagsCollect )
    TrieDestroy ( pre_ips_collect )
    TrieDestroy ( pre_steamids_collect )
    TrieDestroy ( pre_names_collect )
    TrieDestroy ( client_prefix )


Добавлено спустя 3 минуты 33 секунды:
Mistrick писал(а):За 2 дня не додумали, что плагин блока надо ставить выше по списку чем префиксы?

Ахаха мистрик я тебя расцелую наверное! :yahoo:
Я тут мучаюсь с этими нативами , а тут всего лишь выше поставил и всё заработало. Огромную благодарность вырожаю! +
Всё решено!
Аватара пользователя
smetana
 
Сообщения: 37
Зарегистрирован: 18 фев 2016, 05:54
Благодарил (а): 4 раз.
Поблагодарили: 1 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: Не блокирует сообщения другого чата плагин AntiSpam

Сообщение NoPM_N1Ck » 29 июл 2018, 12:22

Пожалуйста :thumbs_up
Аватара пользователя
NoPM_N1Ck
 
Сообщения: 99
Зарегистрирован: 06 июл 2018, 18:56
Откуда: Русь
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше месяца
Языки программирования: Java

Пред.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4