ЗАКРЫТЬ
Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

^Место доступно для покупки - 4000 руб/мес^

Новости

17-апр
30-дек
29-дек
26-дек

5 страниц V  « 4 5

Advanced Bans (Real Time) by Exolent

Статус пользователя kayot1337
сообщение 3.2.2015, 20:48
Сообщение #81
Стаж: 4 года 11 месяцев

Сообщений: 24
Благодарностей: 2
Полезность: 64

HELP ME! Что нужно изменить в Lite Voteban, чтобы он банил через AdvancedBans
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 3.2.2015, 21:05
Сообщение #82
Стаж: 3 года 4 месяца

Сообщений: 2593
Благодарностей: 1756
Полезность: 405

Цитата(kayot1337 @ 3.2.2015, 20:48) *
HELP ME! Что нужно изменить в Lite Voteban, чтобы он банил через AdvancedBans

Скорее всего, исходник derisive.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя kayot1337
сообщение 3.2.2015, 22:27
Сообщение #83
Стаж: 4 года 11 месяцев

Сообщений: 24
Благодарностей: 2
Полезность: 64

Шутник.
Код
public voteban_count_votes(vmenu)
{
    new menu, newmenu, menupage;
    for(new i; i < iVbCount; i++)
    {
        if(!is_user_connected(iVbPl[i]) || iBoolVoted[iVbPl[i]]) continue;
        player_menu_info(iVbPl[i], menu, newmenu, menupage);
        if(vmenu == newmenu)
            menu_cancel(iVbPl[i]);
    }
    
    static iMinVoteBan, iLol;
    iMinVoteBan = floatround(BAN_RATIO * float(iVbCount) + 0.49);
    iLol = (iVoteCount >= iMinVoteBan);
    if(iLol)
    server_cmd("amx_ban 360 #%d ^"[1313] %s^"", get_user_userid(iVbBanPl), iCustomReason[iVbInsider][0] ? iCustomReason[iVbInsider] : "Демо на форум!");
    ColorChat(0, RED, "^1[^41313^1] ^4Голосование ^3завершено^1! ^4%s %s ^3забанен^1! ^1[^4Голосов^1: ^4%d ^1| ^3Необходимо^1: ^4%d^1]", szName[iVbBanPl], iLol ? "^1был" : "^1не был", iVoteCount, iMinVoteBan);                            
    log_to_file("voteban.log", "[STP] Vote %s. Player ^"%s^" [Reason: ^"%s^"][Vote: %d | MinVote: %d][Players: %d]",  iLol ? "SUCCESS [Ban]" : "FAILED [No Ban]", szName[iVbBanPl],  iCustomReason[iVbInsider][0] ? iCustomReason[iVbInsider] : "Default", iVoteCount, iMinVoteBan, iVbCount);
    iVbInsider = iVbBanPl = iCustomReason[iVbInsider][0] = 0;    /* Обнуляем переменные и массив */
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 4.2.2015, 7:08
Сообщение #84


Иконка группы

Стаж: 3 года 11 месяцев

Сообщений: 15547
Благодарностей: 6946
Полезность: 1205

kayot1337, не ужто так тяжело найти строку наказания и заменить на правильный синтаксис? Тут вроде не 1000 строк кода..
Код
amx_ban 360 #%d ^"[1313] %s^"
>>>>
amx_ban #%d 360 ^"[1313] %s^"
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя kayot1337
сообщение 4.2.2015, 13:05
Сообщение #85
Стаж: 4 года 11 месяцев

Сообщений: 24
Благодарностей: 2
Полезность: 64

Цитата(Bloo @ 4.2.2015, 8:08) *
kayot1337, не ужто так тяжело найти строку наказания и заменить на правильный синтаксис? Тут вроде не 1000 строк кода..
Код
amx_ban 360 #%d ^"[1313] %s^"
>>>>
amx_ban #%d 360 ^"[1313] %s^"


Я знал где менять, но не знал синтаксис правильный.

[quote name='Bloo' date='4.2.2015, 8:08' post='729269']
Не подскажешь как поставить правильный синтаксис.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 4.2.2015, 13:12
Сообщение #86


Иконка группы

Стаж: 3 года 11 месяцев

Сообщений: 15547
Благодарностей: 6946
Полезность: 1205

kayot1337, cbf1b2bfde1a.gif мое сообщение предыдущее прочитайте, а так же первый пост.

Код
amx_ban 360 #%d ^"[1313] %s^"

Заменить на:
Код
amx_ban #%d 360 ^"[1313] %s^"
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя bespredel
сообщение 28.3.2015, 15:51
Сообщение #87
Стаж: 6 лет 9 месяцев

Сообщений: 1
Благодарностей: 1
Полезность: 0

кто может написать unbanmenu для аdvanced bans, пишите в личку

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя zippel
сообщение 25.6.2015, 10:52
Сообщение #88


Стаж: 8 лет 10 месяцев

Сообщений: 872
Благодарностей: 103
Полезность: 4

Кто нибудь может прояснить что это было? Из-за чего вдруг. С русскими никами вроде бы проблем небыло, банило. Сравнение стояло cp1251, однако уже сейчас поменяла utf8_bin
Код
L 06/25/2015 - 16:12:03: ------------------------> banned ПОНЯ УБИЙЦА <STEAM_0:0:213208606> || Reason: "aim+bot" || Ban Length: Permanent Ban
L 06/25/2015 - 16:12:03: [AMXX] Plugin ("advanced_bans_sql.amxx") is setting itself as failed.
L 06/25/2015 - 16:12:03: [AMXX] Plugin says: Query failed.
L 06/25/2015 - 16:12:03: [AMXX] Displaying debug trace (plugin "advanced_bans_sql.amxx", version "0.8")
L 06/25/2015 - 16:12:03: [AMXX] Run time error 1: forced exit
L 06/25/2015 - 16:12:03: [AMXX]    [0] advanced_bans_sql.sma::QueryAddBan (line 1163)


Функция на 1163й строке
Код
public QueryAddBan(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
    if( failstate == TQUERY_CONNECT_FAILED )
    {
        set_fail_state("Could not connect to database.");
    }
    else if( failstate == TQUERY_QUERY_FAILED )
    {
        set_fail_state("Query failed.");
    }
    else if( errcode )
    {
        log_amx("Error on query: %s", error);
    }
    else
    {
        // Yay, ban was added! We can all rejoice!
    }
}

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя magis1337
сообщение 29.10.2015, 12:59
Сообщение #89


Стаж: 3 года 4 месяца
Город: Odessa

Сообщений: 2782
Благодарностей: 1532
Полезность: 562

host5.ru
Меценат Меценат

ребят, не кто не подскажет, где баны хранятся этой системы? а то не могу не как найти
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
oxotnukoff
сообщение 29.10.2015, 13:41
Сообщение #90
Стаж: 5 лет 1 месяц

Сообщений: 164
Благодарностей: 42
Полезность: 128

magis1337,
addons/amxmodx/logs/BAN_HISTORY_MMDDYYYY.log (MM = месяц, DD = день, YYYY = год).
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
tehpawnazor
сообщение 14.11.2015, 2:27
Сообщение #91
Стаж: 2 года

Сообщений: 5
Благодарностей: 1
Полезность: 0

Подскажите пжлст, поставил плагин, всё работает хорошо...
С русским языком в тхт файле разобралься.... работает и пишет в консоле как положенно по русски!
А вот на сервере когда я баню кого либо пишет по англ

-
[AdvancedBans] cc[STEAM_0:0:878115995] ban time is up! [Ban Reason:
,

Как сделать чтобы писало по русски полностью всё, и причину и время?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 14.11.2015, 2:53
Сообщение #92
Стаж: 3 года 4 месяца

Сообщений: 2593
Благодарностей: 1756
Полезность: 405

tehpawnazor, много фраз нужно изменять прямо в исходнике
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
tehpawnazor
сообщение 14.11.2015, 9:37
Сообщение #93
Стаж: 2 года

Сообщений: 5
Благодарностей: 1
Полезность: 0

Цитата(voed @ 14.11.2015, 2:48) *
tehpawnazor, много фраз нужно изменять прямо в исходнике



А Подсказать сможешь что именно нужно изменять и на что ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 14.11.2015, 13:53
Сообщение #94


Иконка группы

Стаж: 3 года 11 месяцев

Сообщений: 15547
Благодарностей: 6946
Полезность: 1205

tehpawnazor, английские фразы нужно заменить на русские, по моему это очевидно. Все что пишется на английском ищешь в исходнике и переводишь.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
tehpawnazor
сообщение 15.11.2015, 9:22
Сообщение #95
Стаж: 2 года

Сообщений: 5
Благодарностей: 1
Полезность: 0

Цитата(Bloo @ 14.11.2015, 13:48) *
tehpawnazor, английские фразы нужно заменить на русские, по моему это очевидно. Все что пишется на английском ищешь в исходнике и переводишь.

Ребят, помогите пжлст мне перевести плагин на русский язык...
Я просто вообще новичёк и не понимаю что нужно переводить....
Файл тхт перевёл, там ничего сложного, а вот с исходником немогу разобраться
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 15.11.2015, 9:37
Сообщение #96


Иконка группы

Стаж: 3 года 11 месяцев

Сообщений: 15547
Благодарностей: 6946
Полезность: 1205

tehpawnazor, я не понимаю, что нужно понимать, что бы найти в исходнике нужно слово и заменить его на русское?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
tehpawnazor
сообщение 15.11.2015, 9:56
Сообщение #97
Стаж: 2 года

Сообщений: 5
Благодарностей: 1
Полезность: 0

Цитата(Bloo @ 15.11.2015, 9:33) *
tehpawnazor, я не понимаю, что нужно понимать, что бы найти в исходнике нужно слово и заменить его на русское?


Вот вы м.б и понимаете....
А вот я смотрел и искал...
На сервере пишет не по одному слову, а целыми предложениями....
именно поэтому подходящего слова я там нашёл десятки.....
Я понимаю что м.б мелочь всё это перевести...
Но если это не так тяжело, помогите пжлст...
Я буду очень благодарен вам !
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Untlished
сообщение 22.12.2016, 9:05
Сообщение #98


Стаж: 3 года 1 месяц

Сообщений: 171
Благодарностей: 56
Полезность: 54

Забанил себя на сервере, потом пишу в консоли unban, пишет что игрока нет в базе данных.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя D9D9
сообщение 18.7.2017, 23:00
Сообщение #99
Стаж: 2 года 10 месяцев

Сообщений: 323
Благодарностей: 38
Полезность: < 0

Помогите пожалуйста исправить ошибку... Буфер не достаточно большой (194>=191)
Данная ошибка появилась после того как переименовал название сервера очень длинное!
До этого все было хорошо...
Cкрытый текст
L 07/18/2017 - 08:34:37: Start of error session.
L 07/18/2017 - 08:34:37: Info (map "de_dust2_2x2") (file "addons/amxmodx/logs/error_20170718.log")
L 07/18/2017 - 08:34:37: replace() Буфер не достаточно большой (194>=191)
L 07/18/2017 - 08:34:37: [AMXX] Run time error 10 (plugin "advanced_bans.amxx") (native "replace") - debug not enabled!
L 07/18/2017 - 08:34:37: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).

advanced_bans
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <regex>
#include <geoip>

#define PLUGIN_NAME "[ AMXBans ]"
#define PLUGIN_VERSION "0.7"
#define PLUGIN_AUTHOR "S"

#pragma semicolon 1

// uncomment the line below if you want this plugin to
// load old bans from the banned.cfg and listip.cfg files
//#define KEEP_DEFAULT_BANS

// uncomment the line below if you want the history to be in one file
//#define HISTORY_ONE_FILE

// if you must have a maximum amount of bans to be compatible with AMXX versions before 1.8.0
// change this number to your maximum amount
// if you would rather have unlimited (requires AMXX 1.8.0 or higher) then set it to 0
#define MAX_BANS 0

#define REGEX_IP_PATTERN "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
#define REGEX_STEAMID_PATTERN "^^STEAM_0:(0|1):\d+$"

new Regex:g_IP_pattern;
new Regex:g_SteamID_pattern;
new g_regex_return;

/*bool:IsValidIP(const ip[])
{
return regex_match_c(ip, g_IP_pattern, g_regex_return) > 0;
}*/

#define IsValidIP(%1) (regex_match_c(%1, g_IP_pattern, g_regex_return) > 0)

/*bool:IsValidAuthid(const authid[])
{
return regex_match_c(authid, g_SteamID_pattern, g_regex_return) > 0;
}*/

#define IsValidAuthid(%1) (regex_match_c(%1, g_SteamID_pattern, g_regex_return) > 0)


enum // for name displaying
{
ACTIVITY_NONE, // nothing is shown
ACTIVITY_HIDE, // admin name is hidden
ACTIVITY_SHOW // admin name is shown
};
new const g_admin_activity[] =
{
ACTIVITY_NONE, // amx_show_activity 0 = show nothing to everyone
ACTIVITY_HIDE, // amx_show_activity 1 = hide admin name from everyone
ACTIVITY_SHOW, // amx_show_activity 2 = show admin name to everyone
ACTIVITY_SHOW, // amx_show_activity 3 = show name to admins but hide it from normal users
ACTIVITY_SHOW, // amx_show_activity 4 = show name to admins but show nothing to normal users
ACTIVITY_HIDE // amx_show_activity 5 = hide name from admins but show nothing to normal users
};
new const g_normal_activity[] =
{
ACTIVITY_NONE, // amx_show_activity 0 = show nothing to everyone
ACTIVITY_HIDE, // amx_show_activity 1 = hide admin name from everyone
ACTIVITY_SHOW, // amx_show_activity 2 = show admin name to everyone
ACTIVITY_HIDE, // amx_show_activity 3 = show name to admins but hide it from normal users
ACTIVITY_NONE, // amx_show_activity 4 = show name to admins but show nothing to normal users
ACTIVITY_NONE // amx_show_activity 5 = hide name from admins but show nothing to normal users
};


#if MAX_BANS <= 0
enum _:BannedData
{
bd_name[32],
bd_steamid[35],
bd_banlength,
bd_unbantime[32],
bd_reason[128],
bd_admin_name[64],
bd_admin_steamid[35]
};

new Trie:g_trie;
new Array:g_array;
#else
new g_names[MAX_BANS][32];
new g_steamids[MAX_BANS][35];
new g_banlengths[MAX_BANS];
new g_unbantimes[MAX_BANS][32];
new g_reasons[MAX_BANS][128];
new g_admin_names[MAX_BANS][64];
new g_admin_steamids[MAX_BANS][35];
#endif
new g_total_bans;

new g_ban_file[64];

new ab_website;
new ab_immunity;
new ab_unbancheck;

new g_MsgType, g_SnapShot, g_DelaySS;

new amx_show_activity;

#if MAX_BANS <= 0
new Array:g_maxban_times;
new Array:g_maxban_flags;
#else
#define MAX_BANLIMITS 30
new g_maxban_times[MAX_BANLIMITS];
new g_maxban_flags[MAX_BANLIMITS];
#endif
new g_total_maxban_times;

new g_unban_entity;

new g_max_clients;

new g_msgid_SayText;

public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
register_cvar("advanced_bans", PLUGIN_VERSION, FCVAR_SPONLY);

register_dictionary("advanced_bans.txt");
register_dictionary("common.txt");

register_concmd("amx_ban", "CmdBan", ADMIN_BAN, "<nick, #userid, authid> <time in minutes> <reason>");
register_concmd("amx_banip", "CmdBanIp", ADMIN_BAN, "<nick, #userid, authid> <time in minutes> <reason>");
register_concmd("amx_addban", "CmdAddBan", ADMIN_BAN, "<name> <authid or ip> <time in minutes> <reason>");
register_concmd("amx_unban", "CmdUnban", ADMIN_BAN, "<authid or ip>");
register_concmd("amx_banlist", "CmdBanList", ADMIN_BAN, "[start] -- shows everyone who is banned");
register_srvcmd("amx_addbanlimit", "CmdAddBanLimit", -1, "<flag> <time in minutes>");

ab_website = register_cvar("ab_website", "777");
ab_immunity = register_cvar("ab_immunity", "1");
ab_unbancheck = register_cvar("ab_unbancheck", "5.0");

register_concmd("amx_ss", "ss_menu", ADMIN_KICK, "- Make snapshots on user(menu)");
g_MsgType = register_cvar("amx_ssmsg_type", "3"); // 1- chat | 2- hud | 3- chat+hud (Def.: 3)
g_SnapShot = register_cvar("amx_ssnumber", "3"); // Number of snapshots to take (Def.: 3)
g_DelaySS = register_cvar("amx_ssdelay", "1.0"); // Delay between snapshots (Def.: 1.0)


amx_show_activity = register_cvar("amx_show_activity", "2");

get_datadir(g_ban_file, sizeof(g_ban_file) - 1);
add(g_ban_file, sizeof(g_ban_file) - 1, "/advanced_bans.txt");

#if MAX_BANS <= 0
g_trie = TrieCreate();
g_array = ArrayCreate(BannedData);
#endif

#if !defined MAX_BANLIMITS
g_maxban_times = ArrayCreate(1);
g_maxban_flags = ArrayCreate(1);
#endif

LoadBans();

new error[2];
g_IP_pattern = regex_compile(REGEX_IP_PATTERN, g_regex_return, error, sizeof(error) - 1);
g_SteamID_pattern = regex_compile(REGEX_STEAMID_PATTERN, g_regex_return, error, sizeof(error) - 1);

g_max_clients = get_maxplayers();

g_msgid_SayText = get_user_msgid("SayText");
}

public plugin_cfg()
{
CreateUnbanEntity();
}

public CreateUnbanEntity()
{
static failtimes;

g_unban_entity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));

if( !pev_valid(g_unban_entity) )
{
++failtimes;

log_amx("[ERROR] Failed to create unban entity (%i/10)", failtimes);

if( failtimes < 10 )
{
set_task(1.0, "CreateUnbanEntity");
}
else
{
log_amx("[ERROR] Could not create unban entity!");
}

return;
}

set_pev(g_unban_entity, pev_classname, "unban_entity");
set_pev(g_unban_entity, pev_nextthink, get_gametime() + 1.0);

register_forward(FM_Think, "FwdThink");
}

public client_authorized(client)
{
static authid[35];
get_user_authid(client, authid, sizeof(authid) - 1);

static ip[35];
get_user_ip(client, ip, sizeof(ip) - 1, 1);

new Float:DelayBan = get_pcvar_float(g_DelaySS) * float(get_pcvar_num(g_SnapShot)) + 0.2;

#if MAX_BANS > 0
static banned_authid[35], bool:is_ip;
for( new i = 0; i < g_total_bans; i++ )
{
copy(banned_authid, sizeof(banned_authid) - 1, g_steamids[i]);

is_ip = bool:(containi(banned_authid, ".") != -1);

if( is_ip && equal(ip, banned_authid) || !is_ip && equal(authid, banned_authid) )
{
static name[32], reason[128], unbantime[32], admin_name[32], admin_steamid[64];
copy(name, sizeof(name) - 1, g_names[i]);
copy(reason, sizeof(reason) - 1, g_reasons[i]);
new banlength = g_banlengths[i];
copy(unbantime, sizeof(unbantime) - 1, g_unbantimes[i]);
copy(admin_name, sizeof(admin_name) - 1, g_admin_names[i]);
copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids[i]);

PrintBanInformation(client, name, banned_authid, reason, banlength, unbantime, admin_name, admin_steamid, true, true);

set_task(DelayBan, "TaskDisconnectPlayer", client);
break;
}
}
#else
static array_pos;

if( TrieGetCell(g_trie, authid, array_pos) || TrieGetCell(g_trie, ip, array_pos) )
{
static data[BannedData];
ArrayGetArray(g_array, array_pos, data);

PrintBanInformation(client, data[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], true, true);

set_task(DelayBan, "TaskDisconnectPlayer", client);
}
#endif
}

public CmdBan(client, level, cid)
{
if( !cmd_access(client, level, cid, 4) ) return PLUGIN_HANDLED;

static arg[128];
read_argv(1, arg, sizeof(arg) - 1);

new target = cmd_target(client, arg, GetTargetFlags(client));
if( !target ) return PLUGIN_HANDLED;

static target_authid[35];
get_user_authid(target, target_authid, sizeof(target_authid) - 1);

#if MAX_BANS <= 0
if( TrieKeyExists(g_trie, target_authid) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_ALREADY_BANNED_STEAMID");
return PLUGIN_HANDLED;
}
#else
for( new i = 0; i < g_total_bans; i++ )
{
if( !strcmp(target_authid, g_steamids[i], 1) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_ALREADY_BANNED_STEAMID");
return PLUGIN_HANDLED;
}
}
#endif

read_argv(2, arg, sizeof(arg) - 1);

new length = str_to_num(arg);
new maxlength = GetMaxBanTime(client);

if( maxlength && (!length || length > maxlength) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_MAX_BAN_TIME", maxlength);
return PLUGIN_HANDLED;
}

static unban_time[64];
if( length == 0 )
{
formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
}
else
{
GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
}

read_argv(3, arg, sizeof(arg) - 1);

static admin_name[64], target_name[32];
get_user_name(client, admin_name, sizeof(admin_name) - 1);
get_user_name(target, target_name, sizeof(target_name) - 1);

static admin_ip[35];
new target_ip[35];
get_user_ip(client, admin_ip, sizeof(admin_ip) - 1, 1);
get_user_ip(target, target_ip, sizeof(target_ip) - 1, 1);

AddBan(target_name, target_authid, arg, length, unban_time, admin_name, admin_ip);
AddBan(target_name, target_ip, arg, length, unban_time, admin_name, admin_ip);

PrintBanInformation(target, target_name, target_authid, arg, length, unban_time, admin_name, admin_ip, true, true);
PrintBanInformation(client, target_name, target_authid, arg, length, unban_time, admin_name, admin_ip, false, false);

new Param[2];
Param[0] = client;
Param[1] = target;
set_task(0.1, "SS_Ban", target, Param,2);

new Float:DelayBan = get_pcvar_float(g_DelaySS) * float(get_pcvar_num(g_SnapShot)) + 0.2;
set_task(DelayBan, "TaskDisconnectPlayer", target);

GetBanTime(length, unban_time, sizeof(unban_time) - 1);

PrintActivity(admin_name, "^x03[^x04 AMXBans ^x03]^x04 $name^x01 :^x03 забанен: ^x04%s.^x03 Причина: ^x04%s.^x03 Длительность бана: %s", target_name, arg, unban_time);

Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_ip, target_name, target_authid, arg, unban_time);

return PLUGIN_HANDLED;
}

public CmdBanIp(client, level, cid)
{
if( !cmd_access(client, level, cid, 4) ) return PLUGIN_HANDLED;

static arg[128];
read_argv(1, arg, sizeof(arg) - 1);

new target = cmd_target(client, arg, GetTargetFlags(client));
if( !target ) return PLUGIN_HANDLED;

static target_ip[35];
get_user_ip(target, target_ip, sizeof(target_ip) - 1, 1);

#if MAX_BANS <= 0
if( TrieKeyExists(g_trie, target_ip) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_ALREADY_BANNED_IP");
return PLUGIN_HANDLED;
}
#else
for( new i = 0; i < g_total_bans; i++ )
{
if( !strcmp(target_ip, g_steamids[i], 1) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_ALREADY_BANNED_IP");
return PLUGIN_HANDLED;
}
}
#endif

read_argv(2, arg, sizeof(arg) - 1);

new length = str_to_num(arg);
new maxlength = GetMaxBanTime(client);

if( maxlength && (!length || length > maxlength) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_MAX_BAN_TIME", maxlength);
return PLUGIN_HANDLED;
}

static unban_time[32];

if( length == 0 )
{
formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
}
else
{
GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
}

read_argv(3, arg, sizeof(arg) - 1);

static admin_name[64], target_name[32];
get_user_name(client, admin_name, sizeof(admin_name) - 1);
get_user_name(target, target_name, sizeof(target_name) - 1);

static admin_ip[35];
get_user_authid(client, admin_ip, sizeof(admin_ip) - 1);

AddBan(target_name, target_ip, arg, length, unban_time, admin_name, admin_ip);

PrintBanInformation(target, target_name, target_ip, arg, length, unban_time, admin_name, admin_ip, true, true);
PrintBanInformation(client, target_name, target_ip, arg, length, unban_time, admin_name, admin_ip, false, false);

new Float:DelayBan = get_pcvar_float(g_DelaySS) * float(get_pcvar_num(g_SnapShot)) + 0.2;
set_task(DelayBan, "TaskDisconnectPlayer", target);

GetBanTime(length, unban_time, sizeof(unban_time) - 1);

PrintActivity(admin_name, "^x03[^x04 AMXBans ^x03]^x04 $name^x01 :^x04 забанен: ^x03%s.^x04 Причина: ^x03%s.^x04 Длительность бана: ^x03%s", target_name, arg, unban_time);

Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_ip, target_name, target_ip, arg, unban_time);

return PLUGIN_HANDLED;
}

public CmdAddBan(client, level, cid)
{
if( !cmd_access(client, level, cid, 5) ) return PLUGIN_HANDLED;

static target_name[32], target_authid[35], bantime[10], reason[128];
read_argv(1, target_name, sizeof(target_name) - 1);
read_argv(2, target_authid, sizeof(target_authid) - 1);
read_argv(3, bantime, sizeof(bantime) - 1);
read_argv(4, reason, sizeof(reason) - 1);

new bool:is_ip = bool:(containi(target_authid, ".") != -1);

if( !is_ip && !IsValidAuthid(target_authid) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_INVALID_STEAMID");
console_print(client, "[ AMXBans ] %L", client, "AB_VALID_STEAMID_FORMAT");

return PLUGIN_HANDLED;
}
else if( is_ip )
{
new pos = contain(target_authid, ":");
if( pos > 0 )
{
target_authid[pos] = 0;
}

if( !IsValidIP(target_authid) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_INVALID_IP");

return PLUGIN_HANDLED;
}
}

#if MAX_BANS <= 0
if( TrieKeyExists(g_trie, target_authid) )
{
console_print(client, "[ AMXBans ] %L", client, is_ip ? "AB_ALREADY_BANNED_IP" : "AB_ALREADY_BANNED_STEAMID");
return PLUGIN_HANDLED;
}
#else
for( new i = 0; i < g_total_bans; i++ )
{
if( !strcmp(target_authid, g_steamids[i], 1) )
{
console_print(client, "[ AMXBans ] %L", client, is_ip ? "AB_ALREADY_BANNED_IP" : "AB_ALREADY_BANNED_STEAMID");
return PLUGIN_HANDLED;
}
}
#endif

new length = str_to_num(bantime);
new maxlength = GetMaxBanTime(client);

if( maxlength && (!length || length > maxlength) )
{
console_print(client, "[ AMXBans ] %L", client, "AB_MAX_BAN_TIME", maxlength);
return PLUGIN_HANDLED;
}

if( is_user_connected(find_player(is_ip ? "d" : "c", target_authid)) )
{
client_cmd(client, "amx_ban ^"%s^" %i ^"%s^"", target_authid, length, reason);
return PLUGIN_HANDLED;
}

static unban_time[32];
if( length == 0 )
{
formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
}
else
{
GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
}

static admin_name[64], admin_ip[35];
get_user_name(client, admin_name, sizeof(admin_name) - 1);
get_user_authid(client, admin_ip, sizeof(admin_ip) - 1);

AddBan(target_name, target_authid, reason, length, unban_time, admin_name, admin_ip);

PrintBanInformation(client, target_name, target_authid, reason, length, unban_time, "", "", false, false);

GetBanTime(length, unban_time, sizeof(unban_time) - 1);

PrintActivity(admin_name, "^x03[^x04 AMXBans ^x03]^x04 $name^x01 :^x04 забанен: ^x03%s %s.^x04 Причина бана: ^x03%s.^x04 Длительность бана: ^x03%s", is_ip ? "IP" : "SteamID", target_authid, reason, unban_time);


Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_ip, target_name, target_authid, reason, unban_time);

return PLUGIN_HANDLED;
}

public CmdUnban(client, level, cid)
{
if( !cmd_access(client, level, cid, 2) ) return PLUGIN_HANDLED;

static arg[35];
read_argv(1, arg, sizeof(arg) - 1);

#if MAX_BANS > 0
static banned_authid[35];
for( new i = 0; i < g_total_bans; i++ )
{
copy(banned_authid, sizeof(banned_authid) - 1, g_steamids[i]);

if( equal(arg, banned_authid) )
{
static admin_name[64];
get_user_name(client, admin_name, sizeof(admin_name) - 1);

static name[32], reason[128];
copy(name, sizeof(name) - 1, g_names[i]);
copy(reason, sizeof(reason) - 1, g_reasons[i]);

PrintActivity(admin_name, "^x03[^x04 AMXBans ^x03]^x04 $name^x01 :^x03 время бана истекло: %s^x01 [%s] [Причина бана: %s]", name, arg, reason);

static authid[35];
get_user_authid(client, authid, sizeof(authid) - 1);

Log("%s <%s> unbanned %s <%s> || Ban Reason: ^"%s^"", admin_name, authid, name, arg, reason);

RemoveBan(i);

return PLUGIN_HANDLED;
}
}
#else
if( TrieKeyExists(g_trie, arg) )
{
static array_pos;
TrieGetCell(g_trie, arg, array_pos);

static data[BannedData];
ArrayGetArray(g_array, array_pos, data);

static unban_name[32];
get_user_name(client, unban_name, sizeof(unban_name) - 1);

PrintActivity(unban_name, "^x03[^x04 AMXBans ^x03]^x04 $name^x01 :^x03 время бана истекло: %s^x01 [%s] [Причина бана: %s]", data[bd_name], data[bd_steamid], data[bd_reason]);

RemoveBan(array_pos, data[bd_steamid]);

return PLUGIN_HANDLED;
}
#endif

console_print(client, "[ AMXBans ] %L", client, "AB_NOT_IN_BAN_LIST", arg);

return PLUGIN_HANDLED;
}

public CmdBanList(client, level, cid)
{
if( !cmd_access(client, level, cid, 1) ) return PLUGIN_HANDLED;

if( !g_total_bans )
{
console_print(client, "[ AMXBans ] %L", client, "AB_NO_BANS");
return PLUGIN_HANDLED;
}

static start;

if( read_argc() > 1 )
{
static arg[5];
read_argv(1, arg, sizeof(arg) - 1);

start = min(str_to_num(arg), g_total_bans) - 1;
}
else
{
start = 0;
}

new last = min(start + 10, g_total_bans);

console_print(client, "%L", client, "AB_BAN_LIST_NUM", start + 1, last);

for( new i = start; i < last; i++ )
{
#if MAX_BANS <= 0
static data[BannedData];
ArrayGetArray(g_array, i, data);

PrintBanInformation(client, data[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], true, false);
#else
static name[32], steamid[35], reason[128], banlength, unbantime[32], admin_name[32], admin_steamid[35];

copy(name, sizeof(name) - 1, g_names[i]);
copy(steamid, sizeof(steamid) - 1, g_steamids[i]);
copy(reason, sizeof(reason) - 1, g_reasons[i]);
banlength = g_banlengths[i];
copy(unbantime, sizeof(unbantime) - 1, g_unbantimes[i]);
copy(admin_name, sizeof(admin_name) - 1, g_admin_names[i]);
copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids[i]);

PrintBanInformation(client, name, steamid, reason, banlength, unbantime, admin_name, admin_steamid, true, false);
#endif
}

if( ++last < g_total_bans )
{
console_print(client, "%L", client, "AB_BAN_LIST_NEXT", last);
}

return PLUGIN_HANDLED;
}

public CmdAddBanLimit()
{
if( read_argc() != 3 )
{
log_amx("amx_addbanlimit was used with incorrect parameters!");
log_amx("Usage: amx_addbanlimit <flags> <time in minutes>");
return PLUGIN_HANDLED;
}

static arg[16];

read_argv(1, arg, sizeof(arg) - 1);
new flags = read_flags(arg);

read_argv(2, arg, sizeof(arg) - 1);
new minutes = str_to_num(arg);

#if !defined MAX_BANLIMITS
ArrayPushCell(g_maxban_flags, flags);
ArrayPushCell(g_maxban_times, minutes);
#else
if( g_total_maxban_times >= MAX_BANLIMITS )
{
log_amx("The amx_addbanlimit has reached its maximum!");
return PLUGIN_HANDLED;
}

g_maxban_flags[g_total_maxban_times] = flags;
g_maxban_times[g_total_maxban_times] = minutes;
#endif
g_total_maxban_times++;

return PLUGIN_HANDLED;
}

public FwdThink(entity)
{
if( entity != g_unban_entity ) return;

if( g_total_bans > 0 )
{
static _hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
format_time(_hours, sizeof(_hours) - 1, "%H");
format_time(_minutes, sizeof(_minutes) - 1, "%M");
format_time(_seconds, sizeof(_seconds) - 1, "%S");
format_time(_month, sizeof(_month) - 1, "%m");
format_time(_day, sizeof(_day) - 1, "%d");
format_time(_year, sizeof(_year) - 1, "%Y");

// c = current
// u = unban

new c_hours = str_to_num(_hours);
new c_minutes = str_to_num(_minutes);
new c_seconds = str_to_num(_seconds);
new c_month = str_to_num(_month);
new c_day = str_to_num(_day);
new c_year = str_to_num(_year);

static unban_time[32];
static u_hours, u_minutes, u_seconds, u_month, u_day, u_year;

for( new i = 0; i < g_total_bans; i++ )
{
#if MAX_BANS <= 0
static data[BannedData];
ArrayGetArray(g_array, i, data);

if( data[bd_banlength] == 0 ) continue;
#else
if( g_banlengths[i] == 0 ) continue;
#endif

#if MAX_BANS <= 0
copy(unban_time, sizeof(unban_time) - 1, data[bd_unbantime]);
#else
copy(unban_time, sizeof(unban_time) - 1, g_unbantimes[i]);
#endif
replace_all(unban_time, sizeof(unban_time) - 1, ":", " ");
replace_all(unban_time, sizeof(unban_time) - 1, "/", " ");

parse(unban_time,\
_hours, sizeof(_hours) - 1,\
_minutes, sizeof(_minutes) - 1,\
_seconds, sizeof(_seconds) - 1,\
_month, sizeof(_month) - 1,\
_day, sizeof(_day) - 1,\
_year, sizeof(_year) - 1
);

u_hours = str_to_num(_hours);
u_minutes = str_to_num(_minutes);
u_seconds = str_to_num(_seconds);
u_month = str_to_num(_month);
u_day = str_to_num(_day);
u_year = str_to_num(_year);

if( u_year < c_year
|| u_year == c_year && u_month < c_month
|| u_year == c_year && u_month == c_month && u_day < c_day
|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours < c_hours
|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes < c_minutes
|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes == c_minutes && u_seconds <= c_seconds )
{
#if MAX_BANS <= 0
Log("Ban time is up for: %s [%s]", data[bd_name], data[bd_steamid]);

Print("^x04[ AMXBans ]^x03 %s^x01[^x04%s^x01]^x03 время бана вышло!^x01 [Причина бана: %s]", data[bd_name], data[bd_steamid], data[bd_reason]);

RemoveBan(i, data[bd_steamid]);
#else
Log("Ban time is up for: %s [%s]", g_names[i], g_steamids[i]);

Print("^x04[ AMXBans ]^x03 %s^x01[^x04%s^x01]^x03 время бана вышло!^x01 [Причина бана: %s]", g_names[i], g_steamids[i], g_reasons[i]);

RemoveBan(i);
#endif

i--; // current pos was replaced with another ban, so we need to check it again.
}
}
}

set_pev(g_unban_entity, pev_nextthink, get_gametime() + get_pcvar_float(ab_unbancheck));
}












// SS Menu ==============================================================================
public ss_menu(id)
{
if(!(get_user_flags(id) & ADMIN_KICK))
{
client_print(id, print_console, "%L", LANG_PLAYER,"NO_APP_COM");
return PLUGIN_HANDLED;
}
new temp[128];
format(temp, 127, "[ AMXBans ] Screen Menu");
new menu = menu_create(temp, "ss_menu_item");

new Players[32], num, i, player;
get_players(Players, num, "h");
for (i = 0; i < num; i++)
{
player = Players[i];

new Name[32], name_item[63], player_str[10];
get_user_name(player, Name, 31);
num_to_str(player, player_str, 9);

format(name_item, 63, "%s", Name);
if(is_user_admin(player))
format(name_item, 63, "%s \r*", Name);
if(is_user_bot(player))
format(name_item, 63, "\d%s", Name);

menu_additem(menu, name_item, player_str);
}

format(temp, 31, "%L", LANG_PLAYER,"EXIT");
menu_setprop(menu, MPROP_EXITNAME, temp);
format(temp, 31, "%L", LANG_PLAYER,"BACK");
menu_setprop(menu, MPROP_BACKNAME, temp);
format(temp, 31, "%L", LANG_PLAYER,"MORE");
menu_setprop(menu, MPROP_NEXTNAME, temp);

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, menu, 0);

return PLUGIN_HANDLED;
}

public ss_menu_item(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}

new data[6], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, 5, iName, 63, callback);
new player = str_to_num(data);

if(is_user_bot(player))
menu_display(id, menu, 0);
else
{
new Param[2];
Param[0] = id;
Param[1] = player;

set_task(0.1, "SS_Task", 0, Param,2);
}

return PLUGIN_HANDLED;
}

public SS_Ban(Param[2])
{
new id = Param[0];
new client = Param[1];
new timer[32], hostname[64], name[32], name2[32], ip[32], authid2[32], country[33], site[64];

get_user_name(id, name, 31);
get_user_name(client, name2, 31);
get_user_authid(client, authid2, 31);
get_user_ip(client, ip, 31, 1);

geoip_country(ip, country);

get_time("%d/%m/%Y - %H:%M:%S", timer, 63);

get_cvar_string("hostname", hostname, charsmax(hostname));
get_pcvar_string(ab_website, site, charsmax(site));

switch(get_pcvar_num(g_MsgType))
{
case 1:
{
/* Show screen messages in chat */
client_printc(client,"%L", client, "SS_MSG1", name);
client_printc(client,"%L", client, "SS_MSG2", timer, hostname);
client_printc(client,"%L", client, "SS_MSG3", name2, ip, authid2, country);
client_printc(client,"%L", client, "SS_MSG4", site);
}
case 2:
{
/* Show screen messages in hud */
set_hudmessage(255, 255, 255, -1.0, 0.1, 0, 0.25, 1.0, 0.0, 0.0, 4);
show_hudmessage(client, "%L", client, "SS_MSG_HUD", timer, hostname, name2, ip, authid2, country, site);
}
case 3:
{
/* Show screen messages in chat */
client_printc(client,"%L", client, "SS_MSG1", name);
client_printc(client,"%L", client, "SS_MSG2", timer, hostname);
client_printc(client,"%L", client, "SS_MSG3", name2, ip, authid2, country);
client_printc(client,"%L", client, "SS_MSG4", site);

/* Show screen messages in hud */
set_hudmessage(255, 255, 255, -1.0, 0.1, 0, 0.25, 1.0, 0.0, 0.0, -1);
show_hudmessage(client, "%L", client, "SS_MSG_HUD", timer, hostname, name2, ip, authid2, country, site);
}
}

set_task(Float:get_pcvar_float(g_DelaySS), "SS_DO", 0, Param,2, "a", get_pcvar_num(g_SnapShot));

return PLUGIN_HANDLED;
}

public SS_Task(Param[2])
{
new client = Param[1];
new timer[32], hostname[64], name2[32], ip[32], authid2[32], country[33], site[64];

get_user_name(client, name2, 31);
get_user_authid(client, authid2, 31);
get_user_ip(client, ip, 31, 1);

geoip_country(ip, country);

get_time("%d/%m/%Y - %H:%M:%S", timer, 63);

get_cvar_string("hostname", hostname, charsmax(hostname));
get_pcvar_string(ab_website, site, charsmax(site));

switch(get_pcvar_num(g_MsgType))
{
case 1:
{
/* Show screen messages in chat */
client_printc(client,"%L", client, "SS_MSG2", timer, hostname);
client_printc(client,"%L", client, "SS_MSG3", name2, ip, authid2, country);
}
case 2:
{
/* Show screen messages in hud */
set_hudmessage(255, 255, 255, -1.0, 0.1, 0, 0.25, 1.0, 0.0, 0.0, 4);
show_hudmessage(client, "%L", client, "SS_MSG_HUD_BAN", timer, hostname, name2, ip, authid2, country);
}
case 3:
{
/* Show screen messages in chat */
client_printc(client,"%L", client, "SS_MSG2", timer, hostname);
client_printc(client,"%L", client, "SS_MSG3", name2, ip, authid2, country);

/* Show screen messages in hud */
set_hudmessage(255, 255, 255, -1.0, -1.0, 0, 0.25, 1.0, 0.0, 0.0, -1);
show_hudmessage(client, "%L", client, "SS_MSG_HUD_BAN", timer, hostname, name2, ip, authid2, country);
}
}

set_task(Float:get_pcvar_float(g_DelaySS), "SS_DO", 0, Param,2, "a", get_pcvar_num(g_SnapShot));

return PLUGIN_HANDLED;
}

public SS_DO(Param[2])
{
new client = Param[1];
if(is_user_connected(client))
client_cmd(client, "snapshot");
}


/* Stock colors for chat messages */
stock client_printc(const id, const string[], {Float, Sql, Resul,_}:...) {

new msg[191], players[32], count = 1;
vformat(msg, sizeof msg - 1, string, 3);

replace_all(msg,190,"!g","^4");
replace_all(msg,190,"!y","^1");
replace_all(msg,190,"!t","^3");

if(id)
players[0] = id;
else
get_players(players,count,"ch");

for (new i = 0 ; i < count ; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText,_, players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}













public TaskDisconnectPlayer(client)
{
server_cmd("kick #%i ^"[ AMXBans ] Вы были ЗАБАНЕНЫ. Причина бана в консоле.^"", get_user_userid(client));
}


















AddBan(const target_name[], const target_steamid[], const reason[], const length, const unban_time[], const admin_name[], const admin_steamid[])
{
#if MAX_BANS > 0
if( g_total_bans == MAX_BANS )
{
log_amx("Ban list is full! (%i)", g_total_bans);
return;
}
#endif

new f = fopen(g_ban_file, "a+");

fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
target_steamid,\
target_name,\
length,\
unban_time,\
reason,\
admin_name,\
admin_steamid
);

fclose(f);

#if MAX_BANS <= 0
static data[BannedData];
copy(data[bd_name], sizeof(data[bd_name]) - 1, target_name);
copy(data[bd_steamid], sizeof(data[bd_steamid]) - 1, target_steamid);
data[bd_banlength] = length;
copy(data[bd_unbantime], sizeof(data[bd_unbantime]) - 1, unban_time);
copy(data[bd_reason], sizeof(data[bd_reason]) - 1, reason);
copy(data[bd_admin_name], sizeof(data[bd_admin_name]) - 1, admin_name);
copy(data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1, admin_steamid);

TrieSetCell(g_trie, target_steamid, g_total_bans);
ArrayPushArray(g_array, data);
#else
copy(g_names[g_total_bans], sizeof(g_names[]) - 1, target_name);
copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1, target_steamid);
g_banlengths[g_total_bans] = length;
copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1, unban_time);
copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1, reason);
copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1, admin_name);
copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1, admin_steamid);
#endif

g_total_bans++;

#if MAX_BANS > 0
if( g_total_bans == MAX_BANS )
{
log_amx("Ban list is full! (%i)", g_total_bans);
}
#endif
}

#if MAX_BANS > 0
RemoveBan(remove)
{
for( new i = remove; i < g_total_bans; i++ )
{
if( (i + 1) == g_total_bans )
{
copy(g_names[i], sizeof(g_names[]) - 1, "");
copy(g_steamids[i], sizeof(g_steamids[]) - 1, "");
g_banlengths[i] = 0;
copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1, "");
copy(g_reasons[i], sizeof(g_reasons[]) - 1, "");
copy(g_admin_names[i], sizeof(g_admin_names[]) - 1, "");
copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1, "");
}
else
{
copy(g_names[i], sizeof(g_names[]) - 1, g_names[i + 1]);
copy(g_steamids[i], sizeof(g_steamids[]) - 1, g_steamids[i + 1]);
g_banlengths[i] = g_banlengths[i + 1];
copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1, g_unbantimes[i + 1]);
copy(g_reasons[i], sizeof(g_reasons[]) - 1, g_reasons[i + 1]);
copy(g_admin_names[i], sizeof(g_admin_names[]) - 1, g_admin_names[i + 1]);
copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1, g_admin_steamids[i + 1]);
}
}

g_total_bans--;

new f = fopen(g_ban_file, "wt");

static name[32], steamid[35], banlength, unbantime[32], reason[128], admin_name[32], admin_steamid[35];
for( new i = 0; i < g_total_bans; i++ )
{
copy(name, sizeof(name) - 1, g_names[i]);
copy(steamid, sizeof(steamid) - 1, g_steamids[i]);
banlength = g_banlengths[i];
copy(unbantime, sizeof(unbantime) - 1, g_unbantimes[i]);
copy(reason, sizeof(reason) - 1, g_reasons[i]);
copy(admin_name, sizeof(admin_name) - 1, g_admin_names[i]);
copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids[i]);

fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
steamid,\
name,\
banlength,\
unbantime,\
reason,\
admin_name,\
admin_steamid
);
}

fclose(f);
}
#else
RemoveBan(pos, const authid[])
{
TrieDeleteKey(g_trie, authid);
ArrayDeleteItem(g_array, pos);

g_total_bans--;

new f = fopen(g_ban_file, "wt");

new data[BannedData];
for( new i = 0; i < g_total_bans; i++ )
{
ArrayGetArray(g_array, i, data);
TrieSetCell(g_trie, data[bd_steamid], i);

fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
data[bd_steamid],\
data[bd_name],\
data[bd_banlength],\
data[bd_unbantime],\
data[bd_reason],\
data[bd_admin_name],\
data[bd_admin_steamid]
);
}

fclose(f);
}
#endif

#if defined KEEP_DEFAULT_BANS
LoadOldBans(filename[])
{
if( file_exists(filename) )
{
new f = fopen(filename, "rt");

static data[96];
static command[10], minutes[10], steamid[35], length, unban_time[32];

while( !feof(f) )
{
fgets(f, data, sizeof(data) - 1);
if( !data[0] ) continue;

parse(data, command, sizeof(command) - 1, minutes, sizeof(minutes) - 1, steamid, sizeof(steamid) - 1);
if( filename[0] == 'b' && !equali(command, "banid") || filename[0] == 'l' && !equali(command, "addip") ) continue;

length = str_to_num(minutes);
GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);

AddBan("", steamid, "", length, unban_time, "", "");
}

fclose(f);

static filename2[32];

// copy current
copy(filename2, sizeof(filename2) - 1, filename);

// cut off at the "."
// banned.cfg = banned
// listip.cfg = listip
filename2[containi(filename2, ".")] = 0;

// add 2.cfg
// banned = banned2.cfg
// listip = listip2.cfg
add(filename2, sizeof(filename2) - 1, "2.cfg");

// rename file so that it isnt loaded again
while( !rename_file(filename, filename2, 1) ) { }
}
}
#endif

LoadBans()
{
if( file_exists(g_ban_file) )
{
new f = fopen(g_ban_file, "rt");

static filedata[512], length[10];

#if MAX_BANS <= 0
static data[BannedData];
while( !feof(f) )
#else
while( !feof(f) && g_total_bans < MAX_BANS )
#endif
{
fgets(f, filedata, sizeof(filedata) - 1);

if( !filedata[0] ) continue;

#if MAX_BANS <= 0
parse(filedata,\
data[bd_steamid], sizeof(data[bd_steamid]) - 1,\
data[bd_name], sizeof(data[bd_name]) - 1,\
length, sizeof(length) - 1,\
data[bd_unbantime], sizeof(data[bd_unbantime]) - 1,\
data[bd_reason], sizeof(data[bd_reason]) - 1,\
data[bd_admin_name], sizeof(data[bd_admin_name]) - 1,\
data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1
);

data[bd_banlength] = str_to_num(length);

ArrayPushArray(g_array, data);
TrieSetCell(g_trie, data[bd_steamid], g_total_bans);
#else
static steamid[35], name[32], unbantime[32], reason[128], admin_name[32], admin_steamid[35];

parse(filedata,\
steamid, sizeof(steamid) - 1,\
name, sizeof(name) - 1,\
length, sizeof(length) - 1,\
unbantime, sizeof(unbantime) - 1,\
reason, sizeof(reason) - 1,\
admin_name, sizeof(admin_name) - 1,\
admin_steamid, sizeof(admin_steamid) - 1
);

copy(g_names[g_total_bans], sizeof(g_names[]) - 1, name);
copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1, steamid);
g_banlengths[g_total_bans] = str_to_num(length);
copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1, unbantime);
copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1, reason);
copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1, admin_name);
copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1, admin_steamid);
#endif

g_total_bans++;
}

fclose(f);
}

// load these after, so when they are added to the file with AddBan(), they aren't loaded again from above.

#if defined KEEP_DEFAULT_BANS
LoadOldBans("banned.cfg");
LoadOldBans("listip.cfg");
#endif
}

GetBanTime(const bantime, length[], len)
{
new minutes = bantime;
new hours = 0;
new days = 0;

while( minutes >= 60 )
{
minutes -= 60;
hours++;
}

while( hours >= 24 )
{
hours -= 24;
days++;
}

new bool:add_before;
if( minutes )
{
formatex(length, len, "%i минут", minutes, minutes == 1 ? "" : "");

add_before = true;
}
if( hours )
{
if( add_before )
{
format(length, len, "%i час%а, %а", hours, hours == 1 ? "" : "а", length);
}
else
{
formatex(length, len, "%i час%(а,ов)", hours, hours == 1 ? "" : "(а,ов)");

add_before = true;
}
}
if( days )
{
if( add_before )
{
format(length, len, "%i ден%ь, %ь", days, days == 1 ? "" : "ь", length);
}
else
{
formatex(length, len, "%i дн%(я,ей)", days, days == 1 ? "" : "(я,ей)");

add_before = true;
}
}
if( !add_before )
{
// minutes, hours, and days = 0
// assume permanent ban
copy(length, len, "Бан навсегда");
}
}

GenerateUnbanTime(const bantime, unban_time[], len)
{
static _hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
format_time(_hours, sizeof(_hours) - 1, "%H");
format_time(_minutes, sizeof(_minutes) - 1, "%M");
format_time(_seconds, sizeof(_seconds) - 1, "%S");
format_time(_month, sizeof(_month) - 1, "%m");
format_time(_day, sizeof(_day) - 1, "%d");
format_time(_year, sizeof(_year) - 1, "%Y");

new hours = str_to_num(_hours);
new minutes = str_to_num(_minutes);
new seconds = str_to_num(_seconds);
new month = str_to_num(_month);
new day = str_to_num(_day);
new year = str_to_num(_year);

minutes += bantime;

while( minutes >= 60 )
{
minutes -= 60;
hours++;
}

while( hours >= 24 )
{
hours -= 24;
day++;
}

new max_days = GetDaysInMonth(month, year);
while( day > max_days )
{
day -= max_days;
month++;
}

while( month > 12 )
{
month -= 12;
year++;
}

formatex(unban_time, len, "%i:%02i:%02i %i/%i/%i", hours, minutes, seconds, month, day, year);
}

GetDaysInMonth(month, year=0)
{
switch( month )
{
case 1: return 31; // january
case 2: return ((year % 4) == 0) ? 29 : 28; // february
case 3: return 31; // march
case 4: return 30; // april
case 5: return 31; // may
case 6: return 30; // june
case 7: return 31; // july
case 8: return 31; // august
case 9: return 30; // september
case 10: return 31; // october
case 11: return 30; // november
case 12: return 31; // december
}

return 30;
}

GetTargetFlags(client)
{
static const flags_no_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS);
static const flags_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS|CMDTARGET_OBEY_IMMUNITY);

switch( get_pcvar_num(ab_immunity) )
{
case 1: return flags_immunity;
case 2: return access(client, ADMIN_IMMUNITY) ? flags_no_immunity : flags_immunity;
}

return flags_no_immunity;
}

GetMaxBanTime(client)
{
if( !g_total_maxban_times ) return 0;

new flags = get_user_flags(client);

for( new i = 0; i < g_total_maxban_times; i++ )
{
#if !defined MAX_BANLIMITS
if( flags & ArrayGetCell(g_maxban_flags, i) )
{
return ArrayGetCell(g_maxban_times, i);
}
#else
if( flags & g_maxban_flags[i] )
{
return g_maxban_times[i];
}
#endif
}

return 0;
}

PrintBanInformation(client, const target_name[], const target_authid[], const reason[], const length, const unban_time[], const admin_name[], const admin_ip[], bool:show_admin, bool:show_website)
{
static website[64], ban_length[64];
if( client == 0 )
{
server_print("[AMXBANS]==========[AMXBANS]==========[AMXBANS]");
server_print("%L", client, "AB_BAN_INFORMATION");
server_print("%L: %s", client, "AB_NAME", target_name);
server_print("%L: %s", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
server_print("%L: %s", client, "AB_REASON", reason);
if( length > 0 )
{
GetBanTime(length, ban_length, sizeof(ban_length) - 1);
server_print("%L: %s", client, "AB_BAN_LENGTH", ban_length);
}
server_print("%L: %s", client, "AB_UNBAN_TIME", unban_time);
if( show_admin )
{
server_print("%L: %s", client, "AB_ADMIN_NAME", admin_name);
server_print("%L: %s", client, "AB_ADMIN_IP", admin_ip);
}
if( show_website )
{
get_pcvar_string(ab_website, website, sizeof(website) - 1);
if( website[0] )
{
server_print("");
server_print("%L", client, "AB_WEBSITE");
server_print("%s", website);
}
}
server_print("[AMXBANS]==========[AMXBANS]==========[AMXBANS]");
}
else
{
client_cmd(client, "echo ^"[AMXBANS]==========[AMXBANS]==========[AMXBANS]^"");
client_cmd(client, "echo ^"%L^"", client, "AB_BAN_INFORMATION");
client_cmd(client, "echo ^"%L: %s^"", client, "AB_NAME", target_name);
client_cmd(client, "echo ^"%L: %s^"", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
client_cmd(client, "echo ^"%L: %s^"", client, "AB_REASON", reason);
if( length > 0 )
{
GetBanTime(length, ban_length, sizeof(ban_length) - 1);
client_cmd(client, "echo ^"%L: %s^"", client, "AB_BAN_LENGTH", ban_length);
}
client_cmd(client, "echo ^"%L: %s^"", client, "AB_UNBAN_TIME", unban_time);
if( show_website )
{
get_pcvar_string(ab_website, website, sizeof(website) - 1);
if( website[0] )
{
client_cmd(client, "echo ^"^"");
client_cmd(client, "echo ^"%L^"", client, "AB_WEBSITE");
client_cmd(client, "echo ^"%s^"", website);
}
}
client_cmd(client, "echo ^"[AMXBANS]==========[AMXBANS]==========[AMXBANS]^"");
}
}

PrintActivity(const admin_name[], const message_fmt[], any:...)
{
if( !get_playersnum() ) return;

new activity = get_pcvar_num(amx_show_activity);
if( !(0 <= activity <= 5) )
{
set_pcvar_num(amx_show_activity, (activity = 2));
}

static message[192], temp[192];
vformat(message, sizeof(message) - 1, message_fmt, 3);

for( new client = 1; client <= g_max_clients; client++ )
{
if( !is_user_connected(client) ) continue;

switch( is_user_admin(client) ? g_admin_activity[activity] : g_normal_activity[activity] )
{
case ACTIVITY_NONE:
{

}
case ACTIVITY_HIDE:
{
copy(temp, sizeof(temp) - 1, message);
replace(temp, sizeof(temp) - 1, "$name", "ADMIN");

message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
write_byte(client);
write_string(temp);
message_end();
}
case ACTIVITY_SHOW:
{
copy(temp, sizeof(temp) - 1, message);
replace(temp, sizeof(temp) - 1, "$name", admin_name);

message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
write_byte(client);
write_string(temp);
message_end();
}
}
}
}

Print(const message_fmt[], any:...)
{
if( !get_playersnum() ) return;

static message[192];
vformat(message, sizeof(message) - 1, message_fmt, 2);

for( new client = 1; client <= g_max_clients; client++ )
{
if( !is_user_connected(client) ) continue;

message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
write_byte(client);
write_string(message);
message_end();
}
}

Log(const message_fmt[], any:...)
{
static message[256];
vformat(message, sizeof(message) - 1, message_fmt, 2);

static filename[96];
#if defined HISTORY_ONE_FILE
if( !filename[0] )
{
get_basedir(filename, sizeof(filename) - 1);
add(filename, sizeof(filename) - 1, "/logs/ban_history.log");
}
#else
static dir[64];
if( !dir[0] )
{
get_basedir(dir, sizeof(dir) - 1);
add(dir, sizeof(dir) - 1, "/logs");
}

format_time(filename, sizeof(filename) - 1, "%m%d%Y");
format(filename, sizeof(filename) - 1, "%s/BAN_HISTORY_%s.log", dir, filename);
#endif

log_amx("%s", message);
log_to_file(filename, "%s", message);
}

Прикрепленный файл  advanced_bans.sma ( 44.04 килобайт ) Кол-во скачиваний: 0


Отредактировал: D9D9, - 18.7.2017, 23:11
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя D9D9
сообщение 19.7.2017, 8:16
Сообщение #100
Стаж: 2 года 10 месяцев

Сообщений: 323
Благодарностей: 38
Полезность: < 0

Неужели никто не поможет? cray.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
5 страниц V  « 4 5
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 2 гостей читают эту тему: