Русское сообщество по скриптингу

Subnet Ban Menu: блокировка игроков с динамическим SteamID

Утвержденные плагины для AMX Mod X администратором/модератором форума.

Модератор: Leonidddd

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только работоспособных плагинов для AMX Mod X. Новые плагины нужно выкладывать в разделе "Новые плагины".

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение Subb98 » 14 янв 2017, 22:54

cs_4ever, попробуйте такой вариант:

Код: Выделить всё
/* Subnet ban menu 0.2 [14.01.2017] */

#include <amxmodx>

#pragma semicolon 1

#define USE_LOGGING // comment out this line, if you don't want to use logging
#define USE_CHAT_ALERT // comment out this line, if you don't want to use chat-alert

new const PLAYERS_MENU_ID[] = "_sbm_players_menu";
new const 
CONFIRM_MENU_ID[] = "_sbm_confirm_menu";

#if AMXX_VERSION_NUM < 183
    
const MAX_PLAYERS 32// max players on the server
#endif

const CONFIRM_MENU_KEYS MENU_KEY_1|MENU_KEY_2;
const 
PLAYERS_PER_PAGE 8;
const 
BAN_TIME 60// in minutes

new g_Position[MAX_PLAYERS 1], g_Players[MAX_PLAYERS 1][32], g_UserId[MAX_PLAYERS 1][MAX_PLAYERS 1], g_Target[MAX_PLAYERS 1];

public 
plugin_init() {
    
register_plugin("Subnet ban menu""0.2""Subb98");
    
register_dictionary("subnet_ban_menu.txt");
    
register_clcmd("subnetbanmenu""CmdSubnetBanMenu");
    
register_menucmd(register_menuid(PLAYERS_MENU_ID), 1023"HandlePlayersMenu");
    
register_menucmd(register_menuid(CONFIRM_MENU_ID), CONFIRM_MENU_KEYS"HandleConfirmMenu");
}

#if defined USE_LOGGING
const PATH_STRLEN 96;
new 
g_LogsDir[PATH_STRLEN];

public 
plugin_cfg() {
    
get_localinfo("amxx_logs"g_LogsDircharsmax(g_LogsDir));
    
add(g_LogsDircharsmax(g_LogsDir), "/subnet_ban_menu");
    if(!
dir_exists(g_LogsDir)) {
        
mkdir(g_LogsDir);
    }
}
#endif

public CmdSubnetBanMenu(const id) {
    if(
get_user_flags(id) & ADMIN_BAN/* access level */) {
        return 
ShowPlayersMenu(idg_Position[id] = 0);
    }
    
console_print(id"%L"id"SBM_NO_ACC");
    return 
PLUGIN_HANDLED;
}

ShowPlayersMenu(const idPos) {
    if(
Pos 0) {
        return 
PLUGIN_HANDLED;
    }
    new 
PlayersNumStartEndPagesNumLenMenu[512], iName[32], bKeys MENU_KEY_0;
    
get_players(g_Players[id], PlayersNum"ch");
    if((
Start Pos PLAYERS_PER_PAGE) >= PlayersNum) {
        
Start Pos g_Position[id] = 0;
    }
    if((
End Start PLAYERS_PER_PAGE) > PlayersNum) {
        
End PlayersNum;
    }
    
PagesNum PlayersNum PLAYERS_PER_PAGE + (PlayersNum PLAYERS_PER_PAGE 0);
    if(
PagesNum == 1) {
        
Len formatex(Menucharsmax(Menu), "\y%L^n^n"id"SBM_PLAYERS_MENU_TITLE");
    } else {
        
Len formatex(Menucharsmax(Menu), "\y%L \d(%d/%d)^n^n"id"SBM_PLAYERS_MENU_TITLE"Pos 1PagesNum);
    }
    while(
Start End) {
        
g_Players[id][Start++];
        
g_UserId[id][i] = get_user_userid(i);
        
get_user_name(iNamecharsmax(Name));
        if(
!= id && get_user_flags(i) & ADMIN_IMMUNITY) {
            
Len += formatex(Menu[Len], charsmax(Menu) - Len"\d%d. %s^n", ++bName);
        } else {
            
Keys |= (1<<b);
            
Len += formatex(Menu[Len], charsmax(Menu) - Len"\y%d. \w%s%s^n", ++bName== id " \r*" "");
        }
    }
    if(
End PlayersNum) {
        
Keys |= MENU_KEY_9;
        
formatex(Menu[Len], charsmax(Menu) - Len"^n\y9. \w%L^n\y0. \w%L"id"SBM_NEXT"idPos "SBM_BACK" "SBM_EXIT");
    } else {
        
formatex(Menu[Len], charsmax(Menu) - Len"^n\y0. \w%L"idPos "SBM_BACK" "SBM_EXIT");
    }
    return 
show_menu(idKeysMenu, -1PLAYERS_MENU_ID);
}

public 
HandlePlayersMenu(const id, const Key) {
    switch(
Key) {
        case 
8: {
            
ShowPlayersMenu(id, ++g_Position[id]);
        }
        case 
9: {
            
ShowPlayersMenu(id, --g_Position[id]);
        }
        default: {
            new 
Target g_Players[id][g_Position[id] * PLAYERS_PER_PAGE Key];
            if(
get_user_userid(Target) == g_UserId[id][Target]) {
                
g_Target[id] = Target;
                
ShowConfirmMenu(id);
            } else {
                
client_print(idprint_chat"%L"id"SBM_CLIENT_DISCONNECTED");
            }
        }
    }
}

ShowConfirmMenu(const id) {
    new 
Menu[512], Name[32];
    
get_user_name(g_Target[id], Namecharsmax(Name));
    
formatex(Menucharsmax(Menu), "\y%L^n^n\d%L^n^n\y1. \w%L^n\y2. \w%L"id"SBM_CONFIRM_MENU_TITLE"id"SBM_CONFIRM_MENU_TEXT"Nameid"SBM_YES"id"SBM_NO");
    
show_menu(idCONFIRM_MENU_KEYSMenu, -1CONFIRM_MENU_ID);
}

public 
HandleConfirmMenu(const id, const Key) {
    if(
Key) {
        
ShowPlayersMenu(idg_Position[id] = 0);
    } else {
        new 
Ip[16], Subnet[16], CountiAdmName[32], UsrName[32], AdmAuthId[24], UsrAuthId[24];
        
get_user_ip(g_Target[id], Ipcharsmax(Ip), 1);
        while(
Count 2) {
            if(
Ip[i++] == '.') {
                
Count++;
            }
        }
        
copy(SubnetiIp);
        
add(Subnetcharsmax(Subnet), "0.0");
        
get_user_name(idAdmNamecharsmax(AdmName));
        
get_user_name(g_Target[id], UsrNamecharsmax(UsrName));
        
get_user_authid(idAdmAuthIdcharsmax(AdmAuthId));
        
get_user_authid(g_Target[id], UsrAuthIdcharsmax(UsrAuthId));
        
server_cmd("addip %d %s"BAN_TIMESubnet);
        
#if defined USE_CHAT_ALERT
        
client_print(0print_chat"%L"id"SBM_ADMIN_BANNED"AdmNameUsrNameBAN_TIME);
        
#endif
        #if defined USE_LOGGING
        
Logging(g_LogsDir"%s <%s> banned subnet [%s] of %s <%s> for %d min."AdmNameAdmAuthIdSubnetUsrNameUsrAuthIdBAN_TIME);
        
#endif
    
}
}

stock Logging(const LogsDir[], const Message[], any:...) {
    new 
Msg[256], Time[22], File[PATH_STRLEN 14], _File;
    
vformat(Msgcharsmax(Msg), Message3);
    
get_time("%Y%m%d.log"Timecharsmax(Time));
    
formatex(Filecharsmax(File), "%s/%s"LogsDirTime);
    
_File fopen(File"at");
    
get_time("%Y/%m/%d - %H:%M:%S"Timecharsmax(Time));
    
fprintf(_File"%s: %s^n"TimeMsg);
    
fclose(_File);
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение ganja_dypb » 25 окт 2017, 22:11

Subb98 писал(а):cs_4ever, попробуйте такой вариант:

Код: Выделить всё
/* Subnet ban menu 0.2 [14.01.2017] */

#include <amxmodx>

#pragma semicolon 1

#define USE_LOGGING // comment out this line, if you don't want to use logging
#define USE_CHAT_ALERT // comment out this line, if you don't want to use chat-alert

new const PLAYERS_MENU_ID[] = "_sbm_players_menu";
new const CONFIRM_MENU_ID[] = "_sbm_confirm_menu";

#if AMXX_VERSION_NUM < 183
    const MAX_PLAYERS = 32; // max players on the server
#endif

const CONFIRM_MENU_KEYS = MENU_KEY_1|MENU_KEY_2;
const PLAYERS_PER_PAGE = 8;
const BAN_TIME = 60; // in minutes

new g_Position[MAX_PLAYERS + 1], g_Players[MAX_PLAYERS + 1][32], g_UserId[MAX_PLAYERS + 1][MAX_PLAYERS + 1], g_Target[MAX_PLAYERS + 1];

public plugin_init() {
    register_plugin("Subnet ban menu", "0.2", "Subb98");
    register_dictionary("subnet_ban_menu.txt");
    register_clcmd("subnetbanmenu", "CmdSubnetBanMenu");
    register_menucmd(register_menuid(PLAYERS_MENU_ID), 1023, "HandlePlayersMenu");
    register_menucmd(register_menuid(CONFIRM_MENU_ID), CONFIRM_MENU_KEYS, "HandleConfirmMenu");
}

#if defined USE_LOGGING
const PATH_STRLEN = 96;
new g_LogsDir[PATH_STRLEN];

public plugin_cfg() {
    get_localinfo("amxx_logs", g_LogsDir, charsmax(g_LogsDir));
    add(g_LogsDir, charsmax(g_LogsDir), "/subnet_ban_menu");
    if(!dir_exists(g_LogsDir)) {
        mkdir(g_LogsDir);
    }
}
#endif

public CmdSubnetBanMenu(const id) {
    if(get_user_flags(id) & ADMIN_BAN/* access level */) {
        return ShowPlayersMenu(id, g_Position[id] = 0);
    }
    console_print(id, "%L", id, "SBM_NO_ACC");
    return PLUGIN_HANDLED;
}

ShowPlayersMenu(const id, Pos) {
    if(Pos < 0) {
        return PLUGIN_HANDLED;
    }
    new PlayersNum, Start, End, PagesNum, Len, Menu[512], i, Name[32], b, Keys = MENU_KEY_0;
    get_players(g_Players[id], PlayersNum, "ch");
    if((Start = Pos * PLAYERS_PER_PAGE) >= PlayersNum) {
        Start = Pos = g_Position[id] = 0;
    }
    if((End = Start + PLAYERS_PER_PAGE) > PlayersNum) {
        End = PlayersNum;
    }
    PagesNum = PlayersNum / PLAYERS_PER_PAGE + (PlayersNum % PLAYERS_PER_PAGE ? 1 : 0);
    if(PagesNum == 1) {
        Len = formatex(Menu, charsmax(Menu), "\y%L^n^n", id, "SBM_PLAYERS_MENU_TITLE");
    } else {
        Len = formatex(Menu, charsmax(Menu), "\y%L \d(%d/%d)^n^n", id, "SBM_PLAYERS_MENU_TITLE", Pos + 1, PagesNum);
    }
    while(Start < End) {
        i = g_Players[id][Start++];
        g_UserId[id][i] = get_user_userid(i);
        get_user_name(i, Name, charsmax(Name));
        if(!= id && get_user_flags(i) & ADMIN_IMMUNITY) {
            Len += formatex(Menu[Len], charsmax(Menu) - Len, "\d%d. %s^n", ++b, Name);
        } else {
            Keys |= (1<<b);
            Len += formatex(Menu[Len], charsmax(Menu) - Len, "\y%d. \w%s%s^n", ++b, Name, i == id ? " \r*" : "");
        }
    }
    if(End < PlayersNum) {
        Keys |= MENU_KEY_9;
        formatex(Menu[Len], charsmax(Menu) - Len, "^n\y9. \w%L^n\y0. \w%L", id, "SBM_NEXT", id, Pos ? "SBM_BACK" : "SBM_EXIT");
    } else {
        formatex(Menu[Len], charsmax(Menu) - Len, "^n\y0. \w%L", id, Pos ? "SBM_BACK" : "SBM_EXIT");
    }
    return show_menu(id, Keys, Menu, -1, PLAYERS_MENU_ID);
}

public HandlePlayersMenu(const id, const Key) {
    switch(Key) {
        case 8: {
            ShowPlayersMenu(id, ++g_Position[id]);
        }
        case 9: {
            ShowPlayersMenu(id, --g_Position[id]);
        }
        default: {
            new Target = g_Players[id][g_Position[id] * PLAYERS_PER_PAGE + Key];
            if(get_user_userid(Target) == g_UserId[id][Target]) {
                g_Target[id] = Target;
                ShowConfirmMenu(id);
            } else {
                client_print(id, print_chat, "%L", id, "SBM_CLIENT_DISCONNECTED");
            }
        }
    }
}

ShowConfirmMenu(const id) {
    new Menu[512], Name[32];
    get_user_name(g_Target[id], Name, charsmax(Name));
    formatex(Menu, charsmax(Menu), "\y%L^n^n\d%L^n^n\y1. \w%L^n\y2. \w%L", id, "SBM_CONFIRM_MENU_TITLE", id, "SBM_CONFIRM_MENU_TEXT", Name, id, "SBM_YES", id, "SBM_NO");
    show_menu(id, CONFIRM_MENU_KEYS, Menu, -1, CONFIRM_MENU_ID);
}

public HandleConfirmMenu(const id, const Key) {
    if(Key) {
        ShowPlayersMenu(id, g_Position[id] = 0);
    } else {
        new Ip[16], Subnet[16], Count, i, AdmName[32], UsrName[32], AdmAuthId[24], UsrAuthId[24];
        get_user_ip(g_Target[id], Ip, charsmax(Ip), 1);
        while(Count < 2) {
            if(Ip[i++] == '.') {
                Count++;
            }
        }
        copy(Subnet, i, Ip);
        add(Subnet, charsmax(Subnet), "0.0");
        get_user_name(id, AdmName, charsmax(AdmName));
        get_user_name(g_Target[id], UsrName, charsmax(UsrName));
        get_user_authid(id, AdmAuthId, charsmax(AdmAuthId));
        get_user_authid(g_Target[id], UsrAuthId, charsmax(UsrAuthId));
        server_cmd("addip %d %s", BAN_TIME, Subnet);
        #if defined USE_CHAT_ALERT
        client_print(0, print_chat, "%L", id, "SBM_ADMIN_BANNED", AdmName, UsrName, BAN_TIME);
        #endif
        #if defined USE_LOGGING
        Logging(g_LogsDir, "%s <%s> banned subnet [%s] of %s <%s> for %d min.", AdmName, AdmAuthId, Subnet, UsrName, UsrAuthId, BAN_TIME);
        #endif
    }
}

stock Logging(const LogsDir[], const Message[], any:...) {
    new Msg[256], Time[22], File[PATH_STRLEN + 14], _File;
    vformat(Msg, charsmax(Msg), Message, 3);
    get_time("%Y%m%d.log", Time, charsmax(Time));
    formatex(File, charsmax(File), "%s/%s", LogsDir, Time);
    _File = fopen(File, "at");
    get_time("%Y/%m/%d - %H:%M:%S", Time, charsmax(Time));
    fprintf(_File, "%s: %s^n", Time, Msg);
    fclose(_File);
}

Поставил такие настройки:
const BAN_TIME = 0; // in minutes навсегда бан подсети
Но нет не каких записей в файле listip.cfg или banned.cfg!
И я так понял при рестарте сервера бан слетает и не важно на сколько была забанена подсеть!
Можно это исправить, что бы он записывал баны и не слетал бан?
спасибо!
Аватара пользователя
ganja_dypb
 
Сообщения: 12
Зарегистрирован: 22 окт 2016, 18:19
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: C++
Php

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение RevCrew » 25 окт 2017, 23:02

Код: Выделить всё
server_cmd("addip %d %s"BAN_TIMESubnet); 

>>
Код: Выделить всё
server_cmd("addip %d %s;wait; writeip"BAN_TIMESubnet); 
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение ganja_dypb » 25 окт 2017, 23:46

Работает!
Подскажите есть возможность сделать, чтобы он записывал в listip.cfg баны подсетей с ограниченным временем, т.е. например const BAN_TIME = 10080 in minutes 7 дней или 1440 день?
Аватара пользователя
ganja_dypb
 
Сообщения: 12
Зарегистрирован: 22 окт 2016, 18:19
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: C++
Php

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение RevCrew » 26 окт 2017, 00:12

ganja_dypb, нет, НЕ перманентные баны удаляются после смены карты
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение BaHeK » 26 окт 2017, 12:30

RevCrew писал(а):ganja_dypb, нет, НЕ перманентные баны удаляются после смены карты

После перезапуска сервера они удаляются, после смены карты еще есть на сервере
Код: Выделить всё
IP filter list:
127.  0.  0.  2 : 10.000 min
...
L 10/26/2017 - 11:28:19: -------- Mapchange to de_dust2 --------
...
IP filter list:
127.  0.  0.  2 : 10.000 min

[spoiler]Я VS VolksWagen POLO, МКАД
Психанул или моя русская рулетка
http://cs618330.vk.me/v618330946/8c16/hEeTVyYjCZw.jpg - Ой как плохо поступил[/spoiler]
Аватара пользователя
BaHeK
Скриптер
 
Сообщения: 544
Зарегистрирован: 26 авг 2011, 19:32
Откуда: Москва
Благодарил (а): 403 раз.
Поблагодарили: 261 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение ganja_dypb » 26 окт 2017, 16:33

А есть похожий плагин?
спасибо за помощь!
Аватара пользователя
ganja_dypb
 
Сообщения: 12
Зарегистрирован: 22 окт 2016, 18:19
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: C++
Php

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение RevCrew » 26 окт 2017, 21:15

BaHeK, а они действуют после смены карты?
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Subnet Ban Menu: блокировка игроков с динамическим Steam

Сообщение ganja_dypb » 27 окт 2017, 00:38

RevCrew писал(а):BaHeK, а они действуют после смены карты?

да сохраняются я так понял в оперативной памяти, ребут автоудаление!
Аватара пользователя
ganja_dypb
 
Сообщения: 12
Зарегистрирован: 22 окт 2016, 18:19
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: C++
Php

Пред.

Вернуться в Утвержденные плагины

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6