Switch back to the Twitter API for the Tweet widget
[WebKit.git] / Websites / webkit.org / wp-content / themes / webkit / widgets / twitter.php
1 <?php
2 /**
3  * WebKitTwitterTileWidget class
4  * A WordPress widget to show a Twitter tile on the home page
5  **/
6
7 defined('WPINC') || header('HTTP/1.1 403') & exit; // Prevent direct access
8
9 if ( ! class_exists('WP_Widget') ) return;
10
11 class WebKitTwitterTileWidget extends WebKitPostTileWidget {
12
13     const CACHEKEY = 'webkit_twitter_feed';
14     const ENDPOINT = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
15
16     function __construct() {
17         parent::WP_Widget(false,
18             __('Twitter Tile'),
19             array('description' => __('Twitter tile for the home page'))
20         );
21     }
22
23     function widget( array $args, array $options ) {
24
25         if ( ! empty($args) )
26             extract($args, EXTR_SKIP);
27
28         $Tweet = $this->tweet();
29
30         // Show "Follow @webkit" instead of tweet for empty text
31         if ( empty($Tweet) || empty($Tweet->text) )
32             return $this->follow_markup($options);
33
34         $classes = array('tile', 'third-tile', 'twitter-tile');
35         $text = (string)$options['text'];
36         $link = "https://twitter.com/webkit/status/$Tweet->id";
37
38         if ( ! empty($Tweet->text) )
39             $text = $Tweet->text;
40
41         // Expand URLs
42         foreach ( $Tweet->entities->urls as $entry ) {
43             $expanded = '<a href="' . esc_url($entry->expanded_url) . '">'
44                                  . $entry->display_url . '</a>';
45
46             // Don't show webkit.org links, just change the tile to use the link in the tweet
47             if ( preg_match('!webkit.org/.+?!', $entry->expanded_url) == 1 ) {
48                 $expanded = '';
49                 $link = $entry->expanded_url;
50             }
51
52             $text = str_replace($entry->url, $expanded, $text);
53         }
54
55         $text = preg_replace('/RT @[^:]+:\s+/', '', $text, 1);
56         if ( ! ( empty($Tweet->entities) || empty($Tweet->entities->media) ) ) {
57             $Image = $Tweet->entities->media[0];
58
59             if ( empty($Image) ) $classes[] = 'text-only';
60
61             // Strip media links
62             foreach ( $Tweet->entities->media as $entry ) {
63                 $text = str_replace($entry->url, '', $text);
64             }
65         } else {
66             $classes[] = 'text-only';
67         }
68
69         ?>
70         <div class="<?php echo esc_attr(join(' ', $classes)); ?>">
71             <a href="<?php echo esc_url($link); ?>" class="tile-link">Clickable link to tweet</a>
72             <div class="tile-content">
73             <?php if ( ! empty($Image) ): ?>
74             <img src="<?php echo esc_url($Image->media_url_https); ?>">
75             <?php else: ?>
76             <?php endif;?>
77                 <p><?php echo $text; ?></p>
78
79             </div>
80             <ul class="twitter-controls">
81                 <li><a href="https://twitter.com/webkit" target="twitter-modal"><span class="twitter-icon">Twitter</span>@webkit</a></li>
82                 <li><a href="https://twitter.com/intent/tweet?in-reply-to=<?php echo esc_attr($Tweet->id); ?>" class="twitter-icon reply-icon" target="twitter-modal">Reply</a></li>
83                 <li><a href="https://twitter.com/intent/retweet?tweet_id=<?php echo esc_attr($Tweet->id); ?>" class="twitter-icon retweet-icon" target="twitter-modal">Retweet</a></li>
84                 <li><a href="https://twitter.com/intent/favorite?tweet_id=<?php echo esc_attr($Tweet->id); ?>" class="twitter-icon favorite-icon" target="twitter-modal">Favorite</a></li>
85             </ul>
86         </div>
87         <?php
88     }
89
90     function follow_markup ($options) {
91
92         $url = 'https://twitter.com/intent/follow?screen_name=webkit';
93         $classes = array('tile', 'third-tile', 'twitter-tile');
94
95         ?>
96         <div class="<?php echo esc_attr(join(' ', $classes)); ?>">
97             <a class="tile-link" href="<?php echo esc_url($url); ?>">Clickable link</a>
98             <div class="icon twitter-icon"></div>
99             <h2><?php echo nl2br(esc_html($options['text'])); ?></h2>
100         </div>
101         <?php
102     }
103
104     function form( array $options ) {
105         ?>
106         <p><label for="<?php echo $this->get_field_id('text'); ?>"><?php _e('Text'); ?></label>
107         <textarea type="text" name="<?php echo $this->get_field_name('text'); ?>" id="<?php echo $this->get_field_id('text'); ?>" class="widefat"><?php echo $options['text']; ?></textarea></p>
108         <?php
109     }
110
111     function tweet () {
112
113         if ( false !== ( $cached = get_transient(self::CACHEKEY) ) )
114             return json_decode($cached);
115
116         // Get pushed Tweet as a fallback
117         $pushedTweet = false;
118         if ( class_exists('TweetListener') ) {
119             $TweetListener = TweetListener::object();
120             $pushedTweet = $TweetListener->tweet();
121         }
122
123         // Connect to Twitter API
124         $parameters = array();
125         $options = array(
126             'method' => 'GET',
127         );
128
129         list($oauth_consumer_key, $oauth_consumer_key_secret) = explode(':', TWITTER_CONSUMER_KEY);
130         list($oauth_token, $oauth_token_secret) = explode(':', TWITTER_OAUTH_TOKEN);
131         $oauth_timestamp = time();
132         $oauth_nonce = sha1(rand() . $oauth_timestamp);
133
134         $fields = array(
135             'oauth_consumer_key' => $oauth_consumer_key,
136             'oauth_nonce' => $oauth_nonce,
137             'oauth_signature_method' => 'HMAC-SHA1',
138             'oauth_timestamp' => $oauth_timestamp,
139             'oauth_token' => $oauth_token,
140             'oauth_version' => '1.0',
141         );
142         $fields = array_merge($parameters, $fields);
143
144         $requestParts = array('GET', self::ENDPOINT, http_build_query($fields, '', '&'));
145         $request = join('&', array_map('rawurlencode', $requestParts));
146
147         $authkeys = array($oauth_consumer_key_secret, $oauth_token_secret);
148         $auth = join('&', array_map('rawurlencode', $authkeys));
149
150         $signature = base64_encode( hash_hmac('sha1', $request, $auth, true) );
151
152         $oauth = array(
153             'oauth_consumer_key' => $oauth_consumer_key,
154             'oauth_nonce' => $fields['oauth_nonce'],
155             'oauth_signature' => $signature,
156             'oauth_signature_method' => 'HMAC-SHA1',
157             'oauth_timestamp' => $fields['oauth_timestamp'],
158             'oauth_token' => $oauth_token,
159             'oauth_version' => '1.0',
160         );
161
162         // Wrap values in double-quotes.
163         $oauth = array_map(create_function('$h','return "\"$h\"";'), $oauth);
164         $oauth = http_build_query($oauth, '', ', ');
165         $oauth = str_replace('%22', '"', $oauth);
166
167         $headers = array(
168             'Authorization' => "OAuth $oauth"
169         );
170
171         $options['headers'] = $headers;
172
173         $response = wp_remote_get(self::ENDPOINT, $options);
174
175         if ( is_a($response, 'WP_Error') )
176             return $pushedTweet;
177
178         if ( 200 == $response['response']['code'] && ! empty($response['body']) ) {
179             $body = json_decode($response['body']);
180             $data = $body[0];
181             set_transient(self::CACHEKEY, json_encode($data), DAY_IN_SECONDS/2);
182             return $data;
183         }
184
185         return $pushedTweet;
186     }
187
188     function isWebKitLink ($Tweet) {
189         return ( ! empty($Tweet->entities->urls[0]->expanded_url)
190                 && preg_match('!webkit.org/.+?!', $Tweet->entities->urls[0]->expanded_url) == 1 );
191     }
192
193 } // END class WebKitTwitterTileWidget
194
195 register_widget('WebKitTwitterTileWidget');