コード例 #1
0
ファイル: diff.php プロジェクト: michaelprem/phc
function run_main()
{
    $old_rev = (int) $_GET["old_rev"];
    $new_rev = (int) $_GET["new_rev"];
    $unsafe_filename = $_GET["filename"];
    $sort_first = $_GET["sort"] or false;
    # Sanitize the revisions: 0 < old_rev < new_rev < 5000
    if (!(0 < $old_rev)) {
        bad();
    }
    if (!($old_rev < $new_rev)) {
        bad();
    }
    if (!($new_rev < 5000)) {
        bad();
    }
    # Sanitize the inputs: the file should be within the results/$rev subdirectory
    $relative_filename = "results/{$new_rev}/{$unsafe_filename}";
    $real_filename = realpath($relative_filename);
    # We find the dir by checking the fullname of this script, and stripping off the script name at the end
    $real_scriptname = realpath(__FILE__);
    $scriptname = "test/framework/records/diff.php";
    $script_dir = str_replace($scriptname, "", $real_scriptname);
    # Check that the script is within these bounds
    if (strpos($real_filename, $script_dir) !== 0) {
        # FALSE is a fail, but 0 isnt
        bad();
    }
    $old_filename = realpath("results/{$old_rev}/{$unsafe_filename}");
    $new_filename = realpath("results/{$new_rev}/{$unsafe_filename}");
    if (!file_exists($old_filename)) {
        die("No old file");
    }
    if (!file_exists($new_filename)) {
        die("No new file");
    }
    $old = file_get_contents($old_filename);
    if ($sort_first) {
        $split = split("\n", $old);
        sort($split);
        $old = join("\n", $split);
    }
    $new = file_get_contents($new_filename);
    if ($sort_first) {
        $split = split("\n", $new);
        sort($split);
        $new = join("\n", $split);
    }
    echo "<pre>" . diff($old, $new) . "</pre>\n";
}
コード例 #2
0
ファイル: loadtweets.php プロジェクト: nielsbom/tweetnest
function importTweets($p)
{
    global $twitterApi, $db, $config, $access, $search;
    $p = trim($p);
    if (!$twitterApi->validateUserParam($p)) {
        return false;
    }
    $maxCount = 200;
    $tweets = array();
    $sinceID = 0;
    $maxID = 0;
    echo l("Importing:\n");
    // Do we already have tweets?
    $pd = $twitterApi->getUserParam($p);
    if ($pd['name'] == "screen_name") {
        $uid = $twitterApi->getUserId($pd['value']);
        $screenname = $pd['value'];
    } else {
        $uid = $pd['value'];
        $screenname = $twitterApi->getScreenName($pd['value']);
    }
    $tiQ = $db->query("SELECT `tweetid` FROM `" . DTP . "tweets` WHERE `userid` = '" . $db->s($uid) . "' ORDER BY `id` DESC LIMIT 1");
    if ($db->numRows($tiQ) > 0) {
        $ti = $db->fetch($tiQ);
        $sinceID = $ti['tweetid'];
    }
    echo l("User ID: " . $uid . "\n");
    // Find total number of tweets
    $total = totalTweets($p);
    if ($total > 3200) {
        $total = 3200;
    }
    // Due to current Twitter limitation
    $pages = ceil($total / $maxCount);
    echo l("Total tweets: <strong>" . $total . "</strong>, Approx. page total: <strong>" . $pages . "</strong>\n");
    if ($sinceID) {
        echo l("Newest tweet I've got: <strong>" . $sinceID . "</strong>\n");
    }
    // Retrieve tweets
    do {
        // Determine path to Twitter timeline resource
        $path = "1/statuses/user_timeline.json?" . $p . "&include_rts=true&include_entities=true&count=" . $maxCount . ($sinceID ? "&since_id=" . $sinceID : "") . ($maxID ? "&max_id=" . $maxID : "");
        // Announce
        echo l("Retrieving page <strong>#" . ($i + 1) . "</strong>: <span class=\"address\">" . ls($path) . "</span>\n");
        // Get data
        $data = $twitterApi->query($path);
        // Drop out on connection error
        if (is_array($data) && $data[0] === false) {
            dieout(l(bad("Error: " . $data[1] . "/" . $data[2])));
        }
        // Start parsing
        echo l("<strong>" . ($data ? count($data) : 0) . "</strong> new tweets on this page\n");
        if (!empty($data)) {
            echo l("<ul>");
            foreach ($data as $i => $tweet) {
                // Shield against duplicate tweet from max_id
                if (!IS64BIT && $i == 0 && $maxID == $tweet->id_str) {
                    unset($data[0]);
                    continue;
                }
                // List tweet
                echo l("<li>" . $tweet->id_str . " " . $tweet->created_at . "</li>\n");
                // Create tweet element and add to list
                $tweets[] = $twitterApi->transformTweet($tweet);
                // Determine new max_id
                $maxID = $tweet->id_str;
                // Subtracting 1 from max_id to prevent duplicate, but only if we support 64-bit integer handling
                if (IS64BIT) {
                    $maxID = (int) $tweet->id - 1;
                }
            }
            echo l("</ul>");
        }
        /*if(count($data) < ($maxCount - 50)){
        			echo l("We've reached last page\n");
        			break;
        		}*/
    } while (!empty($data));
    if (count($tweets) > 0) {
        // Ascending sort, oldest first
        $tweets = array_reverse($tweets);
        echo l("<strong>All tweets collected. Reconnecting to DB...</strong>\n");
        $db->reconnect();
        // Sometimes, DB connection times out during tweet loading. This is our counter-action
        echo l("Inserting into DB...\n");
        $error = false;
        foreach ($tweets as $tweet) {
            $q = $db->query($twitterApi->insertQuery($tweet));
            if (!$q) {
                dieout(l(bad("DATABASE ERROR: " . $db->error())));
            }
            $text = $tweet['text'];
            $te = $tweet['extra'];
            if (is_string($te)) {
                $te = @unserialize($tweet['extra']);
            }
            if (is_array($te)) {
                // Because retweets might get cut off otherwise
                $text = array_key_exists("rt", $te) && !empty($te['rt']) && !empty($te['rt']['screenname']) && !empty($te['rt']['text']) ? "RT @" . $te['rt']['screenname'] . ": " . $te['rt']['text'] : $tweet['text'];
            }
            $search->index($db->insertID(), $text);
        }
        echo !$error ? l(good("Done!\n")) : "";
    } else {
        echo l(bad("Nothing to insert.\n"));
    }
    // Checking personal favorites -- scanning all
    echo l("\n<strong>Syncing favourites...</strong>\n");
    // Resetting these
    $favs = array();
    $maxID = 0;
    $sinceID = 0;
    do {
        $path = "1/favorites.json?" . $p . "&count=" . $maxCount . ($maxID ? "&max_id=" . $maxID : "");
        echo l("Retrieving page <strong>#" . ($i + 1) . "</strong>: <span class=\"address\">" . ls($path) . "</span>\n");
        $data = $twitterApi->query($path);
        if (is_array($data) && $data[0] === false) {
            dieout(l(bad("Error: " . $data[1] . "/" . $data[2])));
        }
        echo l("<strong>" . ($data ? count($data) : 0) . "</strong> total favorite tweets on this page\n");
        if (!empty($data)) {
            echo l("<ul>");
            foreach ($data as $tweet) {
                if (!IS64BIT && $i == 0 && $maxID == $tweet->id_str) {
                    unset($data[0]);
                    continue;
                }
                if ($tweet->user->id_str == $uid) {
                    echo l("<li>" . $tweet->id_str . " " . $tweet->created_at . "</li>\n");
                    $favs[] = $maxID = $tweet->id_str;
                    if (IS64BIT) {
                        $maxID = (int) $tweet->id - 1;
                    }
                }
            }
            echo l("</ul>");
        }
        echo l("<strong>" . count($favs) . "</strong> favorite own tweets so far\n");
        //if(count($data) < ($maxCount - 50)){ break; } // We've reached last page
    } while (!empty($data));
    // Blank all favorites
    $db->query("UPDATE `" . DTP . "tweets` SET `favorite` = '0'");
    // Insert favorites into DB
    $db->query("UPDATE `" . DTP . "tweets` SET `favorite` = '1' WHERE `tweetid` IN ('" . implode("', '", $favs) . "')");
    echo l(good("Updated favorites!"));
}
コード例 #3
0
ファイル: loaduser.php プロジェクト: ngpestelos/tweetnest
<?php

// TWEET NEST
// Load user
require "mpreheader.php";
$pageTitle = "Loading user info";
require "mheader.php";
echo l("Connecting & parsing...\n");
$path = "1/users/show.json?screen_name=" . $config['twitter_screenname'];
echo l("Connecting to: <span class=\"address\">" . ls($path) . "</span>\n");
$data = $twitterApi->query($path);
if ($data) {
    $extra = array("created_at" => (string) $data->created_at, "utc_offset" => (string) $data->utc_offset, "time_zone" => (string) $data->time_zone, "lang" => (string) $data->lang, "profile_background_color" => (string) $data->profile_background_color, "profile_text_color" => (string) $data->profile_text_color, "profile_link_color" => (string) $data->profile_link_color, "profile_sidebar_fill_color" => (string) $data->profile_sidebar_fill_color, "profile_sidebar_border_color" => (string) $data->profile_sidebar_border_color, "profile_background_image_url" => (string) $data->profile_background_image_url, "profile_background_tile" => (string) $data->profile_background_tile);
    echo l("Checking...\n");
    $db->query("DELETE FROM `" . DTP . "tweetusers` WHERE `userid` = '0'");
    // Getting rid of empty users created in error
    $q = $db->query("SELECT * FROM `" . DTP . "tweetusers` WHERE `userid` = '" . $db->s($data->id) . "' LIMIT 1");
    if ($db->numRows($q) <= 0) {
        $iq = "INSERT INTO `" . DTP . "tweetusers` (`userid`, `screenname`, `realname`, `location`, `description`, `profileimage`, `url`, `extra`, `enabled`) VALUES ('" . $db->s($data->id) . "', '" . $db->s($data->screen_name) . "', '" . $db->s($data->name) . "', '" . $db->s($data->location) . "', '" . $db->s($data->description) . "', '" . $db->s($data->profile_image_url) . "', '" . $db->s($data->url) . "', '" . $db->s(serialize($extra)) . "', '1');";
    } else {
        $iq = "UPDATE `" . DTP . "tweetusers` SET `screenname` = '" . $db->s($data->screen_name) . "', `realname` = '" . $db->s($data->name) . "', `location` = '" . $db->s($data->location) . "', `description` = '" . $db->s($data->description) . "', `profileimage` = '" . $db->s($data->profile_image_url) . "', `url` = '" . $db->s($data->url) . "', `extra` = '" . $db->s(serialize($extra)) . "' WHERE `userid` = '" . $db->s($data->id) . "' LIMIT 1";
    }
    echo l("Updating...\n");
    $q = $db->query($iq);
    echo $q ? l(good("Done!")) : l(bad("DATABASE ERROR: " . $db->error()));
} else {
    echo l(bad("No data! Try again later."));
}
require "mfooter.php";
コード例 #4
0
ファイル: loadarchive.php プロジェクト: iambibhas/tweetnest
function importTweets($p)
{
    global $twitterApi, $db, $config, $access, $search;
    $p = trim($p);
    if (!$twitterApi->validateUserParam($p)) {
        return false;
    }
    $tweets = array();
    echo l("Importing:\n");
    // Do we already have tweets?
    $pd = $twitterApi->getUserParam($p);
    if ($pd['name'] == "screen_name") {
        $uid = $twitterApi->getUserId($pd['value']);
        $screenname = $pd['value'];
    } else {
        $uid = $pd['value'];
        $screenname = $twitterApi->getScreenName($pd['value']);
    }
    $tiQ = $db->query("SELECT `tweetid` FROM `" . DTP . "tweets` WHERE `userid` = '" . $db->s($uid) . "' ORDER BY `id` DESC LIMIT 1");
    if ($db->numRows($tiQ) > 0) {
        $ti = $db->fetch($tiQ);
        $sinceID = $ti['tweetid'];
    }
    echo l("User ID: " . $uid . "\n");
    $loadedArchives = is_readable('loadarchivelog.txt') ? file('loadarchivelog.txt') : array();
    // go through every file in archive folder
    foreach (glob(dirname(__FILE__) . '/../archive/[0-9][0-9][0-9][0-9]_[0-1][0-9].js') as $filename) {
        if (in_array(basename($filename) . PHP_EOL, $loadedArchives)) {
            echo l("Found in archivelog -> Skipping file\n");
            continue;
        }
        $data = loadArchiveFile($filename);
        if (!is_array($data)) {
            dieout(l(bad("Error: Could not parse JSON ")));
        }
        // Start parsing
        echo l("<strong>" . ($data ? count($data) : 0) . "</strong> tweets in this file\n");
        if (!empty($data)) {
            echo l("<ul>");
            foreach ($data as $i => $tweet) {
                // List tweet
                echo l("<li>" . $tweet->id_str . " " . $tweet->created_at . "</li>\n");
                // Create tweet element and add to list
                $tweets[] = $twitterApi->transformTweet(normalizeTweet($tweet));
            }
            echo l("</ul>");
            // Ascending sort, oldest first
            $tweets = array_reverse($tweets);
            $db->reconnect();
            // Sometimes, DB connection times out during tweet loading. This is our counter-action
            foreach ($tweets as $tweet) {
                $q = $db->query($twitterApi->insertQuery($tweet));
                if (!$q) {
                    dieout(l(bad("DATABASE ERROR: " . $db->error())));
                }
                $text = $tweet['text'];
                $te = $tweet['extra'];
                if (is_string($te)) {
                    $te = @unserialize($tweet['extra']);
                }
                if (is_array($te)) {
                    // Because retweets might get cut off otherwise
                    $text = array_key_exists("rt", $te) && !empty($te['rt']) && !empty($te['rt']['screenname']) && !empty($te['rt']['text']) ? "RT @" . $te['rt']['screenname'] . ": " . $te['rt']['text'] : $tweet['text'];
                }
                $search->index($db->insertID(), $text);
            }
        }
        // reset tweets array
        $tweets = array();
        file_put_contents('loadarchivelog.txt', basename($filename) . PHP_EOL, FILE_APPEND);
    }
}
コード例 #5
0
ファイル: loadtweets.php プロジェクト: ngpestelos/tweetnest
function importTweets($p)
{
    global $twitterApi, $db, $config, $access, $search;
    $p = trim($p);
    if (!$twitterApi->validateUserParam($p)) {
        return false;
    }
    $maxCount = 200;
    $tweets = array();
    $sinceID = 0;
    $maxID = 0;
    echo l("Importing:\n");
    // Do we already have tweets?
    $pd = $twitterApi->getUserParam($p);
    if ($pd['name'] == "screen_name") {
        $uid = $twitterApi->getUserId($pd['value']);
        $screenname = $pd['value'];
    } else {
        $uid = $pd['value'];
        $screenname = $twitterApi->getScreenName($pd['value']);
    }
    $tiQ = $db->query("SELECT `tweetid` FROM `" . DTP . "tweets` WHERE `userid` = '" . $db->s($uid) . "' ORDER BY `tweetid` DESC LIMIT 1");
    if ($db->numRows($tiQ) > 0) {
        $ti = $db->fetch($tiQ);
        $sinceID = $ti['tweetid'];
    }
    echo l("User ID: " . $uid . "\n");
    // Find total number of tweets
    $total = totalTweets($p);
    if ($total > 3200) {
        $total = 3200;
    }
    // Due to current Twitter bug
    $pages = ceil($total / $maxCount);
    echo l("Total tweets: <strong>" . $total . "</strong>, Pages: <strong>" . $pages . "</strong>\n");
    // Retrieve tweets
    for ($i = 0; $i < $pages; $i++) {
        $path = "1/statuses/user_timeline.json?" . $p . "&include_rts=true&count=" . $maxCount . ($sinceID > 0 ? "&since_id=" . $sinceID : "") . ($maxID > 0 ? "&max_id=" . $maxID : "");
        echo l("Retrieving page <strong>#" . ($i + 1) . "</strong>: <span class=\"address\">" . ls($path) . "</span>\n");
        $data = $twitterApi->query($path);
        if (is_array($data) && $data[0] === false) {
            dieout(l(bad("Error: " . $data[1] . "/" . $data[2])));
        }
        echo l("<strong>" . ($data ? count($data) : 0) . "</strong> new tweets on this page\n");
        if (!$data) {
            break;
        }
        // No more tweets
        echo l("<ul>");
        foreach ($data as $tweet) {
            echo l("<li>" . $tweet->id . " " . $tweet->created_at . "</li>\n");
            $tweets[] = $twitterApi->transformTweet($tweet);
            $maxID = (double) ((double) $tweet->id - 1);
        }
        echo l("</ul>");
        if (count($data) < $maxCount - 50) {
            echo l("We've reached last page\n");
            break;
        }
    }
    if (count($tweets) > 0) {
        // Ascending sort, oldest first
        $tweets = array_reverse($tweets);
        echo l("<strong>All tweets collected. Reconnecting to DB...</strong>\n");
        $db->reconnect();
        // Sometimes, DB connection times out during tweet loading. This is our counter-action
        echo l("Inserting into DB...\n");
        $error = false;
        foreach ($tweets as $tweet) {
            $q = $db->query($twitterApi->insertQuery($tweet));
            if (!$q) {
                dieout(l(bad("DATABASE ERROR: " . $db->error())));
            }
            $text = $tweet['text'];
            $te = $tweet['extra'];
            if (is_string($te)) {
                $te = @unserialize($tweet['extra']);
            }
            if (is_array($te)) {
                // Because retweets might get cut off otherwise
                $text = array_key_exists("rt", $te) && !empty($te['rt']) && !empty($te['rt']['screenname']) && !empty($te['rt']['text']) ? "RT @" . $te['rt']['screenname'] . ": " . $te['rt']['text'] : $tweet['text'];
            }
            $search->index($db->insertID(), $text);
        }
        echo !$error ? l(good("Done!\n")) : "";
    } else {
        echo l(bad("Nothing to insert.\n"));
    }
    // Checking personal favorites -- scanning all
    echo l("\n<strong>Syncing favourites...</strong>\n");
    $pages = ceil($total / $maxCount);
    // Resetting these
    $sinceID = 0;
    $maxID = 0;
    $favs = array();
    for ($i = 0; $i < $pages; $i++) {
        $path = "1/favorites.json?" . $p . "&count=" . $maxCount . ($i > 0 ? "&page=" . $i : "");
        echo l("Retrieving page <strong>#" . ($i + 1) . "</strong>: <span class=\"address\">" . ls($path) . "</span>\n");
        $data = $twitterApi->query($path);
        if (is_array($data) && $data[0] === false) {
            dieout(l(bad("Error: " . $data[1] . "/" . $data[2])));
        }
        echo l("<strong>" . ($data ? count($data) : 0) . "</strong> total favorite tweets on this page\n");
        if (!$data) {
            break;
        }
        // No more tweets
        echo l("<ul>");
        foreach ($data as $tweet) {
            if ($tweet->user->id == $uid) {
                echo l("<li>" . $tweet->id . " " . $tweet->created_at . "</li>\n");
                $favs[] = $tweet->id . "";
            }
        }
        echo l("</ul>");
        if (count($data) > 0) {
            echo l("<strong>" . count($favs) . "</strong> favorite own tweets on this page\n");
        }
        if (count($data) < $maxCount - 50) {
            break;
        }
        // We've reached last page
    }
    $db->query("UPDATE `" . DTP . "tweets` SET `favorite` = '0'");
    // Blank all favorites
    $db->query("UPDATE `" . DTP . "tweets` SET `favorite` = '1' WHERE `tweetid` IN ('" . implode("', '", $favs) . "')");
    echo l(good("Updated favorites!"));
}
コード例 #6
0
ファイル: topic-exceptions.php プロジェクト: turanct/omikron
<?php

function bad()
{
    throw new Exception('Something');
}
$sampleTopic = within("foo", describe("bar", it("throws an exception", function () {
    return expect(bad(), toBe('good'));
})));
return within("omikron", describe("assertion", it("catches exceptions in callable", function () use($sampleTopic) {
    try {
        $renderedOutput = renderOutput(testResults([$sampleTopic]));
    } catch (Exception $e) {
        $renderedOutput = '';
    }
    $outputContainsError = strpos($renderedOutput, 'FAILED') !== false && strpos($renderedOutput, 'Exception: Something in') !== false && strpos($renderedOutput, 'Call stack:') !== false;
    return expect($outputContainsError, toBeTrue());
})));
コード例 #7
0
ファイル: loaduser.php プロジェクト: iambibhas/tweetnest
// Load user
require 'mpreheader.php';
$pageTitle = 'Loading user info';
require 'mheader.php';
// Check for authentication
if (!isset($config['consumer_key']) || !isset($config['consumer_secret'])) {
    die("Consumer key and secret not found. These are required for authentication to Twitter. \n" . "Please point your browser to the authorize.php file to configure these.\n");
}
// Continue...
echo l("Connecting & parsing...\n");
$path = 'account/verify_credentials';
echo l('Connecting to: <span class="address">' . ls($path) . "</span>\n");
$data = $twitterApi->query($path);
if ($data) {
    $extra = array('created_at' => (string) $data->created_at, 'utc_offset' => (string) $data->utc_offset, 'time_zone' => (string) $data->time_zone, 'lang' => (string) $data->lang, 'profile_background_color' => (string) $data->profile_background_color, 'profile_text_color' => (string) $data->profile_text_color, 'profile_link_color' => (string) $data->profile_link_color, 'profile_sidebar_fill_color' => (string) $data->profile_sidebar_fill_color, 'profile_sidebar_border_color' => (string) $data->profile_sidebar_border_color, 'profile_background_image_url' => (string) $data->profile_background_image_url, 'profile_background_tile' => (string) $data->profile_background_tile);
    echo l("Checking...\n");
    $db->query("DELETE FROM `" . DTP . "tweetusers` WHERE `userid` = '0'");
    // Getting rid of empty users created in error
    $q = $db->query("SELECT * FROM `" . DTP . "tweetusers` WHERE `userid` = '" . $db->s($data->id_str) . "' LIMIT 1");
    if ($db->numRows($q) <= 0) {
        $iq = "INSERT INTO `" . DTP . "tweetusers` (`userid`, `screenname`, `realname`, `location`, `description`, `profileimage`, `url`, `extra`, `enabled`) VALUES ('" . $db->s($data->id_str) . "', '" . $db->s($data->screen_name) . "', '" . $db->s($data->name) . "', '" . $db->s($data->location) . "', '" . $db->s($data->description) . "', '" . $db->s($data->profile_image_url) . "', '" . $db->s($data->url) . "', '" . $db->s(serialize($extra)) . "', '1');";
    } else {
        $iq = "UPDATE `" . DTP . "tweetusers` SET `screenname` = '" . $db->s($data->screen_name) . "', `realname` = '" . $db->s($data->name) . "', `location` = '" . $db->s($data->location) . "', `description` = '" . $db->s($data->description) . "', `profileimage` = '" . $db->s($data->profile_image_url) . "', `url` = '" . $db->s($data->url) . "', `extra` = '" . $db->s(serialize($extra)) . "' WHERE `userid` = '" . $db->s($data->id_str) . "' LIMIT 1";
    }
    echo l("Updating...\n");
    $q = $db->query($iq);
    echo $q ? l(good('Done!')) : l(bad('DATABASE ERROR: ' . $db->error()));
} else {
    echo l(bad('No data! Try again later.'));
}
require 'mfooter.php';
コード例 #8
0
ファイル: loadtweets.php プロジェクト: iambibhas/tweetnest
function importTweets($p)
{
    global $twitterApi, $db, $config, $access, $search;
    $p = trim($p);
    if (!$twitterApi->validateUserParam($p)) {
        return false;
    }
    $maxCount = 200;
    $tweets = array();
    $sinceID = 0;
    $maxID = 0;
    // Check for authentication
    if (!isset($config['consumer_key']) || !isset($config['consumer_secret'])) {
        die("Consumer key and secret not found. These are required for authentication to Twitter. \n" . "Please point your browser to the authorize.php file to configure these.\n");
    }
    list($userparam, $uservalue) = explode('=', $p);
    echo l("Importing:\n");
    // Do we already have tweets?
    $pd = $twitterApi->getUserParam($p);
    if ($pd['name'] == "screen_name") {
        $uid = $twitterApi->getUserId($pd['value']);
        $screenname = $pd['value'];
    } else {
        $uid = $pd['value'];
        $screenname = $twitterApi->getScreenName($pd['value']);
    }
    $tiQ = $db->query("SELECT `tweetid` FROM `" . DTP . "tweets` WHERE `userid` = '" . $db->s($uid) . "' ORDER BY `time` DESC LIMIT 1");
    if ($db->numRows($tiQ) > 0) {
        $ti = $db->fetch($tiQ);
        $sinceID = $ti['tweetid'];
    }
    echo l("User ID: " . $uid . "\n");
    // Find total number of tweets
    $total = totalTweets($p);
    if (is_numeric($total)) {
        if ($total > 3200) {
            $total = 3200;
        }
        // Due to current Twitter limitation
        $pages = ceil($total / $maxCount);
        echo l("Total tweets: <strong>" . $total . "</strong>, Approx. page total: <strong>" . $pages . "</strong>\n");
    }
    if ($sinceID) {
        echo l("Newest tweet I've got: <strong>" . $sinceID . "</strong>\n");
    }
    $page = 1;
    // Retrieve tweets
    do {
        // Announce
        echo l("Retrieving page <strong>#" . $page . "</strong>:\n");
        // Get data
        $params = array($userparam => $uservalue, 'include_rts' => true, 'include_entities' => true, 'count' => $maxCount);
        if ($sinceID) {
            $params['since_id'] = $sinceID;
        }
        if ($maxID) {
            $params['max_id'] = $maxID;
        }
        $data = $twitterApi->query('statuses/user_timeline', $params);
        // Drop out on connection error
        if (is_array($data) && $data[0] === false) {
            dieout(l(bad("Error: " . $data[1] . "/" . $data[2])));
        }
        // Start parsing
        echo l("<strong>" . ($data ? count($data) : 0) . "</strong> new tweets on this page\n");
        if (!empty($data)) {
            echo l("<ul>");
            foreach ($data as $i => $tweet) {
                // First, let's check if an API error occured
                if (is_array($tweet) && is_object($tweet[0]) && property_exists($tweet[0], 'message')) {
                    dieout(l(bad('A Twitter API error occured: ' . $tweet[0]->message)));
                }
                // Shield against duplicate tweet from max_id
                if (!IS64BIT && $i == 0 && $maxID == $tweet->id_str) {
                    unset($data[0]);
                    continue;
                }
                // List tweet
                echo l("<li>" . $tweet->id_str . " " . $tweet->created_at . "</li>\n");
                // Create tweet element and add to list
                $tweets[] = $twitterApi->transformTweet($tweet);
                // Determine new max_id
                $maxID = $tweet->id_str;
                // Subtracting 1 from max_id to prevent duplicate, but only if we support 64-bit integer handling
                if (IS64BIT) {
                    $maxID = (int) $tweet->id - 1;
                }
            }
            echo l("</ul>");
        }
        $page++;
    } while (!empty($data));
    if (count($tweets) > 0) {
        // Ascending sort, oldest first
        $tweets = array_reverse($tweets);
        echo l("<strong>All tweets collected. Reconnecting to DB...</strong>\n");
        $db->reconnect();
        // Sometimes, DB connection times out during tweet loading. This is our counter-action
        echo l("Inserting into DB...\n");
        $error = false;
        foreach ($tweets as $tweet) {
            $q = $db->query($twitterApi->insertQuery($tweet));
            if (!$q) {
                dieout(l(bad("DATABASE ERROR: " . $db->error())));
            }
            $text = $tweet['text'];
            $te = $tweet['extra'];
            if (is_string($te)) {
                $te = @unserialize($tweet['extra']);
            }
            if (is_array($te)) {
                // Because retweets might get cut off otherwise
                $text = array_key_exists("rt", $te) && !empty($te['rt']) && !empty($te['rt']['screenname']) && !empty($te['rt']['text']) ? "RT @" . $te['rt']['screenname'] . ": " . $te['rt']['text'] : $tweet['text'];
            }
            $search->index($db->insertID(), $text);
        }
        echo !$error ? l(good("Done!\n")) : "";
    } else {
        echo l(bad("Nothing to insert.\n"));
    }
    // Checking personal favorites -- scanning all
    echo l("\n<strong>Syncing favourites...</strong>\n");
    // Resetting these
    $favs = array();
    $maxID = 0;
    $sinceID = 0;
    $page = 1;
    do {
        echo l("Retrieving page <strong>#" . $page . "</strong>:\n");
        $params = array($userparam => $uservalue, 'count' => $maxCount);
        if ($maxID) {
            $params['max_id'] = $maxID;
        }
        $data = $twitterApi->query('favorites/list', $params);
        if (is_array($data) && $data[0] === false) {
            dieout(l(bad("Error: " . $data[1] . "/" . $data[2])));
        }
        echo l("<strong>" . ($data ? count($data) : 0) . "</strong> total favorite tweets on this page\n");
        if (!empty($data)) {
            echo l("<ul>");
            foreach ($data as $i => $tweet) {
                // First, let's check if an API error occured
                if (is_array($tweet) && is_object($tweet[0]) && property_exists($tweet[0], 'message')) {
                    dieout(l(bad('A Twitter API error occured: ' . $tweet[0]->message)));
                }
                if (!IS64BIT && $i == 0 && $maxID == $tweet->id_str) {
                    unset($data[0]);
                    continue;
                }
                if ($tweet->user->id_str == $uid) {
                    echo l("<li>" . $tweet->id_str . " " . $tweet->created_at . "</li>\n");
                    $favs[] = $tweet->id_str;
                }
                $maxID = $tweet->id_str;
                if (IS64BIT) {
                    $maxID = (int) $tweet->id - 1;
                }
            }
            echo l("</ul>");
        }
        echo l("<strong>" . count($favs) . "</strong> favorite own tweets so far\n");
        $page++;
    } while (!empty($data));
    // Blank all favorites
    $db->query("UPDATE `" . DTP . "tweets` SET `favorite` = '0'");
    // Insert favorites into DB
    $db->query("UPDATE `" . DTP . "tweets` SET `favorite` = '1' WHERE `tweetid` IN ('" . implode("', '", $favs) . "')");
    echo l(good("Updated favorites!"));
}