X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=inline;f=twitter%2Ftwitter.php;h=206b32b94a8c541ed94ce7438e558cc22e37f950;hb=94e240af742303c1e46d72a7ecffbc247dbfbd94;hp=3e5701658b13ee60b8965ff427887d02c9d18397;hpb=d1919f0497f4a58d08031e5f5b4d358cf133610b;p=friendica-addons.git
diff --git a/twitter/twitter.php b/twitter/twitter.php
index 3e570165..206b32b9 100644
--- a/twitter/twitter.php
+++ b/twitter/twitter.php
@@ -48,13 +48,14 @@
* we do not need "Twitter as login". When you've registered the app you get the
* OAuth Consumer key and secret pair for your application/site.
*
- * Add this key pair to your global config/addon.ini.php or use the admin panel.
+ * Add this key pair to your global config/addon.config.php or use the admin panel.
*
- * [twitter]
- * consumerkey = your consumer_key here
- * consumersecret = your consumer_secret here
+ * 'twitter' => [
+ * 'consumerkey' => '',
+ * 'consumersecret' => '',
+ * ],
*
- * To activate the addon itself add it to the [system] addon
+ * To activate the addon itself add it to the system.addon
* setting. After this, your user can configure their Twitter account settings
* from "Settings -> Addon Settings".
*
@@ -65,9 +66,10 @@ use Abraham\TwitterOAuth\TwitterOAuth;
use Abraham\TwitterOAuth\TwitterOAuthException;
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\Hook;
use Friendica\Core\L10n;
use Friendica\Core\Logger;
use Friendica\Core\PConfig;
@@ -77,22 +79,16 @@ use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\Model\Contact;
use Friendica\Model\Conversation;
-use Friendica\Model\GContact;
use Friendica\Model\Group;
use Friendica\Model\Item;
use Friendica\Model\ItemContent;
-use Friendica\Model\Queue;
use Friendica\Model\User;
use Friendica\Object\Image;
+use Friendica\Util\ConfigFileLoader;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
use Friendica\Util\Strings;
-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
@@ -100,47 +96,45 @@ define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes
function twitter_install()
{
// we need some hooks, for the configuration and for sending tweets
- Addon::registerHook('load_config' , __FILE__, 'twitter_load_config');
- Addon::registerHook('connector_settings' , __FILE__, 'twitter_settings');
- Addon::registerHook('connector_settings_post', __FILE__, 'twitter_settings_post');
- Addon::registerHook('hook_fork' , __FILE__, 'twitter_hook_fork');
- Addon::registerHook('post_local' , __FILE__, 'twitter_post_local');
- Addon::registerHook('notifier_normal' , __FILE__, 'twitter_post_hook');
- Addon::registerHook('jot_networks' , __FILE__, 'twitter_jot_nets');
- Addon::registerHook('cron' , __FILE__, 'twitter_cron');
- Addon::registerHook('queue_predeliver' , __FILE__, 'twitter_queue_hook');
- Addon::registerHook('follow' , __FILE__, 'twitter_follow');
- Addon::registerHook('expire' , __FILE__, 'twitter_expire');
- Addon::registerHook('prepare_body' , __FILE__, 'twitter_prepare_body');
- Addon::registerHook('check_item_notification', __FILE__, 'twitter_check_item_notification');
+ Hook::register('load_config' , __FILE__, 'twitter_load_config');
+ Hook::register('connector_settings' , __FILE__, 'twitter_settings');
+ Hook::register('connector_settings_post', __FILE__, 'twitter_settings_post');
+ Hook::register('hook_fork' , __FILE__, 'twitter_hook_fork');
+ Hook::register('post_local' , __FILE__, 'twitter_post_local');
+ Hook::register('notifier_normal' , __FILE__, 'twitter_post_hook');
+ Hook::register('jot_networks' , __FILE__, 'twitter_jot_nets');
+ Hook::register('cron' , __FILE__, 'twitter_cron');
+ Hook::register('follow' , __FILE__, 'twitter_follow');
+ Hook::register('expire' , __FILE__, 'twitter_expire');
+ Hook::register('prepare_body' , __FILE__, 'twitter_prepare_body');
+ Hook::register('check_item_notification', __FILE__, 'twitter_check_item_notification');
Logger::log("installed twitter");
}
function twitter_uninstall()
{
- Addon::unregisterHook('load_config' , __FILE__, 'twitter_load_config');
- Addon::unregisterHook('connector_settings' , __FILE__, 'twitter_settings');
- Addon::unregisterHook('connector_settings_post', __FILE__, 'twitter_settings_post');
- Addon::unregisterHook('hook_fork' , __FILE__, 'twitter_hook_fork');
- Addon::unregisterHook('post_local' , __FILE__, 'twitter_post_local');
- Addon::unregisterHook('notifier_normal' , __FILE__, 'twitter_post_hook');
- Addon::unregisterHook('jot_networks' , __FILE__, 'twitter_jot_nets');
- Addon::unregisterHook('cron' , __FILE__, 'twitter_cron');
- Addon::unregisterHook('queue_predeliver' , __FILE__, 'twitter_queue_hook');
- Addon::unregisterHook('follow' , __FILE__, 'twitter_follow');
- Addon::unregisterHook('expire' , __FILE__, 'twitter_expire');
- Addon::unregisterHook('prepare_body' , __FILE__, 'twitter_prepare_body');
- Addon::unregisterHook('check_item_notification', __FILE__, 'twitter_check_item_notification');
+ Hook::unregister('load_config' , __FILE__, 'twitter_load_config');
+ Hook::unregister('connector_settings' , __FILE__, 'twitter_settings');
+ Hook::unregister('connector_settings_post', __FILE__, 'twitter_settings_post');
+ Hook::unregister('hook_fork' , __FILE__, 'twitter_hook_fork');
+ Hook::unregister('post_local' , __FILE__, 'twitter_post_local');
+ Hook::unregister('notifier_normal' , __FILE__, 'twitter_post_hook');
+ Hook::unregister('jot_networks' , __FILE__, 'twitter_jot_nets');
+ Hook::unregister('cron' , __FILE__, 'twitter_cron');
+ Hook::unregister('follow' , __FILE__, 'twitter_follow');
+ Hook::unregister('expire' , __FILE__, 'twitter_expire');
+ Hook::unregister('prepare_body' , __FILE__, 'twitter_prepare_body');
+ Hook::unregister('check_item_notification', __FILE__, 'twitter_check_item_notification');
// old setting - remove only
- Addon::unregisterHook('post_local_end' , __FILE__, 'twitter_post_hook');
- Addon::unregisterHook('addon_settings' , __FILE__, 'twitter_settings');
- Addon::unregisterHook('addon_settings_post', __FILE__, 'twitter_settings_post');
+ Hook::unregister('post_local_end' , __FILE__, 'twitter_post_hook');
+ Hook::unregister('addon_settings' , __FILE__, 'twitter_settings');
+ Hook::unregister('addon_settings_post', __FILE__, 'twitter_settings_post');
}
-function twitter_load_config(App $a)
+function twitter_load_config(App $a, ConfigFileLoader $loader)
{
- $a->loadConfigFile(__DIR__ . '/config/twitter.ini.php');
+ $a->getConfigCache()->load($loader->loadAddonConfig('twitter'));
}
function twitter_check_item_notification(App $a, array &$notification_data)
@@ -196,21 +190,25 @@ function twitter_follow(App $a, array &$contact)
}
}
-function twitter_jot_nets(App $a, &$b)
+function twitter_jot_nets(App $a, array &$jotnets_fields)
{
if (!local_user()) {
return;
}
- $tw_post = PConfig::get(local_user(), 'twitter', 'post');
- if (intval($tw_post) == 1) {
- $tw_defpost = PConfig::get(local_user(), 'twitter', 'post_by_default');
- $selected = ((intval($tw_defpost) == 1) ? ' checked="checked" ' : '');
- $b .= '
'
- . L10n::t('Post to Twitter') . '
';
+ if (PConfig::get(local_user(), 'twitter', 'post')) {
+ $jotnets_fields[] = [
+ 'type' => 'checkbox',
+ 'field' => [
+ 'twitter_enable',
+ L10n::t('Post to Twitter'),
+ PConfig::get(local_user(), 'twitter', 'post_by_default')
+ ]
+ ];
}
}
+
function twitter_settings_post(App $a)
{
if (!local_user()) {
@@ -444,7 +442,7 @@ function twitter_post_local(App $a, array &$b)
}
$twitter_post = intval(PConfig::get(local_user(), 'twitter', 'post'));
- $twitter_enable = (($twitter_post && x($_REQUEST, 'twitter_enable')) ? intval($_REQUEST['twitter_enable']) : 0);
+ $twitter_enable = (($twitter_post && !empty($_REQUEST['twitter_enable'])) ? intval($_REQUEST['twitter_enable']) : 0);
// if API is used, default to the chosen settings
if ($b['api_source'] && intval(PConfig::get(local_user(), 'twitter', 'post_by_default'))) {
@@ -576,7 +574,7 @@ function twitter_post_hook(App $a, array &$b)
return;
}
- Logger::log('twitter post invoked');
+ Logger::notice('twitter post invoked', ['id' => $b['id'], 'guid' => $b['guid']]);
PConfig::load($b['uid'], 'twitter');
@@ -611,6 +609,7 @@ function twitter_post_hook(App $a, array &$b)
$b['body'] = twitter_update_mentions($b['body']);
$msgarr = ItemContent::getPlaintextPost($b, $max_char, true, 8);
+ Logger::info('Got plaintext', $msgarr);
$msg = $msgarr["text"];
if (($msg == "") && isset($msgarr["title"])) {
@@ -682,16 +681,7 @@ function twitter_post_hook(App $a, array &$b)
if (!empty($result->errors)) {
Logger::log('Send to Twitter failed: "' . print_r($result->errors, true) . '"');
-
- $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", intval($b['uid']));
- if (DBA::isResult($r)) {
- $a->contact = $r[0]["id"];
- }
-
- $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $post]);
-
- Queue::add($a->contact, Protocol::TWITTER, $s);
- notice(L10n::t('Twitter post failed. Queued for retry.') . EOL);
+ Worker::defer();
} elseif ($iscomment) {
Logger::log('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
Item::update(['extid' => "twitter::" . $result->id_str], ['id' => $b['id']]);
@@ -701,8 +691,8 @@ function twitter_post_hook(App $a, array &$b)
function twitter_addon_admin_post(App $a)
{
- $consumerkey = x($_POST, 'consumerkey') ? Strings::escapeTags(trim($_POST['consumerkey'])) : '';
- $consumersecret = x($_POST, 'consumersecret') ? Strings::escapeTags(trim($_POST['consumersecret'])) : '';
+ $consumerkey = !empty($_POST['consumerkey']) ? Strings::escapeTags(trim($_POST['consumerkey'])) : '';
+ $consumersecret = !empty($_POST['consumersecret']) ? Strings::escapeTags(trim($_POST['consumersecret'])) : '';
Config::set('twitter', 'consumerkey', $consumerkey);
Config::set('twitter', 'consumersecret', $consumersecret);
info(L10n::t('Settings updated.') . EOL);
@@ -742,7 +732,7 @@ function twitter_cron(App $a)
if (DBA::isResult($r)) {
foreach ($r as $rr) {
Logger::log('twitter: fetching for user ' . $rr['uid']);
- Worker::add(PRIORITY_MEDIUM, "addon/twitter/twitter_sync.php", 1, (int) $rr['uid']);
+ Worker::add(['priority' => PRIORITY_MEDIUM, 'force_priority' => true], "addon/twitter/twitter_sync.php", 1, (int) $rr['uid']);
}
}
@@ -765,7 +755,7 @@ function twitter_cron(App $a)
}
Logger::log('twitter: importing timeline from user ' . $rr['uid']);
- Worker::add(PRIORITY_MEDIUM, "addon/twitter/twitter_sync.php", 2, (int) $rr['uid']);
+ Worker::add(['priority' => PRIORITY_MEDIUM, 'force_priority' => true], "addon/twitter/twitter_sync.php", 2, (int) $rr['uid']);
/*
// To-Do
// check for new contacts once a day
@@ -802,8 +792,6 @@ function twitter_expire(App $a)
}
DBA::close($r);
- require_once "include/items.php";
-
Logger::log('twitter_expire: expire_start');
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'import' AND `v` = '1' ORDER BY RAND()");
@@ -826,7 +814,7 @@ function twitter_prepare_body(App $a, array &$b)
if ($b["preview"]) {
$max_char = 280;
$item = $b["item"];
- $item["plink"] = $a->getBaseURL() . "/display/" . $a->user["nickname"] . "/" . $item["parent"];
+ $item["plink"] = $a->getBaseURL() . "/display/" . $item["guid"];
$condition = ['uri' => $item["thr-parent"], 'uid' => local_user()];
$orig_post = Item::selectFirst(['author-link'], $condition);
@@ -933,12 +921,11 @@ function twitter_fetchtimeline(App $a, $uid)
$has_picture = false;
require_once 'mod/item.php';
- require_once 'include/items.php';
require_once 'mod/share.php';
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
- $parameters = ["exclude_replies" => true, "trim_user" => false, "contributor_details" => true, "include_rts" => true, "tweet_mode" => "extended"];
+ $parameters = ["exclude_replies" => true, "trim_user" => false, "contributor_details" => true, "include_rts" => true, "tweet_mode" => "extended", "include_ext_alt_text" => true];
$first_time = ($lastid == "");
@@ -995,66 +982,6 @@ function twitter_fetchtimeline(App $a, $uid)
Logger::log('Last ID for user ' . $uid . ' is now ' . $lastid, Logger::DEBUG);
}
-function twitter_queue_hook(App $a)
-{
- $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'",
- DBA::escape(Protocol::TWITTER)
- );
- if (!DBA::isResult($qi)) {
- return;
- }
-
- foreach ($qi as $x) {
- if ($x['network'] !== Protocol::TWITTER) {
- continue;
- }
-
- Logger::log('twitter_queue: run');
-
- $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` on `contact`.`uid` = `user`.`uid`
- WHERE `contact`.`self` = 1 AND `contact`.`id` = %d LIMIT 1",
- intval($x['cid'])
- );
- if (!DBA::isResult($r)) {
- continue;
- }
-
- $user = $r[0];
-
- $ckey = Config::get('twitter', 'consumerkey');
- $csecret = Config::get('twitter', 'consumersecret');
- $otoken = PConfig::get($user['uid'], 'twitter', 'oauthtoken');
- $osecret = PConfig::get($user['uid'], 'twitter', 'oauthsecret');
-
- $success = false;
-
- if ($ckey && $csecret && $otoken && $osecret) {
- Logger::log('twitter_queue: able to post');
-
- $z = unserialize($x['content']);
-
- $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
- $result = $connection->post($z['url'], $z['post']);
-
- Logger::log('twitter_queue: post result: ' . print_r($result, true), Logger::DEBUG);
-
- if ($result->errors) {
- Logger::log('twitter_queue: Send to Twitter failed: "' . print_r($result->errors, true) . '"');
- } else {
- $success = true;
- Queue::removeItem($x['id']);
- }
- } else {
- Logger::log("twitter_queue: Error getting tokens for user " . $user['uid']);
- }
-
- if (!$success) {
- Logger::log('twitter_queue: delayed');
- Queue::updateTime($x['id']);
- }
- }
-}
-
function twitter_fix_avatar($avatar)
{
$new_avatar = str_replace("_normal.", ".", $avatar);
@@ -1077,12 +1004,6 @@ function twitter_fetch_contact($uid, $data, $create_user)
$url = "https://twitter.com/" . $data->screen_name;
$addr = $data->screen_name . "@twitter.com";
- GContact::update(["url" => $url, "network" => Protocol::TWITTER,
- "photo" => $avatar, "hide" => true,
- "name" => $data->name, "nick" => $data->screen_name,
- "location" => $data->location, "about" => $data->description,
- "addr" => $addr, "generation" => 2]);
-
$fields = ['url' => $url, 'network' => Protocol::TWITTER,
'name' => $data->name, 'nick' => $data->screen_name, 'addr' => $addr,
'location' => $data->location, 'about' => $data->description];
@@ -1199,7 +1120,7 @@ function twitter_expand_entities(App $a, $body, $item, $picture)
$tags_arr = [];
foreach ($item->entities->hashtags AS $hashtag) {
- $url = '#[url=' . $a->getBaseURL() . '/search?tag=' . rawurlencode($hashtag->text) . ']' . $hashtag->text . '[/url]';
+ $url = '#[url=' . $a->getBaseURL() . '/search?tag=' . $hashtag->text . ']' . $hashtag->text . '[/url]';
$tags_arr['#' . $hashtag->text] = $url;
$body = str_replace('#' . $hashtag->text, $url, $body);
}
@@ -1227,9 +1148,11 @@ function twitter_expand_entities(App $a, $body, $item, $picture)
continue;
}
- $expanded_url = Network::finalUrl($url->expanded_url);
+ $expanded_url = $url->expanded_url;
+
+ $final_url = Network::finalUrl($url->expanded_url);
- $oembed_data = OEmbed::fetchURL($expanded_url);
+ $oembed_data = OEmbed::fetchURL($final_url);
if (empty($oembed_data) || empty($oembed_data->type)) {
continue;
@@ -1255,7 +1178,7 @@ function twitter_expand_entities(App $a, $body, $item, $picture)
} elseif ($oembed_data->type != 'link') {
$body = str_replace($url->url, '[url=' . $expanded_url . ']' . $url->display_url . '[/url]', $body);
} else {
- $img_str = Network::fetchUrl($expanded_url, true, $redirects, 4);
+ $img_str = Network::fetchUrl($final_url, true, 4);
$tempfile = tempnam(get_temppath(), 'cache');
file_put_contents($tempfile, $img_str);
@@ -1271,7 +1194,7 @@ function twitter_expand_entities(App $a, $body, $item, $picture)
if (substr($mime, 0, 6) == 'image/') {
$type = 'photo';
- $body = str_replace($url->url, '[img]' . $expanded_url . '[/img]', $body);
+ $body = str_replace($url->url, '[img]' . $final_url . '[/img]', $body);
} else {
$type = $oembed_data->type;
$footerurl = $expanded_url;
@@ -1308,7 +1231,7 @@ function twitter_expand_entities(App $a, $body, $item, $picture)
}
// it seems as if the entities aren't always covering all mentions. So the rest will be checked here
- $tags = Strings::getTags($body);
+ $tags = BBCode::getTags($body);
if (count($tags)) {
foreach ($tags as $tag) {
@@ -1330,7 +1253,7 @@ function twitter_expand_entities(App $a, $body, $item, $picture)
}
$basetag = str_replace('_', ' ', substr($tag, 1));
- $url = '#[url=' . $a->getBaseURL() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+ $url = '#[url=' . $a->getBaseURL() . '/search?tag=' . $basetag . ']' . $basetag . '[/url]';
$body = str_replace($tag, $url, $body);
$tags_arr['#' . $basetag] = $url;
} elseif (strpos($tag, '@') === 0) {
@@ -1389,12 +1312,24 @@ function twitter_media_entities($post, array &$postarray)
}
switch ($medium->type) {
case 'photo':
- $media[$medium->url] .= "\n[img]" . $medium->media_url_https . '[/img]';
+ if (!empty($medium->ext_alt_text)) {
+ Logger::info('Got text description', ['alt_text' => $medium->ext_alt_text]);
+ $media[$medium->url] .= "\n[img=" . $medium->media_url_https .']' . $medium->ext_alt_text . '[/img]';
+ } else {
+ $media[$medium->url] .= "\n[img]" . $medium->media_url_https . '[/img]';
+ }
+
$postarray['object-type'] = ACTIVITY_OBJ_IMAGE;
break;
case 'video':
case 'animated_gif':
- $media[$medium->url] .= "\n[img]" . $medium->media_url_https . '[/img]';
+ if (!empty($medium->ext_alt_text)) {
+ Logger::info('Got text description', ['alt_text' => $medium->ext_alt_text]);
+ $media[$medium->url] .= "\n[img=" . $medium->media_url_https .']' . $medium->ext_alt_text . '[/img]';
+ } else {
+ $media[$medium->url] .= "\n[img]" . $medium->media_url_https . '[/img]';
+ }
+
$postarray['object-type'] = ACTIVITY_OBJ_VIDEO;
if (is_array($medium->video_info->variants)) {
$bitrate = 0;
@@ -1557,15 +1492,28 @@ function twitter_createpost(App $a, $uid, $post, array $self, $create_user, $onl
return [];
}
- $retweet['source'] = $postarray['source'];
- $retweet['private'] = $postarray['private'];
- $retweet['allow_cid'] = $postarray['allow_cid'];
- $retweet['contact-id'] = $postarray['contact-id'];
- $retweet['owner-name'] = $postarray['owner-name'];
- $retweet['owner-link'] = $postarray['owner-link'];
- $retweet['owner-avatar'] = $postarray['owner-avatar'];
+ if (!$noquote) {
+ // Store the original tweet
+ Item::insert($retweet);
+
+ // CHange the other post into a reshare activity
+ $postarray['verb'] = ACTIVITY2_ANNOUNCE;
+ $postarray['gravity'] = GRAVITY_ACTIVITY;
+ $postarray['object-type'] = ACTIVITY_OBJ_NOTE;
- $postarray = $retweet;
+ $postarray['thr-parent'] = $retweet['uri'];
+ $postarray['parent-uri'] = $retweet['uri'];
+ } else {
+ $retweet['source'] = $postarray['source'];
+ $retweet['private'] = $postarray['private'];
+ $retweet['allow_cid'] = $postarray['allow_cid'];
+ $retweet['contact-id'] = $postarray['contact-id'];
+ $retweet['owner-name'] = $postarray['owner-name'];
+ $retweet['owner-link'] = $postarray['owner-link'];
+ $retweet['owner-avatar'] = $postarray['owner-avatar'];
+
+ $postarray = $retweet;
+ }
}
if (!empty($post->quoted_status) && !$noquote) {
@@ -1597,7 +1545,7 @@ function twitter_fetchparentposts(App $a, $uid, $post, TwitterOAuth $connection,
$posts = [];
while (!empty($post->in_reply_to_status_id_str)) {
- $parameters = ["trim_user" => false, "tweet_mode" => "extended", "id" => $post->in_reply_to_status_id_str];
+ $parameters = ["trim_user" => false, "tweet_mode" => "extended", "id" => $post->in_reply_to_status_id_str, "include_ext_alt_text" => true];
try {
$post = $connection->get('statuses/show', $parameters);
@@ -1607,7 +1555,7 @@ function twitter_fetchparentposts(App $a, $uid, $post, TwitterOAuth $connection,
}
if (empty($post)) {
- Logger::log("twitter_fetchparentposts: Can't fetch post " . $parameters->id, Logger::DEBUG);
+ Logger::log("twitter_fetchparentposts: Can't fetch post " . $parameters['id'], Logger::DEBUG);
break;
}
@@ -1661,8 +1609,6 @@ function twitter_fetchhometimeline(App $a, $uid)
$application_name = $a->getHostName();
}
- require_once 'include/items.php';
-
$connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
try {
@@ -1689,7 +1635,7 @@ function twitter_fetchhometimeline(App $a, $uid)
return;
}
- $parameters = ["exclude_replies" => false, "trim_user" => false, "contributor_details" => true, "include_rts" => true, "tweet_mode" => "extended"];
+ $parameters = ["exclude_replies" => false, "trim_user" => false, "contributor_details" => true, "include_rts" => true, "tweet_mode" => "extended", "include_ext_alt_text" => true];
//$parameters["count"] = 200;
// Fetching timeline
$lastid = PConfig::get($uid, 'twitter', 'lasthometimelineid');
@@ -1847,6 +1793,9 @@ function twitter_fetch_own_contact(App $a, $uid)
// Fetching user data
// get() may throw TwitterOAuthException, but we will catch it later
$user = $connection->get('account/verify_credentials');
+ if (empty($user) || empty($user->id_str)) {
+ return false;
+ }
PConfig::set($uid, 'twitter', 'own_id', $user->id_str);