diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /tracker/AdminServer/banlist.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'tracker/AdminServer/banlist.cpp')
| -rw-r--r-- | tracker/AdminServer/banlist.cpp | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/tracker/AdminServer/banlist.cpp b/tracker/AdminServer/banlist.cpp new file mode 100644 index 0000000..bbd6929 --- /dev/null +++ b/tracker/AdminServer/banlist.cpp @@ -0,0 +1,241 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: defines a RCon class used to send rcon commands to remote servers +// +// $NoKeywords: $ +//============================================================================= + +#include "banlist.h" +#include "Iresponse.h" + +#include "PlayerMsgHandler.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; + +CBanList::CBanList(IResponse *target,serveritem_t &server, const char *rconPassword) { + + memcpy(&m_Server, &server,sizeof(serveritem_t)); + m_pResponseTarget=target; + + m_bIsRefreshing=false; + m_bNewBanList=false; + m_bRconFailed=false; + m_bGotIPs = false; + + v_strncpy(m_szRconPassword,rconPassword,100); + + m_pRcon = new CRcon(this , server,rconPassword); + m_BanList=NULL; +} + +CBanList::~CBanList() { + delete m_pRcon; +} + + +//----------------------------------------------------------------------------- +// Purpose: sends a status query packet to a single server +//----------------------------------------------------------------------------- +void CBanList::SendQuery() +{ + // now use "rcon status" to pull the list of bans + m_pRcon->SendRcon("listid"); + m_bGotIPs=false; +} + + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CBanList::RunFrame() +{ + if(m_pRcon) + { + m_pRcon->RunFrame(); + } + +} + + +void CBanList::ServerResponded() +{ + + if(m_bGotIPs == false) + { + m_BanList.RemoveAll(); + + const char *rconResp = m_pRcon->RconResponse(); + const char *cur = strstr(rconResp,"UserID filter list:") + + strlen("UserID filter list:"); + + if( (unsigned int)cur == strlen("UserID filter list:")) + // if strstr returned NULL and we added a strlen to it... + { + cur=NULL; + } + // listid format: + // UserID filter list: + // 1 23434 : 20.000 min + + // and on empty it produces: + // IP filter list: empty + + while(cur!=NULL) + { + + TokenLine banLine; + cur++; // dodge the newline + banLine.SetLine(cur); // need to add one here, to remove the "\n" + if(banLine.CountToken() >= 4 ) + { + Bans_t ban; + + memset(&ban,0x0,sizeof(Bans_t)); + + v_strncpy(ban.name,banLine.GetToken(1),20); + sscanf(banLine.GetToken(3),"%f",&ban.time); + ban.type= ID; + m_BanList.AddToTail(ban); + + } + cur=strchr(cur,'\n'); + + } + + m_bGotIPs=true; + + // now find out the list of banned ips + m_pRcon->SendRcon("listip"); + } + else + { + + // listip format: + // IP filter list: + //192.168. 1. 66 : 20.000 min + + const char *rconResp = m_pRcon->RconResponse(); + const char *cur = strstr(rconResp,"IP filter list:") + + strlen("IP filter list:"); + + if( (unsigned int)cur == strlen("IP filter list:")) + // if strstr returned NULL and we added a strlen to it... + { + cur=NULL; + } + + + while(cur!=NULL) + { + + char tmpStr[512]; + Bans_t ban; + + cur++; // dodge past the newline + v_strncpy(tmpStr,cur,512); + + memset(&ban,0x0,sizeof(Bans_t)); + + if( strchr(tmpStr,':') != NULL ) + { + char *time; + time = strchr(tmpStr,':')+1; + tmpStr[strchr(tmpStr,':')-tmpStr]=0; + + v_strncpy(ban.name,tmpStr,20); + unsigned int i=0; + while(i<strlen(ban.name)) // strip all the white space out... + { + if( ban.name[i]==' ') + { + strcpy(&ban.name[i],&ban.name[i+1]); + } + else + { + i++; + } + } + + sscanf(time,"%f",&ban.time); + ban.type= IP; + m_BanList.AddToTail(ban); + + } + cur=strchr(cur,'\n'); + + } + + m_bNewBanList=true; + m_bIsRefreshing=false; + + + + + // notify the UI of the new server info + m_pResponseTarget->ServerResponded(); + } + +} + +void CBanList::ServerFailedToRespond() +{ + m_bNewBanList=true; + m_bIsRefreshing=false; + + if(m_bRconFailed==false) + { + m_bRconFailed=true; + // CDialogKickPlayer *box = new CDialogKickPlayer(); + //box->addActionSignalTarget(this); + // box->Activate("","Bad Rcon Password","badrcon"); + } + +// m_pResponseTarget->ServerFailedToRespond(); +} + +void CBanList::Refresh() +{ + SendQuery(); +} + +bool CBanList::IsRefreshing() +{ + return m_bIsRefreshing; +} + +serveritem_t &CBanList::GetServer() +{ + return m_Server; +} + + +bool CBanList::NewBanList() +{ + return m_bNewBanList; +} + +CUtlVector<Bans_t> *CBanList::GetBanList() +{ + m_bNewBanList=false; + return &m_BanList; +} + +void CBanList::SetPassword(const char *newPass) +{ + m_pRcon->SetPassword(newPass); + m_bRconFailed=false; +}
\ No newline at end of file |