aboutsummaryrefslogtreecommitdiff
path: root/primedev/server/serverpresence.h
blob: 94ecfe6a023411f3133566af1c59ec791017ed76 (plain)
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
#pragma once
#include "core/convar/convar.h"

struct ServerPresence
{
public:
	int m_iPort;

	std::string m_sServerId;

	std::string m_sServerName;
	std::string m_sServerDesc;
	char m_Password[256]; // probably bigger than will ever be used in practice, lol

	char m_MapName[32];
	char m_PlaylistName[64];
	bool m_bIsSingleplayerServer; // whether the server started in sp

	int m_iPlayerCount;
	int m_iMaxPlayers;

	ServerPresence()
	{
		memset(this, 0, sizeof(this));
	}

	ServerPresence(const ServerPresence* obj)
	{
		m_iPort = obj->m_iPort;

		m_sServerId = obj->m_sServerId;

		m_sServerName = obj->m_sServerName;
		m_sServerDesc = obj->m_sServerDesc;
		memcpy(m_Password, obj->m_Password, sizeof(m_Password));

		memcpy(m_MapName, obj->m_MapName, sizeof(m_MapName));
		memcpy(m_PlaylistName, obj->m_PlaylistName, sizeof(m_PlaylistName));

		m_iPlayerCount = obj->m_iPlayerCount;
		m_iMaxPlayers = obj->m_iMaxPlayers;
	}
};

class ServerPresenceReporter
{
public:
	virtual void CreatePresence(const ServerPresence* /*pServerPresence*/) {}
	virtual void ReportPresence(const ServerPresence* /*pServerPresence*/) {}
	virtual void DestroyPresence(const ServerPresence* /*pServerPresence*/) {}
	virtual void RunFrame(double /*flCurrentTime*/, const ServerPresence* /*pServerPresence*/) {}
};

class ServerPresenceManager
{
private:
	ServerPresence m_ServerPresence;

	bool m_bHasPresence = false;
	bool m_bFirstPresenceUpdate = false;

	std::vector<ServerPresenceReporter*> m_vPresenceReporters;

	double m_flLastPresenceUpdate = 0;
	ConVar* Cvar_ns_server_presence_update_rate;

	ConVar* Cvar_ns_server_name;
	ConVar* Cvar_ns_server_desc;
	ConVar* Cvar_ns_server_password;

	ConVar* Cvar_ns_report_server_to_masterserver;
	ConVar* Cvar_ns_report_sp_server_to_masterserver;

public:
	void AddPresenceReporter(ServerPresenceReporter* reporter);

	void CreateConVars();

	void CreatePresence();
	void DestroyPresence();
	void RunFrame(double flCurrentTime);

	void SetPort(const int iPort);

	void SetName(const std::string sServerNameUnicode);
	void SetDescription(const std::string sServerDescUnicode);
	void SetPassword(const char* pPassword);

	void SetMap(const char* pMapName, bool isInitialising = false);
	void SetPlaylist(const char* pPlaylistName);
	void SetPlayerCount(const int iPlayerCount);
};

extern ServerPresenceManager* g_pServerPresence;