Facebook – Homepage Code


Here is the PHP code for the HomePage of FaceBook.

include_once $_SERVER['PHP_ROOT'].'/html/init.php';
include_once $_SERVER['PHP_ROOT'].'/lib/home.php';
include_once $_SERVER['PHP_ROOT'].'/lib/requests.php';
include_once $_SERVER['PHP_ROOT'].'/lib/feed/newsfeed.php';
include_once $_SERVER['PHP_ROOT'].'/lib/poke.php';
include_once $_SERVER['PHP_ROOT'].'/lib/share.php';
include_once $_SERVER['PHP_ROOT'].'/lib/orientation.php';
include_once $_SERVER['PHP_ROOT'].'/lib/feed/newsfeed.php';
include_once $_SERVER['PHP_ROOT'].'/lib/mobile/register.php';
include_once $_SERVER['PHP_ROOT'].'/lib/forms_lib.php';
include_once $_SERVER['PHP_ROOT'].'/lib/contact_importer/contact_importer.php';
include_once $_SERVER['PHP_ROOT'].'/lib/feed/util.php';
include_once $_SERVER['PHP_ROOT'].'/lib/hiding_prefs.php';
include_once $_SERVER['PHP_ROOT'].'/lib/abtesting.php';
include_once $_SERVER['PHP_ROOT'].'/lib/friends.php';
include_once $_SERVER['PHP_ROOT'].'/lib/statusupdates.php';
// lib/display/feed.php has to be declared here for scope issues.
// This keeps display/feed.php cleaner and easier to understand.
include_once $_SERVER['PHP_ROOT'].'/lib/display/feed.php';
include_once $_SERVER['PHP_ROOT'].'/lib/monetization_box.php';
// require login
$user = require_login();
print_time('require_login');
param_request(array('react' => $PARAM_EXISTS));
// Check and fix broken emails
// LN - disabling due to excessive can_see dirties and sets when enabled.
//check_and_fix_broken_emails($user);
// migrate AIM screenname from profile to screenname table if needed
migrate_screenname ($user);
// homepage announcement variables
$HIDE_ANNOUNCEMENT_BIT = get_site_variable('HIDE_ANNOUNCEMENT_BIT');
$HIDE_INTRO_BITMASK = get_site_variable('HIDE_INTRO_BITMASK');
// redirects
if (is_sponsor_user()) {
    redirect('bizhome.php', 'www');
}
include_once $_SERVER['PHP_ROOT'].'/lib/mesg.php';
include_once $_SERVER['PHP_ROOT'].'/lib/invitetool.php';
include_once $_SERVER['PHP_ROOT'].'/lib/grammar.php';
include_once $_SERVER['PHP_ROOT'].'/lib/securityq.php';
include_once $_SERVER['PHP_ROOT'].'/lib/events.php';
include_once $_SERVER['PHP_ROOT'].'/lib/rooster/stories.php';
// todo: password confirmation redirects here (from html/reset.php),
// do we want a confirmation message?
param_get_slashed(array(
'feeduser' => $PARAM_INT, //debug: gets feed for user here
'err' => $PARAM_STRING, // returning from a failed entry on an orientation form
'error' => $PARAM_STRING, // an error can also be here because the profile photo upload code is crazy
'ret' => $PARAM_INT,
    'success' => $PARAM_INT, // successful profile picture upload
'jn' => $PARAM_INT, // joined a network for orientation
'np' => $PARAM_INT, // network pending (for work/address network)
'me' => $PARAM_STRING, // mobile error
'mr' => $PARAM_EXISTS, // force mobile reg view
'mobile' => $PARAM_EXISTS, // mobile confirmation code sent
'jif' => $PARAM_EXISTS, // just imported friends
'ied' => $PARAM_STRING, // import email domain
'o' => $PARAM_EXISTS, // first time orientation, passed on confirm
'verified' => $PARAM_EXISTS)); // verified mobile phone
param_post(array(
'leave_orientation' => $PARAM_EXISTS,
    'show_orientation' => $PARAM_INT, // show an orientation step
'hide_orientation' => $PARAM_INT)); // skip an orientation step
// homepage actions
if ($req_react && validate_expiring_hash($req_react, $GLOBALS['url_md5key'])) {
    $show_reactivated_message = true;
} else {
    $show_reactivated_message = false;
}
tpl_set('show_reactivated_message', $show_reactivated_message);
// upcoming events
events_check_future_events($user); // make sure big tunas haven't moved around
$upcoming_events = events_get_imminent_for_user($user);
// this is all stuff that can be fetched together!
$upcoming_events_short = array();
obj_multiget_short(array_keys($upcoming_events), true, $upcoming_events_short);
$new_pokes = 0;
//only get the next N pokes for display
//where N is set in the dbget to avoid caching issues
$poke_stats = get_num_pokes($user);
get_next_pokes($user, true, $new_pokes);
$poke_count = $poke_stats['unseen'];
$targeted_data = array();
home_get_cache_targeted_data($user, true, $targeted_data);
$announcement_data = array();
home_get_cache_announcement_data($user, true, $announcement_data);
$orientation = 0;
orientation_get_status($user, true, $orientation);
$short_profile = array();
profile_get_short($user, true, $short_profile);
// pure priming stuff
privacy_get_network_settings($user, true);
$presence = array();
mobile_get_presence_data($user, true, $presence);
feedback_get_event_weights($user, true);
// Determine if we want to display the feed intro message
$intro_settings = 0;
user_get_hide_intro_bitmask($user, true, $intro_settings);
$user_friend_finder = true;
contact_importer_get_used_friend_finder($user, true, $used_friend_finder);
$all_requests = requests_get_cache_data($user);
// FIXME?: is it sub-optimal to call this both in requests_get_cache_data and here?
$friends_status = statusupdates_get_recent($user, null, 3);
memcache_dispatch(); // populate cache data
// Merman's Admin profile always links to the Merman's home
if (user_has_obj_attached($user)) {
    redirect('mhome.php', 'www');
}
if (is_array($upcoming_events)) {
    foreach ($upcoming_events as $event_id => $data) {
        $upcoming_events[$event_id]['name'] = txt_set($upcoming_events_short[$event_id]['name']);
    }
}
tpl_set('upcoming_events' , $upcoming_events);
// disabled account actions
$disabled_warning = ((IS_DEV_SITE || IS_QA_SITE) && is_disabled_user($user));
tpl_set('disabled_warning', $disabled_warning);
// new pokes (no more messages here, they are in the top nav!)
if (!user_is_guest($user)) {
    tpl_set('poke_count' , $poke_count);
    tpl_set('pokes' , $new_pokes);
}
// get announcement computations
tpl_set('targeted_data' , $targeted_data);
tpl_set('announcement_data' , $announcement_data);
// birthday notifications
tpl_set('birthdays' , $birthdays = user_get_birthday_notifications($user, $short_profile));
tpl_set('show_birthdays' , $show_birthdays = (count($birthdays) || !$orientation));
// user info
tpl_set('first_name' , user_get_first_name(txt_set($short_profile['id'])));
tpl_set('user' , $user);
// decide if there are now any requests to show
$show_requests = false;
foreach ($all_requests as $request_category) {
    if ($request_category) {
        $show_requests = true;
        break;
    }
}
tpl_set('all_requests', $show_requests ? $all_requests : null);
$permissions = privacy_get_reduced_network_permissions($user, $user);
// status
$user_info = array('user' => $user,
    'firstname' => user_get_first_name($user),
    'see_all' => '/statusupdates/?ref=hp',
    'profile_pic' => make_profile_image_src_direct($user, 'thumb'),
    'square_pic' => make_profile_image_src_direct($user, 'square'));
if (!empty($presence) && $presence['status_time'] > (time() - 60 * 60 * 24 * 7)) {
    $status = array('message' => txt_set($presence['status']),
        'time' => $presence['status_time'],
        'source' => $presence['status_source']);
} else {
    $status = array('message' => null, 'time' => null, 'source' => null);
}
tpl_set('user_info', $user_info);
tpl_set('show_status', $show_status = !$orientation);
tpl_set('status', $status);
tpl_set('status_custom', $status_custom = mobile_get_status_custom($user));
tpl_set('friends_status', $friends_status);
// orientation
if ($orientation) {
    if ($post_leave_orientation) {
        orientation_update_status($user, $orientation, 2);
        notification_notify_exit_orientation($user);
        dirty_user($user);
        redirect('home.php');
    }
    else if (orientation_eligible_exit(array('uid' => $user)) == 2) {
        orientation_update_status($user, $orientation, 1);
        notification_notify_exit_orientation($user);
        dirty_user($user);
        redirect('home.php');
    }
}
// timezone - outside of stealth, update user's timezone if necessary
$set_time = !user_is_alpha($user, 'stealth');
tpl_set('timezone_autoset', $set_time );
if ($set_time) {
    $daylight_savings = get_site_variable('DAYLIGHT_SAVINGS_ON');
    tpl_set('timezone', $short_profile['timezone'] - ($daylight_savings ? 4 : 5) );
}
// set next step if we can
if (!$orientation) {
    user_set_next_step($user, $short_profile);
}
// note: don't make this an else with the above statement, 
// because then no news feed stories will be fetched if they're exiting orientation
if ($orientation) {
    extract(orientation_get_const());
    require_js('js/dynamic_dialog.js');
    require_js('js/suggest.js');
    require_js('js/typeahead_ns.js');
    require_js('js/suggest.js');
    require_js('js/editregion.js');
    require_js('js/orientation.js');
    require_css('css/typeahead.css');
    require_css('css/editor.css');
    if ($post_hide_orientation && $post_hide_orientation <= $ORIENTATION_MAX) {
        $orientation&#91;'orientation_bitmask'&#93; |= ($post_hide_orientation * $ORIENTATION_SKIPPED_MODIFIER);
        orientation_update_status($user, $orientation);
    }
    else if ($post_show_orientation && $post_show_orientation <= $ORIENTATION_MAX) {
        $orientation&#91;'orientation_bitmask'&#93; & = ~($post_show_orientation * $ORIENTATION_SKIPPED_MODIFIER);
        orientation_update_status($user, $orientation);
    }
    $stories = orientation_get_stories($user, $orientation);
    switch ($get_err) {
        case $ORIENTATION_ERR_COLLEGE:
        $temp = array(); // the affil_retval_msg needs some parameters won't be used
        $stories&#91;$ORIENTATION_NETWORK&#93;&#91;'failed_college'&#93; = affil_retval_msg($get_ret, $temp, $temp);
        break;
        case $ORIENTATION_ERR_CORP:
        $temp = array();
        // We special case the network not recognized error here, because affil_retval_msg is retarded.
        $stories&#91;$ORIENTATION_NETWORK&#93;&#91;'failed_corp'&#93; = ($get_ret == 70) ? 'The email you entered did not match any of our supported networks. ' .
        'Click here to see our supported list. ' .
        'Go here to suggest your network for the future.'
        :
        affil_retval_msg($get_ret, $temp, $temp);
        break;
    }
    // photo upload error
    if ($get_error) {
        $stories&#91;$ORIENTATION_ORDER&#91;$ORIENTATION_PROFILE&#93;&#93;&#91;'upload_error'&#93; = pic_get_error_text($get_error);
    }
    // photo upload success
    else if ($get_success == 1) {
        $stories&#91;$ORIENTATION_ORDER&#91;$ORIENTATION_PROFILE&#93;&#93;&#91;'uploaded_pic'&#93; = true;
        // join network success
    }
    else if ($get_jn) {
        $stories&#91;$ORIENTATION_ORDER&#91;$ORIENTATION_NETWORK&#93;&#93;&#91;'joined'&#93; = array(
        'id' => $get_jn,
            ‘name’ => network_get_name($get_jn));
        // network join pending
    }
    else if ($get_np) {
        $stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]][’join_pending’] = array(
        ‘id’ => $get_np,
            ‘email’ => get_affil_email_conf($user, $get_np),
            ‘network’ => network_get_name($get_np));
        // just imported friend confirmation
    }
    else if ($get_jif) {
        $stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]][’just_imported_friends’] = true;
        $stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]][’domain’] = $get_ied;
    }
    // Mobile web API params
    if ($get_mobile) {
        $stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]][’sent_code’] = true;
        $stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]][’view’] = ‘confirm’;
    }
    if ($get_verified) {
        $stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]][’verified’] = true;
    }
    if ($get_me) {
        $stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]][’error’] = $get_me;
    }
    if ($get_mr) {
        $stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]][’view’] = ‘register’;
    }
    if (orientation_eligible_exit($orientation)) {
        tpl_set(’orientation_show_exit’, true);
    }
    tpl_set(’orientation_stories’, $stories);
    //if in orientation, we hide all feed intros (all 1’s in bitmask)
    $intro_settings = -1;
}
tpl_set(’orientation’, $orientation);
// Rooster Stories
if (!$orientation &&
((get_site_variable(’ROOSTER_ENABLED’) == 2) ||
(get_site_variable(’ROOSTER_DEV_ENABLED’) == 2))) {
    $rooster_story_count = get_site_variable(’ROOSTER_STORY_COUNT’);
    if (!isset($rooster_story_count)) {
        // Set default if something is wrong with the sitevar
        $rooster_story_count = 2;
    }
    $rooster_stories = rooster_get_stories($user, $rooster_story_count, $log_omissions = true);
    if (!empty($rooster_stories) && !empty($rooster_stories[’stories’])) {
        // Do page-view level logging here
        foreach($rooster_stories[’stories’] as $story) {
            rooster_log_action($user, $story, ROOSTER_LOG_ACTION_VIEW);
        }
        tpl_set(’rooster_stories’, $rooster_stories);
    }
}
// set the variables for the home announcement code
$hide_announcement_tpl = ($intro_settings | $HIDE_INTRO_BITMASK) & $HIDE_ANNOUNCEMENT_BIT;
// if on qa/dev site, special rules
$HIDE_INTRO_ON_DEV = get_site_variable(’HIDE_INTRO_ON_DEV’);
if ((IS_QA_SITE || IS_DEV_SITE) && !$HIDE_INTRO_ON_DEV) {
    $hide_announcement_tpl = 0;
}
tpl_set(’hide_announcement’, $hide_announcement_tpl);
if ($is_candidate = is_candidate_user($user)) {
    tpl_set(’hide_announcement’, false);
}
$home_announcement_tpl = !$hide_announcement_tpl || $is_candidate ? home_get_announcement_info($user) :
0;
tpl_set(’home_announcement’, $home_announcement_tpl);
tpl_set(’hide_announcement_bit’, $HIDE_ANNOUNCEMENT_BIT);
$show_friend_finder = !$orientation && contact_importer_enabled($user) && !user_get_hiding_pref($user, ‘home_friend_finder’);
tpl_set(’show_friend_finder’, $show_friend_finder);
if ($show_friend_finder && (user_get_friend_count($user) > 20)) {
    tpl_set(’friend_finder_hide_options’, array(’text’ => ’close’,
        ‘onclick’ => ”return clearFriendFinder()”));
} else {
    tpl_set(’friend_finder_hide_options’, null);
}
$account_info = user_get_account_info($user);
$account_create_time = $account_info[’time’];
tpl_set(’show_friend_finder_top’,
    !$used_friend_finder);
tpl_set(’user’, $user);
// MONETIZATION BOX
$minimize_monetization_box = user_get_hiding_pref($user, ‘home_monetization’);
$show_monetization_box = (!$orientation &&
get_site_variable(’HOMEPAGE_MONETIZATION_BOX’));
tpl_set(’show_monetization_box’, $show_monetization_box);
tpl_set(’minimize_monetization_box’, $minimize_monetization_box);
if ($show_monetization_box) {
    $monetization_box_data = monetization_box_user_get_data($user);
    txt_set(’monetization_box_data’, $monetization_box_data);
}
// ORIENTATION
if ($orientation) {
    $network_ids = id_get_networks($user);
    $network_names = multiget_network_name($network_ids);
    $in_corp_network = in_array($GLOBALS[’TYPE_CORP’], array_map(’extract_network_type’, $network_ids));
    $show_corp_search = $in_corp_network ||
    get_age(user_get_basic_info_attr($user, ‘birthday’)) >= 21;
    $pending_hs = is_hs_pending_user($user);
    $hs_id = null;
    $hs_name = null;
    if ($pending_hs) {
        foreach (id_get_pending_networks($user) as $network) {
            if (extract_network_type($network[’network_key’]) == $GLOBALS[’TYPE_HS’]) {
                $hs_id = $network[’network_key’];
                $hs_name = network_get_name($hs_id);
                break;
            }
        }
    }
    //$orientation_people = orientation_get_friend_and_inviter_ids($user);
    $orientation_people = array(’friends’ => user_get_all_friends($user),
        ‘pending’ => array_keys(user_get_friend_requests($user)),
        ‘inviters’ => array(), // wc: don’t show inviters for now
    );
    $orientation_info = array_merge($orientation_people,
        array(’network_names’ => $network_names,
        ’show_corp_search’ => $show_corp_search,
        ‘pending_hs’ => array(’hs_id’ => $hs_id,
        ‘hs_name’ => $hs_name),
        ‘user’ => $user,
        ));
    tpl_set(’orientation_info’, $orientation_info);
    tpl_set(’simple_orientation_first_login’, $get_o); // unused right now
}
// Roughly determine page length for ads
// first, try page length using right-hand panel
$ads_page_length_data = 3 + // 3 for profile pic + next step
($show_friend_finder ? 1 : 0) +
($show_status ? ($status_custom ? count($friends_status) : 0) : 0) +
($show_monetization_box ? 1 : 0) +
($show_birthdays ? count($birthdays) : 0) +
count($new_pokes);
// page length using feed stories
if ($orientation) {
    $ads_page_length_data = max($ads_page_length_data, count($stories) * 5);
}
tpl_set(’ads_page_length_data’, $ads_page_length_data);
$feed_stories = null;
if (!$orientation) {
    // if they’re not in orientation they get other cool stuff
    // ad_insert: the ad type to try to insert for the user
    // (0 if we don’t want to try an insert)
    $ad_insert = get_site_variable(’FEED_ADS_ENABLE_INSERTS’);
    $feed_off = false;
    if (check_super($user) && $get_feeduser) {
        $feed_stories = user_get_displayable_stories($get_feeduser, 0, null, $ad_insert);
    }
    else if (can_see($user, $user, ‘feed’)) {
        $feed_stories = user_get_displayable_stories($user, 0, null, $ad_insert);
    } else {
        $feed_off = true;
    }
    // Friend’s Feed Selector - Requires dev.php constant
    if (is_friendfeed_user($user)) {
        $friendfeed = array();
        $friendfeed[’feeduser’] = $get_feeduser;
        $friendfeed[’feeduser_name’] = user_get_name($get_feeduser);
        $friendfeed[’friends’] = user_get_all_friends($user);
        tpl_set(’friendfeed’, $friendfeed);
    }
    $feed_stories = feed_adjust_timezone($user, $feed_stories);
    tpl_set(’feed_off’, $feed_off ? redirect(’privacy.php?view = feeds’, null, false) : false);
}
tpl_set(’feed_stories’, $feed_stories);
render_template($_SERVER[’PHP_ROOT’].’/html/home.phpt’);

Looking at the code it seems like the developers at Facebook prefere structured programming as you can find a lot of method calls here and there doing the job instead of Object Oriented Design. But they are using templates thats a good thing.

Advertisements
Facebook – Homepage Code

One thought on “Facebook – Homepage Code

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s