core/sm_srvcmds.cpp
author David Anderson <dvander@alliedmods.net>
Fri Jan 19 05:33:04 2007 +0000 (2007-01-19)
changeset 324 e23aca731e37
parent 309 51e67f50830e
child 370 d3a484f98f6d
permissions -rw-r--r--
reorganized SourceMod for the public SDK
faluco@216
     1
#include "sm_srvcmds.h"
faluco@270
     2
#include "sm_version.h"
faluco@274
     3
#include "sm_stringutil.h"
faluco@216
     4
dvander@308
     5
RootConsoleMenu g_RootMenu;
faluco@216
     6
dvander@308
     7
RootConsoleMenu::RootConsoleMenu()
faluco@216
     8
{
dvander@308
     9
	m_pCommands = sm_trie_create();
faluco@216
    10
}
faluco@216
    11
dvander@308
    12
RootConsoleMenu::~RootConsoleMenu()
dvander@308
    13
{
dvander@308
    14
	sm_trie_destroy(m_pCommands);
dvander@308
    15
dvander@308
    16
	List<ConsoleEntry *>::iterator iter;
dvander@308
    17
	for (iter=m_Menu.begin(); iter!=m_Menu.end(); iter++)
dvander@308
    18
	{
dvander@308
    19
		delete (*iter);
dvander@308
    20
	}
dvander@308
    21
	m_Menu.clear();
dvander@308
    22
}
dvander@308
    23
dvander@308
    24
void RootConsoleMenu::OnSourceModStartup(bool late)
dvander@308
    25
{
dvander@308
    26
	ConCommandBaseMgr::OneTimeInit(this);
dvander@308
    27
	AddRootConsoleCommand("version", "Display version information", this);
dvander@308
    28
	AddRootConsoleCommand("credits", "Display credits listing", this);
dvander@308
    29
}
dvander@308
    30
dvander@308
    31
void RootConsoleMenu::OnSourceModShutdown()
dvander@308
    32
{
dvander@308
    33
	RemoveRootConsoleCommand("credits", this);
dvander@308
    34
	RemoveRootConsoleCommand("version", this);
dvander@308
    35
}
dvander@308
    36
dvander@308
    37
bool RootConsoleMenu::RegisterConCommandBase(ConCommandBase *pCommand)
faluco@216
    38
{
faluco@216
    39
	META_REGCVAR(pCommand);
faluco@216
    40
faluco@216
    41
	return true;
faluco@216
    42
}
faluco@216
    43
dvander@308
    44
void RootConsoleMenu::ConsolePrint(const char *fmt, ...)
dvander@308
    45
{
dvander@308
    46
	char buffer[512];
dvander@308
    47
dvander@308
    48
	va_list ap;
dvander@308
    49
	va_start(ap, fmt);
dvander@308
    50
	size_t len = vsnprintf(buffer, sizeof(buffer), fmt, ap);
dvander@308
    51
	va_end(ap);
dvander@308
    52
dvander@324
    53
	if (len >= sizeof(buffer) - 1)
dvander@308
    54
	{
dvander@308
    55
		buffer[510] = '\n';
dvander@308
    56
		buffer[511] = '\0';
dvander@308
    57
	} else {
dvander@308
    58
		buffer[len++] = '\n';
dvander@308
    59
		buffer[len] = '\0';
dvander@308
    60
	}
dvander@308
    61
	
dvander@308
    62
	META_CONPRINT(buffer);
dvander@308
    63
}
dvander@308
    64
dvander@308
    65
bool RootConsoleMenu::AddRootConsoleCommand(const char *cmd, const char *text, IRootConsoleCommand *pHandler)
faluco@216
    66
{
dvander@308
    67
	if (sm_trie_retrieve(m_pCommands, cmd, NULL))
dvander@308
    68
	{
dvander@308
    69
		return false;
dvander@308
    70
	}
dvander@308
    71
dvander@308
    72
	sm_trie_insert(m_pCommands, cmd, pHandler);
dvander@308
    73
dvander@308
    74
	/* Sort this into the menu */
dvander@308
    75
	List<ConsoleEntry *>::iterator iter = m_Menu.begin();
dvander@308
    76
	ConsoleEntry *pEntry;
dvander@308
    77
	bool inserted = false;
dvander@308
    78
	while (iter != m_Menu.end())
dvander@308
    79
	{
dvander@308
    80
		pEntry = (*iter);
dvander@308
    81
		if (strcmp(cmd, pEntry->command.c_str()) < 0)
dvander@308
    82
		{
dvander@308
    83
			ConsoleEntry *pNew = new ConsoleEntry;
dvander@308
    84
			pNew->command.assign(cmd);
dvander@308
    85
			pNew->description.assign(text);
dvander@308
    86
			m_Menu.insert(iter, pNew);
dvander@308
    87
			inserted = true;
dvander@308
    88
			break;
dvander@308
    89
		}
dvander@308
    90
		iter++;
dvander@308
    91
	}
dvander@308
    92
dvander@308
    93
	if (!inserted)
dvander@308
    94
	{
dvander@308
    95
		ConsoleEntry *pNew = new ConsoleEntry;
dvander@308
    96
		pNew->command.assign(cmd);
dvander@308
    97
		pNew->description.assign(text);
dvander@308
    98
		m_Menu.push_back(pNew);
dvander@308
    99
	}
dvander@308
   100
dvander@308
   101
	return true;
dvander@308
   102
}
dvander@308
   103
dvander@308
   104
bool RootConsoleMenu::RemoveRootConsoleCommand(const char *cmd, IRootConsoleCommand *pHandler)
dvander@308
   105
{
dvander@308
   106
	/* Sanity tests */
dvander@308
   107
	IRootConsoleCommand *object;
dvander@308
   108
	if (sm_trie_retrieve(m_pCommands, cmd, (void **)&object))
dvander@308
   109
	{
dvander@308
   110
		if (object != pHandler)
dvander@308
   111
		{
dvander@308
   112
			return false;
dvander@308
   113
		}
dvander@308
   114
	} else {
dvander@308
   115
		return false;
dvander@308
   116
	}
dvander@308
   117
dvander@308
   118
	sm_trie_delete(m_pCommands, cmd);
dvander@308
   119
dvander@308
   120
	List<ConsoleEntry *>::iterator iter;
dvander@308
   121
	ConsoleEntry *pEntry;
dvander@308
   122
	for (iter=m_Menu.begin(); iter!=m_Menu.end(); iter++)
dvander@308
   123
	{
dvander@308
   124
		pEntry = (*iter);
dvander@308
   125
		if (pEntry->command.compare(cmd) == 0)
dvander@308
   126
		{
dvander@308
   127
			delete pEntry;
dvander@308
   128
			m_Menu.erase(iter);
dvander@308
   129
			break;
dvander@308
   130
		}
dvander@308
   131
	}
dvander@308
   132
dvander@308
   133
	return true;
dvander@308
   134
}
dvander@308
   135
dvander@309
   136
void RootConsoleMenu::DrawGenericOption(const char *cmd, const char *text)
dvander@309
   137
{
dvander@309
   138
	char buffer[255];
dvander@309
   139
	size_t len, cmdlen = strlen(cmd);
dvander@309
   140
dvander@309
   141
	len = snprintf(buffer, sizeof(buffer), "    %s", cmd);
dvander@309
   142
	if (cmdlen < 16)
dvander@309
   143
	{
dvander@309
   144
		size_t num = 16 - cmdlen;
dvander@309
   145
		for (size_t i = 0; i < num; i++)
dvander@309
   146
		{
dvander@309
   147
			buffer[len++] = ' ';
dvander@309
   148
		}
dvander@309
   149
		len += snprintf(&buffer[len], sizeof(buffer) - len, " - %s", text);
dvander@309
   150
		ConsolePrint("%s", buffer);
dvander@309
   151
	}
dvander@309
   152
}
dvander@309
   153
dvander@308
   154
void RootConsoleMenu::GotRootCmd()
dvander@308
   155
{
dvander@308
   156
	unsigned int argnum = GetArgumentCount();
faluco@216
   157
faluco@216
   158
	if (argnum >= 2)
faluco@216
   159
	{
dvander@308
   160
		const char *cmd = GetArgument(1);
dvander@308
   161
		IRootConsoleCommand *pHandler;
dvander@308
   162
		if (sm_trie_retrieve(m_pCommands, cmd, (void **)&pHandler))
faluco@216
   163
		{
dvander@308
   164
			pHandler->OnRootConsoleCommand(cmd, argnum);
faluco@270
   165
			return;
faluco@216
   166
		}
faluco@216
   167
	}
dvander@308
   168
dvander@308
   169
	ConsolePrint("SourceMod Menu:");
dvander@308
   170
	ConsolePrint("Usage: sm <command> [arguments]");
dvander@308
   171
dvander@308
   172
	List<ConsoleEntry *>::iterator iter;
dvander@308
   173
	ConsoleEntry *pEntry;
dvander@308
   174
	for (iter=m_Menu.begin(); iter!=m_Menu.end(); iter++)
dvander@308
   175
	{
dvander@308
   176
		pEntry = (*iter);
dvander@309
   177
		DrawGenericOption(pEntry->command.c_str(), pEntry->description.c_str());
dvander@308
   178
	}
dvander@308
   179
}
dvander@308
   180
dvander@308
   181
const char *RootConsoleMenu::GetArgument(unsigned int argno)
dvander@308
   182
{
dvander@308
   183
	return engine->Cmd_Argv(argno);
dvander@308
   184
}
dvander@308
   185
dvander@308
   186
const char *RootConsoleMenu::GetArguments()
dvander@308
   187
{
dvander@308
   188
	return engine->Cmd_Args();
dvander@282
   189
}
dvander@308
   190
dvander@308
   191
unsigned int RootConsoleMenu::GetArgumentCount()
dvander@308
   192
{
dvander@308
   193
	return engine->Cmd_Argc();
dvander@308
   194
}
dvander@308
   195
dvander@308
   196
void RootConsoleMenu::OnRootConsoleCommand(const char *cmd, unsigned int argcount)
dvander@308
   197
{
dvander@308
   198
	if (strcmp(cmd, "credits") == 0)
dvander@308
   199
	{
dvander@308
   200
		ConsolePrint(" SourceMod was developed by AlliedModders, LLC.");
dvander@308
   201
		ConsolePrint(" Development would not have been possible without the following people:");
dvander@308
   202
		ConsolePrint("  David \"BAILOPAN\" Anderson, lead developer");
dvander@308
   203
		ConsolePrint("  Borja \"faluco\" Ferrer, Core developer");
dvander@308
   204
		ConsolePrint("  Scott \"Damaged Soul\" Ehlert, SourceMM developer");
dvander@308
   205
		ConsolePrint("  Pavol \"PM OnoTo\" Marko, SourceHook developer");
dvander@308
   206
		ConsolePrint(" Special thanks to Viper of GameConnect");
dvander@308
   207
		ConsolePrint(" Special thanks to Mani of Mani-Admin-Plugin");
dvander@308
   208
		ConsolePrint(" http://www.sourcemod.net/");
dvander@308
   209
	} else if (strcmp(cmd, "version") == 0) {
dvander@308
   210
		ConsolePrint(" SourceMod Version Information:");
dvander@308
   211
		ConsolePrint("    SourceMod Version: %s", SOURCEMOD_VERSION);
dvander@308
   212
		ConsolePrint("    JIT Version: %s, %s", g_pVM->GetVMName(), g_pVM->GetVersionString());
dvander@308
   213
		ConsolePrint("    JIT Settings: %s", g_pVM->GetCPUOptimizations());
dvander@308
   214
		ConsolePrint("    http://www.sourcemod.net/");
dvander@308
   215
	}
dvander@308
   216
}
dvander@308
   217
dvander@308
   218
CON_COMMAND(sm, "SourceMod Menu")
dvander@308
   219
{
dvander@308
   220
	g_RootMenu.GotRootCmd();
dvander@308
   221
}