//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Holds all the protocol bits and defines used in tracker networking
//
// $NoKeywords: $
//=============================================================================

#ifndef TRACKERPROTOCOL_H
#define TRACKERPROTOCOL_H
#ifdef _WIN32
#pragma once
#endif

// failed return versions of the messages are the TMSG_FAIL_OFFSET + 10000
#define TMSG_FAIL_OFFSET	10000

//-----------------------------------------------------------------------------
// Purpose: List of all the tracker messages used
//			msgID's are 32bits big
//-----------------------------------------------------------------------------
enum TrackerMsgID_t
{
	// generic messages
	TMSG_NONE = 0,		// no message id
	TMSG_ACK = 1,		// packet acknowledgement

	// server -> Client messages
	TSVC_BASE = 1000,

	TSVC_CHALLENGE,
	TSVC_LOGINOK,
	TSVC_LOGINFAIL,
	TSVC_DISCONNECT,
	TSVC_FRIENDS,
	TSVC_FRIENDUPDATE,
	TSVC_HEARTBEAT,
	TSVC_PINGACK,		// acknowledgement of TCLS_PING packet
	TSVC_FRIENDINFO,
	TSVC_USERVALID,
	TSVC_FRIENDSFOUND,
	TSVC_NOFRIENDS,
	TSVC_MESSAGE,				// message passed through from another client
	TSVC_GAMEINFO,				// information about a friends' game
	TSVC_AUTHREQUEST,			// a user requesting auth from the receiving user
	TSVC_CONNECTIONKEEPALIVE,	// information that an attemption connect is taking time, and the user should wait
	TSVC_ROUTEMESSAGEFAILED,	// chat message failed to be routed through the servers
	TSVC_REDIRECTLOGIN,			// tells the client to redirect their login attempt to a different server

	// Client -> server messages
	TCLS_BASE = 2000,
	
	TCLS_LOGIN,			// login message
	TCLS_RESPONSE,		// response to login challenge
	TCLS_PING,
	TCLS_FRIENDSEARCH,
	TCLS_HEARTBEAT,
	TCLS_AUTHUSER,
	TCLS_REQAUTH,
	TCLS_FRIENDINFO,	// friend info request
	TCLS_SETINFO,
	TCLS_ROUTETOFRIEND, // generic reroute of a message to a friend

	// Client -> Client messages
	TCL_BASE = 3000,
	TCL_MESSAGE,		// chat text message
	TCL_USERBLOCK,		// soon to be obselete
	TCL_ADDEDTOCHAT,
	TCL_CHATADDUSER,
	TCL_CHATUSERLEAVE,
	TCL_TYPINGMESSAGE,
    TCL_FRIENDNETMESSAGE,

	// server -> server messages
	TSV_BASE = 4000,

	TSV_WHOISPRIMARY,
	TSV_PRIMARYSRV,
	TSV_REQUESTINFO,
	TSV_TOPOLOGYINFO,
	TSV_REQUESTTOPOLOGYINFO,
	TSV_SERVERPING,
	TSV_MONITORINFO,
	TSV_LOCKUSERRANGE,
	TSV_UNLOCKUSERRANGE,
	TSV_REDIRECTTOUSER,
	TSV_FORCEDISCONNECTUSER,
	TSV_USERCHECKMESSAGES,
	TSV_USERAUTHREQUEST,
	TSV_USERSTATUSCHANGED,
	TSV_USERRELOADFRIENDSLIST,
	TSV_REGISTERSERVERINNETWORK,
	TSV_SERVERSHUTTINGDOWN,
	TSV_UPDATEACTIVEUSERRANGESTATUS,

	// game server -> Client
	TCLG_BASE = 5000,

	// common msg failed ID's
	TSVC_HEARTBEAT_FAIL = TSVC_HEARTBEAT + TMSG_FAIL_OFFSET,

	TCLS_HEARTBEAT_FAIL = TCLS_HEARTBEAT + TMSG_FAIL_OFFSET,

	TCL_MESSAGE_FAIL = TCL_MESSAGE + TMSG_FAIL_OFFSET,

};

//-----------------------------------------------------------------------------
// Purpose: List of reasons explaining to user why they have been disconnected
//			from the friends network
//-----------------------------------------------------------------------------
enum TrackerLogoffReason_t
{
	TRACKER_LOGOFF_NOREASON,

	// server reasons for disconnecting user
	TRACKER_LOGOFF_LOGGEDINELSEWHERE,	// user has logged into friends at a different location
	TRACKER_LOGOFF_SERVERWORK,			// server needs to do work (like lock the user range)
	TRACKER_LOGOFF_SERVERSHUTDOWN,		// server has been shutdown
	TRACKER_LOGOFF_TIMEDOUT,			// user hasn't heartbeat'd to server recently enough
	TRACKER_LOGOFF_REQUESTED,			// user has requested to logoff
	TRACKER_LOGOFF_FIREWALL,			// users' firewall won't allow enough packets through
	TRACKER_LOGOFF_NOTCONNECTED,		// user sent server a packet that implied they think they're logged in but they're not
	TRACKER_LOGOFF_INVALIDSTEAMTICKET,	// users steam ticket is invalid

	// client reasons for being disconnected
	TRACKER_LOGOFF_JOINEDGAME,			// user has logged off because they joined a game
	TRACKER_LOGOFF_CONNECTIONTIMEOUT,	// user connection has timed out
	TRACKER_LOGOFF_SERVERMESSAGEFAIL,   // a message to the server was not successfully transmitted

	TRACKER_LOGOFF_TOOMANYATTEMPTS,		// too many login attempts have been performed
	TRACKER_LOGOFF_OFFLINE,				// steam is in offline mode so don't try to connect
};


//-----------------------------------------------------------------------------
// Purpose: List of all the reasons a login attempt may fail
//-----------------------------------------------------------------------------
enum TrackerLoginFailReason_t
{
	TRACKER_LOGINFAIL_NOREASON			= 0,
	TRACKER_LOGINFAIL_NOSUCHUSER		= -2,
	TRACKER_LOGINFAIL_ALREADLOGGEDIN	= -3,
	TRACKER_LOGINFAIL_INVALIDSTEAMTICKET = -4,
	TRACKER_LOGINFAIL_BUILDOUTOFDATE	= -5,
	TRACKER_LOGINFAIL_PLATFORMOUTOFDATE	= -6,
};

//-----------------------------------------------------------------------------
// Purpose: Holds basic status for a friend
//-----------------------------------------------------------------------------
struct FriendStatus_t
{
	unsigned int friendID;
	int status;
	unsigned int sessionID;
	unsigned int ip;
	unsigned int port;
	unsigned int serverID;
};

#endif // TRACKERPROTOCOL_H