Gag

Created Diff never expires
18 removals
741 lines
15 additions
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;
}
}