use Friendica\Model\Queue;
use Friendica\Model\User;
use Friendica\Object\Image;
+use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
require_once 'boot.php';
$otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
$osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
+ // If the addon is not configured (general or for this user) quit here
+ if (empty($ckey) || empty($csecret) || empty($otoken) || empty($osecret)) {
+ $contact = false;
+ return;
+ }
+
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$connection->post('friendships/create', ['screen_name' => $nickname]);
return;
}
// don't check twitter settings if twitter submit button is not clicked
- if (!x($_POST, 'twitter-submit')) {
+ if (empty($_POST['twitter-disconnect']) && empty($_POST['twitter-submit'])) {
return;
}
- if (isset($_POST['twitter-disconnect'])) {
+ if (!empty($_POST['twitter-disconnect'])) {
/* * *
* if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair
* from the user configuration
// the token and secret for which the PIN was generated were hidden in the settings
// form as token and token2, we need a new connection to Twitter using these token
// and secret to request a Access Token with the PIN
- $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']);
- $token = $connection->oauth("oauth/access_token", ["oauth_verifier" => $_POST['twitter-pin']]);
- // ok, now that we have the Access Token, save them in the user config
- PConfig::set(local_user(), 'twitter', 'oauthtoken', $token['oauth_token']);
- PConfig::set(local_user(), 'twitter', 'oauthsecret', $token['oauth_token_secret']);
- PConfig::set(local_user(), 'twitter', 'post', 1);
+ try {
+ if (empty($_POST['twitter-pin'])) {
+ throw new Exception(L10n::t('You submitted an empty PIN, please Sign In with Twitter again to get a new one.'));
+ }
+
+ $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']);
+ $token = $connection->oauth("oauth/access_token", ["oauth_verifier" => $_POST['twitter-pin']]);
+ // ok, now that we have the Access Token, save them in the user config
+ PConfig::set(local_user(), 'twitter', 'oauthtoken', $token['oauth_token']);
+ PConfig::set(local_user(), 'twitter', 'oauthsecret', $token['oauth_token_secret']);
+ PConfig::set(local_user(), 'twitter', 'post', 1);
+ } catch(Exception $e) {
+ info($e->getMessage());
+ }
// reload the Addon Settings page, if we don't do it see Bug #42
goaway('settings/connectors');
} else {
$s .= '</span>';
if ((!$ckey) && (!$csecret)) {
- /* * *
- * no global consumer keys
+ /* no global consumer keys
* display warning and skip personal config
*/
$s .= '<p>' . L10n::t('No consumer key pair for Twitter found. Please contact your site administrator.') . '</p>';
} else {
- /* * *
- * ok we have a consumer key pair now look into the OAuth stuff
- */
+ // ok we have a consumer key pair now look into the OAuth stuff
if ((!$otoken) && (!$osecret)) {
- /* * *
- * the user has not yet connected the account to twitter...
+ /* the user has not yet connected the account to twitter...
* get a temporary OAuth key/secret pair and display a button with
* which the user can request a PIN to connect the account to a
* account at Twitter.
*/
$connection = new TwitterOAuth($ckey, $csecret);
$result = $connection->oauth('oauth/request_token', ['oauth_callback' => 'oob']);
- /* * *
- * make some nice form
- */
+
$s .= '<p>' . L10n::t('At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.') . '</p>';
- $s .= '<a href="' . $connection->url('oauth/authorize', ['oauth_token' => $result->oauth_token]) . '" target="_twitter"><img src="addon/twitter/lighter.png" alt="' . L10n::t('Log in with Twitter') . '"></a>';
+ $s .= '<a href="' . $connection->url('oauth/authorize', ['oauth_token' => $result['oauth_token']]) . '" target="_twitter"><img src="addon/twitter/lighter.png" alt="' . L10n::t('Log in with Twitter') . '"></a>';
$s .= '<div id="twitter-pin-wrapper">';
$s .= '<label id="twitter-pin-label" for="twitter-pin">' . L10n::t('Copy the PIN from Twitter here') . '</label>';
$s .= '<input id="twitter-pin" type="text" name="twitter-pin" />';
- $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="' . $result->oauth_token . '" />';
- $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="' . $result->oauth_token_secret . '" />';
+ $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="' . $result['oauth_token'] . '" />';
+ $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="' . $result['oauth_token_secret'] . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
} else {
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ // Set the timeout for upload to 30 seconds
+ $connection->setTimeouts(10, 30);
+
$max_char = 280;
$msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
$msg = $msgarr["text"];
if (isset($msgarr["url"]) && ($msgarr["type"] != "photo")) {
$msg .= "\n" . $msgarr["url"];
+ $url_added = true;
+ } else {
+ $url_added = false;
}
if (isset($msgarr["image"]) && ($msgarr["type"] != "video")) {
$image = $msgarr["image"];
}
- // and now tweet it :-)
- if (strlen($msg) && ($image != "")) {
- $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
- $media = $connection->upload('media/upload', ['media' => $image]);
+ if (empty($msg)) {
+ return;
+ }
- $post = ['status' => $msg, 'media_ids' => $media->media_id_string];
+ // and now tweet it :-)
+ $post = [];
- if ($iscomment) {
- $post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
- }
+ if (!empty($image)) {
+ try {
+ $img_str = Network::fetchUrl($image);
- $result = $connection->post('statuses/update', $post);
+ $tempfile = tempnam(get_temppath(), 'cache');
+ file_put_contents($tempfile, $img_str);
- logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG);
+ $media = $connection->upload('media/upload', ['media' => $tempfile]);
- if ($result->source) {
- Config::set("twitter", "application_name", strip_tags($result->source));
- }
+ unlink($tempfile);
- if ($result->errors || $result->error) {
- logger('Send to Twitter failed: "' . print_r($result->errors, true) . '"');
+ $post['media_ids'] = $media->media_id_string;
+ } catch (Exception $e) {
+ logger('Exception when trying to send to Twitter: ' . $e->getMessage());
// Workaround: Remove the picture link so that the post can be reposted without it
- $msg .= " " . $image;
+ // When there is another url already added, a second url would be superfluous.
+ if (!$url_added) {
+ $msg .= "\n" . $image;
+ }
+
$image = "";
- } elseif ($iscomment) {
- logger('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
- q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
- dbesc("twitter::" . $result->id_str),
- dbesc($result->text),
- intval($b['id'])
- );
}
}
- if (strlen($msg) && ($image == "")) {
-// -----------------
- $max_char = 280;
- $msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
- $msg = $msgarr["text"];
+ $post['status'] = $msg;
- if (($msg == "") && isset($msgarr["title"])) {
- $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
- }
+ if ($iscomment) {
+ $post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
+ }
- if (isset($msgarr["url"])) {
- $msg .= "\n" . $msgarr["url"];
- }
-// -----------------
- $url = 'statuses/update';
- $post = ['status' => $msg, 'weighted_character_count' => 'true'];
+ $url = 'statuses/update';
+ $result = $connection->post($url, $post);
+ logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
- if ($iscomment) {
- $post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
- }
+ if ($result->source) {
+ Config::set("twitter", "application_name", strip_tags($result->source));
+ }
- $result = $connection->post($url, $post);
- logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
+ if ($result->errors) {
+ logger('Send to Twitter failed: "' . print_r($result->errors, true) . '"');
- if ($result->source) {
- Config::set("twitter", "application_name", strip_tags($result->source));
+ $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", intval($b['uid']));
+ if (count($r)) {
+ $a->contact = $r[0]["id"];
}
- if ($result->errors) {
- logger('Send to Twitter failed: "' . print_r($result->errors, true) . '"');
-
- $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", intval($b['uid']));
- if (count($r)) {
- $a->contact = $r[0]["id"];
- }
-
- $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $post]);
+ $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $post]);
- Queue::add($a->contact, NETWORK_TWITTER, $s);
- notice(L10n::t('Twitter post failed. Queued for retry.') . EOL);
- } elseif ($iscomment) {
- logger('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
- q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d",
- dbesc("twitter::" . $result->id_str),
- intval($b['id'])
- );
- }
+ Queue::add($a->contact, NETWORK_TWITTER, $s);
+ notice(L10n::t('Twitter post failed. Queued for retry.') . EOL);
+ } elseif ($iscomment) {
+ logger('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
+ Item::update(['extid' => "twitter::" . $result->id_str], ['id' => $b['id']]);
}
}
}
$abandon_days = 0;
}
- $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+ $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'import' AND `v` = '1'");
if (count($r)) {
`location`, `about`, `writable`, `blocked`, `readonly`, `pending`)
VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0)",
intval($uid),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc("https://twitter.com/" . $contact->screen_name),
dbesc(normalise_link("https://twitter.com/" . $contact->screen_name)),
dbesc($contact->screen_name."@twitter.com"),
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
intval($contact_id)
);
}
} else {
// update profile photos once every two weeks as we have no notification of when they change.
- //$update_photo = (($r[0]['avatar-date'] < datetime_convert('','','now -2 days')) ? true : false);
- $update_photo = ($r[0]['avatar-date'] < datetime_convert('', '', 'now -12 hours'));
+ //$update_photo = (($r[0]['avatar-date'] < DateTimeFormat::convert('now -2 days', '', '', )) ? true : false);
+ $update_photo = ($r[0]['avatar-date'] < DateTimeFormat::utc('now -12 hours'));
// check that we have all the photos, this has been known to fail on occasion
if ((!$r[0]['photo']) || (!$r[0]['thumb']) || (!$r[0]['micro']) || ($update_photo)) {
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc("https://twitter.com/".$contact->screen_name),
dbesc(normalise_link("https://twitter.com/".$contact->screen_name)),
dbesc($contact->screen_name."@twitter.com"),
return $contact_id;
}
-function twitter_expand_entities(App $a, $body, $item, $no_tags = false, $picture)
+function twitter_expand_entities(App $a, $body, $item, $picture)
{
- $tags = "";
-
$plain = $body;
+ $tags_arr = [];
+
+ foreach ($item->entities->hashtags AS $hashtag) {
+ $url = "#[url=" . $a->get_baseurl() . "/search?tag=" . rawurlencode($hashtag->text) . "]" . $hashtag->text . "[/url]";
+ $tags_arr["#" . $hashtag->text] = $url;
+ $body = str_replace("#" . $hashtag->text, $url, $body);
+ }
+
+ foreach ($item->entities->user_mentions AS $mention) {
+ $url = "@[url=https://twitter.com/" . rawurlencode($mention->screen_name) . "]" . $mention->screen_name . "[/url]";
+ $tags_arr["@" . $mention->screen_name] = $url;
+ $body = str_replace("@" . $mention->screen_name, $url, $body);
+ }
+
if (isset($item->entities->urls)) {
$type = "";
$footerurl = "";
} elseif (($footer == "") && ($picture == "")) {
$body = add_page_info_to_body($body);
}
+ }
- if ($no_tags) {
- return ["body" => $body, "tags" => "", "plain" => $plain];
- }
-
- $tags_arr = [];
-
- foreach ($item->entities->hashtags AS $hashtag) {
- $url = "#[url=" . $a->get_baseurl() . "/search?tag=" . rawurlencode($hashtag->text) . "]" . $hashtag->text . "[/url]";
- $tags_arr["#" . $hashtag->text] = $url;
- $body = str_replace("#" . $hashtag->text, $url, $body);
- }
-
- foreach ($item->entities->user_mentions AS $mention) {
- $url = "@[url=https://twitter.com/" . rawurlencode($mention->screen_name) . "]" . $mention->screen_name . "[/url]";
- $tags_arr["@" . $mention->screen_name] = $url;
- $body = str_replace("@" . $mention->screen_name, $url, $body);
- }
+ // it seems as if the entities aren't always covering all mentions. So the rest will be checked here
+ $tags = get_tags($body);
- // it seems as if the entities aren't always covering all mentions. So the rest will be checked here
- $tags = get_tags($body);
+ if (count($tags)) {
+ foreach ($tags as $tag) {
+ if (strstr(trim($tag), " ")) {
+ continue;
+ }
- if (count($tags)) {
- foreach ($tags as $tag) {
- if (strstr(trim($tag), " ")) {
+ if (strpos($tag, '#') === 0) {
+ if (strpos($tag, '[url=')) {
continue;
}
- if (strpos($tag, '#') === 0) {
- if (strpos($tag, '[url=')) {
- continue;
- }
-
- // don't link tags that are already embedded in links
- if (preg_match('/\[(.*?)' . preg_quote($tag, '/') . '(.*?)\]/', $body)) {
- continue;
- }
- if (preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag, '/') . '(.*?)\)/', $body)) {
- continue;
- }
-
- $basetag = str_replace('_', ' ', substr($tag, 1));
- $url = '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
- $body = str_replace($tag, $url, $body);
- $tags_arr["#" . $basetag] = $url;
- } elseif (strpos($tag, '@') === 0) {
- if (strpos($tag, '[url=')) {
- continue;
- }
+ // don't link tags that are already embedded in links
+ if (preg_match('/\[(.*?)' . preg_quote($tag, '/') . '(.*?)\]/', $body)) {
+ continue;
+ }
+ if (preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag, '/') . '(.*?)\)/', $body)) {
+ continue;
+ }
- $basetag = substr($tag, 1);
- $url = '@[url=https://twitter.com/' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
- $body = str_replace($tag, $url, $body);
- $tags_arr["@" . $basetag] = $url;
+ $basetag = str_replace('_', ' ', substr($tag, 1));
+ $url = '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+ $body = str_replace($tag, $url, $body);
+ $tags_arr["#" . $basetag] = $url;
+ } elseif (strpos($tag, '@') === 0) {
+ if (strpos($tag, '[url=')) {
+ continue;
}
+
+ $basetag = substr($tag, 1);
+ $url = '@[url=https://twitter.com/' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+ $body = str_replace($tag, $url, $body);
+ $tags_arr["@" . $basetag] = $url;
}
}
-
- $tags = implode($tags_arr, ",");
}
+
+ $tags = implode($tags_arr, ",");
+
return ["body" => $body, "tags" => $tags, "plain" => $plain];
}
* @param object $post Twitter object with the post
* @param array $postarray Array of the item that is about to be posted
*
- * @return $picture string Returns a a single picture string if it isn't a media post
+ * @return $picture string Image URL or empty string
*/
function twitter_media_entities($post, &$postarray)
{
// Search for media links
$picture = twitter_media_entities($post, $postarray);
- $converted = twitter_expand_entities($a, $postarray['body'], $post, false, $picture);
+ $converted = twitter_expand_entities($a, $postarray['body'], $post, $picture);
$postarray['body'] = $converted["body"];
$postarray['tag'] = $converted["tags"];
- $postarray['created'] = datetime_convert('UTC', 'UTC', $post->created_at);
- $postarray['edited'] = datetime_convert('UTC', 'UTC', $post->created_at);
+ $postarray['created'] = DateTimeFormat::utc($post->created_at);
+ $postarray['edited'] = DateTimeFormat::utc($post->created_at);
$statustext = $converted["plain"];