From c4192ed45d7cc48da79183bb826d194d0ec75de0 Mon Sep 17 00:00:00 2001 From: mukunda- Date: Mon, 29 Sep 2014 20:00:04 -0600 Subject: [PATCH] more done --- .gitignore | 1 + lib/steamid.php | 86 +++++++++++++++++++++++++++++++++-------------- test.php | 88 ++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 141 insertions(+), 34 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b8b4caf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +steamapikey \ No newline at end of file diff --git a/lib/steamid.php b/lib/steamid.php index dc7bd90..c9e887b 100644 --- a/lib/steamid.php +++ b/lib/steamid.php @@ -3,7 +3,6 @@ /*! * SteamID Parser * - * * Copyright 2014 Mukunda Johnson * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -69,6 +68,7 @@ class SteamID { // this is a raw steamid index that overflows // into negative bitspace. const FORMAT_RAW = 5; // Raw index. like 64-bit minus the base value. + const FORMAT_VANITY= 6; // Vanity URL name. Forward conversion only. const STEAMID64_BASE = '76561197960265728'; @@ -87,8 +87,8 @@ class SteamID { * @see http://steamcommunity.com/dev/apikey */ public static function SetSteamAPIKey( $key ) { - if( empty($key) ) $steam_api_key = FALSE; - $steam_api_key = $key; + if( empty($key) ) self::$steam_api_key = FALSE; + self::$steam_api_key = $key; } /** ----------------------------------------------------------------------- @@ -107,7 +107,7 @@ private function __construct( $raw ) { * @param string $url URL to request. * @return string|false Contents of result or FALSE if the request failed. */ - private function Curl( $url ) { + private static function Curl( $url ) { $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $url ); @@ -126,11 +126,15 @@ private function Curl( $url ) { * @param string $input Input to parse. * @param int $format Input formatting, see FORMAT_ constants. * Defaults to FORMAT_AUTO which detects the format. + * @param bool $resolve_vanity Detect and resolve vanity URLs. (only used + * with FORMAT_AUTO. * * @return SteamID|false SteamID instance or FALSE if the input is invalid * or unsupported. */ - public static function Parse( $input, $format = self::FORMAT_AUTO ) { + public static function Parse( $input, + $format = self::FORMAT_AUTO, + $resolve_vanity = false ) { switch( $format ) { case self::FORMAT_32BIT: @@ -211,6 +215,17 @@ public static function Parse( $input, $format = self::FORMAT_AUTO ) { // sanity range check if( bccomp( $input, self::MAX_VALUE, 0 ) > 0 ) return FALSE; return new self( $input ); + + case self::FORMAT_VANITY: + + // validate characters. + if( !preg_match( '/^[a-zA-Z0-9_-]{2,}$/', $input ) ) return FALSE; + + $result = self::ConvertVanityURL( $input ); + if( $result !== FALSE ) { + $result->formatted[ self::FORMAT_VANITY ] = $input; + return $result; + } } // Auto detect format: @@ -222,10 +237,6 @@ public static function Parse( $input, $format = self::FORMAT_AUTO ) { if( $result !== FALSE ) return $result; $result = self::Parse( $input, self::FORMAT_V3 ); if( $result !== FALSE ) return $result; - $result = self::Parse( $input, self::FORMAT_S32 ); - if( $result !== FALSE ) return $result; - $result = self::Parse( $input, self::FORMAT_RAW ); - if( $result !== FALSE ) return $result; if( preg_match( '/^(?:https?:\/\/)?(?:www.)?steamcommunity.com\/profiles\/([0-9]+)$/', @@ -234,15 +245,27 @@ public static function Parse( $input, $format = self::FORMAT_AUTO ) { if( $result !== FALSE ) return $result; } - // TODO find out what characters are valid in customURLs. - if( preg_match( - '/^(?:https?:\/\/)?(?:www.)?steamcommunity.com\/id\/([a-zA-Z0-9]+)$/', - $input, $matches ) ) { - - $result = self::ConvertVanityURL( $matches[1] ); + if( $resolve_vanity ) { + + // try the name directly + $result = self::Parse( $input, self::FORMAT_VANITY ); if( $result !== FALSE ) return $result; + + // try a full URL. + if( preg_match( + '/^(?:https?:\/\/)?(?:www.)?steamcommunity.com\/id\/([a-zA-Z0-9_-]{2,})$/', + $input, $matches ) ) { + + $result = self::ConvertVanityURL( $matches[1] ); + if( $result !== FALSE ) return $result; + } } + $result = self::Parse( $input, self::FORMAT_S32 ); + if( $result !== FALSE ) return $result; + $result = self::Parse( $input, self::FORMAT_RAW ); + if( $result !== FALSE ) return $result; + // unknown stem return FALSE; } @@ -258,10 +281,12 @@ public static function Parse( $input, $format = self::FORMAT_AUTO ) { public static function ConvertVanityURL( $vanity_url_name ) { if( empty($vanity_url_name) ) return FALSE; - if( $steam_api_key !== FALSE ) { - $result = Curl( - "http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key=$steam_api_key&vanityurl=$vanity_url_name" ); - if( $result === FALSE ) { + if( self::$steam_api_key !== FALSE ) { + $response = self::Curl( + "http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key=" + .self::$steam_api_key + ."&vanityurl=$vanity_url_name" ); + if( $response === FALSE ) { throw new SteamIDResolutionException( SteamIDResolutionException::CURL_FAILURE, 'CURL Request Failed.' ); @@ -272,7 +297,7 @@ public static function ConvertVanityURL( $vanity_url_name ) { SteamIDResolutionException::VANITYURL_FAILED, 'Steam failure.' ); } - + $response = json_decode( $response ); if( $response === FALSE ) { throw new SteamIDResolutionException( @@ -280,6 +305,8 @@ public static function ConvertVanityURL( $vanity_url_name ) { 'Steam failure.' ); } + $response = $response->response; + if( $response->success == 42 ) { throw new SteamIDResolutionException( SteamIDResolutionException::VANITYURL_NOTFOUND, @@ -299,8 +326,7 @@ public static function ConvertVanityURL( $vanity_url_name ) { } else { // fallback to xml parsing method. - $result = Curl( - "http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key=$steam_api_key&vanityurl=$vanity_url_name" ); + $result = self::Curl( "http://steamcommunity.com/id/$vanity_url_name?xml=1" ); if( $result === FALSE ) { throw new SteamIDResolutionException( SteamIDResolutionException::CURL_FAILURE, @@ -312,16 +338,26 @@ public static function ConvertVanityURL( $vanity_url_name ) { $indexes = array(); xml_parse_into_struct( $parser, $result, $values, $indexes ); xml_parser_free($parser); - $steamid = $indexes['STEAMID64']; - if( is_null( $steamid ) ) { + if( !isset( $indexes['STEAMID64'] ) || is_null( $indexes['STEAMID64'] ) ) { + + if( isset( $indexes['ERROR'] ) && + trim($values[ $indexes['ERROR'][0] ]['value']) == + 'The specified profile could not be found.' ) { + + throw new SteamIDResolutionException( + SteamIDResolutionException::VANITYURL_NOTFOUND, + 'Vanity URL doesn\'t exist.' ); + } + throw new SteamIDResolutionException( SteamIDResolutionException::VANITYURL_FAILED, 'Invalid Vanity URL or Steam failure.' ); } + $steamid = $indexes['STEAMID64']; $steamid = $values[ $steamid[0] ]['value']; } - return Parse( $steamid, self::FORMAT_64BIT ); + return self::Parse( $steamid, self::FORMAT_64BIT ); } /** ----------------------------------------------------------------------- diff --git a/test.php b/test.php index adcb860..f03793f 100644 --- a/test.php +++ b/test.php @@ -1,22 +1,24 @@ name\"" ); if( $test->Run() ) { - PrintLine( "Passed." ); + PrintLine( "--- Passed. ---" ); } else { PrintLine( "*** Failed! ***" ); } @@ -77,7 +80,7 @@ public static function Add( $name, $method ) { } } -//----------------------------------------------------------------------------- +// **************************************************************************** Tests::Add( "Conversion Test", function() { PrintSubTest( "32-bit detect" ); @@ -173,7 +176,7 @@ public static function Add( $name, $method ) { return TRUE; } ); - +// **************************************************************************** Tests::Add( "Large SteamID conversions", function () { for( $i = 0; $i < 255; $i++ ) { @@ -208,9 +211,76 @@ public static function Add( $name, $method ) { return TRUE; } ); - -bcscale( 32 ); +// **************************************************************************** +function VanityTest() { + + $buildname = function( $len ) { + $name = ""; + for( $i = 0; $i < $len; $i++ ) { + $name .= chr( mt_rand( 97, 122 ) ); + } + return $name; + }; + PrintSubTest( "simple/direct" ); + $steamid = SteamID::Parse( "prayspray", SteamID::FORMAT_AUTO, true ); + if( $steamid === FALSE ) return FALSE; + if( $steamid->Format( SteamID::FORMAT_32BIT ) != "STEAM_1:1:54499221" ) return FALSE; + + + for( $i = 0; $i < 20; $i++ ) { + $name = $buildname( $i ); + + try { + $steamid = SteamID::Parse( $name, SteamID::FORMAT_AUTO, true ); + } catch( SteamIDResolutionException $e ) { + switch( $e->reason ) { + case SteamIDResolutionException::UNKNOWN: + PrintSubTest( "failure: UNKNOWN. $name" ); + PrintSubTest( $e->getMessage() ); + return FALSE; + case SteamIDResolutionException::CURL_FAILURE: + PrintSubTest( "CURL_FAILURE $name" ); + PrintSubTest( $e->getMessage() ); + return FALSE; + case SteamIDResolutionException::VANITYURL_NOTFOUND: + // normal operation + continue; + case SteamIDResolutionException::VANITYURL_FAILED: + PrintSubTest( "STEAM FAILURE $name" ); + PrintSubTest( $e->getMessage() ); + return FALSE; + } + } + } + return TRUE; +} + +// **************************************************************************** +Tests::Add( "VanityURL Resolution via XML", function () { + + return VanityTest(); + +} ); + +// **************************************************************************** +Tests::Add( "VanityURL Resolution via Steam API", function () { + $steamapikey = file_get_contents( "steamapikey" ); + if($steamapikey=="") { + PrintSubTest( +"Steam API Key missing, please create a file called +\"steamapikey\" and set the contents to your Steam API key!" ); + PrintSubTest( "http://steamcommunity.com/dev/apikey" ); + return FALSE; + } + + SteamID::SetSteamAPIKey( $steamapikey ); + + return VanityTest(); +} ); + +// **************************************************************************** +bcscale( 32 ); Tests::Run(); ?> \ No newline at end of file