mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
177 lines
3.0 KiB
C++
177 lines
3.0 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: queries server for the command list, and then use QueryCommand() to see
|
|
// if the server supports this command.
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================
|
|
|
|
#include <ctype.h> // isspace() define
|
|
#include <string.h>
|
|
|
|
#include "CMDList.h"
|
|
#include "Iresponse.h"
|
|
|
|
#include "Socket.h"
|
|
#include "proto_oob.h"
|
|
#include "DialogGameInfo.h"
|
|
#include "inetapi.h"
|
|
#include "TokenLine.h"
|
|
#include "dialogkickplayer.h"
|
|
|
|
extern void v_strncpy(char *dest, const char *src, int bufsize);
|
|
|
|
typedef enum
|
|
{
|
|
NONE = 0,
|
|
INFO_REQUESTED,
|
|
INFO_RECEIVED
|
|
} RCONSTATUS;
|
|
|
|
|
|
typedef enum
|
|
{
|
|
FS,
|
|
PAK
|
|
} MAP_TYPES;
|
|
|
|
CCMDList::CCMDList(IResponse *target,serveritem_t &server, const char *rconPassword) {
|
|
|
|
memcpy(&m_Server, &server,sizeof(serveritem_t));
|
|
|
|
m_bGotCommands = false;
|
|
m_pResponseTarget=target;
|
|
|
|
v_strncpy(m_szRconPassword,rconPassword,100);
|
|
|
|
m_pRcon = new CRcon(this , server,rconPassword);
|
|
m_pRcon->SendRcon("cmdlist");
|
|
m_CMDList.RemoveAll();
|
|
}
|
|
|
|
CCMDList::~CCMDList() {
|
|
delete m_pRcon;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CCMDList::RunFrame()
|
|
{
|
|
if(m_pRcon)
|
|
{
|
|
m_pRcon->RunFrame();
|
|
}
|
|
}
|
|
|
|
|
|
void CCMDList::ServerResponded()
|
|
{
|
|
char store[2048];
|
|
strcpy(store, m_pRcon->RconResponse());
|
|
char *cur=store;
|
|
char *next=NULL;
|
|
char *cmd=NULL;
|
|
bool cmd_end=false;
|
|
|
|
// response format:
|
|
//Command List
|
|
//--------------
|
|
//_unloadmodule
|
|
// ...
|
|
// writeip
|
|
//--------------
|
|
//125 Total Commands
|
|
//CmdList ? for syntax
|
|
|
|
while(cur!=NULL)
|
|
{
|
|
if(next!=NULL)
|
|
{
|
|
cur++;
|
|
}
|
|
next=strchr(cur,'\n');
|
|
if(next!=NULL)
|
|
{
|
|
*next='\0';
|
|
}
|
|
if( strncmp(cur,"Command List",12) && strncmp(cur,"-------------",13)
|
|
&& strncmp(cur,"Total Commands",14) && strncmp(cur,"CmdList ? for syntax",20) )
|
|
{
|
|
char *removeWhiteSpace=cur;
|
|
while(!isspace(*removeWhiteSpace) && removeWhiteSpace<next)
|
|
{
|
|
removeWhiteSpace++;
|
|
}
|
|
*removeWhiteSpace='\0';
|
|
|
|
cmd = new char[strlen(cur)];
|
|
if(cmd)
|
|
{
|
|
strcpy(cmd,cur);
|
|
m_CMDList.AddToTail(cmd);
|
|
}
|
|
}
|
|
else if ( ! strncmp(cur,"CmdList ? for syntax",20))
|
|
{
|
|
cmd_end=true;
|
|
}
|
|
cur=next;
|
|
}
|
|
|
|
if( cmd_end )
|
|
{
|
|
m_bGotCommands = true;
|
|
m_pResponseTarget->ServerResponded();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void CCMDList::ServerFailedToRespond()
|
|
{
|
|
//m_pResponseTarget->ServerFailedToRespond();
|
|
}
|
|
|
|
|
|
serveritem_t &CCMDList::GetServer()
|
|
{
|
|
return m_Server;
|
|
}
|
|
|
|
|
|
bool CCMDList::QueryCommand(char *cmd)
|
|
{
|
|
if(!m_bGotCommands)
|
|
return false;
|
|
|
|
|
|
for(int i=0;i<m_CMDList.Count();i++)
|
|
{
|
|
char *cmd_in = m_CMDList[i];
|
|
if(!stricmp(cmd,m_CMDList[i]))
|
|
break;
|
|
}
|
|
if(i!=m_CMDList.Count())
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
|
|
}
|
|
|
|
bool CCMDList::GotCommands()
|
|
{
|
|
return m_bGotCommands;
|
|
}
|
|
|
|
void CCMDList::SetPassword(const char *newPass)
|
|
{
|
|
m_pRcon->SetPassword(newPass);
|
|
m_bGotCommands = false;
|
|
m_CMDList.RemoveAll();
|
|
|
|
m_pRcon->SendRcon("cmdlist");
|
|
} |