Skip to content
Snippets Groups Projects
mserv.c 4.49 KiB
Newer Older
Alam Ed Arias's avatar
Alam Ed Arias committed
// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
// Copyright (C) 1998-2000 by DooM Legacy Team.
// Copyright (C) 1999-2018 by Sonic Team Junior.
// Copyright (C)      2020 by James R.
Alam Ed Arias's avatar
Alam Ed Arias committed
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file  mserv.c
James R.'s avatar
James R. committed
/// \brief Commands used to communicate with the master server
Alam Ed Arias's avatar
Alam Ed Arias committed

#if !defined (UNDER_CE)
#include <time.h>
#endif

#include "doomstat.h"
#include "doomdef.h"
#include "command.h"
#include "mserv.h"
#include "m_menu.h"
#include "z_zone.h"
Alam Ed Arias's avatar
Alam Ed Arias committed

/* HTTP */
int  HMS_in_use (void);
int  HMS_fetch_rooms (int joining);
int  HMS_register (void);
void HMS_unlist (void);
int  HMS_update (void);
void HMS_list_servers (void);
int  HMS_fetch_servers (msg_server_t *list, int room);
int  HMS_compare_mod_version (char *buffer, size_t size_of_buffer);
Alam Ed Arias's avatar
Alam Ed Arias committed

static time_t MSLastPing;

#ifndef NONET
static void Command_Listserv_f(void);
#endif
static void MasterServer_OnChange(void);
static void ServerName_OnChange(void);

consvar_t cv_masterserver = {"masterserver", "https://mb.srb2.org/MS/0", CV_SAVE|CV_CALL, NULL, MasterServer_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_servername = {"servername", "SRB2Kart server", CV_SAVE|CV_CALL|CV_NOINIT, NULL, ServerName_OnChange, 0, NULL, NULL, 0, 0, NULL};
Alam Ed Arias's avatar
Alam Ed Arias committed

char *ms_API;
Alam Ed Arias's avatar
Alam Ed Arias committed
INT16 ms_RoomId = -1;

static enum { MSCS_NONE, MSCS_WAITING, MSCS_REGISTERED, MSCS_FAILED } con_state = MSCS_NONE;

UINT16 current_port = 0;

// Room list is an external variable now.
// Avoiding having to get info ten thousand times...
msg_rooms_t room_list[NUM_LIST_ROOMS+1]; // +1 for easy test

/** Adds variables and commands relating to the master server.
  *
  * \sa cv_masterserver, cv_servername,
  *     Command_Listserv_f
  */
void AddMServCommands(void)
{
#ifndef NONET
	CV_RegisterVar(&cv_masterserver);
	CV_RegisterVar(&cv_masterserver_debug);
Alam Ed Arias's avatar
Alam Ed Arias committed
	CV_RegisterVar(&cv_servername);
	COM_AddCommand("listserv", Command_Listserv_f);
#endif
}

static void WarnGUI (void)
Alam Ed Arias's avatar
Alam Ed Arias committed
{
	M_StartMessage(M_GetText("There was a problem connecting to\nthe Master Server\n\nCheck the console for details.\n"), NULL, MM_NOTHING);
Alam Ed Arias's avatar
Alam Ed Arias committed
}

#define NUM_LIST_SERVER MAXSERVERLIST
const msg_server_t *GetShortServersList(INT32 room)
{
	static msg_server_t server_list[NUM_LIST_SERVER+1]; // +1 for easy test

	if (HMS_fetch_servers(server_list, room))
		return server_list;
Alam Ed Arias's avatar
Alam Ed Arias committed
	{
		WarnGUI();
Alam Ed Arias's avatar
Alam Ed Arias committed
		return NULL;
	}
}

INT32 GetRoomsList(boolean hosting)
{
	if (HMS_fetch_rooms( ! hosting ))
Alam Ed Arias's avatar
Alam Ed Arias committed
		return 1;
	else
	{
		WarnGUI();
Alam Ed Arias's avatar
Alam Ed Arias committed
		return -1;
	}
}

#ifdef UPDATE_ALERT
const char *GetMODVersion(void)
{
	static char buffer[16];
	int c;
Alam Ed Arias's avatar
Alam Ed Arias committed

	c = HMS_compare_mod_version(buffer, sizeof buffer);
Alam Ed Arias's avatar
Alam Ed Arias committed

	if (c > 0)
		return buffer;
	else
		if (! c)
			WarnGUI();
Alam Ed Arias's avatar
Alam Ed Arias committed
		return NULL;
Alam Ed Arias's avatar
Alam Ed Arias committed
}

// Console only version of the above (used before game init)
void GetMODVersion_Console(void)
{
	char buffer[16];
Alam Ed Arias's avatar
Alam Ed Arias committed

	if (HMS_compare_mod_version(buffer, sizeof buffer) > 0)
		I_Error(UPDATE_ALERT_STRING_CONSOLE, VERSIONSTRING, buffer);
Alam Ed Arias's avatar
Alam Ed Arias committed
}
#endif

#ifndef NONET
/** Gets a list of game servers. Called from console.
  */
static void Command_Listserv_f(void)
{
	CONS_Printf(M_GetText("Retrieving server list...\n"));

	{
		HMS_list_servers();
Alam Ed Arias's avatar
Alam Ed Arias committed
	}
}
#endif

void RegisterServer(void)
{
	CONS_Printf(M_GetText("Registering this server on the Master Server...\n"));

	{
		if (HMS_register())
			con_state = MSCS_REGISTERED;
		else
			con_state = MSCS_FAILED;
static void UpdateServer(void)
{
	if (!( con_state == MSCS_REGISTERED && HMS_update() ))
Alam Ed Arias's avatar
Alam Ed Arias committed
	{
		con_state = MSCS_FAILED;
		RegisterServer();
Alam Ed Arias's avatar
Alam Ed Arias committed
	}

	time(&MSLastPing);
Alam Ed Arias's avatar
Alam Ed Arias committed
}

static inline void SendPingToMasterServer(void)
{
// Here, have a simpler MS Ping... - Cue
	if(time(NULL) > (MSLastPing+(60*2)) && con_state != MSCS_NONE)
	{
		UpdateServer();
Alam Ed Arias's avatar
Alam Ed Arias committed
	}
}

void UnregisterServer(void)
{
	if (con_state == MSCS_REGISTERED)
Alam Ed Arias's avatar
Alam Ed Arias committed
	{
		CONS_Printf(M_GetText("Removing this server from the Master Server...\n"));
Alam Ed Arias's avatar
Alam Ed Arias committed

		HMS_unlist();
	}

	con_state = MSCS_NONE;
Alam Ed Arias's avatar
Alam Ed Arias committed
}

void MasterClient_Ticker(void)
{
	if (server && ms_RoomId > 0)
		SendPingToMasterServer();
}

static void ServerName_OnChange(void)
{
	if (con_state == MSCS_REGISTERED)
		UpdateServer();
Alam Ed Arias's avatar
Alam Ed Arias committed
}

static void MasterServer_OnChange(void)
{
	boolean auto_register;
Alam Ed Arias's avatar
Alam Ed Arias committed

	auto_register = ( con_state != MSCS_NONE );
Alam Ed Arias's avatar
Alam Ed Arias committed

	if (ms_API)
Alam Ed Arias's avatar
Alam Ed Arias committed
	{
		UnregisterServer();
		Z_Free(ms_API);
Alam Ed Arias's avatar
Alam Ed Arias committed
	}

	ms_API = Z_StrDup(cv_masterserver.string);

	if (auto_register)
		RegisterServer();
Alam Ed Arias's avatar
Alam Ed Arias committed
}