summaryrefslogtreecommitdiff
path: root/serverbrowser/BlacklistedServers.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /serverbrowser/BlacklistedServers.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'serverbrowser/BlacklistedServers.cpp')
-rw-r--r--serverbrowser/BlacklistedServers.cpp500
1 files changed, 500 insertions, 0 deletions
diff --git a/serverbrowser/BlacklistedServers.cpp b/serverbrowser/BlacklistedServers.cpp
new file mode 100644
index 0000000..c310f39
--- /dev/null
+++ b/serverbrowser/BlacklistedServers.cpp
@@ -0,0 +1,500 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "pch_serverbrowser.h"
+
+using namespace vgui;
+
+ConVar sb_showblacklists( "sb_showblacklists", "0", FCVAR_NONE, "If set to 1, blacklist rules will be printed to the console as they're applied." );
+
+//-----------------------------------------------------------------------------
+// Purpose: Server name comparison function
+//-----------------------------------------------------------------------------
+int __cdecl BlacklistedServerNameCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
+{
+ blacklisted_server_t *pSvr1 = ServerBrowserDialog().GetBlacklistPage()->GetBlacklistedServer( p1.userData );
+ blacklisted_server_t *pSvr2 = ServerBrowserDialog().GetBlacklistPage()->GetBlacklistedServer( p2.userData );
+
+ if ( !pSvr1 && pSvr2 )
+ return -1;
+ if ( !pSvr2 && pSvr1 )
+ return 1;
+ if ( !pSvr1 && !pSvr2 )
+ return 0;
+
+ return Q_stricmp( pSvr1->m_szServerName, pSvr2->m_szServerName );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: list column sort function
+//-----------------------------------------------------------------------------
+int __cdecl BlacklistedIPAddressCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
+{
+ blacklisted_server_t *pSvr1 = ServerBrowserDialog().GetBlacklistPage()->GetBlacklistedServer( p1.userData );
+ blacklisted_server_t *pSvr2 = ServerBrowserDialog().GetBlacklistPage()->GetBlacklistedServer( p2.userData );
+
+ if ( !pSvr1 && pSvr2 )
+ return -1;
+ if ( !pSvr2 && pSvr1 )
+ return 1;
+ if ( !pSvr1 && !pSvr2 )
+ return 0;
+
+ if ( pSvr1->m_NetAdr < pSvr2->m_NetAdr )
+ return -1;
+ else if ( pSvr2->m_NetAdr < pSvr1->m_NetAdr )
+ return 1;
+
+ return 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Player number comparison function
+//-----------------------------------------------------------------------------
+int __cdecl BlacklistedAtCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
+{
+ blacklisted_server_t *pSvr1 = ServerBrowserDialog().GetBlacklistPage()->GetBlacklistedServer( p1.userData );
+ blacklisted_server_t *pSvr2 = ServerBrowserDialog().GetBlacklistPage()->GetBlacklistedServer( p2.userData );
+
+ if ( !pSvr1 && pSvr2 )
+ return -1;
+ if ( !pSvr2 && pSvr1 )
+ return 1;
+ if ( !pSvr1 && !pSvr2 )
+ return 0;
+
+ if ( pSvr1->m_ulTimeBlacklistedAt > pSvr2->m_ulTimeBlacklistedAt )
+ return -1;
+ if ( pSvr1->m_ulTimeBlacklistedAt < pSvr2->m_ulTimeBlacklistedAt )
+ return 1;
+
+ return 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CBlacklistedServers::CBlacklistedServers( vgui::Panel *parent ) :
+ vgui::PropertyPage( parent, "BlacklistedGames" )
+{
+ SetSize( 624, 278 );
+
+ m_pAddServer = new Button(this, "AddServerButton", "#ServerBrowser_AddServer");
+ m_pAddCurrentServer = new Button(this, "AddCurrentServerButton", "#ServerBrowser_AddCurrentServer");
+ m_pGameList = vgui::SETUP_PANEL( new vgui::ListPanel(this, "gamelist") );
+ m_pGameList->SetAllowUserModificationOfColumns(true);
+
+ // Add the column headers
+ m_pGameList->AddColumnHeader(0, "Name", "#ServerBrowser_BlacklistedServers", 50, ListPanel::COLUMN_RESIZEWITHWINDOW | ListPanel::COLUMN_UNHIDABLE);
+ m_pGameList->AddColumnHeader(1, "IPAddr", "#ServerBrowser_IPAddress", 64, ListPanel::COLUMN_HIDDEN);
+ m_pGameList->AddColumnHeader(2, "BlacklistedAt", "#ServerBrowser_BlacklistedDate", 100);
+
+ //m_pGameList->SetColumnHeaderTooltip(0, "#ServerBrowser_PasswordColumn_Tooltip");
+
+ // setup fast sort functions
+ m_pGameList->SetSortFunc(0, BlacklistedServerNameCompare);
+ m_pGameList->SetSortFunc(1, BlacklistedIPAddressCompare);
+ m_pGameList->SetSortFunc(2, BlacklistedAtCompare);
+
+ // Sort by name by default
+ m_pGameList->SetSortColumn(0);
+
+ m_blackList.Reset();
+ m_blackListTimestamp = 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CBlacklistedServers::~CBlacklistedServers()
+{
+ ClearServerList();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: loads the initial blacklist from disk
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::LoadBlacklistedList()
+{
+ m_pGameList->SetEmptyListText("#ServerBrowser_NoBlacklistedServers");
+
+ ClearServerList();
+ m_blackList.Reset();
+
+ int count = m_blackList.LoadServersFromFile( BLACKLIST_DEFAULT_SAVE_FILE, false );
+
+ m_blackListTimestamp = g_pFullFileSystem->GetFileTime( BLACKLIST_DEFAULT_SAVE_FILE );
+
+ for( int i=0; i<count; ++i )
+ {
+ UpdateBlacklistUI( m_blackList.GetServer(i) );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: adds all the servers inside the specified file to the blacklist
+//-----------------------------------------------------------------------------
+bool CBlacklistedServers::AddServersFromFile( const char *pszFilename, bool bResetTimes )
+{
+ KeyValues *pKV = new KeyValues( "serverblacklist" );
+ if ( !pKV->LoadFromFile( g_pFullFileSystem, pszFilename, "GAME" ) )
+ return false;
+
+ for ( KeyValues *pData = pKV->GetFirstSubKey(); pData != NULL; pData = pData->GetNextKey() )
+ {
+ const char *pszName = pData->GetString( "name" );
+
+ uint32 ulDate = pData->GetInt( "date" );
+ if ( bResetTimes )
+ {
+ time_t today;
+ time( &today );
+ ulDate = today;
+ }
+
+ const char *pszNetAddr = pData->GetString( "addr" );
+
+ if ( pszNetAddr && pszNetAddr[0] && pszName && pszName[0] )
+ {
+ blacklisted_server_t *blackServer = m_blackList.AddServer( pszName, pszNetAddr, ulDate );
+
+ UpdateBlacklistUI( blackServer );
+ }
+ }
+
+ // write out blacklist to preserve changes
+ SaveBlacklistedList();
+
+ pKV->deleteThis();
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: save blacklist to disk
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::SaveBlacklistedList()
+{
+ m_blackList.SaveToFile( BLACKLIST_DEFAULT_SAVE_FILE );
+ m_blackListTimestamp = g_pFullFileSystem->GetFileTime( BLACKLIST_DEFAULT_SAVE_FILE );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::AddServer( gameserveritem_t &server )
+{
+ blacklisted_server_t *blackServer = m_blackList.AddServer( server );
+
+ if ( !blackServer )
+ {
+ return;
+ }
+
+ SaveBlacklistedList();
+
+ UpdateBlacklistUI( blackServer );
+
+ if ( GameSupportsReplay() )
+ {
+ // send command to propagate to the client so the client can send it on to the GC
+ char command[ 256 ];
+ Q_snprintf( command, Q_ARRAYSIZE( command ), "rbgc %s\n", blackServer->m_NetAdr.ToString() );
+ g_pRunGameEngine->AddTextCommand( command );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+blacklisted_server_t *CBlacklistedServers::GetBlacklistedServer( int iServerID )
+{
+ return m_blackList.GetServer( iServerID );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CBlacklistedServers::IsServerBlacklisted( gameserveritem_t &server )
+{
+ // if something has changed the blacklist file, reload it
+ if ( g_pFullFileSystem->GetFileTime( BLACKLIST_DEFAULT_SAVE_FILE ) != m_blackListTimestamp )
+ {
+ LoadBlacklistedList();
+ }
+
+ return m_blackList.IsServerBlacklisted( server );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::UpdateBlacklistUI( blacklisted_server_t *blackServer )
+{
+ if ( !blackServer )
+ return;
+
+ KeyValues *kv;
+ int iItemId = m_pGameList->GetItemIDFromUserData( blackServer->m_nServerID );
+ if ( m_pGameList->IsValidItemID( iItemId ) )
+ {
+ // we're updating an existing entry
+ kv = m_pGameList->GetItem( iItemId );
+ m_pGameList->SetUserData( iItemId, blackServer->m_nServerID );
+ }
+ else
+ {
+ // new entry
+ kv = new KeyValues("Server");
+ }
+
+ kv->SetString( "name", blackServer->m_szServerName );
+
+ // construct a time string for blacklisted time
+ struct tm *now;
+ now = localtime( (time_t*)&blackServer->m_ulTimeBlacklistedAt );
+ if ( now )
+ {
+ char buf[64];
+ strftime(buf, sizeof(buf), "%a %d %b %I:%M%p", now);
+ Q_strlower(buf + strlen(buf) - 4);
+ kv->SetString("BlacklistedAt", buf);
+ }
+
+ kv->SetString( "IPAddr", blackServer->m_NetAdr.ToString() );
+
+ if ( !m_pGameList->IsValidItemID( iItemId ) )
+ {
+ // new server, add to list
+ iItemId = m_pGameList->AddItem(kv, blackServer->m_nServerID, false, false);
+ kv->deleteThis();
+ }
+ else
+ {
+ // tell the list that we've changed the data
+ m_pGameList->ApplyItemChanges( iItemId );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::ApplySchemeSettings(vgui::IScheme *pScheme)
+{
+ BaseClass::ApplySchemeSettings(pScheme);
+
+ const char *pPathID = "PLATFORM";
+ const char *pszFileName = "servers/BlacklistedServersPage.res";
+ if ( g_pFullFileSystem->FileExists( pszFileName, "MOD" ) )
+ {
+ pPathID = "MOD";
+ }
+ LoadControlSettings( pszFileName, pPathID );
+
+ vgui::HFont hFont = pScheme->GetFont( "ListSmall", IsProportional() );
+ if ( !hFont )
+ {
+ hFont = pScheme->GetFont( "DefaultSmall", IsProportional() );
+ }
+ m_pGameList->SetFont( hFont );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnPageShow( void )
+{
+ // reload list since client may have changed it
+ LoadBlacklistedList();
+
+ m_pGameList->SetEmptyListText("#ServerBrowser_NoBlacklistedServers");
+ m_pGameList->SortList();
+
+ BaseClass::OnPageShow();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CBlacklistedServers::GetSelectedServerID( void )
+{
+ int serverID = -1;
+ if ( m_pGameList->GetSelectedItemsCount() )
+ {
+ serverID = m_pGameList->GetItemUserData( m_pGameList->GetSelectedItem(0) );
+ }
+
+ return serverID;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: opens context menu (user right clicked on a server)
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnOpenContextMenu(int itemID)
+{
+ CServerContextMenu *menu = ServerBrowserDialog().GetContextMenu( m_pGameList );
+
+ // get the server
+ int serverID = GetSelectedServerID();
+
+ menu->ShowMenu( this,(uint32)-1, false, false, false, false );
+ if ( serverID != -1 )
+ {
+ menu->AddMenuItem("RemoveServer", "#ServerBrowser_RemoveServerFromBlacklist", new KeyValues("RemoveFromBlacklist"), this);
+ }
+
+ menu->AddMenuItem("AddServerByName", "#ServerBrowser_AddServerByIP", new KeyValues("AddServerByName"), this);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Adds a server by IP address
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnAddServerByName()
+{
+ // open the add server dialog
+ CDialogAddBlacklistedServer *dlg = new CDialogAddBlacklistedServer( &ServerBrowserDialog(), NULL );
+ dlg->MoveToCenterOfScreen();
+ dlg->DoModal();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: removes a server from the blacklist
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnRemoveFromBlacklist()
+{
+ // iterate the selection
+ for ( int iGame = (m_pGameList->GetSelectedItemsCount() - 1); iGame >= 0; iGame-- )
+ {
+ int itemID = m_pGameList->GetSelectedItem( iGame );
+ int serverID = m_pGameList->GetItemData( itemID )->userData;
+
+ m_pGameList->RemoveItem( itemID );
+ m_blackList.RemoveServer( serverID );
+ }
+
+ InvalidateLayout();
+ Repaint();
+
+ ServerBrowserDialog().BlacklistsChanged();
+
+ SaveBlacklistedList();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::ClearServerList( void )
+{
+ m_pGameList->RemoveAll();
+ m_blackList.Reset();
+ m_blackListTimestamp = 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Adds the currently connected server to the list
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnAddCurrentServer()
+{
+ gameserveritem_t *pConnected = ServerBrowserDialog().GetCurrentConnectedServer();
+
+ if ( pConnected )
+ {
+ blacklisted_server_t *blackServer = m_blackList.AddServer( *pConnected );
+
+ if ( !blackServer )
+ {
+ return;
+ }
+
+ UpdateBlacklistUI( blackServer );
+
+ ServerBrowserDialog().BlacklistsChanged();
+
+ SaveBlacklistedList();
+
+ if ( GameSupportsReplay() )
+ {
+ // send command to propagate to the client so the client can send it on to the GC
+ char command[ 256 ];
+ Q_snprintf( command, Q_ARRAYSIZE( command ), "rbgc %s\n", pConnected->m_NetAdr.GetConnectionAddressString() );
+ g_pRunGameEngine->AddTextCommand( command );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnImportBlacklist()
+{
+ if ( m_hImportDialog.Get() )
+ {
+ m_hImportDialog.Get()->MarkForDeletion();
+ }
+
+ m_hImportDialog = new FileOpenDialog( this, "#ServerBrowser_ImportBlacklistTitle", true );
+ if ( m_hImportDialog.Get() )
+ {
+ m_hImportDialog->SetStartDirectory( "cfg/" );
+ m_hImportDialog->AddFilter( "*.txt", "#ServerBrowser_BlacklistFiles", true );
+ m_hImportDialog->DoModal( false );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnFileSelected( char const *fullpath )
+{
+ AddServersFromFile( fullpath, true );
+
+ if ( m_hImportDialog.Get() )
+ {
+ m_hImportDialog.Get()->MarkForDeletion();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Parse posted messages
+//
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnCommand(const char *command)
+{
+ if (!Q_stricmp(command, "AddServerByName"))
+ {
+ OnAddServerByName();
+ }
+ else if (!Q_stricmp(command, "AddCurrentServer" ))
+ {
+ OnAddCurrentServer();
+ }
+ else if (!Q_stricmp(command, "ImportBlacklist" ))
+ {
+ OnImportBlacklist();
+ }
+ else
+ {
+ BaseClass::OnCommand(command);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: enables adding server
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnConnectToGame()
+{
+ m_pAddCurrentServer->SetEnabled( true );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: disables adding current server
+//-----------------------------------------------------------------------------
+void CBlacklistedServers::OnDisconnectFromGame( void )
+{
+ m_pAddCurrentServer->SetEnabled( false );
+}