Raised This Month: $51 Target: $400
 12% 

^x05 White chat


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
DJBosma
Member
Join Date: Dec 2009
Old 03-27-2020 , 11:56   ^x05 White chat
Reply With Quote #1

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 

Last edited by DJBosma; 03-27-2020 at 14:43.
DJBosma is offline
georgik57
Veteran Member
Join Date: Oct 2008
Location: 🎧Music World
Old 03-27-2020 , 15:02   Re: ^x05 White chat
Reply With Quote #2

use sender id 33 to have the team color shown as spectator/unassigned.
__________________
georgik57 is offline
Send a message via MSN to georgik57 Send a message via Yahoo to georgik57 Send a message via Skype™ to georgik57
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 11:58.


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