summaryrefslogtreecommitdiff
path: root/game/client/econ/client_community_market.cpp
blob: e1aa9ccef2b73c57d259a1e9dff18621feed60bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//========= Copyright Valve Corporation, All rights reserved. ============//

#include "cbase.h"
#include "econ_gcmessages.h"
#include "econ_item_system.h"
#include "econ_ui.h"
#include "store/store_panel.h"
#include "gc_clientsystem.h"
#include "client_community_market.h"

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
static const float s_fUpdateTimeInSeconds = 60.0f * 15.0f;

typedef CUtlMap< steam_market_gc_identifier_t, client_market_data_t, unsigned int >	ClientMarketDataMap_t;
static ClientMarketDataMap_t	s_mapClientMarketData;
static float					g_fClientMarketDataLastUpdateTime = -s_fUpdateTimeInSeconds;

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
static void ClientMarketData_Refresh()
{
	if ( !EconUI() || !EconUI()->GetStorePanel() )
		return;

	GCSDK::CProtoBufMsg<CMsgGCClientMarketDataRequest> msg( k_EMsgGCClientRequestMarketData );
	msg.Body().set_user_currency( EconUI()->GetStorePanel()->GetCurrency() );
	GCClientSystem()->BSendMessage( msg );

	g_fClientMarketDataLastUpdateTime = engine->Time();
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
const client_market_data_t *GetClientMarketData( const steam_market_gc_identifier_t& ident )
{
	// If our data is out of date, request fresh data from the GC. We don't need up-to-the-minute
	// numbers but we don't want to fall too far behind. THe GC itself doesn't update in realtime
	// so constantly querying for updates isn't really useful. We'll still use whatever data if any
	// we have for this call.
	if ( (engine->Time() - g_fClientMarketDataLastUpdateTime) >= s_fUpdateTimeInSeconds )
	{
		ClientMarketData_Refresh();
	}

	// Not having any data on this item isn't an error. We might be requesting something for an
	// unlistable item, or we might not have current information from the GC yet.
	if ( s_mapClientMarketData.Count() == 0 )
		return NULL;

	// Remap this index?
	steam_market_gc_identifier_t searchIdent = ident;
	searchIdent.m_unDefIndex = GetItemSchema()->GetCommunityMarketRemappedDefinitionIndex( ident.m_unDefIndex );

	ClientMarketDataMap_t::IndexType_t index = s_mapClientMarketData.Find( searchIdent );
	if ( index == s_mapClientMarketData.InvalidIndex() )
		return NULL;

	return &s_mapClientMarketData[index];
}
//-----------------------------------------------------------------------------
const client_market_data_t *GetClientMarketData( item_definition_index_t iItemDef, uint8 unQuality )
{
	steam_market_gc_identifier_t ident;
	ident.m_unDefIndex = iItemDef;
	ident.m_unQuality = unQuality;

	return GetClientMarketData( ident );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CGCClientRequestMarketDataResponse : public GCSDK::CGCClientJob
{
public:
	CGCClientRequestMarketDataResponse( GCSDK::CGCClient *pClient ) : GCSDK::CGCClientJob( pClient ) {}

	virtual bool BYieldingRunGCJob( GCSDK::IMsgNetPacket *pNetPacket )
	{
		GCSDK::CProtoBufMsg<CMsgGCClientMarketData> msg( pNetPacket );

		s_mapClientMarketData.RemoveAll();
		s_mapClientMarketData.SetLessFunc( DefLessFunc( ClientMarketDataMap_t::KeyType_t ) );

		for ( int i = 0; i < msg.Body().entries_size(); i++ )
		{
			const CMsgGCClientMarketDataEntry& entry = msg.Body().entries( i );

			steam_market_gc_identifier_t ident;
			ident.m_unDefIndex = entry.item_def_index();
			ident.m_unQuality = entry.item_quality();

			client_market_data_t data;
			data.m_unQuantityAvailable = entry.item_sell_listings();
			data.m_unLowestPrice = entry.price_in_local_currency();

			s_mapClientMarketData.Insert( ident, data );
		}

		return true;
	}

};
GC_REG_JOB( GCSDK::CGCClient, CGCClientRequestMarketDataResponse, "CGCClientRequestMarketDataResponse", k_EMsgGCClientRequestMarketDataResponse, GCSDK::k_EServerTypeGCClient );