From 56d64316f457c85141e35356a61a4d352ed9f24c Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 18:17:35 -0700 Subject: [PATCH] diaspora photos ? --- boot.php | 4 +- database.sql | 4 +- include/Photo.php | 13 ++++- include/diaspora.php | 116 ++++++++++++++++++++++++++++++++++++- include/group.php | 5 +- include/poller.php | 8 ++- mod/receive.php | 3 + update.php | 19 +++++- view/api_timeline_atom.tpl | 2 +- view/diaspora_photo.tpl | 13 +++++ 10 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 view/diaspora_photo.tpl diff --git a/boot.php b/boot.php index b0ff7830c..16b8f9c85 100644 --- a/boot.php +++ b/boot.php @@ -7,9 +7,9 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1080' ); +define ( 'FRIENDIKA_VERSION', '2.2.1081' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1081 ); +define ( 'DB_UPDATE_VERSION', 1082 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index 605433e6e..f659e8049 100644 --- a/database.sql +++ b/database.sql @@ -267,6 +267,7 @@ CREATE TABLE IF NOT EXISTS `photo` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `uid` int(10) unsigned NOT NULL, `contact-id` int(10) unsigned NOT NULL, + `guid` char(64) NOT NULL, `resource-id` char(255) NOT NULL, `created` datetime NOT NULL, `edited` datetime NOT NULL, @@ -288,7 +289,8 @@ CREATE TABLE IF NOT EXISTS `photo` ( KEY `resource-id` (`resource-id`), KEY `album` (`album`), KEY `scale` (`scale`), - KEY `profile` (`profile`) + KEY `profile` (`profile`), + KEY `guid` (`guid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -------------------------------------------------------- diff --git a/include/Photo.php b/include/Photo.php index de4c3d9e0..1450374ff 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -185,11 +185,20 @@ class Photo { public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') { + $r = q("select `guid` from photo where `resource-id` = '%s' and `guid` != '' limit 1", + dbesc($rid) + ); + if(count($r)) + $guid = $r[0]['guid']; + else + $guid = get_guid(); + $r = q("INSERT INTO `photo` - ( `uid`, `contact-id`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` ) - VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )", + ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` ) + VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )", intval($uid), intval($cid), + dbesc($guid), dbesc($rid), dbesc(datetime_convert()), dbesc(datetime_convert()), diff --git a/include/diaspora.php b/include/diaspora.php index 345ea5562..a1edd08a6 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -597,6 +597,57 @@ function diaspora_comment($importer,$xml,$msg) { } +function diaspora_photo($importer,$xml,$msg) { + + $remote_photo_path = notags(unxmlify($xml->remote_photo_path)); + + $remote_photo_name = notags(unxmlify($xml->remote_photo_name)); + + $status_message_guid = notags(unxmlify($xml->status_message_guid)); + + $guid = notags(unxmlify($xml->guid)); + + $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); + + $public = notags(unxmlify($xml->public)); + + $created_at = notags(unxmlify($xml_created_at)); + + + $contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']); + if(! $contact) + return; + + if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + logger('diaspora_photo: Ignoring this author.'); + http_status_exit(202); + // NOTREACHED + } + + $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", + intval($importer['uid']), + dbesc($status_message_guid) + ); + if(! count($r)) { + logger('diaspora_photo: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid); + return; + } + $parent_item = $r[0]; + + $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n"; + + $r = q("update item set `body` = '%s' where `id` = %d and `uid` = %d limit 1", + dbesc($link_text . $parent_item['body']), + intval($parent_item['id']), + intval($parent_item['uid']) + ); + + return; +} + + + + function diaspora_like($importer,$xml,$msg) { $a = get_app(); @@ -847,7 +898,25 @@ function diaspora_send_status($item,$owner,$contact) { $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); $theiraddr = $contact['addr']; - $body = xmlify(bb2diaspora($item['body'])); + $images = array(); + + $body = $item['body']; + + $cnt = preg_match_all('|\[img\](.*?)\[\/img\]|',$body,$matches,PREG_SET_ORDER); + if($cnt) { + foreach($matches as $mtch) { + $detail = array(); + $detail['str'] = $mtch[0]; + $detail['path'] = dirname($mtch[1]); + $detail['file'] = basename($mtch[1]); + $detail['guid'] = $item['guid']; + $detail['handle'] = $myaddr; + $images[] = $detail; + $body = str_replace($detail['str'],'',$body); + } + } + + $body = xmlify(bb2diaspora($body)); $public = (($item['private']) ? 'false' : 'true'); require_once('include/datetime.php'); @@ -869,10 +938,55 @@ function diaspora_send_status($item,$owner,$contact) { post_url($contact['notify'] . '/',$slap); $return_code = $a->get_curl_code(); logger('diaspora_send_status: returns: ' . $return_code); + + if(count($images)) { + diaspora_send_images($item,$owner,$contact,$images); + } + return $return_code; } +function diaspora_send_images($item,$owner,$contact,$images) { + $a = get_app(); + if(! count($images)) + return; + $mysite = substr($a->get_baseurl(),strpos($a->get_baseurl(),'://') + 3) . '/photo'; + + $tpl = get_markup_template('diaspora_photo.tpl'); + foreach($images as $image) { + if(! stristr($image['path'],$mysite)) + continue; + $resource = str_replace('.jpg','',$image['file']); + $resource = substr($resource,0,strpos($resource,'-')); + + $r = q("select * from photo where `resource-id` = '%s' and `uid` = %d limit 1", + dbesc($resource), + intval($owner['uid']) + ); + if(! count($r)) + continue; + $public = (($r[0]['allow_cid'] || $r[0]['allow_gid'] || $r[0]['deny_cid'] || $r[0]['deny_gid']) ? 'false' : 'true' ); + $msg = replace_macros($tpl,array( + '$path' => xmlify($image['path']), + '$filename' => xmlify($image['file']), + '$msg_guid' => xmlify($image['guid']), + '$guid' => xmlify($r[0]['guid']), + '$handle' => xmlify($image['handle']), + '$public' => xmlify($public), + '$created_at' => xmlify('UTC','UTC',$r[0]['created'],'Y-m-d h:i:s \U\T\C') + )); + + logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + + post_url($contact['notify'] . '/',$slap); + $return_code = $a->get_curl_code(); + logger('diaspora_send_photo: returns: ' . $return_code); + } + +} + function diaspora_send_followup($item,$owner,$contact) { $a = get_app(); diff --git a/include/group.php b/include/group.php index 1ebae7b7b..5e3a1511a 100644 --- a/include/group.php +++ b/include/group.php @@ -124,9 +124,10 @@ function group_public_members($gid) { $r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member` LEFT JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id` WHERE `gid` = %d AND `group_member`.`uid` = %d - AND `contact`.`network` != 'dfrn' AND `contact`.`network` != 'mail' AND `contact`.`network` != 'face' ", + AND `contact`.`network` = '%' AND `contact`.`notify` != '' ", intval($gid), - intval(local_user()) + intval(local_user()), + dbesc(NETWORK_OSTATUS) ); if(count($r)) $ret = count($r); diff --git a/include/poller.php b/include/poller.php index 651736a99..e80b696bf 100644 --- a/include/poller.php +++ b/include/poller.php @@ -82,12 +82,18 @@ function poller_run($argv, $argc){ if(! $restart) proc_run('php','include/cronhooks.php'); + // Only poll from those with suitable relationships, + // and which have a polling address and ignore Diaspora since + // we are unable to match those posts with a Diaspora GUID and prevent duplicates. + $contacts = q("SELECT `id` FROM `contact` WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != '' + AND `network` != '%s' $sql_extra AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()", intval(CONTACT_IS_SHARING), - intval(CONTACT_IS_FRIEND) + intval(CONTACT_IS_FRIEND), + dbesc(NETWORK_DIASPORA) ); if(! count($contacts)) { diff --git a/mod/receive.php b/mod/receive.php index c3738c143..b50774933 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -63,6 +63,9 @@ function receive_post(&$a) { elseif($xmlbase->retraction) { diaspora_retraction($importer,$xmlbase->retraction,$msg); } + elseif($xmlbase->photo) { + diaspora_photo($importer,$xmlbase->photo,$msg); + } else { logger('mod-diaspora: unknown message type: ' . print_r($xmlbase,true)); } diff --git a/update.php b/update.php index adfb5fe02..ef036008f 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ true - + {{ endfor }} diff --git a/view/diaspora_photo.tpl b/view/diaspora_photo.tpl new file mode 100644 index 000000000..75ca7f15c --- /dev/null +++ b/view/diaspora_photo.tpl @@ -0,0 +1,13 @@ + + + + $path + $filename + $msg_guid + $guid + $handle + $public + $created_at + + + \ No newline at end of file