function init() { if (get_config('system', 'block_public') && !local_channel() && !remote_channel()) { return; } if (local_channel()) { load_contact_links(local_channel()); } $dirmode = intval(get_config('system', 'directory_mode')); $x = find_upstream_directory($dirmode); if ($x) { $url = $x['url']; } $poco_rating = get_config('system', 'poco_rating_enable'); // if unset default to enabled if ($poco_rating === false) { $poco_rating = true; } if (!$poco_rating) { return; } if (argc() > 1) { $hash = argv(1); } if (!$hash) { notice('Must supply a channel identififier.'); return; } $results = false; $x = z_fetch_url($url . '/ratingsearch/' . urlencode($hash)); if ($x['success']) { $results = json_decode($x['body'], true); } if (!$results || !$results['success']) { notice('No results.'); return; } if (array_key_exists('xchan_hash', $results['target'])) { \App::$poi = $results['target']; } $friends = array(); $others = array(); if ($results['ratings']) { foreach ($results['ratings'] as $n) { if (is_array(\App::$contacts) && array_key_exists($n['xchan_hash'], \App::$contacts)) { $friends[] = $n; } else { $others[] = $n; } } } \App::$data = array('target' => $results['target'], 'results' => array_merge($friends, $others)); if (!\App::$data['results']) { notice(t('No ratings') . EOL); } return; }
function api_call(&$a) { global $API, $called_api; // preset $type = "json"; foreach ($API as $p => $info) { if (strpos($a->query_string, $p) === 0) { $called_api = explode("/", $p); //unset($_SERVER['PHP_AUTH_USER']); if ($info['auth'] === true && api_user() === false) { api_login($a); } load_contact_links(api_user()); $channel = $a->get_channel(); logger('API call for ' . $channel['channel_name'] . ': ' . $a->query_string); logger('API parameters: ' . print_r($_REQUEST, true)); $type = "json"; if (strpos($a->query_string, ".xml") > 0) { $type = "xml"; } if (strpos($a->query_string, ".json") > 0) { $type = "json"; } if (strpos($a->query_string, ".rss") > 0) { $type = "rss"; } if (strpos($a->query_string, ".atom") > 0) { $type = "atom"; } if (strpos($a->query_string, ".as") > 0) { $type = "as"; } $r = call_user_func($info['func'], $a, $type); if ($r === false) { return; } switch ($type) { case "xml": $r = mb_convert_encoding($r, "UTF-8", mb_detect_encoding($r)); header("Content-Type: text/xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "json": header("Content-Type: application/json"); foreach ($r as $rr) { $json = json_encode($rr); } if ($_GET['callback']) { $json = $_GET['callback'] . "(" . $json . ")"; } return $json; break; case "rss": header("Content-Type: application/rss+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "atom": header("Content-Type: application/atom+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "as": //header ("Content-Type: application/json"); //foreach($r as $rr) // return json_encode($rr); return json_encode($r); break; } //echo "<pre>"; var_dump($r); die(); } } header("HTTP/1.1 404 Not Found"); logger('API call not implemented: ' . $a->query_string . " - " . print_r($_REQUEST, true)); $r = '<status><error>not implemented</error></status>'; switch ($type) { case "xml": header("Content-Type: text/xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "json": header("Content-Type: application/json"); return json_encode(array('error' => 'not implemented')); break; case "rss": header("Content-Type: application/rss+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "atom": header("Content-Type: application/atom+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; } }
function item_photo_menu($item) { $a = get_app(); $ssl_state = false; if (local_user()) { $ssl_state = true; if (!count($a->contacts)) { load_contact_links(local_user()); } } $sub_link = ""; $poke_link = ""; $contact_url = ""; $pm_url = ""; $status_link = ""; $photos_link = ""; $posts_link = ""; if (local_user() && local_user() == $item['uid'] && $item['parent'] == $item['id'] && !$item['self']) { $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;'; } $sparkle = false; $profile_link = best_link_url($item, $sparkle, $ssl_state); if ($profile_link === 'mailbox') { $profile_link = ''; } if ($sparkle) { $cid = intval(basename($profile_link)); $status_link = $profile_link . "?url=status"; $photos_link = $profile_link . "?url=photos"; $profile_link = $profile_link . "?url=profile"; $pm_url = $a->get_baseurl($ssl_state) . '/message/new/' . $cid; $zurl = ''; } else { $profile_link = zrl($profile_link); if (local_user() && local_user() == $item['uid'] && link_compare($item['url'], $item['author-link'])) { $cid = $item['contact-id']; } else { $cid = 0; } } if ($cid && !$item['self']) { $poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $cid; $contact_url = $a->get_baseurl($ssl_state) . '/contacts/' . $cid; $posts_link = $a->get_baseurl($ssl_state) . '/network/0?nets=all&cid=' . $cid; $clean_url = normalise_link($item['author-link']); if (local_user() && local_user() == $item['uid']) { if (isset($a->contacts) && x($a->contacts, $clean_url)) { if ($a->contacts[$clean_url]['network'] === NETWORK_DIASPORA) { $pm_url = $a->get_baseurl($ssl_state) . '/message/new/' . $cid; } } } } $menu = array(t("Follow Thread") => $sub_link, t("View Status") => $status_link, t("View Profile") => $profile_link, t("View Photos") => $photos_link, t("Network Posts") => $posts_link, t("Edit Contact") => $contact_url, t("Send PM") => $pm_url, t("Poke") => $poke_link); $args = array('item' => $item, 'menu' => $menu); call_hooks('item_photo_menu', $args); $menu = $args['menu']; $o = ""; foreach ($menu as $k => $v) { if (strpos($v, 'javascript:') === 0) { $v = substr($v, 11); $o .= "<li><a href=\"#\" onclick=\"{$v}\">{$k}</a></li>\n"; } elseif ($v != "") { $o .= "<li><a href=\"{$v}\">{$k}</a></li>\n"; } } return $o; }
function item_photo_menu($item) { $a = get_app(); $contact = null; $ssl_state = false; $sub_link = ""; $poke_link = ""; $contact_url = ""; $pm_url = ""; $vsrc_link = ""; $follow_url = ""; $local_channel = local_channel(); if ($local_channel) { $ssl_state = true; if (!count($a->contacts)) { load_contact_links($local_channel); } $channel = $a->get_channel(); $channel_hash = $channel ? $channel['channel_hash'] : ''; } if ($local_channel && $local_channel == $item['uid']) { $vsrc_link = 'javascript:viewsrc(' . $item['id'] . '); return false;'; if ($item['parent'] == $item['id'] && $channel && $channel_hash != $item['author_xchan']) { $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;'; } } $profile_link = chanlink_hash($item['author_xchan']); if ($item['uid'] > 0) { $pm_url = $a->get_baseurl($ssl_state) . '/mail/new/?f=&hash=' . $item['author_xchan']; } if ($a->contacts && array_key_exists($item['author_xchan'], $a->contacts)) { $contact = $a->contacts[$item['author_xchan']]; } else { if ($local_channel && $item['author']['xchan_addr']) { $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr']; } } if ($contact) { $poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $contact['abook_id']; if (!($contact['abook_flags'] & ABOOK_FLAG_SELF)) { $contact_url = $a->get_baseurl($ssl_state) . '/connedit/' . $contact['abook_id']; } $posts_link = $a->get_baseurl($ssl_state) . '/network/?cid=' . $contact['abook_id']; $clean_url = normalise_link($item['author-link']); } $menu = array(t("View Source") => $vsrc_link, t("Follow Thread") => $sub_link, t("View Status") => $status_link, t("View Profile") => $profile_link, t("View Photos") => $photos_link, t("Matrix Activity") => $posts_link, t("Connect") => $follow_url, t("Edit Contact") => $contact_url, t("Send PM") => $pm_url, t("Poke") => $poke_link); $args = array('item' => $item, 'menu' => $menu); call_hooks('item_photo_menu', $args); $menu = $args['menu']; $o = ""; foreach ($menu as $k => $v) { if (strpos($v, 'javascript:') === 0) { $v = substr($v, 11); $o .= "<li><a href=\"#\" onclick=\"{$v}\">{$k}</a></li>\n"; } elseif ($v != "") { $o .= "<li><a href=\"{$v}\">{$k}</a></li>\n"; } } return $o; }
function item_photo_menu($item) { $a = get_app(); if (local_user() && !count($a->contacts)) { load_contact_links(local_user()); } $contact_url = ""; $pm_url = ""; $status_link = ""; $photos_link = ""; $posts_link = ""; $sparkle = false; $profile_link = best_link_url($item, $sparkle); if ($profile_link === 'mailbox') { $profile_link = ''; } if ($sparkle) { $cid = intval(basename($profile_link)); $status_link = $profile_link . "?url=status"; $photos_link = $profile_link . "?url=photos"; $profile_link = $profile_link . "?url=profile"; $pm_url = $a->get_baseurl() . '/message/new/' . $cid; } else { if (local_user() && local_user() == $item['uid'] && link_compare($item['url'], $item['author-link'])) { $cid = $item['contact-id']; } else { $cid = 0; } } if ($cid && !$item['self']) { $contact_url = $a->get_baseurl() . '/contacts/' . $cid; $posts_link = $a->get_baseurl() . '/network/?cid=' . $cid; } $menu = array(t("View status") => $status_link, t("View profile") => $profile_link, t("View photos") => $photos_link, t("View recent") => $posts_link, t("Edit contact") => $contact_url, t("Send PM") => $pm_url); $args = array($item, &$menu); call_hooks('item_photo_menu', $args); $o = ""; foreach ($menu as $k => $v) { if ($v != "") { $o .= "<li><a href='{$v}'>{$k}</a></li>\n"; } } return $o; }
function render_content(&$a, $items, $mode, $update, $preview = false) { require_once 'include/bbcode.php'; require_once 'mod/proxy.php'; $ssl_state = local_user() ? true : false; $profile_owner = 0; $page_writeable = false; $previewing = $preview ? ' preview ' : ''; if ($mode === 'network') { $profile_owner = local_user(); $page_writeable = true; } if ($mode === 'profile') { $profile_owner = $a->profile['profile_uid']; $page_writeable = can_write_wall($a, $profile_owner); } if ($mode === 'notes') { $profile_owner = local_user(); $page_writeable = true; } if ($mode === 'display') { $profile_owner = $a->profile['uid']; $page_writeable = can_write_wall($a, $profile_owner); } if ($mode === 'community') { $profile_owner = 0; $page_writeable = false; } if ($update) { $return_url = $_SESSION['return_url']; } else { $return_url = $_SESSION['return_url'] = $a->query_string; } load_contact_links(local_user()); $cb = array('items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview); call_hooks('conversation_start', $cb); $items = $cb['items']; $cmnt_tpl = get_markup_template('comment_item.tpl'); $tpl = 'wall_item.tpl'; $wallwall = 'wallwall_item.tpl'; $hide_comments_tpl = get_markup_template('hide_comments.tpl'); $alike = array(); $dlike = array(); // array with html for each thread (parent+comments) $threads = array(); $threadsid = -1; if ($items && count($items)) { if ($mode === 'network-new' || $mode === 'search' || $mode === 'community') { // "New Item View" on network page or search page results // - just loop through the items and format them minimally for display //$tpl = get_markup_template('search_item.tpl'); $tpl = 'search_item.tpl'; foreach ($items as $item) { $threadsid++; $comment = ''; $owner_url = ''; $owner_photo = ''; $owner_name = ''; $sparkle = ''; if ($mode === 'search' || $mode === 'community') { if ((activity_match($item['verb'], ACTIVITY_LIKE) || activity_match($item['verb'], ACTIVITY_DISLIKE)) && $item['id'] != $item['parent']) { continue; } $nickname = $item['nickname']; } else { $nickname = $a->user['nickname']; } // prevent private email from leaking. if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) { continue; } $profile_name = strlen($item['author-name']) ? $item['author-name'] : $item['name']; if ($item['author-link'] && !$item['author-name']) { $profile_name = $item['author-link']; } $sp = false; $profile_link = best_link_url($item, $sp); if ($profile_link === 'mailbox') { $profile_link = ''; } if ($sp) { $sparkle = ' sparkle'; } else { $profile_link = zrl($profile_link); } $normalised = normalise_link(strlen($item['author-link']) ? $item['author-link'] : $item['url']); if ($normalised != 'mailbox' && x($a->contacts[$normalised])) { $profile_avatar = $a->contacts[$normalised]['thumb']; } else { $profile_avatar = strlen($item['author-avatar']) ? $a->get_cached_avatar_image($item['author-avatar']) : $item['thumb']; } $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); call_hooks('render_location', $locate); $location = strlen($locate['html']) ? $locate['html'] : render_location_dummy($locate); localize_item($item); if ($mode === 'network-new') { $dropping = true; } else { $dropping = false; } $drop = array('dropping' => $dropping, 'select' => t('Select'), 'delete' => t('Delete')); $star = false; $isstarred = "unstarred"; $lock = false; $likebuttons = false; $shareable = false; $body = prepare_body($item, true); if ($a->theme['template_engine'] === 'internal') { $name_e = template_escape($profile_name); $title_e = template_escape($item['title']); $body_e = template_escape($body); $text_e = strip_tags(template_escape($body)); $location_e = template_escape($location); $owner_name_e = template_escape($owner_name); } else { $name_e = $profile_name; $title_e = $item['title']; $body_e = $body; $text_e = strip_tags($body); $location_e = $location; $owner_name_e = $owner_name; } //$tmp_item = replace_macros($tpl,array( $tmp_item = array('template' => $tpl, 'id' => $preview ? 'P0' : $item['item_id'], 'linktitle' => sprintf(t('View %s\'s profile @ %s'), $profile_name, strlen($item['author-link']) ? $item['author-link'] : $item['url']), 'profile_url' => $profile_link, 'item_photo_menu' => item_photo_menu($item), 'name' => $name_e, 'sparkle' => $sparkle, 'lock' => $lock, 'thumb' => proxy_url($profile_avatar), 'title' => $title_e, 'body' => $body_e, 'text' => $text_e, 'ago' => $item['app'] ? sprintf(t('%s from %s'), relative_date($item['created']), $item['app']) : relative_date($item['created']), 'location' => $location_e, 'indent' => '', 'owner_name' => $owner_name_e, 'owner_url' => $owner_url, 'owner_photo' => proxy_url($owner_photo), 'plink' => get_plink($item), 'edpost' => false, 'isstarred' => $isstarred, 'star' => $star, 'drop' => $drop, 'vote' => $likebuttons, 'like' => '', 'dislike' => '', 'comment' => '', 'conv' => $preview ? '' : array('href' => $a->get_baseurl($ssl_state) . '/display/' . $item['guid'], 'title' => t('View in context')), 'previewing' => $previewing, 'wait' => t('Please wait')); $arr = array('item' => $item, 'output' => $tmp_item); call_hooks('display_item', $arr); $threads[$threadsid]['id'] = $item['item_id']; $threads[$threadsid]['items'] = array($arr['output']); } } else { // Normal View // Figure out how many comments each parent has // (Comments all have gravity of 6) // Store the result in the $comments array $comments = array(); foreach ($items as $item) { if (intval($item['gravity']) == 6 && $item['id'] != $item['parent']) { if (!x($comments, $item['parent'])) { $comments[$item['parent']] = 1; } else { $comments[$item['parent']] += 1; } } elseif (!x($comments, $item['parent'])) { $comments[$item['parent']] = 0; } // avoid notices later on } // map all the like/dislike activities for each parent item // Store these in the $alike and $dlike arrays foreach ($items as $item) { like_puller($a, $item, $alike, 'like'); like_puller($a, $item, $dlike, 'dislike'); } $comments_collapsed = false; $comments_seen = 0; $comment_lastcollapsed = false; $comment_firstcollapsed = false; $blowhard = 0; $blowhard_count = 0; foreach ($items as $item) { $comment = ''; $template = $tpl; $commentww = ''; $sparkle = ''; $owner_url = $owner_photo = $owner_name = ''; // We've already parsed out like/dislike for special treatment. We can ignore them now if ((activity_match($item['verb'], ACTIVITY_LIKE) || activity_match($item['verb'], ACTIVITY_DISLIKE)) && $item['id'] != $item['parent']) { continue; } $toplevelpost = $item['id'] == $item['parent'] ? true : false; // Take care of author collapsing and comment collapsing // (author collapsing is currently disabled) // If a single author has more than 3 consecutive top-level posts, squash the remaining ones. // If there are more than two comments, squash all but the last 2. if ($toplevelpost) { $item_writeable = $item['writable'] || $item['self'] ? true : false; $comments_seen = 0; $comments_collapsed = false; $comment_lastcollapsed = false; $comment_firstcollapsed = false; $threadsid++; $threads[$threadsid]['id'] = $item['item_id']; $threads[$threadsid]['private'] = $item['private']; $threads[$threadsid]['items'] = array(); } else { // prevent private email reply to public conversation from leaking. if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) { continue; } $comments_seen++; $comment_lastcollapsed = false; $comment_firstcollapsed = false; } $override_comment_box = $page_writeable && $item_writeable ? true : false; $show_comment_box = $page_writeable && $item_writeable && $comments_seen == $comments[$item['parent']] ? true : false; if ($comments[$item['parent']] > 2 && $comments_seen <= $comments[$item['parent']] - 2 && $item['gravity'] == 6) { if (!$comments_collapsed) { $threads[$threadsid]['num_comments'] = sprintf(tt('%d comment', '%d comments', $comments[$item['parent']]), $comments[$item['parent']]); $threads[$threadsid]['hidden_comments_num'] = $comments[$item['parent']]; $threads[$threadsid]['hidden_comments_text'] = tt('comment', 'comments', $comments[$item['parent']]); $threads[$threadsid]['hide_text'] = t('show more'); $comments_collapsed = true; $comment_firstcollapsed = true; } } if ($comments[$item['parent']] > 2 && $comments_seen == $comments[$item['parent']] - 1) { $comment_lastcollapsed = true; } $redirect_url = $a->get_baseurl($ssl_state) . '/redir/' . $item['cid']; $lock = $item['private'] == 1 || $item['uid'] == local_user() && (strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid'])) ? t('Private Message') : false; // Top-level wall post not written by the wall owner (wall-to-wall) // First figure out who owns it. $osparkle = ''; if ($toplevelpost && !$item['self'] && $mode !== 'profile') { if ($item['wall']) { // On the network page, I am the owner. On the display page it will be the profile owner. // This will have been stored in $a->page_contact by our calling page. // Put this person as the wall owner of the wall-to-wall notice. $owner_url = zrl($a->page_contact['url']); $owner_photo = $a->page_contact['thumb']; $owner_name = $a->page_contact['name']; $template = $wallwall; $commentww = 'ww'; } if (!$item['wall'] && $item['owner-link']) { $owner_linkmatch = $item['owner-link'] && link_compare($item['owner-link'], $item['author-link']); $alias_linkmatch = $item['alias'] && link_compare($item['alias'], $item['author-link']); $owner_namematch = $item['owner-name'] && $item['owner-name'] == $item['author-name']; if (!$owner_linkmatch && !$alias_linkmatch && !$owner_namematch) { // The author url doesn't match the owner (typically the contact) // and also doesn't match the contact alias. // The name match is a hack to catch several weird cases where URLs are // all over the park. It can be tricked, but this prevents you from // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn // well that it's the same Bob Smith. // But it could be somebody else with the same name. It just isn't highly likely. $owner_url = $item['owner-link']; $owner_photo = $item['owner-avatar']; $owner_name = $item['owner-name']; $template = $wallwall; $commentww = 'ww'; // If it is our contact, use a friendly redirect link if (link_compare($item['owner-link'], $item['url']) && $item['network'] === NETWORK_DFRN) { $owner_url = $redirect_url; $osparkle = ' sparkle'; } else { $owner_url = zrl($owner_url); } } } } $likebuttons = ''; $shareable = $profile_owner == local_user() && $item['private'] != 1 ? true : false; if ($page_writeable) { /* if($toplevelpost) { */ $likebuttons = array('like' => array(t("I like this (toggle)"), t("like")), 'dislike' => array(t("I don't like this (toggle)"), t("dislike"))); if ($shareable) { $likebuttons['share'] = array(t('Share this'), t('share')); } /* } */ $qc = $qcomment = null; if (in_array('qcomment', $a->plugins)) { $qc = local_user() ? get_pconfig(local_user(), 'qcomment', 'words') : null; $qcomment = $qc ? explode("\n", $qc) : null; } if ($show_comment_box || $show_comment_box == false && $override_comment_box == false && $item['last-child']) { $comment = replace_macros($cmnt_tpl, array('$return_path' => '', '$jsreload' => $mode === 'display' ? $_SESSION['return_url'] : '', '$type' => $mode === 'profile' ? 'wall-comment' : 'net-comment', '$id' => $item['item_id'], '$parent' => $item['parent'], '$qcomment' => $qcomment, '$profile_uid' => $profile_owner, '$mylink' => $a->contact['url'], '$mytitle' => t('This is you'), '$myphoto' => $a->contact['thumb'], '$comment' => t('Comment'), '$submit' => t('Submit'), '$edbold' => t('Bold'), '$editalic' => t('Italic'), '$eduline' => t('Underline'), '$edquote' => t('Quote'), '$edcode' => t('Code'), '$edimg' => t('Image'), '$edurl' => t('Link'), '$edvideo' => t('Video'), '$preview' => t('Preview'), '$sourceapp' => t($a->sourcename), '$ww' => $mode === 'network' ? $commentww : '', '$rand_num' => random_digits(12))); } } if (local_user() && link_compare($a->contact['url'], $item['author-link'])) { $edpost = array($a->get_baseurl($ssl_state) . "/editpost/" . $item['id'], t("Edit")); } else { $edpost = false; } $drop = ''; $dropping = false; if (intval($item['contact-id']) && $item['contact-id'] == remote_user() || $item['uid'] == local_user()) { $dropping = true; } $drop = array('dropping' => $dropping, 'select' => t('Select'), 'delete' => t('Delete')); $star = false; $filer = false; $isstarred = "unstarred"; if ($profile_owner == local_user()) { if ($toplevelpost) { $isstarred = $item['starred'] ? "starred" : "unstarred"; $star = array('do' => t("add star"), 'undo' => t("remove star"), 'toggle' => t("toggle star status"), 'classdo' => $item['starred'] ? "hidden" : "", 'classundo' => $item['starred'] ? "" : "hidden", 'starred' => t('starred'), 'tagger' => t("add tag"), 'classtagger' => ""); } $filer = t("save to folder"); } $photo = $item['photo']; $thumb = $item['thumb']; // Post was remotely authored. $diff_author = link_compare($item['url'], $item['author-link']) ? false : true; $profile_name = strlen($item['author-name']) && $diff_author ? $item['author-name'] : $item['name']; if ($item['author-link'] && !$item['author-name']) { $profile_name = $item['author-link']; } $sp = false; $profile_link = best_link_url($item, $sp); if ($profile_link === 'mailbox') { $profile_link = ''; } if ($sp) { $sparkle = ' sparkle'; } else { $profile_link = zrl($profile_link); } $normalised = normalise_link(strlen($item['author-link']) ? $item['author-link'] : $item['url']); if ($normalised != 'mailbox' && x($a->contacts, $normalised)) { $profile_avatar = $a->contacts[$normalised]['thumb']; } else { $profile_avatar = strlen($item['author-avatar']) && $diff_author ? $item['author-avatar'] : $a->get_cached_avatar_image($thumb); } $like = x($alike, $item['uri']) ? format_like($alike[$item['uri']], $alike[$item['uri'] . '-l'], 'like', $item['uri']) : ''; $dislike = x($dlike, $item['uri']) ? format_like($dlike[$item['uri']], $dlike[$item['uri'] . '-l'], 'dislike', $item['uri']) : ''; $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); call_hooks('render_location', $locate); $location = strlen($locate['html']) ? $locate['html'] : render_location_dummy($locate); $indent = $toplevelpost ? '' : ' comment'; $shiny = ""; if (strcmp(datetime_convert('UTC', 'UTC', $item['created']), datetime_convert('UTC', 'UTC', 'now - 12 hours')) > 0) { $shiny = 'shiny'; } // localize_item($item); $tags = array(); foreach (explode(',', $item['tag']) as $tag) { $tag = trim($tag); if ($tag != "") { $tags[] = bbcode($tag); } } // Build the HTML $body = prepare_body($item, true); //$tmp_item = replace_macros($template, if ($a->theme['template_engine'] === 'internal') { $body_e = template_escape($body); $text_e = strip_tags(template_escape($body)); $name_e = template_escape($profile_name); $title_e = template_escape($item['title']); $location_e = template_escape($location); $owner_name_e = template_escape($owner_name); } else { $body_e = $body; $text_e = strip_tags($body); $name_e = $profile_name; $title_e = $item['title']; $location_e = $location; $owner_name_e = $owner_name; } $tmp_item = array('comment_firstcollapsed' => $comment_firstcollapsed, 'comment_lastcollapsed' => $comment_lastcollapsed, 'template' => $template, 'type' => implode("", array_slice(explode("/", $item['verb']), -1)), 'tags' => $tags, 'body' => $body_e, 'text' => $text_e, 'id' => $item['item_id'], 'linktitle' => sprintf(t('View %s\'s profile @ %s'), $profile_name, strlen($item['author-link']) ? $item['author-link'] : $item['url']), 'olinktitle' => sprintf(t('View %s\'s profile @ %s'), $profile_name, strlen($item['owner-link']) ? $item['owner-link'] : $item['url']), 'to' => t('to'), 'wall' => t('Wall-to-Wall'), 'vwall' => t('via Wall-To-Wall:'), 'profile_url' => $profile_link, 'item_photo_menu' => item_photo_menu($item), 'name' => $name_e, 'thumb' => proxy_url($profile_avatar), 'osparkle' => $osparkle, 'sparkle' => $sparkle, 'title' => $title_e, 'ago' => $item['app'] ? sprintf(t('%s from %s'), relative_date($item['created']), $item['app']) : relative_date($item['created']), 'lock' => $lock, 'location' => $location_e, 'indent' => $indent, 'shiny' => $shiny, 'owner_url' => $owner_url, 'owner_photo' => proxy_url($owner_photo), 'owner_name' => $owner_name_e, 'plink' => get_plink($item), 'edpost' => $edpost, 'isstarred' => $isstarred, 'star' => $star, 'filer' => $filer, 'drop' => $drop, 'vote' => $likebuttons, 'like' => $like, 'dislike' => $dislike, 'comment' => $comment, 'previewing' => $previewing, 'wait' => t('Please wait')); $arr = array('item' => $item, 'output' => $tmp_item); call_hooks('display_item', $arr); $threads[$threadsid]['items'][] = $arr['output']; } } } return $threads; }
function item_photo_menu($item) { $contact = null; $ssl_state = false; $sub_link = ""; $poke_link = ""; $contact_url = ""; $pm_url = ""; $vsrc_link = ""; $follow_url = ""; $local_channel = local_channel(); if ($local_channel) { $ssl_state = true; if (!count(App::$contacts)) { load_contact_links($local_channel); } $channel = App::get_channel(); $channel_hash = $channel ? $channel['channel_hash'] : ''; } if ($local_channel && $local_channel == $item['uid']) { $vsrc_link = 'javascript:viewsrc(' . $item['id'] . '); return false;'; if ($item['parent'] == $item['id'] && $channel && $channel_hash != $item['author_xchan']) { $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;'; } if ($channel) { $unsub_link = 'javascript:dounsubthread(' . $item['id'] . '); return false;'; } } $profile_link = chanlink_hash($item['author_xchan']); if ($item['uid'] > 0) { $pm_url = z_root() . '/mail/new/?f=&hash=' . $item['author_xchan']; } if (App::$contacts && array_key_exists($item['author_xchan'], App::$contacts)) { $contact = App::$contacts[$item['author_xchan']]; } else { if ($local_channel && $item['author']['xchan_addr']) { $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr']; } } if ($contact) { $poke_link = z_root() . '/poke/?f=&c=' . $contact['abook_id']; if (!intval($contact['abook_self'])) { $contact_url = z_root() . '/connedit/' . $contact['abook_id']; } $posts_link = z_root() . '/network/?cid=' . $contact['abook_id']; $clean_url = normalise_link($item['author-link']); } $poco_rating = get_config('system', 'poco_rating_enable'); // if unset default to enabled if ($poco_rating === false) { $poco_rating = true; } $ratings_url = $poco_rating ? z_root() . '/ratings/' . urlencode($item['author_xchan']) : ''; $post_menu = array(t("View Source") => $vsrc_link, t("Follow Thread") => $sub_link, t("Unfollow Thread") => $unsub_link); $author_menu = array(t("View Profile") => $profile_link, t("Activity/Posts") => $posts_link, t("Connect") => $follow_url, t("Edit Connection") => $contact_url, t("Message") => $pm_url, t('Ratings') => $ratings_url, t("Poke") => $poke_link); $args = array('item' => $item, 'post_menu' => $post_menu, 'author_menu' => $author_menu); call_hooks('item_photo_menu', $args); $menu = array_merge($args['post_menu'], $args['author_menu']); $o = ""; foreach ($menu as $k => $v) { if (strpos($v, 'javascript:') === 0) { $v = substr($v, 11); $o .= "<li><a href=\"#\" onclick=\"{$v}\">{$k}</a></li>\n"; } elseif ($v != "") { $o .= "<li><a href=\"{$v}\">{$k}</a></li>\n"; } } return $o; }
function api_call() { $p = App::$cmd; $type = null; if (strrpos($p, '.')) { $type = substr($p, strrpos($p, '.') + 1); if (strpos($type, '/') === false) { $p = substr($p, 0, strrpos($p, '.')); // recalculate App argc,argv since we just extracted the type from it App::$argv = explode('/', $p); App::$argc = count(App::$argv); } } if (!$type || !in_array($type, ['json', 'xml', 'rss', 'as', 'atom'])) { $type = 'json'; } $info = \Zotlabs\Lib\Api_router::find($p); logger('info: ' . $p . ' type: ' . $type . ' ' . print_r($info, true)); if ($info) { if ($info['auth'] === true && api_user() === false) { api_login($a); } load_contact_links(api_user()); $channel = App::get_channel(); logger('API call for ' . $channel['channel_name'] . ': ' . App::$query_string); logger('API parameters: ' . print_r($_REQUEST, true)); $r = call_user_func($info['func'], $type); if ($r === false) { return; } switch ($type) { case "xml": $r = mb_convert_encoding($r, "UTF-8", mb_detect_encoding($r)); header("Content-Type: text/xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "json": header("Content-Type: application/json"); if ($r) { foreach ($r as $rv) { $json = json_encode($rv); } } // Lookup JSONP to understand these lines. They provide cross-domain AJAX ability. if ($_GET['callback']) { $json = $_GET['callback'] . '(' . $json . ')'; } return $json; break; case "rss": header("Content-Type: application/rss+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "atom": header("Content-Type: application/atom+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "as": if ($r) { foreach ($r as $rv) { $json = json_encode($rv); } } return $json; break; } } header("HTTP/1.1 404 Not Found"); logger('API call not implemented: ' . App::$query_string . ' - ' . print_r($_REQUEST, true)); $r = '<status><error>not implemented</error></status>'; switch ($type) { case "xml": header("Content-Type: text/xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "json": header("Content-Type: application/json"); return json_encode(array('error' => 'not implemented')); break; case "rss": header("Content-Type: application/rss+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; case "atom": header("Content-Type: application/atom+xml"); return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r; break; } }
function item_photo_menu($item) { $a = get_app(); $ssl_state = false; if (local_user()) { $ssl_state = true; if (!count($a->contacts)) { load_contact_links(local_user()); } } $sub_link = ""; $poke_link = ""; $contact_url = ""; $pm_url = ""; $status_link = ""; $photos_link = ""; $posts_link = ""; if (local_user() && local_user() == $item['uid'] && $item['parent'] == $item['id'] && !$item['self']) { $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;'; } $sparkle = false; $profile_link = best_link_url($item, $sparkle, $ssl_state); if ($profile_link === 'mailbox') { $profile_link = ''; } if ($sparkle) { $cid = intval(basename($profile_link)); $status_link = $profile_link . "?url=status"; $photos_link = $profile_link . "?url=photos"; $profile_link = $profile_link . "?url=profile"; $pm_url = $a->get_baseurl($ssl_state) . '/message/new/' . $cid; $zurl = ''; } else { $profile_link = zrl($profile_link); if (local_user() && local_user() == $item['uid'] && link_compare($item['url'], $item['author-link'])) { $cid = $item['contact-id']; } else { $r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' ORDER BY `uid` DESC LIMIT 1", intval(local_user()), dbesc(normalise_link($item['author-link']))); if ($r) { $cid = $r[0]["id"]; if ($r[0]["network"] == NETWORK_DIASPORA) { $pm_url = $a->get_baseurl($ssl_state) . '/message/new/' . $cid; } } else { $cid = 0; } } } if ($cid && !$item['self']) { $poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $cid; $contact_url = $a->get_baseurl($ssl_state) . '/contacts/' . $cid; $posts_link = $a->get_baseurl($ssl_state) . '/contacts/' . $cid . '/posts'; $clean_url = normalise_link($item['author-link']); if (local_user() && local_user() == $item['uid']) { if (isset($a->contacts) && x($a->contacts, $clean_url)) { if ($a->contacts[$clean_url]['network'] === NETWORK_DIASPORA) { $pm_url = $a->get_baseurl($ssl_state) . '/message/new/' . $cid; } } } } if (local_user()) { $menu = array(t("Follow Thread") => $sub_link, t("View Status") => $status_link, t("View Profile") => $profile_link, t("View Photos") => $photos_link, t("Network Posts") => $posts_link, t("Edit Contact") => $contact_url, t("Send PM") => $pm_url); if ($a->contacts[$clean_url]['network'] === NETWORK_DFRN) { $menu[t("Poke")] = $poke_link; } if (($cid == 0 or $a->contacts[$clean_url]['rel'] == CONTACT_IS_FOLLOWER) and in_array($item['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) { $menu[t("Connect/Follow")] = $a->get_baseurl($ssl_state) . "/follow?url=" . urlencode($item['author-link']); } } else { $menu = array(t("View Profile") => $item['author-link']); } $args = array('item' => $item, 'menu' => $menu); call_hooks('item_photo_menu', $args); $menu = $args['menu']; $o = ""; foreach ($menu as $k => $v) { if (strpos($v, 'javascript:') === 0) { $v = substr($v, 11); $o .= "<li role=\"menuitem\"><a onclick=\"{$v}\">{$k}</a></li>\n"; } elseif ($v != "") { $o .= "<li role=\"menuitem\"><a href=\"{$v}\">{$k}</a></li>\n"; } } return $o; }