|
<? php |
|
|
|
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['orientation_bitmask'] |= ($post_hide_orientation * $ORIENTATION_SKIPPED_MODIFIER); |
|
orientation_update_status($user, $orientation); |
|
} else if ($post_show_orientation && $post_show_orientation <= $ORIENTATION_MAX) { |
|
$orientation['orientation_bitmask'] &= ~ ($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[$ORIENTATION_NETWORK]['failed_college'] = 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[$ORIENTATION_NETWORK]['failed_corp'] = ($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[$ORIENTATION_ORDER[$ORIENTATION_PROFILE]]['upload_error'] = pic_get_error_text($get_error); |
|
} |
|
// photo upload success |
|
else if ($get_success == 1) { |
|
$stories[$ORIENTATION_ORDER[$ORIENTATION_PROFILE]]['uploaded_pic'] = true; |
|
// join network success |
|
} else if ($get_jn) { |
|
$stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]]['joined'] = 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'); |
This is a good piece of Internet history, and has some of the only leaked chunks of the original 2003 code that Mark Zuckerberg originally wrote in his dorm room at Harvard. There's another "original" Facebook code on GitHub (although, not on Gist) published by "megaloglobal" that purports to be the "original 2003 version", whilst that emulates 2008-era Facebook, the one that succeeded this version of the platform here and created the code used until like 2012.