Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
6.2 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "tf_notification.h"
#include "c_tf_notification.h"
#include "tf_gc_client.h"
#include "econ/econ_notifications.h"
///
/// Support message notification dialog
///
class CTFSupportNotificationDialog : public CTFMessageBoxDialog
{
DECLARE_CLASS_SIMPLE( CTFSupportNotificationDialog, CTFMessageBoxDialog );
public:
CTFSupportNotificationDialog( int iNotificationID, const char *pszSupportMessage )
: CTFMessageBoxDialog( NULL, pszSupportMessage, NULL, NULL, NULL )
, m_iNotificationID( iNotificationID )
, m_pConfirmDialog( NULL )
{
SetDialogVariable( "text", GetText() );
}
void CleanupConfirmDialog()
{
if ( m_pConfirmDialog )
{
m_pConfirmDialog->SetVisible( false );
m_pConfirmDialog->MarkForDeletion();
m_pConfirmDialog = NULL;
}
}
virtual ~CTFSupportNotificationDialog() {
CleanupConfirmDialog();
}
void ConfirmDialogCallback( bool bConfirmed )
{
CleanupConfirmDialog();
if ( bConfirmed )
{
// User acknowledged the message, tell the notification it can go away now
CClientNotification *pNotification = dynamic_cast< CClientNotification * >( NotificationQueue_Get( m_iNotificationID ) );
if ( pNotification )
{
pNotification->OnDialogAcknowledged();
}
BaseClass::OnCommand( "confirm" );
}
}
static void StaticConfirmDialogCallback( bool bConfirmed, void *pContext )
{
static_cast< CTFSupportNotificationDialog * >( pContext )->ConfirmDialogCallback( bConfirmed );
}
virtual void OnCommand( const char *command ) OVERRIDE
{
if ( FStrEq( "acknowledge", command ) )
{
// Confirm this, it's going away forever!
CleanupConfirmDialog();
m_pConfirmDialog = ShowConfirmDialog( "#DeleteConfirmDefault",
"#TF_Support_Message_Confirm_Acknowledge_Text",
"#TF_Support_Message_Acknowledge", "#Cancel",
&StaticConfirmDialogCallback );
m_pConfirmDialog->SetContext( this );
return;
}
else if ( FStrEq( "show_later", command ) )
{
// User selected "show this later" -- leave notification as is and close.
CleanupConfirmDialog();
BaseClass::OnCommand( "confirm" );
return;
}
BaseClass::OnCommand( command );
}
virtual const char *GetResFile() OVERRIDE
{
return "Resource/UI/SupportNotificationDialog.res";
}
private:
// Associated notification to clear
int m_iNotificationID;
CTFGenericConfirmDialog *m_pConfirmDialog;
};
///
/// The notification class
///
CClientNotification::CClientNotification()
{
m_pText = NULL;
m_flExpireTime = CRTime::RTime32TimeCur();
m_ulNotificationID = 0;
m_unAccountID = 0;
m_bSupportMessage = false;
}
CClientNotification::~CClientNotification()
{}
void CClientNotification::Update( const CTFNotification* notification )
{
// Custom type handling. For now only support message does anything special.
m_bSupportMessage = false;
switch ( notification->Obj().type() )
{
case CMsgGCNotification_NotificationType_NOTIFICATION_REPORTED_PLAYER_BANNED:
case CMsgGCNotification_NotificationType_NOTIFICATION_CUSTOM_STRING:
case CMsgGCNotification_NotificationType_NOTIFICATION_MM_BAN_DUE_TO_EXCESSIVE_REPORTS:
case CMsgGCNotification_NotificationType_NOTIFICATION_REPORTED_PLAYER_WAS_BANNED:
// All identical.
//
// Really, the other types could be used to avoid having to send a localization string down? Otherwise
// they're all just redundant with CUSTOM_STRING for now.
break;
case CMsgGCNotification_NotificationType_NOTIFICATION_SUPPORT_MESSAGE:
m_bSupportMessage = true;
break;
default:
Assert( !"Unhandled enum value" );
}
m_pText = NULL;
m_strText = notification->Obj().notification_string().c_str();
if ( m_bSupportMessage )
{
// Use generic notification, save actual notification contents for dialog
m_pText = "#TF_Support_Message_Notification";
}
else
{
// Just use our message
m_pText = m_strText.Get();
}
// 0 -> does not expire
RTime32 rtExpire = notification->Obj().expiration_time();
m_flExpireTime = rtExpire > 0 ? (float)rtExpire : FLT_MAX;
m_ulNotificationID = notification->Obj().notification_id();
m_unAccountID = notification->Obj().account_id();
}
void CClientNotification::GCAcknowledge() {
GTFGCClientSystem()->AcknowledgeNotification( m_unAccountID, m_ulNotificationID );
}
void CClientNotification::Deleted()
{
if ( m_bSupportMessage )
{
AssertMsg( !m_bSupportMessage,
"Support messages should only be able to be triggered, not deleted" );
return;
}
GCAcknowledge();
}
void CClientNotification::Expired()
{
// No action, we don't want de-sync'd client clock to acknowledge these incorrectly, GC will expire them on its end.
}
CClientNotification::EType CClientNotification::NotificationType()
{
// Support messages are "must trigger" type -- no delete action, user must click "view"
if ( m_bSupportMessage )
{
return eType_MustTrigger;
}
return eType_Basic;
}
bool CClientNotification::BHighPriority()
{
return m_bSupportMessage;
}
void CClientNotification::Trigger()
{
if ( !m_bSupportMessage )
{
AssertMsg( m_bSupportMessage,
"Don't expect to be trigger-able when not in support message mode" );
return;
}
CTFSupportNotificationDialog *pDialog = vgui::SETUP_PANEL( new CTFSupportNotificationDialog( GetID(), m_strText.Get() ) );
pDialog->Show();
}
void CClientNotification::OnDialogAcknowledged()
{
if ( !m_bSupportMessage )
{
AssertMsg( m_bSupportMessage,
"Don't expect to be getting callbacks from the support message dialog when not in support message mode" );
return;
}
GCAcknowledge();
MarkForDeletion();
}
//-----------------------------------------------------------------------------
// CAutobalanceVolunteerNotification
//-----------------------------------------------------------------------------
void CAutobalanceVolunteerNotification::SendResponse( bool bResponse )
{
KeyValues *kv = new KeyValues( "AutoBalanceVolunteerReply" );
kv->SetBool( "response", bResponse );
engine->ServerCmdKeyValues( kv );
MarkForDeletion();
}