Skip to content

Commit

Permalink
Derive from the base class
Browse files Browse the repository at this point in the history
  • Loading branch information
Deathreus committed Nov 21, 2020
1 parent 60cf770 commit 807b24e
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 82 deletions.
132 changes: 69 additions & 63 deletions src/game/client/tf/tf_presence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//=====================================================================================//

#include "cbase.h"
#include "discord.h"
#include "tf_presence.h"
#include "c_team_objectiveresource.h"
#include "tf_gamerules.h"
Expand All @@ -21,15 +22,12 @@
#include "steam/isteamfriends.h"
#include "steam/steam_api.h"
#include "tier0/icommandline.h"
#include "discord.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

// Global singleton
static CTFPresence s_presence;
static CTFDiscordPresence s_drp;
CTFDiscordPresence *rpc = &s_drp;

struct s_MapName
{
Expand Down Expand Up @@ -100,9 +98,6 @@ static s_PresenceTranslation s_PresenceValues[] = {
//-----------------------------------------------------------------------------
// Discord RPC
//-----------------------------------------------------------------------------
ConVar cl_discord_appid( "cl_discord_appid", "451227888230858752", FCVAR_DEVELOPMENTONLY | FCVAR_PROTECTED, "This is for your Client ID for Discord Applications and is unique per sourcemod." );
ConVar cl_discord_presence_enabled( "cl_discord_presence_enabled", "1", FCVAR_ARCHIVE | FCVAR_NOT_CONNECTED );

struct DRPClassImages_t
{
const char *redTeamImage;
Expand Down Expand Up @@ -574,19 +569,19 @@ void CTFPresence::UploadStats()

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static CTFDiscordPresence s_drp;


discord::Core *CTFDiscordPresence::m_pCore{};
discord::Activity CTFDiscordPresence::m_Activity{};
discord::User CTFDiscordPresence::m_CurrentUser{};

CTFDiscordPresence::CTFDiscordPresence()
: BaseClass( "TFDiscordPresence" )
{
Q_memset( m_szMapName, 0, sizeof( m_szMapName ) );
VCRHook_Time( &m_iCreationTimestamp );

ListenForGameEvent( "server_spawn" );

rpc = this;
}

//-----------------------------------------------------------------------------
Expand All @@ -611,7 +606,7 @@ void CTFDiscordPresence::FireGameEvent( IGameEvent *event )
{
CSteamID steamID{};
if ( C_BasePlayer::GetLocalPlayer()->GetSteamID( &steamID ) )
Q_snprintf( m_szSteamID, 65, "%d", steamID.ConvertToUint64() );
V_sprintf_safe( m_szSteamID, "%llu", steamID.ConvertToUint64() );

m_Activity.GetSecrets().SetJoin( m_szServerInfo );
m_Activity.GetSecrets().SetMatch( m_szSteamID );
Expand Down Expand Up @@ -666,20 +661,26 @@ void CTFDiscordPresence::FireGameEvent( IGameEvent *event )
//-----------------------------------------------------------------------------
bool CTFDiscordPresence::Init( void )
{
if ( !cl_discord_presence_enabled.GetBool() )
return true;
ListenForGameEvent( "localplayer_changeteam" );
ListenForGameEvent( "localplayer_changeclass" );
ListenForGameEvent( "player_death" );
ListenForGameEvent( "player_spawn" );
ListenForGameEvent( "player_connect_client" );
ListenForGameEvent( "player_disconnect" );
ListenForGameEvent( "client_fullconnect" );
ListenForGameEvent( "client_disconnect" );

auto result = discord::Core::Create( V_atoi64( cl_discord_appid.GetString() ), DiscordCreateFlags_NoRequireDiscord, &m_pCore );
if ( result != discord::Result::Ok )
return true;
m_updateThrottle.Start( 30.0f );

// Work around for contained pointers being garbage initialized,
// zero out memory *after* core is created, and offset past the inner core pointer
//
// This is dumb, and it should feel bad for itself
Q_memset( (void *)( (intp)m_pCore + sizeof(IDiscordCore *) ), 0, sizeof(discord::Core) - sizeof(IDiscordCore *) );
return BaseClass::Init();
}

m_pCore->SetLogHook(
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CTFDiscordPresence::InitPresence( void )
{
g_pDiscord->SetLogHook(
#ifdef DEBUG
discord::LogLevel::Debug,
#else
Expand All @@ -689,25 +690,16 @@ bool CTFDiscordPresence::Init( void )
);

Q_memset( &m_CurrentUser, 0, sizeof( discord::User ) );
m_pCore->UserManager().OnCurrentUserUpdate.Connect( &OnReady );
g_pDiscord->UserManager().OnCurrentUserUpdate.Connect( &OnReady );

char command[512];
V_snprintf( command, sizeof( command ), "%s -game \"%s\" -novid -steam", CommandLine()->GetParm( 0 ), CommandLine()->ParmValue( "-game" ) );
m_pCore->ActivityManager().RegisterCommand( command );
//m_pCore->ActivityManager().RegisterSteam( engine->GetAppID() );

m_pCore->ActivityManager().OnActivityJoin.Connect( &OnJoinedGame );
m_pCore->ActivityManager().OnActivityJoinRequest.Connect( &OnJoinRequested );
m_pCore->ActivityManager().OnActivitySpectate.Connect( &OnSpectateGame );
g_pDiscord->ActivityManager().RegisterCommand( command );
//discord->ActivityManager().RegisterSteam( engine->GetAppID() );

ListenForGameEvent( "localplayer_changeteam" );
ListenForGameEvent( "localplayer_changeclass" );
ListenForGameEvent( "player_death" );
ListenForGameEvent( "player_spawn" );
ListenForGameEvent( "player_connect_client" );
ListenForGameEvent( "player_disconnect" );
ListenForGameEvent( "client_fullconnect" );
ListenForGameEvent( "client_disconnect" );
g_pDiscord->ActivityManager().OnActivityJoin.Connect( &OnJoinedGame );
g_pDiscord->ActivityManager().OnActivityJoinRequest.Connect( &OnJoinRequested );
g_pDiscord->ActivityManager().OnActivitySpectate.Connect( &OnSpectateGame );

return true;
}
Expand All @@ -717,45 +709,36 @@ bool CTFDiscordPresence::Init( void )
//-----------------------------------------------------------------------------
void CTFDiscordPresence::Shutdown( void )
{
Assert( rpc == this );
rpc = NULL;

Q_memset( &m_Activity, 0, sizeof( discord::Activity ) );
Q_memset( &m_CurrentUser, 0, sizeof( discord::User ) );
if ( m_pCore ) delete m_pCore;

if ( steamapicontext->SteamFriends() )
steamapicontext->SteamFriends()->ClearRichPresence();
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFDiscordPresence::Update( float frametime )
{
UpdatePresence();
Assert( rpc == this );
rpc = NULL;

if ( gpGlobals->tickcount % 2 )
m_pCore->RunCallbacks();
BaseClass::Shutdown();
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFDiscordPresence::OnReady()
{
extern ConVar cl_discord_presence_enabled;
if ( !cl_discord_presence_enabled.GetBool() )
{
if ( m_pCore )
delete m_pCore;
if ( g_pDiscord )
delete g_pDiscord;

if ( steamapicontext->SteamFriends() )
steamapicontext->SteamFriends()->ClearRichPresence();

return;
}

m_pCore->UserManager().GetCurrentUser( &m_CurrentUser );
g_pDiscord->UserManager().GetCurrentUser( &m_CurrentUser );

ConColorMsg( Color( 114, 137, 218, 255 ), "[DRP] Ready!\n" );
ConColorMsg( Color( 114, 137, 218, 255 ), "[DRP] User %s#%s - %lld\n", m_CurrentUser.GetUsername(), m_CurrentUser.GetDiscriminator(), m_CurrentUser.GetId() );
Expand Down Expand Up @@ -785,13 +768,13 @@ void CTFDiscordPresence::OnSpectateGame( const char *spectateSecret )
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFDiscordPresence::OnJoinRequested( const discord::User &joinRequester )
void CTFDiscordPresence::OnJoinRequested( discord::User const &joinRequester )
{
// TODO: Popup dialog
ConColorMsg( Color( 114, 137, 218, 255 ), "[DRP] Join Request: %s#%s\n", joinRequester.GetUsername(), joinRequester.GetDiscriminator() );
ConColorMsg( Color( 114, 137, 218, 255 ), "[Rich Presence] Join Request Accepted\n" );

m_pCore->ActivityManager().SendRequestReply( joinRequester.GetId(), discord::ActivityJoinRequestReply::Yes, [ ] ( discord::Result result ) {} );
g_pDiscord->ActivityManager().SendRequestReply( joinRequester.GetId(), discord::ActivityJoinRequestReply::Yes, [ ] ( discord::Result result ) {} );
}

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -829,21 +812,20 @@ void CTFDiscordPresence::LevelInitPostEntity( void )
Q_memset( &m_Activity, 0, sizeof( discord::Activity ) );

char buffer[64];
Q_snprintf( buffer, sizeof( buffer ), "#TF_Map_%s", m_szMapName );
Q_snprintf( buffer, sizeof( buffer ), "#TF_Map_%s", GetLevelName() );
wchar *mapName = g_pVGuiLocalize->Find( buffer );
if ( mapName ) // We assume official maps to have a translation, and we only have images of official maps
{
g_pVGuiLocalize->ConvertUnicodeToANSI( mapName, buffer, sizeof( buffer ) );
Q_snprintf( m_szGameState, sizeof( m_szGameState ), "Map: %s", buffer );
m_Activity.GetAssets().SetLargeImage( m_szMapName );
m_Activity.GetAssets().SetLargeImage( GetLevelName() );
}
else
{
Q_snprintf( m_szGameState, sizeof( m_szGameState ), "Map: %s", m_szMapName );
Q_snprintf( szGameState, sizeof( szGameState ), "Map: %s", GetLevelName() );
m_Activity.GetAssets().SetLargeImage( "default" );
}


if ( TFGameRules() )
{
wchar *gameType = g_pVGuiLocalize->Find( g_aGameTypeNames[ TFGameRules()->GetGameType() ] );
Expand All @@ -865,10 +847,10 @@ void CTFDiscordPresence::LevelInitPostEntity( void )
steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group", NULL );
steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group_size", NULL );
steamapicontext->SteamFriends()->SetRichPresence( "status", m_szHostName );
steamapicontext->SteamFriends()->SetRichPresence( "steam_display", m_szMapName );
steamapicontext->SteamFriends()->SetRichPresence( "steam_display", GetLevelName() );
}

m_pCore->ActivityManager().UpdateActivity( m_Activity, &OnActivityUpdate );
g_pDiscord->ActivityManager().UpdateActivity( m_Activity, &OnActivityUpdate );
}

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -898,7 +880,31 @@ void CTFDiscordPresence::ResetPresence( void )
m_Activity.SetDetails( "Main Menu" );
m_Activity.GetAssets().SetLargeImage( "tf2v_drp_logo" );
m_Activity.GetTimestamps().SetStart( m_iCreationTimestamp );
m_pCore->ActivityManager().UpdateActivity( m_Activity, &OnActivityUpdate );
g_pDiscord->ActivityManager().UpdateActivity( m_Activity, &OnActivityUpdate );
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
char const *CTFDiscordPresence::GetMatchSecret( void ) const
{
return nullptr;
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
char const *CTFDiscordPresence::GetJoinSecret( void ) const
{
return nullptr;
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
char const *CTFDiscordPresence::GetSpectateSecret( void ) const
{
return nullptr;
}

//-----------------------------------------------------------------------------
Expand All @@ -909,7 +915,7 @@ void CTFDiscordPresence::UpdatePresence( bool bForce, bool bIsDead )
if ( !m_updateThrottle.IsElapsed() && !bForce )
return;

m_updateThrottle.Start( 8.0f );
m_updateThrottle.Start( 30.0f );

C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pLocalPlayer )
Expand Down Expand Up @@ -937,5 +943,5 @@ void CTFDiscordPresence::UpdatePresence( bool bForce, bool bIsDead )
break;
}

m_pCore->ActivityManager().UpdateActivity( m_Activity, &OnActivityUpdate );
g_pDiscord->ActivityManager().UpdateActivity( m_Activity, &OnActivityUpdate );
}
31 changes: 12 additions & 19 deletions src/game/client/tf/tf_presence.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "GameEventListener.h"
#include "basepresence.h"
#include "basediscordpresence.h"
#include "hl2orange.spa.h"

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -44,19 +45,10 @@ class CTFPresence : public CBasePresence, public CGameEventListener

};

namespace discord
{
class Core;
class Activity;
class User;
enum class LogLevel;
enum class Result;
}
#define DISCORD_FIELD_MAXLEN 128

class CTFDiscordPresence : public CAutoGameSystemPerFrame, public CGameEventListener

class CTFDiscordPresence : public CBaseDiscordPresence, public CGameEventListener
{
DECLARE_CLASS_GAMEROOT( CTFDiscordPresence, CAutoGameSystemPerFrame );
DECLARE_CLASS_GAMEROOT( CTFDiscordPresence, CBaseDiscordPresence );
public:

CTFDiscordPresence();
Expand All @@ -66,16 +58,20 @@ class CTFDiscordPresence : public CAutoGameSystemPerFrame, public CGameEventList

virtual bool Init( void );
virtual void Shutdown( void );
virtual void Update( float frametime );
virtual void LevelInitPostEntity( void );
virtual void LevelShutdownPreEntity( void );

bool InitPresence( void );
void ResetPresence( void );
void UpdatePresence( bool bForce = false, bool bIsDead = false );
void SetLevelName( char const *pMapName ) { Q_strncpy( m_szMapName, pMapName, MAX_MAP_NAME ); }
void UpdatePresence( void ) { UpdatePresence( false, false ); }
char const* GetMatchSecret( void ) const;
char const* GetJoinSecret( void ) const;
char const* GetSpectateSecret( void ) const;

private:
char m_szMapName[ MAX_MAP_NAME ];
void UpdatePresence( bool bForce, bool bIsDead );
char const* GetEncryptionKey( void ) const { return "XwRJxjCc"; }

char m_szHostName[ DISCORD_FIELD_MAXLEN ];
char m_szServerInfo[ DISCORD_FIELD_MAXLEN ];
char m_szSteamID[ DISCORD_FIELD_MAXLEN ];
Expand All @@ -86,7 +82,6 @@ class CTFDiscordPresence : public CAutoGameSystemPerFrame, public CGameEventList
RealTimeCountdownTimer m_updateThrottle;
long m_iCreationTimestamp;

static discord::Core *m_pCore;
static discord::Activity m_Activity;
static discord::User m_CurrentUser;

Expand All @@ -98,6 +93,4 @@ class CTFDiscordPresence : public CAutoGameSystemPerFrame, public CGameEventList
static void OnActivityUpdate( discord::Result result );
};

extern CTFDiscordPresence *rpc;

#endif // TF_PRESENCE_H

0 comments on commit 807b24e

Please sign in to comment.