Вход для пользователей

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
[Скрипт] Следим за сливом арены
IcelipsДата: Понедельник, 02.04.2012, 08:03 | Сообщение # 1
Скаут
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 1
Статус:
Данный скрипт будет вести логи Арена Битв время которых <40sec
Скрипт разработал: BeLove (Скажем ему спасибо)

Quote
<?php
###################################################################################################
# СОДЕРЖАНИЕ
#
# АВТОР, КОНТАКТЫ
# ОПИСАНИЕ РАБОТЫ СКРИПТА
# ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ
# НАСТРОЙКА ПОДКЛЮЧЕНИЯ К БАЗЕ
# НАСТРОЙКИ СКРИПТА
#
###################################################################################################

############# ### ###################################################################################
# АВТОР, КОНТАКТЫ
#
# Автор : WoWRP.3dn.ru
#
#
#
###################################################################################################

# ##################################################################################################
# ОПИСАНИЕ РАБОТЫ СКРИПТА
# ЛОГИРУЕТ ВСЕ "ПЕРЕЛИВЫ" АРЕНЫ
#
###################################################################################################

################### ## ##############################################################################
# ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ
#
/*
DROP TABLE IF EXISTS `arena_leavers_temp`;
CREATE TABLE `arena_leavers_temp` (
`game_time_start` varchar(10) DEFAULT 'NULL',
`game_time_end` varchar(10) DEFAULT 'NULL',
`game_type` tinyint(3),
`team1_id` int(10),
`team1_damage` int(10) DEFAULT '0',
`team1_heal` int(10) DEFAULT '0',
`team1_kb` tinyint(3) DEFAULT '0',
`team2_id` int(10),
`team2_damage` int(10) DEFAULT '0',
`team2_heal` int(10) DEFAULT '0',
`team2_kb` tinyint(3) DEFAULT '0');

DROP TABLE IF EXISTS `arena_leavers_stat`;
CREATE TABLE `arena_leavers_stat` (
`teamid` int(10),
`count` int(10) DEFAULT '0');
*/
#
###################################################################################################

#################### ### ############################################################################
# НАСТРОЙКА ПОДКЛЮЧЕНИЯ К БАЗЕ
#
# Укажите ниже параметры для подключения: хост, имя пользователя, пароль, имя базы данных

$mysql_host = "localhost";
$mysql_user = "root";
$mysql_pass = "root";
$mysql_db = "characters";

#
###################################################################################################

#################### ### ############################################################################
# НАСТРОЙКИ СКРИПТА
#
# Имя файла, содержащего логи арены

$arena_log_file = "arena.log";

# Минимальная разница в секундах между началом и концом игры

$max_delta = 40;

# Анализировать расширенные логи (ставьте 0, если в конфиге
# выставлено ArenaLog.ExtendedInfo = 0 и наоборот)

$extended_logs = 0;

# Ничего не трогайте ниже, если режим ArenaLog.ExtendedInfo равен нулю
# Минимальные значения хила/дамага для обеих команд за одну игру (общий дамаг и хил игры)

$min_heal = 1;
$min_dmg = 1;

# Минимальные значения убийств для одной из команд за одну игру
# (в зависимости от типа игры (2х2, 3х3, 5х5)
# укажите "0", если не хотите учитывать этот параметр

$min_kb_2 = 2;
$min_kb_3 = 3;
$min_kb_5 = 5;

#
###################################################################################################

set_time_limit(0);
error_reporting(0);
mysql_connect ($mysql_host, $mysql_user, $mysql_pass) or die (mysql_error());
mysql_select_db ($mysql_db) or die (mysql_error());

###################################################################################################
#
# Начало работы первого этапа.
# Включает в себя перенос частично обработанных записей об играх в MySQL
#
###################################################################################################

if (!isset($_GET[step]))
{

//это так, за ранее обнулим
$team1_damage = 0; $team2_damage = 0;
$team1_heal = 0; $team2_heal = 0;
$team1_kb = 0; $team2_kb = 0;

echo "<h3>Первый этап.</h3> Перенос нужной информации из логов в MySQL<br />
<i>Процесс пошел...</i><br/><br/>";
mysql_query ("TRUNCATE `arena_leavers_temp`") or die(mysql_error());
$fp = fopen($arena_log_file, "r");
if ($fp)
{
while (!feof($fp))
{
$arena = explode(" ", fgets($fp, 999));
// $arena[12] - "started" or "ended"
if (trim($arena[12]) == "started.")
{
$ymd = explode ("-", $arena[0]);
$hms = explode (":", $arena[1]);
$time = mktime($hms[0], $hms[1], $hms[2], $ymd[1], $ymd[2], $ymd[0]);
mysql_query ("INSERT INTO `arena_leavers_temp` VALUES ('{$time}', '', {$arena[5]}, {$arena[8]}, '','','', {$arena[11]}, '', '', '')") or die(mysql_error());
}

if ($arena[12] == "ended.")
{
// проверка, есть ли запись о начале для данной игры. game_time_end нам это и скажет.
$query = mysql_query ("SELECT game_time_start FROM `arena_leavers_temp` where team1_id = {$arena[8]} and team2_id = {$arena[11]}
and game_time_end = ''") or die(mysql_error());
$sql = mysql_fetch_array($query);
if ($sql['game_time_start'] > 0)
{
//забираем время игры
$ymd = explode ("-", $arena[0]);
$hms = explode (":", $arena[1]);
$time = mktime($hms[0], $hms[1], $hms[2], $ymd[1], $ymd[2], $ymd[0]);
//забираем расширенную статистику, если надо
if ($extended_logs)
{
//сбрасываем сумарные данные по командам (дамаг, хил, количество убийств)
$team1_damage = 0; $team2_damage = 0;
$team1_heal = 0; $team2_heal = 0;
$team1_kb = 0; $team2_kb = 0;
$extended_info = explode(" ", fgets($fp, 999));
while ($extended_info[2] == "Statistics")
{
//Запятая в конце - чтобы не вырезать ее из первой переменной, быстрее и проще <img src="http://s8.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile">
//для первой команды
if ($extended_info[8] == $arena[8].",")
{

$team1_damage = $team1_damage + $extended_info[11];
$team1_heal = $team1_heal + $extended_info[13];
$team1_kb = $team1_kb + $extended_info[15];
}
//для второй
else if ($extended_info[8] == $arena[11].",")
{
$team2_damage = $team2_damage + $extended_info[11];
$team2_heal = $team2_heal + $extended_info[13];
$team2_kb = $team2_kb + $extended_info[15];
}
$extended_info = explode(" ", fgets($fp, 999));
}
}
//и записываем все в базу
mysql_query ("update `arena_leavers_temp` set
game_time_end = '{$time}',
team1_damage = '{$team1_damage}', team1_heal = {$team1_heal}, team1_kb = {$team1_kb},
team2_damage = {$team2_damage}, team2_heal = {$team2_heal}, team2_kb = {$team2_kb}
where
game_time_start = '{$sql['game_time_start']}' and
team1_id = {$arena[8]} and
team2_id = {$arena[11]};") or die (mysql_error());
} else echo "<B>[notice]</b> Была найдена запись об окончании игры, для которой нет информации о ее начале!
Игра {$arena[8]} vs {$arena[11]}. Тип игры - {$arena[5]} x {$arena[5]}<br />";
}
}
} else echo "Ошибка при открытии файла $arena_log_file. Возможно, файл не существует.";
fclose($fp);

echo "<br />Перенос данных успешно завершен!<br />
<a href = ?step=2>Перейти ко второму этапу...</a>";
}

###################################################################################################
#
# Второй этап
# Анализ игр на переливы
#
###################################################################################################

if (isset($_GET[step]) && $_GET[step] == 2)
{
echo "<h3>Второй этап.</h3> Анализ полученных данных.";
$sql = mysql_query("SELECT count(1) as count FROM `arena_leavers_temp`;") or die (mysql_error());
$result = mysql_fetch_array($sql);
echo "<br /><br /><li>Всего игр: <b>$result[count]</b></li>";
$sql = mysql_query("SELECT 1 FROM `arena_leavers_temp` where game_time_end = '';") or die (mysql_error());
$result = mysql_num_rows($sql);
if ($result) echo "<li>Количество игр, для которых мы не смогли найти конечные данные: <b>$result</b></li>
<small>*Возможные причины - неполный лог/краши сервера во время игр</small><br />";
$sql = mysql_query("SELECT team1_id FROM `arena_leavers_temp` where game_time_end <> ''
UNION SELECT `team2_id` FROM `arena_leavers_temp` where game_time_end <> '';") or die (mysql_error());
$result = mysql_num_rows($sql);
echo "<li>Количество команд для обработки: <b>$result</b><br />";
//заполняем "нулевую" статистику для каждой команды
mysql_query ("TRUNCATE `arena_leavers_stat`") or die(mysql_error());
while ($row=mysql_fetch_assoc($sql))
{
mysql_query ("INSERT INTO `arena_leavers_stat` VALUES ({$row[team1_id]}, '0')") or die (mysql_error());
}
//Начинаем анализ. Для расширенных логов:
if ($extended_logs)
{
$sql = mysql_query("SELECT * FROM `arena_leavers_temp` where
game_time_end <> '' and
team1_heal + team2_heal < {$min_heal} and
team1_damage + team2_damage < {$min_dmg} and
game_time_end - game_time_start < {$max_delta};") or die (mysql_error());
while ($row=mysql_fetch_array($sql))
{
switch ($row[game_type])
{
case "2":
if ($row[team1_kb] < $min_kb_2 && $row[team2_kb] < $min_kb_2)
mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
break;

case "3":
if ($row[team1_kb] < $min_kb_3 && $row[team2_kb] < $min_kb_3)
mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
break;

case "5":
if ($row[team1_kb] < $min_kb_5 && $row[team2_kb] < $min_kb_5)
mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
break;
}
}
}
//для обычных логов, смотрим только время
else
{
$sql = mysql_query("SELECT * FROM `arena_leavers_temp` where
game_time_end <> '' and
game_time_end - game_time_start < {$max_delta}") or die (mysql_error());
while ($row=mysql_fetch_array($sql))
mysql_query ("UPDATE arena_leavers_stat
set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");
}
// всё!
$sql = mysql_query("SELECT SUM(COUNT) as sum FROM `arena_leavers_stat`") or die (mysql_error());
$total = mysql_fetch_array($sql);
echo "<br />Работа скрипта завершена. <br />
Переливов выявлено: {$total[sum]}<br />
Можете использовать данные по каждой команде в таблице `arena_leavers_stat` в любых целях";
}
?>




Сообщение отредактировал Icelips - Понедельник, 02.04.2012, 17:18
 
  • Страница 1 из 1
  • 1
Поиск: