Subb98 писал(а):cs_4ever, попробуйте такой вариант:
- Код: Выделить всё
new const PLAYERS_MENU_ID[] = "_sbm_players_menu";
new const CONFIRM_MENU_ID[] = "_sbm_confirm_menu";
const MAX_PLAYERS = 32; const CONFIRM_MENU_KEYS = MENU_KEY_1|MENU_KEY_2;
const PLAYERS_PER_PAGE = 8;
const BAN_TIME = 60; 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");
}
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);
}
}
public CmdSubnetBanMenu(const id) {
if(get_user_flags(id) & ADMIN_BAN) {
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(i != 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);
client_print(0, print_chat, "%L", id, "SBM_ADMIN_BANNED", AdmName, UsrName, BAN_TIME);
Logging(g_LogsDir, "%s <%s> banned subnet [%s] of %s <%s> for %d min.", AdmName, AdmAuthId, Subnet, UsrName, UsrAuthId, BAN_TIME);
}
}
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!
И я так понял при рестарте сервера бан слетает и не важно на сколько была забанена подсеть!
Можно это исправить, что бы он записывал баны и не слетал бан?
спасибо!