PageRenderTime 32ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/addons/pvplog/inc/update_hook.php

http://wowroster.googlecode.com/
PHP | 283 lines | 195 code | 32 blank | 56 comment | 23 complexity | 3751ff4bb0d4cf43452f476b7279107e MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. /**
  3. * WoWRoster.net WoWRoster
  4. *
  5. *
  6. * @copyright 2002-2011 WoWRoster.net
  7. * @license http://www.gnu.org/licenses/gpl.html Licensed under the GNU General Public License v3.
  8. * @version SVN: $Id: update_hook.php 2222 2010-12-05 10:05:37Z c.treyce@gmail.com $
  9. * @link http://www.wowroster.net
  10. * @package PvPLog
  11. * @subpackage UpdateHook
  12. */
  13. if ( !defined('IN_ROSTER') )
  14. {
  15. exit('Detected invalid access to this file!');
  16. }
  17. /**
  18. * Addon Update class
  19. * This MUST be the same name as the addon basename
  20. *
  21. * @package PvPLog
  22. * @subpackage UpdateHook
  23. */
  24. class pvplogUpdate
  25. {
  26. var $messages = ''; // Update messages
  27. var $data = array(); // Addon config data automatically pulled from the addon_config table
  28. var $files = array();
  29. /**
  30. * Class instantiation
  31. * The name of this function MUST be the same name as the class name
  32. *
  33. * @param array $data | Addon data
  34. * @return pvplog
  35. */
  36. function pvplogUpdate( $data )
  37. {
  38. $this->data = $data;
  39. $this->files[] = 'pvplog';
  40. }
  41. /**
  42. * Standalone Update Hook
  43. *
  44. * @return bool
  45. */
  46. function update( )
  47. {
  48. global $roster, $update;
  49. $pvpdata = $update->uploadData['pvplog'];
  50. $this->reset_messages();
  51. foreach ($pvpdata['PurgeLogData'] as $realm_name => $realm)
  52. {
  53. foreach ($realm as $char_name => $char)
  54. {
  55. $query = "SELECT `guild_id`, `region` FROM `" . $roster->db->table('players') . "` WHERE `name` = '" . addslashes($char_name) . "' AND `server` = '" . addslashes($realm_name) . "';";
  56. $result = $roster->db->query( $query );
  57. if ($roster->db->num_rows($result) > 0)
  58. {
  59. $row = $roster->db->fetch( $result );
  60. $guild_id = $row['guild_id'];
  61. $region = $row['region'];
  62. $battles = $char['battles'];
  63. if( version_compare($char['version'], $this->data['config']['minPvPLogver'], '>=') )
  64. {
  65. $this->messages .= '<strong>' . sprintf($roster->locale->act['upload_data'],'PvPLog',$char_name,$realm_name,$region) . "</strong>\n";
  66. $this->messages .= "<ul>\n";
  67. $this->update_pvp($guild_id, $char_name, $battles);
  68. $this->messages .= "</ul>\n";
  69. }
  70. else // PvPLog version not high enough
  71. {
  72. $this->messages .= '<span class="red">' . sprintf($roster->locale->act['not_updating'],'PvPLog',$char_name,$char['version']) . "</span><br />\n";
  73. $this->messages .= sprintf($roster->locale->act['PvPLogver_err'], $this->data['config']['minPvPLogver']) . "\n";
  74. }
  75. }
  76. }
  77. }
  78. return true;
  79. }
  80. /**
  81. * Guild post trigger: remove deleted members from the pvp2 table
  82. *
  83. * @param array $guild
  84. * CP.lua guild data
  85. */
  86. function guild_post( $guild )
  87. {
  88. global $roster;
  89. $query = "DELETE `" . $roster->db->table('pvp2',$this->data['basename']) . "`"
  90. . " FROM `" . $roster->db->table('pvp2',$this->data['basename']) . "`"
  91. . " LEFT JOIN `" . $roster->db->table('members') . "` USING (`member_id`)"
  92. . " WHERE `" . $roster->db->table('members') . "`.`member_id` IS NULL;";
  93. if( $roster->db->query($query) )
  94. {
  95. $this->messages .= 'PvPLog: ' . $roster->db->affected_rows() . ' records without matching member records deleted';
  96. }
  97. else
  98. {
  99. $this->messages .= 'PvPLog: <span style="color:red;">Old records not deleted. MySQL said: ' . $roster->db->error() . "</span><br />\n";
  100. return false;
  101. }
  102. return true;
  103. }
  104. /**
  105. * Updates pvp table
  106. *
  107. * @param int $guildId
  108. * @param string $name
  109. * @param array $data
  110. */
  111. function update_pvp( $guildId , $name , $data )
  112. {
  113. global $roster, $update;
  114. $name_escape = $roster->db->escape( $name );
  115. $querystr = "SELECT `member_id` FROM `" . $roster->db->table('members') . "` WHERE `name` = '$name_escape' AND `guild_id` = '$guildId';";
  116. $result = $roster->db->query($querystr);
  117. if( !$result )
  118. {
  119. $this->messages .= 'Member could not be selected for update';
  120. return;
  121. }
  122. $memberInfo = $roster->db->fetch( $result );
  123. $roster->db->free_result($result);
  124. if ($memberInfo)
  125. {
  126. $memberId = $memberInfo['member_id'];
  127. }
  128. else
  129. {
  130. $this->messages .= '<li>' . $name . ' is not in the list of guild members so PvPLog info will not be inserted</li>';
  131. return;
  132. }
  133. // process pvp
  134. $this->messages .= '<li>Updating PvP data</li>';
  135. // loop through each index fought
  136. foreach( array_keys($data) as $index)
  137. {
  138. $playerInfo = $data[$index];
  139. $playerName = $playerInfo['name'];
  140. $playerDate = date('Y-m-d G:i:s', strtotime($playerInfo['date']));
  141. $playerRealm = ( isset($playerInfo['realm']) ? $playerInfo['realm'] : '' );
  142. $playerRace = ( isset($playerInfo['race']) ? $playerInfo['race'] : '' );
  143. // skip if entry already there
  144. $querystr = "SELECT `guild` FROM `" . $roster->db->table('pvp2',$this->data['basename']) . "` WHERE `index` = '$index' AND `member_id` = '$memberId' AND `name` = '" . $roster->db->escape( $playerName ) . "' AND `date` = '" . $roster->db->escape( $playerDate ) . "'" . ( !empty($playerRealm) ? " AND `realm` = '" . $roster->db->escape( $playerRealm ) . "';" : ';' );
  145. $result = $roster->db->query($querystr);
  146. if( !$result )
  147. {
  148. $this->messages .= 'PvPLog cannot update';
  149. return;
  150. }
  151. $memberInfo = $roster->db->fetch( $result );
  152. $roster->db->free_result($result);
  153. if (!$memberInfo)
  154. {
  155. $this->messages .= '<li>Adding PvPLog data for [' . $playerInfo['name'] . ']</li>';
  156. $update->reset_values();
  157. $update->add_value('member_id', $memberId);
  158. $update->add_value('index', $index);
  159. $this->add_pvp2time('date', $playerInfo['date']);
  160. $update->add_value('name', $playerInfo['name']);
  161. $update->add_value('guild', $playerInfo['guild']);
  162. $update->add_value('realm', $playerRealm);
  163. $update->add_value('race', $playerRace);
  164. $update->add_value('class', $playerInfo['class']);
  165. $update->add_value('zone', $playerInfo['zone']);
  166. $update->add_value('subzone', $playerInfo['subzone']);
  167. $update->add_value('leveldiff', $playerInfo['lvlDiff']);
  168. $update->add_value('enemy', $playerInfo['enemy']);
  169. $update->add_value('win', $playerInfo['win']);
  170. $update->add_value('bg', $playerInfo['bg']);
  171. $update->add_value('rank', $playerInfo['rank']);
  172. $update->add_value('honor', $playerInfo['honor']);
  173. $querystr = "INSERT INTO `" . $roster->db->table('pvp2',$this->data['basename']) . "` SET " . $update->assignstr . ';';
  174. $result = $roster->db->query($querystr);
  175. if( !$result )
  176. {
  177. $this->messages .= 'PvPLog Data could not be inserted';
  178. }
  179. }
  180. }
  181. // now calculate ratio
  182. $wins = 0;
  183. $querystr = "SELECT COUNT(`win`) AS wins FROM `" . $roster->db->table('pvp2',$this->data['basename']) . "` WHERE `win` = '1' AND `member_id` = '$memberId' GROUP BY `win`;";
  184. $result = $roster->db->query($querystr);
  185. if( !$result )
  186. {
  187. $this->messages .= 'PvPLog cannot select wins';
  188. return;
  189. }
  190. $memberInfo = $roster->db->fetch( $result );
  191. $roster->db->free_result($result);
  192. if ($memberInfo)
  193. $wins = $memberInfo['wins'];
  194. $this->messages .= '<li>Wins: ' . $wins . '</li>';
  195. $losses = 0;
  196. $querystr = "SELECT COUNT(`win`) AS losses FROM `" . $roster->db->table('pvp2',$this->data['basename']) . "` WHERE `win` = '0' AND `member_id` = '$memberId' GROUP BY `win`;";
  197. $result = $roster->db->query($querystr);
  198. if( !$result )
  199. {
  200. $this->messages .= 'PvPLog cannot select losses';
  201. return;
  202. }
  203. $memberInfo = $roster->db->fetch( $result );
  204. $roster->db->free_result($result);
  205. if ($memberInfo)
  206. $losses = $memberInfo['losses'];
  207. $this->messages .= '<li>Losses: ' . $losses . '</li>';
  208. if ($losses == 0 || $wins == 0)
  209. {
  210. if ($losses == 0 && $wins == 0)
  211. {
  212. $ratio = 0;
  213. }
  214. else
  215. {
  216. $ratio = 99999;
  217. }
  218. }
  219. else
  220. {
  221. $ratio = $wins / $losses;
  222. }
  223. $querystr = "UPDATE `" . $roster->db->table('players') . "` SET `pvp_ratio` = ".$ratio." WHERE `member_id` = '$memberId';";
  224. $result = $roster->db->query($querystr);
  225. if( !$result )
  226. {
  227. $this->messages .= 'PvPLog ratio could not be updated';
  228. }
  229. $this->messages .= '<li>Set PvP ratio to ' . $ratio . '</li>';
  230. }
  231. /**
  232. * Add a time value to an INSERT or UPDATE SQL string for PVP table
  233. *
  234. * @param string $row_name
  235. * @param string $date
  236. */
  237. function add_pvp2time( $row_name , $date )
  238. {
  239. global $update;
  240. $date_str = strtotime($date);
  241. $p2newdate = date('Y-m-d H:i:s',$date_str);
  242. $update->add_value($row_name, $p2newdate);
  243. }
  244. /**
  245. * Resets addon messages
  246. */
  247. function reset_messages()
  248. {
  249. $this->messages = '';
  250. }
  251. }