]> git.mxchange.org Git - friendica-addons.git/blobdiff - twitter/twitter.php
Merge pull request 'Bluesky: Tags are now supported' (#1438) from heluecht/friendica...
[friendica-addons.git] / twitter / twitter.php
index c033fa9361f09d5e20b8b6ad1c997dc4d86d9095..b01345b74959931fc7257890004afe58f3419fd5 100644 (file)
@@ -94,12 +94,25 @@ function twitter_settings_post()
                return;
        }
 
+       $api_key       = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'api_key');
+       $api_secret    = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'api_secret');
+       $access_token  = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'access_token');
+       $access_secret = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'access_secret');
+
        DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'twitter', 'post',            (bool)$_POST['twitter-enable']);
        DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'twitter', 'post_by_default', (bool)$_POST['twitter-default']);
        DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'twitter', 'api_key',         $_POST['twitter-api-key']);
        DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'twitter', 'api_secret',      $_POST['twitter-api-secret']);
        DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'twitter', 'access_token',    $_POST['twitter-access-token']);
        DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'twitter', 'access_secret',   $_POST['twitter-access-secret']);
+
+       if (
+               empty(DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'last_status')) ||
+               ($api_key != $_POST['twitter-api-key']) || ($api_secret != $_POST['twitter-api-secret']) ||
+               ($access_token != $_POST['twitter-access-token']) || ($access_secret != $_POST['twitter-access-secret'])
+       ) {
+               twitter_test_connection(DI::userSession()->getLocalUserId());
+       }
 }
 
 function twitter_settings(array &$data)
@@ -115,13 +128,14 @@ function twitter_settings(array &$data)
        $api_secret    = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'api_secret');
        $access_token  = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'access_token');
        $access_secret = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'access_secret');
-       
+
        $last_status = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'twitter', 'last_status');
-       if (!empty($last_status['code'])) {
-               $status = print_r($last_status, true);
+       if (!empty($last_status['code']) && !empty($last_status['reason'])) {
+               $status_title = sprintf('%d - %s', $last_status['code'], $last_status['reason']);
        } else {
-               $status = DI::l10n()->t('No status.');
+               $status_title = DI::l10n()->t('No status.');
        }
+       $status_content = $last_status['content'] ?? '';
 
        $t    = Renderer::getMarkupTemplate('connector_settings.tpl', 'addon/twitter/');
        $html = Renderer::replaceMacros($t, [
@@ -132,7 +146,8 @@ function twitter_settings(array &$data)
                '$access_token'  => ['twitter-access-token', DI::l10n()->t('Access Token'), $access_token],
                '$access_secret' => ['twitter-access-secret', DI::l10n()->t('Access Secret'), $access_secret],
                '$help'          => DI::l10n()->t('Each user needs to register their own app to be able to post to Twitter. Please visit https://developer.twitter.com/en/portal/projects-and-apps to register a project. Inside the project you then have to register an app. You will find the needed data for the connector on the page "Keys and token" in the app settings.'),
-               '$status'        => ['twitter-status', DI::l10n()->t('Last Status'), $status, '', '', 'readonly'],
+               '$status_title'  => ['twitter-status-title', DI::l10n()->t('Last Status Summary'), $status_title, '', '', 'readonly'],
+               '$status'        => ['twitter-status', DI::l10n()->t('Last Status Content'), $status_content, '', '', 'readonly'],
        ]);
 
        $data = [
@@ -295,12 +310,12 @@ function twitter_upload_image(int $uid, array $image, int $retrial)
 
        $picture = new Image($picturedata, $photo['type']);
        $height  = $picture->getHeight();
-       $width   = $picture->getWidth(); 
+       $width   = $picture->getWidth();
        $size    = strlen($picturedata);
 
        $picture     = Photo::resizeToFileSize($picture, TWITTER_IMAGE_SIZE[$retrial]);
        $new_height  = $picture->getHeight();
-       $new_width   = $picture->getWidth(); 
+       $new_width   = $picture->getWidth();
        $picturedata = $picture->asString();
        $new_size    = strlen($picturedata);
 
@@ -347,16 +362,54 @@ function twitter_post(int $uid, string $url, string $type, array $data): stdClas
        ]);
 
        $response = $client->post($url, ['auth' => 'oauth', $type => $data]);
+       $body     = $response->getBody()->getContents();
 
        $status = [
-               'code'    => $response->getStatusCode(), 
-               'reason'  => $response->getReasonPhrase(), 
-               'content' => $response->getBody()->getContents()
+               'code'    => $response->getStatusCode(),
+               'reason'  => $response->getReasonPhrase(),
+               'content' => $body
        ];
 
        DI::pConfig()->set($uid, 'twitter', 'last_status', $status);
 
-       $content = json_decode($response->getBody()->getContents()) ?? new stdClass;
+       $content = json_decode($body) ?? new stdClass;
        Logger::debug('Success', ['content' => $content]);
        return $content;
 }
+
+function twitter_test_connection(int $uid)
+{
+       $stack = HandlerStack::create();
+
+       $middleware = new Oauth1([
+               'consumer_key'    => DI::pConfig()->get($uid, 'twitter', 'api_key'),
+               'consumer_secret' => DI::pConfig()->get($uid, 'twitter', 'api_secret'),
+               'token'           => DI::pConfig()->get($uid, 'twitter', 'access_token'),
+               'token_secret'    => DI::pConfig()->get($uid, 'twitter', 'access_secret'),
+       ]);
+
+       $stack->push($middleware);
+
+       $client = new Client([
+               'handler' => $stack
+       ]);
+
+       try {
+               $response = $client->get('https://api.twitter.com/2/users/me', ['auth' => 'oauth']);
+               $status = [
+                       'code'   => $response->getStatusCode(),
+                       'reason'  => $response->getReasonPhrase(),
+                       'content' => $response->getBody()->getContents()
+               ];
+               DI::pConfig()->set(1, 'twitter', 'last_status',  $status);
+               Logger::info('Test successful', ['uid' => $uid]);
+       } catch (RequestException $exception) {
+               $status = [
+                       'code'    => $exception->getCode(),
+                       'reason'  => $exception->getResponse()->getReasonPhrase(),
+                       'content' => $exception->getMessage()
+               ];
+               DI::pConfig()->set(1, 'twitter', 'last_status',  $status);
+               Logger::info('Test failed', ['uid' => $uid]);
+       }
+}