summaryrefslogtreecommitdiff
path: root/game/client/tf/c_tf_notification.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf/c_tf_notification.cpp')
-rw-r--r--game/client/tf/c_tf_notification.cpp237
1 files changed, 237 insertions, 0 deletions
diff --git a/game/client/tf/c_tf_notification.cpp b/game/client/tf/c_tf_notification.cpp
new file mode 100644
index 0000000..7c84ffc
--- /dev/null
+++ b/game/client/tf/c_tf_notification.cpp
@@ -0,0 +1,237 @@
+//========= 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();
+}