Member
|
03-27-2020
, 11:56
^x05 White chat
|
#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 (%1 < %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 = (1 << 0); const DEAD_SEE_ALIVE = (1 << 1); const TEAM_SEE_TEAM = (1 << 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_tSteamPrefixes, g_iTrieSteamSize; new Trie:g_tNamePrefixes, g_iTrieNameSize; new Array:g_aFlagPrefixes, g_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(PLUGIN, VERSION, AUTHOR); 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_STOP, FP_CELL, FP_STRING, FP_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}", ret, error, charsmax(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)", ret, error, charsmax(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", date, charsmax(date)); //2020-Januari-12 formatex(g_szLogFile, charsmax(g_szLogFile), "%s/chatlog_%s.html", dir, date); 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", dir, charsmax(dir)); new file_name[128]; formatex(file_name, charsmax(file_name), "%s/%s", dir, FILE_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(file, text, charsmax(text)); parse(text, type, charsmax(type), auth, charsmax(auth), prefix, charsmax(prefix)); if(!type[0] || type[0] == ';' || !auth[0] || !prefix[0]) continue; replace_color_tag(prefix); switch(type[0]) { //steam case 's': { TrieSetString(g_tSteamPrefixes, auth, prefix); g_iTrieSteamSize++; } //name case 'n': { TrieSetString(g_tNamePrefixes, auth, prefix); 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_aFlagPrefixes, prefix_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(plugin, params) { enum { arg_new_message = 1 }; get_string(arg_new_message, g_sNewMessage, charsmax(g_sNewMessage)); }
public native_set_prefix(plugin, params) { enum { arg_player = 1, arg_prefix };
CHECK_NATIVE_ARGS_NUM(params, arg_prefix, 0) new player = get_param(arg_player); CHECK_NATIVE_PLAYER(player, 0)
get_string(arg_prefix, g_sPlayerPrefix[player], charsmax(g_sPlayerPrefix[])); g_bCustomPrefix[player] = true; return 1; } public native_get_prefix(plugin, params) { enum { arg_player = 1, arg_dest, arg_length }; CHECK_NATIVE_ARGS_NUM(params, arg_length, 0) new player = get_param(arg_player); CHECK_NATIVE_PLAYER(player, 0)
if (!g_bCustomPrefix[player]) { return 0; }
return set_string(arg_dest, g_sPlayerPrefix[player], get_param(arg_length)); } public native_reset_prefix(plugin, params) { enum { arg_player = 1 };
CHECK_NATIVE_ARGS_NUM(params, arg_player, 0) new player = get_param(arg_player); CHECK_NATIVE_PLAYER(player, 0)
arrayset(g_sPlayerPrefix[player], 0, sizeof 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(id, steamid, charsmax(steamid)); if(g_iTrieSteamSize && TrieKeyExists(g_tSteamPrefixes, steamid)) { g_bCustomPrefix[id] = true; TrieGetString(g_tSteamPrefixes, steamid, g_sPlayerPrefix[id], charsmax(g_sPlayerPrefix[])); } }
public concmd__set_prefix(id, level, cid) { if(!cmd_access(id, level, cid, 2)) { return PLUGIN_HANDLED; }
new szArg[32]; read_argv(1, szArg, charsmax(szArg)); new player = cmd_target(id, szArg, CMDTARGET_ALLOW_SELF); if(!player) { return PLUGIN_HANDLED; } new prefix[PREFIX_MAX_LENGTH + COLOR_BUFFER]; read_argv(2, prefix, charsmax(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(0, message, charsmax(message)); new is_team_msg = (message[3] == '_'); read_args(message, charsmax(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 flags, name[32]; flags = get_user_flags(id); get_user_name(id, name, charsmax(name));
if(!g_bCustomPrefix[id]) { if(g_iTrieNameSize && TrieKeyExists(g_tNamePrefixes, name)) { TrieGetString(g_tNamePrefixes, name, g_sPlayerPrefix[id], charsmax(g_sPlayerPrefix[])); } else if(g_iArrayFlagSize) { new prefix_info[FLAG_PREFIX_INFO], bFoundPrefix = false; for(new i; i < g_iArrayFlagSize; i++) { ArrayGetArray(g_aFlagPrefixes, i, prefix_info); if(check_flags(flags, prefix_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(message, charsmax(message), message[1]); } else { new translited[TEXT_LENGTH]; translite_string(translited, charsmax(translited), message); copy(message, charsmax(message), translited); } } #endif new ret; ExecuteForward(g_iForwards[SEND_MESSAGE], ret, id, message, is_team_msg);
if(ret) { if(ret == MESSAGE_BLOCKED) { return PLUGIN_HANDLED; } copy(message, charsmax(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_code, charsmax(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_alive, is_team_msg, sender_team); FormatMessage(id, sender_team, channel, name_color, chat_color, time_code, name, message); //Function All chat new players[32], players_num, player, is_player_alive, CsTeams:player_team, player_flags; get_players(players, players_num, "ch"); for(new i; i < players_num; i++) { 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_ONE, g_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_msg, charsmax(log_msg), "<br><font color=black>%s %s %s <font color=%s><b>%s</b> </font>:</font><font color=%s> %s </font>", time_code, is_sender_alive ? "" : (_:sender_team == 1 || _:sender_team == 2 ? "*DEAD*" : "*SPEC*"), is_team_msg ? "(TEAM)" : "", team_color[sender_team], name, chat_color == GREEN ? "green" : "#FFB41E", message); write_file(g_szLogFile, log_msg); #endif return PLUGIN_CONTINUE; } public FormatMessage(sender, CsTeams:sender_team, channel, name_color, chat_color, time_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 != 7 ? "*DEAD*" : "*SPEC*"); } if(channel > 1 && 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(sender, data); aes_get_level_name(data[1], szAesTag, charsmax(szAesTag)); len += formatex(text[len], charsmax(text) - len, AES_TAG_FORMAT, szAesTag); #endif len += formatex(text[len], charsmax(text) - len, "%s", g_sPlayerPrefix[sender]); len += formatex(text[len], charsmax(text) - len, "%c%s: %c%s", name_color, name, chat_color, message); copy(g_sMessage, charsmax(g_sMessage), text); } public message__say_text(msgid, dest, receiver) { if(get_msg_args() != 4) { return PLUGIN_CONTINUE; } new str2[22], channel;
get_msg_arg_string(2, str2, charsmax(str2)); channel = get_msg_channel(str2); if(!channel) { return PLUGIN_CONTINUE; } new str3[2]; get_msg_arg_string(3, str3, charsmax(str3)); if(str3[0]) { return PLUGIN_CONTINUE; } set_msg_arg_string(2, "#Spec_PlayerItem");
set_msg_arg_string(3, g_sMessage); set_msg_arg_string(4, ""); return PLUGIN_CONTINUE; } get_msg_channel(str[]) { for(new i; i < sizeof(g_TextChannels); i++) { if(equal(str, g_TextChannels[i])) { return i + 1; } } return 0; } stock get_user_text_channel(is_sender_alive, is_team_msg, CsTeams:sender_team) { if (is_team_msg) { switch(sender_team) { case CS_TEAM_T: { return is_sender_alive ? 2 : 3; } case CS_TEAM_CT: { return is_sender_alive ? 4 : 5; } default: { return 6; } } } return is_sender_alive ? 0 : (sender_team == CS_TEAM_SPECTATOR ? 7 : 1); } stock replace_wrong_simbols(string[]) { new len = 0; for(new i; string[i] != EOS; i++) { 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 i; string[i] != EOS; i++) { 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[], size, source[]) { static const table[][] = { "Э", "#", ";", "%", "?", "э", "(", ")", "*", "+", "б", "-", "ю", ".", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "Ж", "ж", "Б", "=", "Ю", ",", "^"", "Ф", "И", "С", "В", "У", "А", "П", "Р", "Ш", "О", "Л", "Д", "Ь", "Т", "Щ", "З", "Й", "К", "Ы", "Е", "Г", "М", "Ц", "Ч", "Н", "Я", "х", "\", "ъ", ":", "_", "ё", "ф", "и", "с", "в", "у", "а", "п", "р", "ш", "о", "л", "д", "ь", "т", "щ", "з", "й", "к", "ы", "е", "г", "м", "ц", "ч", "н", "я", "Х", "/", "Ъ", "Ё" }; new len = 0; for (new i = 0; source[i] != EOS && len < size; i++) { 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(flags, need_flags) { return ((flags & need_flags) == need_flags) ? 1 : 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(prefix, charsmax(prefix)); cm_set_prefix(id, fmt("^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(64, 1);
new file_path[128]; get_localinfo("amxx_configsdir", file_path, charsmax(file_path)); format(file_path, charsmax(file_path), "%s/%s", file_path, FILE_BLACK_LIST);
new file = fopen(file_path, "rt");
if(file) { new buffer[64], wchar[64]; while(!feof(file)) { fgets(file, buffer, charsmax(buffer)); trim(buffer); remove_quotes(buffer);
if(!buffer[0] || buffer[0] == ';' || strlen(buffer) < 3) continue;
normalize_string(buffer); multibyte_to_wchar(buffer, wchar); wchar_tolower_rus(wchar); wchar_to_multibyte(wchar, buffer);
ArrayPushString(g_aBlackList, buffer); g_iBlackListSize++; } fclose(file); } } #endif // FUNCTION_BLACK_LIST
#if defined FUNCTION_BLOCK_ADVERTISING LoadWhiteList() { g_aWhiteListIp = ArrayCreate(IP_LEN, 1); g_aWhiteListDomain = ArrayCreate(DOMAIN_LEN, 1);
new file_path[128]; get_localinfo("amxx_configsdir", file_path, charsmax(file_path)); format(file_path, charsmax(file_path), "%s/%s", file_path, FILE_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(file, buffer, charsmax(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_aWhiteListDomain, buffer); } } 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(id, message[]) { 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(message, g_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 i, uppercase; while(_wchar_msg[i]) { if(wchar_is_uppercase(_wchar_msg[i])) uppercase++; i++; }
if(uppercase * 100.0 / i >= 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(message, g_rIpPattern, ret)) { copy(temp, charsmax(temp), message); for(new i, whiteip[IP_LEN]; i < g_iWhiteListIpSize; i++) { ArrayGetString(g_aWhiteListIp, i, whiteip, charsmax(whiteip)); while(replace(temp, charsmax(temp), whiteip, "")){} }
if(regex_match_c(temp, g_rIpPattern, ret)) { CC_SendMessage(id, "!rIP's are not allowed!"); add_warning(id); return MESSAGE_BLOCKED; } } if(regex_match_c(message, g_rDomainPattern, ret)) { copy(temp, charsmax(temp), message); for(new i, whitedomain[DOMAIN_LEN]; i < g_iWhiteListDomainSize; i++) { ArrayGetString(g_aWhiteListDomain, i, whitedomain, charsmax(whitedomain)); while(replace(temp, charsmax(temp), whitedomain, "")){} }
if(regex_match_c(temp, g_rDomainPattern, ret)) { 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_message, charsmax(new_message), message); copy(low_message, charsmax(low_message), message);
normalize_string(low_message); multibyte_to_wchar(low_message, wchar_msg); wchar_tolower_rus(wchar_msg); wchar_to_multibyte(wchar_msg, low_message);
for(new i, len, place, word[64]; i < g_iBlackListSize; i++) { ArrayGetString(g_aBlackList, i, word, charsmax(word)); len = strlen(word); while((place = containi(low_message, word)) > -1) { changed = true; replace_blocked_word(new_message, strlen(new_message), place, len); replace_blocked_word(low_message, strlen(low_message), place, len); } }
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[], length, start, word_length) {
for(new i = start; i < start + 3; i++) { 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 i; str[i] != EOS; i++) { str[i] &= 0xFF; } }
stock wchar_tolower_rus(str[]) { for (new i; str[i] != EOS; i++) { 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 n = 0; mbszInput[n] != EOS; n++) { 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[n + 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[n + 1] & 0xC0) == 0x80) { // Is 10... ? wcszOutput[nOutputChars] |= (mbszInput[++n] & 0x3F) << 6; // Middle 6 bits if ((mbszInput[n + 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 n = 0; wcszInput[n] != EOS; n++) { 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.
|
|