I'm sharing the code of a gag plugin below. I wish to know if there could be any sort of improvement in the code.
Code:
#include <amxmodx>
#include <amxmisc>
// #include <cstrike>
// #include <engine>
// #include <fakemeta>
// #include <hamsandwich>
// #include <fun>
// #include <xs>
// #include <sqlx>
#include <reapi>
#include <nvault_util>
#define PLUGIN "Mute Menu"
#define VERSION "1.0"
#define AUTHOR "Ish Chhabra"
#pragma semicolon 1
// Decalare global variables.
// Booleans.
new bool:g_bIsGagged[MAX_PLAYERS + 1];
// Integers.
new g_iVaultHandle;
new g_iGagMenuCallback;
new g_iGagTimes[MAX_PLAYERS + 1];
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("amx_gag", "GagPlayerCommand", ADMIN_LEVEL_B, "<nick, #userid, authid> <time in minutes> <reason>");
register_clcmd("amx_ungag", "UnGagPlayerCommand", ADMIN_LEVEL_B, "<authid>");
// Add gag and ungag option to "amxmodmenu"
AddMenuItem("Gag Player", "amx_gagmenu", ADMIN_LEVEL_B, PLUGIN);
AddMenuItem("Ungag Player", "amx_ungagmenu", ADMIN_LEVEL_B, PLUGIN);
register_clcmd("amx_gagmenu", "GagMenu", ADMIN_LEVEL_B);
register_clcmd("amx_ungagmenu", "UnGagMenu", ADMIN_LEVEL_B);
register_clcmd("say", "BlockSay");
register_clcmd("say_team", "BlockSay");
RegisterHookChain(RG_CSGameRules_CanPlayerHearPlayer, "RG_Hook_CanPlayerHearPlayer", false);
g_iVaultHandle = nvault_open("GagVault");
g_iGagMenuCallback = menu_makecallback("GagMenu_Callback");
set_task(5.0, "gagvault_prune", _, _, _, "b");
}
// Close (n)vault on plugin end.
public plugin_end() {
nvault_close(g_iVaultHandle);
}
// Check if player is gagged on player connect.
public client_putinserver(id) {
new szAuthID[34];
get_user_authid(id, szAuthID, charsmax(szAuthID));
// Check for gagged
new iTimeStamp, iKeyExists = nvault_lookup(g_iVaultHandle, szAuthID, "", 0, iTimeStamp);
if (iKeyExists) g_bIsGagged[id] = true;
}
public client_disconnected(id) {
g_bIsGagged[id] = false;
}
// Remove ungagged players entry from nvault.
public gagvault_prune() {
// Close and reopen vault in order to let nvaul_util get realtime data.
nvault_close(g_iVaultHandle);
g_iVaultHandle = nvault_open("GagVault");
new Data[1]; Data[0] = get_systime();
new iVaultHandle = nvault_util_open("GagVault");
nvault_util_readall(iVaultHandle, "nvault_util_prune", Data);
nvault_util_close(iVaultHandle);
}
// Prune with ungagging player on server if he is present.
public nvault_util_prune(iCurrent, iTotal, szKey[], szVal[], iTimeStamp, Data[], iSize) {
if (Data[0] >= iTimeStamp) {
nvault_remove(g_iVaultHandle, szKey);
// If the ungagged player is present on server, set the variable storing gag status of player to "false".
new iTarget = find_player("c", szKey);
if (iTarget) {
g_bIsGagged[iTarget] = false;
}
}
}
// Gag by console command
public GagPlayerCommand(id, level, cid) {
if (!cmd_access(id, level, cid, 2)) {
return PLUGIN_HANDLED;
}
new szTarget[36]; // Max AuthID Length : 34, Max Name Length : 32, Max ID Length : 4 (Including #) --> 2 extra for safety.
read_argv(1, szTarget, charsmax(szTarget));
new iTarget = cmd_target(id, szTarget, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF);
if (!iTarget) {
return PLUGIN_HANDLED;
}
new time = read_argv_int(2);
if (time < 0) {
console_print(id, "Time can not be less than zero.");
return PLUGIN_HANDLED;
}
new szTargetAuthID[34];
get_user_authid(iTarget, szTargetAuthID, charsmax(szTargetAuthID));
new szTargetName[MAX_NAME_LENGTH];
get_user_name(iTarget, szTargetName, charsmax(szTargetName));
GagPlayer(id, szTargetAuthID, szTargetName, time);
return PLUGIN_HANDLED;
}
// Ungag by console command.
public UnGagPlayerCommand(id, level, cid) {
if (!cmd_access(id, level, cid, 1)) {
return PLUGIN_HANDLED;
}
new szAuthID[34];
read_argv(1, szAuthID, charsmax(szAuthID));
UngagPlayer(id, szAuthID);
return PLUGIN_HANDLED;
}
// Gag menu command.
public GagMenu(id, level, cid) {
if (!cmd_access(id, level, cid, 0)) {
return PLUGIN_HANDLED;
}
g_iGagTimes[id] = 5; // When menu is displayed first time, reset the ban time to 5
ShowGagMenu(id, 0);
return PLUGIN_HANDLED;
}
// Show gag menu.
ShowGagMenu(id, menupage = 0) {
new iMenu = menu_create("Gag Menu", "GagMenu_Handler");
new players[32], num, player;
get_players(players, num);
new CountMenuItems = 0, CountCurrentItemNumber = 1, szName[MAX_NAME_LENGTH], szAuthID[34];
while (CountMenuItems < num) {
if (CountCurrentItemNumber == 7) {
static szFormat[64];
if (g_iGagTimes[id] == 0) {
formatex(szFormat, charsmax(szFormat), "Permanent");
}
else {
formatex(szFormat, charsmax(szFormat), "%d minutes", g_iGagTimes[id]);
}
menu_additem(iMenu, szFormat, "GAGTIME");
CountCurrentItemNumber = 1;
}
else {
player = players[CountMenuItems];
get_user_name(player, szName, charsmax(szName));
get_user_authid(player, szAuthID, charsmax(szAuthID));
menu_additem(iMenu, szName, szAuthID, _, g_iGagMenuCallback);
CountCurrentItemNumber++;
CountMenuItems++;
}
}
if (CountCurrentItemNumber > 1) {
while(CountCurrentItemNumber != 7) {
menu_addblank2(iMenu);
CountCurrentItemNumber++;
}
menu_addblank(iMenu, 0);
new szFormat[64];
if (g_iGagTimes[id] == 0) {
formatex(szFormat, charsmax(szFormat), "Permanent");
}
else {
formatex(szFormat, charsmax(szFormat), "%d minutes", g_iGagTimes[id]);
}
menu_additem(iMenu, szFormat, "GAGTIME");
}
menu_display(id, iMenu, menupage);
}
// Gag menu handler.
public GagMenu_Handler(id, iMenu, iKey) {
if (iKey == MENU_EXIT) {
menu_destroy(iMenu);
return;
}
new _access, _callback, szInfo[34], szName[MAX_NAME_LENGTH];
menu_item_getinfo(iMenu, iKey, _access, szInfo, charsmax(szInfo), szName, charsmax(szName), _callback);
if (equal(szInfo, "GAGTIME")) {
if (g_iGagTimes[id] > 15) {
g_iGagTimes[id] = (g_iGagTimes[id] + 10) % 60;
}
else {
g_iGagTimes[id] = (g_iGagTimes[id] + 5) % 60;
}
}
else {
GagPlayer(id, szInfo, szName, g_iGagTimes[id]);
}
new _menu, _newmenu, menupage;
player_menu_info(id, _menu, _newmenu, menupage);
menu_destroy(iMenu);
ShowGagMenu(id, menupage);
}
// Gag menu callback.
public GagMenu_Callback(id, iMenu, iKey) {
new _access, _callback, szInfo[34];
menu_item_getinfo(iMenu, iKey, _access, szInfo, charsmax(szInfo), _, _, _callback);
new iTarget = find_player("c", szInfo);
if (!iTarget) set_fail_state("ERROR LINE 339");
if(g_bIsGagged[iTarget]) return ITEM_DISABLED;
return ITEM_ENABLED;
}
// Ungag menu command.
public UnGagMenu(id, level, cid) {
if (!cmd_access(id, level, cid, 0)) {
return PLUGIN_HANDLED;
}
ShowUnGagMenu(id, 0);
return PLUGIN_HANDLED;
}
// Show ungag menu.
ShowUnGagMenu(id, menupage = 0) {
new iMenu = menu_create("Ungag Menu", "UnGagMenu_Handler");
new players[32], num, player, szName[MAX_NAME_LENGTH], szAuthID[34];
get_players(players, num);
new Count = 0;
for (new i = 0; i < num; i++) {
player = players[i];
if(!g_bIsGagged[player]) continue;
get_user_name(player, szName, charsmax(szName));
get_user_authid(player, szAuthID, charsmax(szAuthID));
menu_additem(iMenu, szName, szAuthID);
Count++;
}
if (Count == 0) {
client_print_color(id, print_chat, "^4|HSG|~ ^1There is no gagged player currently on the server.");
return PLUGIN_HANDLED;
}
menu_display(id, iMenu, menupage);
return PLUGIN_HANDLED;
}
// Ungag menu handler.
public UnGagMenu_Handler(id, iMenu, iKey) {
if (iKey == MENU_EXIT) {
menu_destroy(iMenu);
return;
}
new _access, _callback, szAuthID[34];
menu_item_getinfo(iMenu, iKey, _access, szAuthID, charsmax(szAuthID), _, _, _callback);
UngagPlayer(id, szAuthID);
new _menu, _newmenu, menupage;
player_menu_info(id, _menu, _newmenu, menupage);
menu_destroy(iMenu);
ShowUnGagMenu(id, menupage);
}
// Block voice talk if player is gagged.
public RG_Hook_CanPlayerHearPlayer(const listener, const sender) {
if (listener != sender && g_bIsGagged[sender]) {
SetHookChainReturn(ATYPE_INTEGER, 0);
return HC_SUPERCEDE;
}
return HC_CONTINUE;
}
// Block chat talk if player is gagged.
public BlockSay(id) {
return g_bIsGagged[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
}
GagPlayer(iAdmin, szTargetAuthID[], szTargetName[], time) {
new iUngagTime = get_systime() + time * 60;
new szAdminName[MAX_NAME_LENGTH];
get_user_name(iAdmin, szAdminName, charsmax(szAdminName));
new iTimeStamp, iKeyExists = nvault_lookup(g_iVaultHandle, szTargetAuthID, "", 0, iTimeStamp);
if(iKeyExists) {
client_print_color(iAdmin, print_team_default, "^4|HSG|~ ^1PLAYER %s is already gagged.", szTargetName);
return;
}
if(time == 0) {
nvault_pset(g_iVaultHandle, szTargetAuthID, szTargetName);
client_print_color(0, print_team_default, "^4|HSG|~ ^1ADMIN : %s gagged %s permanently.", szAdminName, szTargetName);
}
else {
nvault_set(g_iVaultHandle, szTargetAuthID, szTargetName);
nvault_touch(g_iVaultHandle, szTargetAuthID, iUngagTime);
client_print_color(0, print_team_default, "^4|HSG|~ ^1ADMIN : %s gagged %s for %d minutes.", szAdminName, szTargetName, time);
}
new iTarget = find_player("c", szTargetAuthID);
if (iTarget) {
g_bIsGagged[iTarget] = true;
}
}
UngagPlayer(iAdmin, szTargetAuthID[]) {
new szTargetName[MAX_NAME_LENGTH], iTimeStamp, iKeyExists = nvault_lookup(g_iVaultHandle, szTargetAuthID, szTargetName, charsmax(szTargetName), iTimeStamp);
if(iKeyExists) {
nvault_remove(g_iVaultHandle, szTargetAuthID);
new szAdminName[MAX_NAME_LENGTH];
get_user_name(iAdmin, szAdminName, charsmax(szAdminName));
client_print_color(0, print_team_default, "^4|HSG|~ ^1ADMIN : %s ungagged %s.", szAdminName, szTargetName);
new iTarget = find_player("c", szTargetAuthID);
if (iTarget) {
g_bIsGagged[iTarget] = false;
}
}
else {
client_print_color(0, print_team_default, "^4|HSG|~ ^1PLAYER %s is not gagged", szTargetName);
}
}