![]() |
![]() |
ВходЗдравствуйте, Гость ( Вход | Регистрация )
|
![]() |
![]()
Сообщение
#1
|
|
x_X ![]() Группа: Дизайнеры Сообщений: 633 Регистрация: 12.4.2008 Из: :( Украина :( Пользователь №: 3,219 Спасибо сказали: 229 Вставить ник ![]() |
Для начала надо поднять backend трекера - т.е. именно серверную часть.
Выбран был в этом качестве XBT - http://xbtt.sourceforge.net/ Процедура инсталяции там описана, скажу лишь что поскольку у меня была Slackware - мне пришлось скачать библиотеку libboost вручную. libboost можно найти здесь - http://www.boost.org/ Скачал, стандартно комбинация из трех волшебных команд configure, make, make install - ничего необычного Затем по инструкции с http://xbtt.sourceforge.net/tracker/ забрал и собрал XBT Tracker: svn co https://xbtt.svn.sourceforge.net/svnroot/xbtt/trunk/xbt/misc xbt/misc svn co https://xbtt.svn.sourceforge.net/svnroot/xb...unk/xbt/Tracker xbt/Tracker cd xbt/Tracker ./make.sh Тут тоже ничего необычного, все собралось, имеем в результате исполняемый файл xbt_tracker Перед запуском серверной части сначала необходимо еще создать нужные таблицы. Я немного модифицировал скрипт входящий в комплект - кое-где добавил дополнительные поля, плюс добавил триггеров. Здесь его можно скачать отдельно, либо сразу со всеми файлами в архиве Создать таблицы я решил для простоты в той же БД что и сами форумы. Почему использовал триггеры? От лени - ситуация когда добавляется новый пользователь в форумах - для того, чтобы он мог работать мне проще показалось решить не ковырянием кода форума - а просто навешиванием простейшего триггера. Обработать ситуацию удаления торрент-файла - тоже показалось проще через тригеры. Все, теперь можно и запустить xbt_tracker. Рисуем ему в конфиге логины и пароли для доступа к нужным ему таблицам (а нужны ему только таблицы xbt_* - поэтому, можно и даже нужно, создать отдельного mysql пользователя имеющего доступ _только_ к этим таблицам) конфиг xbt_tracker.conf получился примерно таким ЦИТАТА //-------------------------- mysql_host = ip mysql_user = user mysql_password = pass mysql_database = ipb_db announce_interval = 1800 anonymous_connect = 0 anonymous_announce = 0 anonymous_scrape = 0 auto_register = 0 clean_up_interval = 60 listen_check = 0 listen_ipa = * listen_port = 2710 log_access = 0 log_announce = 0 log_scrape = 0 pid_file = read_config_interval = 300 read_db_interval = 60 redirect_url = scrape_interval = 60 update_files_method = 2 write_db_interval = 60 debug = 0 //-------------------------- Запускаем. Кстати, должен сказать - сам xbt_tracker у меня запущен на совсем другом сервере, отличном от того, на котором находится инвижновский форум и его БД. Теперь начинаем поднимать frontend - т.е. править исходники инвижновского форума чтобы можно было работать с трекером (IMG:http://antislaed.net/style_emoticons/default/smile.gif) . Все нижесказанное для форумов версии 2.2.2, русской версии. Для начала заходим в админскую часть и прописываем там разрещение для прикрепления файлов с расширением ".torrent" Закладка "Управление", раздел "Прикрепляемые файлы". Затем не выходя из админки надо сделать изменения для интерфейса. Закладка "Внешний вид", в каждом используемом стиле выбираем "изменить HTML-шаблоны". Находим skin_topic, там находим Show_attachments В самом конце добавляем код из этого файла (надо скачать его к себе и открыть в любом текстовом редакторе - при открытии в интернет-эксплорер он покажет пустоту (IMG:http://antislaed.net/style_emoticons/default/wink.gif) ) Аналогично надо найти skin_profile, там найти personal_portal_main и добавить код из этого файла Код лучше всего мне кажется добавить надо после раздела <!-- / Custom Fields --> и перед разделом <!-- Statistics --> Все, в админке закончили, теперь надо править сам код инвижна Если вы скачаете архив со всеми файлами есть очень большая вероятность того что вам подойдут патчи, и все будет очень просто - надо будет просто их применить к двум файлам: class_attach.php из каталога sources/classes/attach и profile.php из каталога sources/action_public Если нет - то пытаемся ручками все сделать (IMG:http://antislaed.net/style_emoticons/default/smile.gif) Для начала необходимо скопировать библиотеку benc.php для работы с торрент-файлами в каталог /sources форума. Взять ее можно из этого архива, либо здесь В каталоге sources/classes/attach находим файл class_attach.php Находим функцию show_attachment (примерно 209 строка) Находим блок кода (пр. 298 строка) ЦИТАТА //----------------------------------------- // Open and display the file.. //----------------------------------------- //$contents = file_get_contents( $file ); header( "Content-Type: ".$this->ipsclass->cache['attachtypes'][ $attach['attach_ext'] ]['atype_mimetype'] ); header( "Content-Disposition: inline; filename=\"".$attach['attach_file']."\"" ); header( "Content-Length: ".(string)(filesize( $file ) ) ); //print $contents; readfile( $file ); exit(); Заменяем на свой ЦИТАТА //----------------------------------------- // Open and display the file.. //----------------------------------------- //$contents = file_get_contents( $file ); if(strcasecmp($attach['attach_ext'], "torrent")) { header( "Content-Type: ".$this->ipsclass->cache['attachtypes'][ $attach['attach_ext'] ]['atype_mimetype'] ); header( "Content-Disposition: inline; filename=\"".$attach['attach_file']."\"" ); header( "Content-Length: ".(string)(filesize( $file ) ) ); readfile( $file ); exit(); } else { $ibz_sql = $this->ipsclass->DB->query("SELECT torrent_pass FROM xbt_users WHERE uid ='".addslashes($this->ipsclass->member['id'])."' LIMIT 1"); $this->ipsclass->DB->simple_exec(); $r = $this->ipsclass->DB->fetch_row($ibz_sql); header( "Content-Type: ".$this->ipsclass->cache['attachtypes'][ $attach['attach_ext']]['atype_mimetype'] ); header( "Content-Disposition: inline; filename=\"".$attach['attach_file']."\"" ); require_once( ROOT_PATH."sources/benc.php" ); $torrent = bdec_file($file, 1 << 20); // Для отключения DHT // $torrent["value"]["info"]["value"]["private"]["value"] = 1; // 172.20.0.4 замените на свой ип-адрес $torrent["value"]["announce"]["value"] = "http://172.20.0.4:2710/".$r['torrent_pass']."/announce"; header( "Content-Length: ".(string)(strlen( benc($torrent) ) ) ); print benc($torrent); exit(); } Находим функцию render_attachments (приимерно 340-я строка оригинального файла) Находим блок (примерно 520-я строка оригинального файла) ЦИТАТА // Full attachment thingy //----------------------------------------- $tmp = $this->ipsclass->compiled_templates[ $skin_name ]->Show_attachments( array ( 'attach_hits' => $row['attach_hits'], 'mime_image' => $this->ipsclass->cache['attachtypes'][ $row['attach_ext'] ]['atype_img'], 'attach_file' => $row['attach_file'], 'attach_id' => $row['attach_id'], 'type' => $this->type, 'file_size' => $this->ipsclass->size_format( $row['attach_filesize'] ), ) ); И заменяем на свой код ЦИТАТА if($row['attach_ext']=="torrent") { $ibz_sql = $this->ipsclass->DB->query("SELECT info_hash, leechers, seeders,completed, files_size, files_count FROM xbt_files WHERE attach_id = '".$row['attach_id']."' LIMIT 1"); $this->ipsclass->DB->simple_exec(); $r = $this->ipsclass->DB->fetch_row($ibz_sql); $tmp = $this->ipsclass->compiled_templates[ $skin_name ]->Show_attachments(array ( 'attach_hits' => $row['attach_hits'], 'mime_image' => $this->ipsclass->cache['attachtypes'][ $row['attach_ext'] ]['atype_img'], 'attach_file' => $row['attach_file'], 'attach_id' => $row['attach_id'], 'type' => $this->type, 'file_size' => $this->ipsclass->size_format( $row['attach_filesize'] ), 'is_torrent' => 1, 'seeders' => (int)$r['seeders'], 'leechers' => (int)$r['leechers'], 'completed' => (int)$r['completed'], 'torrent_files_size' => $this->ipsclass->size_format( $r['files_size'] ), 'torrent_files_count' => (int)$r['files_count'], 'info_hash' => bin2hex($r["info_hash"]), ) ); } else { $tmp = $this->ipsclass->compiled_templates[ $skin_name ]->Show_attachments(array ( 'attach_hits' => $row['attach_hits'], 'mime_image' => $this->ipsclass->cache['attachtypes'][ $row['attach_ext'] ]['atype_img'], 'attach_file' => $row['attach_file'], 'attach_id' => $row['attach_id'], 'type' => $this->type, 'file_size' => $this->ipsclass->size_format( $row['attach_filesize'] ), 'is_torrent' => 0, ) ); } Находим функцию process_upload (примерно 766 строка оригинального файла) В самом ее конце между кодом ЦИТАТА $this->ipsclass->DB->do_insert( 'attachments', $attach_data ); $newid = $this->ipsclass->DB->get_insert_id(); И строкой (примерно 961-я строка оригинального файла) return $newid; Вставляем свой код ЦИТАТА if (!strcasecmp($attach_data['attach_ext'], 'torrent')) { require_once( ROOT_PATH."sources/benc.php" ); $torrent = bdec_file($upload->saved_upload_name, 1 << 20); if (!isset($torrent)) return $attach_data; $bt_info_hash = pack('H*', sha1($torrent['value']['info']['string'])); $torrent_files_count = count($torrent["value"]["info"]["value"]["files"]["value"]); if($torrent_files_count == 0) { $torrent_files_count = 1; $bt_size = $torrent["value"]["info"]["value"]["length"]["value"]; } else { $bt_size = 0; for($torrent_i=0;$torrent_i<$torrent_files_count;$torrent_i++) { $bt_size += $torrent["value"]["info"]["value"]["files"]["value"][$torrent_i]["value"]["length"]["value"]; } } $this->ipsclass->DB->query("insert into xbt_files (info_hash, ctime, files_size, attach_id,files_count) values ('".addslashes($bt_info_hash)."', Now(), '$bt_size', $newid, $torrent_files_count)"); } Редактирование class_attach.php завершено Переходим к редактированию файла sources/action_public/profile.php Находим функцию personal_portal_view (примерно 2446-я строка) Находим блок (примерно 3017-я строка) ЦИТАТА //----------------------------------------- // Online location //----------------------------------------- $member = $this->personal_portal_get_user_location( $member );^M Добавляем после него свой код ЦИТАТА $ibz_sql = $this->ipsclass->DB->query("SELECT can_leech, wait_time, torrents_limit, downloaded, uploaded FROM xbt_users WHERE uid = '".$member['id']."' LIMIT 1"); $this->ipsclass->DB->simple_exec(); $r = $this->ipsclass->DB->fetch_row($ibz_sql); if(($r['downloaded'] <> 0)||($r['uploaded']<>0)) { $member['show_torrent_stats'] = 1; } else { $member['show_torrent_stats'] = 0; } $member['show_torrent_uploaded'] = $this->ipsclass->size_format( $r['uploaded'] ); $member['show_torrent_downloaded'] = $this->ipsclass->size_format( $r['downloaded'] ); if($r['downloaded']==0) { $member['show_torrent_ratio'] = 'inf'; } else { $member['show_torrent_ratio'] = number_format($r['uploaded'] / $r['downloaded'], 2); } if( $r['can_leech'] != 1 ) { $member['show_torrent_limit'] = "запрещено скачивать"; } else { if( $r['torrents_limit'] == 0 ) { $member['show_torrent_limit'] = "разрешено скачивать сколько угодно торентов"; } else { $member['show_torrent_limit'] = "разрешено скачивать ".$r['torrents_limit']." торент(ов|а)"; } } if( $r['wait_time'] != 0 ) { $member['show_torrent_limit'] .= "<br>Пауза для новых торрентов = ".$r['wait_time']." секунд"; } Все, редактирование завершено Теперь - создаем торрент-файл (в uTorrent'е я создавал с announce url="http://" и сам ставил флаг приватного торрента). Прикрепляем его к своему сообщению. Затем заново его скачиваем (при этом в этот торрент-файл уже автоматически заполнится мой хеш, и урл трекера) - указываем исходный файл, и вуаля. Вот картинки как это примерно выглядит: (IMG:http://www.ibz.ru/articles/tracker/topic.gif) (IMG:http://www.ibz.ru/articles/tracker/profile.gif) Конечно все очень просто - но минимум необходимого для быстрого старта есть. Есть куда и развивать дальше. (IMG:http://antislaed.net/style_emoticons/default/smile.gif) © IBZ.ru |
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25 April 2025 - 19:41 |