<?php
/**
* Name: Twitter Connector
- * Description: Relay public postings to a connected Twitter account
+ * Description: Bidirectional (posting, relaying and reading) connector for Twitter.
* Version: 1.0.4
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
* Requirements: PHP5, curl [Slinky library]
*/
+require_once('include/enotify.php');
+require_once("include/socgraph.php");
+
define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes
function twitter_install() {
register_hook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
register_hook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
register_hook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
+ register_hook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
+ register_hook('check_item_notification','addon/twitter/twitter.php', 'twitter_check_item_notification');
logger("installed twitter");
}
unregister_hook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
unregister_hook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
unregister_hook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
+ unregister_hook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
+ unregister_hook('check_item_notification','addon/twitter/twitter.php', 'twitter_check_item_notification');
// old setting - remove only
unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
}
+function twitter_check_item_notification($a, &$notification_data) {
+ $own_id = get_pconfig($notification_data["uid"], 'twitter', 'own_id');
+
+ $own_user = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
+ intval($notification_data["uid"]),
+ dbesc("twitter::".$own_id)
+ );
+
+ if ($own_user)
+ $notification_data["profiles"][] = $own_user[0]["url"];
+}
+
function twitter_follow($a, &$contact) {
logger("twitter_follow: Check if contact is twitter contact. ".$contact["url"], LOGGER_DEBUG);
switch ($action) {
case "delete":
- $result = $cb->statuses_destroy($post);
+ // To-Do: $result = $cb->statuses_destroy($post);
break;
case "like":
$result = $cb->favorites_create($post);
return;
// if post comes from twitter don't send it back
+ if($b['extid'] == NETWORK_TWITTER)
+ return;
+
if($b['app'] == "Twitter")
return;
$max_char = 140;
require_once("include/plaintext.php");
- $msgarr = plaintext($a, $b, $max_char, true);
+ $msgarr = plaintext($a, $b, $max_char, true, 8);
$msg = $msgarr["text"];
if (($msg == "") AND isset($msgarr["title"]))
$image = "";
- if (isset($msgarr["url"]))
+ if (isset($msgarr["url"]) AND ($msgarr["type"] != "photo"))
$msg .= "\n".$msgarr["url"];
- elseif (isset($msgarr["image"]))
+ elseif (isset($msgarr["image"]) AND ($msgarr["type"] != "video"))
$image = $msgarr["image"];
// and now tweet it :-)
if(strlen($msg) and ($image != "")) {
$img_str = fetch_url($image);
- $tempfile = tempnam(get_config("system","temppath"), "cache");
+ $tempfile = tempnam(get_temppath(), "cache");
file_put_contents($tempfile, $img_str);
// Twitter had changed something so that the old library doesn't work anymore
unlink($tempfile);
logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG);
+
+ if ($result->source)
+ set_config("twitter", "application_name", strip_tags($result->source));
+
if ($result->errors OR $result->error) {
logger('Send to Twitter failed: "' . print_r($result->errors, true) . '"');
$result = $tweet->post($url, $post);
logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
+
+ if ($result->source)
+ set_config("twitter", "application_name", strip_tags($result->source));
+
if ($result->errors) {
logger('Send to Twitter failed: "' . print_r($result->errors, true) . '"');
$applicationname = ((x($_POST, 'applicationname')) ? notags(trim($_POST['applicationname'])):'');
set_config('twitter','consumerkey',$consumerkey);
set_config('twitter','consumersecret',$consumersecret);
- set_config('twitter','application_name',$applicationname);
+ //set_config('twitter','application_name',$applicationname);
info( t('Settings updated.'). EOL );
}
function twitter_plugin_admin(&$a, &$o){
// name, label, value, help, [extra values]
'$consumerkey' => array('consumerkey', t('Consumer key'), get_config('twitter', 'consumerkey' ), ''),
'$consumersecret' => array('consumersecret', t('Consumer secret'), get_config('twitter', 'consumersecret' ), ''),
- '$applicationname' => array('applicationname', t('Name of the Twitter Application'), get_config('twitter','application_name'),t('set this to avoid mirroring postings from ~friendica back to ~friendica'))
+ //'$applicationname' => array('applicationname', t('Name of the Twitter Application'), get_config('twitter','application_name'),t('Set this to the exact name you gave the app on twitter.com/apps to avoid mirroring postings from ~friendica back to ~friendica'))
));
}
}
}
+ $abandon_days = intval(get_config('system','account_abandon_days'));
+ if ($abandon_days < 1)
+ $abandon_days = 0;
+
+ $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'import' AND `v` = '1' ORDER BY RAND()");
if(count($r)) {
foreach($r as $rr) {
+ if ($abandon_days != 0) {
+ $user = q("SELECT `login_date` FROM `user` WHERE uid=%d AND `login_date` >= '%s'", $rr['uid'], $abandon_limit);
+ if (!count($user)) {
+ logger('abandoned account: timeline from user '.$rr['uid'].' will not be imported');
+ continue;
+ }
+ }
+
logger('twitter: importing timeline from user '.$rr['uid']);
twitter_fetchhometimeline($a, $rr["uid"]);
logger('twitter_expire: expire_end');
}
+function twitter_prepare_body(&$a,&$b) {
+ if ($b["item"]["network"] != NETWORK_TWITTER)
+ return;
+
+ if ($b["preview"]) {
+ $max_char = 140;
+ require_once("include/plaintext.php");
+ $item = $b["item"];
+ $item["plink"] = $a->get_baseurl()."/display/".$a->user["nickname"]."/".$item["parent"];
+
+ $r = q("SELECT `author-link` FROM item WHERE item.uri = '%s' AND item.uid = %d LIMIT 1",
+ dbesc($item["thr-parent"]),
+ intval(local_user()));
+
+ if(count($r)) {
+ $orig_post = $r[0];
+
+ $nicknameplain = preg_replace("=https?://twitter.com/(.*)=ism", "$1", $orig_post["author-link"]);
+ $nickname = "@[url=".$orig_post["author-link"]."]".$nicknameplain."[/url]";
+ $nicknameplain = "@".$nicknameplain;
+
+ if ((strpos($item["body"], $nickname) === false) AND (strpos($item["body"], $nicknameplain) === false))
+ $item["body"] = $nickname." ".$item["body"];
+ }
+
+
+ $msgarr = plaintext($a, $item, $max_char, true, 8);
+ $msg = $msgarr["text"];
+
+ if (isset($msgarr["url"]) AND ($msgarr["type"] != "photo"))
+ $msg .= " ".$msgarr["url"];
+
+ if (isset($msgarr["image"]))
+ $msg .= " ".$msgarr["image"];
+
+ $b['html'] = nl2br(htmlspecialchars($msg));
+ }
+}
+
function twitter_fetchtimeline($a, $uid) {
$ckey = get_config('twitter', 'consumerkey');
$csecret = get_config('twitter', 'consumersecret');
require_once('mod/item.php');
require_once('include/items.php');
+ require_once('mod/share.php');
require_once('library/twitteroauth.php');
$connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
if (count($posts)) {
foreach ($posts as $post) {
- if ($post->id_str > $lastid)
+ if ($post->id_str > $lastid) {
$lastid = $post->id_str;
+ set_pconfig($uid, 'twitter', 'lastid', $lastid);
+ }
if ($first_time)
continue;
- if (!strpos($post->source, $application_name)) {
+ if (!stristr($post->source, $application_name)) {
$_SESSION["authenticated"] = true;
$_SESSION["uid"] = $uid;
$_REQUEST["type"] = "wall";
$_REQUEST["api_source"] = true;
$_REQUEST["profile_uid"] = $uid;
- $_REQUEST["source"] = "Twitter";
+ //$_REQUEST["source"] = "Twitter";
+ $_REQUEST["source"] = $post->source;
+ $_REQUEST["extid"] = NETWORK_TWITTER;
//$_REQUEST["date"] = $post->created_at;
$_REQUEST['body'] = $post->retweeted_status->text;
+ $picture = "";
+
// media
if (is_array($post->retweeted_status->entities->media)) {
foreach($post->retweeted_status->entities->media AS $media) {
switch($media->type) {
case 'photo':
- $_REQUEST['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $_REQUEST['body']);
- $has_picture = true;
+ //$_REQUEST['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $_REQUEST['body']);
+ //$has_picture = true;
+ $_REQUEST['body'] = str_replace($media->url, "", $_REQUEST['body']);
+ $picture = $media->media_url_https;
break;
}
}
}
- $converted = twitter_expand_entities($a, $_REQUEST['body'], $post->retweeted_status, true, $has_picture);
+ $converted = twitter_expand_entities($a, $_REQUEST['body'], $post->retweeted_status, true, $picture);
$_REQUEST['body'] = $converted["body"];
- $_REQUEST['body'] = "[share author='".$post->retweeted_status->user->name.
- "' profile='https://twitter.com/".$post->retweeted_status->user->screen_name.
- "' avatar='".$post->retweeted_status->user->profile_image_url_https.
- "' link='https://twitter.com/".$post->retweeted_status->user->screen_name."/status/".$post->retweeted_status->id_str."']".
- $_REQUEST['body'];
+ if (function_exists("share_header"))
+ $_REQUEST['body'] = share_header($post->retweeted_status->user->name, "https://twitter.com/".$post->retweeted_status->user->screen_name,
+ $post->retweeted_status->user->profile_image_url_https, "",
+ datetime_convert('UTC','UTC',$post->retweeted_status->created_at),
+ "https://twitter.com/".$post->retweeted_status->user->screen_name."/status/".$post->retweeted_status->id_str).
+ $_REQUEST['body'];
+ else
+ $_REQUEST['body'] = "[share author='".$post->retweeted_status->user->name.
+ "' profile='https://twitter.com/".$post->retweeted_status->user->screen_name.
+ "' avatar='".$post->retweeted_status->user->profile_image_url_https.
+ "' posted='".datetime_convert('UTC','UTC',$post->retweeted_status->created_at).
+ "' link='https://twitter.com/".$post->retweeted_status->user->screen_name."/status/".$post->retweeted_status->id_str."']".
+ $_REQUEST['body'];
+
$_REQUEST['body'] .= "[/share]";
} else {
$_REQUEST["body"] = $post->text;
+ $picture = "";
+
if (is_array($post->entities->media)) {
foreach($post->entities->media AS $media) {
switch($media->type) {
case 'photo':
- $_REQUEST['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $_REQUEST['body']);
- $has_picture = true;
+ //$_REQUEST['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $_REQUEST['body']);
+ //$has_picture = true;
+ $_REQUEST['body'] = str_replace($media->url, "", $_REQUEST['body']);
+ $picture = $media->media_url_https;
break;
}
}
}
- $converted = twitter_expand_entities($a, $_REQUEST["body"], $post, true, $has_picture);
+ $converted = twitter_expand_entities($a, $_REQUEST["body"], $post, true, $picture);
$_REQUEST['body'] = $converted["body"];
}
}
}
+function twitter_fix_avatar($avatar) {
+ require_once("include/Photo.php");
+
+ $new_avatar = str_replace("_normal.", ".", $avatar);
+
+ $info = get_photo_info($new_avatar);
+ if (!$info)
+ $new_avatar = $avatar;
+
+ return $new_avatar;
+}
+
function twitter_fetch_contact($uid, $contact, $create_user) {
- // Check if the unique contact is existing
- // To-Do: only update once a while
- $r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
- dbesc(normalise_link("https://twitter.com/".$contact->screen_name)));
+ if ($contact->id_str == "")
+ return(-1);
- if (count($r) == 0)
- q("INSERT INTO unique_contacts (url, name, nick, avatar) VALUES ('%s', '%s', '%s', '%s')",
- dbesc(normalise_link("https://twitter.com/".$contact->screen_name)),
- dbesc($contact->name),
- dbesc($contact->screen_name),
- dbesc($contact->profile_image_url_https));
- else
- q("UPDATE unique_contacts SET name = '%s', nick = '%s', avatar = '%s' WHERE url = '%s'",
- dbesc($contact->name),
- dbesc($contact->screen_name),
- dbesc($contact->profile_image_url_https),
- dbesc(normalise_link("https://twitter.com/".$contact->screen_name)));
+ $avatar = twitter_fix_avatar($contact->profile_image_url_https);
+
+ if (function_exists("update_gcontact"))
+ update_gcontact(array("url" => "https://twitter.com/".$contact->screen_name,
+ "network" => NETWORK_TWITTER, "photo" => $avatar, "hide" => true,
+ "name" => $contact->name, "nick" => $contact->screen_name,
+ "location" => $contact->location, "about" => $contact->description,
+ "addr" => $contact->screen_name."@twitter.com", "generation" => 2));
+ else {
+ // Old Code
+ $r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
+ dbesc(normalise_link("https://twitter.com/".$contact->screen_name)));
+
+ if (count($r) == 0)
+ q("INSERT INTO unique_contacts (url, name, nick, avatar) VALUES ('%s', '%s', '%s', '%s')",
+ dbesc(normalise_link("https://twitter.com/".$contact->screen_name)),
+ dbesc($contact->name),
+ dbesc($contact->screen_name),
+ dbesc($avatar));
+ else
+ q("UPDATE unique_contacts SET name = '%s', nick = '%s', avatar = '%s' WHERE url = '%s'",
+ dbesc($contact->name),
+ dbesc($contact->screen_name),
+ dbesc($avatar),
+ dbesc(normalise_link("https://twitter.com/".$contact->screen_name)));
+
+ if (DB_UPDATE_VERSION >= "1177")
+ q("UPDATE `unique_contacts` SET `location` = '%s', `about` = '%s' WHERE url = '%s'",
+ dbesc($contact->location),
+ dbesc($contact->description),
+ dbesc(normalise_link("https://twitter.com/".$contact->screen_name)));
+ }
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
intval($uid), dbesc("twitter::".$contact->id_str));
q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
`name`, `nick`, `photo`, `network`, `rel`, `priority`,
`writable`, `blocked`, `readonly`, `pending` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0) ",
intval($uid),
dbesc(datetime_convert()),
dbesc("https://twitter.com/".$contact->screen_name),
dbesc("twitter::".$contact->id_str),
dbesc($contact->name),
dbesc($contact->screen_name),
- dbesc($contact->profile_image_url_https),
+ dbesc($avatar),
dbesc(NETWORK_TWITTER),
intval(CONTACT_IS_FRIEND),
intval(1),
require_once("Photo.php");
- $photos = import_profile_photo($contact->profile_image_url_https,$uid,$contact_id);
+ $photos = import_profile_photo($avatar,$uid,$contact_id);
q("UPDATE `contact` SET `photo` = '%s',
`thumb` = '%s',
intval($contact_id)
);
+ if (DB_UPDATE_VERSION >= "1177")
+ q("UPDATE `contact` SET `location` = '%s',
+ `about` = '%s'
+ WHERE `id` = %d",
+ dbesc($contact->location),
+ dbesc($contact->description),
+ intval($contact_id)
+ );
+
} else {
// update profile photos once every two weeks as we have no notification of when they change.
require_once("Photo.php");
- $photos = import_profile_photo($contact->profile_image_url_https, $uid, $r[0]['id']);
+ $photos = import_profile_photo($avatar, $uid, $r[0]['id']);
q("UPDATE `contact` SET `photo` = '%s',
`thumb` = '%s',
dbesc($contact->screen_name),
intval($r[0]['id'])
);
+
+ if (DB_UPDATE_VERSION >= "1177")
+ q("UPDATE `contact` SET `location` = '%s',
+ `about` = '%s'
+ WHERE `id` = %d",
+ dbesc($contact->location),
+ dbesc($contact->description),
+ intval($r[0]['id'])
+ );
}
}
return $contact_id;
}
-function twitter_expand_entities($a, $body, $item, $no_tags = false, $dontincludemedia) {
+function twitter_expand_entities($a, $body, $item, $no_tags = false, $picture) {
require_once("include/oembed.php");
require_once("include/network.php");
$footerlink = "[url=".$expanded_url."]".$expanded_url."[/url]";
$body = str_replace($url->url, $footerlink, $body);
- } elseif (($oembed_data->type == "photo") AND isset($oembed_data->url) AND !$dontincludemedia) {
+ //} elseif (($oembed_data->type == "photo") AND isset($oembed_data->url) AND !$dontincludemedia) {
+ } elseif (($oembed_data->type == "photo") AND isset($oembed_data->url)) {
$body = str_replace($url->url,
"[url=".$expanded_url."][img]".$oembed_data->url."[/img][/url]",
$body);
- $dontincludemedia = true;
+ //$dontincludemedia = true;
} elseif ($oembed_data->type != "link")
$body = str_replace($url->url,
"[url=".$expanded_url."]".$expanded_url."[/url]",
else {
$img_str = fetch_url($expanded_url, true, $redirects, 4);
- $tempfile = tempnam(get_config("system","temppath"), "cache");
+ $tempfile = tempnam(get_temppath(), "cache");
file_put_contents($tempfile, $img_str);
$mime = image_type_to_mime_type(exif_imagetype($tempfile));
unlink($tempfile);
if (substr($mime, 0, 6) == "image/") {
$type = "photo";
$body = str_replace($url->url, "[img]".$expanded_url."[/img]", $body);
- $dontincludemedia = true;
+ //$dontincludemedia = true;
} else {
$type = $oembed_data->type;
$footerurl = $expanded_url;
}
if ($footerurl != "")
- $footer = add_page_info($footerurl);
+ $footer = add_page_info($footerurl, false, $picture);
if (($footerlink != "") AND (trim($footer) != "")) {
$removedlink = trim(str_replace($footerlink, "", $body));
- if (strstr($body, $removedlink))
+ if (($removedlink == "") OR strstr($body, $removedlink))
$body = $removedlink;
$body .= $footer;
}
+ if (($footer == "") AND ($picture != ""))
+ $body .= "\n\n[img]".$picture."[/img]\n";
+ elseif (($footer == "") AND ($picture == ""))
+ $body = add_page_info_to_body($body);
+
if ($no_tags)
return(array("body" => $body, "tags" => ""));
if (count($r)) {
$postarray['thr-parent'] = $r[0]["uri"];
$postarray['parent-uri'] = $r[0]["parent-uri"];
+ $postarray['parent'] = $r[0]["parent"];
+ $postarray['object-type'] = ACTIVITY_OBJ_COMMENT;
} else {
$r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($parent),
if (count($r)) {
$postarray['thr-parent'] = $r[0]['uri'];
$postarray['parent-uri'] = $r[0]['parent-uri'];
+ $postarray['parent'] = $r[0]['parent'];
+ $postarray['object-type'] = ACTIVITY_OBJ_COMMENT;
} else {
$postarray['thr-parent'] = $postarray['uri'];
$postarray['parent-uri'] = $postarray['uri'];
+ $postarray['object-type'] = ACTIVITY_OBJ_NOTE;
}
}
} else
return(array());
}
- } else
+ // Don't create accounts of people who just comment something
+ $create_user = false;
+ } else {
$postarray['parent-uri'] = $postarray['uri'];
+ $postarray['object-type'] = ACTIVITY_OBJ_NOTE;
+ }
if ($contactid == 0) {
$contactid = twitter_fetch_contact($uid, $post->user, $create_user);
$postarray['owner-name'] = $post->user->name;
$postarray['owner-link'] = "https://twitter.com/".$post->user->screen_name;
- $postarray['owner-avatar'] = $post->user->profile_image_url_https;
+ $postarray['owner-avatar'] = twitter_fix_avatar($post->user->profile_image_url_https);
}
if(($contactid == 0) AND !$only_existing_contact)
$postarray['body'] = $post->text;
+ $picture = "";
+
// media
if (is_array($post->entities->media)) {
foreach($post->entities->media AS $media) {
switch($media->type) {
case 'photo':
- $postarray['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $postarray['body']);
- $has_picture = true;
+ //$postarray['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $postarray['body']);
+ //$has_picture = true;
+ $postarray['body'] = str_replace($media->url, "", $postarray['body']);
+ $postarray['object-type'] = ACTIVITY_OBJ_IMAGE;
+ $picture = $media->media_url_https;
break;
default:
$postarray['body'] .= print_r($media, true);
}
}
- $converted = twitter_expand_entities($a, $postarray['body'], $post, false, $has_picture);
+ $converted = twitter_expand_entities($a, $postarray['body'], $post, false, $picture);
$postarray['body'] = $converted["body"];
$postarray['tag'] = $converted["tags"];
$postarray['body'] = $post->retweeted_status->text;
+ $picture = "";
+
// media
if (is_array($post->retweeted_status->entities->media)) {
foreach($post->retweeted_status->entities->media AS $media) {
switch($media->type) {
case 'photo':
- $postarray['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $postarray['body']);
- $has_picture = true;
+ //$postarray['body'] = str_replace($media->url, "\n\n[img]".$media->media_url_https."[/img]\n", $postarray['body']);
+ //$has_picture = true;
+ $postarray['body'] = str_replace($media->url, "", $postarray['body']);
+ $postarray['object-type'] = ACTIVITY_OBJ_IMAGE;
+ $picture = $media->media_url_https;
break;
default:
$postarray['body'] .= print_r($media, true);
}
}
- $converted = twitter_expand_entities($a, $postarray['body'], $post->retweeted_status, false, $has_picture);
+ $converted = twitter_expand_entities($a, $postarray['body'], $post->retweeted_status, false, $picture);
$postarray['body'] = $converted["body"];
$postarray['tag'] = $converted["tags"];
$postarray['body'] = "[share author='".$post->retweeted_status->user->name.
"' profile='https://twitter.com/".$post->retweeted_status->user->screen_name.
"' avatar='".$post->retweeted_status->user->profile_image_url_https.
+ "' posted='".datetime_convert('UTC','UTC',$post->retweeted_status->created_at).
"' link='https://twitter.com/".$post->retweeted_status->user->screen_name."/status/".$post->retweeted_status->id_str."']".
$postarray['body'];
$postarray['body'] .= "[/share]";
// Let retweets look like wall-to-wall posts
$postarray['author-name'] = $post->retweeted_status->user->name;
$postarray['author-link'] = "https://twitter.com/".$post->retweeted_status->user->screen_name;
- $postarray['author-avatar'] = $post->retweeted_status->user->profile_image_url_https;
+ $postarray['author-avatar'] = twitter_fix_avatar($post->retweeted_status->user->profile_image_url_https);
//if (($post->retweeted_status->user->screen_name != "") AND ($post->retweeted_status->id_str != "")) {
// $postarray['plink'] = "https://twitter.com/".$post->retweeted_status->user->screen_name."/status/".$post->retweeted_status->id_str;
// $postarray['uri'] = "twitter::".$post->retweeted_status->id_str;
function twitter_checknotification($a, $uid, $own_id, $top_item, $postarray) {
+ // 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)
);
'to_email' => $user[0]['email'],
'uid' => $user[0]['uid'],
'item' => $postarray,
- 'link' => $a->get_baseurl() . '/display/' . $user[0]['nickname'] . '/' . $top_item,
+ 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
'source_name' => $postarray['author-name'],
'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
}
}
+function twitter_fetchparentposts($a, $uid, $post, $connection, $self, $own_id) {
+ logger("twitter_fetchparentposts: Fetching for user ".$uid." and post ".$post->id_str, LOGGER_DEBUG);
+
+ $posts = array();
+
+ while ($post->in_reply_to_status_id_str != "") {
+ $parameters = array("trim_user" => false, "id" => $post->in_reply_to_status_id_str);
+
+ $post = $connection->get('statuses/show', $parameters);
+
+ if (!count($post)) {
+ logger("twitter_fetchparentposts: Can't fetch post ".$parameters->id, LOGGER_DEBUG);
+ break;
+ }
+
+ $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc("twitter::".$post->id_str),
+ intval($uid)
+ );
+
+ if (count($r))
+ break;
+
+ $posts[] = $post;
+ }
+
+ logger("twitter_fetchparentposts: Fetching ".count($posts)." parents", LOGGER_DEBUG);
+
+ $posts = array_reverse($posts);
+
+ if (count($posts)) {
+ foreach ($posts as $post) {
+ $postarray = twitter_createpost($a, $uid, $post, $self, false, false);
+
+ if (trim($postarray['body']) == "")
+ continue;
+
+ $item = item_store($postarray);
+ $postarray["id"] = $item;
+
+ logger('twitter_fetchparentpost: User '.$self["nick"].' posted parent timeline item '.$item);
+
+ if ($item AND !function_exists("check_item_notification"))
+ twitter_checknotification($a, $uid, $own_id, $item, $postarray);
+ }
+ }
+}
+
function twitter_fetchhometimeline($a, $uid) {
$ckey = get_config('twitter', 'consumerkey');
$csecret = get_config('twitter', 'consumersecret');
$otoken = get_pconfig($uid, 'twitter', 'oauthtoken');
$osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
$create_user = get_pconfig($uid, 'twitter', 'create_user');
+ $mirror_posts = get_pconfig($uid, 'twitter', 'mirror_posts');
logger("twitter_fetchhometimeline: Fetching for user ".$uid, LOGGER_DEBUG);
+ $application_name = get_config('twitter', 'application_name');
+
+ if ($application_name == "")
+ $application_name = $a->get_hostname();
+
require_once('library/twitteroauth.php');
require_once('include/items.php');
if (count($posts)) {
foreach ($posts as $post) {
- if ($post->id_str > $lastid)
+ if ($post->id_str > $lastid) {
$lastid = $post->id_str;
+ set_pconfig($uid, 'twitter', 'lasthometimelineid', $lastid);
+ }
if ($first_time)
continue;
+ if (stristr($post->source, $application_name) && $post->user->screen_name == $own_id) {
+ logger("twitter_fetchhometimeline: Skip previously sended post", LOGGER_DEBUG);
+ continue;
+ }
+
+ if ($mirror_posts && $post->user->screen_name == $own_id && $post->in_reply_to_status_id_str == "") {
+ logger("twitter_fetchhometimeline: Skip post that will be mirrored", LOGGER_DEBUG);
+ continue;
+ }
+
+ if ($post->in_reply_to_status_id_str != "")
+ twitter_fetchparentposts($a, $uid, $post, $connection, $self, $own_id);
+
$postarray = twitter_createpost($a, $uid, $post, $self, $create_user, true);
if (trim($postarray['body']) == "")
continue;
$item = item_store($postarray);
+ $postarray["id"] = $item;
logger('twitter_fetchhometimeline: User '.$self["nick"].' posted home timeline item '.$item);
- if ($item != 0)
+ if ($item AND !function_exists("check_item_notification"))
twitter_checknotification($a, $uid, $own_id, $item, $postarray);
}
if ($first_time)
continue;
+ if ($post->in_reply_to_status_id_str != "")
+ twitter_fetchparentposts($a, $uid, $post, $connection, $self, $own_id);
+
$postarray = twitter_createpost($a, $uid, $post, $self, false, false);
if (trim($postarray['body']) == "")
continue;
$item = item_store($postarray);
+ $postarray["id"] = $item;
+
+ if ($item AND function_exists("check_item_notification"))
+ check_item_notification($item, $uid, NOTIFY_TAGSELF);
+
+ if (!isset($postarray["parent"]) OR ($postarray["parent"] == 0))
+ $postarray["parent"] = $item;
logger('twitter_fetchhometimeline: User '.$self["nick"].' posted mention timeline item '.$item);
dbesc($postarray['uri']),
intval($uid)
);
- if (count($r))
+ if (count($r)) {
$item = $r[0]['id'];
- }
+ $parent_id = $r[0]['parent'];
+ }
+ } else
+ $parent_id = $postarray['parent'];
- if ($item != 0) {
+ if (($item != 0) AND !function_exists("check_item_notification")) {
require_once('include/enotify.php');
notification(array(
'type' => NOTIFY_TAGSELF,
'to_email' => $u[0]['email'],
'uid' => $u[0]['uid'],
'item' => $postarray,
- 'link' => $a->get_baseurl() . '/display/' . $u[0]['nickname'] . '/' . $item,
+ 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($item)),
'source_name' => $postarray['author-name'],
'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
'verb' => ACTIVITY_TAG,
- 'otype' => 'item'
+ 'otype' => 'item',
+ 'parent' => $parent_id
));
}
}