Настройки: |
//При коннекте игрока с "плохим" ником на сервер |
//0 - пустить игрока на сервер |
//1 - убрать из ника запрещенные части |
//2 - кикнуть игрока |
bn_in 1 |
//Проверка смены ника во время игры |
//0 - не делать проверку |
//1 - просто болкировать изменение ника, если он содержит запрещенную часть |
//2 - проверять и если ник "плохой" убарать из ника запрещенные части |
//3 - блокировать любое изменение ника |
bn_block_change 2 |
//Блокировка повторений символов в нике |
//Максимальное количество разрешенных повторений символов |
//минимум 2 |
//0 - отключает проверку |
bn_retry 3 |
//Блокировка коротких ников (полезно для бана по нику) |
//Минимальная длина ника |
//0 - отключает проверку |
bn_short 0 |
//Добавляется когда ник короткий (если стоит ограничение по длине ника) |
//если будет меньше 2х символов добавиться (short nick) |
bn_change (short nick) |
//Проверка на наличие IP адреса в нике |
bn_ip 1 |
//Уровень доступа для админов |
//0 - использовать общие правила ограничений по нику |
//1 - разрешить все (применимо только при авторизации админа по STEAMID или по IP, |
// т.к. при авторизации по логину/паролю со сменой ника теряются права доступа!) |
bn_admin 1 |
//флаг доступа админов |
bn_admin_flag a |
//Уровень доступа соклановцев |
//0 - использовать общие правила ограничений по нику |
//1 - разрешить любое изменение ника соклановцам (применимо только при авторизации соклановца по STEAMID или по IP, |
// т.к. при авторизации по логину/паролю со сменой ника теряются права доступа!) |
bn_clan 1 |
//Флаг доступа для соклановцев |
bn_clan_flag m |
//Выводить, во время игры, сообщения игроку о блокировке ника |
//0 - не выводить сообщения |
//1 - в чат |
//2 - HUD сообщение |
//3 - в чат и HUD сообщения |
bn_message 3 |
//цвет HUD сообщения |
//0 - синий |
//1 - красный |
//2 - зеленый |
bn_hud_color 2 |
//цвет сообщения в чате |
//0 - желтый |
//1 - по цвету команды |
//2 - зеленый |
//3 - обычное сообщение (может понадобиться для совместимости с плагинами работающие с чатом, при этом ник тоже не "красится") |
bn_text_color 2 |
//цвет ников в чате |
//0 - желтый |
//1 - по цвету команды |
//2 - зеленый |
bn_name_color 1 |
//Записывать события в лог файл |
//0 - нет |
//1 - да |
bn_log 1 |
//////////////////////////////////////////////////
// Название: Плохой ник (Bad nick) //
// Версия : 2.0 //
// Автор: termitok //
//////////////////////////////////////////////////
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#define PLUGIN "Bad nick"
#define VERSION "2.0"
#define AUTHOR "termitok"
new Array: badnick
new Array: reason
new Array: nickReason
new nickCnt
new reasonCnt
new checknick[32], badn[256], badm[256]
new const g_name[] = "name"
new cv_in
new cv_change
new cv_block_change
new cv_retry
new cv_short
new cv_ip
new cv_admin
new cv_admin_flag
new cv_clan
new cv_clan_flag
new cv_message
new cv_hud_color
new cv_text_color
new cv_name_color
new cv_log
new view
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_forward(FM_ClientUserInfoChanged, "fwClientUserInfoChanged")
register_dictionary("bad_nick.txt")
cv_in = register_cvar("bn_in","1")
cv_change = register_cvar("bn_change","[BN]")
cv_block_change = register_cvar("bn_block_change","1")
cv_retry = register_cvar("bn_retry","3")
cv_short = register_cvar("bn_short","4")
cv_ip = register_cvar("bn_ip","1")
cv_admin = register_cvar("bn_admin","1")
cv_admin_flag = register_cvar("bn_admin_flag","a")
cv_clan = register_cvar("bn_active_clan","1")
cv_clan_flag = register_cvar("bn_clan_flag","m")
cv_message = register_cvar("bn_message","2")
cv_hud_color = register_cvar("bn_hud_color","2")
cv_text_color = register_cvar("bn_text_color","2")
cv_name_color = register_cvar("bn_name_color","1")
cv_log = register_cvar("bn_log","1")
view = get_user_msgid("SayText")
}
//считывает запрещенные ники из файла bad_nick.ini и заносит их в массив
public plugin_cfg()
{
new DIR[64]
format(DIR, sizeof(DIR)-1, "addons/amxmodx/configs/bad_nick")
server_cmd("exec %s/bad_nick.cfg", DIR)
server_exec()
//задание массивов и переменных
badnick = ArrayCreate(32)
reason = ArrayCreate(32)
nickReason = ArrayCreate(1)
ArrayPushString(reason,"CHANGE_NICK")
ArrayPushString(reason,"CHANGE_NICK_0")
ArrayPushString(reason,"CHANGE_NICK_1")
ArrayPushString(reason,"CHANGE_NICK_2")
ArrayPushString(reason,"SHORT_NICK")
ArrayPushString(reason,"REPETITION_SYMBOLS")
ArrayPushString(reason,"BAD_IP")
nickCnt=0; reasonCnt=7;
//считывает данные о запрещенных никах из файлов
new dr, fileName[32]
dr = open_dir(DIR, fileName, sizeof(fileName)-1)
if (dr)
{
while (next_file(dr, fileName, sizeof(fileName)-1))
{
new lenFileName = strlen(fileName)
if (lenFileName > 4 && equali(fileName[lenFileName - 4], ".ini", 4))
{
new line=0, way[64], buffer[32], textsize
format(way, sizeof(way)-1, "%s/%s", DIR,fileName)
fileName[lenFileName-4] = '^0';
ArrayPushString(reason, fileName)
if (file_exists(way))
{
line=0
while(read_file(way,line,buffer,sizeof(buffer)-1,textsize))
{
if(buffer[0] && containi(buffer,"//")<0 && buffer[0]!=';')
{
ArrayPushString(badnick, buffer)
ArrayPushCell(nickReason, reasonCnt)
nickCnt++
}
line++
}
}
reasonCnt++
}
}
close_dir(dr);
}
}
//проверка ника при заходе на сервер
public client_connect(id)
{
set_task(2.0, "client_in", id)
}
public client_in(id)
{
//0 - пустить игрока на сервер in=0
new in=get_pcvar_num(cv_in)
if (is_user_hltv(id) || is_user_bot(id) || in==0) return PLUGIN_CONTINUE
new nick[32]
get_user_name(id, nick, sizeof(nick) - 1)
checknick=nick
new kp=false
//1 - убрать из ника запрещенные части
if(in==1)
{
new k=nick_check_clear(id)
if(k>0)
{
new bad[256], badf[32]
ArrayGetString(reason, k, bad, sizeof(bad)-1)
format(bad,sizeof(bad)-1,"%L", LANG_SERVER, bad)
ArrayGetString(reason, 2, badn, sizeof(badn)-1)
if(strlen(checknick)==0) badf="unnamed"
else badf=checknick
format(badm,sizeof(badm)-1,"%L %s", LANG_SERVER, badn, nick, badf, bad) //бесцветный
format(badn,sizeof(badn)-1,"%s %L %s", pc(2), LANG_SERVER, badn, cn(nick), cn(badf), bad)
client_cmd(id, "name ^"%s^"; setinfo name ^"%s^"", nick, checknick)
set_task(4.0,"print_bad", id)
kp=true
}
}
//2 - кикнуть игрока
if(in==2)
{
new k=nick_check(id,0)
if(k>0)
{
ArrayGetString(reason, k, badn, sizeof(badn)-1)
format(badn,sizeof(badn)-1,"%L", LANG_SERVER, badn)
ArrayGetString(reason, 0, badm, sizeof(badm)-1)
format(badm,sizeof(badm)-1,"%L", LANG_SERVER, badm)
format(badm,sizeof(badm)-1,"%s %s",badn, badm)
server_cmd("kick #%d ^"%s^"", get_user_userid(id), badm)
kp=true
}
}
if(kp) log_bad(id,nick)
return PLUGIN_HANDLED
}
//проверка изменения ника во время игрового процесса
public fwClientUserInfoChanged(id, buffer)
{
//0 - не делать проверку при block_change==0
new block_change=get_pcvar_num(cv_block_change)
if (!is_user_connected(id) || block_change==0) return FMRES_IGNORED
new nick[32]
get_user_name(id, nick, sizeof(nick) - 1)
engfunc(EngFunc_InfoKeyValue, buffer, g_name, checknick, sizeof(checknick) - 1)
if (equal(checknick, nick)) return FMRES_IGNORED
new bad[256], bool: kp=false, badf[32]
ArrayGetString(reason, block_change, bad, sizeof(bad)-1)
new checknick2[32]; checknick2=checknick;
//1 - просто болкировать изменение ника, если он содержит запрещенную часть
if(block_change==1)
{
new k=nick_check(id,0)
if(k>0)
{
ArrayGetString(reason, k, badn, sizeof(badn)-1)
format(badn,sizeof(badn)-1,"%L", LANG_SERVER, badn)
format(bad,sizeof(bad)-1,"%L", LANG_SERVER, bad)
format(badm,sizeof(badm)-1,"%s %s", bad, badn) //бесцветный
format(badn,sizeof(badn)-1,"%s %s %s %s", pc(2), bad, pc(1), badn)
checknick=nick
kp=true
}
}
//2 - проверять и если ник "плохой" убарать из ника запрещенные части
if(block_change==2)
{
new k=nick_check_clear(id)
if(k>0)
{
ArrayGetString(reason, k, badn, sizeof(badn)-1)
format(badn,sizeof(badn)-1,"%L", LANG_SERVER, badn)
if(strlen(checknick)==0) badf="unnamed"
else badf=checknick
format(badm, sizeof(badm)-1, "%L %s", LANG_SERVER, bad, checknick2, badf, badn) //бесцветный
format(badn, sizeof(badn)-1, "%s %L %s", pc(2), LANG_SERVER, bad, cn(checknick2), cn(badf), badn)
kp=true
}
}
//3 - блокировать любое изменение ника
if(block_change==3)
{
format(badm,sizeof(badm)-1,"%L", LANG_SERVER, bad) //бесцветный
format(badn,sizeof(badn)-1,"%s %L", pc(2), LANG_SERVER, bad)
checknick=nick
kp=true
}
if(kp)
{
if(block_change!=3) log_bad(id,checknick2)
print_bad(id)
engfunc(EngFunc_SetClientKeyValue, id, buffer, g_name, nick)
client_cmd(id, "name ^"%s^"; setinfo name ^"%s^"", nick, checknick)
}
return FMRES_SUPERCEDE
}
//ищет все запрещенные части в нике и удаляет их
nick_check_clear(id)
{
new kk=1, j=0, kkk=0
while(kk>0 && kk!=4 && j<30)
{
kk=nick_check(id,1)
if((kk>0 && kk!=4) || (kkk==0 && kk==4)) kkk=kk
j++
}
return kkk
}
//функция проверки
nick_check(id,kk)
{
//проверки на разрешения админа и соклановцев
new flag[2]
get_pcvar_string(cv_admin_flag, flag, sizeof(flag)-1)
if(has_flag(id,flag) && get_pcvar_num(cv_admin)==1) return 0
get_pcvar_string(cv_clan_flag, flag, sizeof(flag)-1)
if(has_flag(id,flag) && get_pcvar_num(cv_clan)==1) return 0
new lenNick=strlen(checknick)
new bad[32], kp
//проверка на наличие IP адреса в нике
if(get_pcvar_num(cv_ip)==1)
{
new i, kl, kc=0 , kt=0, kd=0
for(i=lenNick-1;i>=0;i--)
{
kl=checknick[i]-48
if(kl>=0 && kl<10)
{
kc++;kd++;
continue
}
if(kt>2 && kc>0)
{
del_bad(i+1,kd)
return 6
}
if((kl==-2 || kl==-4) && kc>0)
{
kc=0;kt++;kd++;
continue
}
kc=0;kt=0;kd=0;
}
if(kt>2)
{
del_bad(i+1,kd)
return 6
}
}
//проверка на повторение символов
new retry=get_pcvar_num(cv_retry)
if(retry==1) {set_pcvar_num(cv_retry,2); retry=2;}
if(retry>1)
{
new j=0
for (new i = 0; i < lenNick-1; i++)
{
if (checknick[i]==checknick[i+1] ) j++
else j=0
if(j==retry)
{
if(kk==1) del_bad(i,1)
return 5
}
}
}
//проверка на запрещенные ники
for (new i = 0; i < nickCnt; i++)
{
ArrayGetString(badnick, i,bad, sizeof(bad)-1)
kp=containi(checknick, bad)
if(kp!=-1)
{
if(kk==1) del_bad(kp,strlen(bad))
return ArrayGetCell(nickReason,i)
}
}
//проверка на длину ника
new short=get_pcvar_num(cv_short)
if(short>10) {set_pcvar_num(cv_short,10);short=10;}
if(lenNick<short)
{
if(kk==1)
{
get_pcvar_string(cv_change,bad,sizeof(bad)-1)
new lenbb=strlen(bad)
if(lenbb<2) {bad="(short nick)";lenbb=12;}
for(new i=0;i<short;i=i+lenbb)
{
format(checknick,sizeof(checknick)-1,"%s%s", checknick, bad)
}
}
return 4
}
return 0
}
//записывает события в лог файл
log_bad(id,nick[])
{
if(get_pcvar_num(cv_log)==0) return PLUGIN_CONTINUE
new authid[35], ip[35]
get_user_authid(id, authid, sizeof(authid) - 1)
get_user_ip(id, ip, sizeof(ip) - 1, 1)
log_to_file("addons/amxmodx/logs/bad_nick.log","%s <%s><%s> message: %s", nick, ip, authid, badm)
return PLUGIN_CONTINUE
}
//выводит сообщения на экран
public print_bad(id)
{
new message=get_pcvar_num(cv_message)
new text_color=get_pcvar_num(cv_text_color)
if(message!=2)
{
if(text_color<3)
{
message_begin(MSG_ONE, view, _, id)
write_byte(id)
write_string(badn)
message_end()
}
else
{
client_print(id, print_chat, "%s", badm)
}
}
if(message>1)
{
new chud[3]
new hud_color=get_pcvar_num(cv_hud_color)
if(hud_color==0) chud={0,0,255}
if(hud_color==1) chud={255,0,0}
if(hud_color==2) chud={0,255,0}
set_hudmessage(chud[0], chud[1], chud[2], -1.0, -1.0)
show_hudmessage(id, "%s",badm)
}
return PLUGIN_CONTINUE
}
//убирает запрещенную часть из ника
del_bad(left,lenbad)
{
new i
for(i=left+lenbad;i<strlen(checknick);i++)
{
checknick[i-lenbad]=checknick[i]
}
checknick[i-lenbad]= '^0'
return PLUGIN_CONTINUE
}
//формирование цвета ника в чате (color_nick)
cn(txt[])
{
new txt_n[256]
format(txt_n,strlen(txt)+9,"%s %s %s", pc(1), txt, pc(2))
return txt_n
}
//получение цвета ника или цвета сообщения(put_color)
pc(k)
{
new ctxt[4]="^x01"
new color
if(k==1) color=get_pcvar_num(cv_name_color)
if(k==2) color=get_pcvar_num(cv_text_color)
if(color==1) ctxt="^x03"
if(color==2) ctxt="^x04"
return ctxt
}