#if defined _steamtools_included
#endinput
#endif
#define _steamtools_included

#define USE_CUSTOM_STEAMID -1

/**
 * Called after SteamTools has completely finished loading. 
 * No features are available before this point.
 *
 * @noreturn
 */
forward Steam_FullyLoaded();
forward Steam_Shutdown();


/**
 * Gets the current status of VAC on the server.
 *
 * @return A bool representing the current VAC status.
 */
native bool:Steam_IsVACEnabled();

/**
 * Gets the server's external IP address, as reported by Steam.
 *
 * @param octets Reference to an array to be filled with the octets of 
 *               the IP address.
 * 
 * @noreturn
 */
native Steam_GetPublicIP(octets[4]);


/**
 * Is fired when the Steam master servers report that your server is 
 * outdated
 *
 * @return Plugin_Continue to continue normal operation or Plugin_Handled 
 *         to block the regular console message.
 */
forward Action:Steam_RestartRequested();


/**
 * Requests a client's status in a Steam group.
 * Response is returned in Steam_GroupStatusResult forward.
 *
 * @param client         Client index.
 * @param groupAccountID 32-bit account ID of group.
 *
 * @return A bool representing whether or not the request was sent to 
 *         Steam.
 */
native bool:Steam_RequestGroupStatus(client, groupAccountID);

/**
 * Called when a response to a group status request is recieved.
 * This is called for all responses recieved, not just ones requested by 
 * your plugin.
 *
 * @param client         Client index.
 * @param groupAccountID 32-bit account ID of group. Make sure to check 
 *                       this agaist the ID you are expecting.
 * @param groupMember    Whether or not the client is a member in the 
 *                       specified group.
 * @param groupMember    Whether or not the client is an officer in the 
 *                       specified group.
 *
 * @noreturn
 */
forward Steam_GroupStatusResult(client, groupAccountID, bool:groupMember, bool:groupOfficer);


native Steam_RequestGameplayStats();
forward Steam_GameplayStats(rank, totalConnects, totalMinutesPlayed);


native Steam_RequestServerReputation();
forward Steam_Reputation(reputationScore, bool:banned, bannedIP, bannedPort, bannedGameID, banExpires);


/**
 * Gets the current Steam connection state, the forwards below fire 
 * whenever this changes.
 *
 * @return Steam connection state.
 */
native bool:Steam_IsConnected();

/**
 * Fired upon a successfull connection to Steam.
 * Is also fired for late-loaded plugins.
 *
 * @noreturn
 */
forward Steam_SteamServersConnected();

/**
 * Fired upon disconnection from Steam.
 * Is also fired for late-loaded plugins.
 *
 * For plugins loaded with the server, this will normally be fired right
 * after Steam_FullyLoaded, closly followed by Steam_SteamServersConnected 
 * if a successfull connection is established.
 *
 * @noreturn
 */
forward Steam_SteamServersDisconnected();

/**
 * Sets an entry in the server's list of rules. This list is used to 
 * build the response to the A2S_RULES query and is generally known as 
 * the list of public convars.
 *
 * @param key   Name of the key to set, is created if it does not already
 *              exist.
 * @param value Value of the key to set, the named key is removed if this 
 *              is blank.
 *
 * @noreturn
 */
native Steam_SetRule(const String:key[], const String:value[]);

/**
 * Clears the server's list of rules. This list is used to build the 
 * response to the A2S_RULES query and is generally known as the list of 
 * public convars.
 *
 * @noreturn
 */
native Steam_ClearRules();


native Steam_ForceHeartbeat();

#pragma deprecated No longer operational
native bool:Steam_AddMasterServer(const String:serverAddress[]);
#pragma deprecated No longer operational
native bool:Steam_RemoveMasterServer(const String:serverAddress[]);
#pragma deprecated No longer operational
native Steam_GetNumMasterServers();
#pragma deprecated No longer operational
native Steam_GetMasterServerAddress(server, String:serverAddress[], maxlength);

native Steam_SetGameDescription(String:gameDescription[]);

native Steam_RequestStats(client);
forward Steam_StatsReceived(client);
forward Steam_StatsUnloaded(client);
native Steam_GetStat(client, const String:statName[]);
native Float:Steam_GetStatFloat(client, const String:statName[]);
native bool:Steam_IsAchieved(client, const String:achievementName[]);


native Steam_GetNumClientSubscriptions(client);
native Steam_GetClientSubscription(client, index);

native Steam_GetNumClientDLCs(client);
native Steam_GetClientDLC(client, index);

stock bool:Steam_CheckClientSubscription(client, subid)
{
	new subCount = Steam_GetNumClientSubscriptions(client);
	for (new x = 0; x < subCount; x++)
	{
		if (Steam_GetClientSubscription(client, x) == subid)
		{
			return true;
		}
	}

	return false;
}

stock bool:Steam_CheckClientDLC(client, appid)
{
	new subCount = Steam_GetNumClientDLCs(client);
	for (new x = 0; x < subCount; x++)
	{
		if (Steam_GetClientDLC(client, x) == appid)
		{
			return true;
		}
	}

	return false;
}

native Steam_GetCSteamIDForClient(client, String:steamID[], maxlength);

native bool:Steam_SetCustomSteamID(const String:renderedID[]);
native bool:Steam_GetCustomSteamID(String:renderedID[], maxlength);

native Steam_RenderedIDToCSteamID(const String:renderedID[], String:steamID[], maxlength);
native Steam_CSteamIDToRenderedID(const String:steamID[], String:renderedID[], maxlength);

native Steam_GroupIDToCSteamID(groupID, String:steamID[], maxlength);
native Steam_CSteamIDToGroupID(const String:steamID[]);

enum HTTPRequestHandle
{
	INVALID_HTTP_HANDLE = 0,
};

enum HTTPMethod
{
	HTTPMethod_Invalid = 0,
	HTTPMethod_GET,
	HTTPMethod_HEAD,
	HTTPMethod_POST,
};

enum HTTPStatusCode
{
	HTTPStatusCode_Invalid =						0,

	// Informational codes
	HTTPStatusCode_Continue =						100,
	HTTPStatusCode_SwitchingProtocols =				101,

	// Success codes
	HTTPStatusCode_OK =								200,
	HTTPStatusCode_Created =						201,
	HTTPStatusCode_Accepted =						202,
	HTTPStatusCode_NonAuthoritative =				203,
	HTTPStatusCode_NoContent =						204,
	HTTPStatusCode_ResetContent =					205,
	HTTPStatusCode_PartialContent =					206,

	// Redirection codes
	HTTPStatusCode_MultipleChoices =				300,
	HTTPStatusCode_MovedPermanently =				301,
	HTTPStatusCode_Found =							302,
	HTTPStatusCode_SeeOther =						303,
	HTTPStatusCode_NotModified =					304,
	HTTPStatusCode_UseProxy =						305,
	HTTPStatusCode_TemporaryRedirect =				307,

	// Error codes
	HTTPStatusCode_BadRequest =						400,
	HTTPStatusCode_Unauthorized =					401,
	HTTPStatusCode_PaymentRequired =				402,
	HTTPStatusCode_Forbidden =						403,
	HTTPStatusCode_NotFound =						404,
	HTTPStatusCode_MethodNotAllowed =				405,
	HTTPStatusCode_NotAcceptable =					406,
	HTTPStatusCode_ProxyAuthRequired =				407,
	HTTPStatusCode_RequestTimeout =					408,
	HTTPStatusCode_Conflict =						409,
	HTTPStatusCode_Gone =							410,
	HTTPStatusCode_LengthRequired =					411,
	HTTPStatusCode_PreconditionFailed =				412,
	HTTPStatusCode_RequestEntityTooLarge =			413,
	HTTPStatusCode_RequestURITooLong =				414,
	HTTPStatusCode_UnsupportedMediaType =			415,
	HTTPStatusCode_RequestedRangeNotSatisfiable =	416,
	HTTPStatusCode_ExpectationFailed =				417,
	
	// Server error codes
	HTTPStatusCode_InternalServerError =			500,
	HTTPStatusCode_NotImplemented =					501,
	HTTPStatusCode_BadGateway =						502,
	HTTPStatusCode_ServiceUnavailable =				503,
	HTTPStatusCode_GatewayTimeout =					504,
	HTTPStatusCode_HTTPVersionNotSupported =		505,
};

funcenum HTTPRequestComplete
{
	public(HTTPRequestHandle:HTTPRequest, bool:requestSuccessful, HTTPStatusCode:statusCode),
	public(HTTPRequestHandle:HTTPRequest, bool:requestSuccessful, HTTPStatusCode:statusCode, any:contextData),
};

native HTTPRequestHandle:Steam_CreateHTTPRequest(HTTPMethod:HTTPRequestMethod, const String:absoluteURL[]);
native Steam_SetHTTPRequestNetworkActivityTimeout(HTTPRequestHandle:HTTPRequest, timeoutSeconds);
native Steam_SetHTTPRequestHeaderValue(HTTPRequestHandle:HTTPRequest, const String:headerName[], const String:headerValue[]);
native Steam_SetHTTPRequestGetOrPostParameter(HTTPRequestHandle:HTTPRequest, const String:paramName[], const String:paramValue[]);
native bool:Steam_SendHTTPRequest(HTTPRequestHandle:HTTPRequest, HTTPRequestComplete:callbackFunction, any:contextData = 0);
native Steam_DeferHTTPRequest(HTTPRequestHandle:HTTPRequest);
native Steam_PrioritizeHTTPRequest(HTTPRequestHandle:HTTPRequest);
native Steam_GetHTTPResponseHeaderSize(HTTPRequestHandle:HTTPRequest, const String:headerName[]);
native Steam_GetHTTPResponseHeaderValue(HTTPRequestHandle:HTTPRequest, const String:headerName[], String:headerValueBuffer[], bufferSize);
native Steam_GetHTTPResponseBodySize(HTTPRequestHandle:HTTPRequest);
native Steam_GetHTTPResponseBodyData(HTTPRequestHandle:HTTPRequest, String:bodyDataBuffer[], bufferSize);
native Steam_WriteHTTPResponseBody(HTTPRequestHandle:HTTPRequest, const String:filePath[]);
native Steam_ReleaseHTTPRequest(HTTPRequestHandle:HTTPRequest);
native Float:Steam_GetHTTPDownloadProgressPercent(HTTPRequestHandle:HTTPRequest);

public Extension:__ext_SteamTools = 
{
	name = "SteamTools",
	file = "steamtools.ext",
#if defined AUTOLOAD_EXTENSIONS
	autoload = 1,
#else
	autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
	required = 1,
#else
	required = 0,
#endif
}
