WordPress.org

Plugin Directory

Changeset 746692


Ignore:
Timestamp:
07/26/13 11:35:32 (9 months ago)
Author:
kirilln
Message:

v4.0.0 files

Location:
tweet-blender/trunk
Files:
2 deleted
24 edited

Legend:

Unmodified
Added
Removed
  • tweet-blender/trunk/admin-page.php

    r406596 r746692  
    11<?php 
    22 
    3 // Version 3.3.12 
     3// Version 4.0.0 
    44 
    55// include TweetBlender library 
    66include_once(dirname(__FILE__).'/lib/lib.php'); 
    7  
    8 // set up data structure for addon tracking 
    9 $tb_installed_addons = array(); 
    10 $tb_active_addons = array(); 
    11  
    12 // check for addons 
    13 function tb_check_addons() { 
    14  
    15     global $tb_installed_addons, $tb_active_addons, $tb_addons; 
    16      
    17     foreach($tb_addons as $addon_id => $addon) { 
    18         $addon_file = $addon['slug'] . '/' . $addon['slug'] . '.php'; 
    19         if (file_exists(WP_PLUGIN_DIR . '/' . $addon_file)) {  
    20             $tb_installed_addons[$addon_id] = true; 
    21             if(is_plugin_active($addon_file)) { 
    22                 $tb_active_addons[$addon_id] = true; 
    23             } 
    24             else { 
    25                 $tb_active_addons[$addon_id] = false; 
    26             } 
    27         } 
    28         else { 
    29             $tb_installed_addons[$addon_id] = false; 
    30         } 
    31     } 
    32      
    33     return false; 
    34 } 
    357 
    368function tb_admin_load_scripts() { 
     
    144116 
    145117    // get API limit info 
    146     $api_limit_data = null; 
    147     if ($json_data = tb_get_server_rate_limit_json($tb_o)) { 
    148         $api_limit_data = $wp_json->decode($json_data); 
     118    if ($have_api_limit_data = tb_get_server_rate_limit_data($tb_o)) { 
     119        // refresh options so we get the new limit info 
     120        $tb_o = get_option('tweet-blender');     
    149121    } 
    150  
     122     
    151123    // perform maintenance 
    152124    if (isset($tb_o['archive_keep_tweets']) && $tb_o['archive_keep_tweets'] > 0) { 
     
    160132        check_admin_referer('tweet_blender_settings_save','tb_nonce'); 
    161133 
    162         // if we are disabling cache - clear it 
    163         if (isset($tb_o['advanced_disabled_cache']) && (!$tb_o['advanced_disable_cache'] && $_POST['advanced_disable_cache'])) { 
     134        // if we are disabling cache (wasn't disabled before but now is) - clear it 
     135        if (isset($tb_o['advanced_disable_cache']) && (!$tb_o['advanced_disable_cache'] && isset($_POST['advanced_disable_cache']))) { 
    164136            tb_db_cache_clear(); 
    165137        } 
     
    264236    TB_NS_pluginPath = '<?php echo plugins_url('tweet-blender-nstyle'); ?>', 
    265237    TB_nStyleAvailable = <?php if ($tb_installed_addons[2] && $tb_active_addons[2]) { echo 'true'; } else { echo 'false'; } ?>; 
     238    TB_C_pluginPath = '<?php echo plugins_url('tweet-blender-charts'); ?>', 
     239    TB_chartsAvailable = <?php if ($tb_installed_addons[3] && $tb_active_addons[3]) { echo 'true'; } else { echo 'false'; } ?>; 
    266240</script> 
    267241 
     
    276250    <div id="tabs"> 
    277251    <ul> 
    278         <li><a href="#tab-1"><span><?php _e('General', 'tweetblender'); ?></span></a></li> 
    279         <li><a href="#tab-2"><span><?php _e('Widgets', 'tweetblender'); ?></span></a></li> 
    280         <li><a href="#tab-3"><span><?php _e('Archive', 'tweetblender'); ?></span></a></li> 
    281         <li><a href="#tab-4"><span><?php _e('Filters', 'tweetblender'); ?></span></a></li> 
     252        <li><a href="#tab-1"><span><?php _e('Widgets', 'tweetblender'); ?></span></a></li> 
     253        <li><a href="#tab-2"><span><?php _e('Archive', 'tweetblender'); ?></span></a></li> 
     254        <li><a href="#tab-3"><span><?php _e('Filters', 'tweetblender'); ?></span></a></li> 
     255        <li><a href="#tab-4"><span><?php _e('SEO', 'tweetblender'); ?></span></a></li> 
    282256        <li><a href="#tab-5"><span><?php _e('Advanced', 'tweetblender'); ?></span></a></li> 
    283257        <li id="statustab"><a href="#tab-6"><span><?php _e('Status', 'tweetblender'); ?></span></a></li> 
    284         <li id="cache-manager-tab"><a href="#tab-7"><span><?php _e('Cache', 'tweetblender'); ?></span></a></li> 
    285         <li id="nstyle-tab"><a href="#tab-8"><span><?php _e('nStyle', 'tweetblender'); ?></span></a></li> 
    286         <li><a href="#tab-9"><span><?php _e('Help', 'tweetblender'); ?></span></a></li> 
     258        <li id="cache-manager-tab"><a href="#tab-7"><span><?php _e('Cache [+]', 'tweetblender'); ?></span></a></li> 
     259    <!--    <li id="charts-tab"><a href="#tab-8"><span><?php _e('Charts [+]', 'tweetblender'); ?></span></a></li> --> 
     260        <li><a href="#tab-8"><span><?php _e('Help', 'tweetblender'); ?></span></a></li> 
    287261    </ul> 
    288262 
     
    295269    ?> 
    296270 
     271 
    297272    <div id="tab-1"> 
    298     <!-- General settings --> 
    299         <table class="form-table"> 
    300         <tr valign="top"> 
    301             <th class="th-full" colspan="2" scope="row"> 
    302             <label for="general_link_urls"> 
    303             <input type="checkbox" name="general_link_urls" <?php checked('on', $tb_o['general_link_urls']); ?>/> 
    304             <?php _e("Link http &amp; https URLs insde tweet text", 'tweetblender' ); ?> 
    305             </label> 
    306             </th> 
    307         </tr> 
    308         <tr valign="top"> 
    309             <th class="th-full" colspan="2" scope="row"> 
    310             <label for="general_link_screen_names"> 
    311             <input type="checkbox" name="general_link_screen_names" <?php checked('on', $tb_o['general_link_screen_names']); ?>/> 
    312             <?php _e('Link @screenname inside tweet text', 'tweetblender' ); ?> 
    313             </label> 
    314             </th> 
    315         </tr> 
    316         <tr valign="top"> 
    317             <th class="th-full" colspan="2" scope="row"> 
    318             <label for="general_link_hash_tags"> 
    319             <input type="checkbox" name="general_link_hash_tags" <?php checked('on', $tb_o['general_link_hash_tags']); ?>/> 
    320             <?php _e("Link #hashtags insde tweet text", 'tweetblender' ); ?> 
    321             </label> 
    322             </th> 
    323         </tr> 
    324         <tr valign="top"> 
    325             <th class="th-full" colspan="2" scope="row"> 
    326             <h3><?php _e('SEO', 'tweetblender'); ?></h3> 
    327             <label for="general_seo_tweets_googleoff"> 
    328             <input type="checkbox" name="general_seo_tweets_googleoff" <?php checked('on', $tb_o['general_seo_tweets_googleoff']); ?>/> 
    329             <?php _e('Wrap all tweets with googleoff/googleon tags to prevent indexing', 'tweetblender' ); ?> 
    330             </label> 
    331             </th> 
    332         </tr> 
    333         <tr valign="top"> 
    334             <th class="th-full" colspan="2" scope="row"> 
    335             <label for="general_seo_footer_googleoff"> 
    336             <input type="checkbox" name="general_seo_footer_googleoff" <?php checked('on', $tb_o['general_seo_footer_googleoff']); ?>/> 
    337             <?php _e('Wrap footer with date and time in all tweets with googleoff/googleon tags to prevent indexing', 'tweetblender' ); ?> 
    338             </label> 
    339             </th> 
    340         </tr> 
    341         </table> 
    342     </div> 
    343  
    344     <div id="tab-2"> 
    345     <!-- Widgets Settings --> 
     273    <!-- !Widgets Settings --> 
    346274        <table class="form-table"> 
    347275        <tr valign="top"> 
     
    356284            <th class="th-full" colspan="2" scope="row"> 
    357285            <label for="widget_show_header"> 
    358             <input type="checkbox" name="widget_show_header" <?php checked('on', $tb_o['widget_show_header']); ?>/> 
    359             <?php _e("Show header with Twitter logo and refresh link for each widget", 'tweetblender' ); ?> 
    360             </label> 
    361             </th> 
    362         </tr> 
    363         <tr valign="top"> 
    364             <th class="th-full" colspan="2" scope="row"> 
    365             <label for="widget_show_photos"> 
    366             <input type="checkbox" name="widget_show_photos" <?php checked('on', $tb_o['widget_show_photos']); ?>/> 
    367             <?php _e("Show the photo from the author for each tweet", 'tweetblender' ); ?> 
    368             </label> 
    369             </th> 
    370         </tr> 
    371         <tr valign="top"> 
    372             <th class="th-full" colspan="2" scope="row"> 
    373             <label for="widget_show_user"> 
    374             <input type="checkbox" name="widget_show_user" <?php checked('on', $tb_o['widget_show_user']); ?>/> 
    375             <?php _e("Show username from the author for each tweet", 'tweetblender' ); ?> 
     286            <input type="checkbox" name="widget_show_refresh" <?php checked('on', $tb_o['widget_show_refresh']); ?>/> 
     287            <?php _e("Show refresh button for each widget", 'tweetblender' ); ?> 
    376288            </label> 
    377289            </th> 
     
    385297            </th> 
    386298        </tr> 
    387         <tr valign="top"> 
    388             <th class="th-full" colspan="2" scope="row"> 
    389             <label for="widget_show_reply_link"> 
    390             <input type="checkbox" name="widget_show_reply_link" <?php checked('on', $tb_o['widget_show_reply_link']); ?>/> 
    391             <?php _e("Show reply link for each tweet (on mouse over)", 'tweetblender' ); ?> 
    392             </label> 
    393             </th> 
    394         </tr> 
    395         <tr valign="top"> 
    396             <th class="th-full" colspan="2" scope="row"> 
    397             <label for="widget_show_follow_link"> 
    398             <input type="checkbox" name="widget_show_follow_link" <?php checked('on', $tb_o['widget_show_follow_link']); ?>/> 
    399             <?php _e("Show follow link for each tweet (on mouse over)", 'tweetblender' ); ?> 
    400             </label> 
    401             </th> 
    402         </tr> 
    403299        </table> 
    404300    </div> 
    405301     
    406     <div id="tab-3"> 
    407     <!-- Archive Page Settings --> 
     302    <div id="tab-2"> 
     303    <!-- !Archive Page Settings --> 
    408304        <table class="form-table" id="archivesettings"> 
    409305        <tr valign="top"> 
     
    462358        <tr valign="top" <?php if (isset($tb_o['archive_is_disabled']) && $tb_o['archive_is_disabled']) echo 'style="display:none;"'; ?>> 
    463359            <th class="th-full" colspan="2" scope="row"> 
    464             <label for="archive_show_photos"> 
    465             <input type="checkbox" name="archive_show_photos" <?php checked('on', $tb_o['archive_show_photos']); ?>/> 
    466             <?php _e("Show the photo from the author for each tweet", 'tweetblender' ); ?> 
    467             </label> 
    468             </th> 
    469         </tr> 
    470         <tr valign="top" <?php if (isset($tb_o['archive_is_disabled']) && $tb_o['archive_is_disabled']) echo 'style="display:none;"'; ?>> 
    471             <th class="th-full" colspan="2" scope="row"> 
    472             <label for="archive_show_user"> 
    473             <input type="checkbox" name="archive_show_user" <?php checked('on', $tb_o['archive_show_user']); ?>/> 
    474             <?php _e("Show username from the author for each tweet", 'tweetblender' ); ?> 
     360            <label for="archive_show_source_selector"> 
     361            <input type="checkbox" name="archive_show_source_selector" <?php checked('on', $tb_o['archive_show_source_selector']); ?>/> 
     362            <?php _e("Show source selector in the header", 'tweetblender' ); ?> 
    475363            </label> 
    476364            </th> 
     
    484372            </th> 
    485373        </tr> 
    486         <tr valign="top" <?php if (isset($tb_o['archive_is_disabled']) && $tb_o['archive_is_disabled']) echo ' style="display:none;"'; ?>> 
    487             <th class="th-full" colspan="2" scope="row"> 
    488             <label for="archive_show_reply_link"> 
    489             <input type="checkbox" name="archive_show_reply_link" <?php checked('on', $tb_o['archive_show_reply_link']); ?>/> 
    490             <?php _e("Show reply link for each tweet (on mouse over)", 'tweetblender' ); ?> 
    491             </label> 
    492             </th> 
    493         </tr> 
    494         <tr valign="top" <?php if (isset($tb_o['archive_is_disabled']) && $tb_o['archive_is_disabled']) echo ' style="display:none;"'; ?>> 
    495             <th class="th-full" colspan="2" scope="row"> 
    496             <label for="archive_show_follow_link"> 
    497             <input type="checkbox" name="archive_show_follow_link" <?php checked('on', $tb_o['archive_show_follow_link']); ?>/> 
    498             <?php _e("Show follow link for each tweet (on mouse over)", 'tweetblender' ); ?> 
    499             </label> 
    500             </th> 
    501         </tr> 
    502374        </table> 
    503375    </div> 
    504376     
    505     <div id="tab-4"> 
    506     <!-- Filtering --> 
     377    <div id="tab-3"> 
     378    <!-- !Filtering --> 
    507379        <table class="form-table"> 
    508380        <tr valign="top"> 
     
    520392                $throttle_select1 .= '</select>'; 
    521393                 
    522                 $throttle_select2 = '<select name="filter_limit_per_source_time">'; 
    523                 foreach ($tb_throttle_time_options as $name => $sec) { 
    524                     $throttle_select2 .= '<option value="' . $sec . '"'; 
    525                     if (isset($tb_o['filter_limit_per_source_time']) && $sec == $tb_o['filter_limit_per_source_time']) { 
    526                         $throttle_select2 .= ' selected'; 
    527                     } 
    528                     $throttle_select2 .= '>' . $name . '</option>'; 
    529                 } 
    530                 $throttle_select2 .= '</select>'; 
    531                  
    532                 echo sprintf(__('For each user show a maximum of %s tweet(s) within %s', 'tweetblender'), $throttle_select1, $throttle_select2); 
     394                echo sprintf(__('For each user show a maximum of %s tweet(s)', 'tweetblender'), $throttle_select1); 
    533395            ?> 
    534396            </td> 
     
    563425        <tr valign="top"> 
    564426            <th class="th-full" colspan="2" scope="row"> 
     427            <input type="checkbox" id="filter_hide_retweets" name="filter_hide_retweets" <?php checked('on', $tb_o['filter_hide_retweets']); ?>/> 
     428            <label for="filter_hide_retweets"><?php _e("Hide retweets", 'tweetblender' ); ?></label> 
     429            </th> 
     430        </tr> 
     431        <tr valign="top"> 
     432            <th class="th-full" colspan="2" scope="row"> 
    565433            <input type="checkbox" id="filter_hide_not_replies" name="filter_hide_not_replies" <?php checked('on', $tb_o['filter_hide_not_replies']); ?>/> 
    566434            <label for="filter_hide_not_replies"><?php _e("Show only replies", 'tweetblender' ); ?></label> 
     
    573441            </th> 
    574442        </tr> 
    575         <!-- FUTURE: location-based selection 
    576         <tr> 
    577             <th scope="row"><label for="filter_location_name"><?php _e('Show only tweets near this place ', 'tweetblender' ); ?>:</label></th> 
    578             <td><input type="text" size="30" name="filter_location_name" value="<?php echo $tb_o['filter_location_name']; ?>"><br/> 
    579                 <label for="filter_location_dist">Within </label> 
    580                 <select name="filter_location_dist"> 
    581                 <?php 
    582                 foreach (array(5,10,15,20,50,100,200,500) as $dist) { 
    583                     echo '<option value="' . $dist . '"'; 
    584                     if ($dist == $tb_o['filter_location_dist']) { 
    585                         echo ' selected'; 
    586                     } 
    587                     echo '>' . $dist . '</option>'; 
    588                 } 
    589                 ?></select> 
    590                 <select name="filter_location_dist_units"> 
    591                 <?php 
    592                 foreach (array('mi' => 'miles','km' => 'kilometers') as $du => $dist_units) { 
    593                     echo '<option value="' . $du . '"'; 
    594                     if ($du == $tb_o['filter_location_dist_units']) { 
    595                         echo ' selected'; 
    596                     } 
    597                     echo '>' . $dist_units . '</option>'; 
    598                 } 
    599                 ?></select> 
    600             </td> 
    601         </tr> 
    602         --> 
    603443        <tr valign="top"> 
    604444            <th scope="row"><label for="filter_bad_strings"><?php _e('Exclude tweets that contain these users, words or hashtags', 'tweetblender' ); ?>: </label> 
     
    612452        </table> 
    613453    </div> 
     454 
     455    <div id="tab-4"> 
     456    <!-- !SEO --> 
     457        <table class="form-table"> 
     458        <tr valign="top"> 
     459            <th class="th-full" colspan="2" scope="row"> 
     460            <label for="general_seo_tweets_googleoff"> 
     461            <input type="checkbox" name="general_seo_tweets_googleoff" <?php checked('on', $tb_o['general_seo_tweets_googleoff']); ?>/> 
     462            <?php _e('Wrap all tweets with googleoff/googleon tags to prevent indexing', 'tweetblender' ); ?> 
     463            </label> 
     464            </th> 
     465        </tr> 
     466        <tr valign="top"> 
     467            <th class="th-full" colspan="2" scope="row"> 
     468            <label for="general_seo_footer_googleoff"> 
     469            <input type="checkbox" name="general_seo_footer_googleoff" <?php checked('on', $tb_o['general_seo_footer_googleoff']); ?>/> 
     470            <?php _e('Wrap footer with date and time in all tweets with googleoff/googleon tags to prevent indexing', 'tweetblender' ); ?> 
     471            </label> 
     472            </th> 
     473        </tr> 
     474        </table> 
     475    </div> 
    614476     
    615477    <div id="tab-5"> 
    616     <!-- Advanced Settings --> 
     478    <!-- !Advanced Settings --> 
    617479        <table class="form-table"> 
    618         <tr valign="top"> 
    619             <th class="th-full" colspan="2" scope="row"> 
    620             <label for="advanced_reroute_on"> 
    621             <input type="checkbox" name="advanced_reroute_on" <?php checked('on', $tb_o['advanced_reroute_on']); ?>/> 
    622             <?php _e('Re-route Twitter traffic through this server', 'tweetblender' ); ?>  
    623             </label> (<input type="radio" value="oauth" name="advanced_reroute_type" <?php checked('oauth', $tb_o['advanced_reroute_type']); ?>/> <?php _e('user account based with oAuth', 'tweetblender' ); ?> <input type="radio" value="direct" name="advanced_reroute_type" <?php checked('direct', $tb_o['advanced_reroute_type']); ?>/> <?php _e('IP based', 'tweetblender' ); ?>)<br/> 
    624             <span class="setting-description"><?php _e('This option allows you to reroute all API calls to Twitter via your server. This is to be used ONLY if your server is a white-listed server that has higher connection allowance than each individual user.  Each user can make up to 150 Twitter API connections per hour. Each visitor to your site will have their own limit i.e. their own 150. Checking the box will make all visitors to the site use your servers connection limit, not their own limit. If you did not prearranged with Twitter to have that limit increased that means that it will be 150 for ALL visitors - be careful.', 'tweetblender' ); ?></span> 
    625             </th> 
    626         </tr> 
    627         <tr valign="top"> 
    628             <th class="th-full" colspan="2" scope="row"> 
    629             <label for="advanced_show_limit_msg"> 
    630             <input type="checkbox" name="advanced_show_limit_msg" <?php checked('on', $tb_o['advanced_show_limit_msg']); ?>/> 
    631             <?php _e('Notify user when Twitter API connection limit is reached', 'tweetblender' ); ?>  
    632             </label><br/> 
    633             <span class="setting-description"> 
    634                 <?php _e('When the API connection limit is reached and there is no cached data Tweet Blender can not show new tweets. If you check this box the plugin will show a message to user that will tell them that limit has been reached. In addition, the message will show how soon fresh tweets will be available again. If you do not check the box the message will not be shown - the tweets just will not be refreshed until plugin is able to get fresh data.', 'tweetblender' ); ?> 
    635             </span> 
    636             </th> 
    637         </tr> 
    638         <tr valign="top"> 
    639             <th class="th-full" colspan="2" scope="row"> 
    640             <label for="advanced_disable_cache"> 
    641             <input type="checkbox" name="advanced_disable_cache" <?php checked('on', $tb_o['advanced_disable_cache']); ?>/> 
    642             <?php _e('Disable data caching', 'tweetblender' ); ?>  
    643             </label><br/> 
    644             <span class="setting-description"> 
    645                 <?php _e('Every time Tweet Blender refreshes, it stores data it receives from Twitter into a special cache on your server. Once a user reaches his API connection limit Tweet Blender starts using cached data. Cached data is centralized and is updated by all users so even if one user is at a limit s/he can still get fresh tweets as cache is updated by other users that have not yet reached their limit. If you do not want to cache data (to save bandwidth or for some other reason) then check this box.', 'tweetblender' );  echo '<b>' . __('Important','tweetblender') . ': ' . __('clears all cached tweets','tweetblender') . '</b>.'; ?> 
    646             </span> 
    647             </th> 
    648         </tr> 
    649480        <tr valign="top"> 
    650481            <th scope="row"><label for="general_timestamp_format"><?php _e('Timestamp Format', 'tweetblender' ); ?>: 
     
    666497            </label><br/> 
    667498            <span class="setting-description"> 
    668                 <?php _e('To get tweets from private users Tweet Blender needs to login to twitter using your credentials. Once you authorize access, the special tokens are stored in the configuration settings. This is NOT a username or password. Your username/password is NOT stored.  The tokens are tied to a specific Twitter account so if you changed your account or would like to use another account for authentication check this box to have previously saved tokens cleared.', 'tweetblender' ); ?> 
     499                <?php _e('Twitter API v1.1 now requires authentication for every request. To get tweets, Tweet Blender needs to login to Twitter using your credentials. Once you authorize access, the special tokens are stored in the configuration settings. This is NOT a username or password. Your username/password is NOT stored.  The tokens are tied to a specific Twitter account so if you changed your account or would like to use another account for authentication check this box to have previously saved tokens cleared.', 'tweetblender' ); ?> 
    669500            </span> 
    670501            </th> 
     
    686517 
    687518    <div id="tab-6"> 
    688     <!-- Status --> 
     519    <!-- !Status --> 
    689520        <table class="form-table"> 
    690521        <tr> 
    691522            <th><?php _e('API requests from blog server', 'tweetblender' ); ?>:</th> 
    692523            <td><?php 
    693                 if ($api_limit_data) { 
    694                     echo sprintf(__('Max is %d/hour', 'tweetblender') . ' &middot; ', $api_limit_data->hourly_limit); 
    695                     if ($api_limit_data->remaining_hits > 0) { 
    696                         echo sprintf(__('You have %s left', 'tweetblender') . ' &middot; ','<span class="pass">' . $api_limit_data->remaining_hits . '</span>') ; 
    697                     } 
    698                     else { 
    699                         echo sprintf(__('You have %s left', 'tweetblender') . ' &middot; ', '<span class="fail">'. 0 . '</span>'); 
    700                     } 
    701                     echo __('Next reset', 'tweetblender') . ' ' . tb_verbal_time($api_limit_data->reset_time_in_seconds); 
     524             
     525                if ($have_api_limit_data && isset($tb_o['rate_limit_data'])) { 
     526                     
     527                    foreach ($tb_o['rate_limit_data'] as $endpoint_name => $endpoint_data) { 
     528                     
     529                        if ($endpoint_name == 'last_check') { 
     530                            echo '<i>' . __('Last check ', 'tweetblender') . tb_verbal_time($endpoint_data) . '</i>'; 
     531                             
     532                        } 
     533                        else { 
     534                     
     535                            echo '<b>' . $endpoint_name . ':</b> '; 
     536                            echo sprintf(__('Max is %d per 15 minutes', 'tweetblender') . ' &middot; ', $endpoint_data['limit']); 
     537                            if ($endpoint_data['remaining'] > 0) { 
     538                                echo sprintf(__('You have %s left', 'tweetblender') . ' &middot; ','<span class="pass">' . $endpoint_data['remaining'] . '</span>') ; 
     539                            } 
     540                            else { 
     541                                echo sprintf(__('You have %s left', 'tweetblender') . ' &middot; ', '<span class="fail">'. 0 . '</span>'); 
     542                            } 
     543                            echo __('Next reset', 'tweetblender') . ' ' . tb_verbal_time($endpoint_data['reset']); 
     544                            echo '<br />'; 
     545                                                         
     546                        } 
     547 
     548                    } 
    702549                } 
    703550                else { 
    704551                    echo '<span class="fail">' . __('Check failed', 'tweetblender') . '</span>'; 
    705552                } 
    706                 if (isset($tb_o['advanced_reroute_on']) && ($tb_o['advanced_reroute_on'] && $tb_o['advanced_reroute_type'] == 'oauth')) { 
    707                     echo '<br/>' . __('checked with user account (oAuth)', 'tweetblender'); 
    708                 } 
    709                 else { 
    710                     $server_address = __('[IP NOT AVAILABLE]', 'tweetblender'); 
    711                     if (isset($_SERVER['SERVER_ADDR'])) { 
    712                             $server_address = esc_attr($_SERVER['SERVER_ADDR']); 
    713                     } 
    714                     echo '<br/>' . __('checked with IP of your server','tweetblender') . ' (' . $server_address . ')'; 
    715                 } 
     553                 
    716554            ?></td> 
    717         </tr> 
    718         <tr> 
    719             <th><?php _e('API requests from your computer', 'tweetblender' ); ?>:</th> 
    720             <td id="locallimit"></td> 
    721555        </tr> 
    722556        <tr> 
     
    726560                echo '<span class="pass">' . __('Present', 'tweetblender') . '</span>'; 
    727561            } 
    728             elseif (!empty($have_private_sources) && !isset($tb_o['oauth_access_token'])) { 
     562            else { 
    729563                echo '<span class="fail">' . __('Not Present', 'tweetblender') . '</span>'; 
    730             } 
    731             else { 
    732                 echo __('Not Needed' , 'tweetblender'); 
     564                if (class_exists('TwitterOAuth')) { 
     565                    // Create TwitterOAuth object and get request token 
     566                    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 
     567                      
     568                    // Get request token 
     569                    $request_token = $connection->getRequestToken(get_bloginfo('url') . '/' . PLUGINDIR . "/tweet-blender/lib/twitteroauth/callback.php"); 
     570                      
     571                    if ($connection->http_code == 200) { 
     572                        // Save request token to session 
     573                        $tb_o['oauth_token'] = $token = $request_token['oauth_token']; 
     574                        $tb_o['oauth_token_secret'] = $request_token['oauth_token_secret']; 
     575                        update_option('tweet-blender',$tb_o); 
     576                         
     577                        echo " <a href='javascript:tAuth(\"" . $connection->getAuthorizeURL($token) . "\")' title=" . __('Authorize Twitter Access', 'tweetblender') . ">" . __('Use your Twitter account to login', 'tweetblender') . "</a>."; 
     578         
     579                    } 
     580                } 
    733581            } 
    734582            ?></td> 
     
    767615 
    768616    <div id="tab-7"> 
    769  
     617    <!-- !Cache Manager Addon --> 
    770618    <?php  
    771619        // if Cache Manager is not installed 
     
    806654    </div> 
    807655    <div class="box-right centered"> 
    808         <a href="<?php echo plugins_url('tweet-blender/screenshot-10.png'); ?>" title="Cache Manager for Tweet Blender"><img class="tb-addon-screenshot" src="<?php echo plugins_url('tweet-blender/img/cache_manager_th.jpg'); ?>" /></a> 
     656        <a href="<?php echo plugins_url('tweet-blender/screenshot-12.png'); ?>" title="Cache Manager for Tweet Blender"><img class="tb-addon-screenshot" src="<?php echo plugins_url('tweet-blender/img/cache_manager_th.jpg'); ?>" /></a> 
    809657    </div> 
    810658    <br clear="all" /> 
     
    825673    </div> 
    826674 
     675    <!--  
    827676    <div id="tab-8"> 
    828  
    829677    <?php  
    830         // if nStyle is not installed 
    831         if (!$tb_installed_addons[2]) {  
     678        // if Charts addon is not installed 
     679        if (!$tb_installed_addons[3]) {  
    832680    ?> 
    833681     
    834     <h2><?php _e('Tweet Blender nStyle Is Not Installed', 'tweetblender' ); ?></h2> 
     682    <h2><?php _e('Charts Are Not Installed', 'tweetblender' ); ?></h2> 
    835683    <div class="box-left"> 
    836     <p><?php _e('Install nStyle addon for Tweet Blender and instantly take advantage of the following features', 'tweetblender' ); ?>:</p> 
     684    <p><?php _e('Install Tweet Blender Charts and instantly take advantage of the following features', 'tweetblender' ); ?>:</p> 
    837685    <ol class="feature-set"> 
    838         <li><?php _e('Adjust colors for text, links, backgrounds', 'tweetblender' ); ?></li> 
    839         <li><?php _e('Adust font style, size, and spacing', 'tweetblender' ); ?></li> 
    840         <li><?php _e('Control the size of widget', 'tweetblender' ); ?></li> 
    841         <li><?php _e('Enable smooth scrolling', 'tweetblender' ); ?></li> 
    842         <li><?php _e('Control the size of thumbnails', 'tweetblender' ); ?></li> 
    843         <li><?php _e('Show alternating background colors', 'tweetblender' ); ?></li> 
    844         <li><?php _e('Switch layout from vertical to horizontal', 'tweetblender' ); ?></li> 
    845         <li><?php _e('Define completely custom template for tweets', 'tweetblender' ); ?></li> 
    846         <li><?php _e('Turn off default plugin CSS', 'tweetblender' ); ?></li> 
    847         <li>Have other ideas? <a href="http://getsatisfaction.com/tweet_blender/topics/new">Please tell me</a></li> 
     686        <li><?php _e('Make your site more visually attractive by adding pie and bar charts of your cached tweets', 'tweetblender' ); ?></li> 
     687        <li><?php _e('Embed charts in the sidebars, posts and pages', 'tweetblender' ); ?></li> 
     688        <li><?php _e('Define width and height of charts or make them fill available space', 'tweetblender' ); ?></li> 
     689        <li><?php _e('Limit charts data to last month, week, day or hour', 'tweetblender' ); ?></li> 
     690        <li><?php _e('Create both vertical and horizontal bar charts', 'tweetblender' ); ?></li> 
     691        <li><?php _e('Automatically link each bar or pie segment to your archive page', 'tweetblender' ); ?></li> 
     692        <li><?php _e('Make charts refresh data every X seconds to see how trends change over time', 'tweetblender' ); ?></li> 
     693        <li><?php _e('Limit charts data to monthly, weekly, or hourly', 'tweetblender' ); ?></li> 
    848694    </ol> 
    849     <p><?php echo sprintf(__('Click the button below to purchase the addon for a <b>one time flat fee of $%s</b>. This will perform a one-click install of a new plugin and you will get FREE upgrades with new features in the future.', 'tweetblender' ),'8.99'); ?></p> 
     695    <p><?php echo sprintf(__('Click the button below to purchase the addon for a <b>one time flat fee of $%s</b>. This will perform a one-click install of a new plugin and you will get FREE upgrades with new features in the future.', 'tweetblender' ),'4.99'); ?></p> 
    850696    <div class="centered"> 
    851     <!-- Coming soon 
    852697        <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> 
    853698        <input type="hidden" name="cmd" value="_xclick" /> 
     
    856701        <input type="hidden" name="currency_code" value="USD" /> 
    857702        <input type="hidden" name="no_note" value="1" /> 
    858         <input type="hidden" name="amount" value="8.99" /> 
    859         <input type="hidden" name="item_name" value="nStyle for Tweet Blender" /> 
    860         <input type="hidden" name="item_number" value="2" /> 
     703        <input type="hidden" name="amount" value="4.99" /> 
     704        <input type="hidden" name="item_name" value="Tweet Blender Charts" /> 
     705        <input type="hidden" name="item_number" value="3" /> 
    861706        <input type="hidden" name="no_shipping" value="1" /> 
    862707        <input type="hidden" name="custom" value="<?php bloginfo('url'); ?>" /> 
    863708        <input type="hidden" name="notify_url" value="http://tweetblender.com/ipn.php" /> 
    864709        <input type="hidden" name="image_url" value="http://tweetblender.com/tweet-blender-logo_150x50.png" /> 
    865         <input type="hidden" name="return" value="<?php echo tb_get_current_page_url(); ?>&install_addon=1" /> 
     710        <input type="hidden" name="return" value="<?php echo tb_get_current_page_url(); ?>&install_addon=3" /> 
    866711        <input type="hidden" name="cbt" value="Return to your site to complete installation" /> 
    867         <input type="hidden" name="cancel_return" value="<?php echo tb_get_current_page_url(); ?>#tab-8" /> 
    868         <input type="submit" name="submit" class="button-secondary" value="<?php _e('Get nStyle', 'tweetblender' ); ?>" /> 
     712        <input type="hidden" name="cancel_return" value="<?php echo tb_get_current_page_url(); ?>#tab-7" /> 
     713        <input type="submit" name="submit" class="button-secondary" value="<?php _e('Get Charts', 'tweetblender' ); ?>" /> 
    869714        <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" /> 
    870715    </form> 
    871      --> 
    872      [COMING SOON!] 
     716     
    873717    </div> 
    874718    </div> 
    875719    <div class="box-right centered"> 
    876         <!--  a href="<?php echo plugins_url('tweet-blender/screenshot-11.png'); ?>" title="nStyle for Tweet Blender"><img class="tb-addon-screenshot" src="<?php echo plugins_url('tweet-blender/img/nstyle_th.jpg'); ?>" /></a  --> 
     720        <a href="<?php echo plugins_url('tweet-blender/screenshot-10.png'); ?>" title="Horizontal Bar Charts"><img class="tb-addon-screenshot" src="<?php echo plugins_url('tweet-blender/img/cache_manager_th.jpg'); ?>" /></a> 
     721        <a href="<?php echo plugins_url('tweet-blender/screenshot-10.png'); ?>" title="Pie Charts"><img class="tb-addon-screenshot" src="<?php echo plugins_url('tweet-blender/img/cache_manager_th.jpg'); ?>" /></a> 
     722        <a href="<?php echo plugins_url('tweet-blender/screenshot-10.png'); ?>" title="Widget Configuration"><img class="tb-addon-screenshot" src="<?php echo plugins_url('tweet-blender/img/cache_manager_th.jpg'); ?>" /></a> 
     723        <a href="<?php echo plugins_url('tweet-blender/screenshot-10.png'); ?>" title="Admin Section"><img class="tb-addon-screenshot" src="<?php echo plugins_url('tweet-blender/img/cache_manager_th.jpg'); ?>" /></a> 
    877724    </div> 
    878725    <br clear="all" /> 
    879726    <?php  
    880         // if nStyle is not active 
    881         } else if(!$tb_active_addons[2]) {  
     727        // if Charts addon is not active 
     728        } else if(!$tb_active_addons[3]) {  
    882729    ?> 
    883     <h2><?php _e('nStyle Is Not Active', 'tweetblender' ); ?></h2> 
    884     <p><?php _e('You have the Tweet Blender nStyle plugin installed but not activated. Please use the [Plugins] menu on the left to activate the plugin', 'tweetblender' ); ?></p> 
     730    <h2><?php _e('Charts Are Not Active', 'tweetblender' ); ?></h2> 
     731    <p><?php _e('You have the Tweet Blender Charts plugin installed but not activated. Please use the [Plugins] menu on the left to activate the plugin', 'tweetblender' ); ?></p> 
    885732 
    886733    <?php 
    887         // else nStyle is available 
     734        // else Charts are available 
    888735        } else { 
    889             echo tb_ns_get_page_html(); 
     736            echo tb_c_get_page_html(); 
    890737        }  
    891738    ?> 
    892739     
    893740    </div> 
    894  
    895     <div id="tab-9"> 
     741    --> 
     742     
     743    <div id="tab-8"> 
     744    <!-- !Support --> 
    896745    <?php _e('GetSatisfaction.com Community', 'tweetblender' ); ?>: <a href="http://getsatisfaction.com/tweet_blender">http://getsatisfaction.com/tweet_blender</a><br/> 
    897746    <?php _e('Facebook Page', 'tweetblender' ); ?>: <a href="http://www.facebook.com/pages/Tweet-Blender/96201618006">http://www.facebook.com/pages/Tweet-Blender/96201618006</a><br/> 
     
    913762} 
    914763 
    915 function tb_get_cache_stats() { 
    916     global $wpdb; 
    917     $table_name = $wpdb->prefix . "tweetblender"; 
    918      
    919     $sql = "SELECT source, COUNT(*) AS tweets_num, UNIX_TIMESTAMP(MAX(created_at)) AS last_update FROM " . $table_name . " GROUP BY source"; 
    920     $results = $wpdb->get_results($sql); 
    921      
    922     return $results; 
    923 } 
    924  
    925764?> 
  • tweet-blender/trunk/css/tweets.css

    r200989 r746692  
    102102 
    103103.tb_author { 
    104     font-weight:normal; 
     104    font-weight:bold; 
    105105} 
    106106 
     
    147147} 
    148148 
     149/* charts */ 
     150 
     151/* archive */ 
     152#tb-update-sources { 
     153    text-align:center; 
     154    margin:8px; 
     155} 
     156 
     157#tb-source-selector { 
     158    border: solid thin #eee; 
     159    padding: 5px; 
     160    text-align: left; 
     161} 
     162 
     163input.tb-source { 
     164    margin-left: 10px; 
     165} 
  • tweet-blender/trunk/js/admin.js

    r405901 r746692  
    22 * @author kirill 
    33 *  
    4  * v3.3.10 
     4 * v4.0.0b4 
    55 */ 
    66var ajaxURLs = new Array(), 
     
    5959        } 
    6060    }); 
    61  
    62     // check limit for admin's PC 
    63     jQuery.ajax({ 
    64         url: 'http://twitter.com/account/rate_limit_status.json', 
    65         dataType: 'jsonp', 
    66         success: function(json){ 
    67             var hitsLeftHtml = ''; 
    68             if (json.remaining_hits > 0) { 
    69                 hitsLeftHtml =  '<span class="pass">' + json.remaining_hits + '</span>'; 
    70             } 
    71             else { 
    72                 hitsLeftHtml = '<span class="fail">0</span>'; 
    73             } 
    74             jQuery('#locallimit').html( 
    75                 TB_labels.limit_num.format(json.hourly_limit) + ' &middot; ' +  
    76                 TB_labels.limit_left.format(hitsLeftHtml) + ' &middot; ' +  
    77                 TB_labels.limit_reset + TB_verbalTime(TB_str2date(json.reset_time)) 
    78             ); 
    79         }, 
    80         error: function(){ 
    81             jQuery('#locallimit').html('<span class="fail">' + TB_labels.check_fail + '</span>'); 
    82         } 
    83     });  
    8461     
    8562    // if there were any problems, highlight the Status tab 
     
    9976        jQuery('img.tb-addon-screenshot').parent().fancybox(); 
    10077    } 
     78 
     79    // Charts add-on 
     80    if (typeof(TB_chartsAvailable) == 'undefined' || !TB_chartsAvailable) { 
     81        jQuery('#charts-tab a').css('text-decoration','line-through'); 
     82        jQuery('img.tb-addon-screenshot').parent().fancybox(); 
     83    } 
    10184}); 
    10285 
  • tweet-blender/trunk/js/lib.js

    r412465 r746692  
    5151function TB_str2date(dateString) { 
    5252     
    53     var dateObj = new Date(), 
    54     dateData = dateString.split(/[\s\:]/); 
     53    var dateObj = new Date(); 
     54     
     55    if (typeof(dateString) == 'undefined') { 
     56        return dateObj;  
     57    } 
     58     
     59    var dateData = dateString.split(/[\s\:]/); 
    5560     
    5661    // if it's a search format 
     
    144149}; 
    145150 
    146 // Base64 decode 
     151//Base64 decode 
    147152String.prototype.base64_decode = function() { 
    148153  
  • tweet-blender/trunk/js/main.js

    r427446 r746692  
    11/** 
    22 * @author http://kirill-novitchenko.com 
     3 *  
    34 */ 
    45 
    5 var TB_version = '3.3.15',  // Plugin version  
     6var TB_version = '4.0.0b4', // Plugin version  
    67TB_rateLimitData, 
    78TB_tmp, 
    89TB_mode = 'widget', 
    910TB_started = false, 
    10 TB_tweetsToCache = new Object(), 
    1111TB_allSources = new Array(), 
    1212jQnc = jQuery, 
    1313TB_sourceCounts = new Array(), 
    1414TB_sourceNames = new Array(), 
    15 TB_seenTweets = new Array(); 
     15TB_seenTweets = new Array(), 
     16selectedCell, 
     17TB_token; 
    1618 
    1719// initialize each widget 
     
    3133        return; 
    3234    } 
    33          
     35             
    3436    // process widget configuration 
    3537    TB_config.widgets = new Object(); 
     
    4042        widgetHTML, 
    4143        needWidgetHTML = false, 
    42         nextTag = jQuery(obj).next(); 
     44        nextTag = jQuery(obj).next(), 
     45        isChart = false; 
    4346         
    4447        // if there is widget HTML div following the form we don't need to build HTML 
     
    7477            TB_allSources = TB_allSources.concat(TB_config.widgets[widgetId].sources.split(',')); 
    7578        } 
    76          
     79 
     80        if(typeof(TB_config.widgets[widgetId].chartType) != 'undefined') { 
     81            isChart = true; 
     82        } 
     83         
     84        // if no view more url, use default 
     85        if(typeof(TB_config.widgets[widgetId].viewMoreUrl) == 'undefined') { 
     86            TB_config.widgets[widgetId].viewMoreUrl = TB_config.default_view_more_url; 
     87        } 
     88 
    7789        if (needWidgetHTML) { 
    7890            // add widget HTML 
     
    8294                '<a class="tb_infolink" href="http://kirill-novitchenko.com" title="' + TB_labels.kino + '" style="background-image:url(' + TB_pluginPath + '/img/info-kino.png)"> </a>' + 
    8395                '<a class="tb_refreshlink" href="javascript:TB_blend(\'' + widgetId + '\');" title="' + TB_labels.refresh + '"><img src="' + TB_pluginPath + '/img/ajax-refresh-icon.gif" alt="' + TB_labels.refresh + '" /></a></div></div>'; 
    84             if (TB_config.general_seo_tweets_googleoff) { 
    85                 tweetHTML += '<!--googleoff: index--><div class="tb_tweetlist"></div><!--googleon: index-->'; 
     96             
     97            if (TB_config.general_seo_tweets_googleoff && !isChart) { 
     98                widgetHTML += '<!--googleoff: index--><div class="tb_tweetlist"></div><!--googleon: index-->'; 
     99            } 
     100            else if (isChart){ 
     101                widgetHTML += '<div id="' + widgetId + '-chart" class="tb_tweetchart"></div>'; 
    86102            } 
    87103            else { 
    88104                widgetHTML += '<div class="tb_tweetlist"></div>'; 
    89             } 
    90             widgetHTML += '<div class="tb_footer">'; 
    91             if (!TB_config.archive_is_disabled) { 
    92                  
    93                 if (typeof(TB_config.widgets[widgetId].viewMoreText) == 'undefined') { 
    94                     TB_config.widgets[widgetId].viewMoreText = TB_labels.view_more + ' &raquo;'; 
    95                 } 
    96                  
    97                 if (TB_config.widgets[widgetId].viewMoreUrl) { 
    98                     widgetHTML += '<a class="tb_archivelink" href="' + TB_config.widgets[widgetId].viewMoreUrl + '">' + TB_config.widgets[widgetId].viewMoreText + '</a>'; 
    99                 } 
    100                 else if (TB_config.default_view_more_url) { 
    101                     widgetHTML += '<a class="tb_archivelink" href="' + TB_config.default_view_more_url + '">' + TB_config.widgets[widgetId].viewMoreText + '</a>'; 
    102                 } 
    103             } 
    104             widgetHTML += '</div></div>'; 
     105             
     106                widgetHTML += '<div class="tb_footer">'; 
     107                if (!TB_config.archive_is_disabled) { 
     108                     
     109                    if (typeof(TB_config.widgets[widgetId].viewMoreText) == 'undefined') { 
     110                        TB_config.widgets[widgetId].viewMoreText = TB_labels.view_more + ' &raquo;'; 
     111                    } 
     112                     
     113                    if (TB_config.widgets[widgetId].viewMoreUrl) { 
     114                        widgetHTML += '<a class="tb_archivelink" href="' + TB_config.widgets[widgetId].viewMoreUrl + '">' + TB_config.widgets[widgetId].viewMoreText + '</a>'; 
     115                    } 
     116                    else if (TB_config.default_view_more_url) { 
     117                        widgetHTML += '<a class="tb_archivelink" href="' + TB_config.default_view_more_url + '">' + TB_config.widgets[widgetId].viewMoreText + '</a>'; 
     118                        TB_config.widgets[widgetId].viewMoreUrl = TB_config.default_view_more_url; 
     119                    } 
     120                } 
     121                widgetHTML += '</div>'; 
     122            } 
     123             
     124            widgetHTML += '</div>'; 
     125             
    105126            jQuery('#'+obj.id).after(widgetHTML); 
     127        } 
     128         
     129        // if it's a chart - update width/height 
     130        if(isChart) { 
     131             
     132            // determine width automatically, if needed 
     133            if (typeof(TB_config.widgets[widgetId].chartWidth) == 'undefined' || TB_config.widgets[widgetId].chartWidth <= 0) { 
     134                TB_config.widgets[widgetId].chartWidth = jQuery('#' + widgetId + '-chart').parent().width(); 
     135            } 
     136            // determine height automatically, if needed 
     137            if (typeof(TB_config.widgets[widgetId].chartHeight) == 'undefined' || TB_config.widgets[widgetId].chartHeight <= 0) { 
     138                TB_config.widgets[widgetId].chartHeight = jQuery('#' + widgetId + '-chart').parent().width() + 60; 
     139            } 
    106140        } 
    107141    }); 
     
    118152    jQuery('a.tb_infolink').css('display','inline').css('margin-right','11px'); 
    119153     
    120     // make sure plugins are available 
    121     if (typeof(jQuery.toJSON) == 'undefined' && typeof(jQnc.toJSON) == 'function') { 
    122         jQuery.toJSON = jQnc.toJSON; 
    123     } 
    124     if (typeof(jQuery.jsonp) == 'undefined' && typeof(jQnc.jsonp) == 'function') { 
    125         jQuery.jsonp = jQnc.jsonp; 
    126     } 
    127  
    128154    // if there is no archive page, hide view more links 
    129155    if (!TB_config.default_view_more_url) { 
     
    133159    // get config options and blend 
    134160    if (typeof(TB_config) != 'undefined') { 
    135          
    136         // if admin turned on re-route 
    137         if (TB_config['advanced_reroute_on']) { 
    138             TB_config['rate_limit_url'] = { 
    139                 'url': TB_pluginPath + '/ws.php?action=rate_limit_status', 
    140                 'dtype': 'json' 
    141             }; 
    142         } 
    143         // else check limit for the user's PC 
    144         else { 
    145             TB_config['rate_limit_url'] = { 
    146                 'url': 'http://twitter.com/account/rate_limit_status.json', 
    147                 'dtype': 'jsonp' 
    148             }; 
    149         } 
    150          
     161                 
    151162        // for each widget on the page 
    152163        for (widgetId in TB_config.widgets) { 
     
    163174                TB_makeAjaxURLs(widgetId);           
    164175     
    165                 // update values to reflect cache use if there are divs with tweets already 
    166                 TB_config.widgets[widgetId]['minTweetId'] = 0; 
    167                 TB_config.widgets[widgetId]['maxTweetId'] = 0; 
    168                 if (jQuery('#'+widgetId + '-mc > div.tb_tweetlist > div.tb_tweet').size() > 0) { 
    169                     if (TB_tmp = jQuery('#'+widgetId + '-mc > div.tb_tweetlist > div:last').attr('id')) { 
    170                         TB_config.widgets[widgetId]['minTweetId'] = TB_tmp; 
     176                // if it's not a chart, update values to reflect cache use if there are divs with tweets already 
     177                if (typeof(TB_config.widgets[widgetId].chartType) == 'undefined') { 
     178                    TB_config.widgets[widgetId]['minTweetId'] = 0; 
     179                    TB_config.widgets[widgetId]['maxTweetId'] = 0; 
     180                    if (jQuery('#'+widgetId + '-mc > div.tb_tweetlist > div.tb_tweet').size() > 0) { 
     181                        if (TB_tmp = jQuery('#'+widgetId + '-mc > div.tb_tweetlist > div:last').attr('id')) { 
     182                            TB_config.widgets[widgetId]['minTweetId'] = TB_tmp; 
     183                        } 
     184                        if (TB_tmp = jQuery('#'+widgetId + '-mc > div.tb_tweetlist > div:first').attr('id')) { 
     185                            TB_config.widgets[widgetId]['maxTweetId'] = TB_tmp; 
     186                        } 
    171187                    } 
    172                     if (TB_tmp = jQuery('#'+widgetId + '-mc > div.tb_tweetlist > div:first').attr('id')) { 
    173                         TB_config.widgets[widgetId]['maxTweetId'] = TB_tmp; 
    174                     } 
    175                 } 
    176                 TB_config.widgets[widgetId]['tweetsShown'] = jQuery('#'+widgetId + '-mc > div.tb_tweetlist').children('div').size(); 
    177                  
    178                 // wire mouse overs to existing tweets 
    179                 jQuery.each(jQuery('#' + widgetId + '-mc > div.tb_tweetlist').children('div'),function(i,obj){ TB_wireMouseOver(obj.id); }); 
    180  
    181                     // wire target="_blank" on links 
    182                     jQuery('a.tb_photo, .tb_author a, .tb_msg a, .tweet-tools a, .tb_infolink').click(function(){ 
    183                         this.target = "_blank"; 
    184                     }); 
     188                    TB_config.widgets[widgetId]['tweetsShown'] = jQuery('#'+widgetId + '-mc > div.tb_tweetlist').children('div').size(); 
     189                     
     190                    // wire mouse overs to existing tweets 
     191                    jQuery.each(jQuery('#' + widgetId + '-mc > div.tb_tweetlist').children('div'),function(i,obj){ TB_wireMouseOver(obj.id); }); 
     192     
     193                        // wire target="_blank" on links 
     194                        jQuery('a.tb_photo, .tb_author a, .tb_msg a, .tweet-tools a, .tb_infolink').click(function(){ 
     195                            this.target = "_blank"; 
     196                        }); 
     197                } 
    185198         
    186199                // add automatic refresh 
     
    189202                } 
    190203                 
     204                 
    191205                // if we need to refresh once or  
    192206                // if there are no tweets shown from cache 
    193207                // or if there are less tweets then needed 
     208                // or if it's a chart 
    194209                // then blend right away 
    195                 if (parseInt(TB_config.widgets[widgetId].refreshRate) == 1 || TB_config.widgets[widgetId].tweetsShown < TB_config.widgets[widgetId].tweetsNum) { 
     210                if (parseInt(TB_config.widgets[widgetId].refreshRate) == 1 || typeof(TB_config.widgets[widgetId].chartType) != 'undefined' || TB_config.widgets[widgetId].tweetsShown < TB_config.widgets[widgetId].tweetsNum) { 
    196211                    TB_blend(widgetId); 
    197212                } 
     
    208223} 
    209224 
    210 // form Twitter API queries 
     225 
     226// form refresh queries 
    211227function TB_makeAjaxURLs(widgetId) { 
    212228    var TB_searchTerms = new Array(), 
     
    217233    colonPos, 
    218234    pipePos; 
    219      
     235         
    220236    TB_config.widgets[widgetId]['ajaxURLs'] = new Array(); 
    221  
     237     
     238    // if it's a chart widget, use all sources for the url 
     239    if (typeof(TB_config.widgets[widgetId].chartType) != 'undefined') { 
     240        TB_addAjaxUrl(widgetId,'chart-data',{'chart_type':TB_config.widgets[widgetId].chartType,'chart_period':TB_config.widgets[widgetId].chartPeriod},TB_config.widgets[widgetId].sources,0,null); 
     241        return; 
     242    } 
     243 
     244    // for other widget types, iterate over sources and make individual urls 
    222245    jQuery.each(TB_config.widgets[widgetId].sources.split(','),function(i,src) { 
    223246 
     
    225248        src = jQuery.trim(src); 
    226249         
    227         // if it's a private screen name 
    228         if (src.charAt(0) == '!') { 
    229  
    230             // if there is an alias 
    231             if ((colonPos = src.indexOf(':')) > 0) { 
    232                 // split into screen name and optional string name/title 
    233                 screenName = src.substr(2, colonPos - 1); 
    234                 TB_sourceNames[screenName.toLowerCase()] = src.substr(colonPos + 1); 
    235                 src = src.substr(1, colonPos - 1); 
    236             } 
    237             else { 
    238                 screenName = src.substr(2); 
    239             } 
    240  
     250        // if it's a screen name 
     251        if (src.charAt(0) == '@' && src.indexOf('/') == -1) { 
     252             
    241253            // if we are serving only favorites 
    242254            if (TB_config.widgets[widgetId].favoritesOnly) { 
    243                 TB_addAjaxUrl(widgetId,'favorites',{'screen_name':screenName},src,1,null); 
    244             } 
    245             // if we are not using Search API 
    246             else if (TB_config.advanced_no_search_api) { 
    247                 TB_addAjaxUrl(widgetId,'user_timeline',{'screen_name':screenName},src,1,null); 
    248             } 
    249             else { 
    250                 TB_addAjaxUrl(widgetId,'search',{'from':screenName},src,1,null); 
    251             } 
    252         } 
    253         // if it's a public screen name 
    254         else if (src.charAt(0) == '@' && src.indexOf('/') == -1) { 
    255              
    256             // if we are serving only favorites 
    257             if (TB_config.widgets[widgetId].favoritesOnly) { 
    258                 // if there is an alias 
    259                 if ((colonPos = src.indexOf(':')) > 0) { 
    260                     // split into screen name and optional string name/title 
    261                     screenName = src.substr(1, colonPos - 1); 
    262                     TB_sourceNames[screenName.toLowerCase()] = src.substr(colonPos + 1); 
    263                     src = src.substr(0, colonPos); 
    264                 } 
    265                 else { 
    266                     screenName = src.substr(1); 
    267                 } 
     255                screenName = src.substr(1); 
    268256 
    269257                TB_addAjaxUrl(widgetId,'favorites',{'screen_name':screenName},src,0,null); 
     
    271259            // if it includes modifiers, use a one-off URL 
    272260            else if ((pipePos = src.indexOf('|')) > 1) { 
    273                 // if we had an alias for that name 
    274                 if ((colonPos = src.indexOf(':')) > 0) { 
    275                     // split into screen name and optional string name/title 
    276                     screenName = src.substr(1,pipePos-1); 
    277                     modifier = src.substr(pipePos+1,(colonPos - pipePos - 1)); 
    278                     TB_sourceNames[screenName.toLowerCase()] = src.substr(colonPos + 1); 
    279                     src = src.substr(0, colonPos); 
    280                 } 
    281                 else { 
    282                     screenName = src.substr(1,pipePos-1); 
    283                     modifier = src.substr(pipePos+1); 
    284                 } 
     261 
     262                screenName = src.substr(1,pipePos-1); 
     263                modifier = src.substr(pipePos+1); 
    285264                 
    286265                // if modifier is a hashtag 
    287266                if (modifier.charAt(0) == '#') { 
    288                     TB_addAjaxUrl(widgetId,'search',{'from':screenName,'tag':modifier.substr(1)},src,0,modifier); 
     267                    TB_addAjaxUrl(widgetId,'search',{'from':screenName,'tag':modifier.substr(1)},src,modifier); 
    289268                } 
    290269                // else modifier is just a keyword 
    291270                else { 
    292                     TB_addAjaxUrl(widgetId,'search',{'from':screenName,'ors':modifier},src,0,modifier); 
     271                    TB_addAjaxUrl(widgetId,'search',{'from':screenName,'ors':modifier},src,modifier); 
    293272                } 
    294273            } 
    295274            else { 
    296275 
    297                 // if we had an alias for that name 
    298                 if ((colonPos = src.indexOf(':')) > 0) { 
    299                     // split into screen name and optional string name/title 
    300                     screenName = src.substr(1,colonPos-1); 
    301                     TB_sourceNames[screenName.toLowerCase()] = src.substr(colonPos + 1); 
    302                     src = src.substr(0, colonPos); 
    303                 } 
    304                 else { 
    305                     screenName = src.substr(1); 
    306                 } 
     276                screenName = src.substr(1); 
    307277                 
    308278                // if we are not using Search API 
    309279                if (TB_config.advanced_no_search_api) { 
    310                     TB_addAjaxUrl(widgetId,'user_timeline',{'screen_name':screenName},src,0,null); 
     280                    TB_addAjaxUrl(widgetId,'user_timeline',{'screen_name':screenName},src,null); 
    311281                } 
    312282                // else, group with other screen names 
     
    314284                    // check to make sure we are not over the query length limit 
    315285                    if (escape(TB_screenNameQueries.join(' OR ')).length + src.length > 140) { 
    316                         TB_addAjaxUrl(widgetId,'search',{'q':TB_screenNameQueries.join(' OR ')},escape('@'+TB_screenNames.join(',@')),0,null); 
     286                        TB_addAjaxUrl(widgetId,'search',{'q':TB_screenNameQueries.join(' OR ')},escape('@'+TB_screenNames.join(',@')),null); 
    317287                        TB_screenNames = new Array(); 
    318288                        TB_screenNameQueries = new Array(); 
     
    337307                    'user': src.substr(1, src.indexOf('/') - 1), 
    338308                    'list': src.substr(src.indexOf('/') + 1, pipePos - src.indexOf('/') - 1) 
    339                 }, src, 0, src.substr(pipePos+1)); 
     309                }, src, src.substr(pipePos+1)); 
    340310            } 
    341311            // if it's just a regular list 
     
    344314                    'user': src.substr(1, src.indexOf('/') - 1), 
    345315                    'list': src.substr(src.indexOf('/') + 1) 
    346                 }, src, 0, null); 
     316                }, src, null); 
    347317            } 
    348318        } 
     
    360330            // check to make sure we are not over the query length limit 
    361331            if (TB_searchTerms.join(' OR ').length + src.length > 140) { 
    362                 TB_addAjaxUrl(widgetId,'search',{'q':TB_searchTerms.join(' OR ')},TB_searchTerms.join(','),0,null); 
     332                TB_addAjaxUrl(widgetId,'search',{'q':TB_searchTerms.join(' OR ')},TB_searchTerms.join(','),null); 
    363333                TB_searchTerms = new Array(); 
    364334            } 
     
    369339    // if there are terms that are not part of a query - add another query 
    370340    if (TB_searchTerms.length > 0) { 
    371         TB_addAjaxUrl(widgetId,'search',{'q':TB_searchTerms.join(' OR ')},TB_searchTerms.join(','),0,null); 
     341        TB_addAjaxUrl(widgetId,'search',{'q':TB_searchTerms.join(' OR ')},TB_searchTerms.join(','),null); 
    372342    } 
    373343     
    374344    // if there are screenNames - join them into a single query 
    375345    if (TB_screenNames.length > 0) { 
    376         TB_addAjaxUrl(widgetId,'search',{'q':TB_screenNameQueries.join(' OR ')},encodeURI('@'+TB_screenNames.join(',@')),0,null); 
    377     } 
    378 } 
    379  
    380 function TB_addAjaxUrl(widgetId,actionType,queryData,src,isPrivateSrc,modifier) { 
     346        TB_addAjaxUrl(widgetId,'search',{'q':TB_screenNameQueries.join(' OR ')},encodeURI('@'+TB_screenNames.join(',@')),null); 
     347    } 
     348} 
     349 
     350function TB_addAjaxUrl(widgetId,actionType,queryData,src,modifier) { 
    381351     
    382352    var url; 
     
    390360    } 
    391361             
    392     // check private 
    393     if (isPrivateSrc) { 
    394         queryData.is_private = 1; 
    395     } 
    396  
    397     if (actionType == 'search' && (TB_config.advanced_reroute_on || TB_config.reached_api_limit || isPrivateSrc)) { 
     362    if (actionType == 'search') { 
    398363        queryData.action = actionType; 
    399364        TB_config.widgets[widgetId]['ajaxURLs'].push({ 
     
    401366            'data':queryData, 
    402367            'source':src, 
    403             'privateSrc':isPrivateSrc, 
    404             'dtype':'json', 
    405368            'modifier':modifier 
    406369        }); 
    407370    } 
    408     else if (actionType == 'search') { 
    409         queryData.rpp = TB_config.widgets[widgetId]['tweetsNum'] * 2; 
    410         TB_config.widgets[widgetId]['ajaxURLs'].push({ 
    411             'url': 'http://search.twitter.com/search.json', 
    412             'data':queryData, 
    413             'source':src, 
    414             'privateSrc':0, 
    415             'dtype':'jsonp', 
    416             'modifier':modifier 
    417         }); 
    418     } 
    419     else if (actionType == 'list_timeline' && (TB_config.advanced_reroute_on || TB_config.reached_api_limit)) { 
     371    else if (actionType == 'list_timeline') { 
    420372        queryData.action = actionType; 
    421373 
    422374        // remove unneeded params 
    423         delete queryData.user; 
    424         delete queryData.list; 
    425375        delete queryData.nots; 
    426376        delete queryData.lang; 
     
    430380            'data':queryData, 
    431381            'source':src, 
    432             'privateSrc':0, 
    433             'dtype':'json', 
    434382            'modifier':modifier 
    435383        }); 
    436384    } 
    437     else if (actionType == 'list_timeline'){ 
    438         url = 'http://api.twitter.com/1/' + queryData.user + '/lists/' + queryData.list + '/statuses.json'; 
    439  
    440         // remove unneeded params 
    441         delete queryData.user; 
    442         delete queryData.list; 
    443         delete queryData.nots; 
    444         delete queryData.lang; 
    445          
    446         queryData.per_page = TB_config.widgets[widgetId]['tweetsNum']  * 2; 
    447         TB_config.widgets[widgetId]['ajaxURLs'].push({ 
    448             'url':url, 
    449             'data':queryData, 
    450             'source':src, 
    451             'privateSrc':0, 
    452             'dtype':'jsonp', 
    453             'modifier':modifier 
    454         }); 
    455     } 
    456     else if (actionType == 'user_timeline' && (TB_config.advanced_reroute_on || TB_config.reached_api_limit || isPrivateSrc)) { 
     385    else if (actionType == 'user_timeline') { 
    457386        queryData.action = actionType; 
    458387        TB_config.widgets[widgetId]['ajaxURLs'].push({ 
     
    460389            'data':queryData, 
    461390            'source':src, 
    462             'privateSrc':0, 
    463             'dtype':'json', 
    464391            'modifier':modifier 
    465392        }); 
    466393    } 
    467     else if (actionType == 'user_timeline') { 
    468         TB_config.widgets[widgetId]['ajaxURLs'].push({ 
    469             'data':queryData, 
    470             'url': 'http://api.twitter.com/1/statuses/user_timeline.json', 
    471             'source':src, 
    472             'privateSrc':0, 
    473             'dtype':'jsonp', 
    474             'modifier':modifier 
    475         }); 
    476     } 
    477     else if (actionType == 'favorites' && (TB_config.advanced_reroute_on || TB_config.reached_api_limit || isPrivateSrc)) { 
     394    else if (actionType == 'favorites') { 
    478395        queryData.action = actionType; 
    479396        TB_config.widgets[widgetId]['ajaxURLs'].push({ 
     
    481398            'url':TB_pluginPath + '/ws.php', 
    482399            'source':src, 
    483             'privateSrc':0, 
    484             'dtype':'json', 
    485400            'modifier':modifier 
    486401        }); 
    487402    } 
    488     else if (actionType == 'favorites') { 
     403    else if (actionType == 'chart-data') { 
     404        queryData.action = actionType; 
    489405        TB_config.widgets[widgetId]['ajaxURLs'].push({ 
    490             'data':{},  // favorites does not support any params 
    491             'url': 'http://api.twitter.com/1/favorites/' + queryData.screen_name + '.json', 
     406            'data':queryData, 
     407            'url':TB_C_pluginPath + '/ws.php', 
    492408            'source':src, 
    493             'privateSrc':0, 
    494             'dtype':'jsonp', 
    495             'modifier':modifier 
     409            'method':'post' 
    496410        }); 
    497411    } 
     
    503417    TB_config.widgets[widgetId].sourcesCount = 0; 
    504418    jQuery.each(TB_config.widgets[widgetId].sources.split(','),function(i,src) { 
    505         // if there is a private source mark - strip it 
    506         if (src.charAt(0) == '!') { 
    507             src = src.substr(1); 
    508         } 
    509         // if there is an alias - strip it 
    510         if ((colonPos = src.indexOf(':')) > 0) { 
    511             src = src.substr(0, colonPos); 
    512         } 
    513419        // if there is a modifier - strip it 
    514420        if ((pipePos = src.indexOf('|')) > 0) { 
     
    516422        } 
    517423         
    518          
    519424        TB_config.widgets[widgetId].sourcesHTML += '<a href="'; 
    520425        if (src.charAt(0) == '@') { 
     
    522427        } 
    523428        else { 
    524             TB_config.widgets[widgetId].sourcesHTML += 'http://search.twitter.com/search?q=' + escape(src); 
     429            TB_config.widgets[widgetId].sourcesHTML += 'https://twitter.com/search?q=' + escape(src); 
    525430        } 
    526431        TB_config.widgets[widgetId].sourcesHTML += '">' + src + '</a> '; 
     
    538443    // show loading indicator 
    539444    TB_showLoader(widgetId); 
    540  
    541     // if not using cache/server then check limit for user viwing the page 
    542     if (!TB_config.advanced_reroute_on && !TB_config.reached_api_limit) { 
    543         jQuery.ajax({ 
    544             url: TB_config.rate_limit_url.url, 
    545             dataType: TB_config.rate_limit_url.dtype, 
    546             success: function(json){ 
    547                 // if can't get the limit or reached it 
    548                 if (json.error || json.remaining_hits < TB_config.widgets[widgetId].ajaxURLs.length) { 
    549  
    550                     TB_config['reached_api_limit'] = true; 
    551                      
    552                     // if cache is not disabled, reroute traffic through server 
    553                     if (!TB_config.advanced_disable_cache) { 
    554                         // switch back to normal mode once limit has been reset 
    555                         var wait = 1000 * 60 * 5,   // by default, try again in 5 minutes 
    556                         now = new Date(), 
    557                         dateObj; 
    558                         // if we have actual reset time, use it 
    559                         if (json.reset_time) { 
    560                             dateObj = TB_str2date(json.reset_time); 
    561                             wait = Math.round(dateObj.getTime() - now.getTime()); 
    562                         } 
    563                         setTimeout("TB_config.reached_api_limit=false;TB_makeAjaxURLs('"+widgetId+"');TB_blend('"+widgetId+"');",wait); 
    564  
    565                         // regen URLs so they go to server and get tweets 
    566                         TB_makeAjaxURLs(widgetId); 
    567                         TB_getTweets(widgetId); 
    568                     } 
    569                     // if we reached limit, don't have cache turned on, and need to tell user - show message 
    570                     else if (TB_config.advanced_show_limit_msg) { 
    571                         TB_showMessage(widgetId,'limit',TB_labels.limit_msg + '. ' + TB_labels.limit_reset.format(TB_verbalTime(TB_str2date(json.reset_time))), false); 
    572                     } 
    573                 } 
    574                 // else, get new feeds 
    575                 else { 
    576                     TB_getTweets(widgetId); 
    577                 } 
    578             }, 
    579             error: function(){ 
    580                 TB_getTweets(widgetId); 
    581             } 
    582         }); 
    583     } 
    584     else { 
    585         TB_getTweets(widgetId); 
    586     } 
     445     
     446    // if it's a chart 
     447    if (typeof(TB_config.widgets[widgetId].chartType) != 'undefined') { 
     448         
     449        // if there is no chart yet 
     450        if (typeof(TB_config.widgets[widgetId].wrapper) == 'undefined') { 
     451            TB_C_makeChart(widgetId); 
     452        } 
     453        // if we have a chart 
     454        else { 
     455            // draw chart 
     456            TB_config.widgets[widgetId].wrapper.draw(); 
     457        } 
     458 
     459        // hide loader 
     460        TB_hideLoader(widgetId); 
     461 
     462        return; 
     463    } 
     464 
     465    TB_getTweets(widgetId); 
    587466} 
    588467 
     
    597476        if(jQuery('#' + widgetId + '-mc > div.tb_tweetlist').children('div').size() == 0) { 
    598477            // show no tweets message 
    599              
    600             /* FUTURE: include location in message 
    601             if (typeof(TB_config['filter_location_name']) != 'undefined' && TB_config.filter_location_name.length > 0) { 
    602                 TB_showMessage(widgetId, 'notweets', 'No tweets found for ' + TB_config.widgets[widgetId].sourcesHTML + '(within ' + TB_config.filter_location_dist + TB_config.filter_location_dist_units + ' of ' + TB_config.filter_location_name + ')', true); 
    603             } 
    604             else { 
    605             */ 
    606                 TB_showMessage(widgetId, 'notweets', TB_labels.no_tweets_msg.format(TB_config.widgets[widgetId].sourcesHTML), true); 
     478            TB_showMessage(widgetId, 'notweets', TB_labels.no_tweets_msg.format(TB_config.widgets[widgetId].sourcesHTML), true); 
    607479        } 
    608480        else { 
    609481            TB_hideMessage(widgetId,'notweets'); 
    610              
    611             // store cache 
    612             if((typeof(TB_config.advanced_disable_cache) != 'undefined' && !TB_config.advanced_disable_cache)) { 
    613                 TB_cacheNewTweets();     
    614             } 
    615482        } 
    616483    } 
     
    618485     
    619486function TB_getTweets(widgetId) { 
    620      
     487         
    621488    TB_config.widgets[widgetId]['urlsDone'] = 0; 
    622489     
    623490    // iterate over AJAX URLs 
    624491    jQuery.each(TB_config.widgets[widgetId].ajaxURLs,function(i,urlInfo) { 
    625          
    626         // special jsonp use case to ensure proper error handling 
    627         if (urlInfo.dtype == 'jsonp' && typeof(jQuery.jsonp) != 'undefined') { 
    628             jQuery.jsonp({ 
    629                 data:urlInfo.data, 
    630                 callbackParameter: "callback", 
    631                 url: urlInfo.url, 
    632                 timeout: 2000, 
    633                 success: function (json) { 
    634                     // if we had valid JSON but with error 
    635                     if (json.error) { 
    636                         // if we reached the API limit 
    637                         if (json.error.indexOf('Rate limit exceeded') == 0) { 
    638                             TB_config['reached_api_limit'] = true; 
    639                         } 
    640                         TB_config.widgets[widgetId].urlsDone++; 
    641                         TB_checkComplete(widgetId); 
    642                     } 
    643                     else { 
    644                         TB_addTweets(widgetId,json,urlInfo); 
    645                     } 
    646                 }, 
    647                 error: function(jqXHR, textStatus, errorThrown) { 
     492     
     493        // add sources to data 
     494         
     495        jQuery.ajax({ 
     496            data:urlInfo.data, 
     497            dataType: 'json', 
     498            url: urlInfo.url, 
     499            timeout: 6000, 
     500            success: function (json) { 
     501//console.log('got response'); 
     502                // if we had valid JSON but with error 
     503                if (json.error) { 
    648504                    TB_config.widgets[widgetId].urlsDone++; 
    649505                    TB_checkComplete(widgetId); 
    650506                } 
    651             }); 
    652         } 
    653         else { 
    654             jQuery.ajax({ 
    655                 data:urlInfo.data, 
    656                 dataType: urlInfo.dtype, 
    657                 url: urlInfo.url, 
    658                 timeout: 2000, 
    659                 success: function (json) { 
    660                     // if we had valid JSON but with error 
    661                     if (json.error) { 
    662                         // if we reached the API limit 
    663                         if (json.error.indexOf('Rate limit exceeded') == 0) { 
    664                             TB_config['reached_api_limit'] = true; 
    665                         } 
    666                         TB_config.widgets[widgetId].urlsDone++; 
    667                         TB_checkComplete(widgetId); 
    668                     } 
    669                     else { 
    670                         TB_addTweets(widgetId,json,urlInfo); 
    671                     } 
    672                 }, 
    673                 error: function(jqXHR, textStatus, errorThrown) { 
    674                     TB_config.widgets[widgetId].urlsDone++; 
    675                     TB_checkComplete(widgetId); 
    676                 } 
    677             }); 
    678         } 
     507                else { 
     508//console.log('got results'); 
     509                    TB_addTweets(widgetId,json,urlInfo); 
     510                } 
     511            }, 
     512            error: function(jqXHR, textStatus, errorThrown) { 
     513//console.log('error in ajax: ' + textStatus + ' err: ' + errorThrown); 
     514                TB_config.widgets[widgetId].urlsDone++; 
     515                TB_checkComplete(widgetId); 
     516            } 
     517        }); 
    679518    }); 
    680 } 
    681  
    682 function TB_cacheNewTweets() { 
    683  
    684     if (TB_getObjectSize(TB_tweetsToCache) > 0) { 
    685  
    686         if (typeof(jQuery.toJSON) == 'undefined' && typeof(jQnc.toJSON) == 'function') { 
    687             jQuery.toJSON = jQnc.toJSON; 
    688         } 
    689          
    690         jQuery.ajax({ 
    691             url:        TB_pluginPath + '/ws.php?action=cache_data', 
    692             type:       'POST', 
    693             dataType:   'json', 
    694             data: ({ 
    695                 tweets: jQuery.toJSON(TB_tweetsToCache) 
    696             }), 
    697             success: function(json){ 
    698                 if (!json.error) { 
    699                     TB_tweetsToCache = new Object(); 
    700                 } 
    701             } 
    702         }); 
    703     } 
    704519} 
    705520 
     
    711526    tweetExists; 
    712527     
    713     if (typeof(jsonData.results) != 'undefined') { 
    714         tweets = jsonData.results; 
    715     } 
    716  
     528    if (typeof(jsonData.statuses) != 'undefined') { 
     529        tweets = jsonData.statuses; 
     530    } 
     531 
     532//console.log(jsonData); 
     533     
    717534    jQuery.each(tweets,function(i,tweetJson) { 
    718  
    719         tb_tweet = new TB_tweet(tweetJson); 
     535     
     536        // account for cached tweets returning div ID and json 
     537        if (typeof(tweetJson.tweet_json) != 'undefined'){ 
     538            tb_tweet = new TB_tweet(tweetJson.tweet_json); 
     539        } 
     540        else { 
     541            tb_tweet = new TB_tweet(tweetJson); 
     542        } 
     543//console.log(i + ": " + tweetJson ); 
     544         
    720545        tb_tweet.modifier = urlInfo.modifier; 
    721546         
     
    739564            return true; 
    740565        } 
    741          
    742566         
    743567        // if this is the first tweet, just add it and set it to be both min and max 
     
    824648             
    825649            isNewTweet = true; 
    826         } 
    827  
    828         // if new tweet and cache is on, queue it for caching 
    829         if (isNewTweet && (typeof(TB_config.advanced_disable_cache) != 'undefined' && !TB_config.advanced_disable_cache)) { 
    830             TB_tweetsToCache[tb_tweet.divId] = { 
    831                 "s" :   tb_tweet.sources, 
    832                 "p" :   urlInfo.privateSrc, 
    833                 "t" :   tb_tweet.jsonCode 
    834             }; 
    835650        } 
    836651         
     
    877692        lastTweet.remove(); 
    878693        TB_config.widgets[widgetId].tweetsShown--; 
    879          
    880         // remove from cache queue as well if we planned to cache it 
    881         delete TB_tweetsToCache[TB_config.widgets[widgetId].minTweetId]; 
    882          
     694                 
    883695        // if no tweets left, reset min and max and finish 
    884696        if (TB_config.widgets[widgetId].tweetsShown == 0) { 
     
    997809     * {5} - date 
    998810     * {6} - source as link 
     811     * {7} - author name 
    999812     */ 
    1000813    // if user supplied a custom format - use it 
     
    1006819    else { 
    1007820        template = '<div id="{0}" class="tb_tweet">'; 
    1008         if (TB_config['widget_show_photos']) { 
    1009             template += '<a class="tb_photo" rel="nofollow" href="http://twitter.com/{1}"><img src="{2}" alt="{1}"></a>'; 
    1010         } 
    1011         if (TB_config['widget_show_user']) { 
    1012             template += '<span class="tb_author"><a rel="nofollow" href="http://twitter.com/{1}">{1}</a>: </span> '; 
    1013         } 
     821        template += '<a class="tb_photo" rel="nofollow" href="https://twitter.com/{1}"><img src="{2}" alt="{1}"></a>'; 
     822        template += '<span class="tb_author">{7}<br /><a rel="nofollow" href="https://twitter.com/{1}">{1}</a>: </span> '; 
    1014823        template += '<span class="tb_msg">{3}</span><br />'; 
    1015824        // start tweet footer with info 
     
    1045854        // end tweet     
    1046855        template += "</div>\n"; 
     856    } 
     857     
     858    // outputs current template 
     859    getTemplate = function() { 
     860        return template; 
    1047861    } 
    1048862     
     
    1080894                 
    1081895        // link URLs 
    1082         if (TB_config.general_link_urls) { 
    1083             textHtml = textHtml.replace(/(https?:\/\/\S+)/gi, '<a rel="nofollow" href="$1">$1</a>'); 
    1084         } 
     896        textHtml = textHtml.replace(/(https?:\/\/\S+)/gi, '<a rel="nofollow" href="$1">$1</a>'); 
    1085897        // link screen names 
    1086         if (TB_config.general_link_screen_names) { 
    1087             textHtml = textHtml.replace(/\@([\w]+)/gi,'<a rel="nofollow" href="http://twitter.com/$1">@$1</a>');  
    1088         } 
     898        textHtml = textHtml.replace(/\@([\w]+)/gi,'<a rel="nofollow" href="http://twitter.com/$1">@$1</a>');  
    1089899        // link hash tags 
    1090         if (TB_config.general_link_hash_tags) { 
    1091             textHtml = textHtml.replace(/\#(\S+)/gi,'<a rel="nofollow" href="http://search.twitter.com/search?q=%23$1">#$1</a>');  
    1092         } 
     900        textHtml = textHtml.replace(/\#(\S+)/gi,'<a rel="nofollow" href="http://twitter.com/search?q=%23$1">#$1</a>');  
     901 
    1093902        if (tweetJson.profile_image_url) { 
    1094903            imageUrl = tweetJson.profile_image_url; 
     
    1119928 
    1120929        // return formatted string 
    1121         return template.format(this.divId,nameHtml,imageUrl,textHtml,tweetJson.id_str,dateHtml,sourceHtml); 
     930        return template.format(this.divId,'@' + nameHtml,imageUrl,textHtml,tweetJson.id_str,dateHtml,sourceHtml,this.jsonCode.user.name); 
    1122931    } 
    1123932     
     
    1177986        // if it's some weird format - assume we are not the same 
    1178987        else if (TB_tweetId.indexOf('-') <= 0) { 
    1179             return flase; 
     988            return false; 
    1180989        } 
    1181990        // else, do the real comparisons 
     
    12031012        var i; 
    12041013 
    1205         // if we have a modifier on that source and text contains it 
     1014        // if we have a modifier on that source and text doesn't contain it 
    12061015        if (this.modifier) { 
    12071016            if (this.modifier.length > 0 && this.jsonCode.text.indexOf(this.modifier) < 0) { 
     
    12181027 
    12191028        // if this is a reply 
    1220         if (this.jsonCode.in_reply_to_user_id || this.jsonCode.to_user_id) { 
     1029        if (this.jsonCode.in_reply_to_user_id || this.jsonCode.in_reply_to_status_id || this.jsonCode.in_reply_to_screen_name) { 
    12211030            // if we don't show replies 
    12221031            if (TB_config.filter_hide_replies) { 
     
    12281037            return false; 
    12291038        } 
     1039         
     1040        // if it's a retweet and we are hiding retweets 
     1041        if (this.jsonCode.retweeted_status && TB_config.filter_hide_retweets) { 
     1042            return false; 
     1043        } 
     1044         
    12301045 
    12311046        // if there are filtered words and the tweet text matches any of them - skip this tweet 
     
    12521067            else { 
    12531068                TB_sourceCounts[this.screenName] = 1; 
    1254                 if (TB_config.widget_limit_per_source_time > 0) { 
    1255                     setTimeout('TB_sourceCounts["' + this.screenName + '"]=0',TB_config.widget_limit_per_source_time * 1000); 
    1256                 } 
    12571069            } 
    12581070        } 
  • tweet-blender/trunk/lib/lib.php

    r427446 r746692  
    11<?php 
    22 
    3 // Version 3.3.12 
     3// Version 4.0.0b4 
    44 
    55// aliases for sources 
     
    99$tb_option_names = array( 
    1010    // general configuration options 
    11     'general_timestamp_format','general_link_screen_names','general_link_hash_tags','general_link_urls','general_seo_tweets_googleoff','general_seo_footer_googleoff', 
     11    'general_timestamp_format','general_seo_tweets_googleoff','general_seo_footer_googleoff', 
    1212    // options related to widget 
    13     'widget_show_user','widget_show_photos','widget_show_source','widget_show_reply_link','widget_show_follow_link','widget_show_header','widget_check_sources', 
     13    'widget_show_source','widget_show_refresh','widget_check_sources', 
    1414    // options related to archive page 
    15     'archive_show_user','archive_show_photos','archive_show_source','archive_tweets_num','archive_is_disabled','archive_show_reply_link','archive_show_follow_link','archive_auto_page','archive_keep_tweets', 
     15    'archive_show_source','archive_tweets_num','archive_is_disabled','archive_auto_page','archive_keep_tweets','archive_show_source_selector', 
    1616    // advanced options 
    17     'advanced_reroute_on','advanced_show_limit_msg','advanced_disable_cache','advanced_reroute_type','advanced_no_search_api', 
     17    'advanced_no_search_api', 
    1818    // filtering 
    19     'filter_lang','filter_hide_mentions','filter_hide_replies','filter_location_name','filter_location_dist','filter_location_dist_units','filter_bad_strings','filter_limit_per_source','filter_limit_per_source_time','filter_hide_same_text','filter_hide_not_replies', 
     19    'filter_lang','filter_hide_mentions','filter_hide_replies','filter_hide_retweets','filter_bad_strings','filter_limit_per_source','filter_hide_same_text','filter_hide_not_replies', 
    2020 
    2121    // database 
    2222    'db_version' 
    2323); 
     24 
     25// Twitter API base URL 
     26$tb_api_base_url = 'https://api.twitter.com/1.1'; 
     27 
     28// Twitter API endpoints used 
     29$tb_api_endpoints_used = array('/lists/statuses','/statuses/user_timeline','/favorites/list','/search/tweets'); 
    2430 
    2531// options used only internally 
     
    3238    __('Manual', 'tweetblender') => 0, 
    3339    __('Only once (on load)', 'tweetblender') => 1, 
    34     sprintf(__('Every %d seconds', 'tweetblender'),5) => 5, 
    3540    sprintf(__('Every %d seconds', 'tweetblender'),10) => 10, 
    3641    sprintf(__('Every %d seconds', 'tweetblender'),15) => 15, 
     
    3944    __('Every minute', 'tweetblender') => 60, 
    4045    sprintf(__('Every %d minutes', 'tweetblender'),2) => 120, 
    41 ); 
    42  
    43 $tb_throttle_time_options = array( 
    44     __('all time', 'tweetblender') => 0, 
    45     '1 ' . __('minute', 'tweetblender') => 60, 
    46     '5 ' . __('minutes', 'tweetblender') => 300, 
    47     '10 ' . __('minutes', 'tweetblender') => 600, 
    48     '20 ' . __('minutes', 'tweetblender') => 1200, 
    49     '30 ' . __('minutes', 'tweetblender') => 1800, 
    50     '60 ' . __('minutes', 'tweetblender') => 3600, 
    51     '90 ' . __('minutes', 'tweetblender') => 5400, 
    52     '120 ' . __('minutes', 'tweetblender') => 7200 
    5346); 
    5447 
     
    241234    ), 
    242235    '3' => array( 
    243         'name' => __('Tweet Injector', 'tweetblender'), 
    244         'slug' => 'tweet-blender-injector' 
     236        'name' => __('Charts', 'tweetblender'), 
     237        'slug' => 'tweet-blender-charts' 
    245238    ) 
    246239); 
     
    249242    '1' => __('Cache Manager', 'tweetblender'), 
    250243    '2' => __('nStyle', 'tweetblender'), 
    251     '3' => __('Tweet Injector', 'tweetblender'), 
     244    '3' => __('Charts', 'tweetblender'), 
    252245); 
    253246 
     
    288281    'view_more' => __('view more','tweetblender')  
    289282); 
     283 
     284// set up data structure for addon tracking 
     285$tb_installed_addons = array(); 
     286$tb_active_addons = array(); 
     287 
     288// variables needed for filtering & throttling 
     289$tb_seen_tweets = array(); 
     290$tb_tweet_counts_per_source = array(); 
    290291 
    291292// if we don't have json class, get own PHP4 compatible library 
     
    371372    $mnum = array('Jan' => 1,'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12); 
    372373 
    373     if (strpos($date_string, ',') !== false) { 
    374         list($wday,$mday, $mon, $year, $hour,$min,$sec,$offset) = preg_split('/[\s\:]/',$date_string); 
    375     } 
    376     else { 
     374//  if (strpos($date_string, ',') !== false) { 
     375//      list($wday,$mday, $mon, $year, $hour,$min,$sec,$offset) = preg_split('/[\s\:]/',$date_string); 
     376//  } 
     377//  else { 
    377378        list($wday,$mon,$mday,$hour,$min,$sec,$offset,$year) = preg_split('/[\s\:]/',$date_string); 
    378     } 
     379//  } 
    379380     
    380381    return gmmktime($hour,$min,$sec,$mnum[$mon],$mday,$year); 
     
    385386} 
    386387 
    387 function tb_get_server_rate_limit_json($tb_o) { 
    388      
    389     $url = 'http://twitter.com/account/rate_limit_status.json'; 
    390     $params = array('rand' => rand()); 
    391      
    392     // check if it's a private source or if we are rerouting with oAuth 
    393     if (isset($tb_o['advanced_reroute_on']) && $tb_o['advanced_reroute_on'] && $tb_o['advanced_reroute_type'] == 'oauth') { 
    394         // check to make sure we have the class 
    395         if (!class_exists('TwitterOAuth')) { 
    396             return false; 
    397         } 
    398         // make sure we have oAuth info 
    399         if (!isset($tb_o['oauth_access_token'])){ 
    400             return false; 
    401         } 
    402         else { 
    403             // try to get it directly 
    404             $oAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $tb_o['oauth_access_token']['oauth_token'],$tb_o['oauth_access_token']['oauth_token_secret']); 
    405             $json_data = $oAuth->OAuthRequest($url, 'GET', $params); 
    406             if ($oAuth->http_code == 200) { 
    407                 return $json_data; 
     388function tb_get_server_rate_limit_data($tb_o) { 
     389 
     390    global $tb_api_base_url, $tb_api_endpoints_used, $wp_json; 
     391     
     392    // TODO: if we checked within last 2 minutes - don't check again 
     393    if (time() - $tb_o['rate_limit_data']['last_check'] <= 60 * 2) { 
     394        return true; 
     395    } 
     396     
     397    $params = array( 
     398        'rand' => rand(), 
     399        'resources' => 'search,statuses,favorites,lists' 
     400    ); 
     401     
     402    // check to make sure we have the class 
     403    if (!class_exists('TwitterOAuth')) { 
     404        return false; 
     405    } 
     406    // make sure we have oAuth info 
     407    if (!isset($tb_o['oauth_access_token'])){ 
     408        return false; 
     409    } 
     410    else { 
     411        // try to get it directly 
     412        $oAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $tb_o['oauth_access_token']['oauth_token'],$tb_o['oauth_access_token']['oauth_token_secret']); 
     413        $json_response = $oAuth->OAuthRequest($tb_api_base_url . '/application/rate_limit_status.json', 'GET', $params); 
     414         
     415        if ($oAuth->http_code == 200) { 
     416            $json_data = $wp_json->decode($json_response); 
     417         
     418            // iterate over resources 
     419            foreach ($json_data->{'resources'} as $resource_name => $resource_data) { 
     420                // iterate over enpoints available for each resource 
     421                foreach ($resource_data as $endpoint_name => $endpoint_data) { 
     422                    // process only endpoints that we are actually using 
     423                    if (in_array($endpoint_name, $tb_api_endpoints_used)){ 
     424                     
     425                        $tb_o['rate_limit_data'][$endpoint_name] = array( 
     426                            'limit' => $endpoint_data->limit, 
     427                            'remaining' => $endpoint_data->remaining, 
     428                            'reset' => $endpoint_data->reset, 
     429                            'last_check' => time() 
     430                        ); 
     431                    } 
     432                } 
    408433            } 
    409             else { 
    410                 return false; 
    411             } 
    412         } 
    413     } 
    414     // if not rerouting, access directly 
    415     else { 
    416         // for WP3 we need to explicitly include the class 
    417         if (version_compare(get_bloginfo('version'),'3.0.0','>=')) { 
    418             require_once ABSPATH . '/wp-includes/class-http.php';  
    419         } 
    420         $http = new WP_Http; 
    421         $result = $http->request($url); 
    422434             
    423         // if we could get it, return data 
    424         if (is_array($result)) { 
    425             if ($result['response']['code'] == 200) { 
    426                 $json_data = $result['body']; 
    427                 return $json_data; 
    428             } 
    429             else { 
    430                 return false; 
    431             } 
    432         } 
    433         elseif (is_object($result)) { 
    434             if ($result->response->code == 200) { 
    435                 $json_data = $result->body; 
    436                 return $json_data; 
    437             } 
    438             else { 
    439                 return false; 
    440             } 
     435            $tb_o['rate_limit_data']['last_check'] = time(); 
     436             
     437            // save rate limit data to options 
     438            update_option('tweet-blender',$tb_o); 
     439             
     440            return true; 
    441441        } 
    442442        else { 
     
    451451    $tweets = array(); 
    452452    $tweets = tb_get_cached_tweets($sources, 500); 
    453     foreach ($tweets as $t){ 
    454         $tweet = $wp_json->decode($t->tweet_json); 
    455         $tweet['div_id'] = $t->div_id; 
    456         $tweets[] = $tweet; 
    457     } 
    458      
    459     return $wp_json->encode($tweets); 
    460 } 
    461  
    462 function tb_save_cache($tweets) { 
    463     global $wpdb, $wp_json; 
    464  
    465     if (is_object($tweets)) { 
    466         $tweets = (array)$tweets; 
    467     } 
    468      
    469     if (is_array($tweets)) { 
    470  
    471         $table_name = $wpdb->prefix . "tweetblender"; 
    472  
    473         $inserted_cache = false; 
    474          
    475         // process each tweet 
    476         foreach ($tweets as $div_id => $tweet) { 
    477             $t = $tweet->t; 
    478             $source = urldecode($tweet->s); 
    479              
    480             // if there are commas then we have multiple keywords and/or hashtags 
    481             if (strpos($source,',') > 0) { 
    482                 $tweet_sources = split(',',$source); 
    483             } 
    484             // else it's an array with just one element 
    485             else { 
    486                 $tweet_sources = array($source); 
    487             } 
    488      
    489             // insert the tweet for each source      
    490             foreach($tweet_sources as $src) { 
    491      
    492                 // TODO: make sure source is in the admin defined set 
    493                 // store the tweet only if it matches this particular keyword or hashtag or if this is for list/username 
    494                 if (strpos(strtolower($t->text),strtolower($src)) !== false || strpos($src, '@') === 0 || strtolower($src) == strtolower($t->from_user)) { 
    495  
    496                     $wpdb->query("INSERT IGNORE INTO $table_name (div_id,source,tweet_text,tweet_json) VALUES ('" .  
    497                         $wpdb->escape($div_id) . "','" .  
    498                         $wpdb->escape($src) . "','" .  
    499                         $wpdb->escape($t->text) . "','" . 
    500                         $wpdb->escape($wp_json->encode($t)) . "')" 
    501                     ); 
    502                      
    503                     $inserted_cache = true; 
    504                 } 
    505             } 
    506         } 
    507          
    508         return $inserted_cache;  
    509     } 
    510     else { 
    511         return false; 
    512     }    
    513 } 
    514  
    515 // creates HTML for the list of tweets using cached tweets 
    516 function tb_get_cached_tweets_html($mode,$instance,$widget_id = '') { 
    517  
    518     global $wp_json; 
    519      
    520     // get options 
    521     $tb_o = get_option('tweet-blender'); 
    522      
    523     // figure out how many to get 
    524     if ($mode == 'archive') { 
    525         $tweets_to_show = $tb_o['archive_tweets_num']; 
    526         // get data for all sources 
    527         $sources = array(); 
    528     } 
    529     else { 
    530         $tweets_to_show = $instance['widget_tweets_num']; 
    531         // get data for this widget's sources only 
    532         $sources = preg_split('/[\n\r]/m', trim($instance['widget_sources'])); 
    533     } 
    534  
    535  
    536     // get data from DB 
    537     $tweets_html = ''; 
    538     $tweets = tb_get_cached_tweets($sources, $tweets_to_show,$widget_id); 
     453 
     454//error_log('*** cached tweets: ' . print_r($tweets,true)); 
     455 
    539456    foreach ($tweets as $t){ 
    540457        $tweet = $wp_json->decode($t->tweet_json); 
    541458        $tweet->{'div_id'} = $t->div_id; 
    542         $tweets_html .= tb_tweet_html($tweet,$mode,$tb_o); 
    543     } 
    544      
     459        $tweets[] = $tweet; 
     460    } 
     461     
     462    return $wp_json->encode($tweets); 
     463} 
     464 
     465function tb_save_cache($tweets,$tweet_sources) { 
     466    global $wpdb, $wp_json; 
     467    $inserted_cache = false; 
     468    $tweets_set = array(); 
     469 
     470//error_log('*** tweets: ' . print_r($tweets, true)); 
     471 
     472    $table_name = $wpdb->prefix . "tweetblender"; 
     473 
     474    // search results 
     475    if (isset($tweets->{'statuses'})) { 
     476        $tweets_set = (array)$tweets->{'statuses'}; 
     477    } 
     478    // user timeline or favorites 
     479    else { 
     480        $tweets_set = (array)$tweets; 
     481    } 
     482 
     483    // process each tweet 
     484    foreach ($tweets_set as $tweet) { 
     485 
     486//error_log('*** tweet = ' . print_r($tweet,true)); 
     487 
     488        // figure out $div_id 
     489        $div_id = 't-' . tb_str2time($tweet->{'created_at'}) . '000-' . $tweet->{'user'}->{'screen_name'} . '-' . $tweet->{'id_str'}; 
     490 
     491        // process each source 
     492        foreach($tweet_sources as $src) { 
     493 
     494//error_log('*** src = '. $src); 
     495 
     496            // only insert if tweet text contains source or tweet author matches the source 
     497            if (strpos($tweet->{'text'}, $src) !== false || $tweet->{'user'}->{'screen_name'} == substr($src, 1)) { 
     498                         
     499//error_log('** inserting for ' . $src); 
     500 
     501                $wpdb->query("INSERT IGNORE INTO $table_name (div_id,source,tweet_text,tweet_json) VALUES ('" .  
     502                    $wpdb->escape($div_id) . "','" .  
     503                    $wpdb->escape($src) . "','" .  
     504                    $wpdb->escape($tweet->{'text'}) . "','" . 
     505                    $wpdb->escape($wp_json->encode($tweet)) . "')" 
     506                ); 
     507                 
     508                $inserted_cache = true; 
     509                 
     510            } 
     511        } 
     512    } 
     513     
     514    return $inserted_cache;  
     515} 
     516 
     517// creates HTML for the list of tweets using cached tweets 
     518function tb_get_cached_tweets_html($mode,$instance,$widget_id = '',$sources = array()) { 
     519 
     520    global $wp_json; 
     521     
     522    // get options 
     523    $tb_o = get_option('tweet-blender'); 
     524 
     525    // if no explicit sources requisted, get the ones configured for the widget 
     526    if (sizeof($sources) == 0) { 
     527        $sources = array_values(array_filter(preg_split('/[\n\r]/m', trim($instance['widget_sources'])))); 
     528    } 
     529     
     530    $tweets_html = ''; 
     531     
     532    if ($mode == 'chart') { 
     533         
     534        // get data from DB 
     535        $chart_data = tb_get_chart_data($sources,$instance['widget_chart_period'],$instance['widget_chart_type']); 
     536         
     537        $tweets_html .= tb_wrap_javascript('TB_chartsData["' . $widget_id . '"] = eval(\'(' . $wp_json->encode($chart_data) . ')\');'); 
     538         
     539    } 
     540    else { 
     541        // figure out how many to get 
     542        if ($mode == 'archive') { 
     543            $tweets_to_show = $tb_o['archive_tweets_num']; 
     544        } 
     545        else { 
     546            $tweets_to_show = $instance['widget_tweets_num']; 
     547        } 
     548         
     549        // get data from DB 
     550        $tweets = tb_get_cached_tweets($sources, $tweets_to_show,$widget_id); 
     551        foreach ($tweets as $t){ 
     552            $tweet = $wp_json->decode($t->tweet_json); 
     553            $tweet->{'div_id'} = $t->div_id; 
     554            $tweets_html .= tb_tweet_html($tweet,$mode,$tb_o); 
     555        } 
     556    } 
     557                 
    545558    return $tweets_html; 
    546559} 
     560 
    547561 
    548562function tb_get_cached_tweets($sources,$tweets_num,$widget_id = '') { 
     
    577591} 
    578592 
     593function tb_tweet_is_ok_to_show($tweet, $tb_o) { 
     594     
     595    global $tb_seen_tweets; 
     596     
     597    // if we don't show tweets with same content 
     598    if ($tb_o['filter_hide_same_text']) { 
     599        if (in_array($tweet->text,$tb_seen_tweets)) { 
     600            return false; 
     601        } 
     602    } 
     603 
     604    // if this is a reply 
     605    if ($tweet->in_reply_to_user_id || $tweet->in_reply_to_status_id || $tweet->in_reply_to_screen_name) { 
     606        // if we don't show replies 
     607        if ($tb_o['filter_hide_replies']) { 
     608            return false; 
     609        } 
     610    } 
     611    // else, if it's not a reply but we are showing only replies 
     612    else if ($tb_o['filter_hide_not_replies']) { 
     613        return false; 
     614    } 
     615     
     616    // if it's a retweet and we are hiding retweets 
     617    if ($tweet->retweeted_status && $tb_o['filter_hide_retweets']) { 
     618        return false; 
     619    } 
     620 
     621    // if there are filtered words and the tweet text matches any of them - skip this tweet 
     622    if (isset($tb_o['filter_bad_strings'])) { 
     623        $bad_strings = explode(',', $tb_o['filter_bad_strings']); 
     624         
     625        if (sizeof($bad_strings) > 0) { 
     626            foreach ($bad_strings as $bad_string) { 
     627     
     628                if ($bad_string != '' && strpos($tweet->text, $bad_string) !== false) { 
     629                    return false; 
     630                } 
     631            } 
     632        } 
     633    } 
     634     
     635    // if throttling is ON 
     636    if ($tb_o['filter_limit_per_source'] > 0) { 
     637        // if we alrady have seent tweets from this sources 
     638        if (isset($tb_tweet_counts_per_source[$tweet->user->screen_name])) { 
     639         
     640            //  and we are at max for this user, skip it 
     641            if ($tb_tweet_counts_per_source[$tweet->user->screen_name] >= $tb_o['filter_limit_per_source']) { 
     642                return false; 
     643            } 
     644            else { 
     645                $tb_tweet_counts_per_source[$tweet->user->screen_name]++; 
     646            } 
     647        } 
     648        else { 
     649            $tb_tweet_counts_per_source[$tweet->user->screen_name] = 1; 
     650        } 
     651    } 
     652     
     653    // add this tweet to seen tweets 
     654    $tb_seen_tweets[] = $tweet->text; 
     655     
     656    return true; 
     657} 
     658 
     659 
    579660// creates all HTML for a tweet using current configuration 
    580661function tb_tweet_html($tweet,$mode = 'widget',$tb_o) { 
    581662 
     663    // first make sure this tweet should be shown considering current filters 
     664    if (!tb_tweet_is_ok_to_show($tweet, $tb_o)) { 
     665        return ''; 
     666    } 
     667     
    582668    // add screen name if from_user is given 
    583669    if (!isset($tweet->user)) { 
     
    594680    } 
    595681 
    596     // see if there in alias for this screen name 
    597     if (isset($tb_o['alt_source_names'])) { 
    598         $TB_sourceNames = $tb_o['alt_source_names']; 
    599     } 
    600682    if (isset($TB_sourceNames[strtolower($tweet->user->screen_name)])) { 
    601683        $tweet->user->alias = $TB_sourceNames[strtolower($tweet->user->screen_name)]; 
     
    605687    } 
    606688 
    607     // image url 
    608     if (!isset($tweet->user->profile_image_url) && isset($tweet->profile_image_url)) { 
    609         $tweet->user->profile_image_url = $tweet->profile_image_url; 
    610     } 
    611  
    612689    $patterns = array(); $replacements = array(); 
    613     // link URLs if requested 
    614     if ($tb_o['general_link_urls']) { 
    615         $patterns[] = '/(https?:\/\/\S+)/'; 
    616         $replacements[] = '<a rel="nofollow" href="$1">$1</a>'; 
    617     } 
    618     // link screen names if requested 
    619     if ($tb_o['general_link_screen_names']) { 
    620         $patterns[] = '/\@([\w]+)/'; 
    621         $replacements[] = '<a rel="nofollow" href="http://twitter.com/$1">@$1</a>'; 
    622     } 
    623     // link hashtags if requested 
    624     if ($tb_o['general_link_hash_tags']) { 
    625         $patterns[] = '/\#(\S+)/'; 
    626         $replacements[] = '<a rel="nofollow" href="http://search.twitter.com/search?q=%23$1">#$1</a>'; 
    627     } 
     690    // link URLs 
     691    $patterns[] = '/(https?:\/\/\S+)/'; 
     692    $replacements[] = '<a rel="nofollow" href="$1">$1</a>'; 
     693    // link screen names 
     694    $patterns[] = '/\@([\w]+)/'; 
     695    $replacements[] = '<a rel="nofollow" href="http://twitter.com/$1">@$1</a>'; 
     696    // link hashtags 
     697    $patterns[] = '/\#(\S+)/'; 
     698    $replacements[] = '<a rel="nofollow" href="http://twitter.com/search?q=%23$1">#$1</a>'; 
     699 
    628700    if (sizeof($patterns) > 0) { 
    629701        $tweet->text = preg_replace($patterns,$replacements,$tweet->text); 
     
    656728    $tweet_template .= '<div class="tb_tweet" id="{0}">'; 
    657729 
    658     // photo if requested 
    659     if ($tb_o[$mode . '_show_photos']) { 
    660         $tweet_template .= '<a class="tb_photo" rel="nofollow" href="http://twitter.com/{1}"><img src="{2}" alt="{1}" /></a>'; 
    661     } 
     730    // photo 
     731    $tweet_template .= '<a class="tb_photo" rel="nofollow" href="http://twitter.com/{1}"><img src="{2}" alt="{1}" /></a>'; 
    662732 
    663733    // author 
    664     if ($tb_o[$mode . '_show_user']) { 
    665         if (isset($tweet->user->alias)) { 
    666             $tweet_template .= '<span class="tb_author"><a rel="nofollow" href="http://twitter.com/{1}">{7}</a>: </span> '; 
    667         } 
    668         else { 
    669             $tweet_template .= '<span class="tb_author"><a rel="nofollow" href="http://twitter.com/{1}">{1}</a>: </span> '; 
    670         } 
    671     } 
     734    $tweet_template .= '<span class="tb_author">{7}<br /><a rel="nofollow" href="http://twitter.com/{1}">@{1}</a>: </span> '; 
    672735 
    673736    // tweet text    
     
    724787            $date_html, // {5} 
    725788            $source_html, // {6} 
    726             $tweet->user->alias // {7} 
     789            $tweet->user->name // {7} 
    727790        ), 
    728791        $tweet_template 
     
    9431006} 
    9441007 
     1008function tb_get_cache_stats($sources = null,$period = null) { 
     1009     
     1010    global $wpdb; 
     1011    $table_name = $wpdb->prefix . "tweetblender"; 
     1012     
     1013    $sql = "SELECT source, COUNT(*) AS tweets_num, UNIX_TIMESTAMP(MAX(created_at)) AS last_update FROM " . $table_name; 
     1014     
     1015    // if we need stats only for specific sources 
     1016    $where_parts = array(); 
     1017    if (isset($sources)) { 
     1018        $where_parts[] = 'source IN ("' . implode('","',$sources) . '")';    
     1019    } 
     1020    // if we need stats for a specific period 
     1021    if (isset($period) && in_array($period,array('hour','day','week','month'))) { 
     1022        $where_parts[] = 'created_at >= DATE_SUB(NOW(),INTERVAL 1 ' . $period . ')'; 
     1023    } 
     1024    if (sizeof($where_parts) > 0) { 
     1025        $sql .= ' WHERE ' . join(' AND ',$where_parts); 
     1026    } 
     1027 
     1028    $sql .= " GROUP BY source"; 
     1029         
     1030    $results = $wpdb->get_results($sql); 
     1031    return $results; 
     1032} 
     1033 
     1034// check for addons 
     1035function tb_check_addons() { 
     1036 
     1037    global $tb_installed_addons, $tb_active_addons, $tb_addons; 
     1038     
     1039    foreach($tb_addons as $addon_id => $addon) { 
     1040        $addon_file = $addon['slug'] . '/' . $addon['slug'] . '.php'; 
     1041        if (file_exists(WP_PLUGIN_DIR . '/' . $addon_file)) {  
     1042            $tb_installed_addons[$addon_id] = true; 
     1043             
     1044            include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); 
     1045             
     1046            if(is_plugin_active($addon_file)) { 
     1047                $tb_active_addons[$addon_id] = true; 
     1048            } 
     1049            else { 
     1050                $tb_active_addons[$addon_id] = false; 
     1051            } 
     1052        } 
     1053        else { 
     1054            $tb_installed_addons[$addon_id] = false; 
     1055        } 
     1056    } 
     1057     
     1058    return false; 
     1059} 
    9451060 
    9461061?> 
  • tweet-blender/trunk/lib/twitteroauth/callback.php

    r200278 r746692  
    55 
    66// include WP functions 
    7 require_once("../../../../../wp-blog-header.php"); 
     7require_once("../../../../../wp-config.php"); 
    88 
    99// if on PHP5, include oAuth library and config 
  • tweet-blender/trunk/lib/twitteroauth/twitteroauth.php

    r350819 r746692  
    2323  public $url; 
    2424  /* Set up the API root URL. */ 
    25   public $host = "https://api.twitter.com/1/"; 
     25  public $host = "https://api.twitter.com/1.1/"; 
    2626  /* Set timeout default. */ 
    2727  public $timeout = 30; 
  • tweet-blender/trunk/readme.txt

    r730555 r746692  
    44Requires at least: 2.8.0 
    55Tested up to: 3.5.2 
    6 Stable tag: 3.3.15 
     6Stable tag: 4.0.0 
    77Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5907095 
    88 
     
    1313Better than Twitter's own widgets - Tweet Blender is tag-aware and has support for multiple authors, lists, hashtags, and keywords all blended together. The plugin can show tweets from just one user or a list of users (as all other Twitter plugins do); however, it can also show tweets for a topic which you can define via Twitter hashtag or keyword. But there is more! It can also show tweets for multiple authors AND multiple lists AND multiple keywords AND multiple hashtags all blended together into a single stream. 
    1414 
    15 Version 3 added a new widget that *automatically shows tweets relevant to your blog post* by taking post's tags and using them as keywords for Twitter search. 
    16  
    1715Submit ideas, ask questions, or report problems on the [GetSatisfaction.com community site for Tweet Blender widget](http://getsatisfaction.com/tweet_blender "Get Satisfaction!") 
    1816 
     
    2018 
    2119= Features = 
    22 * NEW: fully localizable! Russian translation available as of 3.3.6, more languages coming soon (please get in touch if you can help) 
    23 * NEW: ability to apply filtering to lists e.g. @tweetblender/testlist|plugin will pull all tweets from that list that contain word "plugin" 
    24 * NEW: ability to get Cache Manager addon ($) that allows to backup/restore cache and delete individual tweets 
     20* NEW: Checkboxes on the archive page allowing to see archive for just some of the sources 
     21* Fully localizable! Russian translation available as of 3.3.6, more languages coming soon (please get in touch if you can help) 
     22* Ability to apply filtering to lists e.g. @tweetblender/testlist|plugin will pull all tweets from that list that contain word "plugin" 
     23* Ability to get Cache Manager addon ($) that allows to backup/restore cache and delete individual tweets 
    2524* If you use custom field "tb_tags" for a post its value overrides actual tags and gets used by Tweet Blender for Tags widget (requested by Thomas P via GetSatisfaction) 
    2625* Support for non-English hashtags and filter words 
     
    77762. Activate the plugin through the 'Plugins' menu in WordPress 
    78773. Use admin Settings > Tweet Blender to specify configuration options 
     784. Make sure to authenticate to Twitter and allow read-only access to the tweet stream (under Status tab) 
    7979 
    8080= Adding Tweet Blender to Sidebar = 
     
    85852. Drag and drop widget of your choice into the appropriate place on your sidebar. You can add multiple widgets and have each of them blend different sources. 
    86863. Update configuration options and Save them 
     874. If prompted to authenticate to Twitter, click the link and login to enable access to tweets 
    8788 
    8889Note: The Tweet Blender For Tags widget will show up in your sidebar only on a dedicated post page and only if that post has tags. For index and custom pages (and for posts without tags) nothing will be shown. 
     
    141142* tweets_num = Optional. How many tweets to show in the widget 
    142143 
     144= Adding TweetBlender Archive to Pages = 
     145 
     146To add archive block to any page simly copy and paste the following shortcode into the content of the page where you'd like the archive to appear: 
     147 
     148[TweetBlender Archive] 
     149 
     150Note: the tag would be ignored on regular blog posts, only pages are supported. 
     151 
    143152== Screenshots == 
    144153 
    145 1. Sidebar showing 2 widgets. One mixes tweets for "twitter" keyword. The other blends @knovitchenko tweets with tweets for @tweetblender/testlist Twitter list. Any number of widgets can be included. You can turn off display of pictures to conserve screen space. 
     1541. Widget in the sidebar blending tweets for @tweetblender user, #tweetblender hashtag, and tweets from @knovitchenko user with #tweetblender hashtags in them 
    1461552. Tweets archive page. Created automatically and tweets are inserted into content automatically; however, you can edit title, tags, and text of the page using regular admin features 
    147 3. Admin: widgets page that shows Tweet Blender For Tags and Tweet Blender dropped into Sidebar North area and widget control options exposed. 
    148 4. Admin: general settings for the plugin. 
    149 5. Admin: general widget settings for the plugin 
    150 6. Admin: archive page settings 
    151 7. Admin: filtering options 
    152 8. Admin: advanced settings 
    153 9. Admin: status information 
    154 10. Admin: Cache Manager addon (note: paid module) 
     1563. Widget settings for Tweet Blender widget. This widget can blend tweets for users (e.g. @knovitchenko), hashtages (e.g. #tweetblender), lists (e.g. @user/listname), keywords (e.g. twitter), and filtered sources such as twets from a user that contain a hashtag (e.g. @knovitchenko|#tweetblender) or tweets from a list that mention a keyword (e.g. @user/listname|keyword) 
     1574. Widget settins for Tweet Blender for Tags. This widget shows tweets relevant to tags of the post/page. 
     1585. Widget settings for Tweet Blender Favorites widget. This widget shows only tweets that were favorited by listed users. 
     1596. Admin: widgets settings for the plugin 
     1607. Admin: archive page settings 
     1618. Admin: filtering options 
     1629. Admin: SEO options 
     16310. Admin: advanced settings 
     16411. Admin: status information 
     16512. Admin: Cache Manager addon (note: paid module) 
    155166 
    156167== Getting Help == 
     
    172183Here are the places I monitor regularly: 
    173184 
    174 * Twitter: hashtag #tweetblender, mentions of @tweetblender, keywords "tweetblender" and "tweet blender" - This is the best way if your request is fairly urgent as I'm online 16 hours a day 
    175185* Facebook: [Tweet Blender fan page](http://www.facebook.com/pages/Tweet-Blender/96201618006 "Facebook Fan Page") discussion board 
     186* Twitter: hashtag #tweetblender, mentions of @tweetblender, keywords "tweetblender" and "tweet blender" 
    176187* WordPress Support Forums: [tweet-blender tag](http://wordpress.org/tags/tweet-blender?forum_id=10 "WP forum") 
    177188 
    178189Additional resources: 
    179190 
    180 * New Homepage: (coming soon) [http://tweet-blender.com](http://tweet-blender.com "TweetBlender home page") 
    181191* Email: tweetblender AT gmail DOT com 
    182192 
     
    189199= 4.0.0 = 
    190200* Tested with WordPress 3.5.2 
    191 * Upgraded for compatibility with new Twitter API v1.1 
     201* Upgraded to work with the new Twitter API v1.1: one-time authentication is now required for admin, rate limits are observed for each endpoint, no more client-side requests - everything goes through server, caching feature can't be turned off 
     202* Upgraded to comply with Twitter's new display requiements: removed alias feature, photos are always shown, urls/screennames/hashtags in tweets are always linked, user's full name is shown in addition to screen name, all widgets have headers with twitter logo 
     203* New feature: Source selector on the archive page 
     204* New feature: Short tag [TweetBlender Archive] for inserting the archive block into any page or post  
     205* Bug fix: form-based embeds were broken when SEO features were on (thanks to mikejds for reporting via WP forums) 
     206* Bug fix: "flase" instead of "false" in one of the JS functions (thanks to zyend for reporting via WP forums) 
    192207 
    193208= 3.3.15 = 
  • tweet-blender/trunk/tweet-blender.php

    r427446 r746692  
    44Plugin URI: http://www.tweetblender.com 
    55Description: Provides several Twitter widgets: show your own tweets, show tweets relevant to post's tags, show tweets for Twitter lists, show tweets for hashtags, show tweets for keyword searches, show favorite tweets. Multiple widgets on the same page are supported. Can combine sources and blend all of them into a single stream. 
    6 Version: 3.3.15 
     6Version: 4.0.0 
    77Author: Kirill Novitchenko 
    88Author URI: http://kirill-novitchenko.com 
    99*/ 
    1010 
    11 /*  Copyright 2009-2011  Kirill Novitchenko  (email : knovitchenko@gmail.com) 
     11/*  Copyright 2009-2013  Kirill Novitchenko  (email : knovitchenko@gmail.com) 
    1212 
    1313    This program is free software; you can redistribute it and/or modify 
     
    4949} 
    5050 
     51// add includes for addons 
     52tb_check_addons(); 
     53foreach($tb_addons as $addon_id => $addon) { 
     54    $addon_file = $addon['slug'] . '/' . $addon['slug'] . '.php'; 
     55     
     56    if ($tb_installed_addons[$addon_id] && $tb_active_addons[$addon_id]) { 
     57        include_once(WP_PLUGIN_DIR . '/' . $addon_file); 
     58    } 
     59} 
     60 
     61 
    5162// DB initialization 
    5263register_activation_hook(__FILE__,'tb_plugin_init'); 
     
    5768    // set defaults 
    5869    $tb_o = get_option("tweet-blender"); 
    59     if (!isset($tb_o['widget_show_photos'])) { 
    60         $tb_o['widget_show_photos'] = true; 
    61     } 
    62     if (!isset($tb_o['widget_show_source'])) { 
    63         $tb_o['widget_show_source'] = true; 
    64     } 
    65     if (!isset($tb_o['widget_show_header'])) { 
    66         $tb_o['widget_show_header'] = true; 
    67     } 
    68     if (!isset($tb_o['general_link_screen_names'])) { 
    69         $tb_o['general_link_screen_names'] = true; 
    70     } 
    71     if (!isset($tb_o['general_link_hash_tags'])) { 
    72         $tb_o['general_link_hash_tags'] = true; 
    73     } 
    74     if (!isset($tb_o['general_link_urls'])) { 
    75         $tb_o['general_link_urls'] = true; 
    76     } 
    7770    if (!isset($tb_o['widget_check_sources'])) { 
    7871        $tb_o['widget_check_sources'] = true; 
    7972    } 
    80     if (!isset($tb_o['widget_show_user'])) { 
    81         $tb_o['widget_show_user'] = true; 
     73    if (!isset($tb_o['rate_limit_data'])) { 
     74        $tb_o['rate_limit_data'] = array(); 
    8275    } 
    8376    update_option('tweet-blender',$tb_o); 
     
    9285    $installed_ver = $tb_o["db_version"]; 
    9386 
     87    $sql = "CREATE TABLE " . $table_name . " ( 
     88      div_id VARCHAR(200) NOT NULL PRIMARY KEY, 
     89      source VARCHAR(255) NOT NULL, 
     90      tweet_text VARCHAR(255), 
     91      tweet_json TEXT NOT NULL, 
     92      created_at TIMESTAMP 
     93    );"; 
     94     
    9495    // if table is not already there - create it 
    9596    if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { 
    96         $sql = "CREATE TABLE " . $table_name . " ( 
    97               div_id VARCHAR(200) NOT NULL PRIMARY KEY, 
    98               source VARCHAR(100) NOT NULL, 
    99               tweet_text VARCHAR(255), 
    100               tweet_json TEXT NOT NULL, 
    101               created_at TIMESTAMP 
    102         );"; 
    103          
     97 
     98        error_log('table not found'); 
    10499        require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); 
    105100        dbDelta($sql); 
     
    109104    } 
    110105    // if table is there but has old structure 
    111     elseif ($installed_ver != $tb_db_version) { 
    112  
    113         $sql = "CREATE TABLE " . $table_name . " ( 
    114               div_id VARCHAR(200) NOT NULL PRIMARY KEY, 
    115               source VARCHAR(255) NOT NULL, 
    116               tweet_text VARCHAR(255), 
    117               tweet_json TEXT NOT NULL, 
    118               created_at TIMESTAMP 
    119         );"; 
    120      
     106    elseif ((int)$installed_ver != (int)$tb_db_version) { 
     107     
     108        error_log('version mismatch'); 
    121109        require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); 
    122110        dbDelta($sql); 
     
    143131     
    144132    $settings = array(); 
     133    // if user already saved settings - use them 
    145134    if(is_array($tb_o)) { 
    146135         
    147136        // remove options not used by widget/archive 
    148137        unset($tb_o['archive_page_id']); 
    149         unset($tb_o['advanced_reroute_type']); 
    150138        unset($tb_o['db_version']); 
    151139         
     
    172160        } 
    173161    } 
     162    // else, use defaults 
     163    else { 
     164        $settings = array( 
     165            "'general_timestamp_format':false", 
     166            "'general_seo_tweets_googleoff':false", 
     167            "'general_seo_footer_googleoff':false", 
     168            "'widget_show_reply_link':false", 
     169            "'widget_show_follow_link':false", 
     170            "'archive_tweets_num':'100'", 
     171            "'archive_show_reply_link':false", 
     172            "'archive_show_follow_link':false", 
     173            "'archive_keep_tweets':'0'", 
     174            "'advanced_no_search_api':false", 
     175            "'filter_lang':' '", 
     176            "'filter_hide_mentions':false", 
     177            "'filter_hide_replies':false", 
     178            "'filter_bad_strings':''", 
     179            "'filter_limit_per_source':false", 
     180            "'filter_limit_per_source_time':'0'", 
     181            "'filter_hide_same_text':true", 
     182            "'filter_hide_not_replies':false", 
     183            "'archive_is_disabled':false", 
     184            "'flag_use_charts':true", 
     185            "'archive_show_source_selector':true" 
     186        ); 
     187    } 
    174188     
    175189    // add default view more link URL 
     
    177191        $settings[] = "'default_view_more_url':'" . get_permalink($archive_post_id) . "'"; 
    178192    } 
    179  
    180     $js = "\nvar TB_pluginPath = '" . plugins_url('/tweet-blender') . "';\n"; 
     193     
     194    // add default ajax url 
     195    $settings[] = "'ajax_url':'" . admin_url('admin-ajax.php') . "'"; 
     196 
     197    $js = "\nvar TB_pluginPath = '" . plugins_url('/tweet-blender') . "', TB_C_pluginPath = '" . plugins_url('/tweet-blender-charts') . "';\n"; 
    181198    if (sizeof($settings) > 0) { 
    182199        $js .= "var TB_config = {\n" . join(",\n",$settings) . "\n}"; 
     
    186203 
    187204// register stylesheet 
    188 add_action('wp_head', 'tb_add_header_css', 100); 
     205add_action('wp_print_styles', 'tb_add_header_css'); 
    189206function tb_add_header_css() { 
    190     echo '<link type="text/css" media="screen" rel="stylesheet" href="' . plugins_url('tweet-blender/css/tweets.css') . '" />' . "\n"; 
     207    wp_enqueue_style('tb-css', '/' . PLUGINDIR . '/tweet-blender/css/tweets.css'); 
    191208} 
    192209 
     
    195212function tb_load_js() { 
    196213 
    197     global $js_labels; 
    198      
    199     $dependencies = array('jquery');     
     214    global $js_labels, $tb_installed_addons, $tb_active_addons, $tb_addons; 
     215     
     216    $dependencies = array('jquery'); 
     217     
    200218    $tb_o = get_option('tweet-blender'); 
    201219    // load PHPDate only if have a custom date 
     
    204222        $dependencies[] = 'phpdate'; 
    205223    } 
    206     // load JSON plugin only if caching is enabled 
    207     if (isset($tb_o['advanced_disable_cache']) && ($tb_o['advanced_disable_cache'] != 'on')) { 
    208         wp_enqueue_script('tojson', '/' . PLUGINDIR . '/tweet-blender/js/jquery.json-2.2.min.js', array('jquery'), false, true); 
    209         $dependencies[] = 'tojson'; 
    210     } 
    211      
    212     // load jsonp plugin with good error hanlding 
    213     wp_enqueue_script('jsonp', '/' . PLUGINDIR . '/tweet-blender/js/jquery.jsonp-2.1.4.min.js', array('jquery'), false, true); 
    214      
     224     
     225    // load Google Charts if charts are being used 
     226    if (isset($tb_o['flag_use_charts'])) { 
     227        wp_enqueue_script('gchart', 'https://www.google.com/jsapi?autoload={"modules":[{"name":"visualization","version":"1"}]}', array(), false, true); 
     228        $dependencies[] = 'gchart'; 
     229    } 
     230         
    215231    // load lib 
    216232    wp_enqueue_script('tb-lib', '/' . PLUGINDIR . '/tweet-blender/js/lib.js',array('jquery'), false, true); 
     
    218234    $dependencies[] = 'tb-lib'; 
    219235     
     236    // add hooks for addons 
     237    foreach($tb_addons as $addon_id => $addon) { 
     238        $addon_file = $addon['slug'] . '/' . $addon['slug'] . '.php'; 
     239         
     240        if ($tb_installed_addons[$addon_id] && $tb_active_addons[$addon_id] && file_exists(WP_PLUGIN_DIR . '/' . $addon['slug'] . '/js/main.js')) { 
     241            $dependencies[] = $addon['slug']; 
     242        } 
     243    } 
     244 
    220245    // load main JS code 
    221246    wp_enqueue_script('tb-main', '/' . PLUGINDIR . '/tweet-blender/js/main.js', $dependencies, false, true); 
     247     
    222248} 
    223249 
     
    240266        // if looking at archive page, apend list of tweets to content 
    241267        if ($post->ID == tb_get_archive_post_id()) { 
    242             $archive_html = '<div id="tweetblender-archive">'; 
    243             $archive_html .= tb_get_cached_tweets_html('archive',null); 
    244             $archive_html .= '</div>'; 
    245  
    246             // JavaScript code for mouseovers 
    247             $archive_html .= tb_wrap_javascript(" 
    248                 TB_mode = 'archive'; 
    249                 jQuery.each(jQuery('#tweetblender-archive').children('div'),function(i,obj){ TB_wireMouseOver(obj.id); }); 
    250             "); 
    251          
    252             return $content . $archive_html; 
    253         } 
     268            return $content . tb_make_archive_html($tb_o); 
     269        } 
     270        // if content has the shorttag 
     271        else if (preg_match("[TweetBlender Archive]",$content)) { 
     272            return str_replace("[TweetBlender Archive]",tb_make_archive_html($tb_o),$content); 
     273        }  
    254274        // else, do nothing 
    255275        else { 
     
    257277        } 
    258278    } 
     279} 
     280 
     281function tb_make_archive_html($tb_o) { 
     282     
     283    $sources = array(); // by default we get tweets for all sources 
     284    $archive_html = ''; 
     285     
     286    if((isset($tb_o['archive_show_source_selector']) && $tb_o['archive_show_source_selector']) || isset($_GET['source'])) { 
     287 
     288        if(isset($_GET['source'])) { 
     289            if (is_array($_GET['source'])) { 
     290                $sources = $_GET['source']; 
     291            } 
     292            else { 
     293                $sources = array_values(array_filter(preg_split('/,/m', trim($_GET['source'])))); 
     294            } 
     295        } 
     296         
     297        $archive_html .= '<form id="tb-source-selector">' . __('Show tweets for','tweetblender'); 
     298         
     299        $cached_sources = tb_get_cache_stats(); 
     300        foreach ((array)$cached_sources as $cache_src) { 
     301            $archive_html .= '<input type="checkbox" class="tb-source" name="source[]" value="' . esc_attr($cache_src->source) . '"'; 
     302            if(in_array($cache_src->source,$sources) || sizeof($sources) == 0) { 
     303                $archive_html .= ' checked'; 
     304            } 
     305            $archive_html .= '/> ';                  
     306            $archive_html .= urldecode($cache_src->source); 
     307        } 
     308         
     309        $archive_html .= '<br /><input id="tb-update-sources" type="submit" value="Update" />'; 
     310         
     311        $archive_html .= '</form>'; 
     312    } 
     313     
     314    $archive_html .= '<div id="tweetblender-archive">'; 
     315    $archive_html .= tb_get_cached_tweets_html('archive',null,null,$sources); 
     316    $archive_html .= '</div>'; 
     317 
     318    // JavaScript code for mouseovers 
     319    $archive_html .= tb_wrap_javascript("jQuery('document').ready(function(){ 
     320        TB_mode = 'archive'; 
     321        jQuery.each(jQuery('#tweetblender-archive').children('div'),function(i,obj){ TB_wireMouseOver(obj.id); }); 
     322    });"); 
     323     
     324    return $archive_html; 
    259325} 
    260326 
     
    319385function tb_create_markup($mode = 'widget',$instance,$widget_id,$tb_o) { 
    320386    $html = ''; 
    321     if (isset($tb_o['widget_show_header']) && $tb_o['widget_show_header']) { 
    322         $html .= tb_create_markup_header($widget_id); 
    323     } 
    324     if (isset($tb_o['general_seo_tweets_googleoff']) && $tb_o['general_seo_tweets_googleoff']) { 
    325         $html .= '<!--googleoff: index--><div class="tb_tweetlist">' . tb_get_cached_tweets_html($mode,$instance,$widget_id) . '</div><!--googleon: index-->'; 
     387    $html .= tb_create_markup_header($widget_id); 
     388 
     389    if ($mode == 'chart') { 
     390        $html .= '<div class="tb_tweetchart" id="' . $widget_id . '-chart"></div>'; 
     391        $html .= tb_get_cached_tweets_html($mode,$instance,$widget_id); 
    326392    } 
    327393    else { 
    328         $html .= '<div class="tb_tweetlist">' . tb_get_cached_tweets_html($mode,$instance) . '</div>'; 
     394        if (isset($tb_o['general_seo_tweets_googleoff']) && $tb_o['general_seo_tweets_googleoff']) { 
     395            $html .= '<!--googleoff: index--><div class="tb_tweetlist">' . tb_get_cached_tweets_html($mode,$instance,$widget_id) . '</div><!--googleon: index-->'; 
     396        } 
     397        else { 
     398            $html .= '<div class="tb_tweetlist">' . tb_get_cached_tweets_html($mode,$instance) . '</div>'; 
     399        } 
    329400    } 
    330401    return $html; 
     
    340411} 
    341412 
    342 // for backward compatibility 
    343 function tb_archive($sources = '') { 
    344     echo ''; 
    345     return; 
    346 } 
    347  
    348 // for backward compatibility 
    349 function tb_widget($args = array()) { 
    350     echo ''; 
    351     return; 
    352 } 
    353  
    354413?> 
  • tweet-blender/trunk/widget-favorites.php

    r427446 r746692  
    11<?php 
    22 
    3 // version 3.3.15 
     3// version 4.0.0 
    44 
    55class TweetBlenderFavorites extends WP_Widget { 
     
    3535             
    3636            $sources = preg_split('/[\s+\n\r]/m',trim($instance['widget_sources'])); 
    37             $private_sources = array(); 
    38             if ($instance['widget_private_sources'] != '') { 
    39                 $private_sources = split(',',$instance['widget_private_sources']); 
    40             } 
    41             // remove private from general sources to avoid duplicates 
    42             $sources = array_diff($sources,$private_sources); 
    43             // mark private sources as private by prepending ! sign 
    44             array_walk($private_sources,create_function('&$v,$k','if($v != "") { $v = "!".$v; }')); 
    4537 
    4638            // set "view more" text 
     
    5446            // add configuraiton options 
    5547            echo '<form id="' . $this->id . '-f" class="tb-widget-configuration" action="#"><div>'; 
    56             echo '<input type="hidden" name="sources" value="' . join(',',array_merge($sources,$private_sources)) . '" />'; 
     48            echo '<input type="hidden" name="sources" value="' . join(',',$sources) . '" />'; 
    5749            echo '<input type="hidden" name="refreshRate" value="' . $instance['widget_refresh_rate'] . '" />'; 
    5850            echo '<input type="hidden" name="tweetsNum" value="' . $instance['widget_tweets_num'] . '" />'; 
     
    9284        $instance = $old_instance; 
    9385        $tb_o = get_option('tweet-blender'); 
    94          
    95         // process sources 
    9686        $errors = array(); 
    97         if (isset($old_instance['widget_sources'])) { 
    98             $old_sources = preg_split('/[\n\r]/m', $old_instance['widget_sources']); 
     87 
     88        // check to make sure we have oAuth token        
     89        if (!$tb_o['oauth_access_token']) {              
     90            // Create TwitterOAuth object and get request token 
     91            $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 
     92                      
     93            // Get request token 
     94            $request_token = $connection->getRequestToken(get_bloginfo('url') . '/' . PLUGINDIR . "/tweet-blender/lib/twitteroauth/callback.php"); 
     95                      
     96            if ($connection->http_code == 200) { 
     97                // Save request token to session 
     98                $tb_o['oauth_token'] = $token = $request_token['oauth_token']; 
     99                $tb_o['oauth_token_secret'] = $request_token['oauth_token_secret']; 
     100                update_option('tweet-blender',$tb_o); 
     101                 
     102                $errors[] = __("Twitter API v1.1 requires authentication", 'tweetblender') . " <a href='javascript:tAuth(\"" . $connection->getAuthorizeURL($token) . "\")' title=" . __('Authorize Access', 'tweetblender') . ">" . __('Use your Twitter account to login', 'tweetblender') . "</a>."; 
     103 
     104            } 
     105            else { 
     106                $errors[] = __("Twitter oAuth is not possible at this time.", 'tweetblender') .  "<!--" . $connection->last_api_call . "-->"; 
     107            } 
    99108        } 
    100109        else { 
    101             $old_sources = array(); 
    102         } 
    103         $new_sources = preg_split('/[\n\r]/m', $new_instance['widget_sources']); 
    104         $oAuth = null; 
    105         $have_bad_sources = false; $need_oauth_tokens = false; $status_msg = array(); $log_msg = ''; $private_sources = array(); 
    106  
    107         if (isset($tb_o['widget_check_sources']) && $tb_o['widget_check_sources']) { 
    108             foreach($new_sources as $src) { 
    109                 $src = trim($src); 
    110                 // if there is an alias 
    111                 if(strpos($src,':') > 0 ) { 
    112                     $sourceToCheck = substr($src, 0, strpos($src,':')); 
    113                 } 
    114                 else { 
    115                     $sourceToCheck = $src; 
    116                 } 
    117                 if ($src != '') { 
    118                     list($is_ok,$is_private,$need_oauth,$msg,$log) = $this->check_source($sourceToCheck,$tb_o); 
    119                      
    120                     if (!$is_ok) { 
    121                         $have_bad_sources = true; 
     110         
     111            // process sources 
     112            if (isset($old_instance['widget_sources'])) { 
     113                $old_sources = preg_split('/[\n\r]/m', $old_instance['widget_sources']); 
     114            } 
     115            else { 
     116                $old_sources = array(); 
     117            } 
     118            $new_sources = preg_split('/[\n\r]/m', $new_instance['widget_sources']); 
     119 
     120            $have_bad_sources = false; $status_msg = array(); $log_msg = ''; 
     121 
     122            if (isset($tb_o['widget_check_sources']) && $tb_o['widget_check_sources']) { 
     123                foreach($new_sources as $src) { 
     124                    $src = trim($src); 
     125                    if ($src != '') { 
     126                        list($is_ok,$msg,$log) = $this->check_source($src,$tb_o); 
     127                         
     128                        if (!$is_ok) { 
     129                            $have_bad_sources = true; 
     130                        } 
     131                        $status_msg[] = $msg; 
     132                        $log_msg .= $log; 
    122133                    } 
    123                     if ($need_oauth) { 
    124                         $need_oauth_tokens = true; 
    125                     }                
    126                     if ($is_private) { 
    127                         $private_sources[] = $src; 
    128                     } 
    129                     $status_msg[] = $msg; 
    130                     $log_msg .= $log; 
    131                 } 
    132             } 
    133          
    134             if ($need_oauth_tokens) {                
    135                  
    136                 if (class_exists('TwitterOAuth')) { 
    137                     // Create TwitterOAuth object and get request token 
    138                     $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 
    139                       
    140                     // Get request token 
    141                     $request_token = $connection->getRequestToken(get_bloginfo('url') . '/' . PLUGINDIR . "/tweet-blender/lib/twitteroauth/callback.php"); 
    142                       
    143                     if ($connection->http_code == 200) { 
    144                         // Save request token to session 
    145                         $tb_o['oauth_token'] = $token = $request_token['oauth_token']; 
    146                         $tb_o['oauth_token_secret'] = $request_token['oauth_token_secret']; 
    147                         update_option('tweet-blender',$tb_o); 
    148                          
    149                         $errors[] = __("Sources have protected screen names.", 'tweetblender') . "<a href='javascript:tAuth(\"" . $connection->getAuthorizeURL($token) . "\")' title= __('Authorize Twitter Access', 'tweetblender')> __('Use your Twitter account to access them', 'tweetblender')</a>."; 
    150          
    151                     } 
    152                     else { 
    153                         $errors[] = __("Sources have protected screen names but Twitter oAuth is not possible at this time. Please remove them from the list.", 'tweetblender') .  "<!--" . $connection->last_api_call . "-->"; 
    154                     } 
    155                 } 
    156                 else { 
    157                     $errors[] = __("Sources have protected screen names but Twitter oAuth class is not available. Please remove them from the list.", 'tweetblender'); 
    158134                } 
    159135            } 
     
    166142            $instance['widget_tweets_num'] = $new_instance['widget_tweets_num']; 
    167143            $instance['widget_sources'] = $new_instance['widget_sources']; 
    168             $instance['widget_private_sources'] = join(',',$private_sources); 
    169144            $instance['widget_view_more_url'] = $new_instance['widget_view_more_url']; 
    170145            $instance['widget_view_more_text'] = trim($new_instance['widget_view_more_text']); 
     
    172147        } 
    173148        else { 
    174             $this->error = join(', ',$status_msg) . " $log_msg"; 
     149            if (sizeof($status_msg) > 0) { 
     150                $this->error = join(', ',$status_msg) . "<!-- $log_msg -->" . '<br/><br/>'; 
     151            } 
    175152            if (sizeof($errors) > 0) { 
    176153                $this->error .= '<br/><br/>' . join(', ', $errors); 
     
    213190        $field_name = $this->get_field_name('widget_sources'); 
    214191        echo "\r\n".'<p><label for="'.$field_id.'">'.__('Sources (one per line)', 'tweetblender').': <textarea class="widefat" id="'.$field_id.'" name="'.$field_name.'" rows=4 cols=20 wrap="hard">' . esc_attr( $instance['widget_sources'] ) . '</textarea></label></p>'; 
    215  
    216         // private sources 
    217         $field_id = $this->get_field_id('widget_private_sources'); 
    218         $field_name = $this->get_field_name('widget_private_sources'); 
    219         if (!isset($instance['widget_private_sources'])) { 
    220             $instance['widget_private_sources'] = ''; 
    221         }  
    222         echo "\r\n".'<input type="hidden" id="'.$field_id.'" name="'.$field_name.'" value="' . esc_attr( $instance['widget_private_sources'] ) . '" />'; 
    223192                 
    224193        // specify refresh 
     
    281250    function check_source($src,$tb_o) { 
    282251 
    283         global $wp_json; 
    284         $need_oauth = false; 
    285         $is_private = false; 
    286252        $source_check_result = ''; 
    287253        $log_msg = ''; 
    288254        $is_ok = false; 
    289  
    290         // if we don't have json class, get the library 
    291         if ( !is_a($wp_json, 'Services_JSON') ) { 
    292             if (file_exists(ABSPATH . WPINC . '/class-json.php')) { 
    293                 require_once( ABSPATH . WPINC . '/class-json.php' ); 
    294             } 
    295             else { 
    296                 require(dirname(__FILE__).'/lib/JSON.php'); 
    297             } 
    298             $wp_json = new Services_JSON(); 
    299         } 
    300                  
    301         // remove private account markup 
    302         if (stripos($src,'!') === 0) { 
    303             $src = substr($src,1); 
    304         } 
    305255         
    306256        // remove modifiers 
     
    308258            $source_check_result = ' ' . $src . ' - <span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    309259            $log_msg = "($src)" . __('only screen names work with favorites', 'tweetblender') ."\n"; 
    310             return array($is_ok,$is_private,$need_oauth,$source_check_result,$log_msg); 
     260            return array($is_ok,$source_check_result,$log_msg); 
    311261        } 
    312262         
    313263        $source_is_screen_name = false; 
     264         
    314265        // if it's a list, report it as bad source 
    315266        if (stripos($src,'@') === 0 && stripos($src,'/') > 1) { 
    316267            $source_check_result = ' ' . $src . ' - <span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    317268            $log_msg = "($src)" . __('only screen names work with favorites', 'tweetblender') ."\n"; 
    318             return array($is_ok,$is_private,$need_oauth,$source_check_result,$log_msg); 
    319         } 
    320         // if it's a screen name, use timeline API (search would not give us private/public check) 
     269            return array($is_ok,$source_check_result,$log_msg); 
     270        } 
     271        // if it's a screen name, use timeline API 
    321272        elseif (stripos($src,'@') === 0) { 
    322             $source_is_screen_name = true; 
    323             $apiUrl = 'http://api.twitter.com/1/favorites/' . substr($src,1) . '.json'; 
     273            $api_url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; 
     274            $api_params = array('screen_name' => substr($src,1)); 
    324275        } 
    325276        // else assume it's a hashtag or keyword, report as bad source 
     
    327278            $source_check_result = ' ' . $src . ' - <span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    328279            $log_msg = "($src)" . __('only screen names work with favorites',  'tweetblender') ."\n"; 
    329             return array($is_ok,$is_private,$need_oauth,$source_check_result,$log_msg); 
    330         } 
    331  
    332         if (!class_exists('WP_Http')) { 
    333              include_once( ABSPATH . WPINC. '/class-http.php' );  
    334         }        
    335         $http = new WP_Http; 
    336         $result = $http->request($apiUrl); 
     280            return array($is_ok,$source_check_result,$log_msg); 
     281        } 
    337282 
    338283        // try to get data from Twitter 
    339         if (!is_wp_error($result)) { 
    340             $jsonData = $wp_json->decode($result['body']); 
     284        if(isset($tb_o['oauth_access_token'])) { 
     285            $oAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $tb_o['oauth_access_token']['oauth_token'],$tb_o['oauth_access_token']['oauth_token_secret']); 
     286             
     287            $json_data = $oAuth->OAuthRequest($api_url, 'GET', $api_params); 
     288             
     289            // if we didn't get any data 
     290            if (!isset($json_data)) { 
     291                $source_check_result = ' ' . $src . ' - <span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
     292                $log_msg = "($src) " . __('json error','tweetblender') . ': ' . __('can not get json', 'tweetblender') . "\n" . $apiUrl; 
     293            } 
    341294            // if Twitter reported error 
    342             if (!isset($jsonData)) { 
    343                 $source_check_result = ' ' . $src . ' - <span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    344                 $log_msg = "($src)" . __('json error','tweetblender') . ': ' . __('could not decode body',  'tweetblender') ."\n"; 
    345             } 
    346             elseif(isset($jsonData->{'error'})) { 
    347              
    348                 // if it's a private user 
    349                 if (strpos($jsonData->{'error'},"Not authorized") !== false){ 
    350                     $is_private = true; 
    351                     // if we don't have access tokens - error 
    352                     if (!array_key_exists('oauth_access_token',$tb_o)) { 
    353                         $source_check_result = $src . ' - <span class="fail">' . __('PRIVATE', 'tweetblender') . '</span>'; 
    354                         $log_msg = "($src)" . __('Private: needs oAuth',  'tweetblender') ."\n"; 
    355                         $need_oauth = true; 
    356                     } 
    357                     // if we do have tokens - OK 
    358                     else { 
    359                         $is_ok = true; 
    360                         $source_check_result = ' ' . $src . ' - <span class="pass">' . __('PRIVATE', 'tweetblender') . '</span>'; 
    361                         $log_msg = "($src)" . __('Private: we have oAuth', 'tweetblender') ."\n"; 
    362                     } 
    363                 } 
     295            elseif (isset($json_data->{'errors'})) { 
     296             
    364297                // if it's just limit error we are OK 
    365                 elseif (strpos($jsonData->{error},"Rate limit exceeded") === 0) { 
     298                if (strpos($json_data->{'errors'}->{'message'},"Rate limit exceeded") === 0) { 
    366299                    $is_ok = true; 
    367300                    $source_check_result = ' ' . $src . ' - <span class="pass">' . __('OK', 'tweetblender') . '</span>'; 
    368                     $log_msg = "($src)" . __('Error','tweetblender') . ': ' . __('limit error', 'tweetblender') ."\n"; 
     301                    $log_msg = "($src) " . __('Error','tweetblender') . ': ' . __('limit error', 'tweetblender') . "\n"; 
    369302                } 
    370303                // any other error is an error 
    371304                else { 
    372305                    $source_check_result = ' ' . $src . ' - <span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    373                     $log_msg = "($src)" . __('json error','tweetblender') . ': ' . $jsonData->{error} . "\n"; 
     306                    $log_msg = "($src) " . __('json error','tweetblender') . ': ' . $jsonData->{error} . "\n"; 
    374307                } 
    375308            } 
     
    378311                $is_ok = true; 
    379312                $source_check_result = ' ' . $src . ' - <span class="pass">' . __('OK', 'tweetblender') . '</span>'; 
    380                 $log_msg = "($src)" . __('Got json with no errors', 'tweetblender') . "\n"; 
    381             } 
    382         } 
    383         // if HTTP request failed 
     313                $log_msg = "($src) " . __('Got json with no errors', 'tweetblender') . "\n"; 
     314            } 
     315        } 
     316        // else we can't check so assume it's a bad source 
    384317        else { 
    385  
    386             // if it's a protected source 
    387             if ($source_is_screen_name && $result['response']['code'] == 401) { 
    388                 $is_private = true; 
    389                 // if have tokens - try to get it 
    390                 if($tb_o['oauth_user_access_key'] && $tb_o['oauth_user_access_secret']) { 
    391                     if (!$oAuth) { 
    392                         $oAuth = new TwitterOAuth( 
    393                             $tb_o['oauth_consumer_key'], 
    394                             $tb_o['oauth_consumer_secret'], 
    395                             $tb_o['oauth_user_access_key'], 
    396                             $tb_o['oauth_user_access_secret'] 
    397                         ); 
    398                     } 
    399                     $content = $oAuth->OAuthRequest('https://api.twitter.com/1/favorites/' . substr($src,1) . 'search.json', array(), 'GET'); 
    400                 } 
    401                 // else make user authorize 
    402                 else { 
    403                     $need_oauth = true; 
    404                     $source_check_result = ' ' . $src . ' - <span class="fail">' . __('PRIVATE', 'tweetblender') . '</span>'; 
    405                     $log_msg = "($src)" . __('Private: needs oAuth',  'tweetblender') . "\n"; 
    406                 } 
    407             } 
    408             // else it's a bad source 
    409             else { 
    410                 $source_check_result = ' ' . $src . ':<span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    411                 $log_msg = "($src)" . __('HTTP error:  ',  'tweetblender') . $result->get_error_message() . "\n"; 
    412             } 
    413         } 
    414          
    415         return array($is_ok,$is_private,$need_oauth,$source_check_result,$log_msg); 
     318            $source_check_result = ' ' . $src . ':<span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
     319            $log_msg = "($src)" . __('HTTP error:  ',  'tweetblender') . __('no oAuth tokens', 'tweetblender') . "\n"; 
     320        } 
     321         
     322        return array($is_ok,$source_check_result,$log_msg); 
    416323 
    417324    } 
  • tweet-blender/trunk/widget-tags.php

    r381114 r746692  
    11<?php 
    22 
    3 // v3.3.4 
     3// v4.0.0 
    44 
    55class TweetBlenderForTags extends WP_Widget { 
     
    2121        } 
    2222 
     23        $sources = array(); 
    2324        // check custom tb_tags field 
    24         $sources = array(); 
    2525        $custom_fields = get_post_custom($post->ID); 
    26         $post_tags = get_the_tags($post->ID); 
    2726        if (isset($custom_fields['tb_tags'])) { 
    2827            foreach($custom_fields['tb_tags'] as $key => $tags) { 
     
    3029            }            
    3130        } 
     31         
    3232        // check general post tags 
    33         elseif (isset($post_tags) && is_array($post_tags) && sizeof($post_tags) > 0) { 
    34             foreach($post_tags as $tag) { 
     33        $post_tags = get_the_tags($post->ID); 
     34        if (isset($post_tags) && sizeof($post_tags) > 0) { 
     35            foreach((array)$post_tags as $tag) { 
    3536                $sources[] = trim($tag->name);           
    3637            } 
    3738        } 
     39         
    3840        // don't show widget if there are no tags 
    39         else { 
     41        if (sizeof($sources) == 0) { 
    4042            echo '<!-- ' . __('Tweet Blender: Not shown as there are no tags for this post', 'tweetblender') . ' -->'; 
    4143            return; 
    4244        } 
    43  
     45         
    4446        if (sizeof($args) > 0) { 
    4547            extract($args, EXTR_SKIP);           
     
    7375    // update/save function 
    7476    function update($new_instance, $old_instance) { 
     77 
    7578        $instance = $old_instance; 
    76         $instance['title'] = trim(strip_tags($new_instance['title'])); 
    77         $instance['widget_refresh_rate'] = $new_instance['widget_refresh_rate']; 
    78         $instance['widget_tweets_num'] = $new_instance['widget_tweets_num']; 
     79        $tb_o = get_option('tweet-blender'); 
     80        $errors = array(); 
     81     
     82        // check to make sure we have oAuth token        
     83        if (!$tb_o['oauth_access_token']) {              
     84                 
     85            // Create TwitterOAuth object and get request token 
     86            $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 
     87                      
     88            // Get request token 
     89            $request_token = $connection->getRequestToken(get_bloginfo('url') . '/' . PLUGINDIR . "/tweet-blender/lib/twitteroauth/callback.php"); 
     90                      
     91            if ($connection->http_code == 200) { 
     92                // Save request token to session 
     93                $tb_o['oauth_token'] = $token = $request_token['oauth_token']; 
     94                $tb_o['oauth_token_secret'] = $request_token['oauth_token_secret']; 
     95                update_option('tweet-blender',$tb_o); 
     96                 
     97                $errors[] = __("Twitter API v1.1 requires authentication", 'tweetblender') . " <a href='javascript:tAuth(\"" . $connection->getAuthorizeURL($token) . "\")' title=" . __('Authorize Access', 'tweetblender') . ">" . __('Use your Twitter account to login', 'tweetblender') . "</a>."; 
    7998 
    80         $this->message = __('Settings saved', 'tweetblender'); 
    81         return $instance; 
     99            } 
     100            else { 
     101                $errors[] = __("Twitter oAuth is not possible at this time.", 'tweetblender') .  "<!--" . $connection->last_api_call . "-->"; 
     102            } 
     103        } 
     104 
     105        if (sizeof($errors) == 0) { 
     106 
     107            $this->message = __('Settings saved', 'tweetblender'); 
     108            $instance['title'] = trim(strip_tags($new_instance['title'])); 
     109            $instance['widget_refresh_rate'] = $new_instance['widget_refresh_rate']; 
     110            $instance['widget_tweets_num'] = $new_instance['widget_tweets_num']; 
     111     
     112            return $instance; 
     113        } 
     114        else { 
     115            if (sizeof($errors) > 0) { 
     116                $this->error .=  join(', ', $errors); 
     117            } 
     118            $this->bad_input = $new_instance; 
     119            return false; 
     120        } 
    82121    } 
    83122  
  • tweet-blender/trunk/widget.php

    r427446 r746692  
    11<?php 
    22 
    3 // version 3.3.15 
     3// version 4.0.0 
    44 
    55class TweetBlender extends WP_Widget { 
     
    2323        $archive_page_url = trim($instance['widget_view_more_url']); 
    2424        if ($archive_page_url == '' && $archive_post_id > 0) { 
    25             $archive_page_url = get_permalink($archive_post_id); 
     25            $archive_page_url = get_permalink($archive_post_id) . '?source=' . urlencode(preg_replace('/[\n\r]/m',',',$instance['widget_sources'])); 
    2626        } 
    2727         
     
    3737             
    3838            $sources = preg_split('/[\n\r]/m',trim($instance['widget_sources'])); 
    39             $private_sources = array(); 
    40             if (isset($instance['widget_private_sources']) && $instance['widget_private_sources'] != '') { 
    41                 $private_sources = split(',',$instance['widget_private_sources']); 
    42             } 
    43             // remove private from general sources to avoid duplicates 
    44             $sources = array_diff($sources,$private_sources); 
    45             // mark private sources as private by prepending ! sign 
    46             array_walk($private_sources,create_function('&$v,$k','if($v != "") { $v = "!".$v; }')); 
    4739 
    4840            // set "view more" text 
     
    5648            // add configuraiton options 
    5749            echo '<form id="' . $this->id . '-f" class="tb-widget-configuration" action="#"><div>'; 
    58             echo '<input type="hidden" name="sources" value="' . esc_attr(join(',',array_merge($sources,$private_sources))) . '" />'; 
     50            echo '<input type="hidden" name="sources" value="' . esc_attr(join(',',$sources)) . '" />'; 
    5951            echo '<input type="hidden" name="refreshRate" value="' . $instance['widget_refresh_rate'] . '" />'; 
    6052            echo '<input type="hidden" name="tweetsNum" value="' . $instance['widget_tweets_num'] . '" />'; 
     
    9688        $instance = $old_instance; 
    9789        $tb_o = get_option('tweet-blender'); 
    98          
    99         // process sources 
    10090        $errors = array(); 
    101         if(isset($old_instance['widget_sources'])) { 
    102             $old_sources = preg_split('/[\n\r]/m', $old_instance['widget_sources']); 
     91         
     92        // check to make sure we have oAuth token        
     93        if (!$tb_o['oauth_access_token']) {              
     94                 
     95            // Create TwitterOAuth object and get request token 
     96            $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 
     97                      
     98            // Get request token 
     99            $request_token = $connection->getRequestToken(get_bloginfo('url') . '/' . PLUGINDIR . "/tweet-blender/lib/twitteroauth/callback.php"); 
     100                      
     101            if ($connection->http_code == 200) { 
     102                // Save request token to session 
     103                $tb_o['oauth_token'] = $token = $request_token['oauth_token']; 
     104                $tb_o['oauth_token_secret'] = $request_token['oauth_token_secret']; 
     105                update_option('tweet-blender',$tb_o); 
     106                 
     107                $errors[] = __("Twitter API v1.1 requires authentication", 'tweetblender') . " <a href='javascript:tAuth(\"" . $connection->getAuthorizeURL($token) . "\")' title=" . __('Authorize Access', 'tweetblender') . ">" . __('Use your Twitter account to login', 'tweetblender') . "</a>."; 
     108 
     109            } 
     110            else { 
     111                $errors[] = __("Twitter oAuth is not possible at this time.", 'tweetblender') .  "<!--" . $connection->last_api_call . "-->"; 
     112            } 
    103113        } 
    104114        else { 
    105             $old_sources = array(); 
    106         } 
    107         $new_sources = preg_split('/[\n\r]/m', $new_instance['widget_sources']); 
    108         $oAuth = null; 
    109         $have_bad_sources = false; $need_oauth_tokens = false; $status_msg = array(); $log_msg = ''; $private_sources = array(); 
    110  
    111         // capture aliases 
    112         $aliases = array(); 
    113         foreach($new_sources as $src) { 
    114             $src = trim($src); 
    115             // if there is an alias 
    116             if(strpos($src,':') > 0 ) { 
    117                 $source_parts = explode(':',$src); 
    118                 $aliases[substr($source_parts[0],1)] = $source_parts[1]; 
    119             } 
    120         } 
    121         if (sizeof($aliases) > 0) { 
    122             $tb_o['alt_source_names'] = $aliases; 
    123             update_option('tweet-blender',$tb_o); 
    124         } 
    125  
    126         if (isset($tb_o['widget_check_sources']) && $tb_o['widget_check_sources']) { 
    127             foreach($new_sources as $src) { 
    128                 $src = trim($src); 
    129                 // if there is an alias 
    130                 if(strpos($src,':') > 0 ) { 
    131                     $sourceToCheck = substr($src, 0, strpos($src,':')); 
    132                 } 
    133                 else { 
    134                     $sourceToCheck = $src; 
    135                 } 
    136                  
    137                 if ($src != '') { 
    138                     list($is_ok,$is_private,$need_oauth,$msg,$log) = $this->check_source($sourceToCheck,$tb_o); 
     115         
     116            // process sources 
     117            if(isset($old_instance['widget_sources'])) { 
     118                $old_sources = preg_split('/[\n\r]/m', $old_instance['widget_sources']); 
     119            } 
     120            else { 
     121                $old_sources = array(); 
     122            } 
     123            $new_sources = preg_split('/[\n\r]/m', $new_instance['widget_sources']); 
     124     
     125            $have_bad_sources = false; $status_msg = array(); $log_msg = ''; 
     126     
     127            // check each source 
     128            if (isset($tb_o['widget_check_sources']) && $tb_o['widget_check_sources']) { 
     129                foreach($new_sources as $src) { 
     130                    $src = trim($src); 
     131                    $source_to_check = $src; 
    139132                     
    140                     if (!$is_ok) { 
    141                         $have_bad_sources = true; 
     133                    if ($src != '') { 
     134                        list($is_ok,$msg,$log) = $this->check_source($source_to_check,$tb_o); 
     135                         
     136                        if (!$is_ok) { 
     137                            $have_bad_sources = true; 
     138                        } 
     139                        $status_msg[] = $msg; 
     140                        $log_msg .= $log; 
    142141                    } 
    143                     if ($need_oauth) { 
    144                         $need_oauth_tokens = true; 
    145                     }                
    146                     if ($is_private) { 
    147                         $private_sources[] = $src; 
    148                     } 
    149                     $status_msg[] = $msg; 
    150                     $log_msg .= $log; 
    151                 } 
    152             } 
    153          
    154             if ($need_oauth_tokens) {                
    155                  
    156                 if (class_exists('TwitterOAuth')) { 
    157                     // Create TwitterOAuth object and get request token 
    158                     $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 
    159                       
    160                     // Get request token 
    161                     $request_token = $connection->getRequestToken(get_bloginfo('url') . '/' . PLUGINDIR . "/tweet-blender/lib/twitteroauth/callback.php"); 
    162                       
    163                     if ($connection->http_code == 200) { 
    164                         // Save request token to session 
    165                         $tb_o['oauth_token'] = $token = $request_token['oauth_token']; 
    166                         $tb_o['oauth_token_secret'] = $request_token['oauth_token_secret']; 
    167                         update_option('tweet-blender',$tb_o); 
    168                          
    169                         $errors[] = __("Sources have protected screen names.", 'tweetblender') . " <a href='javascript:tAuth(\"" . $connection->getAuthorizeURL($token) . "\")' title=" . __('Authorize Twitter Access', 'tweetblender') . ">" . __('Use your Twitter account to access them', 'tweetblender') . "</a>."; 
    170          
    171                     } 
    172                     else { 
    173                         $errors[] = __("Sources have protected screen names but Twitter oAuth is not possible at this time. Please remove them from the list.", 'tweetblender') .  "<!--" . $connection->last_api_call . "-->"; 
    174                     } 
    175                 } 
    176                 else { 
    177                     $errors[] = __("Sources have protected screen names but Twitter oAuth class is not available. Please remove them from the list.", 'tweetblender'); 
    178                 } 
    179             } 
    180         } 
    181  
     142                } 
     143            } 
     144        } 
     145         
    182146        if (sizeof($errors) == 0 && !$have_bad_sources) { 
    183147            $this->message = __('Settings saved', 'tweetblender') . '<br/><br/>' . join(', ',$status_msg); 
     
    186150            $instance['widget_tweets_num'] = $new_instance['widget_tweets_num']; 
    187151            $instance['widget_sources'] = $new_instance['widget_sources']; 
    188             $instance['widget_private_sources'] = join(',',$private_sources); 
    189152            $instance['widget_view_more_url'] = $new_instance['widget_view_more_url']; 
    190153            $instance['widget_view_more_text'] = trim($new_instance['widget_view_more_text']); 
     
    192155        } 
    193156        else { 
    194             $this->error = join(', ',$status_msg) . "<!-- $log_msg -->"; 
     157            if (sizeof($status_msg) > 0) { 
     158                $this->error = join(', ',$status_msg) . "<!-- $log_msg -->" . '<br/><br/>'; 
     159            } 
    195160            if (sizeof($errors) > 0) { 
    196                 $this->error .= '<br/><br/>' . join(', ', $errors); 
     161                $this->error .= join(', ', $errors); 
    197162            } 
    198163            $this->bad_input = $new_instance; 
     
    211176            'widget_sources' => '' 
    212177        ); 
    213         $instance = wp_parse_args( (array) $instance, $default ); 
     178        $instance = wp_parse_args( (array) $instance, $default );    
    214179  
    215180        // report errors if any 
     
    302267    function check_source($src,$tb_o) { 
    303268 
    304         global $wp_json; 
    305         $need_oauth = false; 
    306         $is_private = false; 
     269        $oAuth = null; 
    307270        $source_check_result = ''; 
    308271        $log_msg = ''; 
    309272        $is_ok = false; 
    310  
    311         // if we don't have json class, get the library 
    312         if ( !is_a($wp_json, 'Services_JSON') ) { 
    313             if (file_exists(ABSPATH . WPINC . '/class-json.php')) { 
    314                 require_once( ABSPATH . WPINC . '/class-json.php' ); 
    315             } 
    316             else { 
    317                 require(dirname(__FILE__).'/lib/JSON.php'); 
    318             } 
    319             $wp_json = new Services_JSON(); 
    320         } 
    321          
    322         // remove private account markup 
    323         if (stripos($src,'!') === 0) { 
    324             $src = substr($src,1); 
    325         } 
    326          
     273                 
    327274        // remove modifiers 
    328275        if (stripos($src,'|') > 1) { 
     
    330277        } 
    331278         
    332          
    333         $source_is_screen_name = false; 
    334279        // if it's a list, use list API 
    335280        if (stripos($src,'@') === 0 && stripos($src,'/') > 1) { 
    336             $apiUrl = 'http://api.twitter.com/1/' . substr($src,1,strpos($src,'/')) . 'lists' . substr($src,strpos($src,'/')) . '/statuses.json'; 
     281            $api_url = 'https://api.twitter.com/1.1/lists/statuses.json'; 
     282            $api_params = array( 
     283                'owner_screen_name' => substr($src,1,strpos($src,'/')), 
     284                'slug' => substr($src,strpos($src,'/')) 
     285            ); 
    337286        } 
    338287        // if it's a screen name, use timeline API (search would not give us private/public check) 
    339288        elseif (stripos($src,'@') === 0) { 
    340             $source_is_screen_name = true; 
    341             $apiUrl = 'http://twitter.com/statuses/user_timeline.json?screen_name=' . substr($src,1); 
     289            $api_url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; 
     290            $api_params = array('screen_name' => substr($src,1)); 
    342291        } 
    343292        // else assume it's a hashtag or keyword 
    344293        else { 
    345             $apiUrl = 'http://search.twitter.com/search.json?q=' . urlencode($src); 
    346         } 
    347  
    348         if (!class_exists('WP_Http')) { 
    349              include_once( ABSPATH . WPINC. '/class-http.php' );  
    350         }        
    351         $http = new WP_Http; 
    352         $result = $http->request($apiUrl); 
    353          
    354  
     294            $api_url = 'https://api.twitter.com/1.1/search/tweets.json'; 
     295            $api_params = array('q' => urlencode($src)); 
     296        } 
     297     
    355298        // try to get data from Twitter 
    356         if (!is_wp_error($result)) { 
    357             $jsonData = $wp_json->decode($result['body']); 
    358             if (!isset($jsonData)) { 
     299        if(isset($tb_o['oauth_access_token'])) { 
     300            $oAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $tb_o['oauth_access_token']['oauth_token'],$tb_o['oauth_access_token']['oauth_token_secret']); 
     301             
     302            $json_data = $oAuth->OAuthRequest($api_url, 'GET', $api_params); 
     303//          error_log($json_data); 
     304             
     305            // if we didn't get any data 
     306            if (!isset($json_data)) { 
    359307                $source_check_result = ' ' . $src . ' - <span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    360308                $log_msg = "($src) " . __('json error','tweetblender') . ': ' . __('can not get json', 'tweetblender') . "\n" . $apiUrl; 
    361309            } 
    362310            // if Twitter reported error 
    363             elseif (isset($jsonData->{'error'})) { 
    364                 // if it's a private user 
    365                 if (strpos($jsonData->{'error'},"Not authorized") !== false){ 
    366                     $is_private = true; 
    367                     // if we don't have access tokens - error 
    368                     if (!array_key_exists('oauth_access_token',$tb_o)) { 
    369                         $source_check_result = $src . ' - <span class="fail">' . __('PRIVATE', 'tweetblender') . '</span>'; 
    370                         $log_msg = "($src) " . __('Private: needs oAuth',  'tweetblender') . "\n"; 
    371                         $need_oauth = true; 
    372                     } 
    373                     // if we do have tokens - OK 
    374                     else { 
    375                         $is_ok = true; 
    376                         $source_check_result = ' ' . $src . ' - <span class="pass">' . __('PRIVATE', 'tweetblender') . '</span>'; 
    377                         $log_msg = "($src) " . __('Private: we have oAuth', 'tweetblender') . "\n"; 
    378                     } 
    379                 } 
     311            elseif (isset($json_data->{'errors'})) { 
     312             
    380313                // if it's just limit error we are OK 
    381                 elseif (strpos($jsonData->{error},"Rate limit exceeded") === 0) { 
     314                if (strpos($json_data->{'errors'}->{'message'},"Rate limit exceeded") === 0) { 
    382315                    $is_ok = true; 
    383316                    $source_check_result = ' ' . $src . ' - <span class="pass">' . __('OK', 'tweetblender') . '</span>'; 
     
    397330            } 
    398331        } 
    399         // if HTTP request failed 
     332        // else we can't check so assume it's a bad source 
    400333        else { 
    401  
    402             // if it's a protected source 
    403             if ($source_is_screen_name && $result['response']['code'] == 401) { 
    404                 $is_private = true; 
    405                 // if have tokens - try to get it 
    406                 if($tb_o['oauth_user_access_key'] && $tb_o['oauth_user_access_secret']) { 
    407                     if (!$oAuth) { 
    408                         $oAuth = new TwitterOAuth( 
    409                             $tb_o['oauth_consumer_key'], 
    410                             $tb_o['oauth_consumer_secret'], 
    411                             $tb_o['oauth_user_access_key'], 
    412                             $tb_o['oauth_user_access_secret'] 
    413                         ); 
    414                     } 
    415                     $content = $oAuth->OAuthRequest('https://search.twitter.com/search.json', array('q' => '','from' => substr($src,1)), 'GET'); 
    416                 } 
    417                 // else make user authorize 
    418                 else { 
    419                     $need_oauth = true; 
    420                     $source_check_result = ' ' . $src . ' - <span class="fail">' . __('PRIVATE', 'tweetblender') . '</span>'; 
    421                     $log_msg = "($src)" . __('Private: needs oAuth', 'tweetblender') . "\n"; 
    422                 } 
    423             } 
    424             // else it's a bad source 
    425             else { 
    426                 $source_check_result = ' ' . $src . ':<span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
    427                 $log_msg = "($src)" . __('HTTP error:  ',  'tweetblender') . $result->get_error_message() . "\n"; 
    428             } 
    429         } 
    430          
    431         return array($is_ok,$is_private,$need_oauth,$source_check_result,$log_msg); 
    432  
     334            $source_check_result = ' ' . $src . ':<span class="fail">' . __('FAIL', 'tweetblender') . '</span>'; 
     335            $log_msg = "($src)" . __('HTTP error:  ',  'tweetblender') . __('no oAuth tokens', 'tweetblender') . "\n"; 
     336        } 
     337         
     338        return array($is_ok,$source_check_result,$log_msg); 
    433339    } 
    434340} 
  • tweet-blender/trunk/ws.php

    r427446 r746692  
    11<?php 
    22 
    3 // version 3.3.15 
     3// version 4.0.0b4 
    44 
    55// include WP functions 
    6 require_once("../../../wp-blog-header.php"); 
     6require_once("../../../wp-config.php"); 
    77 
    88// if on PHP5, include oAuth library and config 
     
    3737if (in_array($_GET['action'],array('search','list_timeline','user_timeline','favorites'))) { 
    3838 
     39    // check to make sure we have the class 
     40    if (!class_exists('TwitterOAuth')) { 
     41        echo $wp_json->encode(array('error' => __('Twitter oAuth is not available', 'tweetblender'))); 
     42        exit; 
     43    } 
     44 
    3945    $params = array(); 
    4046    parse_str($_SERVER['QUERY_STRING'],$params); 
    41     unset($params['action']); 
    42  
     47    $use_cache = false; 
     48     
     49    $sources = array(); 
     50 
     51    // search 
    4352    if ($_GET['action'] == 'search') { 
    4453        // if its for screen names 
    45         if (isset($_GET['from'])) { 
    46             $sources = split(' OR ',$_GET['from']); 
     54        if (isset($params['from'])) { 
     55            $sources = split(' OR ',$params['from']); 
    4756            // add the @ sign 
    4857            array_walk($sources, create_function('&$src','$src = "@" . $src;')); 
     58             
     59            if (isset($params['tag'])) { 
     60                $api_params = array( 
     61                    'q' => '#' . $params['tag'] . ' from:' . $params['from'] 
     62                ); 
     63            } 
     64            elseif (isset($params['ors'])) { 
     65                $api_params = array( 
     66                    'q' => $params['ors'] . ' from:' . $params['from'] 
     67                ); 
     68            } 
     69             
    4970        } 
    5071        elseif (isset($_GET['ors'])) { 
    51             $sources = split(' ',$_GET['ors']); 
     72            $sources = split(' ',$params['ors']); 
     73 
     74            $api_params = array( 
     75                'q' => $params['q'] 
     76            ); 
    5277        } 
    5378        else { 
    54             $sources = split(' OR ',$_GET['q']); 
    55         } 
    56         $url = 'http://search.twitter.com/search.json'; 
    57          
    58     } 
     79 
     80            $tmp_sources = split(' OR ',$params['q']); 
     81 
     82            // pull out screen names and keywords        
     83            foreach ($tmp_sources as $src) { 
     84                if (substr($src, 0, 5) != 'from:') { 
     85                    $sources[] = $src; 
     86                } 
     87            } 
     88 
     89            $api_params = array( 
     90                'q' => $params['q'] 
     91            ); 
     92        } 
     93         
     94        $api_endpoint = '/search/tweets'; 
     95    } 
     96     
     97    // list 
    5998    elseif($_GET['action'] == 'list_timeline') { 
    60         $sources = array('@'.$_GET['user'].'/'.$_GET['list']); 
    61         $url = 'https://api.twitter.com/1/' . $_GET['user'] . '/lists/' . $_GET['list'] . '/statuses.json'; 
    62         unset($params['user']); 
    63         unset($params['list']); 
    64     } 
     99        $sources = array('@'.$params['user'].'/'.$params['list']); 
     100         
     101        $api_endpoint = '/lists/statuses'; 
     102        $api_params = array( 
     103            'owner_screen_name' => $params['user'], 
     104            'slug' => $params['list'] 
     105        ); 
     106    } 
     107     
     108    // favorites 
    65109    elseif($_GET['action'] == 'favorites') { 
    66         $sources = array('@'.$_GET['screen_name']); 
    67         $url = 'https://api.twitter.com/1/favorites/' . $_GET['screen_name'] . '.json'; 
    68         unset($params['user']); 
    69     } 
     110        $sources = array('@'.$params['screen_name']); 
     111         
     112        $api_endpoint = '/favorites/list'; 
     113        $api_params = array( 
     114            'screen_name' => $params['screen_name'] 
     115        ); 
     116    } 
     117     
     118    // user timeline 
    70119    elseif($_GET['action'] == 'user_timeline') { 
    71         $sources = array('@'.$_GET['user']); 
    72         $url = 'https://api.twitter.com/1/statuses/user_timeline/' . $_GET['screen_name'] . '.json'; 
    73         unset($params['screen_name']); 
    74     } 
    75  
    76     // check if it's a private source or if we are rerouting with oAuth 
    77     if (isset($_GET['is_private']) || ($tb_o['advanced_reroute_on'] && $tb_o['advanced_reroute_type'] == 'oauth')) { 
    78          
    79         // check to make sure we have the class 
    80         if (!class_exists('TwitterOAuth')) { 
    81             echo $wp_json->encode(array('error' => __('Twitter oAuth is not available', 'tweetb'))); 
     120        $sources[] = '@'.$params['screen_name']; 
     121         
     122        $api_endpoint = '/statuses/user_timeline'; 
     123        $api_params = array( 
     124            'screen_name' => $params['screen_name'], 
     125            'contributor_details' => 'true' 
     126        ); 
     127         
     128        // check if we want to exclude replies 
     129        if(isset($tb_o['filter_hide_replies']) && $tb_o['filter_hide_replies']) { 
     130            $api_params['exclude_replies'] = 'true'; 
     131        } 
     132         
     133        // check if we want to exclude retweets 
     134        if(isset($tb_o['filter_hide_retweets']) && $tb_o['filter_hide_retweets']) { 
     135            $api_params['include_rts'] = 'false'; 
     136        } 
     137    } 
     138 
     139    // make sure we have oAuth info 
     140    if (!isset($tb_o['oauth_access_token'])){ 
     141        echo $wp_json->encode(array('error' => __("Do not have oAuth login info", 'tweetblender'))); 
     142        exit; 
     143    } 
     144 
     145    // make sure we have limit info 
     146    if (!isset($tb_o['rate_limit_data'][$api_endpoint])) { 
     147        $have_api_limit_data = tb_get_server_rate_limit_data($tb_o); 
     148    } 
     149 
     150    // figure out optimal delay = 15min in seconds divided by max requests 
     151    $optimal_seconds_between_requests = 15 * 60 / $tb_o['rate_limit_data'][$api_endpoint]['limit']; 
     152     
     153    // time since last request 
     154    if (isset($tb_o['rate_limit_data'][$api_endpoint]['last_used'])) { 
     155        $seconds_since_last_request = time() - $tb_o['rate_limit_data'][$api_endpoint]['last_used']; 
     156    } 
     157    else { 
     158        $seconds_since_last_request = $optimal_seconds_between_requests; 
     159    } 
     160 
     161//error_log('endpoint=' . $api_endpoint . ' optimal delay=' . $optimal_seconds_between_requests . ' sec since last request=' . $seconds_since_last_request . ' limit remaining=' . $tb_o['rate_limit_data'][$api_endpoint]['remaining']); 
     162         
     163    // check the limit  
     164    if ($tb_o['rate_limit_data'][$api_endpoint]['remaining'] > 0 && $seconds_since_last_request >= $optimal_seconds_between_requests) { 
     165 
     166//error_log('making live request'); 
     167         
     168        // try to get it directly 
     169        $oAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $tb_o['oauth_access_token']['oauth_token'],$tb_o['oauth_access_token']['oauth_token_secret']); 
     170        $json_data = $oAuth->OAuthRequest($tb_api_base_url . $api_endpoint . '.json', 'GET', $api_params); 
     171         
     172//error_log('***** url = ' . $tb_api_base_url . $api_endpoint . '.json'); 
     173 
     174//error_log('***** sources = ' . print_r($sources,true)); 
     175 
     176//error_log('**** params = ' . print_r($api_params,true)); 
     177 
     178        if ($oAuth->http_code == 200) { 
     179            echo $json_data; 
     180 
     181//error_log('**** response=' . $json_data); 
     182             
     183            // update rate limit info 
     184            $headers = $oAuth->http_header; 
     185            $tb_o['rate_limit_data'][$api_endpoint] = array( 
     186                'limit' => $headers['x_rate_limit_limit'], 
     187                'remaining' => $headers['x_rate_limit_remaining'], 
     188                'reset' => $headers['x_rate_limit_reset'], 
     189                'last_used' => time() 
     190            ); 
     191 
     192            // save rate limit data to options 
     193            update_option('tweet-blender',$tb_o); 
     194             
     195//error_log('**** json data: ' . $json_data); 
     196             
     197            // cache response 
     198            tb_save_cache($wp_json->decode($json_data),$sources); 
     199             
    82200            exit; 
    83201        } 
    84  
    85         // make sure we have oAuth info 
    86         if (!isset($tb_o['oauth_access_token'])){ 
    87             echo $wp_json->encode(array('error' => __("Do not have oAuth login info", 'tweetb'))); 
     202        // else, try to get it from cache and if that fails report an error 
     203        else { 
     204            if ($json_data = tb_get_cached_tweets_json($sources)) { 
     205                echo $json_data; 
     206            } 
     207            else { 
     208                echo $json->encode(array('error' => __('No cache. Connection status code', 'tweetblender') . ' ' . $oAuth->http_code)); 
     209            } 
    88210            exit; 
    89211        } 
     212    } 
     213    // if we've reached the limit, just get data from cache 
     214    else { 
     215     
     216//error_log('getting it from cache'); 
     217 
     218        if ($json_data = tb_get_cached_tweets_json($sources)) { 
     219            echo $json_data; 
     220        } 
    90221        else { 
    91             // try to get it directly 
    92             $oAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $tb_o['oauth_access_token']['oauth_token'],$tb_o['oauth_access_token']['oauth_token_secret']); 
    93             $json_data = $oAuth->OAuthRequest($url, 'GET', $params); 
    94             if ($oAuth->http_code == 200) { 
    95                 echo $json_data; 
    96                 exit; 
    97             } 
    98             // else, try to get it from cache and if that fails report an error 
    99             else { 
    100                 if ($json_data = tb_get_cached_tweets_json($sources)) { 
    101                     echo $json_data; 
    102                 } 
    103                 else { 
    104                     echo $json->encode(array('error' => __('No cache. Connection status code', 'tweetb') . ' ' . $oAuth->http_code)); 
    105                 } 
    106                 exit; 
    107             } 
    108         } 
    109     } 
    110     // if we are not private/rerouting, use direct access 
    111     else { 
    112         // for WP3 we need to explicitly include the WP HTTP class 
    113         if (!class_exists('WP_Http')) { 
    114              include_once( ABSPATH . WPINC. '/class-http.php' );  
    115         } 
    116          
    117         $http = new WP_Http; 
    118         $result = $http->request($url . '?' . http_build_query($params)); 
    119      
    120         // if we could get it, return data 
    121         if (!is_wp_error($result)) { 
    122             if ($result['response']['code'] == 200) { 
    123                 $json_data = $result['body']; 
    124                 echo $json_data;         
    125                 exit; 
    126             } 
    127             // else try to get it from cache 
    128             else { 
    129                  
    130                 // if found in cache, return it 
    131                 if ($json_data = tb_get_cached_tweets_json($sources)) { 
    132                     echo $json_data; 
    133                 } 
    134                 // else, report error 
    135                 else { 
    136                     echo $json->encode(array('error' => __('No cache. Connection status code', 'tweetb') . ' ' . $result['response']['code'] . " " . $result->response['message'])); 
    137                 } 
    138                 exit; 
    139             } 
    140         } 
    141         // if it was an error 
    142         else { 
    143             echo $wp_json->encode(array('error' => $result->get_error_message()));   
    144         } 
    145     } 
    146 } 
    147  
    148 // check rate limit 
    149 elseif ($_GET['action'] == 'rate_limit_status') { 
    150  
    151     if (($json_data = tb_get_server_rate_limit_json($tb_o)) != false) { 
    152         echo $json_data; 
     222            echo $json->encode(array('error' => __('Reached Twitter API limit and there is no cache.', 'tweetblender'))); 
     223        } 
    153224        exit; 
    154225    } 
    155     else { 
    156         echo $wp_json->encode(array('error' => __("Can't retrieve limit info from Twitter", 'tweetb'))); 
    157         exit; 
    158     } 
    159 } 
    160  
    161 // cache data 
    162 elseif($_GET['action'] == 'cache_data') { 
    163  
    164     // make sure request came from valid source 
    165     if (array_key_exists('HTTP_REFERER', $_SERVER)) { 
    166         $referer = parse_url(esc_attr($_SERVER['HTTP_REFERER'])); 
    167         if ($referer['host'] != esc_attr($_SERVER['SERVER_NAME']) && $referer['host'] != 'www.' . esc_attr($_SERVER['SERVER_NAME'])) { 
    168             echo $wp_json->encode(array('error' => __('Request from unauthorized page', 'tweetblender') . ".\n" . esc_attr($_SERVER['SERVER_NAME']) . "\n" . $referer['host'])); 
    169             exit; 
    170         } 
    171     } 
    172      
    173     // TODO: make sure the source we are caching for is in the config of at least one widget 
    174      
    175     // make sure data is really JSON 
    176     $data = stripslashes($_POST['tweets']); 
    177     if($tweets = $wp_json->decode($data)) { 
    178  
    179         if(tb_save_cache($tweets)) { 
    180             // return OK 
    181             echo $wp_json->encode(array('OK' => 1)); 
    182         } 
    183         else { 
    184             echo $wp_json->encode(array('error' => __('Cannot store tweets to DB', 'tweetblender'))); 
    185         } 
    186         exit; 
    187     } 
    188     else { 
    189         echo $wp_json->encode(array('error' => __('Invalid data format', 'tweetblender'))); 
    190         exit; 
    191     }        
     226     
     227} 
     228else { 
     229    echo $wp_json->encode(array('error' => __('Do not know what you want.', 'tweetblender')));   
    192230} 
    193231 
Note: See TracChangeset for help on using the changeset viewer.