Guest User

Untitled

a guest
Jun 21st, 2018
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.81 KB | None | 0 0
  1. <?php
  2. #################################################
  3. # Анализатор логов арены для TrinityCore/Mangos #
  4. # Предназначен для выявления "переливов" #
  5. #################################################
  6.  
  7. ###################################################################################################
  8. # СОДЕРЖАНИЕ
  9. #
  10. # АВТОР, КОНТАКТЫ
  11. # ОПИСАНИЕ РАБОТЫ СКРИПТА
  12. # ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ
  13. # НАСТРОЙКА ПОДКЛЮЧЕНИЯ К БАЗЕ
  14. # НАСТРОЙКИ СКРИПТА
  15. #
  16. ###################################################################################################
  17.  
  18. ###################################################################################################
  19. # АВТОР, КОНТАКТЫ
  20. #
  21. # Автор : BeLove
  22. # ICQ : 3320443
  23. # email : sergeybelove@gmail.com
  24. #
  25. ###################################################################################################
  26.  
  27. ###################################################################################################
  28. # ОПИСАНИЕ РАБОТЫ СКРИПТА
  29. #
  30. #
  31. ###################################################################################################
  32.  
  33. ###################################################################################################
  34. # ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ
  35. #
  36. /*
  37. DROP TABLE IF EXISTS `arena_leavers_temp`;
  38. CREATE TABLE `arena_leavers_temp` (
  39. `game_time_start` varchar(10) DEFAULT 'NULL',
  40. `game_time_end` varchar(10) DEFAULT 'NULL',
  41. `game_type` tinyint(3),
  42. `team1_id` int(10),
  43. `team1_damage` int(10) DEFAULT '0',
  44. `team1_heal` int(10) DEFAULT '0',
  45. `team1_kb` tinyint(3) DEFAULT '0',
  46. `team2_id` int(10),
  47. `team2_damage` int(10) DEFAULT '0',
  48. `team2_heal` int(10) DEFAULT '0',
  49. `team2_kb` tinyint(3) DEFAULT '0');
  50.  
  51. DROP TABLE IF EXISTS `arena_leavers_stat`;
  52. CREATE TABLE `arena_leavers_stat` (
  53. `teamid` int(10),
  54. `count` int(10) DEFAULT '0');
  55. */
  56. #
  57. ###################################################################################################
  58.  
  59. ###################################################################################################
  60. # НАСТРОЙКА ПОДКЛЮЧЕНИЯ К БАЗЕ
  61. #
  62. # Укажите ниже параметры для подключения: хост, имя пользователя, пароль, имя базы данных
  63.  
  64. $mysql_host = "localhost";
  65. $mysql_user = "";
  66. $mysql_pass = "";
  67. $mysql_db = "characters";
  68.  
  69. #
  70. ###################################################################################################
  71.  
  72. ###################################################################################################
  73. # НАСТРОЙКИ СКРИПТА
  74. #
  75. # Имя файла, содержащего логи арены
  76.  
  77. $arena_log_file = "/usr/local/trinity_myth/bin/Arena.log";
  78.  
  79. # Минимальная разница в секундах между началом и концом игры
  80.  
  81. $max_delta = 40;
  82.  
  83. # Анализировать расширенные логи (ставьте 0, если в конфиге
  84. # выставлено ArenaLog.ExtendedInfo = 0 и наоборот)
  85.  
  86. $extended_logs = 1;
  87.  
  88. # Ничего не трогайте ниже, если режим ArenaLog.ExtendedInfo равен нулю
  89. # Минимальные значения хила/дамага для обеих команд за одну игру (общий дамаг и хил игры)
  90.  
  91. $min_heal = 1000;
  92. $min_dmg = 1000;
  93.  
  94. # Минимальные значения убийств для одной из команд за одну игру
  95. # (в зависимости от типа игры (2х2, 3х3, 5х5)
  96. # укажите "0", если не хотите учитывать этот параметр
  97.  
  98. $min_kb_2 = 1;
  99. $min_kb_3 = 2;
  100. $min_kb_5 = 3;
  101.  
  102. #
  103. ###################################################################################################
  104.  
  105. set_time_limit(0);
  106. error_reporting(0);
  107. mysql_connect ($mysql_host, $mysql_user, $mysql_pass) or die (mysql_error());
  108. mysql_select_db ($mysql_db) or die (mysql_error());
  109.  
  110. ###################################################################################################
  111. #
  112. # Начало работы первого этапа.
  113. # Включает в себя перенос частично обработанных записей об играх в MySQL
  114. #
  115. ###################################################################################################
  116.  
  117. if (!isset($_GET[step]))
  118. {
  119.  
  120. //это так, за ранее обнулим
  121. $team1_damage = 0; $team2_damage = 0;
  122. $team1_heal = 0; $team2_heal = 0;
  123. $team1_kb = 0; $team2_kb = 0;
  124.  
  125. echo "<h3>Первый этап.</h3> Перенос нужной информации из логов в MySQL<br />
  126. <i>Процесс пошел...</i><br/><br/>";
  127. mysql_query ("TRUNCATE `arena_leavers_temp`") or die(mysql_error());
  128. $fp = fopen($arena_log_file, "r");
  129. if ($fp)
  130. {
  131. while (!feof($fp))
  132. {
  133. $arena = explode(" ", fgets($fp, 999));
  134. // $arena[12] - "started" or "ended"
  135. if (trim($arena[12]) == "started.")
  136. {
  137. $ymd = explode ("-", $arena[0]);
  138. $hms = explode (":", $arena[1]);
  139. $time = mktime($hms[0], $hms[1], $hms[2], $ymd[1], $ymd[2], $ymd[0]);
  140. mysql_query ("INSERT INTO `arena_leavers_temp` VALUES ('{$time}', '', {$arena[5]}, {$arena[8]}, '','','', {$arena[11]}, '', '', '')") or die(mysql_error());
  141. }
  142.  
  143. if ($arena[12] == "ended.")
  144. {
  145. // проверка, есть ли запись о начале для данной игры. game_time_end нам это и скажет.
  146. $query = mysql_query ("SELECT game_time_start FROM `arena_leavers_temp` where team1_id = {$arena[8]} and team2_id = {$arena[11]}
  147. and game_time_end = ''") or die(mysql_error());
  148. $sql = mysql_fetch_array($query);
  149. if ($sql['game_time_start'] > 0)
  150. {
  151. //забираем время игры
  152. $ymd = explode ("-", $arena[0]);
  153. $hms = explode (":", $arena[1]);
  154. $time = mktime($hms[0], $hms[1], $hms[2], $ymd[1], $ymd[2], $ymd[0]);
  155. //забираем расширенную статистику, если надо
  156. if ($extended_logs)
  157. {
  158. //сбрасываем сумарные данные по командам (дамаг, хил, количество убийств)
  159. $team1_damage = 0; $team2_damage = 0;
  160. $team1_heal = 0; $team2_heal = 0;
  161. $team1_kb = 0; $team2_kb = 0;
  162. $extended_info = explode(" ", fgets($fp, 999));
  163. while ($extended_info[2] == "Statistics")
  164. {
  165. //Запятая в конце - чтобы не вырезать ее из первой переменной, быстрее и проще :)
  166. //для первой команды
  167. if ($extended_info[8] == $arena[8].",")
  168. {
  169.  
  170. $team1_damage = $team1_damage + $extended_info[11];
  171. $team1_heal = $team1_heal + $extended_info[13];
  172. $team1_kb = $team1_kb + $extended_info[15];
  173. }
  174. //для второй
  175. else if ($extended_info[8] == $arena[11].",")
  176. {
  177. $team2_damage = $team2_damage + $extended_info[11];
  178. $team2_heal = $team2_heal + $extended_info[13];
  179. $team2_kb = $team2_kb + $extended_info[15];
  180. }
  181. $extended_info = explode(" ", fgets($fp, 999));
  182. }
  183. }
  184. //и записываем все в базу
  185. mysql_query ("update `arena_leavers_temp` set
  186. game_time_end = '{$time}',
  187. team1_damage = '{$team1_damage}', team1_heal = {$team1_heal}, team1_kb = {$team1_kb},
  188. team2_damage = {$team2_damage}, team2_heal = {$team2_heal}, team2_kb = {$team2_kb}
  189. where
  190. game_time_start = '{$sql['game_time_start']}' and
  191. team1_id = {$arena[8]} and
  192. team2_id = {$arena[11]};") or die (mysql_error());
  193. } else echo "<B>[notice]</b> Была найдена запись об окончании игры, для которой нет информации о ее начале!
  194. Игра {$arena[8]} vs {$arena[11]}. Тип игры - {$arena[5]} x {$arena[5]}<br />";
  195. }
  196. }
  197. } else die ("Ошибка при открытии файла $arena_log_file. Возможно, файл не существует.");
  198. fclose($fp);
  199.  
  200. echo "<br />Перенос данных успешно завершен!<br />
  201. <a href = ?step=2>Перейти ко второму этапу...</a>";
  202. }
  203.  
  204. ###################################################################################################
  205. #
  206. # Второй этап
  207. # Анализ игр на переливы
  208. #
  209. ###################################################################################################
  210.  
  211. if (isset($_GET[step]) && $_GET[step] == 2)
  212. {
  213. echo "<h3>Второй этап.</h3> Анализ полученных данных.";
  214. $sql = mysql_query("SELECT count(1) as count FROM `arena_leavers_temp`;") or die (mysql_error());
  215. $result = mysql_fetch_array($sql);
  216. echo "<br /><br /><li>Всего игр: <b>$result[count]</b></li>";
  217. $sql = mysql_query("SELECT 1 FROM `arena_leavers_temp` where game_time_end = '';") or die (mysql_error());
  218. $result = mysql_num_rows($sql);
  219. if ($result) echo "<li>Количество игр, для которых мы не смогли найти конечные данные: <b>$result</b></li>
  220. <small>*Возможные причины - неполный лог/краши сервера во время игр</small><br />";
  221. $sql = mysql_query("SELECT team1_id FROM `arena_leavers_temp` where game_time_end <> ''
  222. UNION SELECT `team2_id` FROM `arena_leavers_temp` where game_time_end <> '';") or die (mysql_error());
  223. $result = mysql_num_rows($sql);
  224. echo "<li>Количество команд для обработки: <b>$result</b><br />";
  225. //заполняем "нулевую" статистику для каждой команды
  226. mysql_query ("TRUNCATE `arena_leavers_stat`") or die(mysql_error());
  227. while ($row=mysql_fetch_assoc($sql))
  228. {
  229. mysql_query ("INSERT INTO `arena_leavers_stat` VALUES ({$row[team1_id]}, '0')") or die (mysql_error());
  230. }
  231. //Начинаем анализ. Для расширенных логов:
  232. if ($extended_logs)
  233. {
  234. $sql = mysql_query("SELECT * FROM `arena_leavers_temp` where
  235. game_time_end <> '' and
  236. team1_heal + team2_heal < {$min_heal} and
  237. team1_damage + team2_damage < {$min_dmg} and
  238. game_time_end - game_time_start < {$max_delta};") or die (mysql_error());
  239. while ($row=mysql_fetch_array($sql))
  240. {
  241. switch ($row[game_type])
  242. {
  243. case "2":
  244. if ($row[team1_kb] < $min_kb_2 && $row[team2_kb] < $min_kb_2)
  245. mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
  246. break;
  247.  
  248. case "3":
  249. if ($row[team1_kb] < $min_kb_3 && $row[team2_kb] < $min_kb_3)
  250. mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
  251. break;
  252.  
  253. case "5":
  254. if ($row[team1_kb] < $min_kb_5 && $row[team2_kb] < $min_kb_5)
  255. mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
  256. break;
  257. }
  258. }
  259. }
  260. //для обычных логов, смотрим только время
  261. else
  262. {
  263. $sql = mysql_query("SELECT * FROM `arena_leavers_temp` where
  264. game_time_end <> '' and
  265. game_time_end - game_time_start < {$max_delta}") or die (mysql_error());
  266. while ($row=mysql_fetch_array($sql))
  267. mysql_query ("UPDATE arena_leavers_stat
  268. set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
  269. }
  270. // всё!
  271. $sql = mysql_query("SELECT SUM(COUNT) as sum FROM `arena_leavers_stat`") or die (mysql_error());
  272. $total = mysql_fetch_array($sql);
  273. echo "<br />Работа скрипта завершена. <br />
  274. Переливов выявлено: {$total[sum]}<br />
  275. Можете использовать данные по каждой команде в таблице `arena_leavers_stat` в любых целях";
  276. }
  277. ?>
Add Comment
Please, Sign In to add comment