_getSettings(); ?>


_reposUrl}/{$newPluginData->slug}/tags/{$newPluginData->new_version}/upgrade.html"; $response = wp_remote_get ( $url ); $code = (int) wp_remote_retrieve_response_code ( $response ); if ( $code == 200 ) { echo wp_remote_retrieve_body ( $response ); } } /** * Pulls the JSON feed from Twitter and returns an array of objects * * @param array $widgetOptions - settings needed to get feed url, etc * @return array */ private function _parseFeed($widgetOptions) { $feedUrl = $this->_getFeedUrl($widgetOptions); $resp = wp_remote_request($feedUrl, array('timeout' => $widgetOptions['fetchTimeOut'])); if ( !is_wp_error($resp) && $resp['response']['code'] >= 200 && $resp['response']['code'] < 300 ) { if (function_exists('json_decode')) { return json_decode($resp['body']); } else { require_once('json_decode.php'); return Zend_Json_Decoder::decode($resp['body']); } } else { // Failed to fetch url; if (empty($widgetOptions['errmsg'])) { $widgetOptions['errmsg'] = __('Could not connect to Twitter', 'twitter-widget-pro'); } throw new wpTwitterWidgetException($widgetOptions['errmsg']); } } /** * Gets the URL for the desired feed. * * @param array $widgetOptions - settings needed such as username, feet type, etc * @param string[optional] $type - 'rss' or 'json' * @param bool[optional] $count - If true, it adds the count parameter to the URL * @return string - Twitter feed URL */ private function _getFeedUrl($widgetOptions, $type = 'json', $count = true) { if (!in_array($type, array('rss', 'json'))) { $type = 'json'; } if ( $count ) { $num = ($widgetOptions['hidereplies'])? 100:$widgetOptions['items']; $count = sprintf('?count=%u', $num); } else { $count = ''; } return sprintf('http://twitter.com/statuses/user_timeline/%1$s.%2$s%3$s', $widgetOptions['username'], $type, $count); } /** * Replace @username with a link to that twitter user * * @param string $text - Tweet text * @return string - Tweet text with @replies linked */ public function linkTwitterUsers($text) { $text = preg_replace('/(^|\s)@(\w*)/i', '$1@$2', $text); return $text; } /** * Replace #hashtag with a link to search.twitter.com for that hashtag * * @param string $text - Tweet text * @return string - Tweet text with #hashtags linked */ public function linkHashtags($text) { $text = preg_replace_callback('/(^|\s)(#\w*)/i', array($this, '_hashtagLink'), $text); return $text; } /** * Replace #hashtag with a link to search.twitter.com for that hashtag * * @param array $matches - Tweet text * @return string - Tweet text with #hashtags linked */ private function _hashtagLink($matches) { return "{$matches[1]}{$matches[2]}"; } /** * Turn URLs into links * * @param string $text - Tweet text * @return string - Tweet text with URLs repalced with links */ public function linkUrls($text) { /** * match protocol://address/path/file.extension?some=variable&another=asf% * $1 is a possible space, this keeps us from linking href="[link]" etc * $2 is the whole URL * $3 is protocol:// * $4 is the URL without the protocol:// * $5 is the URL parameters */ $text = preg_replace("/(^|\s)(([a-zA-Z]+:\/\/)([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9~\/*-?&%]*))/i", "$1$2", $text); /** * match www.something.domain/path/file.extension?some=variable&another=asf% * $1 is a possible space, this keeps us from linking href="[link]" etc * $2 is the whole URL that was matched. The protocol is missing, so we assume http:// * $3 is www. * $4 is the URL matched without the www. * $5 is the URL parameters */ $text = preg_replace("/(^|\s)(www\.([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9~\/*-?&%]*))/i", "$1$2", $text); return $text; } /** * Gets tweets, from cache if possible * * @param array $widgetOptions - options needed to get feeds * @return array - Array of objects */ private function _getTweets($widgetOptions) { $feedHash = sha1($this->_getFeedUrl($widgetOptions)); $tweets = get_option("wptw-{$feedHash}"); $cacheAge = get_option("wptw-{$feedHash}-time"); //If we don't have cache or it's more than 5 minutes old if ( empty($tweets) || (time() - $cacheAge) > 300 ) { try { $tweets = $this->_parseFeed($widgetOptions); update_option("wptw-{$feedHash}", $tweets); update_option("wptw-{$feedHash}-time", time()); } catch (wpTwitterWidgetException $e) { throw $e; } } return $tweets; } /** * Displays the Twitter widget, with all tweets in an unordered list. * Things are classed but not styled to allow easy styling. * * @param array $args - Widget Settings * @param array|int $widget_args - Widget Number */ public function display($args, $widget_args = 1) { extract( $args, EXTR_SKIP ); if ( is_numeric($widget_args) ) $widget_args = array( 'number' => $widget_args ); $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); extract( $widget_args, EXTR_SKIP ); $options = get_option('widget_twitter'); if ( !isset($options[$number]) ) { return; } // Validate our options $options[$number]['items'] = (int) $options[$number]['items']; if ( $options[$number]['items'] < 1 || 20 < $options[$number]['items'] ) { $options[$number]['items'] = 10; } if (!isset($options[$number]['showts'])) { $options[$number]['showts'] = 86400; } $options[$number]['hiderss'] = (isset($options[$number]['hiderss']) && $options[$number]['hiderss']); $options[$number]['hidereplies'] = (isset($options[$number]['hidereplies']) && $options[$number]['hidereplies']); $options[$number]['avatar'] = (isset($options[$number]['avatar']) && $options[$number]['avatar']); $options[$number]['showXavisysLink'] = (!isset($options[$number]['showXavisysLink']) || $options[$number]['showXavisysLink'] != 'false'); try { $tweets = $this->_getTweets($options[$number]); } catch (wpTwitterWidgetException $e) { $tweets = $e; } echo $before_widget . '
'; // If "hide rss" hasn't been checked, show the linked icon if (!$options[$number]['hiderss']) { if ( file_exists(dirname(__FILE__) . '/rss.png') ) { $icon = str_replace(ABSPATH, get_option('siteurl').'/', dirname(__FILE__)) . '/rss.png'; } else { $icon = get_option('siteurl').'/wp-includes/images/rss.png'; } $feedUrl = $this->_getFeedUrl($options[$number], 'rss', false); $before_title .= "RSS "; } $twitterLink = 'http://twitter.com/' . $options[$number]['username']; $before_title .= ""; $after_title = '' . $after_title; if (empty($options[$number]['title'])) { $options[$number]['title'] = "Twitter: {$options[$number]['username']}"; } echo $before_title . $options[$number]['title'] . $after_title; if (!empty($tweets) && $options[$number]['avatar']) { echo '
'; echo $this->_getProfileImage($tweets[0]->user); echo '
'; } echo '
' . $after_widget; } /** * Returns the Twitter user's profile image, linked to that user's profile * * @param object $user - Twitter User * @return string - Linked image (XHTML) */ private function _getProfileImage($user) { return << {$user->name} profileImage; } /** * Returns the user's screen name as a link inside strong tags. * * @param object $user - Twitter user * @return string - Username as link (XHTML) */ private function _getUserName($user) { return << {$user->screen_name} profileImage; } /** * Sets up admin forms to manage widgets * * @param array|int $widget_args - Widget Number */ public function control($widget_args) { global $wp_registered_widgets; static $updated = false; if ( is_numeric($widget_args) ) $widget_args = array( 'number' => $widget_args ); $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); extract( $widget_args, EXTR_SKIP ); $options = get_option('widget_twitter'); if ( !is_array($options) ) $options = array(); if ( !$updated && !empty($_POST['sidebar']) ) { $sidebar = (string) $_POST['sidebar']; $sidebars_widgets = wp_get_sidebars_widgets(); if ( isset($sidebars_widgets[$sidebar]) ) $this_sidebar =& $sidebars_widgets[$sidebar]; else $this_sidebar = array(); foreach ( $this_sidebar as $_widget_id ) { if ( array($this,'display') == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) { $widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number']; if ( !in_array( "twitter-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed. unset($options[$widget_number]); } } foreach ( (array) $_POST['widget-twitter'] as $widget_number => $widget_twitter ) { if ( !isset($widget_twitter['username']) && isset($options[$widget_number]) ) // user clicked cancel continue; $widget_twitter['title'] = stripslashes($widget_twitter['title']); $widget_twitter['errmsg'] = stripslashes($widget_twitter['errmsg']); if ( !current_user_can('unfiltered_html') ) { $widget_twitter['title'] = strip_tags($widget_twitter['title']); $widget_twitter['errmsg'] = strip_tags($widget_twitter['errmsg']); } $options[$widget_number] = $widget_twitter; } update_option('widget_twitter', $options); $updated = true; } if ( -1 != $number ) { $options[$number]['number'] = $number; $options[$number]['title'] = attribute_escape($options[$number]['title']); $options[$number]['errmsg'] = attribute_escape($options[$number]['errmsg']); $options[$number]['fetchTimeOut'] = attribute_escape($options[$number]['fetchTimeOut']); $options[$number]['username'] = attribute_escape($options[$number]['username']); $options[$number]['hiderss'] = (bool) $options[$number]['hiderss']; $options[$number]['hidereplies'] = (bool) $options[$number]['hidereplies']; $options[$number]['avatar'] = (bool) $options[$number]['avatar']; $options[$number]['showXavisysLink'] = (!isset($options[$number]['showXavisysLink']) || $options[$number]['showXavisysLink'] != 'false'); } // Fix Undefined offset Notice if ( empty($options[$number]) ) { $options[$number] = array(); } $this->_showForm($options[$number]); } /** * Registers widget in such a way as to allow multiple instances of it * * @see wp-includes/widgets.php */ public function register() { if ( !$options = get_option('widget_twitter') ) $options = array(); $widget_ops = array('classname' => 'widget_twitter', 'description' => __('Follow a Twitter Feed', 'twitter-widget-pro')); $control_ops = array('width' => 400, 'height' => 350, 'id_base' => 'twitter'); $name = __('Twitter Widget Pro', 'twitter-widget-pro'); $id = false; foreach ( array_keys($options) as $o ) { // Old widgets can have null values for some reason if ( !isset($options[$o]['title']) || !isset($options[$o]['username']) ) continue; $id = "twitter-$o"; // Never never never translate an id wp_register_sidebar_widget($id, $name, array($this,'display'), $widget_ops, array( 'number' => $o )); wp_register_widget_control($id, $name, array($this,'control'), $control_ops, array( 'number' => $o )); } // If there are none, we register the widget's existance with a generic template if ( !$id ) { wp_register_sidebar_widget( 'twitter-1', $name, array($this,'display'), $widget_ops, array( 'number' => -1 ) ); wp_register_widget_control( 'twitter-1', $name, array($this,'control'), $control_ops, array( 'number' => -1 ) ); } } /** * Displays the actualy for that populates the widget options box in the * admin section * * @param array $args - Current widget settings and widget number, gets combind with defaults */ private function _showForm($args) { $defaultArgs = array( 'title' => '', 'errmsg' => '', 'fetchTimeOut' => '2', 'username' => '', 'hiderss' => false, 'hidereplies' => false, 'avatar' => false, 'showXavisysLink' => true, 'items' => 10, 'showts' => 60 * 60 * 24, 'number' => '%i%' ); $args = wp_parse_args( $args, $defaultArgs ); extract( $args ); ?>

60 * 60 * 24 * 365, // 31,536,000 seconds 'month' => 60 * 60 * 24 * 30, // 2,592,000 seconds 'week' => 60 * 60 * 24 * 7, // 604,800 seconds 'day' => 60 * 60 * 24, // 86,400 seconds 'hour' => 60 * 60, // 3600 seconds 'minute' => 60, // 60 seconds 'second' => 1 // 1 second ); $since = time() - $startTimestamp; if ($max != '-1' && $since >= $max) { return date_i18n('h:i:s A F d, Y', $startTimestamp); } foreach ( $chunks as $key => $seconds ) { // finding the biggest chunk (if the chunk fits, break) if (($count = floor($since / $seconds)) != 0) { break; } } $messages = array( 'year' => _n('about %s year ago', 'about %s years ago', $count, 'twitter-widget-pro'), 'month' => _n('about %s month ago', 'about %s months ago', $count, 'twitter-widget-pro'), 'week' => _n('about %s week ago', 'about %s weeks ago', $count, 'twitter-widget-pro'), 'day' => _n('about %s day ago', 'about %s days ago', $count, 'twitter-widget-pro'), 'hour' => _n('about %s hour ago', 'about %s hours ago', $count, 'twitter-widget-pro'), 'minute' => _n('about %s minute ago', 'about %s minutes ago', $count, 'twitter-widget-pro'), 'second' => _n('about %s second ago', 'about %s seconds ago', $count, 'twitter-widget-pro'), ); return sprintf($messages[$key], $count); } /** * if user agrees to send system information and the last sent info is * outdated then send the stats */ public function sendSysInfo() { $this->_getSettings(); if ($this->_settings['user_agreed_to_send_system_information'] == 'true') { $lastSent = get_option('twp-sysinfo'); $sysinfo = $this->_get_sysinfo(); if (serialize($lastSent) != serialize($sysinfo)) { $params = array( 'method' => 'POST', 'blocking' => false, 'body' => $sysinfo, ); $resp = wp_remote_request( 'http://xavisys.com/plugin-info.php', $params ); update_option( 'twp-sysinfo', $sysinfo ); } } } private function _get_sysinfo() { global $wpdb; $pluginData = get_plugin_data(__FILE__); $s = array(); $s['plugin'] = $pluginData['Name']; $s['id'] = $this->_get_id($pluginData['Name']); $s['version'] = $pluginData['Version']; $s['php_version'] = phpversion(); $s['mysql_version'] = @mysql_get_server_info($wpdb->dbh); $s['server_software'] = $_SERVER["SERVER_SOFTWARE"]; $s['memory_limit'] = ini_get('memory_limit'); return $s; } private function _get_id($name) { $this->_getSettings(); if ( empty($this->_settings['sysinfo-id']) ) { $this->_settings['sysinfo-id'] = sha1( get_bloginfo('url') . $name ); $this->_updateSettings(); } return $this->_settings['sysinfo-id']; } private function _updateSettings() { update_option('twitter_widget_pro', $this->_settings); } private function _getSettings() { $defaults = array( ); $this->_settings = get_option('twitter_widget_pro'); $this->_settings = wp_parse_args($this->_settings, $defaults); } public function addSettingLink( $links, $file ){ if ( empty($this->_pluginBasename) ) { $this->_pluginBasename = plugin_basename(__FILE__); } if ( $file == $this->_pluginBasename ) { // Add settings link to our plugin $link = '' . __('Settings', 'twitter-widget-pro') . ''; array_unshift( $links, $link ); } return $links; } } // Instantiate our class $wpTwitterWidget = new wpTwitterWidget(); /** * Add filters and actions */ add_action( 'admin_menu', array($wpTwitterWidget,'admin_menu') ); add_filter( 'init', array( $wpTwitterWidget, 'init_locale') ); add_filter( 'admin_init', array( $wpTwitterWidget, 'registerSettings') ); add_filter( 'admin_init', array( $wpTwitterWidget, 'sendSysInfo') ); add_action( 'widgets_init', array($wpTwitterWidget, 'register') ); add_filter( 'widget_twitter_content', array($wpTwitterWidget, 'linkTwitterUsers') ); add_filter( 'widget_twitter_content', array($wpTwitterWidget, 'linkUrls') ); add_filter( 'widget_twitter_content', array($wpTwitterWidget, 'linkHashtags') ); add_filter( 'widget_twitter_content', 'convert_chars' ); add_filter( 'plugin_action_links', array($wpTwitterWidget, 'addSettingLink'), 10, 2 );