9c06f9ebf9a5c30a8be6c5237fe5b25656ca8dea
[WebKit-https.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
15     function __construct() {
16         parent::WP_Widget(false, 
17                         __('Twitter Tile'), 
18                         array('description' => __('Twitter tile for the home page'))
19                 );
20     }
21
22     function widget( array $args, array $options ) {
23         
24         if ( ! empty($args) )
25             extract($args, EXTR_SKIP);
26         
27         $Tweet = $this->tweet();
28
29         // Show "Follow @webkit" instead of tweet for empty text
30         if ( empty($Tweet) || empty($Tweet->text) )
31             return $this->follow_markup($options);
32
33         // Show "Follow @webkit" instead of tweet for blog URLs
34         if ( ! empty($Tweet->entities)
35                 && ! empty($Tweet->entities->urls)
36                 && count($Tweet->entities->urls) == 1
37                 && preg_match('!webkit.org/blog/\d+/!', $Tweet->entities->urls[0]->expanded_url) == 1)
38             return $this->follow_markup($options);
39
40         $classes = array('tile', 'third-tile', 'twitter-tile');
41
42         $text = (string)$options['text'];
43
44         if ( ! empty($Tweet->text) )
45             $text = $Tweet->text;
46
47         if ( ! empty($options['url']) ) 
48             $url = (string)$options['url'];
49
50         // Expand URLs
51         foreach ( $Tweet->entities->urls as $entry ) {
52             $expanded = '<a href="' . esc_url($entry->expanded_url) . '">'
53                                  . $entry->display_url . '</a>';
54             $text = str_replace($entry->url, $expanded, $text);
55         }
56         
57         $text = preg_replace('/RT @[^:]+:\s+/', '', $text, 1);
58         
59         if ( empty($Tweet->entities) || empty($Tweet->entities->media) ) { 
60
61             $Image = $Tweet->entities->media[0];
62             if ( empty($Image) ) $classes[] = 'text-only';
63
64             // Strip media links
65             foreach ( $Tweet->entities->media as $entry ) {
66                 $text = str_replace($entry->url, '', $text);
67             }
68         }
69         
70         ?>
71         <div class="<?php echo esc_attr(join(' ', $classes)); ?>">
72             <a href="http://twitter.com/webkit/status/<?php echo esc_attr($Tweet->id); ?>" class="tile-link">Clickable link to tweet</a>
73             <div class="tile-content">
74             <?php if ( ! empty($Image) ): ?>
75             <img src="<?php echo esc_url($Image->media_url_https); ?>">
76             <?php else: ?>
77             <?php endif;?>
78                 <p><?php echo $text; ?></p>
79             
80             </div>
81             <ul class="twitter-controls">
82                 <li><a href="https://twitter.com/intent/follow?screen_name=webkit" target="twitter-modal"><span class="twitter-icon">Twitter</span> @webkit</a></li>
83                 <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>
84                 <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>
85                 <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>
86             </ul>
87         </div>
88         <?php
89     }
90     
91     function follow_markup ($options) {
92         
93         $url = 'https://twitter.com/intent/follow?screen_name=webkit';
94         $classes = array('tile', 'third-tile', 'twitter-tile');
95         
96         ?>
97         <div class="<?php echo esc_attr(join(' ', $classes)); ?>">
98             <a class="tile-link" href="<?php echo esc_url($url); ?>">Clickable link</a>
99             <div class="icon twitter-icon"></div>
100             <h2><?php echo nl2br(esc_html($options['text'])); ?></h2>
101         </div>
102         <?php
103     }
104
105     function form( array $options ) {
106                 ?>
107                 <p><label for="<?php echo $this->get_field_id('text'); ?>"><?php _e('Text'); ?></label>
108                 <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>
109                 <?php
110     }
111     
112         function tweet () {
113
114         if ( false !== ( $cached = get_transient(self::CACHEKEY) ) )
115             return json_decode($cached);
116         
117                 $endpoint = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
118                 $parameters = array();
119                 $options = array(
120                         'method' => 'GET',
121                 );
122
123                 $oauth_consumer_key = 'ypSvRp37vmyt3ldMPhs0e62c9';
124                 $oauth_consumer_key_secret = 'mLuYD3AjUehUZKOgQIICA5Na69te45aSJTkdIDTGSg4cfHd6Lz';
125                 $oauth_token = '14315023-7pHbcI5bk2QZhNiHR9uFudaksBzMPubEuOEmYj7YQ';
126                 $oauth_token_secret = '0K9T9znxG4S9PUGunYZ5LwyKL9AR6v3eAXp6WKY2oi7Bg';
127                 $oauth_timestamp = time();
128                 $oauth_nonce = sha1(rand() . $oauth_timestamp);
129
130                 $fields = array(
131                         'oauth_consumer_key' => $oauth_consumer_key,
132                         'oauth_nonce' => sha1(rand() . time()),
133                         'oauth_signature_method' => 'HMAC-SHA1',
134                         'oauth_timestamp' => time(),
135                         'oauth_token' => $oauth_token,
136                         'oauth_version' => '1.0',
137                 );
138                 $fields = array_merge($parameters, $fields);
139
140                 $base = array(
141                         'GET', $endpoint, http_build_query($fields, '', '&')
142                 );
143                 $base = join('&', array_map('rawurlencode', $base));
144
145
146                 $key = array(
147                         $oauth_consumer_key_secret, $oauth_token_secret
148                 );
149                 $key = join('&', array_map('rawurlencode', $key));
150
151                 $signature = base64_encode( hash_hmac('sha1', $base, $key, true) );
152
153                 $oauth = array(
154                         'oauth_consumer_key' => $oauth_consumer_key,
155                         'oauth_nonce' => $fields['oauth_nonce'],
156                         'oauth_signature' => $signature,
157                         'oauth_signature_method' => 'HMAC-SHA1',
158                         'oauth_timestamp' => $fields['oauth_timestamp'],
159                         'oauth_token' => $oauth_token,
160                         'oauth_version' => '1.0',
161                 );
162                 $oauth = array_map(create_function('$h','return "\"$h\"";'), $oauth);
163
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($endpoint, $options);
174
175         if ( is_a($response, 'WP_Error') ) 
176             return false;
177
178                 if ( 200 == $response['response']['code'] && ! empty($response['body']) ) {
179             $data = json_decode($response['body'])[0];
180             set_transient(self::CACHEKEY, json_encode($data), DAY_IN_SECONDS/2);
181             return $data;
182                 }
183
184                 return false;
185         }
186
187 } // END class WebKitTwitterTileWidget
188
189 register_widget('WebKitTwitterTileWidget');