Gag

Created Diff never expires
21 removals
Lines
Total
Removed
Words
Total
Removed
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
741 lines
18 additions
Lines
Total
Added
Words
Total
Added
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
739 lines
#include <amxmodx>
#include <amxmodx>
#include <amxmisc>
#include <amxmisc>
#include <fakemeta>
#include <fakemeta>
#include <regex>
#include <regex>
#include <nvault>
#include <nvault>
#include <WPMGPrintChatColor>
#include <cromchat>


#define LOG_GAGS
#define LOG_GAGS


#define IP_PATTERN "([0-9]+.*[1-9][0-9]+.*[0-9]+.*[0-9])"
#define IP_PATTERN "([0-9]+.*[1-9][0-9]+.*[0-9]+.*[0-9])"
#define VERSION "1.1"
#define VERSION "1.1"


enum _:GagState
enum _:GagState
{
{
GAG_NOT,
GAG_NOT,
GAG_YES,
GAG_YES,
GAG_EXPIRED
GAG_EXPIRED
};
};


enum _:GagTimeData
enum _:GagTimeData
{
{
DISPLAY[64],
DISPLAY[64],
MINUTES
MINUTES
};
};


new const g_GagTimes[][GagTimeData] =
new const g_GagTimes[][GagTimeData] =
{
{
{ "1 minute", 1 },
{ "1 minute", 1 },
{ "5 minutes", 5 },
{ "5 minutes", 5 },
{ "10 minutes", 10 },
{ "10 minutes", 10 },
{ "15 minutes", 15 },
{ "15 minutes", 15 },
{ "20 minutes", 20 },
{ "20 minutes", 20 },
{ "30 minutes", 30 },
{ "30 minutes", 30 },
{ "1 hour", 60 },
{ "1 hour", 60 },
{ "2 hours", 120 },
{ "2 hours", 120 },
{ "6 hours", 360 },
{ "6 hours", 360 },
{ "1 day", 1440 },
{ "1 day", 1440 },
{ "1 week", 10080 },
{ "1 week", 10080 },
{ "Permanent", 0 }
{ "Permanent", 0 }
}
}


new const g_szVaultName[] = "gagsystem";
new const g_szVaultName[] = "gagsystem";
new const g_szChatPrefix[] = "[GagSystem]";
new const g_szGagSound[] = "buttons/blip1.wav";
new const g_szGagSound[] = "buttons/blip1.wav";
new const g_szLineStyle[] = "======================================================";
new const g_szLineStyle[] = "======================================================";
#if defined LOG_GAGS
#if defined LOG_GAGS
new const g_szLogFile[] = "addons/amxmodx/logs/gag_system.log";
new const g_szLogFile[] = "addons/amxmodx/logs/gag_system.log";
#endif
#endif


new g_iNVaultHandle, Regex:g_iRegexIPPattern, g_iUnused, g_iHudChannel, g_iThinkingEnt;
new g_iNVaultHandle, Regex:g_iRegexIPPattern, g_iUnused, g_iHudChannel, g_iThinkingEnt;
new g_iGagTimeIndex[33], g_iUserTarget[33], bool:g_blIsUserMuted[33];
new g_iGagTimeIndex[33], g_iUserTarget[33], bool:g_blIsUserMuted[33];
new gp_blHudEnabled, gp_blEnableGagExpireMsg;
new gp_blHudEnabled, gp_blEnableGagExpireMsg;
new g_GagForward, g_UngagForward;
new g_GagForward, g_UngagForward;


public plugin_init()
public plugin_init()
{
{
register_plugin("Gag System", VERSION, "TheRedShoko @ AMXX-BG.info");
register_plugin("Gag System", VERSION, "Idk"); // I'll put 'idk' cuz i don't know the guy who made this plugin but i like it :)
register_cvar("gagsystem_shoko", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED);
register_cvar("gagsystem_shoko", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED);


register_clcmd("say", "CommandSayExecuted");
register_clcmd("say", "CommandSayExecuted");
register_clcmd("say_team", "CommandSayExecuted");
register_clcmd("say_team", "CommandSayExecuted");


g_GagForward = CreateMultiForward("user_gagged", ET_IGNORE, FP_CELL);
g_GagForward = CreateMultiForward("user_gagged", ET_IGNORE, FP_CELL);
g_UngagForward = CreateMultiForward("user_ungagged", ET_IGNORE, FP_CELL);
g_UngagForward = CreateMultiForward("user_ungagged", ET_IGNORE, FP_CELL);


gp_blHudEnabled = register_cvar("gagsystem_showhud", "1");
gp_blHudEnabled = register_cvar("gagsystem_showhud", "1");
gp_blEnableGagExpireMsg = register_cvar("gagsystem_printexpired", "1");
gp_blEnableGagExpireMsg = register_cvar("gagsystem_printexpired", "1");


#if AMXX_VERSION_NUM >= 183
#if AMXX_VERSION_NUM >= 183
hook_cvar_change(gp_blEnableGagExpireMsg, "GagExpireCvarChanged");
hook_cvar_change(gp_blEnableGagExpireMsg, "GagExpireCvarChanged");
#endif
#endif


register_forward(FM_Voice_SetClientListening, "PlayerVoiceSpeak", 0);
register_forward(FM_Voice_SetClientListening, "PlayerVoiceSpeak", 0);
register_forward(FM_ClientUserInfoChanged, "FwClientInfoChanged", 0);
register_forward(FM_ClientUserInfoChanged, "FwClientInfoChanged", 0);
register_forward(FM_Think, "FwEntityThink", 1);
register_forward(FM_Think, "FwEntityThink", 1);


register_clcmd("amx_gag", "CommandGag", ADMIN_SLAY, "<name | #id | ip> <time> <reason>");
register_clcmd("amx_gag", "CommandGag", ADMIN_SLAY, "<name | #id | ip> <time> <reason>");
register_clcmd("amx_ungag", "CommandUngag", ADMIN_SLAY, "<name | #id | ip>");
register_clcmd("amx_ungag", "CommandUngag", ADMIN_SLAY, "<name | #id | ip>");
register_clcmd("amx_gagmenu", "CommandGagMenu", ADMIN_SLAY);
register_clcmd("amx_gagmenu", "CommandGagMenu", ADMIN_SLAY);
register_clcmd("amx_TYPE_GAGREASON", "CommandGagReason", ADMIN_SLAY);
register_clcmd("amx_TYPE_GAGREASON", "CommandGagReason", ADMIN_SLAY);
register_clcmd("amx_cleangags", "CommandCleanDB", ADMIN_RCON);
register_clcmd("amx_cleangags", "CommandCleanDB", ADMIN_RCON);


#if AMXX_VERSION_NUM < 183
#if AMXX_VERSION_NUM < 183
g_iRegexIPPattern = regex_compile(IP_PATTERN, g_iUnused, "", 0);
g_iRegexIPPattern = regex_compile(IP_PATTERN, g_iUnused, "", 0);
#else
#else
g_iRegexIPPattern = regex_compile_ex(IP_PATTERN);
g_iRegexIPPattern = regex_compile_ex(IP_PATTERN);
#endif
#endif


g_iNVaultHandle = nvault_open(g_szVaultName);
g_iNVaultHandle = nvault_open(g_szVaultName);


if (g_iNVaultHandle == INVALID_HANDLE)
if (g_iNVaultHandle == INVALID_HANDLE)
{
{
set_fail_state("Failed to open NVault DB!");
set_fail_state("Failed to open NVault DB!");
}
}


g_iHudChannel = CreateHudSyncObj();
g_iHudChannel = CreateHudSyncObj();
g_iThinkingEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
g_iThinkingEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
set_pev(g_iThinkingEnt, pev_nextthink, get_gametime() + 0.1);
set_pev(g_iThinkingEnt, pev_nextthink, get_gametime() + 0.1);
}
}


public plugin_precache()
public plugin_precache()
{
{
precache_sound(g_szGagSound);
precache_sound(g_szGagSound);
}
}


public plugin_end()
public plugin_end()
{
{
nvault_close(g_iNVaultHandle);
nvault_close(g_iNVaultHandle);
regex_free(g_iRegexIPPattern);
regex_free(g_iRegexIPPattern);
}
}


public plugin_natives()
public plugin_natives()
{
{
register_native("is_user_gagged", "native_is_gagged");
register_native("is_user_gagged", "native_is_gagged");


register_native("gag_user", "native_gag_user");
register_native("gag_user", "native_gag_user");
register_native("gag_user_byid", "native_gag_id");
register_native("gag_user_byid", "native_gag_id");


register_native("ungag_user", "native_ungag_user");
register_native("ungag_user", "native_ungag_user");
register_native("ungag_user_byid", "native_ungag_id");
register_native("ungag_user_byid", "native_ungag_id");
}
}


public native_is_gagged()
public native_is_gagged()
{
{
new id = get_param(1);
new id = get_param(1);
new bool:shouldPrint = bool:get_param(2);
new bool:shouldPrint = bool:get_param(2);


if (!is_user_connected(id))
if (!is_user_connected(id))
{
{
log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
return false;
return false;
}
}


return IsUserGagged(id, shouldPrint) == GAG_YES;
return IsUserGagged(id, shouldPrint) == GAG_YES;
}
}


public native_gag_user()
public native_gag_user()
{
{
new szIP[16], szName[32], iDuration, szReason[64], szAdmin[32];
new szIP[16], szName[32], iDuration, szReason[64], szAdmin[32];


get_string(1, szName, charsmax(szName));
get_string(1, szName, charsmax(szName));
get_string(2, szIP, charsmax(szIP));
get_string(2, szIP, charsmax(szIP));
iDuration = get_param(3);
iDuration = get_param(3);
get_string(4, szReason, charsmax(szReason));
get_string(4, szReason, charsmax(szReason));
get_string(5, szAdmin, charsmax(szAdmin));
get_string(5, szAdmin, charsmax(szAdmin));


if (!regex_match_c(szIP, g_iRegexIPPattern, g_iUnused))
if (!regex_match_c(szIP, g_iRegexIPPattern, g_iUnused))
{
{
log_error(AMX_ERR_NATIVE, "%s is not a valid IP Address!", szIP);
log_error(AMX_ERR_NATIVE, "%s is not a valid IP Address!", szIP);
return;
return;
}
}


if (iDuration < 0)
if (iDuration < 0)
{
{
log_error(AMX_ERR_NATIVE, "Time cannot be negative!");
log_error(AMX_ERR_NATIVE, "Time cannot be negative!");
return;
return;
}
}


GagUser(szName, szIP, iDuration, szReason, szAdmin);
GagUser(szName, szIP, iDuration, szReason, szAdmin);
}
}


public native_gag_id()
public native_gag_id()
{
{
new id;
new id;


id = get_param(1);
id = get_param(1);


if (!is_user_connected(id))
if (!is_user_connected(id))
{
{
log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
return;
return;
}
}


new szName[32], szIP[16], szReason[64], iDuration, szAdmin[32];
new szName[32], szIP[16], szReason[64], iDuration, szAdmin[32];
iDuration = get_param(2);
iDuration = get_param(2);


if (iDuration < 0)
if (iDuration < 0)
{
{
log_error(AMX_ERR_NATIVE, "Time cannot be negative!");
log_error(AMX_ERR_NATIVE, "Time cannot be negative!");
return;
return;
}
}


get_string(3, szReason, charsmax(szReason));
get_string(3, szReason, charsmax(szReason));
get_string(4, szAdmin, charsmax(szAdmin));
get_string(4, szAdmin, charsmax(szAdmin));


get_user_name(id, szName, charsmax(szName));
get_user_name(id, szName, charsmax(szName));
get_user_ip(id, szIP, charsmax(szIP), 1);
get_user_ip(id, szIP, charsmax(szIP), 1);


GagUser(szName, szIP, iDuration, szReason, szAdmin);
GagUser(szName, szIP, iDuration, szReason, szAdmin);
}
}


public native_ungag_user()
public native_ungag_user()
{
{
new szIP[16], szName[32], szAdmin[32];
new szIP[16], szName[32], szAdmin[32];


get_string(1, szName, charsmax(szName));
get_string(1, szName, charsmax(szName));
get_string(2, szIP, charsmax(szIP));
get_string(2, szIP, charsmax(szIP));
get_string(3, szAdmin, charsmax(szAdmin));
get_string(3, szAdmin, charsmax(szAdmin));


if (!regex_match_c(szIP, g_iRegexIPPattern, g_iUnused))
if (!regex_match_c(szIP, g_iRegexIPPattern, g_iUnused))
{
{
log_error(AMX_ERR_NATIVE, "%s is not a valid IP Address!", szIP);
log_error(AMX_ERR_NATIVE, "%s is not a valid IP Address!", szIP);
return;
return;
}
}


UngagUser(szName, szIP, szAdmin);
UngagUser(szName, szIP, szAdmin);
}
}


public native_ungag_id()
public native_ungag_id()
{
{
new id;
new id;


id = get_param(1);
id = get_param(1);


if (!is_user_connected(id))
if (!is_user_connected(id))
{
{
log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
return;
return;
}
}


new szAdmin[32], szName[32], szIP[16];
new szAdmin[32], szName[32], szIP[16];


get_string(2, szAdmin, charsmax(szAdmin));
get_string(2, szAdmin, charsmax(szAdmin));


get_user_name(id, szName, charsmax(szName));
get_user_name(id, szName, charsmax(szName));
get_user_ip(id, szIP, charsmax(szIP), 1);
get_user_ip(id, szIP, charsmax(szIP), 1);


UngagUser(szName, szIP, szAdmin);
UngagUser(szName, szIP, szAdmin);
}
}


public client_putinserver(id)
public client_putinserver(id)
{
{
g_blIsUserMuted[id] = IsUserGagged(id, false) == GAG_YES;
g_blIsUserMuted[id] = IsUserGagged(id, false) == GAG_YES;
}
}


#if AMXX_VERSION_NUM >= 183
#if AMXX_VERSION_NUM >= 183
public GagExpireCvarChanged(pcvar, szOldValue[], szNewValue[])
public GagExpireCvarChanged(pcvar, szOldValue[], szNewValue[])
{
{
if (str_to_num(szNewValue) == 1)
if (str_to_num(szNewValue) == 1)
{
{
set_pev(g_iThinkingEnt, pev_nextthink, get_gametime() + 1.0);
set_pev(g_iThinkingEnt, pev_nextthink, get_gametime() + 1.0);
}
}
}
}
#endif
#endif


public PlayerVoiceSpeak(receiver, id)
public PlayerVoiceSpeak(receiver, id)
{
{
if (receiver == id || !is_user_connected(id))
if (receiver == id || !is_user_connected(id))
{
{
return FMRES_IGNORED;
return FMRES_IGNORED;
}
}


if (g_blIsUserMuted[id])
if (g_blIsUserMuted[id])
{
{
engfunc(EngFunc_SetClientListening, receiver, id, false);
engfunc(EngFunc_SetClientListening, receiver, id, false);
return FMRES_SUPERCEDE;
return FMRES_SUPERCEDE;
}
}


return FMRES_IGNORED;
return FMRES_IGNORED;
}
}


public FwClientInfoChanged(id)
public FwClientInfoChanged(id)
{
{
if (!is_user_connected(id))
if (!is_user_connected(id))
{
{
return FMRES_IGNORED;
return FMRES_IGNORED;
}
}


new szOldName[32], szNewName[32];
new szOldName[32], szNewName[32];
get_user_name(id, szOldName, charsmax(szOldName));
get_user_name(id, szOldName, charsmax(szOldName));
get_user_info(id, "name", szNewName, charsmax(szNewName));
get_user_info(id, "name", szNewName, charsmax(szNewName));


if (!equal(szOldName, szNewName) && szOldName[0] != EOS && IsUserGagged(id, false) == GAG_YES)
if (!equal(szOldName, szNewName) && szOldName[0] != EOS && IsUserGagged(id, false) == GAG_YES)
{
{
set_user_info(id, "name", szOldName);
set_user_info(id, "name", szOldName);
return FMRES_HANDLED;
return FMRES_HANDLED;
}
}


return FMRES_IGNORED;
return FMRES_IGNORED;
}
}


public FwEntityThink(iEnt)
public FwEntityThink(iEnt)
{
{
if (iEnt != g_iThinkingEnt || !get_pcvar_num(gp_blEnableGagExpireMsg))
if (iEnt != g_iThinkingEnt || !get_pcvar_num(gp_blEnableGagExpireMsg))
{
{
return;
return;
}
}


static iPlayers[32], iPlayersNum, id;
static iPlayers[32], iPlayersNum, id;
get_players(iPlayers, iPlayersNum);
get_players(iPlayers, iPlayersNum);


for (new i = 0; i < iPlayersNum; i++)
for (new i = 0; i < iPlayersNum; i++)
{
{
id = iPlayers[i];
id = iPlayers[i];


if (IsUserGagged(id, false) == GAG_EXPIRED)
if (IsUserGagged(id, false) == GAG_EXPIRED)
{
{
static szName[32];
static szName[32];
get_user_name(id, szName, charsmax(szName));
get_user_name(id, szName, charsmax(szName));


PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y is no longer gagged!", g_szChatPrefix, szName);
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03 Player &x04%s &x01is no longer gagged!", szName);


if (get_pcvar_num(gp_blHudEnabled))
if (get_pcvar_num(gp_blHudEnabled))
{
{
set_hudmessage(255, 0, 0, 0.05, 0.30);
set_hudmessage(255, 0, 0, 0.05, 0.30);
ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s gag has expired^n%s", g_szLineStyle, szName, g_szLineStyle);
ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s gag has expired^n%s", g_szLineStyle, szName, g_szLineStyle);
}
}
}
}
}
}


set_pev(iEnt, pev_nextthink, get_gametime() + 10.0);
set_pev(iEnt, pev_nextthink, get_gametime() + 10.0);
}
}


public CommandSayExecuted(id)
public CommandSayExecuted(id)
{
{
if (IsUserGagged(id) == GAG_YES)
if (IsUserGagged(id) == GAG_YES)
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


return PLUGIN_CONTINUE;
return PLUGIN_CONTINUE;
}
}


public CommandGag(id, iLevel, iCmdId)
public CommandGag(id, iLevel, iCmdId)
{
{
if (!cmd_access(id, iLevel, iCmdId, 4))
if (!cmd_access(id, iLevel, iCmdId, 4))
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


new szTarget[33], szTargetIP[16], szTime[8], szReason[64];
new szTarget[33], szTargetIP[16], szTime[8], szReason[64];
read_argv(1, szTarget, charsmax(szTarget));
read_argv(1, szTarget, charsmax(szTarget));


if (!regex_match_c(szTarget, g_iRegexIPPattern, g_iUnused))
if (!regex_match_c(szTarget, g_iRegexIPPattern, g_iUnused))
{
{
new iTarget = cmd_target(id, szTarget);
new iTarget = cmd_target(id, szTarget);


if (!iTarget)
if (!iTarget)
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


get_user_name(iTarget, szTarget, charsmax(szTarget));
get_user_name(iTarget, szTarget, charsmax(szTarget));
get_user_ip(iTarget, szTargetIP, charsmax(szTargetIP), 1);
get_user_ip(iTarget, szTargetIP, charsmax(szTargetIP), 1);
g_blIsUserMuted[iTarget] = true;
g_blIsUserMuted[iTarget] = true;
}
}
else
else
{
{
copy(szTargetIP, charsmax(szTargetIP), szTarget);
copy(szTargetIP, charsmax(szTargetIP), szTarget);
}
}


read_argv(2, szTime, charsmax(szTime));
read_argv(2, szTime, charsmax(szTime));
read_argv(3, szReason, charsmax(szReason));
read_argv(3, szReason, charsmax(szReason));
new iTime = str_to_num(szTime);
new iTime = str_to_num(szTime);


new szAdmin[32];
new szAdmin[32];
get_user_name(id, szAdmin, charsmax(szAdmin));
get_user_name(id, szAdmin, charsmax(szAdmin));


console_print(id, "%s", GagUser(szTarget, szTargetIP, iTime, szReason, szAdmin));
console_print(id, "%s", GagUser(szTarget, szTargetIP, iTime, szReason, szAdmin));


return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


public CommandUngag(id, iLevel, iCmdId)
public CommandUngag(id, iLevel, iCmdId)
{
{
if (!cmd_access(id, iLevel, iCmdId, 2))
if (!cmd_access(id, iLevel, iCmdId, 2))
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


new szTarget[32], szTargetIP[16];
new szTarget[32], szTargetIP[16];
read_argv(1, szTarget, charsmax(szTarget));
read_argv(1, szTarget, charsmax(szTarget));


if (!regex_match_c(szTarget, g_iRegexIPPattern, g_iUnused))
if (!regex_match_c(szTarget, g_iRegexIPPattern, g_iUnused))
{
{
new iTarget = cmd_target(id, szTarget, CMDTARGET_ALLOW_SELF);
new iTarget = cmd_target(id, szTarget, CMDTARGET_ALLOW_SELF);


if (!iTarget)
if (!iTarget)
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


get_user_name(iTarget, szTarget, charsmax(szTarget));
get_user_name(iTarget, szTarget, charsmax(szTarget));
get_user_ip(iTarget, szTargetIP, charsmax(szTargetIP), 1);
get_user_ip(iTarget, szTargetIP, charsmax(szTargetIP), 1);
}
}
else
else
{
{
copy(szTargetIP, charsmax(szTargetIP), szTarget);
copy(szTargetIP, charsmax(szTargetIP), szTarget);
}
}


new szAdminName[32];
new szAdminName[32];
get_user_name(id, szAdminName, charsmax(szAdminName));
get_user_name(id, szAdminName, charsmax(szAdminName));


console_print(id, "%s", UngagUser(szTarget, szTargetIP, szAdminName));
console_print(id, "%s", UngagUser(szTarget, szTargetIP, szAdminName));


return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


public CommandGagMenu(id, iLevel, iCmdId)
public CommandGagMenu(id, iLevel, iCmdId)
{
{
if (!cmd_access(id, iLevel, iCmdId, 1))
if (!cmd_access(id, iLevel, iCmdId, 1))
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


g_iGagTimeIndex[id] = 0;
g_iGagTimeIndex[id] = 0;
g_iUserTarget[id] = 0;
g_iUserTarget[id] = 0;
ShowGagMenu(id);
ShowGagMenu(id);


return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


ShowGagMenu(id, page = 0)
ShowGagMenu(id, page = 0)
{
{
new iMenu = menu_create("\rGag Menu", "GagMenuHandler");
new iMenu = menu_create("\rGag Menu", "GagMenuHandler");


new iPlayers[32], iPlayersNum;
new iPlayers[32], iPlayersNum;
get_players(iPlayers, iPlayersNum);
get_players(iPlayers, iPlayersNum);


new szItem[64], szName[32], szIndex[8];
new szItem[64], szName[32], szIndex[8];
new iPlayer;
new iPlayer;


for (new i = 0; i < iPlayersNum; i++)
for (new i = 0; i < iPlayersNum; i++)
{
{
iPlayer = iPlayers[i];
iPlayer = iPlayers[i];


if (i % 6 == 0)
if (i % 6 == 0)
{
{
formatex(szItem, charsmax(szItem), "\yGag length \r[\w%s\r]^n", g_GagTimes[g_iGagTimeIndex[id]][DISPLAY]);
formatex(szItem, charsmax(szItem), "\yGag length \r[\w%s\r]^n", g_GagTimes[g_iGagTimeIndex[id]][DISPLAY]);
menu_additem(iMenu, szItem, "time");
menu_additem(iMenu, szItem, "time");
}
}


get_user_name(iPlayer, szName, charsmax(szName));
get_user_name(iPlayer, szName, charsmax(szName));
num_to_str(iPlayer, szIndex, charsmax(szIndex));
num_to_str(iPlayer, szIndex, charsmax(szIndex));


if (IsUserGagged(iPlayer, false))
if (IsUserGagged(iPlayer, false))
{
{
formatex(szItem, charsmax(szItem), "\y%s \r[\wGagged\r]", szName);
formatex(szItem, charsmax(szItem), "\y%s \r[\wGagged\r]", szName);
}
}
else if (get_user_flags(iPlayer) & ADMIN_IMMUNITY)
else if (get_user_flags(iPlayer) & ADMIN_IMMUNITY)
{
{
formatex(szItem, charsmax(szItem), "\d%s \r[\wHas immunity\r]", szName);
formatex(szItem, charsmax(szItem), "\d%s \r[\wHas immunity\r]", szName);
}
}
else
else
{
{
copy(szItem, charsmax(szItem), szName);
copy(szItem, charsmax(szItem), szName);
}
}


menu_additem(iMenu, szItem, szIndex);
menu_additem(iMenu, szItem, szIndex);
}
}


menu_display(id, iMenu, page);
menu_display(id, iMenu, page);
}
}


public GagMenuHandler(id, iMenu, Item)
public GagMenuHandler(id, iMenu, Item)
{
{
if (Item == MENU_EXIT)
if (Item == MENU_EXIT)
{
{
menu_destroy(iMenu);
menu_destroy(iMenu);
return;
return;
}
}


new szInfo[8], iTemp;
new szInfo[8], iTemp;
menu_item_getinfo(iMenu, Item, iTemp, szInfo, charsmax(szInfo), _, _, iTemp);
menu_item_getinfo(iMenu, Item, iTemp, szInfo, charsmax(szInfo), _, _, iTemp);


if (equal(szInfo, "time"))
if (equal(szInfo, "time"))
{
{
++g_iGagTimeIndex[id];
++g_iGagTimeIndex[id];
g_iGagTimeIndex[id] %= sizeof g_GagTimes;
g_iGagTimeIndex[id] %= sizeof g_GagTimes;
menu_destroy(iMenu);
menu_destroy(iMenu);
ShowGagMenu(id, Item / 7);
ShowGagMenu(id, Item / 7);
return;
return;
}
}


new iTarget = str_to_num(szInfo);
new iTarget = str_to_num(szInfo);


if (IsUserGagged(iTarget, false) == GAG_YES)
if (IsUserGagged(iTarget, false) == GAG_YES)
{
{
new szName[32], szIP[16], szAdminName[32];
new szName[32], szIP[16], szAdminName[32];
get_user_name(id, szAdminName, charsmax(szAdminName));
get_user_name(id, szAdminName, charsmax(szAdminName));
get_user_name(iTarget, szName, charsmax(szName));
get_user_name(iTarget, szName, charsmax(szName));
get_user_ip(iTarget, szIP, charsmax(szIP), 1);
get_user_ip(iTarget, szIP, charsmax(szIP), 1);


UngagUser(szName, szIP, szAdminName);
UngagUser(szName, szIP, szAdminName);


menu_destroy(iMenu);
menu_destroy(iMenu);
return;
return;
}
}


if (get_user_flags(iTarget) & ADMIN_IMMUNITY)
if (get_user_flags(iTarget) & ADMIN_IMMUNITY)
{
{
menu_destroy(iMenu);
menu_destroy(iMenu);
return;
return;
}
}


g_iUserTarget[id] = iTarget;
g_iUserTarget[id] = iTarget;
client_cmd(id, "messagemode amx_TYPE_GAGREASON");
client_cmd(id, "messagemode amx_TYPE_GAGREASON");


menu_destroy(iMenu);
menu_destroy(iMenu);
}
}


public CommandGagReason(id, iLevel, iCmdId)
public CommandGagReason(id, iLevel, iCmdId)
{
{
if (!cmd_access(id, iLevel, iCmdId, 2) || !is_user_connected(g_iUserTarget[id]))
if (!cmd_access(id, iLevel, iCmdId, 2) || !is_user_connected(g_iUserTarget[id]))
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


new szReason[64], szName[32], szIP[16], szAdminName[32];
new szReason[64], szName[32], szIP[16], szAdminName[32];
read_argv(1, szReason, charsmax(szReason));
read_argv(1, szReason, charsmax(szReason));


get_user_name(id, szAdminName, charsmax(szAdminName));
get_user_name(id, szAdminName, charsmax(szAdminName));


get_user_name(g_iUserTarget[id], szName, charsmax(szName));
get_user_name(g_iUserTarget[id], szName, charsmax(szName));
get_user_ip(g_iUserTarget[id], szIP, charsmax(szIP), 1);
get_user_ip(g_iUserTarget[id], szIP, charsmax(szIP), 1);


GagUser(szName, szIP, g_GagTimes[g_iGagTimeIndex[id]][MINUTES], szReason, szAdminName);
GagUser(szName, szIP, g_GagTimes[g_iGagTimeIndex[id]][MINUTES], szReason, szAdminName);
g_blIsUserMuted[g_iUserTarget[id]] = true;
g_blIsUserMuted[g_iUserTarget[id]] = true;


ShowGagMenu(id);
ShowGagMenu(id);


return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


public CommandCleanDB(id, iLevel, iCmdId)
public CommandCleanDB(id, iLevel, iCmdId)
{
{
if (!cmd_access(id, iLevel, iCmdId, 1))
if (!cmd_access(id, iLevel, iCmdId, 1))
{
{
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


nvault_prune(g_iNVaultHandle, 0, get_systime());
nvault_prune(g_iNVaultHandle, 0, get_systime());


console_print(id, "Database has been cleaned.");
console_print(id, "Database has been cleaned.");


return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
}


UngagUser(szName[], szIP[], szAdmin[])
UngagUser(szName[], szIP[], szAdmin[])
{
{
new szResult[64], szTemp[3];
new szResult[64], szTemp[3];


if (!nvault_get(g_iNVaultHandle, szIP, szTemp, charsmax(szTemp)))
if (!nvault_get(g_iNVaultHandle, szIP, szTemp, charsmax(szTemp)))
{
{
formatex(szResult, charsmax(szResult), "User with IP %s not found.", szIP);
formatex(szResult, charsmax(szResult), "User with IP %s not found.", szIP);
return szResult;
return szResult;
}
}


nvault_remove(g_iNVaultHandle, szIP);
nvault_remove(g_iNVaultHandle, szIP);


if (!equal(szName, szIP))
if (!equal(szName, szIP))
{
{
new iTarget = cmd_target(0, szName, 0);
new iTarget = cmd_target(0, szName, 0);


g_blIsUserMuted[iTarget] = false;
g_blIsUserMuted[iTarget] = false;


PrintChatColor(iTarget, PRINT_COLOR_PLAYERTEAM, "!g%s!y You have been ungagged by admin!t %s!y!", g_szChatPrefix, szAdmin);
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03You have been ungagged by &x04%s", szAdmin);


PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y has been ungagged by!g %s!y.", g_szChatPrefix, szName, szAdmin);
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03Player &x03%s &x01has been ungagged by &x04%s", szName, szAdmin);


if (get_pcvar_num(gp_blHudEnabled))
if (get_pcvar_num(gp_blHudEnabled))
{
{
set_hudmessage(255, 0, 0, 0.05, 0.30);
set_hudmessage(255, 0, 0, 0.05, 0.30);
ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been ungagged by %s^n%s", g_szLineStyle, szName, szAdmin, g_szLineStyle);
ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been ungagged by %s^n%s", g_szLineStyle, szName, szAdmin, g_szLineStyle);
}
}
}
}


new id = find_player("d", szIP);
new id = find_player("d", szIP);
if (id != 0)
if (id != 0)
{
{
ExecuteForward(g_UngagForward, g_iUnused, id);
ExecuteForward(g_UngagForward, g_iUnused, id);
}
}


#if defined LOG_GAGS
#if defined LOG_GAGS
log_to_file(g_szLogFile, "[UNGAG] ADMIN: %s | TARGET_NAME: %s [IP: %s]", szAdmin, szName, szIP);
log_to_file(g_szLogFile, "[UNGAG] ADMIN: %s | TARGET_NAME: %s [IP: %s]", szAdmin, szName, szIP);
#endif
#endif
copy(szResult, charsmax(szResult), "Player has been ungagged");
copy(szResult, charsmax(szResult), "Player has been ungagged");
return szResult;
return szResult;
}
}


GagUser(szName[], szIP[], iDuration, szReason[], szAdminName[])
GagUser(szName[], szIP[], iDuration, szReason[], szAdminName[])
{
{
new iExpireTime = iDuration != 0 ? get_systime() + (iDuration * 60) : 0;
new iExpireTime = iDuration != 0 ? get_systime() + (iDuration * 60) : 0;


new szResult[64];
new szResult[64];


if (nvault_get(g_iNVaultHandle, szIP, szResult, charsmax(szResult)))
if (nvault_get(g_iNVaultHandle, szIP, szResult, charsmax(szResult)))
{
{
copy(szResult, charsmax(szResult), "Player is already gagged.");
copy(szResult, charsmax(szResult), "Player is already gagged.");
return szResult;
return szResult;
}
}


new szValue[512];
new szValue[512];
formatex(szValue, charsmax(szValue), "^"%s^"#^"%s^"#%d#^"%s^"", szName, szReason, iExpireTime, szAdminName);
formatex(szValue, charsmax(szValue), "^"%s^"#^"%s^"#%d#^"%s^"", szName, szReason, iExpireTime, szAdminName);


set_hudmessage(0, 255, 0, 0.05, 0.30);
set_hudmessage(0, 255, 0, 0.05, 0.30);


if (iExpireTime == 0)
if (iExpireTime == 0)
{
{
PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y has been gagged by!g %s!y. Reason: !t%s!y. Gag expires!t never!y.", g_szChatPrefix, szName, szAdminName, szReason);
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03%s &x01Player &x03%s &x01has been gagged by &x04%s &x01. &x03Reason: &x04%s &x01. &x03Gag expires &x01never", szName, szAdminName, szReason);


if (get_pcvar_num(gp_blHudEnabled))
if (get_pcvar_num(gp_blHudEnabled))
{
{
ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been gagged by %s^nExpires never^nReason: %s^n%s", g_szLineStyle, szName, szAdminName, szReason, g_szLineStyle);
ShowSyncHudMsg(0, g_iHudChannel, "%s^n has been gagged by %s^nExpires never^nReason: %s^n%s", g_szLineStyle, szName, szAdminName, szReason, g_szLineStyle);
}
}
}
}
else
else
{
{
PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y has been gagged by!g %s!y. Reason: !t%s!y. Gag expires!t %s", g_szChatPrefix, szName, szAdminName, szReason, GetTimeAsString(iDuration * 60));
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03Player &x03%s &x01has been gagged by &x04%s. &x03Reason: &x04%s. &x03Gag expires &x04%s", szName, szAdminName, szReason, GetTimeAsString(iDuration * 60));


if (get_pcvar_num(gp_blHudEnabled))
if (get_pcvar_num(gp_blHudEnabled))
{
{
ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been gagged by %s^nExpires in %s^nReason: %s^n%s", g_szLineStyle, szName, szAdminName, GetTimeAsString(iDuration * 60), szReason, g_szLineStyle);
ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been gagged by %s^nExpires in %s^nReason: %s^n%s", g_szLineStyle, szName, szAdminName, GetTimeAsString(iDuration * 60), szReason, g_szLineStyle);
}
}
}
}


emit_sound(0, CHAN_AUTO, g_szGagSound, 1.0, ATTN_NORM, SND_SPAWNING, PITCH_NORM);
emit_sound(0, CHAN_AUTO, g_szGagSound, 1.0, ATTN_NORM, SND_SPAWNING, PITCH_NORM);


#if defined LOG_GAGS
#if defined LOG_GAGS
log_to_file(g_szLogFile, "ADMIN: %s | PLAYER: %s [IP: %s] | REASON: %s | TIME: %s", szAdminName, szName, szIP, szReason, GetTimeAsString(iDuration * 60));
log_to_file(g_szLogFile, "ADMIN: %s | PLAYER: %s [IP: %s] | REASON: %s | TIME: %s", szAdminName, szName, szIP, szReason, GetTimeAsString(iDuration * 60));
#endif
#endif


new id = find_player("d", szIP);
new id = find_player("d", szIP);


if (id != 0)
if (id != 0)
{
{
ExecuteForward(g_GagForward, g_iUnused, id);
ExecuteForward(g_GagForward, g_iUnused, id);
}
}


nvault_set(g_iNVaultHandle, szIP, szValue);
nvault_set(g_iNVaultHandle, szIP, szValue);


copy(szResult, charsmax(szResult), "Player successfully gagged.");
copy(szResult, charsmax(szResult), "Player successfully gagged.");
return szResult;
return szResult;
}
}


IsUserGagged(id, bool:print = true)
IsUserGagged(id, bool:print = true)
{
{
new szIP[16], szVaultData[512];
new szIP[16], szVaultData[512];
get_user_ip(id, szIP, charsmax(szIP), 1);
get_user_ip(id, szIP, charsmax(szIP), 1);


if (!nvault_get(g_iNVaultHandle, szIP, szVaultData, charsmax(szVaultData)))
if (!nvault_get(g_iNVaultHandle, szIP, szVaultData, charsmax(szVaultData)))
{
{
g_blIsUserMuted[id] = false;
g_blIsUserMuted[id] = false;
return GAG_NOT;
return GAG_NOT;
}
}


new szGaggedName[32], szReason[64], szExpireDate[32], szAdminName[32];
new szGaggedName[32], szReason[64], szExpireDate[32], szAdminName[32];
replace_all(szVaultData, charsmax(szVaultData), "#", " ");
replace_all(szVaultData, charsmax(szVaultData), "#", " ");
parse(szVaultData, szGaggedName, charsmax(szGaggedName), szReason, charsmax(szReason), szExpireDate, charsmax(szExpireDate), szAdminName, charsmax(szAdminName));
parse(szVaultData, szGaggedName, charsmax(szGaggedName), szReason, charsmax(szReason), szExpireDate, charsmax(szExpireDate), szAdminName, charsmax(szAdminName));


new iExpireTime = str_to_num(szExpireDate);
new iExpireTime = str_to_num(szExpireDate);


if (get_systime() < iExpireTime || iExpireTime == 0)
if (get_systime() < iExpireTime || iExpireTime == 0)
{
{
if (print)
if (print)
{
{
if (iExpireTime == 0)
if (iExpireTime == 0)
{
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g%s!y You are gagged! Your gag expires!t never!y.", g_szChatPrefix);
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03You are gagged! Your gag expires &x01never.");
}
}
else
else
{
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g%s!y You are gagged! Your gag expires in!t %s", g_szChatPrefix, GetTimeAsString(iExpireTime - get_systime()));
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03You are gagged! Your gag expires in &x04%s", GetTimeAsString(iExpireTime - get_systime()));
}
}


PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g%s!y Gagged by!g %s!y. Gagged nickname:!t %s!y. Gag reason:!t %s!y.", g_szChatPrefix, szAdminName, szGaggedName, szReason);
CC_SendMessage(0, "&x01[&x04GAG&x01] &x03Gagged by &x03%s&x01. &x03Gagged nickname: &x04%s&x01. &x03Gag reason: &x04%s&x01.", szAdminName, szGaggedName, szReason);
}
}


g_blIsUserMuted[id] = true;
g_blIsUserMuted[id] = true;


return GAG_YES;
return GAG_YES;
}
}


g_blIsUserMuted[id] = false;
g_blIsUserMuted[id] = false;
ExecuteForward(g_UngagForward, g_iUnused, id);
ExecuteForward(g_UngagForward, g_iUnused, id);


nvault_remove(g_iNVaultHandle, szIP);
nvault_remove(g_iNVaultHandle, szIP);


return GAG_EXPIRED;
return GAG_EXPIRED;
}
}


GetTimeAsString(seconds)
GetTimeAsString(seconds)
{
{
new iYears = seconds / 31536000;
new iYears = seconds / 31536000;
seconds %= 31536000;
seconds %= 31536000;


new iMonths = seconds / 2592000;
new iMonths = seconds / 2592000;
seconds %= 2592000;
seconds %= 2592000;


new iWeeks = seconds / 604800;
new iWeeks = seconds / 604800;
seconds %= 604800;
seconds %= 604800;


new iDays = seconds / 86400;
new iDays = seconds / 86400;
seconds %= 86400;
seconds %= 86400;


new iHours = seconds / 3600;
new iHours = seconds / 3600;
seconds %= 3600;
seconds %= 3600;


new iMinutes = seconds / 60;
new iMinutes = seconds / 60;
seconds %= 60;
seconds %= 60;


new szResult[256];
new szResult[256];


if (iYears)
if (iYears)
{
{
format(szResult, charsmax(szResult), "%s%d Year%s ", szResult, iYears, iYears == 1 ? "" : "s");
format(szResult, charsmax(szResult), "%s%d Year%s ", szResult, iYears, iYears == 1 ? "" : "s");
}
}


if (iMonths)
if (iMonths)
{
{
format(szResult, charsmax(szResult), "%s%d Month%s ", szResult, iMonths, iMonths == 1 ? "" : "s");
format(szResult, charsmax(szResult), "%s%d Month%s ", szResult, iMonths, iMonths == 1 ? "" : "s");
}
}


if (iWeeks)
if (iWeeks)
{
{
format(szResult, charsmax(szResult), "%s%d Week%s ", szResult, iWeeks, iWeeks == 1 ? "" : "s");
format(szResult, charsmax(szResult), "%s%d Week%s ", szResult, iWeeks, iWeeks == 1 ? "" : "s");
}
}


if (iDays)
if (iDays)
{
{
format(szResult, charsmax(szResult), "%s%d Day%s ", szResult, iDays, iDays == 1 ? "" : "s");
format(szResult, charsmax(szResult), "%s%d Day%s ", szResult, iDays, iDays == 1 ? "" : "s");
}
}


if (iHours)
if (iHours)
{
{
format(szResult, charsmax(szResult), "%s%d Hour%s ", szResult, iHours, iHours == 1 ? "" : "s");
format(szResult, charsmax(szResult), "%s%d Hour%s ", szResult, iHours, iHours == 1 ? "" : "s");
}
}


if (iMinutes)
if (iMinutes)
{
{
format(szResult, charsmax(szResult), "%s%d Minute%s ", szResult, iMinutes, iMinutes == 1 ? "" : "s");
format(szResult, charsmax(szResult), "%s%d Minute%s ", szResult, iMinutes, iMinutes == 1 ? "" : "s");
}
}


if (seconds)
if (seconds)
{
{
format(szResult, charsmax(szResult), "%s%d Second%s", szResult, seconds, seconds == 1 ? "" : "s");
format(szResult, charsmax(szResult), "%s%d Second%s", szResult, seconds, seconds == 1 ? "" : "s");
}
}


return szResult;
return szResult;
}
}