Guest User

RuneScape

a guest
Jan 29th, 2016
1,303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 43.38 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Provides an API for Runescape.
  4.  * @author Armin Supuk <[email protected]>
  5.  * @version 4.0.0
  6.  * @copyright 2013-2015 Armin Supuk
  7.  * @license GPLv3
  8.  * @license http://www.gnu.org/licenses/gpl-3.0 GNU Public License, version 3
  9.  * @todo add 3 beast methods
  10.  * @todo update quest method
  11.  */
  12. class Runescape_API {
  13.  
  14.     /**
  15.      * The URL to the Runescape hiscore
  16.      * @var string
  17.      */
  18.     public static $HISCORE_URL = "http://hiscore.runescape.com/index_lite.ws?player=%s";
  19.     /**
  20.      * The URL to the Runescape item API
  21.      * @var string
  22.      */
  23.     public static $ITEM_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/api/catalogue/detail.json?item=%d";
  24.     /**
  25.      * The URL to the Runescape item API for extended price information
  26.      * @var string
  27.      */
  28.     public static $ITEM_PRICE_URL = "http://services.runescape.com/m=itemdb_rs/api/graph/%d.json";
  29.     /**
  30.      * The URL to the Runescape item cataloque API
  31.      * @var string
  32.      */
  33.     public static $ITEM_CATALOQUE_URL = "http://services.runescape.com/m=itemdb_rs/api/catalogue/category.json?category=%d";
  34.     /**
  35.      * The URL to the Runescape items sorted by cataloque
  36.      * @var string
  37.      */
  38.     public static $CATALOQUE_ITEMS_URL = "http://services.runescape.com/m=itemdb_rs/api/catalogue/items.json?category=%d&alpha=%s&page=%d";
  39.     /**
  40.      * The URL to a RSS-Feed with the recent events from a player
  41.      * @var string
  42.      */
  43.     public static $RECENT_EVENTS_URL = "http://services.runescape.com/l=%d/m=adventurers-log/rssfeed?searchName=%s";
  44.     /**
  45.      * The URL to a player profil
  46.      * @var string
  47.      */
  48.     public static $PLAYER_PROFIL_URL = "http://services.runescape.com/m=adventurers-log/profile?searchName=%s";
  49.     /**
  50.      * The URL to a player bust avatar
  51.      * @var string
  52.      */
  53.     public static $PLAYER_AVATAR_BUST = "http://services.runescape.com/m=avatar-rs/%s/full.png";
  54.     /**
  55.      * The URL to a chat player avatar
  56.      * @var string
  57.      */
  58.     public static $PLAYER_AVATAR_CHAT = "http://services.runescape.com/m=avatar-rs/%s/chat.png";
  59.     /**
  60.      * The URL to a clan banner by a player name
  61.      * @var string
  62.      */
  63.     public static $PLAYER_CLAN_BANNER_URL = "http://services.runescape.com/m=avatar-rs/%s/ownclan.png";
  64.     /**
  65.      * The URL to a clan banner by the clan name
  66.      * @var string
  67.      */
  68.     public static $CLAN_BANNER_URL = "http://services.runescape.com/m=avatar-rs/%s/clanmotif.png";
  69.     /**
  70.      * The URL to large skill pictures from the adveture log
  71.      * @var string
  72.      */
  73.     public static $SKILL_PICTURE_ADVENTURE_URL = "http://www.runescape.com/l=1/img/adventurers-log/skills/%s.png";
  74.     /**
  75.      * The URL to the clan infos, like the description
  76.      * @var string
  77.      */
  78.     public static $CLAN_INFO_URL = "http://services.runescape.com/m=clan-home/clan/%s";
  79.     /**
  80.      * The URL to the clan stats, like the total level
  81.      * @var string
  82.      */
  83.     public static $CLAN_STATS_URL = "http://services.runescape.com/m=clan-hiscores/compare.ws?clanName=%s";
  84.     /**
  85.      * The URL to the clan mates
  86.      * @var string
  87.      */
  88.     public static $CLAN_MATES_URL = "http://services.runescape.com/m=clan-hiscores/members.ws?clanName=%s&ranking=%d&pageSize=%d";
  89.  
  90.     public static $CLAN_MEMBERS_URL = "http://services.runescape.com/m=clan-hiscores/members_lite.ws?clanName=%s";
  91.     /**
  92.      * The URL to the RSS-News
  93.      * @var string
  94.      */
  95.     public static $NEWS_URL = "http://services.runescape.com/l=%d/m=news/g=runescape/latest_news.rss";
  96.     /**
  97.      * The URL to the Oldschool Runescape hiscore
  98.      * @var string
  99.      */
  100.     public static $HISCORE_07_URL = "http://services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1=%s";
  101.  
  102.     public static $QUEST_URL = "http://services.runescape.com/m=adventurers-log/quests?searchName=%s";
  103.  
  104.     public static $USER_CLAN_RANK = "services.runescape.com/m=clan-hiscores/userClanRanking.json";
  105.  
  106.     public static $USER_CLAN_URL = "http://services.runescape.com/m=website-data/playerDetails.ws?names=[\"%s\"]";
  107.  
  108.     public static $EVENTS_URL = "services.runescape.com/l=%d/m=temp-hiscores/getHiscoreDetails.json?status=%s";
  109.  
  110.     public static $EVENTS_PLAYER_URL = "http://services.runescape.com/l=%d/m=temp-hiscores/getRankings.json?player=%s&status=%s";
  111.  
  112.     public static $BEAST_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/bestiary/beastData.json?beastid=%d";
  113.  
  114.     public static $BEAST_SEARCH_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/bestiary/beastSearch.json?term=%s";
  115.  
  116.     public static $BEAST_CATALOQUE_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/bestiary/bestiaryNames.json?letter=%s";
  117.  
  118.     public static $AREA_NAMES_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/bestiary/bestiary/areaNames.json";
  119.  
  120.     public static $AREA_BEASTS_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/bestiary/areaBeasts.json?identifier=%s";
  121.  
  122.     public static $SLAYER_BEASTS_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/bestiary/slayerBeasts.json?identifier=%d";
  123.  
  124.     public static $SLAYER_NAMES_URL = "http://services.runescape.com/l=%d/m=itemdb_rs/bestiary/bestiary/slayerCatNames.json";
  125.  
  126.     public static $SKILLS_NUMBER = 26;
  127.  
  128.     public static $ACTIVITIES_NUMBER = 24;
  129.  
  130.     private $cache;
  131.  
  132.  
  133.  
  134.     public function __construct($cache = TRUE){
  135.         $this->curl = curl_init();
  136.         curl_setopt($this->curl,CURLOPT_USERAGENT,'Runescape API/4.0.0 (https://github.com/ArminSupuk/Runescape-API)');
  137.         if($cache){
  138.             $this->cache = array();
  139.         }else{
  140.             $this->cache = FALSE;
  141.         }
  142.     }
  143.  
  144.     /**
  145.      * @param int $lang
  146.      * @return bool|mixed|string
  147.      * @since 4.0.0
  148.      * @api
  149.      */
  150.     public function getAreaNames($lang=0){
  151.         $lang = $this->langCode($lang);
  152.         $url = sprintf(self::$AREA_NAMES_URL,$lang);
  153.         if($result = $this->startRequest($url)){
  154.             $result = json_decode($result);
  155.             return $result;
  156.         }else{
  157.             return false;
  158.         }
  159.     }
  160.  
  161.     /**
  162.      * @param $area
  163.      * @param int $lang
  164.      * @return bool|mixed|string
  165.      * @since 4.0.0
  166.      * @api
  167.      */
  168.     public function getBeastsByArea($area,$lang=0){
  169.         $lang = $this->langCode($lang);
  170.         $url = sprintf(self::$AREA_BEASTS_URL,$lang,$area);
  171.         if($result = $this->startRequest($url)){
  172.             $result = json_decode($result);
  173.             return $result;
  174.         }else{
  175.             return false;
  176.         }
  177.     }
  178.  
  179.     /**
  180.      * @param $cat
  181.      * @param int $lang
  182.      * @return bool|mixed|string
  183.      * @since 4.0.0
  184.      * @api
  185.      */
  186.     public function getBeastsBySlayerCat($cat,$lang=0){
  187.         $lang = $this->langCode($lang);
  188.         $url = sprintf(self::$SLAYER_BEASTS_URL,$lang,$cat);
  189.         if($result = $this->startRequest($url)){
  190.             $result = json_decode($result);
  191.             return $result;
  192.         }else{
  193.             return false;
  194.         }
  195.     }
  196.  
  197.     /**
  198.      * @param int $lang
  199.      * @return bool|mixed|string
  200.      * @since 4.0.0
  201.      * @api
  202.      */
  203.     public function getSlayerCatNames($lang=0){
  204.         $lang = $this->langCode($lang);
  205.         $url = sprintf(self::$SLAYER_NAMES_URL,$lang);
  206.         if($result = $this->startRequest($url)){
  207.             $result = json_decode($result);
  208.             return $result;
  209.         }else{
  210.             return false;
  211.         }
  212.     }
  213.  
  214.     /**
  215.      * @param $id
  216.      * @param int $lang
  217.      * @return bool|mixed|string
  218.      * @since 4.0.0
  219.      * @api
  220.      */
  221.     public function getBeastById($id,$lang=0){
  222.         $lang = $this->langCode($lang);
  223.         $url = sprintf(self::$BEAST_URL,$lang,$id);
  224.         if($result = $this->startRequest($url)){
  225.             $result = json_decode($result);
  226.             return $result;
  227.         }else{
  228.             return false;
  229.         }
  230.     }
  231.  
  232.     /**
  233.      * @param $letter
  234.      * @param int $lang
  235.      * @return bool|mixed|string
  236.      * @since 4.0.0
  237.      * @api
  238.      */
  239.     public function getBeastCataloque($letter,$lang=0){
  240.         $lang = $this->langCode($lang);
  241.         $letter = strtoupper($letter);
  242.         $url = sprintf(self::$BEAST_CATALOQUE_URL,$lang,$letter);
  243.         if($result = $this->startRequest($url)){
  244.             $result = json_decode(utf8_encode($result));
  245.             return $result;
  246.         }else{
  247.             return false;
  248.         }
  249.     }
  250.  
  251.     /**
  252.      * @param $string
  253.      * @param int $lang
  254.      * @return bool|mixed|string
  255.      * @since 4.0.0
  256.      * @api
  257.      */
  258.     public function searchBeasts($string,$lang=0){
  259.         $lang = $this->langCode($lang);
  260.         $url = sprintf(self::$BEAST_SEARCH_URL,$lang,$string);
  261.         if($result = $this->startRequest($url)){
  262.             $result = json_decode($result);
  263.             if($result[0] == "none"){
  264.                 return false;
  265.             }
  266.             return $result;
  267.         }else{
  268.             return false;
  269.         }
  270.     }
  271.  
  272.     /**
  273.      * Get the clan by player
  274.      * @param string $playerName The name of the player in the game
  275.      * @return array|boolean result as array on success or FALSE if the player doesn't exist
  276.      * @since 4.0.0
  277.      * @api
  278.      */
  279.     public function getClanByPlayer($playerName){
  280.         $jquery = "jQuery000000000000000_0000000000";
  281.         if(isset($this->cache[$playerName]["userclan"])){
  282.             $result = $this->cache[$playerName]["userclan"];
  283.         }else{
  284.             $url = sprintf(self::$USER_CLAN_URL,$playerName);
  285.             $url .= "&callback=".$jquery;
  286.             if($result = $this->startRequest($url)){
  287.                 if($this->cache !== FALSE){
  288.                     if(!isset($this->cache[$playerName])){
  289.                         $this->cache[$playerName] = array();
  290.                     }
  291.                     $this->cache[$playerName]["userclan"] = $result;
  292.                 }
  293.             }
  294.         }
  295.         if($result){
  296.             $result = str_replace($jquery.'(',"",$result);
  297.             $result = str_replace(');',"",$result);
  298.             return json_decode($result);
  299.         }
  300.         return FALSE;
  301.     }
  302.  
  303.     /**
  304.      * Get the combat level (cb) by player
  305.      * @param string $playerName The name of the player in the game
  306.      * @return array|boolean result as array on success or FALSE if the player doesn't exist
  307.      * @since 4.0.0
  308.      * @api
  309.      */
  310.     public function getCombatLevel($playerName){
  311.         if(isset($this->cache[$playerName]["profilepage"])){
  312.             $result = $this->cache[$playerName]["profilepage"];
  313.         }else{
  314.             $url = sprintf(self::$PLAYER_PROFIL_URL,$playerName);
  315.             if($result = $this->startRequest($url)){
  316.                 if($this->cache !== FALSE){
  317.                     if(!isset($this->cache[$playerName])){
  318.                         $this->cache[$playerName] = array();
  319.                     }
  320.                     $this->cache[$playerName]["profilepage"] = $result;
  321.                 }
  322.             }
  323.         }
  324.         if($result){
  325.             preg_match_all('/<section class="stats-box stats-box--small stats-box--combat-level">(.*?)<\/section>/s', $result, $cb);
  326.             if(isset($cb[1][0])){
  327.                 preg_match_all('/<p class="stats-box__score-value">(?<level>[0-9]*)/s', $cb[1][0], $level);
  328.                 $level = $level["level"];
  329.                 return $level;
  330.             }else{
  331.                 return FALSE;
  332.             }
  333.         }
  334.         return FALSE;
  335.     }
  336.  
  337.     /**
  338.      * Get the hiscore information for a player
  339.      * @param string $playerName The name of the player in the game
  340.      * @return array|boolean result as array on success or FALSE if the player doesn't exist
  341.      * @since 1.0.0
  342.      * @api
  343.      */
  344.     public function getHiscore($playerName){
  345.         $url = sprintf(self::$HISCORE_URL,$playerName);
  346.         if($result = $this->startRequest($url)){
  347.             $result = explode("\n",$result);
  348.             $output = array();
  349.             for($x=0;$x < self::$SKILLS_NUMBER + self::$ACTIVITIES_NUMBER + 1;$x++){
  350.                 $result[$x] = explode(",",$result[$x]);
  351.                 if($x < self::$SKILLS_NUMBER + 1){
  352.                     $name = $this->skillID($x);
  353.                     if($result[$x][0] == "-1" OR $result[$x][1] == "1" OR $result[$x][2] == "-1"){
  354.                         unset($output[$name]);
  355.                     }else{
  356.                         $output[$name]["rank"] = $result[$x][0];
  357.                         $output[$name]["lvl"] = $result[$x][1];
  358.                         $output[$name]["totalxp"] = $result[$x][2];
  359.                     }
  360.                 }else{
  361.                     $name = $this->activityID($x-self::$SKILLS_NUMBER);
  362.                     if($result[$x][0] == "-1" OR $result[$x][1] == "-1"){
  363.                         unset($output[$name]);
  364.                     }else{
  365.                         $output[$name]["rank"] = $result[$x][0];
  366.                         $output[$name]["score"] = $result[$x][1];
  367.                     }
  368.                 }
  369.             }
  370.             return $output;
  371.         }else{
  372.             return false;
  373.         }
  374.     }
  375.  
  376.     /**
  377.      * Get the Oldschool Runescape hiscore information for a player
  378.      * @param string $playerName The name of the player in the game
  379.      * @return array|boolean result as array on success or FALSE if the player doesn't exist
  380.      * @since 3.2.0
  381.      * @api
  382.      */
  383.     public function getHiscore07($playerName){
  384.         $url = sprintf(self::$HISCORE_07_URL,$playerName);
  385.         $playerName = utf8_encode($playerName);
  386.         if($result = $this->startRequest($url)){
  387.             preg_match_all('/<table cellpadding="3" cellspacing="0" border=0>(.*?)<\/table>/s', $result, $matches);
  388.             preg_match_all('/<tr>(.*?)<\/tr>/s', $matches[0][0], $trs);
  389.             $output = array();
  390.             for($x = 3;$x < 27;$x++){
  391.                 preg_match_all('/<td align="left">(.*?)<\/td>/s', $trs[1][$x], $name);
  392.                 $name = strip_tags($name[0][0]);
  393.                 preg_match_all('/<td align="right">(.*?)<\/td>/s', $trs[1][$x], $lvlskillrank);
  394.                 if($x == 3){
  395.                     $y = 0;
  396.                 }else{
  397.                     $y = 1;
  398.                 }
  399.                 $rank = $lvlskillrank[1][$y];
  400.                 $lvl = $lvlskillrank[1][$y+1];
  401.                 $xp = $lvlskillrank[1][$y+2];
  402.                 $output[trim(strtolower($name))] = array(
  403.                     'rank' => $rank,
  404.                     'lvl' => $lvl,
  405.                     'xp' => $xp
  406.                 );
  407.             }
  408.             return $output;
  409.         }else{
  410.             return false;
  411.         }
  412.     }
  413.    
  414.     /**
  415.      * Check if a player is member or non-member (on failure it returns NULL) [doesn't work anymore]
  416.      * @param string $playerName The name of the player
  417.      * @return boolean|null TRUE if the player is member, FALSE for non-member and NULL if something goes wrong
  418.      * @since 3.0.0
  419.      * @deprecated 4.0.0
  420.      */
  421.     public function getMemberStatus($playerName){
  422.         return NULL;
  423.     }
  424.  
  425.     /**
  426.      * returns the quest information for a palyer
  427.      * @param string $playerName
  428.      * @return boolean|array
  429.      * @since 3.0.0
  430.      * @api
  431.      */
  432.     public function getQuests($playerName){
  433.         $url = sprintf(self::$QUEST_URL,$playerName);
  434.         return false;
  435.     }
  436.     /**
  437.      * Get the recent events of a player by his name
  438.      * @param string $playerName The name of the player
  439.      * @param boolean $sort Filter the information of the 50 items in groups and extract important data
  440.      * @param string|int $lang The language, if this isn't english the $sort parameter won't work
  441.      * @return array|boolean result as array on success or FALSE on failure
  442.      * @since 3.0.0
  443.      * @api
  444.      */
  445.     public function getRecentPlayerEvents($playerName,$sort = true,$lang = 0){
  446.         $lang = $this->langCode($lang);
  447.         $url = sprintf(self::$RECENT_EVENTS_URL,$lang,$playerName);
  448.         $events = array();
  449.         if($result = $this->startRequest($url)){
  450.             $rss = new SimpleXmlElement($result);
  451.             foreach($rss->channel->item as $event){
  452.                 $event = (array) $event;
  453.                 if($unix = strtotime($event["pubDate"])){
  454.                     $event["pubDate"] = $unix;
  455.                 }
  456.                 $event["description"] = trim($event["description"]);
  457.                 if($sort && $lang == 0){
  458.                     //stats
  459.                         //lvl
  460.                         if(preg_match("/Levelled/i",$event["title"]) || preg_match("/I levelled my|I am now level/i",$event["description"])){
  461.                             $event["skill"] = preg_replace("/Levelled|up|[. ]/i","",$event["title"]);
  462.                             $event["lvl"] = preg_replace("/[^0-9]/","",$event["description"]);
  463.                             $events["stats"]["lvl"][] = $event;
  464.                         }
  465.                         //all skills
  466.                         elseif(preg_match("/all skills over/i",$event["title"]) || preg_match("/in all skills/i",$event["description"])){
  467.                             $event["lvl"] = preg_replace("/[^0-9]/","",$event["description"]);
  468.                             $events["stats"]["allSkills"][] = $event;
  469.                         }
  470.                         //xp
  471.                         elseif(preg_match("/XP in/i",$event["title"]) || preg_match("/experience points/i",$event["description"])){
  472.                             $event["xp"] = preg_replace("/[^0-9]/","",$event["description"]);
  473.                             $event["skill"] = preg_replace("/[0-9]+XP in /","",$event["title"]);
  474.                             $events["stats"]["xp"][] = $event;
  475.                         }
  476.                         //qp
  477.                         elseif(preg_match("/Quest Points/i",$event["title"]) || preg_match("/QP milestone|Quest Points/i",$event["description"])){
  478.                             $event["qp"] = preg_replace("/[^0-9]/","",$event["title"]);
  479.                             $event["quest"] = preg_replace("/Completing | has given me enough Quest Points to pass the [0-9]+ QP milestone./","",$event["description"]);
  480.                             $events["stats"]["qp"][] = $event;
  481.                         }
  482.                         //songs
  483.                         elseif(preg_match("/songs unlocked/i",$event["title"]) && preg_match("/the last of which/i",$event["description"])){
  484.                             $event["total"] = preg_replace("/[^0-9]/","",$event["title"]);
  485.                             $event["song"] = preg_replace("/I have unlocked a total of[ 0-9]+songs, the last of which was[ ]+|[.]/","",$event["description"]);
  486.                             $events["stats"]["songs"][] = $event;
  487.                         }
  488.                     //quests
  489.                         //completed
  490.                         elseif(preg_match("/Quest complete/i",$event["title"]) || preg_match("/Quest Complete/i",$event["description"])){
  491.                             $event["quest"] = preg_replace("/Quest complete: /i","",$event["title"]);
  492.                             $events["quests"]["completed"][] = $event;
  493.                         }
  494.                     //monsters
  495.                         //killed
  496.                         elseif((preg_match("/I killed/i",$event["title"]) || preg_match("/I killed/i",$event["description"])) && !preg_match("/Daemonheim/i",$event["title"])){
  497.                             $event["monster"] = preg_replace("/I killed[ 0-9an]+|[.]/","",$event["title"]);
  498.                             if(preg_match("/[0-9]/",$event["title"])){
  499.                                 $event["total"] = preg_replace("/[^0-9]/","",$event["title"]);
  500.                             }
  501.                             $events["monsters"]["killed"][] = $event;
  502.                         }
  503.                         //defeated
  504.                         elseif((preg_match("/I defeated/i",$event["title"]) || preg_match("/I defeated/i",$event["description"])) && !preg_match("/Daemonheim/i",$event["title"])){
  505.                             $event["monster"] = preg_replace("/I defeated |[0-9]+[\w.]+|[.]/","",$event["title"]);
  506.                             $event["total"] = preg_replace("/[^0-9]/","",$event["title"]);
  507.                             $events["monsters"]["killed"][] = $event;
  508.                         }
  509.                         //drops
  510.                         elseif(preg_match("/I found/i",$event["title"]) || preg_match("/it dropped|After killing a/i",$event["description"])){
  511.                             preg_match("/I found (an|a|some){0,1} (?<drop>.*)/",$event["title"],$item);
  512.                             $event["item"] = $item["drop"];
  513.                             preg_match("/After killing a (?<monster>.*),/",$event["description"],$monster);
  514.                             $event["monster"] = $monster["monster"];
  515.                             $events["monsters"]["drops"][] = $event;
  516.                         }
  517.                     //daemonheim
  518.                         //killed
  519.                         elseif(preg_match("/boss monster/i",$event["title"]) && preg_match("/Daemonheim/i",$event["description"])){
  520.                             $event["monster"] = preg_replace("/I killed [an0-9]+ boss monster[s]?[ ]+called:[ ]+|[ ]+in Daemonheim./","",$event["description"]);
  521.                             if(preg_match("/monsters/",$event["title"])){
  522.                                 $event["monster"] = preg_split("/ , | and /",$event["monster"]);
  523.                                 $event["total"] = preg_replace("/[^0-9]/","",$event["title"]);
  524.                             }
  525.                             $events["daemonheim"]["killed"][] = $event;
  526.                         }
  527.                         //bought
  528.                         elseif(preg_match("/bought/i",$event["title"]) && preg_match("/dungeoneering tokens/i",$event["description"])){
  529.                             $event["item"] = preg_replace("/ bought./","",$event["title"]);
  530.                             $event["tokens"] = preg_replace("/[^0-9]/","",$event["description"]);
  531.                             $events["daemonheim"]["bought"][] = $event;
  532.                         }
  533.                         //floors
  534.                         elseif(preg_match("/Dungeon floor/i",$event["title"]) || preg_match("/I have breached floor/i",$event["description"])){
  535.                             $event["floor"] = preg_replace("/[^0-9]/","",$event["title"]);
  536.                             $events["daemonheim"]["floors"][] = $event;
  537.                         }
  538.                         //history
  539.                         elseif(preg_match("/history uncovered/i",$event["title"]) || preg_match("/uncovered volume/i",$event["description"])){
  540.                             $event["volume"] = preg_replace("/[^0-9]/","",$event["title"]);
  541.                             $events["daemonheim"]["history"][] = $event;
  542.                         }
  543.                     //minigames
  544.                         //treasureTrails
  545.                         elseif(preg_match("/treasure trail/i",$event["title"]) || preg_match("/treasure trail/i",$event["description"])){
  546.                             $event["difficulty"] = preg_replace("/ treasure trail[\w .]+/","",$event["title"]);
  547.                             $events["minigames"]["treasureTrails"][] = $event;
  548.                         }
  549.                         //fightKiln
  550.                         elseif(preg_match("/Fight Kiln/i",$event["title"]) || preg_match("/Fight Kiln/i",$event["description"])){
  551.                             $events["minigames"]["fightKiln"][] = $event;
  552.                         }
  553.                         //dominionTower
  554.                         elseif(preg_match("/Killed/i",$event["title"]) || preg_match("/Dominion Tower/i",$event["description"])){
  555.                             $events["minigames"]["dominionTower"][] = $event;
  556.                         }
  557.                         //charmSprites
  558.                         elseif(preg_match("/charm sprites/i",$event["title"]) || preg_match("/charm sprites/i",$event["description"])){
  559.                             $events["minigames"]["charmSprites"][] = $event;
  560.                         }
  561.                         //courtSummons
  562.                             //found
  563.                             elseif((preg_match("/Summoned for a case/i",$event["title"]) || preg_match("/court summons/i",$event["description"])) && !preg_match("/won/i",$event["description"])){
  564.                                 $event["case"] = preg_replace("/A court summons was dropped. The case is /","",$event["description"]);
  565.                                 $events["minigames"]["courtSummons"]["found"][] = $event;
  566.                             }
  567.                             //won
  568.                             elseif(preg_match("/Won a case/i",$event["title"]) || preg_match("/I won the case/i",$event["description"])){
  569.                                 $event["case"] = preg_replace("/After finding a court summons, I won the case of[ ]+|[.]/","",$event["description"]);
  570.                                 $events["minigames"]["courtSummons"]["won"][] = $event;
  571.                             }
  572.                         //challenges
  573.                             //found
  574.                             elseif(preg_match("/Challenged by/i",$event["title"]) || preg_match("/message was dropped/i",$event["description"])){
  575.                                 $event["champion"] = preg_replace("/Challenged by the[ ]+|[.]/","",$event["title"]);
  576.                                 $events["minigames"]["challenges"]["found"][] = $event;
  577.                             }
  578.                             //won
  579.                             elseif(preg_match("/Won a challenge/i",$event["title"]) || preg_match("/Won a challenge/i",$event["description"])){
  580.                                 $event["champion"] = preg_replace("/Won a challenge against the[ ]+|[.]/","",$event["description"]);
  581.                                 $events["minigames"]["challenges"]["won"][] = $event;
  582.                             }
  583.                     //others
  584.                     else{
  585.                         $events["others"][] = $event;
  586.                     }
  587.                 }else{
  588.                     $events[] = (array) $event;
  589.                 }
  590.             }
  591.             return $events;
  592.         }else{
  593.             return false;
  594.         }
  595.     }
  596.  
  597.     /**
  598.      * Get the item information
  599.      * @param int $itemID The unique id of the item
  600.      * @param string|int $lang [optional] The language in which the information should be
  601.      * @return array|boolean result as array on success or FALSE if the item doesn't exist
  602.      * @since 3.0.0
  603.      * @api
  604.      */
  605.     public function getItemInformation($itemID,$lang = 0){
  606.         $lang = $this->langCode($lang);
  607.         $url = sprintf(self::$ITEM_URL,$lang,$itemID);
  608.         if($result = $this->startRequest($url)){
  609.             $result = json_decode(utf8_encode($result),true);
  610.         }else{
  611.             return false;
  612.         }
  613.         return $result;
  614.     }
  615.  
  616.     /**
  617.      * Get the market information for an item
  618.      * @param int $itemID The unique id of the item
  619.      * @return array|boolean result as array on success or FALSE if the item doesn't exist
  620.      * @since 3.0.0
  621.      * @api
  622.      */
  623.     public function getPriceInformation($itemID){
  624.         $url = sprintf(self::$ITEM_PRICE_URL,$itemID);
  625.         if($result = $this->startRequest($url)){
  626.             $result = $this->utf8DecodeArray(json_decode(utf8_encode($result),true));
  627.         }else{
  628.             return false;
  629.         }
  630.         return $result;
  631.     }
  632.     /**
  633.      * Get the item cataloque information for a category
  634.      * @param int|string $categoryID The category id or the category name
  635.      * @param boolean $getItems If this is TRUE, it will return the item information for all items in the category
  636.      * @return array|boolean result as array on success
  637.      * @since 3.0.0
  638.      * @api
  639.      */
  640.     public function getItemCataloque($categoryID,$getItems = false){
  641.         $category = $this->itemCategoryID($categoryID);
  642.         $categoryID = $category["categoryID"];
  643.         $categoryName = $category["categoryName"];
  644.         $url = sprintf(self::$ITEM_CATALOQUE_URL,$categoryID);
  645.         $toalItems = 0;
  646.         if($result = $this->startRequest($url)){
  647.             $result = $this->utf8DecodeArray(json_decode(utf8_encode($result),true));
  648.             unset($result["types"]);
  649.             foreach($result["alpha"] as &$alpha){
  650.                 $alpha["total"] = $alpha["items"];
  651.                 $toalItems += $alpha["total"];
  652.                 if($getItems){
  653.                     if($alpha["total"] > 0){
  654.                         $alphaItems = $this->getItemsByCataloque($categoryID,$alpha["letter"],$alpha["total"]);
  655.                         $alpha["items"] = $alphaItems["items"];
  656.                     }else{
  657.                         $alpha["items"] = array();
  658.                     }
  659.                 }else{
  660.                     unset($alpha["items"]);
  661.                 }
  662.             }
  663.             $result["info"] = array("id" => $categoryID,"name" => $categoryName, "total" => $toalItems);
  664.             return $result;
  665.         }else{
  666.             return false;
  667.         }
  668.     }
  669.     /**
  670.      * Get the items from a category by name ($alpha)
  671.      * @param int|string $categoryID The category id or the category name
  672.      * @param string $alpha The name of the item, requires at minimum one letter
  673.      * @param int $limit The number of items
  674.      * @return array|boolean result as array on success
  675.      * @since 3.0.0
  676.      * @api
  677.      */
  678.     public function getItemsByCataloque($categoryID, $alpha, $limit = 12){
  679.         $category = $this->itemCategoryID($categoryID);
  680.         $categoryID = $category["categoryID"];
  681.         $categoryName = $category["categoryName"];
  682.         if($limit == "all"){
  683.             $limit = 10000;
  684.         }
  685.         $items = array();
  686.         $pages = ceil($limit/12);
  687.         for($x=1;$x <= $pages;$x++){
  688.             $url = sprintf(self::$CATALOQUE_ITEMS_URL,$categoryID,$alpha,$x);
  689.             if($result = $this->startRequest($url)){
  690.                 $result = $this->utf8DecodeArray(json_decode(utf8_encode($result),true));
  691.                 $totalItems = $result["total"];
  692.                 if(ceil($totalItems/12) < $pages){
  693.                     $pages = ceil($totalItems/12);
  694.                     $limit = $totalItems;
  695.                 }
  696.                 unset($result["total"]);
  697.                 $max = $limit % 12;
  698.                 foreach($result["items"] as $item){
  699.                     if($x = $pages && $max != 0){
  700.                         $items[] = $item;
  701.                         $max--;
  702.                     }elseif($x = $pages){
  703.                         break;
  704.                     }else{
  705.                         $items[] = $item;
  706.                     }
  707.                 }
  708.             }else{
  709.                 return false;
  710.             }
  711.         }
  712.         $result["info"] = array("id" => $categoryID,"name" => $categoryName,"total" => $totalItems);
  713.         $result["items"] = $items;
  714.         return $result;
  715.     }
  716.  
  717.     /**
  718.      * Get the player avatars, actually it returns just the URLs
  719.      * @param string $playerName
  720.      * @return array
  721.      * @since 3.0.0
  722.      * @api
  723.      */
  724.     public function getPlayerAvatars($playerName){
  725.         $output = array();
  726.         $output["full"] = sprintf(self::$PLAYER_AVATAR_BUST,$playerName);
  727.         $output["chat"] = sprintf(self::$PLAYER_AVATAR_CHAT,$playerName);
  728.         return $output;
  729.     }
  730.  
  731.     /**
  732.      * Get the news
  733.      * @param int|string $lang The language code
  734.      * @return boolean|array
  735.      * @since 3.1.0
  736.      * @api
  737.      */
  738.     public function getNews($lang = 0){
  739.         $lang = $this->langCode($lang);
  740.         $url = sprintf(self::$NEWS_URL,$lang);
  741.         if($result = $this->startRequest($url)){
  742.             $rss = simplexml_load_string($result);
  743.             $result = $rss->xpath("channel/item");
  744.             $result  = json_encode($result);
  745.             $result = json_decode($result, true);
  746.             foreach($result as &$item){
  747.                 $item["description"] = trim($item["description"]);
  748.             }
  749.             return $result;
  750.         }else{
  751.             return false;
  752.         }
  753.     }
  754.  
  755.     /**
  756.      * Returns all members of a given clan
  757.      * @param string $clanName The name of the clan.
  758.      * @return boolean|array
  759.      * @since 4.0.0
  760.      * @api
  761.      */
  762.     public function getClanMembers($clanName){
  763.         $url = sprintf(self::$CLAN_MEMBERS_URL,$clanName);
  764.         if($result = $this->startRequest($url)){
  765.             $result = utf8_encode($result);
  766.             $result = explode("\n",$result);
  767.             array_shift($result);
  768.             $output = array();
  769.             foreach($result as $member){
  770.                 $member = explode(",",$member);
  771.                 if(count($member) == 4){
  772.                     $output[] = array(
  773.                         "name" => $member[0],
  774.                         "rank" => $member[1],
  775.                         "xp" => $member[2],
  776.                         "kills" => $member[3]);
  777.                 }
  778.             }
  779.             return $output;
  780.         }else{
  781.             return false;
  782.         }
  783.     }
  784.  
  785.     /**
  786.      * @param string $status The status of the events: active (standard), closed, archived or future.
  787.      * @param string $lang
  788.      * @return array|bool
  789.      */
  790.     public function getEvents($status="active",$lang='0'){
  791.         $status = strtolower($status);
  792.         $url = sprintf(self::$EVENTS_URL,$lang,$status);
  793.         if($result = $this->startRequest($url)){
  794.             $result = json_decode($result);
  795.             return $result;
  796.         }else{
  797.             return false;
  798.         }
  799.     }
  800.  
  801.     /**
  802.      * @param $player
  803.      * @param string $status
  804.      * @return bool|mixed|string
  805.      */
  806.     public function getEventsByPlayer($player,$status="active",$lang='0'){
  807.         $status = strtolower($status);
  808.         $url = sprintf(self::$EVENTS_PLAYER_URL,$lang,$player,$status);
  809.         if($result = $this->startRequest($url)){
  810.             $result = json_decode($result);
  811.             return $result;
  812.         }else{
  813.             return false;
  814.         }
  815.     }
  816.  
  817.     /**
  818.      * Convert a skill id to the name
  819.      * @param int|string $skillID
  820.      * @return string The name of the skill
  821.      */
  822.     private function skillID($skillID){
  823.         switch($skillID){
  824.             case 0:$name = "overall";break;
  825.             case 1:$name = "attack";break;
  826.             case 2:$name = "defence";break;
  827.             case 3:$name = "strength";break;
  828.             case 4:$name = "constitution";break;
  829.             case 5:$name = "ranged";break;
  830.             case 6:$name = "prayer";break;
  831.             case 7:$name = "magic";break;
  832.             case 8:$name = "cooking";break;
  833.             case 9:$name = "woodcutting";break;
  834.             case 10:$name = "fletching";break;
  835.             case 11:$name = "fishing";break;
  836.             case 12:$name = "firemaking";break;
  837.             case 13:$name = "crafting";break;
  838.             case 14:$name = "smithing";break;
  839.             case 15:$name = "mining";break;
  840.             case 16:$name = "herblore";break;
  841.             case 17:$name = "agility";break;
  842.             case 18:$name = "thieving";break;
  843.             case 19:$name = "slayer";break;
  844.             case 20:$name = "farming";break;
  845.             case 21:$name = "runecrafting";break;
  846.             case 22:$name = "hunter";break;
  847.             case 23:$name = "construction";break;
  848.             case 24:$name = "summoning";break;
  849.             case 25:$name = "dungeoneering";break;
  850.             case 26:$name = "divination";break;
  851.             default:$name = "unknown";break;
  852.         }
  853.         return $name;
  854.     }
  855.     /**
  856.      * Convert a activity id to the name
  857.      * @param int|string $activityID
  858.      * @return string The name of the activity
  859.      */
  860.     private function activityID($activityID){
  861.         switch($activityID){
  862.             case 1:$name = "bountyHunters";break;
  863.             case 2:$name = "bountyHuntersRogues";break;
  864.             case 3:$name = "dominionTower";break;
  865.             case 4:$name = "theCrucible";break;
  866.             case 5:$name = "castlewarsGames";break;
  867.             case 6:$name = "baAttackers";break;
  868.             case 7:$name = "baDefenders";break;
  869.             case 8:$name = "baCollectors";break;
  870.             case 9:$name = "baHealers";break;
  871.             case 10:$name = "duelTournament";break;
  872.             case 11:$name = "mobilisingArmies";break;
  873.             case 12:$name = "conquest";break;
  874.             case 13:$name = "fistOfGuthix";break;
  875.             case 14:$name = "ggRessourceRace";break;
  876.             case 15:$name = "ggAthletics";break;
  877.             case 16:$name = "we2Alc";break;
  878.             case 17:$name = "we2Blc";break;
  879.             case 18:$name = "we2Apk";break;
  880.             case 19:$name = "we2Bpk";break;
  881.             case 20:$name = "hgl";break;
  882.             case 21:$name = "hrl";break;
  883.             case 22:$name = "cfb5ga";break;
  884.             case 23:$name = "af15Ct";break;
  885.             case 24:$name = "af15Rk";break;
  886.             default:$name = "unknown";break;
  887.         }
  888.         return $name;
  889.     }
  890.     /**
  891.      * Convert a category id or name to the id and name
  892.      * @param int|string $categoryID
  893.      * @return array The categoryID and the categoryName
  894.      */
  895.     private function itemCategoryID($categoryID){
  896.         switch($categoryID){
  897.             case "0":case "Miscellaneous":default:$categoryID = 0; $categoryName = "Miscellaneous"; break;
  898.             case "1":case "Ammo":$categoryID = 1; $categoryName = "Ammo"; break;
  899.             case "2":case "Arrows":$categoryID = 2; $categoryName = "Arrows"; break;
  900.             case "3":case "Bolts":$categoryID = 3; $categoryName = "Bolts"; break;
  901.             case "4":case "Construction materials":$categoryID = 4; $categoryName = "Construction materials"; break;
  902.             case "5":case "Construction projects":$categoryID = 5; $categoryName = "Construction projects"; break;
  903.             case "6":case "Cooking ingredients":$categoryID = 6; $categoryName = "Cooking ingredients"; break;
  904.             case "7":case "Costumes":$categoryID = 7; $categoryName = "Miscellaneous"; break;
  905.             case "8":case "Crafting materials":$categoryID = 8; $categoryName = "Crafting materials"; break;
  906.             case "9":case "Familiars":$categoryID = 9; $categoryName = "Familiars"; break;
  907.             case "10":case "Farming produce":$categoryID = 10; $categoryName = "Farming produce"; break;
  908.             case "11":case "Fletching materials":$categoryID = 11; $categoryName = "Fletching materials"; break;
  909.             case "12":case "Food and drink":$categoryID = 12; $categoryName = "Food and drink"; break;
  910.             case "13":case "Herblore materials":$categoryID = 13; $categoryName = "Herblore materials"; break;
  911.             case "14":case "Hunting equipment":$categoryID = 14; $categoryName = "Miscellaneous"; break;
  912.             case "15":case "Hunting produce":$categoryID = 15; $categoryName = "Hunting produce"; break;
  913.             case "16":case "Jewellery":$categoryID = 16; $categoryName = "Jewellery"; break;
  914.             case "17":case "Mage armour":$categoryID = 17; $categoryName = "Mage armour"; break;
  915.             case "18":case "Mage weapons":$categoryID = 18; $categoryName = "Mage weapons"; break;
  916.             case "19":case "Melee armour - low level":$categoryID = 19; $categoryName = "Melee armour - low level"; break;
  917.             case "20":case "Melee armour - mid level":$categoryID = 20; $categoryName = "Melee armour - mid level"; break;
  918.             case "21":case "Melee armour - high level":$categoryID = 21; $categoryName = "Melee armour - high level"; break;
  919.             case "22":case "Melee weapons - low level":$categoryID = 22; $categoryName = "Melee weapons - low level"; break;
  920.             case "23":case "Melee weapons - mid level":$categoryID = 23; $categoryName = "Melee weapons - mid level"; break;
  921.             case "24":case "Melee weapons - high level":$categoryID = 24; $categoryName = "Melee weapons - high level"; break;
  922.             case "25":case "Mining and smithing":$categoryID = 25; $categoryName = "Mining and smithing"; break;
  923.             case "26":case "Potions":$categoryID = 26; $categoryName = "Potions"; break;
  924.             case "27":case "Prayer armour":$categoryID = 27; $categoryName = "Prayer armour"; break;
  925.             case "28":case "Prayer materials":$categoryID = 28; $categoryName = "Prayer materials"; break;
  926.             case "29":case "Range armour":$categoryID = 29; $categoryName = "Range armour"; break;
  927.             case "30":case "Range weapons":$categoryID = 30; $categoryName = "Range weapons"; break;
  928.             case "31":case "Runecrafting":$categoryID = 31; $categoryName = "Runecrafting"; break;
  929.             case "32":case "Runes, Spells and Teleports":$categoryID = 32; $categoryName = "Runes, Spells and Teleports"; break;
  930.             case "33":case "Seeds":$categoryID = 33; $categoryName = "Seeds"; break;
  931.             case "34":case "Summoning scrolls":$categoryID = 34; $categoryName = "Summoning scrolls"; break;
  932.             case "35":case "Tools and containers":$categoryID = 35; $categoryName = "Tools and containers"; break;
  933.             case "36":case "Woodcutting product":$categoryID = 36; $categoryName = "Woodcutting product"; break;
  934.             case "37":case "Pocket items":$categoryID = 37; $categoryName = "Pocket items"; break;
  935.         }
  936.         return array("categoryID" => $categoryID,"categoryName" => $categoryName);
  937.     }
  938.     /**
  939.      * Convert the language Code in a number
  940.      * @param int|string $lang
  941.      * @return int
  942.      */
  943.     private function langCode($lang){
  944.         switch($lang){
  945.             case "us":
  946.             case "usa":
  947.             case "en":
  948.             case "eng":
  949.             case "engs":
  950.             case "0":
  951.             default:
  952.                 $lang = 0;
  953.                 break;
  954.             case "de":
  955.             case "deu":
  956.             case "ger":
  957.             case "deus":
  958.             case "1":
  959.                 $lang = 1;
  960.                 break;
  961.             case "fr":
  962.             case "fra":
  963.             case "fre":
  964.             case "fras":
  965.             case "2":
  966.                 $lang = 2;
  967.                 break;
  968.             case "br":
  969.             case "bra":
  970.             case "pt":
  971.             case "prt":
  972.             case "por":
  973.             case "3":
  974.                 $lang = 3;
  975.                 break;
  976.         }
  977.         return $lang;
  978.     }
  979.     /**
  980.      * Start a simpple curl request to an URL
  981.      * @param string $url
  982.      * @return string|boolean result as string on success or FALSE on failure
  983.      */
  984.     private function startRequest($url){
  985.         $timeout = 30;
  986.         curl_setopt($this->curl, CURLOPT_URL, utf8_encode($url));
  987.         curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
  988.         curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, $timeout);
  989.         $result = curl_exec($this->curl);
  990.         $responseCode = curl_getinfo($this->curl, CURLINFO_HTTP_CODE);
  991.         if($responseCode == 200 && $result){
  992.             return $result;
  993.         }else{
  994.             return false;
  995.         }
  996.     }
  997.     /**
  998.      * utf8_decode for arrays
  999.      * @param array $array
  1000.      * @return array UTF-8 decoded Array
  1001.      */
  1002.     private function utf8DecodeArray($array) {
  1003.         $utf8DecodedArray = array();
  1004.         foreach($array as $key => $value){
  1005.             if(is_array($value)){
  1006.                 $utf8DecodedArray[$key] = $this->utf8DecodeArray($value);
  1007.                 continue;
  1008.             }
  1009.             $utf8DecodedArray[$key] = utf8_decode($value);
  1010.         }
  1011.         return $utf8DecodedArray;
  1012.     }
  1013.  
  1014.     public function __destruct(){
  1015.         curl_close($this->curl);
  1016.     }
  1017.  
  1018. }
  1019. ?>
Advertisement
Add Comment
Please, Sign In to add comment