source-engine/tracker/AdminServer/cmdlist.cpp

177 lines
3.0 KiB
C++
Raw Normal View History

2020-04-23 00:56:21 +08:00
//========= 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");
}