17 мар


Автор: MSW
Сайт поддержки: https://0-web.ru/

Пришла пора сделать из нашего сайта на DLE трекер!
В этом эпизоде будет рассказано как изменять адрес анонсера, генерировать паскей каждому пользователю индивидуально для каждой раздачи, подписывать раздачи, учитывать количество розданного и скачанного, делать торент приватным.

Для работы с торент файлами, тоесть их обработке, получения из них информации и изменения её, будем использовать специализированное API, дабы облегчить себе жизнь.
Сайт где можно скачать последнюю актуальную библиотеку с примерами: Torrent editor api настройка загрузки файлов на сервер, поставить разрешение на загрузку файлов torrent.

2. Далее принимаемся за редактирование скрипта загрузки файлов: /engine/inc/files.php
Находим:
                        $db->query( "INSERT INTO " . PREFIX . "_static_files (static_id, author, date, name, onserver) values ('$news_id', '$author', '$added_time', '$image_name', '{$file_prefix}{$image_name}')" );
                    
                    } else {

и добавляем ниже:
//********* Tracker by MSW *** start *********//
if(substr($image_name, -8) == ".torrent") {
    require_once( ROOT_DIR."/engine/classes/torrent/torrent.php" );
    $tr_file = ROOT_DIR."/uploads/files/".$file_prefix.$image_name;

//*** Включаем приватность торента *** start ***//
    $data = file_get_contents($tr_file);
    if($data == false) {
        @unlink( ROOT_DIR."/uploads/files/".$file_prefix.$image_name );
        $img_result .= "<div><font color=red>Ошибка чтения {$tr_file}</font></div>";
    }
    $torrent = new Torrent();
    if ($torrent->load($data) == false) {
        @unlink( ROOT_DIR."/uploads/files/".$file_prefix.$image_name );
        $img_result .= "<div><font color=red>Обнаружена ошибка: {$torrent->error}</font></div>";
    }
    $torrent->setPrivate(1);
    $data = $torrent->bencode();
    file_put_contents($tr_file, $data);
//*** Включаем приватность торента *** stop ***//

    $data = file_get_contents($tr_file);
    if($data == false) {
        @unlink( ROOT_DIR."/uploads/files/".$file_prefix.$image_name );
        $img_result .= "<div><font color=red>Ошибка чтения {$tr_file}</font></div>";
    }
    $torrent = new Torrent();
    if ($torrent->load($data) == false) {
        @unlink( ROOT_DIR."/uploads/files/".$file_prefix.$image_name );
        $img_result .= "<div><font color=red>Обнаружена ошибка: {$torrent->error}</font></div>";
    }
    $hash = $torrent->getHash();
    $e_hash = addslashes(pack("H*", $hash));
    $tr_fild = ", info_hash, ctime";
    $tr_info = ", '{$e_hash}', '".time()."'";
} else {
    $tr_fild = "";
    $tr_info = "";
}
//********* Tracker by MSW *** stop *********//


Находим ниже запрос:
                        $db->query( "INSERT INTO " . PREFIX . "_files (news_id, name, onserver, author, date) values ('$news_id', '$image_name', '{$file_prefix}{$image_name}', '$author', '$added_time')" );


Заменяем на:
                        $db->query( "INSERT INTO " . PREFIX . "_files (news_id, name, onserver, author, date{$tr_fild}) values ('$news_id', '$image_name', '{$file_prefix}{$image_name}', '$author', '$added_time'{$tr_info})" );


3. Теперь нужно подписать файл при отдаче пользователю, для этого внесём изменения в /engine/download.php
Находим:
    $row = $db->super_query ( "SELECT name, onserver FROM " . PREFIX . "_files WHERE id ='$id'" );

Заменяем на:
    $row = $db->super_query ( "SELECT name, onserver, info_hash FROM " . PREFIX . "_files WHERE id ='$id'" );


Находим:
$config['files_max_speed'] = intval ( $config['files_max_speed'] );

Добавляем выше:
//********* Tracker by MSW *** start *********//
if(substr($row['name'], -8) == ".torrent") {
    $tpv = $member_id['torrent_pass_version'];
    $tppk = $db->super_query("SELECT value FROM xbt_config WHERE name='torrent_pass_private_key'" );
    $site_key = $tppk['value'];
    $passkey = sprintf('x%s', $member_id['user_id'], substr(sha1(sprintf('%s %d %d %s', $site_key, $tpv, $member_id['user_id'], $row['info_hash'])), 0, 24));
    require_once( ROOT_DIR."/engine/classes/torrent/torrent.php" );
    $tr_file = FILE_DIR.$row['onserver'];
    $tr_file_s = FILE_DIR."t_".$row['name'];
    $data = file_get_contents($tr_file);
    $torrent = new Torrent();
    $torrent->load($data);
    $link[] = "http://".$_SERVER['HTTP_HOST'].":2710/{$passkey}/announce";
    $torrent->setTrackers($link);
    $data = $torrent->bencode();
    file_put_contents($tr_file_s, $data);
} else $tr_file_s = FILE_DIR.$row['onserver'];
//********* Tracker by MSW *** stop *********//


Найти:
$file = new download ( FILE_DIR . $row['onserver'], $row['name'], $config['files_force'], $config['files_max_speed'] );

Заменить на:
$file = new download ( $tr_file_s, $row['name'], $config['files_force'], $config['files_max_speed'] );


Найти:
?>

Добавить выше:
//********* Tracker by MSW *** start *********//
@unlink( $tr_file_s );
//********* Tracker by MSW *** stop *********//


4. Теперь добавим в профиль пользователя отображение скачанного и розданного

4.1. Файл: /engine/modules/functions.php
Найти:
if( ! defined( 'DATALIFEENGINE' ) ) {
    die( "Hacking attempt!" );
}

Добавить ниже:
//********* Tracker by MSW *** start *********//
function mksize($bytes) {
    if ($bytes < 1000 * 1024)
        return number_format($bytes / 1024, 2) . " kB";
    if ($bytes < 1000 * 1048576)
        return number_format($bytes / 1048576, 2) . " MB";
    if ($bytes < 1000 * 1073741824)
        return number_format($bytes / 1073741824, 2) . " GB";
    if ($bytes < 1000 * 1099511627776)
        return number_format($bytes / 1099511627776, 2) . " TB";
    if ($bytes < 1000 * 1125899906842620)
        return number_format($bytes / 1125899906842620, 2) . " PB";
    if ($bytes < 1000 * 1152921504606850000)
        return number_format($bytes / 1152921504606850000, 2) . " EB";
}
//********* Tracker by MSW *** stop *********//


4.2. Файл: /engine/modules/profile.php
Найти:
    $tpl->set( '{icq}', stripslashes( $row['icq'] ) );

Добавить ниже:
//********* Tracker by MSW *** start *********//
$tbx_up = mksize($row['uploaded']);
$tbx_dw = mksize($row['downloaded']);
$tbx_ratio = ($row['downloaded']>0) ? round($row['uploaded']/$row['downloaded'],2) : 0;
$tpl->set('{tbx_up}', $tbx_up);
$tpl->set('{tbx_dw}', $tbx_dw);
$tpl->set('{tbx_ratio}', $tbx_ratio);
//********* Tracker by MSW *** stop *********//


4.3. Файл: /templates/ВАША_ТЕМА/userinfo.tpl
В нужном месте добавить:
<br/><hr>
                Скачал: {tbx_dw}<br />
                Раздал: {tbx_up}<br />
                Рейтинг: {tbx_ratio}
<br/><hr>


Данная инструкция и файлы АПИ можно получить в архиве:
Внимание! У вас нет прав для просмотра скрытого текста.



Итак теперь у нас есть практически полноценный трекер на ДЛЕ.

Из цикла статей XBT + DLE мы получили рабочий трекер, минимальной конфигурации, с минимум изменений в скриптах движка ДЛЕ.
Далее дело каждого индивидуально как расширять функционал своего трекера.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.