[help] vbtt for php

Статус
В этой теме нельзя размещать новые ответы.

Axom

Постоялец
Регистрация
25 Апр 2007
Сообщения
320
Реакции
105
Я знаю что таких опций нет, но мне утверждают обратное, хотя мало ли...

  1. Можно ли определённому пользователю дать прав просмотра удалённых сообщений (не путайте с уведомлением об удалении, а чтобы мог и читать удалённые сообщения)?
  2. Можно ли поставить модератора в раздел, в котором есть подразделы, но чтобы он был модератором только того раздела, куда его поставили и без подразделов?
 
Нет, по умолчанию таких опций нет, нужно писать или искать специализированные хаки.
 
  • Нравится
Реакции: Axom
Не хотел новой темы создавать, может здесь кто нибудь поможет.

Помогите заставить этот код обновлять информацию о сидерах и личерах почаще. Если можно, то раз в 10 мин.
PHP:
<?php
/**
* VBulletin Torrent Tracker v3.0 Beta 3.0.3
* Coded by SqrtBoy & Toolmanwill (www.phpsoft.org)
**/ 
 
// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
 
// ######################### REQUIRE BACK-END ############################
require_once('includes/config.php');
 
// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT', 'announce');
define('NO_REGISTER_GLOBALS', 1);
define('TABLE_PREFIX', $config['Database']['tableprefix']);
 
// ############################ FUNCTIONS ################################
 
function err($string)
{
    echo 'd14:failure reason'.strlen($string).':'.$string.'e';
    exit();
}
 
function detect_client($peer_id)
{
// Last updated on 03/23/2006 based on http://wiki.theory.org/BitTorrentSpecification
 
if (substr($peer_id,0,3) == "XBT")
    return "XBT Client ".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,4) == "exbc")
    return "BitComet";
else if (substr($peer_id,0,2) == "OP")
    return "Opera 8 build".substr($peer_id,2,4);
else if (substr($peer_id,0,3) == "-AZ")
    return "Azureus ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-BB")
    return "BitBuddy".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-CT")
    return "CTorrent ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};    
else if (substr($peer_id,0,3) == "-MT")
    return "MoonlightTorrent ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-LT")
    return "Libtorrent ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-BX")
    return "Bittorrent X ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};    
else if (substr($peer_id,0,3) == "-TS")
    return "TorrentStorm ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-UT")
    return "uTorrent ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-QT")
    return "QT 4 ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-BC")
    return "BitComet ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-BL")
    return "BitLord ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-SZ")
    return "Shareaza ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-RT")
    return "Retriever ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-LP")
    return "Lphant ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-TN")
    return "TorrentDotNet ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-SS")
    return "SwarmScope ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-XT")
    return "XanTorrent ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-BS")
    return "BTSlave ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-ZT")
    return "ZipTorrent ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};    
else if (substr($peer_id,0,3) == "-AR")
    return "Artic ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-SB")
    return "Swiftbit ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-MP")
    return "MooPolice ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,3) == "-lt")
    return "libTorrent ".$peer_id{3}.".".$peer_id{4}.".".$peer_id{5}.".".$peer_id{6};
else if (substr($peer_id,0,1) == "S" && is_int(substr($peer_id,1,3)))
    return "Shadow ".$peer_id{1}.".".$peer_id{2}.".".$peer_id{3};
else if (substr($peer_id,0,1) == "U" && is_int(substr($peer_id,1,3)))
    return "UPnP NAT Bit Torrent ".$peer_id{1}.".".$peer_id{2}.".".$peer_id{3};
else if (substr($peer_id,0,1) == "T" && is_int(substr($peer_id,1,3)))
    return "BitTornado ".$peer_id{1}.".".$peer_id{2}.".".$peer_id{3};
else if (substr($peer_id,0,1) == "O" && is_int(substr($peer_id,1,3)))
    return "Osprey Permaseed ".$peer_id{1}.".".$peer_id{2}.".".$peer_id{3};
else if (substr($peer_id,0,2) == "M4" || substr($peer_id,0,2) == "M3")
    return  "Bittorrent ".str_replace("-",".",substr($peer_id,1,5));
else if (substr($peer_id,0,1) == "A" || substr($peer_id,0,2) == "A")
    return  "ABC ".$peer_id{1}.".".$peer_id{2}.".".$peer_id{3};
else
    return "Unknown";
 
}
 
function hash_where($name, $hash) {
    $shhash = preg_replace('/ *$/s', "", $hash);
    return "(".$name." = '" . $hash . "' OR ".$name." = '" . $shhash . "')";
}
 
function not_hash_where($name, $hash) {
    $shhash = preg_replace('/ *$/s', "", $hash);
    return "(".$name." != '" . $hash . "' AND ".$name." != '" . $shhash . "')";
}
 
function benc_str($s) {
    return strlen($s) . ":".$s;
}
 
function hex2bin($hex)
{
        $result = '';
        for ($i = 0; $i < strlen($hex); $i += 2)
                $result .= chr(hexdec(substr($hex,$i,2)));
        return $result;
}
 
// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################
 
header('Content-type: text/plain');
header('Pragma: no-cache');
 
 
// we rebuild the correct query string to be processed by the announce !
$query = $_SERVER["QUERY_STRING"];
 
if (strpos($query,"?info_hash") !== false)
{
// ADDED BY DjKiruban START------------------------------------------------------
$announce = "http://www.yourdomaine.net/forum/announce.php";
// ADDED BY DjKiruban END-------------------------------------------------------------    
 
    header("Location: ".$announce."?".str_replace("?info_hash","&info_hash",$query));
}
 
 
// this page can be requested only by bittorrent clients !
/*
$agent = $_SERVER["HTTP_USER_AGENT"];
if ( strpos($agent, "Mozilla") === 0 || strpos($agent, "Opera") === 0|| strpos($agent, "Links") === 0 || strpos($agent, "Lynx") === 0 || strpos($agent, "curl") === 0) 
    err("You are not allowed to view this page with a browser"); 
 
*/
/*
$_GET['info_hash'] = hex2bin('d728d5a3266e5e3099366833f1b63ff69188060b');
$_GET['ip'] = '83.10.10.10';
$_GET['passkey'] = '4bec6b05aee6dcd590c564b80d7be24a';
$_GET['port'] = rand(20, 120);
$_GET['uploaded'] = rand(20, 120000);
$_GET['downloaded'] = rand(20, 120000);
$_GET['peer_id'] = 'S588-----gqQ8TqDeqaY';
$_GET['left'] = 0; //rand(0, 3000000);
$_GET['event'] = 'started';
$_GET['numwant'] = 50;
$_GET['compact'] = 0;
*/
 
 
 
// we connect to the database
 
$link = mysql_connect($config['MasterServer']['servername'], $config['MasterServer']['username'], $config['MasterServer']['password']);
if (!$link) {
   err ('VBTT 3.0: Database Error. Can\'t connect to database !');
}
 
// select the current db
$db_selected = mysql_select_db($config['Database']['dbname'], $link);
if (!$db_selected) {
   err ('VBTT 3.0: Databse Error. Can\'t select database !');
}
 
// we parse the input of the client
 
$req = "passkey:info_hash:peer_id:!ip:port:uploaded:downloaded:left:!event:compact";
foreach (explode(":", $req) as $x)
{
    if ($x[0] == "!")
    {
        $x = substr($x, 1);
        $opt = 1;
    }
    else
        $opt = 0;
 
    if (!isset($_GET[$x]))
    {
        if (!$opt)
            err("VBTT 3.0: Error, missing key ($x)");
 
        $_GET[$x] = "";            
    }
 
    if (get_magic_quotes_gpc())
    {
        $GLOBALS[$x] = stripslashes($_GET[$x]);
    }
    else $GLOBALS[$x] = $_GET[$x];
}
 
/*if (strpos($passkey, "?")) {
 
    $tmp = substr($passkey, strpos($passkey, "?"));
    $passkey = substr($passkey, 0, strpos($passkey, "?"));
    $tmpname = substr($tmp, 1, strpos($tmp, "=")-1);
    $tmpvalue = substr($tmp, strpos($tmp, "=")+1);
    $GLOBALS[$tmpname] = $tmpvalue;
 
} */
 
 
$info_hash = bin2hex($info_hash);
 
if (strlen($info_hash) != 40)
{
    err('VBTT 3.0: Invalid info_hash submitted value');
}
 
if (strlen($passkey) != 32)
    err("VBTT 3.0: Invalid Passkey");
 
 
// we retrieve the user ip address
 
$ip = $_SERVER['REMOTE_ADDR'];
$agent = detect_client($peer_id);
$port = 0 + $port;
$uploaded = 0 + $uploaded;
$downloaded = 0 + $downloaded;
$left = 0 + $left;
 
$rsize = 50;
foreach(array("num want", "numwant", "num_want") as $k)
{
    if (isset($_GET[$k]))
    {
        $rsize = 0 + $_GET[$k];
        break;
    }
}
 
if (!$port || $port > 0xffff)
    err("VBTT 3.0: Invalid port");
 
$seeder = ($left == 0) ? "yes" : "no";
$info_hash = strtolower($info_hash);
 
// to be added in next beta
// check if the user is authorized on tracker and usergroup allowed on tracker
 
// Is peer already active on tracker ?
 
$updateset = array();
 
$res = mysql_query("SELECT * FROM ". TABLE_PREFIX ."peers WHERE passkey='".$passkey."' AND info_hash = '".$info_hash."' AND " . hash_where("peer_id", $peer_id) ." LIMIT 1") or err("VBTT 3.0: ".mysql_error());
$row = mysql_fetch_array($res);
// peer is already active on tracker
 
if ($row) 
{
    $self = $row;
}
else
{
// we create the peer on the tracker for the given info_hash
 
 
 
        if ($event != "stopped")
        {
            $connectable = "yes";
 
            // comment this part if you experience slow down and connection problems to server
            /*
 
            $sockres = @fsockopen($ip, $port, $errno, $errstr, 5);
            if (!$sockres)
                $connectable = "no";
            else
            {
                $connectable = "yes";
                @fclose($sockres);
            }
 
            */            
 
            $ret = mysql_query("INSERT INTO ". TABLE_PREFIX ."peers ( passkey, connectable, info_hash, peer_id, ip, port, uploaded, downloaded, to_go, started, last_action, seeder, agent) VALUES ('".$passkey."','".$connectable."', '".$info_hash."', '" . mysql_escape_string($peer_id) . "', '" . $ip . "', ".$port.", ".$uploaded.", ".$downloaded.", ".$left.", NOW(), NOW(), '".$seeder."','".$agent."')") or err("VBTT 3.0: ".mysql_error()); 
 
 
 
            if ($ret)
            {
 
                if ($seeder == "yes")
 
                    $updateset[] = "seeders = seeders + 1";
 
                else
 
                    $updateset[] = "leechers = leechers + 1";
 
            }
        }    
}    
 
 
 
// we output the list of peers on the tracker
 
$fields = "seeder, peer_id, ip, port, uploaded, downloaded, lastup, lastdown ,last_action";
$limit = "ORDER BY RAND() LIMIT $rsize";
 
$res = mysql_query("SELECT ".$fields." FROM ". TABLE_PREFIX ."peers WHERE info_hash = '".$info_hash."' AND ".not_hash_where("peer_id", $peer_id)." ".$limit) or err("VBTT 3.0: ".mysql_error());
 
 
if($_GET['compact'] != 1)
{
$resp = "d" . benc_str("interval") . "i1800e" . benc_str("peers") . "l";
}
else
{
$resp = "d" . benc_str("interval") . "i1800e5:"."peers";
}
 
 
$peer = array();
while ($row = mysql_fetch_array($res))
{
    if($_GET['compact'] != 1)
    {
 
        $row["peer_id"] = str_pad($row["peer_id"],20);
 
        $resp .= "d" .
            benc_str("ip") . benc_str($row["ip"]);
            if (!$_GET['no_peer_id']) {
                $resp .= benc_str("peer id") . benc_str($row["peer_id"]);
            }
            $resp .= benc_str("port") . "i" . $row["port"] . "e" .
            "e";
    }
    else
    {
        $peer[] = pack('Nn', ip2long($row["ip"]), $row["port"]);
        $peer_num++;    
    }
}
 
 
 
if ($_GET['compact']!=1)
$resp .= "ee";
else
{
    for($i=0;$i<$peer_num;$i++)
        {
            $o .= $peer[$i];
        }
$resp .= strlen($o) . ':' . $o . 'e';
}
 
 
// we update user stats
 
$selfwhere = "passkey='".$passkey."' AND info_hash = '$info_hash' AND " . hash_where("peer_id", $peer_id) ." LIMIT 1";
 
 
$last_uploaded = isset($self['uploaded']) ? $self['uploaded'] : 0;
$last_downloaded = isset($self['downloaded']) ? $self['downloaded'] : 0;
$time= isset($self["last_action"]) ? (int)(strtotime( "now" ) -  strtotime( $self["last_action"] )) : 0;
if ($time >0)
{
    $ulspeed = abs($uploaded - $last_uploaded) / $time;
    $dlspeed = abs($downloaded - $last_downloaded) / $time;
}
else
{
    $ulspeed = 0;
    $dlspeed = 0;    
}
 
$diff_uploaded = max($uploaded - $last_uploaded,0);
$diff_downloaded = max($downloaded - $last_downloaded,0);
 
 
 
mysql_query("UPDATE " . TABLE_PREFIX . "user SET ulspeed = ".$ulspeed.", dlspeed = ".$dlspeed.", uploaded = uploaded + ".$diff_uploaded.", downloaded = downloaded + ".$diff_downloaded."  WHERE passkey='".$passkey."'") or err("VBTT 3.0: ".mysql_error()); 
 
// we update the peer stats
if ($event == "stopped")
{
        mysql_query("DELETE FROM ". TABLE_PREFIX ."peers WHERE ".$selfwhere) or err("VBTT 3.0: ".mysql_error());
        if (mysql_affected_rows())
        {
            if ($seeder == "yes")
                $updateset[] = "seeders = seeders - 1";
            else
                $updateset[] = "leechers = leechers - 1";
        }
}
else
{
 
 
    if ($event == "completed")
    {    
        $updateset[] = "completed = completed + 1";
        $updateset[] = "completed_by = CONCAT(completed_by,';".$self['userid']."')";
    }
 
 
    mysql_query("UPDATE ". TABLE_PREFIX. "peers SET ip = '" . $ip . "',agent='".$agent."', port = ".$port.", uploaded = ".$uploaded.", downloaded = ".$downloaded.", lastup = ".$last_uploaded.", lastdown = ".$last_downloaded.", ulspeed = ".$ulspeed.", dlspeed= ".$dlspeed.", to_go = ".$left.", last_action = NOW(), seeder = '".$seeder."' WHERE ".$selfwhere) or err("VBTT 3.0: ".mysql_error());
 
    if ($self["seeder"] != $seeder && isset($self["seeder"]) )
    {
        if ($seeder == "yes")
        {
            $updateset[] = "seeders = seeders + 1";
            $updateset[] = "leechers = leechers - 1";
        }
        else
        {
            $updateset[] = "seeders = seeders - 1";
            $updateset[] = "leechers = leechers + 1";
        }
    }
 
}
 
 
if (count($updateset))
    mysql_query("UPDATE " . TABLE_PREFIX . "attachment SET " . join(",", $updateset) . " WHERE info_hash = '".$info_hash."'") or err("VBTT 3.0: ".mysql_error());
 
 
if ($_SERVER["HTTP_ACCEPT_ENCODING"] == "gzip") {
    header("Content-Encoding: gzip");
    echo gzencode($resp, 9, FORCE_GZIP);
} 
else echo $resp;
 
?>
 
Народ, ну помогите пожалуйста, уже замучился :(((
 
Помогите заставить этот код обновлять информацию о сидерах и личерах почаще. Если можно, то раз в 10 мин.
Не совсем тебя понял... То есть сейчас он обновляет информацию, только при обращнии к нему? или как? Если так, то поставь его через админку воблы в запланированные задачи...
 
  • Нравится
Реакции: Axom
g0rn, там было уже прописано из xml файла, но обновлялось только раз в месяц, поменял настройки, помогло, спасибо!

Вот ещё один баг, когда появляются скачавшие, то вылазиет вот что вместо темы:
SELECT userid,username FROM user WHERE userid IN (360, 322, 322, );

MySQL Error : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

Походу что-то не то в этом коде, или надо мисульку обновить с 4 до 5?:
$query_user = $db->query("SELECT userid,username FROM " . TABLE_PREFIX . "user WHERE userid IN (" .str_replace(";",", ",$attachment[completed_by]). ")");
 
g0rn, там было уже прописано из xml файла, но обновлялось только раз в месяц, поменял настройки, помогло, спасибо!

Вот ещё один баг, когда появляются скачавшие, то вылазиет вот что вместо темы:
SELECT userid,username FROM user WHERE userid IN (360, 322, 322, );

MySQL Error : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

Походу что-то не то в этом коде, или надо мисульку обновить с 4 до 5?:
$query_user = $db->query("SELECT userid,username FROM " . TABLE_PREFIX . "user WHERE userid IN (" .str_replace(";",", ",$attachment[completed_by]). ")");
Попробуй так:
Замени
PHP:
str_replace(";",", ",$attachment[completed_by])
на
PHP:
str_replace(";",", ",substr($attachment[completed_by], 0, strlen($attachment[completed_by])-1))
 
  • Нравится
Реакции: Axom
От ошибки помогло, но теперь не все и не те скачавшие отображаются :)

Вот так выглядет код:
PHP:
 if ($attachment[completed_by] != "")
 { 
  if ($attachment[completed_by]{0} == ";")
   $attachment[completed_by] = substr($attachment[completed_by],1);
   
  $query_user = $db->query("SELECT userid,username FROM " . TABLE_PREFIX . "user WHERE userid IN (" .str_replace(";",", ",substr($attachment[completed_by], 0, strlen($attachment[completed_by])-1)). ")");
     while ($result_user = $db->fetch_array($query_user) )
  {    
  $s .= '<a href="member.php?u='.$result_user['userid'].'">'.$result_user['username'].'</a>, ';
  }
  
  $s = substr($s,0,-2)."</td>";
 }
 else 
 {
  $s .= "Nobody has completed this torrent yet !</td>";
 }
 
  $s.="<td width=\"25%\" align=\"right\">";
  
  require_once('charts.php');
 
От ошибки помогло, но теперь не все и не те скачавшие отображаются :)

Вот так выглядет код:
PHP:
 if ($attachment[completed_by] != "")
 { 
  if ($attachment[completed_by]{0} == ";")
   $attachment[completed_by] = substr($attachment[completed_by],1);
   
  $query_user = $db->query("SELECT userid,username FROM " . TABLE_PREFIX . "user WHERE userid IN (" .str_replace(";",", ",substr($attachment[completed_by], 0, strlen($attachment[completed_by])-1)). ")");
     while ($result_user = $db->fetch_array($query_user) )
  {    
  $s .= '<a href="member.php?u='.$result_user['userid'].'">'.$result_user['username'].'</a>, ';
  }
  
  $s = substr($s,0,-2)."</td>";
 }
 else 
 {
  $s .= "Nobody has completed this torrent yet !</td>";
 }
 
  $s.="<td width=\"25%\" align=\"right\">";
  
  require_once('charts.php');
Ммм.. А попробуй перед
PHP:
 if ($attachment[completed_by] != "")
Поставить exit($attachment[completed_by]); или echo($attachment[completed_by]); или var_dump($attachment[completed_by]); ну и собственно написать сюда результат - значение переменной $attachment[completed_by].
Потом буду смотреть, что не так.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху