Lite Translit

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
12
Реакции
5
Ошибка
Ошибка в том, что убрал с плагина скрытие в чате сообщения с слэшем "/"
После этого перестал работать /anew (просто не реагирует на команду)
В plugins.ini много раз менял местами, то вверх, то вниз и в середину.
Ничего не помогает, прошу вашей помощи
ОС
Linux
Билд
Protocol version 48 
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.4.0.653-dev
Build date: 18:30:05 May 13 2018 (1492)
Build from: https://github.com/dreamstalker/rehlds/commit/87a2d17
ReGamedll
ReGameDLL version: 5.7.0.301-dev 
Build date: 00:28:14 Apr 9 2018
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/fe0ea9a
Список метамодулей
[ 1] VoiceTranscoder RUN - VoiceTranscoder.so v2017RC3 ini ANY ANY 
[ 2] Reunion RUN - reunion_mm_i386.so v0.1.0.92 ini Start Never
[ 3] ReAuthCheck RUN - reauthcheck_mm_i386.so v0.1.6 ini Start Never
[ 4] AMX Mod X RUN - amxmodx_mm_i386.so v1.8.3-dev+5154 ini Start ANY
[ 5] WHBlocker RUN - whblocker_mm_i386.so v1.5.695 ini Chlvl ANY
[ 6] ReSRDetector RUN - resrdetector_mm_i386.so v0.1.0 ini Chlvl ANY
[ 7] ReSemiclip RUN - resemiclip_mm_i386.so v2.3.9 ini Chlvl ANY
[ 8] NetBufExtender RUN - nbex.so v1.0 ini ANY Never
[ 9] ReAimDetector RUN - reaimdetector_amxx_i386.so v0.2.2 pl4 ANY Never
[10] Fun RUN - fun_amxx_i386.so v1.8.3-dev+5154 pl4 ANY ANY
[11] CStrike RUN - cstrike_amxx_i386.so v1.8.3-Re pl4 ANY ANY
[12] ReAPI RUN - reapi_amxx_i386.so v5.5.0.150-dev pl4 ANY Never
[13] FakeMeta RUN - fakemeta_amxx_i386.so v1.8.3-dev+5154 pl4 ANY ANY
[14] Engine RUN - engine_amxx_i386.so v1.8.3-dev+5154 pl4 ANY ANY
[15] MySQL RUN - mysql_amxx_i386.so v1.8.3-dev+5154 pl4 ANY ANY
[16] Ham Sandwich RUN - hamsandwich_amxx_i386.so v1.8.3-dev+5154 pl4 ANY ANY
Список плагинов
[ 1] ReAimDetector API 0.2.2 ReHLDS Team reaimdetector.a running 
[ 2] Anti Sound ESP 0.2.178 s3zy AntiSoundESP.am running
[ 3] FreshBans 1.3.8b kanagava fresh_bans.amxx running
[ 4] Admin Loader 3.4 neygomon admin_loader.am running
[ 5] WebHS 0.1 kanagava fb_web_online.a running
[ 6] fb_forwards 0.1.7 Kanagava & Realu fb_forwards.amx running
[ 7] DopBan 3.0.1b kanagava dop_ban.amxx running
[ 8] Ultimate Chats Control 4.1 neygomon ucc.amxx running
[ 9] Time for info 1.0 neugomon time_for_info.a running
[ 10] [ReAPI] AdminFreeLook 1.0 ReHLDS Team adminfreelook.a running
[ 11] Maps Menu 1.8.3-dev+ AMXX Dev Team mapsmenu.amxx running
[ 12] Advanced MapChooser 1.1.1 neygomon mapchooser.amxx running
[ 13] Players Menu 17.10.30 AMXX Dev Team & admincmd_rbs.am running
[ 14] Server Menu 1.5.0 F@nt0M server_menu.amx running
[ 15] Flash Team 0.1.358 s3zy FlashTeam.amxx running
[ 16] CSStatsX SQL 0.7.4 serfreeman1337 csstatsx_sql.am running
[ 17] [183] Chat Controller 18.05.15 SKAJIbnEJIb chat_controller running
[ 18] Show Damage 0.01.117 s3zy ShowDamage.amxx running
[ 19] ReAPI AWP Limitter 2.0 neygomon reapi_awp_limit running
[ 20] [183] Kill Assist RBS 17.10.30 Digi & SKAJIbnEJ killassist_rbs. running
[ 21] Adverts System 1.0 Hypa_[KZ] adverts_system. running
[ 22] Connect Info 1.0 Hypa_[KZ] & neug connect_info.am running
[ 23] Hud Info 2.1 ill/Jack Daniel` hud_info.amxx running
[ 24] Show Rank 2.0 reapi s3zy & sonyx sayme.amxx running
[ 25] Stats Configuration 1.8.3-dev+ AMXX Dev Team statscfg.amxx running
[ 26] AFK Control 1.4.1 [Rnd neygomon afk_control.amx running
[ 27] Auto Demo Recorder 2.2.1 F@nt0M demorec.amxx running
[ 28] [ReAPI] resetscore 1.0 Phantom resetscore.amxx running
[ 29] Ping Control 1.31 neygomon ping_control.am running
[ 30] Lite Admin ESP 1.0 neygomon admin_esp.amxx running
[ 31] C4 Timer on roundtime 0.3.3a neygomon c4timer.amxx running
[ 32] [ReAPI] Round Balancer 1.1 neygomon round_balancer. running
[ 33] Weapon Restrict 2.1 s1lent & neugomo weaponrest.amxx running
[ 34] Admin Models 1.1 pUzzlik models.amxx running
[ 35] Steam Bonus 1.0 MAEV steam_bonus.amx running
[ 36] GameName Changer 1.0 neugomon gamename_change running
[ 37] Parachute for ALL [ReA 3.0 Leo_[BH] parachute.amxx running
[ 38] Recoil control 0.2 s3zy Recoil_control. running
[ 39] [ReAPI] Anti overflow 3.1 mazdan & Inline, antir.amxx running
[ 40] SmokeNade 1.0 s3zy gasnadesSmoke.a running
[ 41] Auto-Give Privileges 1.0 SerGrib night_vips.amxx stopped
[ 42] Advanced Experience Sy 0.5.9 [REA serfreeman1337/s aes_main.amxx running
[ 43] AES: CStrike Addon 0.5.9 [REA serfreeman1337/s aes_exp_cstrike running
[ 44] AES: Informer 0.5.9 [REA serfreeman1337/s aes_informer.am running
[ 45] AES: Admin Tools 0.5.9 [REA serfreeman1337/s aes_exp_editor. running
[ 46] AES: Bonus System 0.5.9 Vega serfreeman1337/s aes_bonus_syste running
[ 47] AES: Bonus CSTRIKE 0.5.9 [REA serfreeman1337/s aes_bonus_cstri running
[ 48] Lite Translit 2.8 neygomon lite_translit.a running
[ 49] AES: StatsX 0.5.9 [REA serfreeman1337/s aes_statsx_cstr running
[ 50] SF Bets 0.1.5 serfreeman1337 sf_bets.amxx running
[ 51] RE Vampire 1.0.7 MakapoH, AcE, RE aes_vampire.amx running
[ 52] Vip System 1.0 Hypa_[KZ] vip_system.amxx running
52 plugins, 51 running
Исходный код
// *************************************************************************************//
// Плагин загружен с www.neugomon.ru //
// Автор: Neygomon [ https://neugomon.ru/members/1/ ] //
// Официальная тема поддержки: https://neugomon.ru/threads/110/ //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА! //
// *************************************************************************************//
#include <amxmodx>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif

/*
Спасибо PRoSToTeM@ за новый способ транслитерации
*/

#define TAGS // Теги в чате Гл. Админ | Админ | VIP [ По умолчанию включен ]
#if defined TAGS
#define LT_PREFIXES // Свои префиксы. Файл addons/amxmodx/configs/lt_prefixes.ini [ По умолчанию выключен ]
#endif
#define STEAM // Тег стим игрока [ По умолчанию выключен ]
#define GREEN_MSG // Зеленый цвет чата админов и випов [ По умолчанию выключен ]
#define AES // Поддержка системы армейских званий - AES ( http://c-s.net.ua/forum/topic56564.html ) [ По умолчанию выключен ]
#define SKILL // Поддержка системы скилла - AES:StatsX [ По умолчанию включен ]
// #define DEF_RUS // Русский язык по умолчанию [ По умолчанию английский ]
#define GL_ADMIN ADMIN_RCON // Флаг доступа для тега "Гл. Админ" в чате
#define ADMIN ADMIN_BAN // Флаг доступа для тега "Админ" в чате
#define VIP ADMIN_LEVEL_H // Флаг доступа для тега "VIP" в чате
//#define ANTIFLOOD // Замена стандартного плагина antiflood.amxx [ По умолчанию выключен ]
//#define AD_TIME 0.75 // Время между сообщениями, когда сработает антифлуд система
#define ADMIN_ALLCHAT // Показывать весь чат админам [ По умолчанию включен ]
//#define DEFAULT_CS_CHAT // Cтандартный чат кс [ По умолчанию выключен ]
//Живые общаются только с живыми, мертвые с мертвыми. Админ видит весь чат если ADMIN_ALLCHAT
#if defined AES
enum _:
{
AES_ST_EXP,
AES_ST_LEVEL,
AES_ST_BONUSES,
AES_ST_NEXTEXP,
AES_ST_END
};
native aes_get_player_stats(id, data[4]);
native aes_get_level_name(lvlnum, level[], len, idLang = 0);

public plugin_natives()
set_native_filter("native_filter");

public native_filter(const name[], index, trap)
return !trap ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
#endif
#if defined SKILL
#include <csstatsx_sql>
new const g_szSkillLetters[][] =
{
"L-",
"L",
"L+",
"M-",
"M",
"M+",
"H-",
"H",
"H+",
"P-",
"P",
"P+",
"G"
};
new Float:g_flSkillOpt[sizeof g_szSkillLetters];
#endif

new const g_chConvert[94 * 2 char] =
{
0x2100D0AD, 0x2300D0B6, 0x25003F00, 0xD18D2800, 0x29002A00, 0x2B00D0B1, 0x2D00D18E, 0x2E003000,
0x31003200, 0x33003400, 0x35003600, 0x37003800, 0x3900D096, 0xD0B6D091, 0x3D00D0AE, 0x2C002200,
0xD0A4D098, 0xD0A1D092, 0xD0A3D090, 0xD09FD0A0, 0xD0A8D09E, 0xD09BD094, 0xD0ACD0A2, 0xD0A9D097,
0xD099D09A, 0xD0ABD095, 0xD093D09C, 0xD0A6D0A7, 0xD09DD0AF, 0xD1855C00, 0xD18A3A00, 0x5F00D191,
0xD184D0B8, 0xD181D0B2, 0xD183D0B0, 0xD0BFD180, 0xD188D0BE, 0xD0BBD0B4, 0xD18CD182, 0xD189D0B7,
0xD0B9D0BA, 0xD18BD0B5, 0xD0B3D0BC, 0xD186D187, 0xD0BDD18F, 0xD0A52F00, 0xD0AAD081
};

new bool:g_bUseRus[33];
#if defined STEAM
new bool:g_bIsSteam[33];
#endif
#if defined LT_PREFIXES
enum _:DATA
{
TYPE[2],
AUTH[32],
PREFIX[64]
};
new Array:g_aData, g_PlayerData[DATA];
new g_szPrefix[33][64];
#endif

#define GetBit(%1,%2) (%1 & (1 << (%2 & 31)))
#define SetBit(%1,%2) %1 |= (1 << (%2 & 31))
#define ResetBit(%1,%2) %1 &= ~(1 << (%2 & 31))
#if defined ADMIN_ALLCHAT
new g_bitAdmin;
#endif
new g_bitAlive;

public plugin_init()
{
#define VERSION "2.8"
register_plugin("Lite Translit", VERSION, "neygomon");
register_cvar("lt_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);

register_clcmd("say /rus", "LangCtrlRus");
register_clcmd("say /eng", "LangCtrlEng");

register_clcmd("say", "HandlerSay");
register_clcmd("say_team", "HandlerSayTeam");

register_event("ResetHUD", "eResetHUD", "be");
register_event("DeathMsg", "eDeathMsg", "a", "1>0");
}

#if defined LT_PREFIXES
public plugin_cfg()
{
#if defined SKILL
new levelString[512], stPos, ePos, rawPoint[20], cnt;
get_cvar_string("aes_statsx_skill", levelString, charsmax(levelString));

// парсер значений для скилла
do {
ePos = strfind(levelString[stPos], " ");

formatex(rawPoint, ePos, levelString[stPos]);
g_flSkillOpt[cnt] = str_to_float(rawPoint);

stPos += ePos + 1;

cnt++;

// narkoman wole suka
if(cnt > sizeof g_szSkillLetters - 1)
break;
} while (ePos != -1)
#endif

g_aData = ArrayCreate(DATA);

new buff[256], fp = fopen("addons/amxmodx/configs/lt_prefixes.ini", "rt");
if(!fp) return set_fail_state("File ^"addons/amxmodx/configs/lt_prefixes.ini^" not found");

while(!feof(fp))
{
fgets(fp, buff, charsmax(buff));
if(buff[0] && buff[0] != ';' && parse(buff, g_PlayerData[TYPE], charsmax(g_PlayerData[TYPE]), g_PlayerData[AUTH], charsmax(g_PlayerData[AUTH]), g_PlayerData[PREFIX], charsmax(g_PlayerData[PREFIX])))
ArrayPushArray(g_aData, g_PlayerData);
}
return fclose(fp);
}
#endif
public client_putinserver(id)
{
#if defined LT_PREFIXES
SearchClient(id);
#endif
#if defined DEF_RUS
g_bUseRus[id] = true;
#else
g_bUseRus[id] = false;
#endif
#if defined STEAM
g_bIsSteam[id] = is_user_steam(id) ? true : false;
#endif
#if defined ADMIN_ALLCHAT
if(get_user_flags(id) & ADMIN_CHAT) SetBit(g_bitAdmin, id);
else ResetBit(g_bitAdmin, id);
#endif
}

public client_disconnected(id) ResetBit(g_bitAlive, id);
public eResetHUD(id) SetBit(g_bitAlive, id);
public eDeathMsg() ResetBit(g_bitAlive, read_data(2));

public HandlerSay(id) return FormatMsg(id, false);
public HandlerSayTeam(id) return FormatMsg(id, true);

public LangCtrlRus(id)
{
if(g_bUseRus[id])
client_print(id, print_chat, "*** [LT] Русский язык УЖЕ включен! ***");
else
{
client_print(id, print_chat, "*** [LT] Русский язык активирован! ***");
g_bUseRus[id] = true;
client_cmd(id, "spk buttons/blip1.wav");
}
}

public LangCtrlEng(id)
{
if(!g_bUseRus[id])
client_print(id, print_chat, "*** [LT] Английский язык УЖЕ включен! ***");
else
{
client_print(id, print_chat, "*** [LT] Английский язык активирован! ***");
g_bUseRus[id] = false;
client_cmd(id, "spk buttons/blip1.wav");
}
}

FormatMsg(id, bool:IsTeam)
{
#define MAX_BYTES 180
static sMessage[MAX_BYTES], sConvertStr[charsmax(sMessage) * 2 + 1];
read_args(sMessage, charsmax(sMessage));
remove_quotes(sMessage); trim(sMessage);

if(sMessage[0] == EOS)
return PLUGIN_HANDLED_MAIN;
#if defined ANTIFLOOD
static Float:fTimeFlood[33], Float:fGameTime, iFloodWarn[33];

if(fTimeFlood[id] > (fGameTime = get_gametime()))
{
if(++iFloodWarn[id] > 2)
{
client_print(id, print_chat, "*** [LT] Прекратите флудить! ***");
fTimeFlood[id] = fGameTime + AD_TIME + 3.0;
return PLUGIN_HANDLED;
}
}
else if(iFloodWarn[id]) iFloodWarn[id]--;
fTimeFlood[id] = fGameTime + AD_TIME;
#endif
static iLen, sTags[MAX_BYTES], idTeam, sTeam[16];
idTeam = get_user_team(id, sTeam, charsmax(sTeam));
iLen = formatex(sTags, charsmax(sTags), "^1");
#if defined GREEN_MSG || (defined TAGS && !defined LT_PREFIXES)
static IsAccess; IsAccess = CheckFlags(id);
#endif
#if defined AES
if (!CheckFlags(id))
{
static AESLvl[33][64], aStats[AES_ST_END]
aes_get_player_stats(id, aStats)
aes_get_level_name(aStats[AES_ST_LEVEL], AESLvl[id], 63, LANG_SERVER)
iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^1[^4%s^1] ", AESLvl[id])
}
#endif
#if defined STEAM
if (g_bIsSteam[id] && !CheckFlags(id))
iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^1[^4STEAM^1] ");
#endif
#if defined TAGS
#if defined LT_PREFIXES
if(g_szPrefix[id][0])
{
replace_all(g_szPrefix[id], charsmax(g_szPrefix[]), "!n", "^1");
replace_all(g_szPrefix[id], charsmax(g_szPrefix[]), "!t", "^3");
replace_all(g_szPrefix[id], charsmax(g_szPrefix[]), "!g", "^4");
iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "%s ", g_szPrefix[id]);
}
#else
static const szAdminPrefix[][] = { "", "^1[^4Гл. Админ^1] ", "^1[^4Админ^1] ", "^1[^4VIP^1] " };
iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "%s", szAdminPrefix[IsAccess]);
#endif
#endif
#if defined SKILL
new Float:flSkill, iSkillID[33];
get_user_skill(id, flSkill);
iSkillID[id] = aes_statsx_get_skill_id(flSkill);
iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^1[^4%s^1] ", g_szSkillLetters[iSkillID[id]]);
#endif
static sName[32];
get_user_name(id, sName, charsmax(sName));
#if defined GREEN_MSG
iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^3%s^1 : %s", sName, IsAccess ? "^4" : "");
#else
iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^3%s^1 : ", sName);
#endif
if(g_bUseRus[id])
{
new nLen;
for(new n; sMessage[n] != EOS; n++)
{
if('!' <= sMessage[n] <= '~')
{
sConvertStr[nLen++] = g_chConvert{(sMessage[n] - '!') * 2};
if(g_chConvert{(sMessage[n] - '!') * 2 + 1} != EOS)
sConvertStr[nLen++] = g_chConvert{(sMessage[n] - '!') * 2 + 1};
}
else sConvertStr[nLen++] = sMessage[n];
}
sConvertStr[nLen] = EOS;
}
else sConvertStr = sMessage;

static iByteLimit; iByteLimit = MAX_BYTES;
while(iLen + strlen(sConvertStr) > MAX_BYTES)
sConvertStr[iByteLimit -= 10] = 0;

iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, sConvertStr);

static players[32], pcount; get_players(players, pcount, "c");
switch(IsTeam)
{
case true:
{
for(new i; i < pcount; i++)
{
#if defined ADMIN_ALLCHAT
if(GetBit(g_bitAdmin, players[i]) || (GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]) && idTeam == get_user_team(players[i])))
#else
if(GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]) && idTeam == get_user_team(players[i]))
#endif
SendMsgChat(players[i], idTeam, sTags);
}
}
case false:
{
for(new i; i < pcount; i++)
#if defined DEFAULT_CS_CHAT
#if defined ADMIN_ALLCHAT
if(GetBit(g_bitAdmin, players[i]) || GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]))
#else
if(GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]))
#endif
SendMsgChat(players[i], idTeam, sTags);
#else
SendMsgChat(players[i], idTeam, sTags);
#endif
}
}
static sAuthId[25]; get_user_authid(id, sAuthId, charsmax(sAuthId));
log_message("^"%s<%d><%s><%s>^" %s ^"%s^"", sName, get_user_userid(id), sAuthId, sTeam, IsTeam ? "say_team" : "say" , sConvertStr);
return PLUGIN_HANDLED;
}

stock SendMsgChat(player, team, msg[])
{
switch(team)
{
case 1: client_print_color(player, print_team_red, msg);
case 2: client_print_color(player, print_team_blue, msg);
default:client_print_color(player, print_team_grey, msg);
}
}

stock SearchClient(const id)
{
for(new i; i < ArraySize(g_aData); i++)
{
ArrayGetArray(g_aData, i, g_PlayerData);
switch(g_PlayerData[TYPE])
{
case 'f':
{
if(get_user_flags(id) & read_flags(g_PlayerData[AUTH]))
return copy(g_szPrefix[id], charsmax(g_szPrefix[]), g_PlayerData[PREFIX]);
}
case 'i':
{
static sIP[16]; get_user_ip(id, sIP, charsmax(sIP), 1);
if(!strcmp(g_PlayerData[AUTH], sIP))
return copy(g_szPrefix[id], charsmax(g_szPrefix[]), g_PlayerData[PREFIX]);
}
case 's':
{
static sAuthid[25]; get_user_authid(id, sAuthid, charsmax(sAuthid));
if(!strcmp(g_PlayerData[AUTH], sAuthid))
return copy(g_szPrefix[id], charsmax(g_szPrefix[]), g_PlayerData[PREFIX]);
}
}
}
return g_szPrefix[id][0] = 0;
}

stock CheckFlags(id)
{
static iFlags; iFlags = get_user_flags(id);
if(iFlags & GL_ADMIN) return 1;
else if(iFlags & ADMIN) return 2;
else if(iFlags & VIP) return 3;
return 0;
}

stock bool: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;
}

#if defined SKILL
aes_statsx_get_skill_id(Float:flSkill)
{
for(new i; i < sizeof g_flSkillOpt; i++)
{
if(flSkill < g_flSkillOpt[i])
return i;
}
return (sizeof g_flSkillOpt - 1);
}
#endif
вроде все указал
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
ЧМ основанный на блоке оригинального сообщения НУЖНО ставить последним в списке плагинов, чтобы он не блочил чат команды других плагинов.
Вроде эра colored transit прошла, а ошибки теже, методы работы плагина не меняются.
 
Сообщения
12
Реакции
5
Mistrick, я выставлял в самый низ, вообще не помогает.
Устал бороться, а с другими ЧМ даже не знаком..
Обидно, что только именно /anew не работает, а со всем остальным, все отлично.
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
ЧМ основанный на блоке оригинального сообщения НУЖНО ставить последним в списке плагинов, чтобы он не блочил чат команды других плагинов.
Вроде эра colored transit прошла, а ошибки теже, методы работы плагина не меняются.
Тем более, что он, похоже, не один (имеется в виду, плагин, который с чатом работает)

[ 17] [183] Chat Controller 18.05.15 SKAJIbnEJIb chat_controller running
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
kotletka, возле ЧМ, в самый низ, поставьте его.
 
Сообщения
12
Реакции
5
Minni, да ставил, не помогает.. на данный момент, в самом внизу.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
kotletka, его нужно ставить перед ЧМ. На порядок выше.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу