AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   ^x05 White chat (https://forums.alliedmods.net/showthread.php?t=322448)

DJBosma 03-27-2020 11:56

^x05 White chat
 
Well, I'm trying to add ^x05 (white) to the player's "cm_player_send_message" with cs_get_user_team(player) == CS_TEAM_SPECTATOR, so their message shows up in ... you guessed it.. white.

PHP Code:

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <uac>
#include <chatmanager>
#include <regex>

#define CC_COLORS_TYPE CC_COLORS_SHORT
#define CC_DONT_OVERWRITE_COLORCHAT
#include <cromchat> 


#define PLUGIN "Chat Manager"
#define VERSION "1.1.2-16"
#define AUTHOR "Mistrick"

#pragma semicolon 1

#define ADMIN_FLAG ADMIN_ADMIN

//Colors: DEFAULT, TEAM, GREEN
#define PRETEXT_COLOR  DEFAULT
#define PLAYER_CHAT_COLOR  TEAM
#define ADMIN_CHAT_COLOR     GREEN
#define PLAYER_NAME_COLOR  DEFAULT
#define ADMIN_NAME_COLOR  DEFAULT

//Flags: DEFAULT_CHAT, ALIVE_SEE_DEAD, DEAD_SEE_ALIVE, TEAM_SEE_TEAM
#define PLAYER_CHAT_FLAGS (ALIVE_SEE_DEAD|DEAD_SEE_ALIVE)
#define ADMIN_CHAT_FLAGS (ALIVE_SEE_DEAD|DEAD_SEE_ALIVE|TEAM_SEE_TEAM)

//     #define FUNCTION_ADD_TIME_CODE
//     #define FUNCTION_LOG_MESSAGES
//    #define FUNCTION_AES_TAGS        <- Advanced Experiense System
//    #define FUNCTION_TRANSLITE
#define FUNCTION_BLACK_LIST
#define FUNCTION_BLOCK_IDENTICAL_MSG
#define FUNCTION_BLOCK_ADVERTISING
#define FUNCTION_BLOCK_CAPS


#define MAX_IDENTICAL_MESSAGES 2
#define MIN_MESSAGE_DELAY 2.0 // seconds
#define MAX_WARNINGS_TO_BLOCK_CHAT 5
#define BLOCK_CHAT_TIME 60.0 // seconds
#define MAX_CAPS_PERCENT 30

#define IP_LEN 22
#define DOMAIN_LEN 32

new Float:g_fLastMsgTime[33];
new 
g_iWarnings[33];
new 
Float:g_fBlockTime[33];

#if defined FUNCTION_BLACK_LIST
new const FILE_BLACK_LIST[] = "chatmanager_blacklist.ini";
new Array:
g_aBlackList;
new 
g_iBlackListSize;
#endif // FUNCTION_BLACK_LIST

#if defined FUNCTION_BLOCK_IDENTICAL_MSG
new g_sLastMessage[33][128];
new 
g_iRepeatWarn[33];
#endif // FUNCTION_BLOCK_IDENTICAL_MSG

#if defined FUNCTION_BLOCK_ADVERTISING
new const FILE_WHITE_LIST[] = "chatmanager_whitelist.ini";
new Array:
g_aWhiteListIp;
new Array:
g_aWhiteListDomain;
new 
g_iWhiteListIpSize;
new 
g_iWhiteListDomainSize;
new 
Regex:g_rIpPattern;
new 
Regex:g_rDomainPattern;
#endif // FUNCTION_BLOCK_ADVERTISING


#define PREFIX_MAX_LENGTH 32
#define AES_MAX_LENGTH 32

//UAC PREFIX
enum {
    
PREFIX_NONE,
    
PREFIX_CHANGE,
    
PREFIX_CHANGED,
    
PREFIX_RESET
}

new 
Prefix[MAX_PLAYERS+1];
//END

new const TEAM_NAMES[CsTeams][] = {
    
"(Spec only)",
    
"(Zombies)",
    
"(Humans)",
    
"(Spec only)"
};


//DONT CHANGE!!!
#define COLOR_BUFFER 6
#define TEXT_LENGTH 128

#define MESSAGE_LENGTH 173 // 192 - 19

#define CHECK_NATIVE_ARGS_NUM(%1,%2,%3) \
    
if (%< %2) { \
        
log_error(AMX_ERR_NATIVE"Invalid num of arguments %d. Expected %d", %1, %2); \
        return %
3; \
    }

#define CHECK_NATIVE_PLAYER(%1,%2) \
    
if (!is_user_connected(%1)) { \
        
log_error(AMX_ERR_NATIVE"Invalid player %d", %1); \
        return %
2; \
    }

#if defined FUNCTION_AES_TAGS
native aes_get_player_stats(id,data[4]);
native aes_get_level_name(lvlnum,level[],len,idLang 0);
new const 
AES_TAG_FORMAT[] = "^1[^3%s^1] ";
#endif

const DEFAULT_CHAT 0;
const 
ALIVE_SEE_DEAD = (<< 0);
const 
DEAD_SEE_ALIVE = (<< 1);
const 
TEAM_SEE_TEAM = (<< 2);

enum {
    DEFAULT = 
1,
    
TEAM 3,
    
GREEN 4
};

enum _:FLAG_PREFIX_INFO {
    
m_Flag,
    
m_Prefix[PREFIX_MAX_LENGTH]
};

new const 
g_TextChannels[][] = {
    
"#Cstrike_Chat_All",
    
"#Cstrike_Chat_AllDead",
    
"#Cstrike_Chat_T",
    
"#Cstrike_Chat_T_Dead",
    
"#Cstrike_Chat_CT",
    
"#Cstrike_Chat_CT_Dead",
    
"#Cstrike_Chat_Spec",
    
"#Cstrike_Chat_AllSpec"
};

new 
g_SayText;
new 
g_sMessage[MESSAGE_LENGTH];

new const 
FILE_PREFIXES[] = "chatmanager_prefixes.ini";

new 
g_bCustomPrefix[33], g_sPlayerPrefix[33][PREFIX_MAX_LENGTH];
new 
Trie:g_tSteamPrefixesg_iTrieSteamSize;
new 
Trie:g_tNamePrefixesg_iTrieNameSize;
new Array:
g_aFlagPrefixesg_iArrayFlagSize;

#if defined FUNCTION_LOG_MESSAGES
new g_szLogFile[128];
#endif

#if defined FUNCTION_TRANSLITE
new g_bTranslite[33];
#endif

enum Forwards {
    
SEND_MESSAGE
};

enum _:MessageReturn {
    
MESSAGE_IGNORED,
    
MESSAGE_CHANGED,
    
MESSAGE_BLOCKED
};

new 
g_iForwards[Forwards];
new 
g_sNewMessage[MESSAGE_LENGTH];


public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);
    
CC_SetPrefix("!g|CHAT|");
    
register_concmd("cm_set_prefix""concmd__set_prefix"ADMIN_RCON"{name or #id} {prefix}");
    
    
#if defined FUNCTION_TRANSLITE
    
register_clcmd("say /rus""clcmd__lang_change");
    
register_clcmd("say /eng""clcmd__lang_change");
    
#endif
    
    
register_clcmd("say""clcmd__say_handler");
    
register_clcmd("say_team""clcmd__say_handler");
    
    
register_message((g_SayText get_user_msgid("SayText")), "message__say_text");

    
// cm_player_send_message(id, message[], team_chat);
    
g_iForwards[SEND_MESSAGE] = CreateMultiForward("cm_player_send_message"ET_STOPFP_CELLFP_STRINGFP_CELL);
}
//UAC PREFIX
public UAC_Checked(const id, const UAC_CheckResult:found) {
    if (
found == UAC_CHECK_SUCCESS) {
        
Prefix[id] = PREFIX_CHANGE;
    } else if (
Prefix[id] == PREFIX_CHANGED) {
        
Prefix[id] = PREFIX_RESET;
    } else {
        
Prefix[id] = PREFIX_NONE;
    }

    if (
is_user_connected(id)) {
        
setPrefix(id);
    }
}

public 
plugin_cfg()
{
    
#if defined FUNCTION_BLACK_LIST
    
LoadBlackList();
    
#endif // FUNCTION_BLACK_LIST

    #if defined FUNCTION_BLOCK_ADVERTISING
    
new error[2], ret;
    
    
/*
    :?270[0-9][0-9]                                                                     - matches cs ports
    [^0-9a-zA-Z !\-"#$%&'()*+,.\/:;<=>?@[\]\^_`{|}~\\]                                  - matches special chars
    ^[/]  - match text that starts with "/"
    ^[#]  - match text that starts with "#"
    */
    
g_rIpPattern regex_compile("\d{1,3}((?![0-9]).){1,3}\d{1,3}((?![0-9]).){1,3}\d{1,3}((?![0-9]).){1,3}\d{1,3}"reterrorcharsmax(error));
    
g_rDomainPattern regex_compile("[0-9a-z]+[ ]{0,3}\.[ ]{0,3}(bg|lv|ge|biz|eu|xyz|us|ro|ir|it|am|do|at|ru|com|su|net|info|org|pl|in|tk|ro|ua|ws|nu|lt|co|il)"reterrorcharsmax(error));
    
    
LoadWhiteList();
    
#endif // FUNCTION_BLOCK_ADVERTISING
    
    #if defined FUNCTION_LOG_MESSAGES
    
new dir[] = "addons/amxmodx/logs/chatmanager";
    if(!
dir_exists(dir)) {
        
mkdir(dir);
    }
    new 
date[16]; get_time("%Y%B%d"datecharsmax(date)); //2020-Januari-12
    
formatex(g_szLogFilecharsmax(g_szLogFile), "%s/chatlog_%s.html"dirdate);
    if(!
file_exists(g_szLogFile)) {
        
write_file(g_szLogFile"<meta charset=utf-8><title>ChatManager Log</title>");
    }
    
#endif
    
    
LoadPlayersPrefixes();
    
    
#if defined FUNCTION_AES_TAGS
    
register_dictionary("aes.txt");
    
#endif
}

LoadPlayersPrefixes()
{
    new 
dir[128]; get_localinfo("amxx_configsdir"dircharsmax(dir));
    new 
file_name[128]; formatex(file_namecharsmax(file_name), "%s/%s"dirFILE_PREFIXES);
    
    if(!
file_exists(file_name)) {
        
log_amx("Prefixes file doesn't exist!");
        return;
    }
    
    
g_tSteamPrefixes TrieCreate();
    
g_tNamePrefixes TrieCreate();
    
g_aFlagPrefixes ArrayCreate(FLAG_PREFIX_INFO);
    
    new 
file fopen(file_name"rt");
    
    if(
file) {
        new 
text[128], type[6], auth[32], prefix[PREFIX_MAX_LENGTH COLOR_BUFFER], prefix_info[FLAG_PREFIX_INFO];
        while(!
feof(file)) {
            
fgets(filetextcharsmax(text));
            
parse(texttypecharsmax(type), authcharsmax(auth), prefixcharsmax(prefix));
            
            if(!
type[0] || type[0] == ';' || !auth[0] || !prefix[0]) continue;
            
            
replace_color_tag(prefix);
            
            switch(
type[0]) {
                
//steam
                
case 's': {
                    
TrieSetString(g_tSteamPrefixesauthprefix);
                    
g_iTrieSteamSize++;
                }
                
//name
                
case 'n': {
                    
TrieSetString(g_tNamePrefixesauthprefix);
                    
g_iTrieNameSize++;
                }
                
//flag
                
case 'f': {
                    
prefix_info[m_Flag] = read_flags(auth);
                    
copy(prefix_info[m_Prefix], charsmax(prefix_info[m_Prefix]), prefix);
                    
ArrayPushArray(g_aFlagPrefixesprefix_info);
                    
g_iArrayFlagSize++;
                }
            }
        }
        
fclose(file);
    }
}

public 
plugin_natives()
{
    
register_native("cm_set_player_message""native_set_player_message");

    
register_native("cm_set_prefix""native_set_prefix");
    
register_native("cm_get_prefix""native_get_prefix");
    
register_native("cm_reset_prefix""native_reset_prefix");
}
public 
native_set_player_message(pluginparams)
{
    
enum arg_new_message };
    
get_string(arg_new_messageg_sNewMessagecharsmax(g_sNewMessage));
}

public 
native_set_prefix(pluginparams)
{
    
enum 
        
arg_player 1,
        
arg_prefix
    
};

    
CHECK_NATIVE_ARGS_NUM(paramsarg_prefix0)
    new 
player get_param(arg_player);
    
CHECK_NATIVE_PLAYER(player0)

    
get_string(arg_prefixg_sPlayerPrefix[player], charsmax(g_sPlayerPrefix[]));
    
g_bCustomPrefix[player] = true;
    return 
1;
}
public 
native_get_prefix(pluginparams)
{
    
enum {
        
arg_player 1,
        
arg_dest,
        
arg_length
    
};
    
    
CHECK_NATIVE_ARGS_NUM(paramsarg_length0)
    new 
player get_param(arg_player);
    
CHECK_NATIVE_PLAYER(player0)

    if (!
g_bCustomPrefix[player]) {
        return 
0;
    }

    return 
set_string(arg_destg_sPlayerPrefix[player], get_param(arg_length));
}
public 
native_reset_prefix(pluginparams)
{
    
enum arg_player };

    
CHECK_NATIVE_ARGS_NUM(paramsarg_player0)
    new 
player get_param(arg_player);
    
CHECK_NATIVE_PLAYER(player0)

    
arrayset(g_sPlayerPrefix[player], 0sizeof g_sPlayerPrefix[]);
    
g_bCustomPrefix[player] = false;
    return 
1;
}

public 
client_putinserver(id)
{
    
#if defined FUNCTION_TRANSLITE
    
g_bTranslite[id] = false;
    
#endif
    //UAC PREFIX
    
if (Prefix[id] == PREFIX_CHANGE) {
        
UAC_GetPlayerPrivilege(id);
        
setPrefix(id);
    }
    
//END
    
    
new steamid[32];
    
get_user_authid(idsteamidcharsmax(steamid));
    if(
g_iTrieSteamSize && TrieKeyExists(g_tSteamPrefixessteamid)) {
        
g_bCustomPrefix[id] = true;
        
TrieGetString(g_tSteamPrefixessteamidg_sPlayerPrefix[id], charsmax(g_sPlayerPrefix[]));
    }
}

public 
concmd__set_prefix(idlevelcid)
{
    if(!
cmd_access(idlevelcid2)) {
        return 
PLUGIN_HANDLED;
    }

    new 
szArg[32]; read_argv(1szArgcharsmax(szArg));
    new 
player cmd_target(idszArgCMDTARGET_ALLOW_SELF);
    
    if(!
player) {
        return 
PLUGIN_HANDLED;
    }
    
    new 
prefix[PREFIX_MAX_LENGTH COLOR_BUFFER];
    
read_argv(2prefixcharsmax(prefix));
    
replace_color_tag(prefix);
    
    
console_print(id"Changed prefix from '%s' to '%s'."g_sPlayerPrefix[player], prefix);
    
    
copy(g_sPlayerPrefix[player], charsmax(g_sPlayerPrefix[]), prefix);
    
g_bCustomPrefix[player] = g_sPlayerPrefix[player][0] != EOS true false;
    
    return 
PLUGIN_HANDLED;
}

#if defined FUNCTION_TRANSLITE
public clcmd__lang_change(id)
{
    
g_bTranslite[id] = !g_bTranslite[id];
    
CC_SendMessage(id"!w You changed language to !g%s!w."g_bTranslite[id] ? "rus" "eng");
    return 
PLUGIN_HANDLED;
}
#endif
public clcmd__say_handler(id)
{
    if (!
is_user_connected(id)) {
        return 
PLUGIN_HANDLED;
    }
    
    new 
message[TEXT_LENGTH];
    
    
read_argv(0messagecharsmax(message));
    new 
is_team_msg = (message[3] == '_');
    
    
read_args(messagecharsmax(message));
    
remove_quotes(message);
    
replace_wrong_simbols(message);
    
trim(message);
    
    if(!
message[0]) {
        return 
PLUGIN_HANDLED;
    }

    if(
message[0] == '/' || message[0] == '!') {
        return 
PLUGIN_HANDLED_MAIN;
    }
    
    new 
flagsname[32];
    
flags get_user_flags(id);
    
get_user_name(idnamecharsmax(name));
    

    if(!
g_bCustomPrefix[id]) {
        if(
g_iTrieNameSize && TrieKeyExists(g_tNamePrefixesname)) {
            
TrieGetString(g_tNamePrefixesnameg_sPlayerPrefix[id], charsmax(g_sPlayerPrefix[]));
        } else if(
g_iArrayFlagSize) {
            new 
prefix_info[FLAG_PREFIX_INFO], bFoundPrefix false;
            for(new 
ig_iArrayFlagSizei++) {
                
ArrayGetArray(g_aFlagPrefixesiprefix_info);
                if(
check_flags(flagsprefix_info[m_Flag])) {
                    
bFoundPrefix true;
                    
copy(g_sPlayerPrefix[id], charsmax(g_sPlayerPrefix[]), prefix_info[m_Prefix]);
                    break;
                }
            }
            
            if(!
bFoundPrefix) {
                
g_sPlayerPrefix[id] = "";
            }
        }
    }

    
    
#if defined FUNCTION_TRANSLITE
    
if(g_bTranslite[id]) {
        if(
message[0] == '/') {
            
copy(messagecharsmax(message), message[1]);
        } else {
            new 
translited[TEXT_LENGTH];
            
translite_string(translitedcharsmax(translited), message);
            
copy(messagecharsmax(message), translited);
        }
    }
    
#endif
    
    
new retExecuteForward(g_iForwards[SEND_MESSAGE], retidmessageis_team_msg);

    if(
ret) {
        if(
ret == MESSAGE_BLOCKED) {
            return 
PLUGIN_HANDLED;
        }
        
copy(messagecharsmax(message), g_sNewMessage);
    }

    if(!
message[0]) {
        return 
PLUGIN_HANDLED;
    }

    new 
name_color flags ADMIN_FLAG ADMIN_NAME_COLOR PLAYER_NAME_COLOR;
    new 
chat_color flags ADMIN_FLAG ADMIN_CHAT_COLOR PLAYER_CHAT_COLOR;
    
    new 
time_code[16];
    
get_time("[%H:%M:%S] "time_codecharsmax(time_code));
    
    new 
is_sender_alive is_user_alive(id);
    new 
CsTeams:sender_team cs_get_user_team(id);
    
    new 
channel get_user_text_channel(is_sender_aliveis_team_msgsender_team);
    
    
FormatMessage(idsender_teamchannelname_colorchat_colortime_codenamemessage);
    
    
//Function All chat 
    
new players[32], players_numplayeris_player_aliveCsTeams:player_teamplayer_flags;
    
get_players(playersplayers_num"ch");
    
    for(new 
iplayers_numi++) {
        
player players[i];
        
        if(
player == id) {
            continue;
        }
        
        
is_player_alive is_user_alive(player);
        
player_team cs_get_user_team(player);
        
player_flags get_user_flags(player) & ADMIN_FLAG ADMIN_CHAT_FLAGS PLAYER_CHAT_FLAGS;
        
        if(
player_flags ALIVE_SEE_DEAD && !is_sender_alive && is_player_alive && (!is_team_msg || is_team_msg && sender_team == player_team//flag ALIVE_SEE_DEAD
        
|| player_flags DEAD_SEE_ALIVE && is_sender_alive && !is_player_alive && (!is_team_msg || is_team_msg && sender_team == player_team//flag DEAD_SEE_ALIVE
        
|| player_flags TEAM_SEE_TEAM && is_team_msg && sender_team != player_team//flag TEAM_SEE_TEAM
        
{
            
emessage_begin(MSG_ONEg_SayText_player);
            
ewrite_byte(id);
            
ewrite_string(g_TextChannels[channel]);
            
ewrite_string("");
            
ewrite_string("");
            
emessage_end();
        }
    }
    
    
#if defined FUNCTION_LOG_MESSAGES
    
static const team_color[CsTeams][] = {"gray""red""blue""gray"};
    new 
log_msg[256];
    
formatex(log_msgcharsmax(log_msg), "<br><font color=black>%s %s %s <font color=%s><b>%s</b> </font>:</font><font color=%s> %s </font>"time_codeis_sender_alive "" : (_:sender_team == || _:sender_team == "*DEAD*" "*SPEC*"), is_team_msg "(TEAM)" ""team_color[sender_team], namechat_color == GREEN "green" "#FFB41E"message);
    
write_file(g_szLogFilelog_msg);
    
#endif
    
    
return PLUGIN_CONTINUE;
}
public 
FormatMessage(senderCsTeams:sender_teamchannelname_colorchat_colortime_code[], name[], message[])
{
    new 
text[MESSAGE_LENGTH], len 1;
    
text[0] = PRETEXT_COLOR;
    
    if(
channel 2) {
        
len += formatex(text[len], charsmax(text) - len"%s"channel != "*DEAD*" "*SPEC*");
    }
    
    if(
channel && channel 7) {
        
len += formatex(text[len], charsmax(text) - len"%s "TEAM_NAMES[sender_team]);
    } else if(
channel) {
        
len += formatex(text[len], charsmax(text) - len" ");
    }
    
    
#if defined FUNCTION_ADD_TIME_CODE
    
len += formatex(text[len], charsmax(text) - len"%s"time_code);
    
#endif
    
    #if defined FUNCTION_AES_TAGS
    
new data[4], szAesTag[AES_MAX_LENGTH]; aes_get_player_stats(senderdata); aes_get_level_name(data[1], szAesTagcharsmax(szAesTag));
    
len += formatex(text[len], charsmax(text) - lenAES_TAG_FORMATszAesTag);
    
#endif
    
    
len += formatex(text[len], charsmax(text) - len"%s"g_sPlayerPrefix[sender]);
    
    
len += formatex(text[len], charsmax(text) - len"%c%s: %c%s"name_colornamechat_colormessage);
    
    
copy(g_sMessagecharsmax(g_sMessage), text);
}
public 
message__say_text(msgiddestreceiver)
{
    if(
get_msg_args() != 4) {
        return 
PLUGIN_CONTINUE;
    }
    
    new 
str2[22], channel;

    
get_msg_arg_string(2str2charsmax(str2));
    
channel get_msg_channel(str2);
    
    if(!
channel) {
        return 
PLUGIN_CONTINUE;
    }
    
    new 
str3[2];
    
get_msg_arg_string(3str3charsmax(str3));
    
    if(
str3[0]) {
        return 
PLUGIN_CONTINUE;
    }
    
    
set_msg_arg_string(2"#Spec_PlayerItem");

    
set_msg_arg_string(3g_sMessage);
    
set_msg_arg_string(4"");
    
    return 
PLUGIN_CONTINUE;
}
get_msg_channel(str[])
{
    for(new 
isizeof(g_TextChannels); i++) {
        if(
equal(strg_TextChannels[i])) {
            return 
1;
        }
    }
    return 
0;
}
stock get_user_text_channel(is_sender_aliveis_team_msgCsTeams:sender_team)
{
    if (
is_team_msg) {
        switch(
sender_team) {
            case 
CS_TEAM_T: {
                return 
is_sender_alive 3;
            }
            case 
CS_TEAM_CT: {
                return 
is_sender_alive 5;
            }
            default: {
                return 
6;
            }
        }
    }
    return 
is_sender_alive : (sender_team == CS_TEAM_SPECTATOR 1);
}
stock replace_wrong_simbols(string[])
{
    new 
len 0;
    for(new 
istring[i] != EOSi++) {
        if(
/* string[i] == '%' || string[i] == '#' || */ 0x01 <= string[i] <= 0x04) {
            continue;
        }
        
string[len++] = string[i];
    }
    
string[len] = EOS;
}

replace_color_tag(string[])
{
    new 
len 0;
    for (new 
istring[i] != EOSi++) {
        if (
string[i] == '!') {
            switch (
string[++i]) {
                case 
'd'string[len++] = 0x01;
                case 
't'string[len++] = 0x03;
                case 
'g'string[len++] = 0x04;
                case 
'w'string[len++] = 0x05;
                case 
EOS: break;
                default: 
string[len++] = string[i];
            }
        } else {
            
string[len++] = string[i];
        }
    }
    
string[len] = EOS;
}

stock translite_string(string[], sizesource[])
{
    static const 
table[][] = {
        
"Э""#"";""%""?""э""("")""*""+""б""-""ю"".""0""1""2""3""4",
        
"5""6""7""8""9""Ж""ж""Б""=""Ю"",""^"", "&#1060;", "И", "С", "В", "У", "А", "П",
        
"Р""Ш""О""Л""Д""Ь""Т""Щ""З""Й""К""Ы""Е""Г""М""Ц""Ч""Н""Я",
        
"х""\", "&#1098;", ":", "_", "ё", "ф", "и", "с", "в", "у", "а", "п", "р", "ш", "о", "л", "д", "ь",
        
"т""щ""з""й""к""ы""е""г""м""ц""ч""н""я""Х""/""Ъ""Ё"
    
};
    
    new 
len 0;
    for (new 
0source[i] != EOS && len sizei++) {
        new 
ch source[i];
        
        if (
'"' <= ch <= '~') {
            
ch -= '"';
            
string[len++] = table[ch][0];
            if (
table[ch][1] != EOS) {
                
string[len++] = table[ch][1];
            }
        } else {
            
string[len++] = ch;
        }
    }
    
string[len] = EOS;
    
    return 
len;
}
stock check_flags(flagsneed_flags)
{
    return ((
flags need_flags) == need_flags) ? 0;
}
stock is_user_steam(id)
{
    static 
dp_pointer;
    if(
dp_pointer || (dp_pointer get_cvar_pointer("dp_r_id_provider"))) {
        
server_cmd("dp_clientinfo %d"id); server_exec();
        return (
get_pcvar_num(dp_pointer) == 2) ? true false;
    }
    return 
false;
}
//UAC PREFIX
setPrefix(const id) {
    switch (
Prefix[id]) {
        case 
PREFIX_CHANGE: {
            new 
prefix[UAC_MAX_PREFIX_LENGTH];
            
UAC_GetPrefix(prefixcharsmax(prefix));
            
cm_set_prefix(idfmt("^4[%s] "prefix));
            
Prefix[id] = PREFIX_CHANGED;
        }

        case 
PREFIX_RESET: {
            
cm_reset_prefix(id);
            
Prefix[id] = PREFIX_NONE;
        }
    }
    
}

#if defined FUNCTION_BLACK_LIST
LoadBlackList()
{
    
g_aBlackList ArrayCreate(641);

    new 
file_path[128]; get_localinfo("amxx_configsdir"file_pathcharsmax(file_path));
    
format(file_pathcharsmax(file_path), "%s/%s"file_pathFILE_BLACK_LIST);

    new 
file fopen(file_path"rt");

    if(
file)
    {
        new 
buffer[64], wchar[64];
        while(!
feof(file))
        {
            
fgets(filebuffercharsmax(buffer));
            
trim(buffer); remove_quotes(buffer);

            if(!
buffer[0] || buffer[0] == ';' || strlen(buffer) < 3) continue;

            
normalize_string(buffer);
            
multibyte_to_wchar(bufferwchar);
            
wchar_tolower_rus(wchar);
            
wchar_to_multibyte(wcharbuffer);

            
ArrayPushString(g_aBlackListbuffer);
            
g_iBlackListSize++;
        }
        
fclose(file);
    }
}
#endif // FUNCTION_BLACK_LIST

#if defined FUNCTION_BLOCK_ADVERTISING
LoadWhiteList()
{
    
g_aWhiteListIp ArrayCreate(IP_LEN1);
    
g_aWhiteListDomain ArrayCreate(DOMAIN_LEN1);

    new 
file_path[128]; get_localinfo("amxx_configsdir"file_pathcharsmax(file_path));
    
format(file_pathcharsmax(file_path), "%s/%s"file_pathFILE_WHITE_LIST);

    new 
file fopen(file_path"rt");

    
enum
    
{
        
READ_NON,
        
READ_DOMAIN,
        
READ_IP
    
};

    if(
file)
    {
        new 
buffer[64], type READ_NON;
        while(!
feof(file))
        {
            
fgets(filebuffercharsmax(buffer));
            
trim(buffer); remove_quotes(buffer);

            if(!
buffer[0] || buffer[0] == ';') continue;

            if(
contain(buffer"[ips]") > -1)
            {
                
type READ_IP;
                continue;
            }
            if(
contain(buffer"[domains]") > -1)
            {
                
type READ_DOMAIN;
                continue;
            }

            if(
type)
            {
                
ArrayPushString(type == READ_IP g_aWhiteListIp g_aWhiteListDomainbuffer);
            }
        }
        
fclose(file);

        
g_iWhiteListIpSize ArraySize(g_aWhiteListIp);
        
g_iWhiteListDomainSize ArraySize(g_aWhiteListDomain);
    }
}
#endif // FUNCTION_BLOCK_ADVERTISING


public client_connect(id)
{
    
g_fLastMsgTime[id] = 0.0;
    
g_iWarnings[id] = 0;
    
g_fBlockTime[id] = 0.0;

    
#if defined FUNCTION_BLOCK_IDENTICAL_MSG
    
g_iRepeatWarn[id] = 0;
    
#endif // FUNCTION_BLOCK_IDENTICAL_MSG
}

public 
cm_player_send_message(idmessage[])
{
    new 
Float:gametime get_gametime();

    if(
gametime g_fBlockTime[id])
    {
        return 
MESSAGE_BLOCKED;
    }

    if(
gametime g_fLastMsgTime[id] + MIN_MESSAGE_DELAY)
    {
        
CC_SendMessage(id"!wStop spamming!");
        
add_warning(id);
        return 
MESSAGE_BLOCKED;
    }
    
g_fLastMsgTime[id] = gametime;

    
#if defined FUNCTION_BLOCK_IDENTICAL_MSG
    
if(equal(messageg_sLastMessage[id]))
    {
        if(++
g_iRepeatWarn[id] >= MAX_IDENTICAL_MESSAGES)
        {
            
CC_SendMessage(id"!wIdentical message.");
            
add_warning(id);
            return 
MESSAGE_BLOCKED;
        }
    }
    else if(
g_iRepeatWarn[id])
    {
        
g_iRepeatWarn[id]--;
    }
    
copy(g_sLastMessage[id], charsmax(g_sLastMessage[]), message);
    
#endif // FUNCTION_BLOCK_IDENTICAL_MSG

    #if defined FUNCTION_BLOCK_CAPS
    
static _wchar_msg[128];

    
normalize_string(message);
    
multibyte_to_wchar(message_wchar_msg);

    new 
iuppercase;
    while(
_wchar_msg[i])
    {
        if(
wchar_is_uppercase(_wchar_msg[i]))
            
uppercase++;
        
i++;
    }

    if(
uppercase 100.0 >= MAX_CAPS_PERCENT)
    {
        
CC_SendMessage(id"!wDo not use caps-lock when writing");
        
add_warning(id);
        return 
MESSAGE_BLOCKED;
    }
    
#endif // FUNCTION_BLOCK_CAPS

    #if defined FUNCTION_BLOCK_ADVERTISING
    
static temp[128];
    new 
ret;
    
// TODO: Add white list
    
if(regex_match_c(messageg_rIpPatternret))
    {
        
copy(tempcharsmax(temp), message);
        for(new 
iwhiteip[IP_LEN]; g_iWhiteListIpSizei++)
        {
            
ArrayGetString(g_aWhiteListIpiwhiteipcharsmax(whiteip));
            while(
replace(tempcharsmax(temp), whiteip"")){}
        }

        if(
regex_match_c(tempg_rIpPatternret))
        {
            
CC_SendMessage(id"!rIP's are not allowed!");
            
add_warning(id);
            return 
MESSAGE_BLOCKED;
        }
    }
    if(
regex_match_c(messageg_rDomainPatternret))
    {
        
copy(tempcharsmax(temp), message);
        for(new 
iwhitedomain[DOMAIN_LEN]; g_iWhiteListDomainSizei++)
        {
            
ArrayGetString(g_aWhiteListDomainiwhitedomaincharsmax(whitedomain));
            while(
replace(tempcharsmax(temp), whitedomain"")){}
        }

        if(
regex_match_c(tempg_rDomainPatternret))
        {
            
CC_SendMessage(id"!rDomains are not allowed!");
            
add_warning(id);
            return 
MESSAGE_BLOCKED;
        }
    }

    
#endif // FUNCTION_BLOCK_ADVERTISING

    #if defined FUNCTION_BLACK_LIST
    
static new_message[128], wchar_msg[128], low_message[128];

    new 
changed false;

    
copy(new_messagecharsmax(new_message), message);
    
copy(low_messagecharsmax(low_message), message);

    
normalize_string(low_message);
    
multibyte_to_wchar(low_messagewchar_msg);
    
wchar_tolower_rus(wchar_msg);
    
wchar_to_multibyte(wchar_msglow_message);

    for(new 
ilenplaceword[64]; g_iBlackListSizei++)
    {
        
ArrayGetString(g_aBlackListiwordcharsmax(word));
        
len strlen(word);
        while((
place containi(low_messageword)) > -1)
        {
            
changed true;
            
replace_blocked_word(new_messagestrlen(new_message), placelen);
            
replace_blocked_word(low_messagestrlen(low_message), placelen);
        }
    }

    if(
changed)
    {
        
cm_set_player_message(new_message);
        return 
MESSAGE_CHANGED;
    }
    
#endif // FUNCTION_BLACK_LIST

    
return MESSAGE_IGNORED;
}

add_warning(id)
{
    if(++
g_iWarnings[id] >= MAX_WARNINGS_TO_BLOCK_CHAT)
    {
        
g_fBlockTime[id] = get_gametime() + BLOCK_CHAT_TIME;
        
g_iWarnings[id] = 0;
        
CC_SendMessage(id"!rBlocked from chat for %.0f seconds!"BLOCK_CHAT_TIME);
    }
    
//SendAudio(id, "sound/fvox/beep.wav", PITCH_NORM);
}

#if defined FUNCTION_BLACK_LIST
replace_blocked_word(string[], lengthstartword_length)
{

    for(new 
startstart 3i++)
    {
        
string[i] = '*';
    }
    if(
length 3)
    {
        new 
len start word_length;
        new 
diff word_length 3;
        while(
len <= length)
        {
            
string[len diff] = string[len];
            
len++;
        }
    }
}
#endif // FUNCTION_BLACK_LIST

stock normalize_string(str[])
{
    for (new 
istr[i] != EOSi++)
    {
        
str[i] &= 0xFF;
    }
}

stock wchar_tolower_rus(str[])
{
    for (new 
istr[i] != EOSi++)
    {
        if(
str[i] == 0x401)
        {
            
str[i] = 0x451;
        }
        else if(
0x410 <= str[i] <= 0x42F)
        {
            
str[i] += 0x20;
        }
    }
}

stock wchar_is_uppercase(ch)
{
    if(
0x41 <= ch <= 0x5A || ch == 0x401 || 0x410 <= ch <= 0x42F)
    {
        return 
true;
    }
    return 
false;
}

// Converts MultiByte (UTF-8) to WideChar (UTF-16, UCS-2)
// Supports only 1-byte, 2-byte and 3-byte UTF-8 (unicode chars from 0x0000 to 0xFFFF), because client can't display 2-byte UTF-16
// charsmax(wcszOutput) should be >= strlen(mbszInput)
stock multibyte_to_wchar(const mbszInput[], wcszOutput[]) {
    new 
nOutputChars 0;
    for (new 
0mbszInput[n] != EOSn++) {
        if (
mbszInput[n] < 0x80) { // 0... 1-byte ASCII
            
wcszOutput[nOutputChars] = mbszInput[n];
        } else if ((
mbszInput[n] & 0xE0) == 0xC0) { // 110... 2-byte UTF-8
            
wcszOutput[nOutputChars] = (mbszInput[n] & 0x1F) << 6// Upper 5 bits
            
            
if ((mbszInput[1] & 0xC0) == 0x80) { // Is 10... ?
                
wcszOutput[nOutputChars] |= mbszInput[++n] & 0x3F// Lower 6 bits
            
} else { // Decode error
                
wcszOutput[nOutputChars] = '?';
            }
        } else if ((
mbszInput[n] & 0xF0) == 0xE0) { // 1110... 3-byte UTF-8
            
wcszOutput[nOutputChars] = (mbszInput[n] & 0xF) << 12// Upper 4 bits
            
            
if ((mbszInput[1] & 0xC0) == 0x80) { // Is 10... ?
                
wcszOutput[nOutputChars] |= (mbszInput[++n] & 0x3F) << 6// Middle 6 bits
                
                
if ((mbszInput[1] & 0xC0) == 0x80) { // Is 10... ?
                    
wcszOutput[nOutputChars] |= mbszInput[++n] & 0x3F// Lower 6 bits
                
} else { // Decode error
                    
wcszOutput[nOutputChars] = '?';
                }
            } else { 
// Decode error
                
wcszOutput[nOutputChars] = '?';
            }
        } else { 
// Decode error
            
wcszOutput[nOutputChars] = '?';
        }
        
        
nOutputChars++;
    }
    
wcszOutput[nOutputChars] = EOS;
}

// Converts WideChar (UTF-16, UCS-2) to MultiByte (UTF-8)
// Supports only 1-byte UTF-16 (0x0000 to 0xFFFF), because client can't display 2-byte UTF-16
// charsmax(mbszOutput) should be >= wcslen(wcszInput) * 3
stock wchar_to_multibyte(const wcszInput[], mbszOutput[]) {
    new 
nOutputChars 0;
    for (new 
0wcszInput[n] != EOSn++) {
        if (
wcszInput[n] < 0x80) {
            
mbszOutput[nOutputChars++] = wcszInput[n];
        } else if (
wcszInput[n] < 0x800) {
            
mbszOutput[nOutputChars++] = (wcszInput[n] >> 6) | 0xC0;
            
mbszOutput[nOutputChars++] = (wcszInput[n] & 0x3F) | 0x80;
        } else {
            
mbszOutput[nOutputChars++] = (wcszInput[n] >> 12) | 0xE0;
            
mbszOutput[nOutputChars++] = ((wcszInput[n] >> 6) & 0x3F) | 0x80;
            
mbszOutput[nOutputChars++] = (wcszInput[n] & 0x3F) | 0x80;
        }
    }
    
mbszOutput[nOutputChars] = EOS;

/*
stock SendAudio(id, audio[], pitch)
{
    static msg_send_audio; if(!msg_send_audio) msg_send_audio = get_user_msgid("SendAudio");

    message_begin( id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msg_send_audio, _, id);
    write_byte(id);
    write_string(audio);
    write_short(pitch);
    message_end();
}
*/
//END 


georgik57 03-27-2020 15:02

Re: ^x05 White chat
 
use sender id 33 to have the team color shown as spectator/unassigned.


All times are GMT -4. The time now is 23:35.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.