/**
* Name: Twitter Connector
* Description: Bidirectional (posting, relaying and reading) connector for Twitter.
- * Version: 1.0.4
+ * Version: 1.1.0
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
+ * Maintainer: Hypolite Petovan <https://friendica.mrpetovan.com/profile/hypolite>
*
- * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel
+ * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel, Hypolite Petovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* setting. After this, your user can configure their Twitter account settings
* from "Settings -> Addon Settings".
*
- * Requirements: PHP5, curl [Slinky library]
+ * Requirements: PHP5, curl
*/
+use Abraham\TwitterOAuth\TwitterOAuth;
use Friendica\App;
use Friendica\Content\OEmbed;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
use Friendica\Core\Addon;
use Friendica\Core\Config;
use Friendica\Core\L10n;
use Friendica\Core\Worker;
use Friendica\Model\GContact;
use Friendica\Model\Group;
+use Friendica\Model\Item;
use Friendica\Model\Photo;
use Friendica\Model\Queue;
use Friendica\Model\User;
use Friendica\Object\Image;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+require_once 'boot.php';
+require_once 'include/dba.php';
require_once 'include/enotify.php';
+require_once 'include/text.php';
+
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes
$uid = $a->user["uid"];
- $ckey = Config::get('twitter', 'consumerkey');
+ $ckey = Config::get('twitter', 'consumerkey');
$csecret = Config::get('twitter', 'consumersecret');
- $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
+ $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
$osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
- require_once "addon/twitter/codebird.php";
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
-
- $parameters = [];
- $parameters["screen_name"] = $nickname;
+ // 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;
+ }
- $user = $cb->friendships_create($parameters);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $connection->post('friendships/create', ['screen_name' => $nickname]);
twitter_fetchuser($a, $uid, $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
if (isset($_POST['twitter-pin'])) {
// if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
logger('got a Twitter PIN');
- require_once 'library/twitteroauth.php';
$ckey = Config::get('twitter', 'consumerkey');
$csecret = Config::get('twitter', 'consumersecret');
// 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->getAccessToken($_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 {
* 2) If no OAuthtoken & stuff is present, generate button to get some
* 3) Checkbox for "Send public notices (280 chars only)
*/
- $ckey = Config::get('twitter', 'consumerkey' );
- $csecret = Config::get('twitter', 'consumersecret' );
- $otoken = PConfig::get(local_user(), 'twitter', 'oauthtoken' );
- $osecret = PConfig::get(local_user(), 'twitter', 'oauthsecret' );
+ $ckey = Config::get('twitter', 'consumerkey');
+ $csecret = Config::get('twitter', 'consumersecret');
+ $otoken = PConfig::get(local_user(), 'twitter', 'oauthtoken');
+ $osecret = PConfig::get(local_user(), 'twitter', 'oauthsecret');
$enabled = intval(PConfig::get(local_user(), 'twitter', 'post'));
$defenabled = intval(PConfig::get(local_user(), 'twitter', 'post_by_default'));
$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.
*/
- require_once 'library/twitteroauth.php';
$connection = new TwitterOAuth($ckey, $csecret);
- $request_token = $connection->getRequestToken();
- $token = $request_token['oauth_token'];
- /* * *
- * make some nice form
- */
+ $result = $connection->oauth('oauth/request_token', ['oauth_callback' => 'oob']);
+
$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->getAuthorizeURL($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="' . $token . '" />';
- $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="' . $request_token['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 {
* we have an OAuth key / secret pair for the user
* so let's give a chance to disable the postings to Twitter
*/
- require_once 'library/twitteroauth.php';
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$details = $connection->get('account/verify_credentials');
$otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
$osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
- require_once "addon/twitter/codebird.php";
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$post = ['id' => $pid];
switch ($action) {
case "delete":
- // To-Do: $result = $cb->statuses_destroy($post);
+ // To-Do: $result = $connection->post('statuses/destroy', $post);
break;
case "like":
- $result = $cb->favorites_create($post);
+ $result = $connection->post('favorites/create', $post);
break;
case "unlike":
- $result = $cb->favorites_destroy($post);
+ $result = $connection->post('favorites/destroy', $post);
break;
}
logger("twitter_action '" . $action . "' send, result: " . print_r($result, true), LOGGER_DEBUG);
function twitter_post_hook(App $a, &$b)
{
// Post to Twitter
- require_once "include/network.php";
-
if (!PConfig::get($b["uid"], 'twitter', 'import')
&& ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))) {
return;
logger("twitter_post_hook: parameter " . print_r($b, true), LOGGER_DATA);
// Looking if its a reply to a twitter post
- if ((substr($b["parent-uri"], 0, 9) != "twitter::") && (substr($b["extid"], 0, 9) != "twitter::") && (substr($b["thr-parent"], 0, 9) != "twitter::")) {
+ if ((substr($b["parent-uri"], 0, 9) != "twitter::")
+ && (substr($b["extid"], 0, 9) != "twitter::")
+ && (substr($b["thr-parent"], 0, 9) != "twitter::"))
+ {
logger("twitter_post_hook: no twitter post " . $b["parent"]);
return;
}
if ($b['verb'] == ACTIVITY_LIKE) {
logger("twitter_post_hook: parameter 2 " . substr($b["thr-parent"], 9), LOGGER_DEBUG);
- if ($b['deleted'])
+ if ($b['deleted']) {
twitter_action($a, $b["uid"], substr($b["thr-parent"], 9), "unlike");
- else
+ } else {
twitter_action($a, $b["uid"], substr($b["thr-parent"], 9), "like");
+ }
+
return;
}
return;
}
- require_once 'library/twitteroauth.php';
- require_once 'include/bbcode.php';
- $tweet = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$max_char = 280;
- require_once "include/plaintext.php";
- $msgarr = plaintext($b, $max_char, true, 8);
+ $msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
$msg = $msgarr["text"];
if (($msg == "") && isset($msgarr["title"])) {
- $msg = shortenmsg($msgarr["title"], $max_char - 50);
+ $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
}
$image = "";
// and now tweet it :-)
if (strlen($msg) && ($image != "")) {
- $img_str = fetch_url($image);
-
- $tempfile = tempnam(get_temppath(), "cache");
- file_put_contents($tempfile, $img_str);
-
- // Twitter had changed something so that the old library doesn't work anymore
- // so we are using a new library for twitter
- // To-Do:
- // Switching completely to this library with all functions
- require_once "addon/twitter/codebird.php";
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $media = $connection->upload('media/upload', ['media' => $image]);
- $post = ['status' => $msg, 'media[]' => $tempfile];
+ $post = ['status' => $msg, 'media_ids' => $media->media_id_string];
if ($iscomment) {
$post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
}
- $result = $cb->statuses_updateWithMedia($post);
- unlink($tempfile);
+ $result = $connection->post('statuses/update', $post);
logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG);
$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'])
- );
+ Item::update(['extid' => "twitter::" . $result->id_str, 'body' => $result->text], ['id' => $b['id']]);
}
}
if (strlen($msg) && ($image == "")) {
// -----------------
$max_char = 280;
- require_once "include/plaintext.php";
- $msgarr = plaintext($b, $max_char, true, 8);
+ $msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
$msg = $msgarr["text"];
if (($msg == "") && isset($msgarr["title"])) {
- $msg = shortenmsg($msgarr["title"], $max_char - 50);
+ $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
}
if (isset($msgarr["url"])) {
$post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
}
- $result = $tweet->post($url, $post);
+ $result = $connection->post($url, $post);
logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
if ($result->source) {
}
$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'])
- );
+ Item::update(['extid' => "twitter::" . $result->id_str], ['id' => $b['id']]);
}
}
}
function twitter_addon_admin_post(App $a)
{
- $consumerkey = x($_POST, 'consumerkey') ? notags(trim($_POST['consumerkey'])) : '';
- $consumersecret = x($_POST, 'consumersecret') ? notags(trim($_POST['consumersecret'])) : '';
+ $consumerkey = x($_POST, 'consumerkey') ? notags(trim($_POST['consumerkey'])) : '';
+ $consumersecret = x($_POST, 'consumersecret') ? notags(trim($_POST['consumersecret'])) : '';
Config::set('twitter', 'consumerkey', $consumerkey);
Config::set('twitter', 'consumersecret', $consumersecret);
info(L10n::t('Settings updated.') . EOL);
}
$abandon_days = intval(Config::get('system', 'account_abandon_days'));
- if ($abandon_days < 1)
+ if ($abandon_days < 1) {
$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)) {
if (count($r)) {
foreach ($r as $rr) {
logger('twitter_expire: user ' . $rr['uid']);
- item_expire($rr['uid'], $days, NETWORK_TWITTER, true);
+ Item::expire($rr['uid'], $days, NETWORK_TWITTER, true);
}
}
if ($b["preview"]) {
$max_char = 280;
- require_once "include/plaintext.php";
$item = $b["item"];
$item["plink"] = $a->get_baseurl() . "/display/" . $a->user["nickname"] . "/" . $item["parent"];
}
}
- $msgarr = plaintext($item, $max_char, true, 8);
+ $msgarr = BBCode::toPlaintext($item, $max_char, true, 8);
$msg = $msgarr["text"];
if (isset($msgarr["url"]) && ($msgarr["type"] != "photo")) {
// We don't support nested shares, so we mustn't show quotes as shares on retweets
$item = twitter_createpost($a, $uid, $post->retweeted_status, ['id' => 0], false, false, true);
- $datarray['body'] = "\n" . share_header($item['author-name'], $item['author-link'], $item['author-avatar'], "", $item['created'], $item['plink']);
+ $datarray['body'] = "\n" . share_header(
+ $item['author-name'],
+ $item['author-link'],
+ $item['author-avatar'],
+ "",
+ $item['created'],
+ $item['plink']
+ );
$datarray['body'] .= $item['body'] . '[/share]';
} else {
require_once 'include/items.php';
require_once 'mod/share.php';
- require_once 'library/twitteroauth.php';
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$parameters = ["exclude_replies" => true, "trim_user" => false, "contributor_details" => true, "include_rts" => true, "tweet_mode" => "extended"];
$z = unserialize($x['content']);
- require_once "addon/twitter/codebird.php";
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
-
- if ($z['url'] == "statuses/update") {
- $result = $cb->statuses_update($z['post']);
- }
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $result = $connection->post($z['url'], $z['post']);
logger('twitter_queue: post result: ' . print_r($result, true), LOGGER_DEBUG);
"addr" => $contact->screen_name . "@twitter.com", "generation" => 2]);
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
- intval($uid), dbesc("twitter::" . $contact->id_str));
+ intval($uid),
+ dbesc("twitter::" . $contact->id_str));
if (!count($r) && !$create_user) {
return 0;
`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"),
function twitter_fetchuser(App $a, $uid, $screen_name = "", $user_id = "")
{
- $ckey = Config::get('twitter', 'consumerkey');
+ $ckey = Config::get('twitter', 'consumerkey');
$csecret = Config::get('twitter', 'consumersecret');
- $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
+ $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
$osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
- require_once "addon/twitter/codebird.php";
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
-
$r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
intval($uid));
}
// Fetching user data
- $user = $cb->users_show($parameters);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $user = $connection->get('users/show', $parameters);
if (!is_object($user)) {
return;
return $contact_id;
}
-function twitter_expand_entities(App $a, $body, $item, $no_tags = false, $picture)
+function twitter_expand_entities(App $a, $body, $item, $picture)
{
- require_once "include/network.php";
+ $plain = $body;
- $tags = "";
+ $tags_arr = [];
- $plain = $body;
+ 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 = "";
$footerlink = "";
$footer = "";
- foreach ($item->entities->urls AS $url) {
+ foreach ($item->entities->urls as $url) {
$plain = str_replace($url->url, '', $plain);
if ($url->url && $url->expanded_url && $url->display_url) {
- $expanded_url = original_url($url->expanded_url);
+ $expanded_url = Network::finalUrl($url->expanded_url);
$oembed_data = OEmbed::fetchURL($expanded_url);
} elseif ($oembed_data->type != "link") {
$body = str_replace($url->url, "[url=" . $expanded_url . "]" . $expanded_url . "[/url]", $body);
} else {
- $img_str = fetch_url($expanded_url, true, $redirects, 4);
+ $img_str = Network::fetchUrl($expanded_url, true, $redirects, 4);
$tempfile = tempnam(get_temppath(), "cache");
file_put_contents($tempfile, $img_str);
} 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)
{
// Don't import our own comments
$r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($postarray['uri']),
- intval($uid)
+ dbesc($postarray['uri']),
+ intval($uid)
);
if (count($r)) {
$parent = "twitter::" . $post->in_reply_to_status_id_str;
$r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($parent),
- intval($uid)
+ dbesc($parent),
+ intval($uid)
);
if (count($r)) {
$postarray['thr-parent'] = $r[0]["uri"];
$postarray['object-type'] = ACTIVITY_OBJ_COMMENT;
} else {
$r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($parent),
- intval($uid)
+ dbesc($parent),
+ intval($uid)
);
if (count($r)) {
$postarray['thr-parent'] = $r[0]['uri'];
// 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"];
$postarray['body'] = $statustext;
- $postarray['body'] .= "\n" . share_header($quoted['author-name'], $quoted['author-link'], $quoted['author-avatar'], "", $quoted['created'], $quoted['plink']);
+ $postarray['body'] .= "\n" . share_header(
+ $quoted['author-name'],
+ $quoted['author-link'],
+ $quoted['author-avatar'],
+ "",
+ $quoted['created'],
+ $quoted['plink']
+ );
$postarray['body'] .= $quoted['body'] . '[/share]';
}
{
/// TODO: this whole function doesn't seem to work. Needs complete check
$user = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1",
- intval($uid)
+ intval($uid)
);
if (!count($user)) {
}
$own_user = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
- intval($uid),
- dbesc("twitter::".$own_id)
+ intval($uid),
+ dbesc("twitter::".$own_id)
);
if (!count($own_user)) {
}
$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
- dbesc($postarray['parent-uri']),
- intval($uid)
+ dbesc($postarray['parent-uri']),
+ intval($uid)
);
if (count($myconv)) {
'to_email' => $user[0]['email'],
'uid' => $user[0]['uid'],
'item' => $postarray,
- 'link' => $a->get_baseurl() . '/display/' . urlencode(get_item_guid($top_item)),
+ 'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($top_item)),
'source_name' => $postarray['author-name'],
'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
}
$r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc("twitter::".$post->id_str),
- intval($uid)
+ dbesc("twitter::".$post->id_str),
+ intval($uid)
);
if (count($r)) {
foreach ($posts as $post) {
$postarray = twitter_createpost($a, $uid, $post, $self, false, false, false);
- if (trim($postarray['body']) == "")
+ if (trim($postarray['body']) == "") {
continue;
+ }
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
logger('twitter_fetchparentpost: User ' . $self["nick"] . ' posted parent timeline item ' . $item);
$application_name = $a->get_hostname();
}
- require_once 'library/twitteroauth.php';
require_once 'include/items.php';
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
continue;
}
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
logger('twitter_fetchhometimeline: User ' . $self["nick"] . ' posted home timeline item ' . $item);
continue;
}
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
if ($item && function_exists("check_item_notification")) {
$item = $r[0]['id'];
$parent_id = $r[0]['parent'];
}
- } else
+ } else {
$parent_id = $postarray['parent'];
+ }
if (($item != 0) && !function_exists("check_item_notification")) {
require_once 'include/enotify.php';
'to_email' => $u[0]['email'],
'uid' => $u[0]['uid'],
'item' => $postarray,
- 'link' => $a->get_baseurl() . '/display/' . urlencode(get_item_guid($item)),
+ 'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($item)),
'source_name' => $postarray['author-name'],
'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
$contact_id = 0;
if ($own_id == "") {
- require_once 'library/twitteroauth.php';
-
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
// Fetching user data
$otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
$osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
- require_once 'library/twitteroauth.php';
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
-
$result = $connection->post('statuses/retweet/' . $id);
logger('twitter_is_retweet: result ' . print_r($result, true), LOGGER_DEBUG);