From 1d54e1b85a6376b7228fb7b39a178abd7799bfe4 Mon Sep 17 00:00:00 2001 From: Sithranduil Date: Tue, 11 Sep 2018 00:32:27 +0200 Subject: [PATCH] First release --- configs/sm_limit_ban_duration.ini | 175 ++++++++ plugins/lbd_basebans.smx | Bin 0 -> 13393 bytes plugins/lbd_sbpp_main.smx | Bin 0 -> 36168 bytes plugins/sm_limit_ban_duration.smx | Bin 0 -> 12124 bytes scripting/include/sm_limit_ban_duration.inc | 65 +++ scripting/lbd_basebans.sp | 41 +- scripting/lbd_sbpp_main.sp | 84 +++- scripting/sm_limit_ban_duration.sp | 425 ++++++++++++++++++ .../sm_limit_ban_duration.phrases.txt | 35 ++ 9 files changed, 806 insertions(+), 19 deletions(-) create mode 100644 configs/sm_limit_ban_duration.ini create mode 100644 plugins/lbd_basebans.smx create mode 100644 plugins/lbd_sbpp_main.smx create mode 100644 plugins/sm_limit_ban_duration.smx create mode 100644 scripting/include/sm_limit_ban_duration.inc create mode 100644 scripting/sm_limit_ban_duration.sp create mode 100644 translations/sm_limit_ban_duration.phrases.txt diff --git a/configs/sm_limit_ban_duration.ini b/configs/sm_limit_ban_duration.ini new file mode 100644 index 0000000..4c3084e --- /dev/null +++ b/configs/sm_limit_ban_duration.ini @@ -0,0 +1,175 @@ +"Limit_Ban_Durations" +{ + //-=-=-=-=-=-=-=-=-=-=-=-=-= + //"#_of_minutes" + //{ + // "override" "Limit_Ban_Duration" + // "flags" "flag1,flag2,flag3" + // "display" "X Minutes/Hours/Seconds/Years/Months/Jiggawatts" + //} + //-=-=-=-=-=-=-=-=-=-=-=-=-= + //- #_of_minutes is the maximum value for that rank. If you give an admin access to "5", they can ban up to 5 minutes, but no more. + // + //- "0" seconds indicates a permanent punishment. Only one "0" entry will be considered. + // + //- Both "override" and "flags" definitions are necessary when restricting a specific duration. Using one without the other will result in undesired behavior. + // - You're not required to use the "override" or even have Overrides set up on your server, but the definition is necessary for the method being used. + // - When in doubt, just use an override of "Limit_Ban_Duration". Set it and forget it the saying goes! + // - "flags" are checked when the user does not have access to the provided "override", so a bogus override allows for just flag usage. + // - When specifying multiple flags, users must possess all flags to access the specific duration. + // - For example, "flags" "a,b,c" will require the user possess all three flags. + // + //- An "override" and "flags" definition of "" will result in no restriction being placed upon that length. + // - Do not do silly things such as block off "5" minutes yet allow "15" minutes; the plugin will durations arrange times from low to high and assumes you're not an idiot. + // + //- The "display" parameter is displayed to clients when accessing the ban parameter is a modified ban plugin. + //-=-=-=-=-=-=-=-=-=-=-=-=-= + + "5" + { + "override" "" + "flags" "" + + "display" "5 Minutes" + } + "10" + { + "override" "" + "flags" "" + + "display" "10 Minutes" + } + "15" + { + "override" "" + "flags" "" + + "display" "15 Minutes" + } + "30" + { + "override" "" + "flags" "" + + "display" "30 Minutes" + } + "45" + { + "override" "" + "flags" "" + + "display" "45 Minutes" + } + "60" + { + "override" "" + "flags" "" + + "display" "60 Minutes" + } + "120" + { + "override" "" + "flags" "" + + "display" "2 Hours" + } + "180" + { + "override" "" + "flags" "" + + "display" "3 Hours" + } + "360" + { + "override" "" + "flags" "" + + "display" "6 Hours" + } + "720" + { + "override" "" + "flags" "" + + "display" "12 Hours" + } + "1440" + { + "override" "" + "flags" "" + + "display" "24 Hours" + } + "2880" + { + "override" "" + "flags" "" + + "display" "2 Days" + } + "4320" + { + "override" "" + "flags" "" + + "display" "3 Days" + } + "5760" + { + "override" "" + "flags" "" + + "display" "4 Days" + } + "7200" + { + "override" "" + "flags" "" + + "display" "5 Days" + } + "8640" + { + "override" "" + "flags" "" + + "display" "6 Days" + } + "10080" + { + "override" "" + "flags" "" + + "display" "7 Days" + } + "20160" + { + "override" "" + "flags" "" + + "display" "2 Weeks" + } + "30240" + { + "override" "" + "flags" "" + + "display" "3 Weeks" + } + "40320" + { + "override" "" + "flags" "" + + "display" "4 Weeks" + } + "0" + { + "override" "" + "flags" "" + + "display" "Permanent" + } +} \ No newline at end of file diff --git a/plugins/lbd_basebans.smx b/plugins/lbd_basebans.smx new file mode 100644 index 0000000000000000000000000000000000000000..5e4b4d47ae4d8dd441538bad68d8ec00114fa1bd GIT binary patch literal 13393 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 literal 0 HcmV?d00001 diff --git a/plugins/lbd_sbpp_main.smx b/plugins/lbd_sbpp_main.smx new file mode 100644 index 0000000000000000000000000000000000000000..3f0e47482471b1c8fbb4777bc87a9d876a0b2fec GIT binary patch literal 36168 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 b*6$_^^%f-lrAX;v(0AkPdc=*#+l>By{Ow!L literal 0 HcmV?d00001 diff --git a/scripting/include/sm_limit_ban_duration.inc b/scripting/include/sm_limit_ban_duration.inc new file mode 100644 index 0000000..a224c98 --- /dev/null +++ b/scripting/include/sm_limit_ban_duration.inc @@ -0,0 +1,65 @@ +#if defined _limit_ban_included + #endinput +#endif +#define _limit_ban_included + +#define MAX_BAN_DURATIONS 32 + +/********************************************************* + * Returns the current number of defined ban lengths. + * + * @return The number of ban lengths defined. + *********************************************************/ +native LimitBan_GetSize(); + +/********************************************************* + * Returns permission for a specified ban length index. + * + * @param index The specific index to retrieve permission for. + * @param client The client to check access for. + * + * @return True if the client has access; False if disabled or no access. + *********************************************************/ +native LimitBan_GetAccess(index, client); + +/********************************************************* + * Provides access to the word form of defined ban lengths. + * + * @param index The specific index to retrieve the display for. + * @param string The string to store the index's display in. + * + * @return True if successful; false if disabled or no display set. + *********************************************************/ +native LimitBan_GetDisplay(index, String:buffer[]); + +/********************************************************* + * Returns the number of minutes for a specified ban length index. + * + * @return Number of minutes; -1 if disabled. + *********************************************************/ +native LimitBan_GetLength(index); + +/* + * Do not edit below this line! + */ + +public SharedPlugin:__pl_limit_ban = +{ + name = "sm_limit_ban_duration", + file = "sm_limit_ban_duration.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_PLUGIN +public __pl_limit_ban_SetNTVOptional() +{ + MarkNativeAsOptional("LimitBan_GetSize"); + MarkNativeAsOptional("LimitBan_GetAccess"); + MarkNativeAsOptional("LimitBan_GetDisplay"); + MarkNativeAsOptional("LimitBan_GetLength"); +} +#endif \ No newline at end of file diff --git a/scripting/lbd_basebans.sp b/scripting/lbd_basebans.sp index 80ff6bb..f6a1a1b 100644 --- a/scripting/lbd_basebans.sp +++ b/scripting/lbd_basebans.sp @@ -36,6 +36,7 @@ #include #undef REQUIRE_PLUGIN #include +#include #pragma newdecls required @@ -43,13 +44,14 @@ public Plugin myinfo = { name = "Basic Ban Commands", author = "AlliedModders LLC", - description = "Basic Banning Commands", + description = "Basic Banning Commands, with optional Limit Ban Duration support.", version = SOURCEMOD_VERSION, url = "http://www.sourcemod.net/" }; TopMenu hTopMenu; +bool g_bLimitBan; int g_BanTarget[MAXPLAYERS+1]; int g_BanTargetUserId[MAXPLAYERS+1]; int g_BanTime[MAXPLAYERS+1]; @@ -86,9 +88,33 @@ public void OnPluginStart() } } -public void OnMapStart() + +public void OnLibraryRemoved(const char [] name) { - //(Re-)Load BanReasons + if(StrEqual(name, "sm_limit_ban_duration")) + g_bLimitBan = false; +} + +public void OnLibraryAdded(const char [] name) +{ + if(StrEqual(name, "sm_limit_ban_duration")) + g_bLimitBan = true; +} + +public void OnConfigsExecuted() +{ + char _sPath[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, _sPath, sizeof(_sPath), "plugins/basebans.smx"); + if(FileExists(_sPath)) + { + char _sNewPath[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, _sNewPath, sizeof(_sNewPath), "plugins/disabled/basebans.smx"); + ServerCommand("sm plugins unload basebans"); + if(FileExists(_sNewPath)) + DeleteFile(_sNewPath); + RenameFile(_sNewPath, _sPath); + LogMessage("plugins/basebans.smx was unloaded and moved to plugins/disabled/basebans.smx"); + } LoadBanReasons(); } @@ -299,6 +325,13 @@ public Action Command_AddBan(int client, int args) return Plugin_Handled; } + AdminId tid = FindAdminByIdentity("steam", authid); + if (client && !CanAdminTarget(GetUserAdmin(client), tid)) + { + ReplyToCommand(client, "[SM] %t", "No Access"); + return Plugin_Handled; + } + int minutes = StringToInt(time); LogAction(client, @@ -381,4 +414,4 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] } return Plugin_Continue; -} +} \ No newline at end of file diff --git a/scripting/lbd_sbpp_main.sp b/scripting/lbd_sbpp_main.sp index f14fc0f..9b70388 100644 --- a/scripting/lbd_sbpp_main.sp +++ b/scripting/lbd_sbpp_main.sp @@ -31,6 +31,7 @@ #undef REQUIRE_PLUGIN #include #tryinclude +#include #define SB_VERSION "1.6.2++" #define SBR_VERSION "1.6.2" @@ -67,6 +68,7 @@ new State:ConfigState; new Handle:ConfigParser; new Handle:hTopMenu = INVALID_HANDLE; +bool g_bLimitBan; new const String:Prefix[] = "[SourceBans++] "; @@ -133,8 +135,8 @@ new Handle:g_hFwd_OnBanAdded; public Plugin:myinfo = { - name = "SourceBans++: Main Plugin", - author = "SourceBans Development Team, SourceBans++ Dev Team", + name = "(LBD) SourceBans++: Main Plugin", + author = "SourceBans Development Team, SourceBans++ Dev Team, with optional Limit Ban Duration support.", description = "Advanced ban management for the Source engine", version = SBR_VERSION, url = "https://sbpp.github.io" @@ -241,18 +243,30 @@ public OnPluginStart() #endif } -#if defined _updater_included -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { +#if defined _updater_included if (StrEqual(name, "updater")) { Updater_AddPlugin(UPDATE_URL); } -} #endif + + if(StrEqual(name, "sm_limit_ban_duration")){ + g_bLimitBan = true; + } +} + +public void OnLibraryRemoved(const char[] name) +{ + if(StrEqual(name, "sm_limit_ban_duration")){ + g_bLimitBan = false; + } +} public OnAllPluginsLoaded() { + g_bLimitBan = LibraryExists("sm_limit_ban_duration"); new Handle:topmenu; #if defined DEBUG LogToFile(logFile, "OnAllPluginsLoaded()"); @@ -278,6 +292,18 @@ public OnConfigsExecuted() RenameFile(newfilename, filename); LogToFile(logFile, "plugins/basebans.smx was unloaded and moved to plugins/disabled/basebans.smx"); } + + BuildPath(Path_SM, filename, sizeof(filename), "plugins/sbpp_main.smx"); + if(FileExists(filename)) + { + char newfilename[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, newfilename, sizeof(newfilename), "plugins/disabled/sbpp_main.smx"); + ServerCommand("sm plugins unload sbpp_main"); + if(FileExists(newfilename)) + DeleteFile(newfilename); + RenameFile(newfilename, filename); + LogToFile(logFile, "plugins/sbpp_main.smx was unloaded and moved to plugins/disabled/sbpp_main.smx"); + } } public OnMapStart() @@ -955,22 +981,50 @@ stock DisplayBanTimeMenu(client) LogToFile(logFile, "DisplayBanTimeMenu()"); #endif - new Handle:menu = CreateMenu(MenuHandler_BanTimeList); + new Handle:menu; + if(g_bLimitBan && LimitBan_GetSize() > 0){ + menu = CreateMenu(MenuHandler_BanTimeList, MenuAction_Select | MenuAction_Cancel | MenuAction_DrawItem); + } else { + menu = CreateMenu(MenuHandler_BanTimeList, MenuAction_Select | MenuAction_Cancel | MenuAction_DrawItem); + } decl String:title[100]; Format(title, sizeof(title), "%T:", "Ban player", client); //Format(title, sizeof(title), "Ban player", client); SetMenuTitle(menu, title); SetMenuExitBackButton(menu, true); - - if (CheckCommandAccess(client, "sm_unban", ADMFLAG_UNBAN | ADMFLAG_ROOT)) - AddMenuItem(menu, "0", "Permanent"); - AddMenuItem(menu, "10", "10 Minutes"); - AddMenuItem(menu, "30", "30 Minutes"); - AddMenuItem(menu, "60", "1 Hour"); - AddMenuItem(menu, "240", "4 Hours"); - AddMenuItem(menu, "1440", "1 Day"); - AddMenuItem(menu, "10080", "1 Week"); + + if(g_bLimitBan && LimitBan_GetSize() > 0) + { + char _sDisplay[64]; + char _sLength[32]; + for(int i = 0; i <= LimitBan_GetSize(); i++) + { + if(LimitBan_GetAccess(i, client)) + { + int _iLength = LimitBan_GetLength(i); + IntToString(_iLength, _sLength, sizeof(_sLength)); + LimitBan_GetDisplay(i, _sDisplay); + AddMenuItem(menu, _sLength, _sDisplay); + } + } + + if(LimitBan_GetAccess(-1, client) && CheckCommandAccess(client, "sm_unban", ADMFLAG_UNBAN|ADMFLAG_ROOT)) + { + LimitBan_GetDisplay(-1, _sDisplay); + AddMenuItem(menu, "0", _sDisplay); + } + } else { + if (CheckCommandAccess(client, "sm_unban", ADMFLAG_UNBAN | ADMFLAG_ROOT)){ + AddMenuItem(menu, "0", "Permanent"); + AddMenuItem(menu, "10", "10 Minutes"); + AddMenuItem(menu, "30", "30 Minutes"); + AddMenuItem(menu, "60", "1 Hour"); + AddMenuItem(menu, "240", "4 Hours"); + AddMenuItem(menu, "1440", "1 Day"); + AddMenuItem(menu, "10080", "1 Week"); + } + } DisplayMenu(menu, client, MENU_TIME_FOREVER); } diff --git a/scripting/sm_limit_ban_duration.sp b/scripting/sm_limit_ban_duration.sp new file mode 100644 index 0000000..0f34065 --- /dev/null +++ b/scripting/sm_limit_ban_duration.sp @@ -0,0 +1,425 @@ +/* + Revision 1.0.2 + -=-=-=-=-=-=- + Added an option for -1 index parameter in natives, which will reference the perma ban entry. + Updated LBD_Basebans & LBD_Sourcebans to have support for perma ban options. + + Notice: + -=-=-=-=-=-=- + Requires sm_limit_ban_duration to recompile. +*/ + +#pragma semicolon 1 +#include +#include +#undef REQUIRE_PLUGIN +#tryinclude + +#if !defined _sourcebans_included + native SBBanPlayer(client, target, time, String:reason[]); +#endif + +#define PLUGIN_VERSION "1.0.2" + +new Handle:g_hEnabled = INVALID_HANDLE; +new Handle:g_hReduce = INVALID_HANDLE; +new Handle:g_hMaximum = INVALID_HANDLE; + +new bool:g_bDurationRestricted[MAX_BAN_DURATIONS], bool:g_bPermRestricted; +new g_iDurationLength[MAX_BAN_DURATIONS]; +new g_iDurationTotalFlags[MAX_BAN_DURATIONS], g_iPermTotalFlags; +new g_iDurationFlags[MAX_BAN_DURATIONS][24], g_iPermFlags[24]; +new String:g_sDurationOverride[MAX_BAN_DURATIONS][32], String:g_sPermOverride[32]; +new String:g_sDurationDisplay[MAX_BAN_DURATIONS][64], String:g_sPermDisplay[64]; + +new bool:g_bEnabled, bool:g_bReduce, bool:g_bPermanent, bool:g_bMaximum, bool:g_bSourceBans; +new g_iLastChange, g_iNumTimes; +new String:g_sPrefixPlugin[64]; + +public Plugin:myinfo = +{ + name = "Limit Ban Duration", + author = "Twisted|Panda", + description = "Provides functionality for creating restrictions on ban lengths.", + version = PLUGIN_VERSION, + url = "http://ominousgaming.com" +}; + +public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max) +{ + RegPluginLibrary("sm_limit_ban_duration"); + + CreateNative("LimitBan_GetSize", Native_GetSize); + CreateNative("LimitBan_GetAccess", Native_GetAccess); + CreateNative("LimitBan_GetDisplay", Native_GetDisplay); + CreateNative("LimitBan_GetLength", Native_GetLength); + return APLRes_Success; +} + +public Native_GetSize(Handle:hPlugin, iNumParams) +{ + return g_bEnabled ? g_iNumTimes : 0; +} + +public Native_GetAccess(Handle:hPlugin, iNumParams) +{ + if(!g_bEnabled) + return false; + + new index = GetNativeCell(1); + new client = GetNativeCell(2); + + return (index == -1) ? Bool_CheckFlagsPerm(client) : Bool_CheckFlags(client, index); +} + +public Native_GetDisplay(Handle:hPlugin, iNumParams) +{ + if(!g_bEnabled) + return false; + + new result = -1; + new index = GetNativeCell(1); + if(index == -1) + result = SetNativeString(2, g_sPermDisplay, sizeof(g_sPermDisplay), false); + else + { + decl String:_sTemp[64]; + strcopy(_sTemp, sizeof(_sTemp), g_sDurationDisplay[index]); + result = SetNativeString(2, _sTemp, sizeof(_sTemp), false); + } + + return (result == SP_ERROR_NONE) ? true : false; +} + +public Native_GetLength(Handle:hPlugin, iNumParams) +{ + if(!g_bEnabled) + return -1; + + new index = GetNativeCell(1); + return (index == -1) ? 0 : g_iDurationLength[index]; +} + +public OnAllPluginsLoaded() +{ + g_bSourceBans = LibraryExists("sourcebans"); +} + +public OnLibraryRemoved(const String:name[]) +{ + if(StrEqual(name, "sourcebans")) + g_bSourceBans = false; +} + +public OnLibraryAdded(const String:name[]) +{ + if(StrEqual(name, "sourcebans")) + g_bSourceBans = true; +} + +public OnPluginStart() +{ + LoadTranslations("common.phrases"); + LoadTranslations("sm_limit_ban_duration.phrases"); + + CreateConVar("sm_limit_ban_duration_version", PLUGIN_VERSION, "Limit Ban Duration: Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD); + + g_hEnabled = CreateConVar("sm_limit_ban_duration_enabled", "1", "Enables/disables all features of this plugin.", FCVAR_NONE, true, 0.0, true, 1.0); + HookConVarChange(g_hEnabled, OnSettingsChange); + g_hReduce = CreateConVar("sm_limit_ban_duration_reduce", "1", "If enabled, the plugin will lower ban lengths if an admin doesn't have access to their specified length to a length they do possess.", FCVAR_NONE, true, 0.0, true, 1.0); + HookConVarChange(g_hReduce, OnSettingsChange); + g_hMaximum = CreateConVar("sm_limit_ban_duration_maximum", "1", "If enabled, the highest entry defined in the plugins configuration file will be the highest amount any admin can ban for.", FCVAR_NONE, true, 0.0, true, 1.0); + HookConVarChange(g_hMaximum, OnSettingsChange); + AutoExecConfig(true, "sm_limit_ban_duration"); + + AddCommandListener(Command_Ban, "sm_ban"); + + g_bEnabled = GetConVarBool(g_hEnabled); + g_bReduce = GetConVarBool(g_hReduce); + g_bMaximum = GetConVarBool(g_hMaximum); +} + +public OnSettingsChange(Handle:cvar, const String:oldvalue[], const String:newvalue[]) +{ + if(cvar == g_hEnabled) + g_bEnabled = StringToInt(newvalue) ? true : false; + else if(cvar == g_hReduce) + g_bReduce = StringToInt(newvalue) ? true : false; + else if(cvar == g_hMaximum) + g_bMaximum = StringToInt(newvalue) ? true : false; +} + +public OnMapStart() +{ + if(g_bEnabled) + { + Void_LoadTimes(); + } +} + +public OnConfigsExecuted() +{ + if(g_bEnabled) + { + Format(g_sPrefixPlugin, sizeof(g_sPrefixPlugin), "%T", "Prefix_Plugin", LANG_SERVER); + } +} + +public Action:Command_Ban(client, const String:command[], argc) +{ + if(g_bEnabled && g_iNumTimes && (!client || CheckCommandAccess(client, "sm_ban", ADMFLAG_BAN))) + { + if(argc < 2) + return Plugin_Continue; + + decl String:_sTime[32]; + GetCmdArg(2, _sTime, sizeof(_sTime)); + new _iLength = StrEqual(_sTime, "") ? -1 : StringToInt(_sTime); + if(_iLength <= -1) + return Plugin_Continue; + + if(!_iLength) + { + if(!g_bPermanent || !g_bPermRestricted || Bool_CheckFlagsPerm(client)) + return Plugin_Continue; + + new _iPosition = -1; + for(new i = g_iNumTimes; i >= 0; i--) + { + if(Bool_CheckFlags(client, i)) + { + _iPosition = i; + break; + } + } + + if(_iPosition == -1) + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_No_Access"); + else + { + if(g_bReduce) + { + decl String:_sBuffer[256]; + GetCmdArgString(_sBuffer, sizeof(_sBuffer)); + if(Bool_IssueBan(client, _iPosition, _sBuffer)) + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_Reduced_Perm_Length", g_iDurationLength[_iPosition]); + } + else + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_Illegal_Ban_Perm", g_iDurationLength[_iPosition]); + } + + return Plugin_Stop; + } + + new _iPosition; + for(new i = g_iNumTimes; i >= 0; i--) + if((_iLength >= g_iDurationLength[i] || i == 0) && (i == g_iNumTimes || _iLength <= g_iDurationLength[i + 1])) + _iPosition = i; + + if(!_iPosition && _iLength < g_iDurationLength[_iPosition]) + { + if(Bool_CheckFlags(client, _iPosition)) + return Plugin_Continue; + + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_No_Access"); + return Plugin_Stop; + } + else if(_iPosition == g_iNumTimes) + { + if(Bool_CheckFlags(client, _iPosition)) + { + if(g_bMaximum) + { + if(g_bReduce) + { + decl String:_sBuffer[256]; + GetCmdArgString(_sBuffer, sizeof(_sBuffer)); + if(Bool_IssueBan(client, _iPosition, _sBuffer)) + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_Reduced_Ban_Length", g_iDurationLength[_iPosition]); + } + else + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_Illegal_Ban_Length", g_iDurationLength[_iPosition]); + + return Plugin_Stop; + } + + return Plugin_Continue; + } + } + + if(_iLength == g_iDurationLength[_iPosition] && Bool_CheckFlags(client, _iPosition)) + return Plugin_Continue; + else if(Bool_CheckFlags(client, (_iPosition + 1))) + return Plugin_Continue; + else + { + for(new i = _iPosition; i >= -1; i--) + { + if(i == -1) + break; + + if(Bool_CheckFlags(client, i)) + { + _iPosition = i; + break; + } + } + + if(_iPosition == -1) + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_No_Access"); + else + { + if(g_bReduce) + { + decl String:_sBuffer[256]; + GetCmdArgString(_sBuffer, sizeof(_sBuffer)); + if(Bool_IssueBan(client, _iPosition, _sBuffer)) + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_Reduced_Ban_Length", _iLength, g_iDurationLength[_iPosition]); + } + else + ReplyToCommand(client, "%s%t", g_sPrefixPlugin, "Phrase_Illegal_Ban_Length", g_iDurationLength[_iPosition]); + } + } + + return Plugin_Stop; + } + + return Plugin_Continue; +} + +bool:Bool_CheckFlagsPerm(client) +{ + if(!client || !g_bPermRestricted) + return true; + + new _iTotal; + for(new i = 0; i < g_iPermTotalFlags; i++) + { + if(CheckCommandAccess(client, g_sPermOverride, g_iPermFlags[i])) + _iTotal++; + else + break; + } + + return (_iTotal == g_iPermTotalFlags) ? true : false; +} + +bool:Bool_CheckFlags(client, index) +{ + if(!client || !g_bDurationRestricted[index]) + return true; + + new _iTotal; + for(new i = 0; i < g_iDurationTotalFlags[index]; i++) + { + if(CheckCommandAccess(client, g_sDurationOverride[index], g_iDurationFlags[index][i])) + _iTotal++; + else + break; + } + + return (_iTotal == g_iDurationTotalFlags[index]) ? true : false; +} + +Bool_IssueBan(client, index, const String:buffer[]) +{ + decl String:_sBuffer[192]; + new _iLength = BreakString(buffer, _sBuffer, sizeof(_sBuffer)); + new _iTarget = FindTarget(client, _sBuffer, true); + if(_iTarget == -1) + return false; + _iLength += BreakString(buffer[_iLength], _sBuffer, sizeof(_sBuffer)); + strcopy(_sBuffer, sizeof(_sBuffer), buffer[_iLength]); + if(g_bSourceBans) + SBBanPlayer(client, _iTarget, g_iDurationLength[index], _sBuffer); + else + BanClient(_iTarget, g_iDurationLength[index], BANFLAG_AUTO, _sBuffer); + return true; +} + +Void_LoadTimes() +{ + decl String:_sPath[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, _sPath, PLATFORM_MAX_PATH, "configs/sm_limit_ban_duration.ini"); + + new _iCurrent = GetFileTime(_sPath, FileTime_LastChange); + if(_iCurrent < g_iLastChange) + return; + else + g_iLastChange = _iCurrent; + + g_iNumTimes = 0; + g_bPermanent = false; + new Handle:_hKV = CreateKeyValues("Limit_Ban_Durations"); + decl String:_sDisplay[MAX_BAN_DURATIONS][64], String:_sTemp[32], String:_sBuffer[24][3], String:_sOverrides[MAX_BAN_DURATIONS][32]; + new bool:_bDuration[MAX_BAN_DURATIONS], _iLength[MAX_BAN_DURATIONS], _iFlags[MAX_BAN_DURATIONS][24], _iTotalFlags[MAX_BAN_DURATIONS]; + if(FileToKeyValues(_hKV, _sPath)) + { + KvGotoFirstSubKey(_hKV); + do + { + KvGetSectionName(_hKV, _sTemp, sizeof(_sTemp)); + new _iTemp = StringToInt(_sTemp); + + if(_iTemp == 0) + { + g_bPermanent = true; + + KvGetString(_hKV, "flags", _sTemp, sizeof(_sTemp)); + g_iPermTotalFlags = StrEqual(_sTemp, "") ? 0 : ExplodeString(_sTemp, ",", _sBuffer, 24, 3); + for(new i = 0; i < g_iPermTotalFlags; i++) + g_iPermFlags[i] = ReadFlagString(_sBuffer[i]); + KvGetString(_hKV, "override", g_sPermOverride, sizeof(g_sPermOverride)); + g_bPermRestricted = (!g_iPermTotalFlags && StrEqual(g_sPermOverride, "")) ? false : true; + KvGetString(_hKV, "display", g_sPermDisplay, sizeof(g_sPermDisplay)); + } + else + { + _iLength[g_iNumTimes] = _iTemp; + + KvGetString(_hKV, "flags", _sTemp, sizeof(_sTemp)); + _iTotalFlags[g_iNumTimes] = StrEqual(_sTemp, "") ? 0 : ExplodeString(_sTemp, ",", _sBuffer, 24, 3); + for(new i = 0; i < _iTotalFlags[g_iNumTimes]; i++) + _iFlags[g_iNumTimes][i] = ReadFlagString(_sBuffer[i]); + KvGetString(_hKV, "override", _sOverrides[g_iNumTimes], sizeof(_sOverrides[])); + _bDuration[g_iNumTimes] = (!_iTotalFlags[g_iNumTimes] && StrEqual(_sOverrides[g_iNumTimes], "")) ? false : true; + KvGetString(_hKV, "display", _sDisplay[g_iNumTimes], sizeof(_sDisplay[])); + g_iNumTimes++; + } + } + while (KvGotoNextKey(_hKV)); + } + else + SetFailState("Limit Ban Durations: configs/sm_limit_ban_duration.ini is missing or invalid!"); + + if(g_iNumTimes) + g_iNumTimes--; + + new _iCurrentHigh, _iTotalSorted = g_iNumTimes; + for(new i = 0; i <= g_iNumTimes; i++) + { + _iCurrentHigh = -1; + new _iCurrentIndex; + for(new j = 0; j <= g_iNumTimes; j++) + { + if(_iLength[j] != -1 && _iLength[j] > _iCurrentHigh) + { + _iCurrentIndex = j; + _iCurrentHigh = _iLength[j]; + } + } + + g_bDurationRestricted[_iTotalSorted] = _bDuration[_iCurrentIndex]; + g_iDurationLength[_iTotalSorted] = _iLength[_iCurrentIndex]; + g_iDurationTotalFlags[_iTotalSorted] = _iTotalFlags[_iCurrentIndex]; + for(new j = 0; j < g_iDurationTotalFlags[_iTotalSorted]; j++) + g_iDurationFlags[_iTotalSorted][j] = _iFlags[_iCurrentIndex][j]; + strcopy(g_sDurationOverride[_iTotalSorted], sizeof(g_sDurationOverride[]), _sOverrides[_iCurrentIndex]); + strcopy(g_sDurationDisplay[_iTotalSorted], sizeof(g_sDurationDisplay[]), _sDisplay[_iCurrentIndex]); + + _iLength[_iCurrentIndex] = -1; + _iTotalSorted--; + } + + CloseHandle(_hKV); +} \ No newline at end of file diff --git a/translations/sm_limit_ban_duration.phrases.txt b/translations/sm_limit_ban_duration.phrases.txt new file mode 100644 index 0000000..f9b122f --- /dev/null +++ b/translations/sm_limit_ban_duration.phrases.txt @@ -0,0 +1,35 @@ +"Phrases" +{ + //==================================================================== + "Prefix_Plugin" + { + "#format" "" + "en" "[SM] " + } + //==================================================================== + "Phrase_No_Access" + { + "#format" "" + "en" "You do not have access to this command!" + } + "Phrase_Illegal_Ban_Length" + { + "#format" "{1:d}" + "en" "You do not have permission to issue bans for more than {1} minutes!" + } + "Phrase_Illegal_Ban_Perm" + { + "#format" "" + "en" "You do not have permission to issue permanent bans!" + } + "Phrase_Reduced_Perm_Length" + { + "#format" "{1:d}" + "en" "You cannot issue permanent bans! Your ban length was automatically lowered to {1} minutes." + } + "Phrase_Reduced_Ban_Length" + { + "#format" "{1:d}" + "en" "You cannot ban for more than {1} minutes! Your ban length was automatically lowered." + } +} \ No newline at end of file