Buongiorno a tutti del Forum!
Ho deciso di chiedere il vostro aiuto dopo una mattinata di ricerche infruttuose riguardo il mio problema.
Praticamente per un sito al quale sto lavorando avrei bisogno di uno script che acceda alla rete IRC, si colleghi ad un server, si logghi in un canale e scarichi un pack da un bot utilizzando il comando XDCC.
Dopo un po' di ricerche ho trovato uno script (che si chiama XDCC Fetcher e viene rilasciato con licenza GNU) che sembra fare al caso mio.
Infatti fa esattamente quello che ho detto: dato il server, il bot e il numero di pack comincia lo scaricamento...il mio problema è che salva il file su una cartella del server.
Quindi vengo alla mia domanda: è possibile fare in modo che il file venga invece salvato sul pc del client, ovvero con la classica finestra di dialogo che chiede dove salvare il file e poi comincia lo scaricamento?
Grazie a tutti per la disponibilità!!!
Di seguito trovate il codice delle pagine principali, praticamente la pagina index chiede di inserire i dati per lo scaricamento e la pagina client.php lo esegue materialmente, quindi le modifiche sarebbero da fare probabilmente solo in questa pagina, ma non sono riuscito a capire come...comunque lo script è scaricabile interamente da http://webscripts.softpedia.com/scr...her--36626.html
client.php (la pagina che effettua materialmente la connessione e il salvataggio):
config.php
Ho deciso di chiedere il vostro aiuto dopo una mattinata di ricerche infruttuose riguardo il mio problema.
Praticamente per un sito al quale sto lavorando avrei bisogno di uno script che acceda alla rete IRC, si colleghi ad un server, si logghi in un canale e scarichi un pack da un bot utilizzando il comando XDCC.
Dopo un po' di ricerche ho trovato uno script (che si chiama XDCC Fetcher e viene rilasciato con licenza GNU) che sembra fare al caso mio.
Infatti fa esattamente quello che ho detto: dato il server, il bot e il numero di pack comincia lo scaricamento...il mio problema è che salva il file su una cartella del server.
Quindi vengo alla mia domanda: è possibile fare in modo che il file venga invece salvato sul pc del client, ovvero con la classica finestra di dialogo che chiede dove salvare il file e poi comincia lo scaricamento?
Grazie a tutti per la disponibilità!!!
Di seguito trovate il codice delle pagine principali, praticamente la pagina index chiede di inserire i dati per lo scaricamento e la pagina client.php lo esegue materialmente, quindi le modifiche sarebbero da fare probabilmente solo in questa pagina, ma non sono riuscito a capire come...comunque lo script è scaricabile interamente da http://webscripts.softpedia.com/scr...her--36626.html
client.php (la pagina che effettua materialmente la connessione e il salvataggio):
PHP:
<?php
set_time_limit(0);
ignore_user_abort(true);
register_shutdown_function("xfdie");
include "config.php";
include "raw.php";
if ($showrealtime == false) {
echo "<script>window.location.href='index.php?clientstarted=yes&" . $_SERVER["QUERY_STRING"] . "';</script>";
flush();
}
else {
echo "<pre>";
}
$killed = false;
$handle = "";
$dcc = "";
$timer = "";
function xfwrite ($data, $echo = true) {
if (substr($data,-1) != "\n") { $data .= "\n"; }
fwrite($GLOBALS["fp"],$data);
if ($echo) { xfecho($data, "blue"); }
}
function p ($num) {
if (isset($GLOBALS["parse"][$num])) {
return $GLOBALS["parse"][$num];
}
}
function savetofile () {
$dccgettemp = "";
$dccgettemp = fgets($GLOBALS["dcc"],1024);
if ($dccgettemp != "") {
$GLOBALS["dccget"] = $dccgettemp;
$GLOBALS["currfilesize"] += strlen($dccgettemp);
fwrite($GLOBALS["handle"], $dccgettemp);
}
}
function xfecho ($data, $color = "black", $ts = 1) {
if (($data != "") && ($data != "\n") && (file_exists($GLOBALS["logfilename"]))) {
if (substr($data,-1) != "\n") { $data .= "\n"; }
if ($ts == 1) {
$write = time() . " " . $color . " " . $data;
}
elseif ($color == "") {
$write = $data;
}
else {
$write = $color . " " . $data;
}
fwrite($GLOBALS["logfile"],$write);
if ($GLOBALS["showrealtime"]) { echo $write; }
}
}
function xfdie () {
if ($GLOBALS["killed"] == false) {
if ($GLOBALS["handle"]) { fclose($GLOBALS["handle"]); }
if (($GLOBALS["dcc"]) && (!feof($GLOBALS["dcc"]))) { fclose($GLOBALS["dcc"]); }
if ($GLOBALS["lockfilename"] && $GLOBALS["lockfilename"] != "" && file_exists($GLOBALS["lockfilename"])) { @unlink($GLOBALS["lockfilename"]); }
if (($GLOBALS["fp"]) && (!feof($GLOBALS["fp"]))) {
xfwrite("PRIVMSG " . $GLOBALS["user"] . " :XDCC REMOVE");
xfwrite("PRIVMSG " . $GLOBALS["user"] . " :XDCC REMOVE " . $GLOBALS["pack"]);
xfwrite("QUIT :XDCC Fetcher 0.1 beta (build 20050305) http://xdccfetcher.sourceforge.net");
sleep(5);
if (!feof($GLOBALS["fp"])) { fclose($GLOBALS["fp"]); }
}
xfecho("process killed (connection status: " . connection_status() . ")");
fclose($GLOBALS["logfile"]);
$GLOBALS["killed"] = true;
die();
}
}
// Initialisation variables
$server = ltrim(rtrim($_GET["server"]));
$port = ltrim(rtrim($_GET["port"]));
$channel = ltrim(rtrim($_GET["channel"]));
if (substr($channel,0,1) != "#") { $channel = "#" . ltrim(rtrim($channel)); }
$user = $_GET["user"];
$pack = $_GET["pack"];
if (substr($pack,0,1) != "#") { $pack = "#" . ltrim(rtrim($pack)); }
$join = 0;
$joined = 0;
$ison = 0;
$percent = -1;
while ((!isset($nick)) || file_exists($logfilename)) {
$nick = "xf" . rand(10000,99999);
$logfilename = $logsfolder . $nick . ".log";
$delfilename = $logsfolder . $nick . ".del";
}
$logfile = fopen($logfilename, 'a');
while (1 == 1) {
$fp = @fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp) {
xfecho("$errstr ($errno)");
xfdie();
}
else {
stream_set_blocking($fp,0);
xfwrite("NICK " . $nick);
xfwrite("USER " . $nick . " \"xdccfetcher.com\" \"$server\" :xdccfetcher.sourceforge.net");
while (!feof($fp)) {
$fparr = array($fp);
stream_select($fparr, $write = NULL, $except = NULL, 3);
$get = fgets($fp);
$parse = explode(" ",$get);
CheckRaw($get);
if (rtrim($get) != "" && p(0) != "PING") {
if ($logall == true || (stristr($get,$user) && p(2) == $nick)) { xfecho($get); }
}
if (p(0) == "PING") {
xfecho("PING? PONG!","green");
xfwrite("PONG " . substr(p(1), 1),false);
}
elseif ((p(1) == "PRIVMSG") && (p(2) == $nick) && (p(3) == ":STOPXF")) {
xfecho("Manual abort");
xfdie();
}
elseif ((p(1) == "PRIVMSG") && (p(2) == $nick) && (p(3) == ":COMMANDXF")) {
$string = "";
for ($x=4; $x<count($parse); $x++) { $string .= $parse[$x] . " "; }
if ($string != "") { xfwrite(rtrim($string)); }
}
elseif (!file_exists($logfilename)) {
xfdie();
}
elseif (file_exists($delfilename)) {
@unlink($delfilename);
sleep(2);
fclose($logfile);
@unlink($logfilename);
xfdie();
}
elseif ((stristr($get,$user)) && (stristr($get,"all slots full")) && (!stristr($get,"Added you")) && (p(1) == "NOTICE") && (p(2) == $nick)) {
$timer = time() + 30;
}
elseif ((time() >= $timer) && ($timer != 0)) {
$timer = 0;
xfwrite("PRIVMSG " . $user . " :XDCC SEND " . $pack . "");
}
elseif ((stristr(p(0),$user)) && (p(3) == ":DCC")) {
if (p(4) == "SEND") {
echo "Starting DCC...\n";
$DCCfilesize = (int)(substr(p(8),0,-3));
$DCCfilename = p(5);
$DCCip = long2ip(p(6));
$DCCport = p(7);
$filename = $downloadfolder . $DCCfilename;
}
elseif (p(4) == "ACCEPT") {
echo "Resume accepted...\n";
}
if ((file_exists($filename)) && (p(4) == "SEND")) {
if (filesize($filename) >= $DCCfilesize) {
xfecho("File already downloaded");
xfdie();
}
xfecho("Attempting resume...");
xfwrite("PRIVMSG " . $user . " :DCC RESUME " . $DCCfilename . " " . $DCCport . " " . filesize($filename) . "");
}
else {
xfecho("Connecting to $DCCip on port $DCCport ($DCCfilesize bytes)...");
$dcc = @fsockopen($DCCip, $DCCport, $errno, $errstr, 30);
if (!$dcc) {
xfecho("$errstr ($errno)");
xfdie();
}
else {
stream_set_blocking($dcc,0);
xfecho("connected...");
$filename = $downloadfolder . $DCCfilename;
if (file_exists($filename . ".lck")) {
$filename = $downloadfolder . $nick . ".sav";
}
$lockfilename = $filename . ".lck";
$handle = fopen($lockfilename, 'a');
fclose($handle);
if (file_exists($filename)) {
$currfilesize = filesize($filename);
}
else {
$currfilesize = 0;
}
$handle = fopen($filename, 'a');
while (!feof($dcc)) {
savetofile();
if (!feof($fp)) {
$get = fgets($fp);
if ($get) {
$parse = explode(" ",$get);
if (p(0) == "PING") {
xfecho($get);
xfwrite("PONG " . substr(p(1), 1));
}
elseif ((p(1) == "PRIVMSG") && (p(2) == $nick) && (p(3) == ":STOPXF")) {
xfecho("Manual abort");
xfdie();
}
elseif ((p(1) == "PRIVMSG") && (p(2) == $nick) && (p(3) == ":COMMANDXF")) {
$string = "";
$x = 4;
while (p(x) != "") {
$string .= $p($x) . " ";
$x++;
}
if ($string != "") { xfwrite(rtrim($string)); }
}
}
}
$currpercent = (int)(($currfilesize / $DCCfilesize) * 100);
if ($currpercent > $percent) {
$percent = $currpercent;
xfecho("<script>document.title='" . $percent . "% completed - " . $DCCfilename . " - " . $nick . "';</script>", "", false);
}
if (!file_exists($logfilename)) {
xfdie();
}
elseif (file_exists($delfilename)) {
@unlink($delfilename);
sleep(2);
fclose($logfile);
@unlink($logfilename);
xfdie();
}
elseif ($currfilesize >= $DCCfilesize) {
xfecho("Downloaded!");
xfdie();
}
elseif ($currfilesize > $DCCfilesize) {
xfecho("Current filesize is greater than expected! Aborting.");
xfdie();
}
$dccarr = array($dcc);
@stream_select($dccarr, $write = NULL, $except = NULL, 3);
}
if (filesize($filename) < $DCCfilesize) {
xfecho("aborted.");
fclose($dcc);
@unlink($lockfilename);
fclose($handle);
xfwrite("PRIVMSG " . $user . " :XDCC SEND " . $pack . "");
}
}
}
}
}
}
xfecho("Disconnected from server! Reconnecting in 60 seconds...");
sleep(60);
}
?>
</pre>
config.php
PHP:
<?php
// Download folder
$downloadfolder = "downloads";
// Logs folder
$logsfolder = "/logs";
// Debug Modes
$showrealtime = true;
$logall = false;
?>