PageRenderTime 62ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/phpbb3-mod/root/includes/raidattendance/raider_armory.php

http://raidattendance.googlecode.com/
PHP | 317 lines | 228 code | 11 blank | 78 comment | 39 complexity | b0d100a2e11de98b4aa4ed777956d46d MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package raidattendance
  5. * @version $Id: functions_raidattendance.php 9462 2009-04-17 15:35:56Z acydburn $
  6. * @copyright (c) 2009 TA
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. /**
  11. * @ignore
  12. */
  13. if (!defined('IN_PHPBB'))
  14. {
  15. exit;
  16. }
  17. global $phpEx;
  18. require_once 'constants.' . $phpEx;
  19. require_once 'raider.' . $phpEx;
  20. function get_class_as_number($class_name)
  21. {
  22. switch ($class_name)
  23. {
  24. case 'warrior': return CLASS_WARRIOR;
  25. case 'paladin': return CLASS_PALADIN;
  26. case 'hunter': return CLASS_HUNTER;
  27. case 'rogue': return CLASS_ROGUE;
  28. case 'priest': return CLASS_PRIEST;
  29. case 'death knight': return CLASS_DEATH_KNIGHT;
  30. case 'shaman': return CLASS_SHAMAN;
  31. case 'mage': return CLASS_MAGE;
  32. case 'warlock': return CLASS_WARLOCK;
  33. case 'druid': return CLASS_DRUID;
  34. }
  35. throw new Exception("Unsupported class : " . $class_name);
  36. }
  37. // ---------------------------------------------------------------------------
  38. // Raiders from the wowarmory
  39. // ---------------------------------------------------------------------------
  40. class raider_armory
  41. {
  42. /**
  43. * Returns an array of raiders from the specified armory.
  44. * All raiders are specified to be those with a rank as specified in
  45. * the rank-array, and of minimum the supplied level.
  46. **/
  47. function get_raider_list($armory_link, $realm, $guild, $ranks, $min_level, &$raiders)
  48. {
  49. global $error, $user, $success;
  50. $this->raiders = &$raiders;
  51. $this->min_level = $min_level;
  52. $this->newly_added = array();
  53. $this->get_raiders($armory_link, rawurlencode($realm), rawurlencode($guild), $ranks, $min_level);
  54. foreach ($raiders as $raider)
  55. {
  56. if ($raider->__status != 'NEW' && $raider->__status != 'UPDATED' && $raider->__status != 'DEMOTED')
  57. {
  58. $raider->__status = 'NOT_IN_ARMORY';
  59. $raider->set_checked(true);
  60. }
  61. else
  62. {
  63. $raider->set_checked(false);
  64. }
  65. }
  66. if (sizeof($this->newly_added))
  67. {
  68. $success[] = sprintf($user->lang['RAIDER_ADDED_FROM_ARMORY'], implode(', ', $this->newly_added));
  69. }
  70. else
  71. {
  72. $success[] = $user->lang['NO_NEW_RAIDERS_IN_ARMORY'];
  73. }
  74. }
  75. function get_raiders($armory_link, $realm, $guild, $ranks, $min_level)
  76. {
  77. $this->get_raiders_html2($armory_link, $realm, $guild, $ranks, $min_level);
  78. }
  79. /**
  80. * The format of the eu.battle.net roster as of 9th of March 2011
  81. *
  82. **/
  83. function get_raiders_html2($armory_link, $realm, $guild, $ranks, $min_level)
  84. {
  85. global $success, $error;
  86. // Only 100 per page...
  87. $baseurl = $armory_link . '/wow/en/guild/' . $realm . '/' . $guild . '/roster?minLvl=' . $min_level;
  88. $doc = new DOMDocument();
  89. $doc->strictErrorChecking = false;
  90. $doc->resolveExternals = false;
  91. $doc->preserveWhiteSpace = false;
  92. $page = 0;
  93. do {
  94. $page++;
  95. $num_raiders_found = 0;
  96. $url = $baseurl . '&page=' . $page;
  97. ob_start();
  98. $doc_data = file_get_contents($url);
  99. // TODO: Localize
  100. if (@$doc->loadHTML($doc_data))
  101. {
  102. $success[] = 'Successfully retrieved : ' . $url;
  103. }
  104. else
  105. {
  106. $error[] = 'Error loading : ' . $url;
  107. }
  108. if (ob_get_length() > 0)
  109. {
  110. // TODO: Localize
  111. $error[] = 'Warnings during import: ' . ob_get_contents();
  112. }
  113. ob_end_clean(); // TODO: Check the output?
  114. $xpath = new DOMXpath($doc);
  115. $char_rows = $xpath->query("//div[@id='roster']/table/tbody/tr");
  116. if ($char_rows->length <= 0)
  117. {
  118. // TODO: Localize
  119. $error[] = "Could not locate any raiders in guild";
  120. return;
  121. }
  122. $success[] = 'Number of guildies ' . $char_rows->length;
  123. foreach ($char_rows as $row)
  124. {
  125. // <tr class="row1" data-level="85">
  126. // <td class="name"><a href="/wow/en/character/bloodhoof/lukand/" class="color-c2">Lukand</a></td>
  127. // <td class="race" data-raw="1"><img src="/wow/static/images/icons/race/1-0.gif" class="img" alt="" data-tooltip="Human"/></td>
  128. // <td class="cls" data-raw="2"><img src="/wow/static/images/icons/class/2.gif" class="img" alt="" data-tooltip="Paladin" /></td>
  129. // <td class="lvl">85</td>
  130. // <td class="rank" data-raw="7"><span >Rank 7</span></td>
  131. // <td class="ach-points"><span class="ach-icon">11080</span></td>
  132. // </tr>
  133. // By Nov 12th 2011:
  134. // -----------------
  135. // <tr class="row1" data-level="85">
  136. // <td class="name"><strong><a href="/wow/en/character/bloodhoof/Astonios/" class="color-c8">Astonios</a></strong></td>
  137. // <td class="race" data-raw="1">
  138. // <span class="icon-frame frame-14 " data-tooltip="Human">
  139. // <img src="http://eu.media.blizzard.com/wow/icons/18/race_1_0.jpg" alt="" width="14" height="14" />
  140. // </span>
  141. // </td>
  142. // <td class="cls" data-raw="8">
  143. // <span class="icon-frame frame-14 " data-tooltip="Mage">
  144. // <img src="http://eu.media.blizzard.com/wow/icons/18/class_8.jpg" alt="" width="14" height="14" />
  145. // </span>
  146. // </td>
  147. // <td class="lvl">85</td>
  148. // <td class="rank" data-raw="4">
  149. // <span >Rank 4</span>
  150. // </td>
  151. // <td class="ach-points">
  152. // <span class="ach-icon">11385</span>
  153. // </td>
  154. // </tr>
  155. if ($row->getAttribute('class') == 'no-results')
  156. {
  157. // Skip it
  158. continue;
  159. }
  160. $name_node = $xpath->query(".//td[@class='name']/strong/a", $row)->item(0);
  161. $rank_node = $xpath->query(".//td[@class='rank']", $row)->item(0);
  162. $class_node = $xpath->query(".//td[@class='cls']", $row)->item(0);
  163. if (!$name_node || !$rank_node || !$class_node)
  164. {
  165. $node_text = $doc->saveXML($row);
  166. throw new Exception("Could not locate name, rank and class for " . htmlentities($node_text));
  167. }
  168. $data = array(
  169. 'name' => utf8_decode($name_node->textContent),
  170. 'level' => $row->getAttribute('data-level'),
  171. 'rank' => $rank_node->getAttribute('data-raw'),
  172. 'class' => $class_node->getAttribute('data-raw')
  173. );
  174. //$name = utf8_decode($data['name']);
  175. //$name = utf8_encode ($data['name']);
  176. $name = $data['name'];
  177. if (array_search($data['rank'], $ranks) !== FALSE)
  178. {
  179. if (array_key_exists($name, $this->raiders))
  180. {
  181. $this->raiders[$name]->update($data);
  182. $this->raiders[$name]->__status = 'UPDATED';
  183. }
  184. else
  185. {
  186. $this->raiders[$name] = new raider($data);
  187. $this->raiders[$name]->__status = 'NEW';
  188. $this->newly_added[] = $name;
  189. //$success[] = sprintf($user->lang['RAIDER_ADDED_FROM_ARMORY'], $name);
  190. }
  191. }
  192. else if (array_key_exists($name, $this->raiders))
  193. {
  194. $this->raiders[$name]->update($data);
  195. $this->raiders[$name]->__status = 'DEMOTED';
  196. }
  197. $num_raiders_found++;
  198. }
  199. } while ($num_raiders_found == 100);
  200. }
  201. function get_raiders_json($armory_link, $realm, $guild, $ranks, $min_level)
  202. {
  203. global $error;
  204. $error[] = "realm = $realm, guild = $guild";
  205. $url = sprintf('http://wowfeeds.wipeitau.com/GuildRoster.php?location=EU&rn=%1$s&gn=%2$s&output=JSON&callback=?', $realm, $guild);
  206. $error[] = "url: $url";
  207. $json = file_get_contents($url);
  208. $error[] = "json: $json";
  209. $ary = json_decode($json, true);
  210. $error[] = "ary : " . sizeof($ary);
  211. }
  212. function get_raiders_html($armory_link, $realm, $guild, $ranks, $min_level)
  213. {
  214. $url = $armory_link . '/wow/en/guild/' . rawurlencode($realm) . '/' . rawurlencode($guild) . '/roster';
  215. global $success, $error;
  216. $doc = new DOMDocument();
  217. $doc->strictErrorChecking = false;
  218. $doc->resolveExternals = false;
  219. $doc->preserveWhiteSpace = false;
  220. ob_start();
  221. $doc_data = file_get_contents($url);
  222. // TODO: Localize
  223. if (@$doc->loadHTML($doc_data))
  224. {
  225. $success[] = 'Successfully retrieved : ' . $url;
  226. }
  227. else
  228. {
  229. $error[] = 'Error loading : ' . $url;
  230. }
  231. if (ob_get_length() > 0)
  232. {
  233. // TODO: Localize
  234. $error[] = 'Warnings during import: ' . ob_get_contents();
  235. }
  236. ob_end_clean(); // TODO: Check the output?
  237. $xpath = new DOMXpath($doc);
  238. $char_rows = $xpath->query("//div[@id='roster']/table/tbody/tr");
  239. if ($char_rows->length <= 0)
  240. {
  241. throw new Exception("Could not locate any raiders in guild");
  242. }
  243. $success[] = 'Number of guildies ' . $char_rows->length;
  244. foreach ($char_rows as $row)
  245. {
  246. //<tr xmlns="http://www.w3.org/1999/xhtml" class="row1" data-level="71">
  247. // <td class="name"><a href="/wow/en/character/bloodhoof/abi/" class="color-c9">Abi</a></td>
  248. // <td class="race" data-raw="human"><img src="/wow/static/images/icons/race/1-1.gif" class="img" alt="" data-tooltip="Human" /></td>
  249. // <td class="cls" data-raw="warlock"><img src="/wow/static/images/icons/class/9.gif" class="img" alt="" data-tooltip="Warlock" /></td>
  250. // <td class="lvl">71</td>
  251. // <td class="rank" data-raw="6"><span>Rank 6</span></td>
  252. // <td class="ach-points"><span class="ach-icon">1080</span></td>
  253. // <td class="lifetime">0</td>
  254. // <td class="weekly">0</td>
  255. //</tr>
  256. if ($row->getAttribute('class') == 'no-results')
  257. {
  258. // Skip it
  259. continue;
  260. }
  261. $name_node = $xpath->query(".//td[@class='name']/a", $row)->item(0);
  262. $rank_node = $xpath->query(".//td[@class='rank']", $row)->item(0);
  263. $class_node = $xpath->query(".//td[@class='cls']", $row)->item(0);
  264. if (!$name_node || !$rank_node || !$class_node)
  265. {
  266. $node_text = $doc->saveXML($row);
  267. throw new Exception("Could not locate name, rank and class for " . htmlentities($node_text));
  268. }
  269. $data = array(
  270. 'name' => utf8_decode($name_node->textContent),
  271. 'level' => $row->getAttribute('data-level'),
  272. 'rank' => $rank_node->getAttribute('data-raw'),
  273. 'class' => $class_node->getAttribute('data-raw')
  274. );
  275. // class is now a textual representation.
  276. $data['class'] = get_class_as_number($data['class']);
  277. if ($data['level'] >= $this->min_level)
  278. {
  279. //$name = utf8_decode($data['name']);
  280. //$name = utf8_encode ($data['name']);
  281. $name = $data['name'];
  282. if (array_search($data['rank'], $ranks) !== FALSE)
  283. {
  284. if (array_key_exists($name, $this->raiders))
  285. {
  286. $this->raiders[$name]->update($data);
  287. $this->raiders[$name]->__status = 'UPDATED';
  288. }
  289. else
  290. {
  291. $this->raiders[$name] = new raider($data);
  292. $this->raiders[$name]->__status = 'NEW';
  293. $this->newly_added[] = $name;
  294. //$success[] = sprintf($user->lang['RAIDER_ADDED_FROM_ARMORY'], $name);
  295. }
  296. }
  297. else if (array_key_exists($name, $this->raiders))
  298. {
  299. $this->raiders[$name]->update($data);
  300. $this->raiders[$name]->__status = 'DEMOTED';
  301. }
  302. }
  303. }
  304. }
  305. }
  306. ?>