amxmodx/plugins/adminhelp.sma
Vincent Herbet 07c3d49cfa Add amx_searchcmd command in adminhelp plugin and do some clean up (#415)
* AdminHelp: Use semicolon everywhere

* AdminHelp: Translate amx_help description

* AdminHelp: Use the available ADMIN_ALL define in register_concmd

* AdminHelp: Bind the cvars

* AdminHelp: Replace %L by %l

* AdminHelp: Remove task only when necessary

* AdminHelp: Reorder some lines to prepare next commit

* AdminHelp: Use read_arg_int() on the first argument and clamp the value

* AdminHelp: Use read_arg_int() on the second argument and clamp the value

* AdminHelp: Rename few variables and callback

* AdminHelp: Use constants for buffers max length

* AdminHelp: Add amx_searchcmd command, and update the multilingual file

* AdminHelp: Adjust spacing a little for readability

* AdminHelp: Add amx_help_display_msg_time cvar

* AdminHelp: Add the new command in the help message (and fix missing return)

* AdminHelp: Add a check if provided entry no. goes above the total found entries

* AdminHelp: Don't show the help message for begin if all commands are already displayed

* AdminHelp: Make sure the server command use amx_help_amount_per_page value
2017-08-01 22:56:21 +02:00

199 lines
5.2 KiB
SourcePawn
Executable File

// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Admin Help Plugin
//
#include <amxmodx>
const MaxMapLength = 32;
const MaxDefaultEntries = 10;
const MaxCommandLength = 32;
const MaxCommandInfoLength = 128;
const DefaultMsgTime = 15;
new const HelpCommand[] = "amx_help";
new const SearchCommand[] = "amx_searchcmd";
new CvarDisplayClientMessage;
new CvarDisplayMessageTime;
new CvarHelpAmount;
new CvarNextmap[MaxMapLength];
new Float:CvarTimeLimit;
new bool:DisplayClientMessage[MAX_PLAYERS + 1 char];
public plugin_init()
{
register_plugin("Admin Help", AMXX_VERSION_STR, "AMXX Dev Team");
register_dictionary("adminhelp.txt");
register_concmd(HelpCommand , "@ConsoleCommand_Help" , ADMIN_ALL, "HELP_CMD_INFO" , .info_ml = true);
register_concmd(SearchCommand, "@ConsoleCommand_Search", ADMIN_ALL, "SEARCH_CMD_INFO", .info_ml = true);
bind_pcvar_num(create_cvar("amx_help_display_msg" , "1" , .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0), CvarDisplayClientMessage);
bind_pcvar_num(create_cvar("amx_help_display_msg_time", "15", .has_min = true, .min_val = 0.0), CvarDisplayMessageTime);
bind_pcvar_num(create_cvar("amx_help_amount_per_page" , "10", .has_min = true, .min_val = 0.0), CvarHelpAmount);
}
public OnConfigsExecuted()
{
new const pointer = get_cvar_pointer("amx_nextmap");
if (pointer)
{
bind_pcvar_string(pointer, CvarNextmap, charsmax(CvarNextmap));
}
bind_pcvar_float(get_cvar_pointer("mp_timelimit"), CvarTimeLimit);
}
public client_putinserver(id)
{
if (CvarDisplayClientMessage > 0 && !is_user_bot(id))
{
DisplayClientMessage{id} = true;
new Float:messageTime = float(CvarDisplayMessageTime <= 0 ? DefaultMsgTime : CvarDisplayMessageTime);
set_task(messageTime, "@Task_DisplayMessage", id);
}
}
public client_disconnected(id)
{
if (DisplayClientMessage{id})
{
DisplayClientMessage{id} = false;
remove_task(id);
}
}
@ConsoleCommand_Search(id, level, cid)
{
new entry[MaxCommandLength];
read_argv(1, entry, charsmax(entry));
return ProcessHelp(id, .start_argindex = 2, .do_search = true, .main_command = SearchCommand, .search = entry);
}
@ConsoleCommand_Help(id, level, cid)
{
return ProcessHelp(id, .start_argindex = 1, .do_search = false, .main_command = HelpCommand);
}
ProcessHelp(id, start_argindex, bool:do_search, const main_command[], const search[] = "")
{
new user_flags = get_user_flags(id);
// HACK: ADMIN_ADMIN is never set as a user's actual flags, so those types of commands never show
if (user_flags > 0 && !(user_flags & ADMIN_USER))
{
user_flags |= ADMIN_ADMIN;
}
new clcmdsnum = get_concmdsnum(user_flags, id);
if (CvarHelpAmount <= 0)
{
CvarHelpAmount = MaxDefaultEntries;
}
new start = clamp(read_argv_int(start_argindex), .min = 1, .max = clcmdsnum) - 1; // Zero-based list;
new amount = !id ? read_argv_int(start_argindex + 1) : CvarHelpAmount;
new end = min(start + (amount > 0 ? amount : CvarHelpAmount), clcmdsnum);
console_print(id, "^n----- %l -----", "HELP_COMS");
new info[MaxCommandInfoLength];
new command[MaxCommandLength];
new command_flags;
new bool:is_info_ml;
new entries_found;
new total_entries;
new index;
if (do_search)
{
for (index = 0; index < clcmdsnum; ++index)
{
get_concmd(index, command, charsmax(command), command_flags, info, charsmax(info), user_flags, id, is_info_ml);
if (containi(command, search) != -1 && ++entries_found > start && (total_entries = entries_found) <= end)
{
if (is_info_ml)
{
LookupLangKey(info, charsmax(info), info, id);
}
console_print(id, "%3d: %s %s", entries_found, command, info);
}
}
if (!entries_found || entries_found > total_entries)
{
console_print(id, "%l", "NO_MATCHING_RESULTS");
return PLUGIN_HANDLED;
}
index = entries_found;
clcmdsnum = total_entries;
end = min(end, clcmdsnum);
}
else
{
for (index = start; index < end; ++index)
{
get_concmd(index, command, charsmax(command), command_flags, info, charsmax(info), user_flags, id, is_info_ml);
if (is_info_ml)
{
LookupLangKey(info, charsmax(info), info, id);
}
console_print(id, "%3d: %s %s", index + 1, command, info);
}
}
console_print(id, "----- %l -----", "HELP_ENTRIES", start + 1, end, clcmdsnum);
formatex(command, charsmax(command), "%s%c%s", main_command, do_search ? " " : "", search);
if (end < clcmdsnum)
{
console_print(id, "----- %l -----", "HELP_USE_MORE", command, end + 1);
}
else if (start || index != clcmdsnum)
{
console_print(id, "----- %l -----", "HELP_USE_BEGIN", command);
}
return PLUGIN_HANDLED;
}
@Task_DisplayMessage(id)
{
client_print(id, print_chat, "%l", "TYPE_HELP", HelpCommand, SearchCommand);
if (CvarTimeLimit > 0.0)
{
new timeleft = get_timeleft();
if (timeleft > 0)
{
client_print(id, print_chat, "%l", "TIME_INFO_1", timeleft / 60, timeleft % 60, CvarNextmap);
}
else if (CvarNextmap[0] != EOS)
{
client_print(id, print_chat, "%l", "TIME_INFO_2", CvarNextmap);
}
}
}