core/smn_console.cpp
changeset 1119 9e3486386c04
parent 1077 32a36c0fc489
child 1231 17badaf66ce4
     1.1 --- a/core/smn_console.cpp	Sun Jul 15 17:22:47 2007 +0000
     1.2 +++ b/core/smn_console.cpp	Sun Jul 15 18:51:25 2007 +0000
     1.3 @@ -33,6 +33,34 @@
     1.4  	ConVarBound_Lower
     1.5  };
     1.6  
     1.7 +HandleType_t hCmdIterType = 0;
     1.8 +
     1.9 +struct GlobCmdIter
    1.10 +{
    1.11 +	bool started;
    1.12 +	List<ConCmdInfo *>::iterator iter;
    1.13 +};
    1.14 +
    1.15 +class ConsoleHelpers : 
    1.16 +	public SMGlobalClass,
    1.17 +	public IHandleTypeDispatch
    1.18 +{
    1.19 +public:
    1.20 +	virtual void OnSourceModAllInitialized()
    1.21 +	{
    1.22 +		HandleAccess access;
    1.23 +		g_HandleSys.InitAccessDefaults(NULL, &access);
    1.24 +		access.access[HandleAccess_Clone] = HANDLE_RESTRICT_OWNER | HANDLE_RESTRICT_IDENTITY;
    1.25 +
    1.26 +		hCmdIterType = g_HandleSys.CreateType(NULL, this, 0, NULL, &access, g_pCoreIdent, NULL);
    1.27 +	}
    1.28 +	virtual void OnHandleDestroy(HandleType_t type, void *object)
    1.29 +	{
    1.30 +		GlobCmdIter *iter = (GlobCmdIter *)object;
    1.31 +		delete iter;
    1.32 +	}
    1.33 +} s_ConsoleHelpers;
    1.34 +
    1.35  static void ReplicateConVar(ConVar *pConVar)
    1.36  {
    1.37  	int maxClients = g_Players.GetMaxClients();
    1.38 @@ -802,6 +830,78 @@
    1.39  	return g_ChatTriggers.SetReplyTo(params[1]);
    1.40  }
    1.41  
    1.42 +static cell_t GetCommandIterator(IPluginContext *pContext, const cell_t *params)
    1.43 +{
    1.44 +	GlobCmdIter *iter = new GlobCmdIter;
    1.45 +	iter->started = false;
    1.46 +
    1.47 +	Handle_t hndl = g_HandleSys.CreateHandle(hCmdIterType, iter, pContext->GetIdentity(), g_pCoreIdent, NULL);
    1.48 +	if (hndl == BAD_HANDLE)
    1.49 +	{
    1.50 +		delete iter;
    1.51 +	}
    1.52 +
    1.53 +	return hndl;
    1.54 +}
    1.55 +
    1.56 +static cell_t ReadCommandIterator(IPluginContext *pContext, const cell_t *params)
    1.57 +{
    1.58 +	GlobCmdIter *iter;
    1.59 +	HandleError err;
    1.60 +	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
    1.61 +
    1.62 +	if ((err = g_HandleSys.ReadHandle(params[1], hCmdIterType, &sec, (void **)&iter))
    1.63 +		!= HandleError_None)
    1.64 +	{
    1.65 +		return pContext->ThrowNativeError("Invalid GlobCmdIter Handle %x", params[1]);
    1.66 +	}
    1.67 +
    1.68 +	const List<ConCmdInfo *> &cmds = g_ConCmds.GetCommandList();
    1.69 +
    1.70 +	if (!iter->started)
    1.71 +	{
    1.72 +		iter->iter = cmds.begin();
    1.73 +		iter->started = true;
    1.74 +	}
    1.75 +
    1.76 +	while (iter->iter != cmds.end()
    1.77 +			&& !(*(iter->iter))->sourceMod)
    1.78 +	{
    1.79 +		iter->iter++;
    1.80 +	}
    1.81 +
    1.82 +	if (iter->iter == cmds.end())
    1.83 +	{
    1.84 +		return 0;
    1.85 +	}
    1.86 +
    1.87 +	ConCmdInfo *pInfo = (*(iter->iter));
    1.88 +
    1.89 +	pContext->StringToLocalUTF8(params[2], params[3], pInfo->pCmd->GetName(), NULL);
    1.90 +	pContext->StringToLocalUTF8(params[5], params[6], pInfo->pCmd->GetHelpText(), NULL);
    1.91 +	
    1.92 +	cell_t *addr;
    1.93 +	pContext->LocalToPhysAddr(params[4], &addr);
    1.94 +	*addr = pInfo->admin.eflags;
    1.95 +
    1.96 +	iter->iter++;
    1.97 +
    1.98 +	return 1;
    1.99 +}
   1.100 +
   1.101 +static cell_t CheckCommandAccess(IPluginContext *pContext, const cell_t *params)
   1.102 +{
   1.103 +	if (params[1] == 0)
   1.104 +	{
   1.105 +		return 1;
   1.106 +	}
   1.107 +
   1.108 +	char *cmd;
   1.109 +	pContext->LocalToString(params[2], &cmd);
   1.110 +
   1.111 +	return g_ConCmds.CheckCommandAccess(params[1], cmd, params[3]) ? 1 : 0;
   1.112 +}
   1.113 +
   1.114  REGISTER_NATIVES(consoleNatives)
   1.115  {
   1.116  	{"CreateConVar",		sm_CreateConVar},
   1.117 @@ -839,5 +939,8 @@
   1.118  	{"ReplyToCommand",		ReplyToCommand},
   1.119  	{"GetCmdReplySource",	GetCmdReplyTarget},
   1.120  	{"SetCmdReplySource",	SetCmdReplyTarget},
   1.121 +	{"GetCommandIterator",	GetCommandIterator},
   1.122 +	{"ReadCommandIterator",	ReadCommandIterator},
   1.123 +	{"CheckCommandAccess",	CheckCommandAccess},
   1.124  	{NULL,					NULL}
   1.125  };