plugins/adminhelp.sp
author David Anderson <dvander@alliedmods.net>
Fri Jul 11 06:51:21 2008 +0000 (2008-07-11)
branchrefac-jit
changeset 2192 7602d7fb60d9
parent 2168 c24a6fa957db
child 2289 44045ead61cd
permissions -rw-r--r--
fixed a compat regression, forgot msvc does funky things with overloaded virtual calls
dvander@2168
     1
/**
dvander@2168
     2
 * vim: set ts=4 :
dvander@2168
     3
 * =============================================================================
dvander@2168
     4
 * SourceMod Admin Help Plugin
dvander@2168
     5
 * Displays and searches SourceMod commands and descriptions.
dvander@2168
     6
 *
dvander@2168
     7
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
dvander@2168
     8
 * =============================================================================
dvander@2168
     9
 *
dvander@2168
    10
 * This program is free software; you can redistribute it and/or modify it under
dvander@2168
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2168
    12
 * Free Software Foundation.
dvander@2168
    13
 * 
dvander@2168
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2168
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2168
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2168
    17
 * details.
dvander@2168
    18
 *
dvander@2168
    19
 * You should have received a copy of the GNU General Public License along with
dvander@2168
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2168
    21
 *
dvander@2168
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2168
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2168
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2168
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2168
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2168
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2168
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2168
    29
 * or <http://www.sourcemod.net/license.php>.
dvander@2168
    30
 *
dvander@2168
    31
 * Version: $Id$
dvander@2168
    32
 */
dvander@2168
    33
dvander@2168
    34
#pragma semicolon 1
dvander@2168
    35
dvander@2168
    36
#include <sourcemod>
dvander@2168
    37
dvander@2168
    38
#define COMMANDS_PER_PAGE	10
dvander@2168
    39
dvander@2168
    40
public Plugin:myinfo = 
dvander@2168
    41
{
dvander@2168
    42
	name = "Admin Help",
dvander@2168
    43
	author = "AlliedModders LLC",
dvander@2168
    44
	description = "Display command information",
dvander@2168
    45
	version = SOURCEMOD_VERSION,
dvander@2168
    46
	url = "http://www.sourcemod.net/"
dvander@2168
    47
};
dvander@2168
    48
dvander@2168
    49
public OnPluginStart()
dvander@2168
    50
{
dvander@2168
    51
	LoadTranslations("common.phrases");
dvander@2168
    52
	LoadTranslations("adminhelp.phrases");
dvander@2168
    53
	RegConsoleCmd("sm_help", HelpCmd, "Displays SourceMod commands and descriptions");
dvander@2168
    54
	RegConsoleCmd("sm_searchcmd", HelpCmd, "Searches SourceMod commands");
dvander@2168
    55
}
dvander@2168
    56
dvander@2168
    57
public Action:HelpCmd(client, args)
dvander@2168
    58
{
dvander@2168
    59
	decl String:arg[64], String:CmdName[20];
dvander@2168
    60
	new PageNum = 1;
dvander@2168
    61
	new bool:DoSearch;
dvander@2168
    62
dvander@2168
    63
	GetCmdArg(0, CmdName, sizeof(CmdName));
dvander@2168
    64
dvander@2168
    65
	if (GetCmdArgs() >= 1)
dvander@2168
    66
	{
dvander@2168
    67
		GetCmdArg(1, arg, sizeof(arg));
dvander@2168
    68
		StringToIntEx(arg, PageNum);
dvander@2168
    69
		PageNum = (PageNum <= 0) ? 1 : PageNum;
dvander@2168
    70
	}
dvander@2168
    71
dvander@2168
    72
	DoSearch = (strcmp("sm_help", CmdName) == 0) ? false : true;
dvander@2168
    73
dvander@2168
    74
	if (GetCmdReplySource() == SM_REPLY_TO_CHAT)
dvander@2168
    75
	{
dvander@2168
    76
		ReplyToCommand(client, "[SM] %t", "See console for output");
dvander@2168
    77
	}
dvander@2168
    78
dvander@2168
    79
	decl String:Name[64];
dvander@2168
    80
	decl String:Desc[255];
dvander@2168
    81
	decl String:NoDesc[128];
dvander@2168
    82
	new Flags;
dvander@2168
    83
	new Handle:CmdIter = GetCommandIterator();
dvander@2168
    84
dvander@2168
    85
	FormatEx(NoDesc, sizeof(NoDesc), "%t", "No description available");
dvander@2168
    86
dvander@2168
    87
	if (DoSearch)
dvander@2168
    88
	{
dvander@2168
    89
		new i = 1;
dvander@2168
    90
		while (ReadCommandIterator(CmdIter, Name, sizeof(Name), Flags, Desc, sizeof(Desc)))
dvander@2168
    91
		{
dvander@2168
    92
			if ((StrContains(Name, arg, false) != -1) && CheckCommandAccess(client, Name, Flags))
dvander@2168
    93
			{
dvander@2168
    94
				PrintToConsole(client, "[%03d] %s - %s", i++, Name, (Desc[0] == '\0') ? NoDesc : Desc);
dvander@2168
    95
			}
dvander@2168
    96
		}
dvander@2168
    97
dvander@2168
    98
		if (i == 1)
dvander@2168
    99
		{
dvander@2168
   100
			PrintToConsole(client, "%t", "No matching results found");
dvander@2168
   101
		}
dvander@2168
   102
	} else {
dvander@2168
   103
		PrintToConsole(client, "%t", "SM help commands");		
dvander@2168
   104
dvander@2168
   105
		/* Skip the first N commands if we need to */
dvander@2168
   106
		if (PageNum > 1)
dvander@2168
   107
		{
dvander@2168
   108
			new i;
dvander@2168
   109
			new EndCmd = (PageNum-1) * COMMANDS_PER_PAGE - 1;
dvander@2168
   110
			for (i=0; ReadCommandIterator(CmdIter, Name, sizeof(Name), Flags, Desc, sizeof(Desc)) && i<EndCmd; )
dvander@2168
   111
			{
dvander@2168
   112
				if (CheckCommandAccess(client, Name, Flags))
dvander@2168
   113
				{
dvander@2168
   114
					i++;
dvander@2168
   115
				}
dvander@2168
   116
			}
dvander@2168
   117
dvander@2168
   118
			if (i == 0)
dvander@2168
   119
			{
dvander@2168
   120
				PrintToConsole(client, "%t", "No commands available");
dvander@2168
   121
				CloseHandle(CmdIter);
dvander@2168
   122
				return Plugin_Handled;
dvander@2168
   123
			}
dvander@2168
   124
		}
dvander@2168
   125
dvander@2168
   126
		/* Start printing the commands to the client */
dvander@2168
   127
		new i;
dvander@2168
   128
		new StartCmd = (PageNum-1) * COMMANDS_PER_PAGE;
dvander@2168
   129
		for (i=0; ReadCommandIterator(CmdIter, Name, sizeof(Name), Flags, Desc, sizeof(Desc)) && i<COMMANDS_PER_PAGE; )
dvander@2168
   130
		{
dvander@2168
   131
			if (CheckCommandAccess(client, Name, Flags))
dvander@2168
   132
			{
dvander@2168
   133
				i++;
dvander@2168
   134
				PrintToConsole(client, "[%03d] %s - %s", i+StartCmd, Name, (Desc[0] == '\0') ? NoDesc : Desc);
dvander@2168
   135
			}
dvander@2168
   136
		}
dvander@2168
   137
dvander@2168
   138
		if (i == 0)
dvander@2168
   139
		{
dvander@2168
   140
			PrintToConsole(client, "%t", "No commands available");
dvander@2168
   141
		} else {
dvander@2168
   142
			PrintToConsole(client, "%t", "Entries n - m in page k", StartCmd+1, i+StartCmd, PageNum);
dvander@2168
   143
		}
dvander@2168
   144
dvander@2168
   145
		/* Test if there are more commands available */
dvander@2168
   146
		if (ReadCommandIterator(CmdIter, Name, sizeof(Name), Flags, Desc, sizeof(Desc)) && CheckCommandAccess(client, Name, Flags))
dvander@2168
   147
		{
dvander@2168
   148
			PrintToConsole(client, "%t", "Type sm_help to see more", PageNum+1);
dvander@2168
   149
		}
dvander@2168
   150
	}
dvander@2168
   151
dvander@2168
   152
	CloseHandle(CmdIter);
dvander@2168
   153
dvander@2168
   154
	return Plugin_Handled;
dvander@2168
   155
}