]> git.mxchange.org Git - friendica-addons.git/blob - tumblr/tumblr.php
[various] Remove App dependency from hook functions
[friendica-addons.git] / tumblr / tumblr.php
1 <?php
2 /**
3  * Name: Tumblr Post Connector
4  * Description: Post to Tumblr
5  * Version: 2.0
6  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
7  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
8  */
9
10 require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'tumblroauth.php';
11
12 use Friendica\App;
13 use Friendica\Content\Text\BBCode;
14 use Friendica\Core\Hook;
15 use Friendica\Core\Logger;
16 use Friendica\Core\Renderer;
17 use Friendica\Database\DBA;
18 use Friendica\DI;
19 use Friendica\Model\Post;
20 use Friendica\Model\Tag;
21
22 function tumblr_install()
23 {
24         Hook::register('hook_fork',               'addon/tumblr/tumblr.php', 'tumblr_hook_fork');
25         Hook::register('post_local',              'addon/tumblr/tumblr.php', 'tumblr_post_local');
26         Hook::register('notifier_normal',         'addon/tumblr/tumblr.php', 'tumblr_send');
27         Hook::register('jot_networks',            'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
28         Hook::register('connector_settings',      'addon/tumblr/tumblr.php', 'tumblr_settings');
29         Hook::register('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
30 }
31
32 /**
33  * This is a statement rather than an actual function definition. The simple
34  * existence of this method is checked to figure out if the addon offers a
35  * module.
36  */
37 function tumblr_module() {}
38
39 function tumblr_content()
40 {
41         if (!DI::userSession()->getLocalUserId()) {
42                 DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
43                 return '';
44         }
45
46         if (isset(DI::args()->getArgv()[1])) {
47                 switch (DI::args()->getArgv()[1]) {
48                         case "connect":
49                                 $o = tumblr_connect();
50                                 break;
51
52                         case "callback":
53                                 $o = tumblr_callback();
54                                 break;
55
56                         default:
57                                 $o = print_r(DI::args()->getArgv(), true);
58                                 break;
59                 }
60         } else {
61                 $o = tumblr_connect();
62         }
63
64         return $o;
65 }
66
67 function tumblr_addon_admin(string &$o)
68 {
69         $t = Renderer::getMarkupTemplate( "admin.tpl", "addon/tumblr/" );
70
71         $o = Renderer::replaceMacros($t, [
72                 '$submit' => DI::l10n()->t('Save Settings'),
73                 // name, label, value, help, [extra values]
74                 '$consumer_key' => ['consumer_key', DI::l10n()->t('Consumer Key'),  DI::config()->get('tumblr', 'consumer_key' ), ''],
75                 '$consumer_secret' => ['consumer_secret', DI::l10n()->t('Consumer Secret'),  DI::config()->get('tumblr', 'consumer_secret' ), ''],
76         ]);
77 }
78
79 function tumblr_addon_admin_post()
80 {
81         DI::config()->set('tumblr', 'consumer_key', trim($_POST['consumer_key'] ?? ''));
82         DI::config()->set('tumblr', 'consumer_secret', trim($_POST['consumer_secret'] ?? ''));
83 }
84
85 function tumblr_connect()
86 {
87         // Start a session.  This is necessary to hold on to  a few keys the callback script will also need
88         session_start();
89
90         // Include the TumblrOAuth library
91         //require_once('addon/tumblr/tumblroauth/tumblroauth.php');
92
93         // Define the needed keys
94         $consumer_key = DI::config()->get('tumblr', 'consumer_key');
95         $consumer_secret = DI::config()->get('tumblr', 'consumer_secret');
96
97         // The callback URL is the script that gets called after the user authenticates with tumblr
98         // In this example, it would be the included callback.php
99         $callback_url = DI::baseUrl()->get() . '/tumblr/callback';
100
101         // Let's begin.  First we need a Request Token.  The request token is required to send the user
102         // to Tumblr's login page.
103
104         // Create a new instance of the TumblrOAuth library.  For this step, all we need to give the library is our
105         // Consumer Key and Consumer Secret
106         $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret);
107
108         // Ask Tumblr for a Request Token.  Specify the Callback URL here too (although this should be optional)
109         $request_token = $tum_oauth->getRequestToken($callback_url);
110
111         // Store the request token and Request Token Secret as out callback.php script will need this
112         $_SESSION['request_token'] = $token = $request_token['oauth_token'];
113         $_SESSION['request_token_secret'] = $request_token['oauth_token_secret'];
114
115         // Check the HTTP Code.  It should be a 200 (OK), if it's anything else then something didn't work.
116         switch ($tum_oauth->http_code) {
117                 case 200:
118                         // Ask Tumblr to give us a special address to their login page
119                         $url = $tum_oauth->getAuthorizeURL($token);
120
121                         // Redirect the user to the login URL given to us by Tumblr
122                         header('Location: ' . $url);
123
124                         /*
125                          * That's it for our side.  The user is sent to a Tumblr Login page and
126                          * asked to authroize our app.  After that, Tumblr sends the user back to
127                          * our Callback URL (callback.php) along with some information we need to get
128                          * an access token.
129                          */
130                         break;
131
132                 default:
133                         // Give an error message
134                         $o = 'Could not connect to Tumblr. Refresh the page or try again later.';
135         }
136
137         return $o;
138 }
139
140 function tumblr_callback()
141 {
142         // Start a session, load the library
143         session_start();
144         //require_once('addon/tumblr/tumblroauth/tumblroauth.php');
145
146         // Define the needed keys
147         $consumer_key = DI::config()->get('tumblr', 'consumer_key');
148         $consumer_secret = DI::config()->get('tumblr', 'consumer_secret');
149
150         // Once the user approves your app at Tumblr, they are sent back to this script.
151         // This script is passed two parameters in the URL, oauth_token (our Request Token)
152         // and oauth_verifier (Key that we need to get Access Token).
153         // We'll also need out Request Token Secret, which we stored in a session.
154
155         // Create instance of TumblrOAuth.
156         // It'll need our Consumer Key and Secret as well as our Request Token and Secret
157         $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $_SESSION['request_token'], $_SESSION['request_token_secret']);
158
159         // Ok, let's get an Access Token. We'll need to pass along our oauth_verifier which was given to us in the URL.
160         $access_token = $tum_oauth->getAccessToken($_REQUEST['oauth_verifier']);
161
162         // We're done with the Request Token and Secret so let's remove those.
163         unset($_SESSION['request_token']);
164         unset($_SESSION['request_token_secret']);
165
166         // Make sure nothing went wrong.
167         if (200 == $tum_oauth->http_code) {
168                 // good to go
169         } else {
170                 return 'Unable to authenticate';
171         }
172
173         // What's next?  Now that we have an Access Token and Secret, we can make an API call.
174         DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'oauth_token', $access_token['oauth_token']);
175         DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'oauth_token_secret', $access_token['oauth_token_secret']);
176
177         $o = DI::l10n()->t("You are now authenticated to tumblr.");
178         $o .= '<br /><a href="' . DI::baseUrl()->get() . '/settings/connectors">' . DI::l10n()->t("return to the connector page") . '</a>';
179
180         return $o;
181 }
182
183 function tumblr_jot_nets(array &$jotnets_fields)
184 {
185         if (!DI::userSession()->getLocalUserId()) {
186                 return;
187         }
188
189         if (DI::pConfig()->get(DI::userSession()->getLocalUserId(),'tumblr','post')) {
190                 $jotnets_fields[] = [
191                         'type' => 'checkbox',
192                         'field' => [
193                                 'tumblr_enable',
194                                 DI::l10n()->t('Post to Tumblr'),
195                                 DI::pConfig()->get(DI::userSession()->getLocalUserId(),'tumblr','post_by_default')
196                         ]
197                 ];
198         }
199 }
200
201 function tumblr_settings(array &$data)
202 {
203         if (!DI::userSession()->getLocalUserId()) {
204                 return;
205         }
206
207         $enabled     = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post', false);
208         $def_enabled = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post_by_default', false);
209
210         $oauth_token        = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'oauth_token');
211         $oauth_token_secret = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'oauth_token_secret');
212
213         if ($oauth_token && $oauth_token_secret) {
214                 $page            = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'page');
215                 $consumer_key    = DI::config()->get('tumblr', 'consumer_key');
216                 $consumer_secret = DI::config()->get('tumblr', 'consumer_secret');
217
218                 $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
219                 $userinfo  = $tum_oauth->get('user/info');
220
221                 $blogs = array_map(function ($blog) {
222                         return substr(str_replace(["http://", "https://"], ["", ""], $blog->url), 0, -1);
223                 }, $userinfo->response->user->blogs);
224
225                 $page_select = ['tumblr-page', DI::l10n()->t('Post to page:'), $page, '', $blogs];
226         }
227
228         $t    = Renderer::getMarkupTemplate('connector_settings.tpl', 'addon/tumblr/');
229         $html = Renderer::replaceMacros($t, [
230                 '$l10n' => [
231                         'connect'   => DI::l10n()->t('(Re-)Authenticate your tumblr page'),
232                         'noconnect' => DI::l10n()->t('You are not authenticated to tumblr'),
233                 ],
234
235                 '$authenticate_url' => DI::baseUrl()->get() . '/tumblr/connect',
236
237                 '$enable'      => ['tumblr', DI::l10n()->t('Enable Tumblr Post Addon'), $enabled],
238                 '$bydefault'   => ['tumblr_bydefault', DI::l10n()->t('Post to Tumblr by default'), $def_enabled],
239                 '$page_select' => $page_select ?? '',
240         ]);
241
242         $data = [
243                 'connector' => 'tumblr',
244                 'title'     => DI::l10n()->t('Tumblr Export'),
245                 'image'     => 'images/tumblr.png',
246                 'enabled'   => $enabled,
247                 'html'      => $html,
248         ];
249 }
250
251 function tumblr_settings_post(array &$b)
252 {
253         if (!empty($_POST['tumblr-submit'])) {
254                 DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'post',            intval($_POST['tumblr']));
255                 DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'page',            $_POST['tumblr_page']);
256                 DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'post_by_default', intval($_POST['tumblr_bydefault']));
257         }
258 }
259
260 function tumblr_hook_fork(array &$b)
261 {
262         if ($b['name'] != 'notifier_normal') {
263                 return;
264         }
265
266         $post = $b['data'];
267
268         if ($post['deleted'] || $post['private'] || ($post['created'] !== $post['edited']) ||
269                 !strstr($post['postopts'] ?? '', 'tumblr') || ($post['parent'] != $post['id'])) {
270                 $b['execute'] = false;
271                 return;
272         }
273 }
274
275 function tumblr_post_local(array &$b)
276 {
277         // This can probably be changed to allow editing by pointing to a different API endpoint
278
279         if ($b['edit']) {
280                 return;
281         }
282
283         if (!DI::userSession()->getLocalUserId() || (DI::userSession()->getLocalUserId() != $b['uid'])) {
284                 return;
285         }
286
287         if ($b['private'] || $b['parent']) {
288                 return;
289         }
290
291         $tmbl_post   = intval(DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post'));
292
293         $tmbl_enable = (($tmbl_post && !empty($_REQUEST['tumblr_enable'])) ? intval($_REQUEST['tumblr_enable']) : 0);
294
295         if ($b['api_source'] && intval(DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post_by_default'))) {
296                 $tmbl_enable = 1;
297         }
298
299         if (!$tmbl_enable) {
300                 return;
301         }
302
303         if (strlen($b['postopts'])) {
304                 $b['postopts'] .= ',';
305         }
306
307         $b['postopts'] .= 'tumblr';
308 }
309
310
311
312
313 function tumblr_send(array &$b) {
314
315         if ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) {
316                 return;
317         }
318
319         if (! strstr($b['postopts'],'tumblr')) {
320                 return;
321         }
322
323         if ($b['parent'] != $b['id']) {
324                 return;
325         }
326
327         // Dont't post if the post doesn't belong to us.
328         // This is a check for forum postings
329         $self = DBA::selectFirst('contact', ['id'], ['uid' => $b['uid'], 'self' => true]);
330         if ($b['contact-id'] != $self['id']) {
331                 return;
332         }
333
334         $b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], DI::contentItem()->addSharedPost($b));
335
336         $oauth_token = DI::pConfig()->get($b['uid'], "tumblr", "oauth_token");
337         $oauth_token_secret = DI::pConfig()->get($b['uid'], "tumblr", "oauth_token_secret");
338         $page = DI::pConfig()->get($b['uid'], "tumblr", "page");
339         $tmbl_blog = 'blog/' . $page . '/post';
340
341         if ($oauth_token && $oauth_token_secret && $tmbl_blog) {
342                 $tags = Tag::getByURIId($b['uri-id']);
343
344                 $tag_arr = [];
345
346                 foreach($tags as $tag) {
347                         $tag_arr[] = $tag['name'];
348                 }
349
350                 if (count($tag_arr)) {
351                         $tags = implode(',', $tag_arr);
352                 }
353
354                 $title = trim($b['title']);
355
356                 $siteinfo = BBCode::getAttachedData($b["body"]);
357
358                 $params = [
359                         'state'  => 'published',
360                         'tags'   => $tags,
361                         'tweet'  => 'off',
362                         'format' => 'html',
363                 ];
364
365                 if (!isset($siteinfo["type"])) {
366                         $siteinfo["type"] = "";
367                 }
368
369                 if (($title == "") && isset($siteinfo["title"])) {
370                         $title = $siteinfo["title"];
371                 }
372
373                 if (isset($siteinfo["text"])) {
374                         $body = $siteinfo["text"];
375                 } else {
376                         $body = BBCode::removeShareInformation($b["body"]);
377                 }
378
379                 switch ($siteinfo["type"]) {
380                         case "photo":
381                                 $params['type']    = "photo";
382                                 $params['caption'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);;
383
384                                 if (isset($siteinfo["url"])) {
385                                         $params['link'] = $siteinfo["url"];
386                                 }
387
388                                 $params['source'] = $siteinfo["image"];
389                                 break;
390
391                         case "link":
392                                 $params['type']        = "link";
393                                 $params['title']       = $title;
394                                 $params['url']         = $siteinfo["url"];
395                                 $params['description'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
396                                 break;
397
398                         case "audio":
399                                 $params['type']         = "audio";
400                                 $params['external_url'] = $siteinfo["url"];
401                                 $params['caption']      = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
402                                 break;
403
404                         case "video":
405                                 $params['type']    = "video";
406                                 $params['embed']   = $siteinfo["url"];
407                                 $params['caption'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
408                                 break;
409
410                         default:
411                                 $params['type']  = "text";
412                                 $params['title'] = $title;
413                                 $params['body']  = BBCode::convertForUriId($b['uri-id'], $b['body'], BBCode::CONNECTORS);
414                                 break;
415                 }
416
417                 if (isset($params['caption']) && (trim($title) != "")) {
418                         $params['caption'] = '<h1>'.$title."</h1>".
419                                                 "<p>".$params['caption']."</p>";
420                 }
421
422                 if (empty($params['caption']) && !empty($siteinfo["description"])) {
423                         $params['caption'] = BBCode::convertForUriId($b['uri-id'], "[quote]" . $siteinfo["description"] . "[/quote]", BBCode::CONNECTORS);
424                 }
425
426                 $consumer_key = DI::config()->get('tumblr','consumer_key');
427                 $consumer_secret = DI::config()->get('tumblr','consumer_secret');
428
429                 $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
430
431                 // Make an API call with the TumblrOAuth instance.
432                 $x = $tum_oauth->post($tmbl_blog,$params);
433                 $ret_code = $tum_oauth->http_code;
434
435                 //print_r($params);
436                 if ($ret_code == 201) {
437                         Logger::notice('tumblr_send: success');
438                 } elseif ($ret_code == 403) {
439                         Logger::notice('tumblr_send: authentication failure');
440                 } else {
441                         Logger::notice('tumblr_send: general error', ['error' => $x]);
442                 }
443         }
444 }