From d261a47f76a5176bf62aca797ebaefd4ad160256 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Thu, 14 Jun 2012 06:50:22 -0400 Subject: [PATCH 01/19] new plugin: profilehome redirects from homepage to a selectable profile. --- profilehome/admin.tpl | 2 ++ profilehome/profilehome.php | 50 +++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100755 profilehome/admin.tpl create mode 100755 profilehome/profilehome.php diff --git a/profilehome/admin.tpl b/profilehome/admin.tpl new file mode 100755 index 00000000..cf7bc1a7 --- /dev/null +++ b/profilehome/admin.tpl @@ -0,0 +1,2 @@ +{{ inc field_select.tpl with $field=$user }}{{ endinc }} +
\ No newline at end of file diff --git a/profilehome/profilehome.php b/profilehome/profilehome.php new file mode 100755 index 00000000..ad0421b8 --- /dev/null +++ b/profilehome/profilehome.php @@ -0,0 +1,50 @@ + + */ + + + +function profilehome_install() { + register_hook('home_content', 'addon/profilehome/profilehome.php', 'profilehome_home'); + logger("installed profilehome"); +} + +function profilehome_uninstall() { + unregister_hook('home_content', 'addon/profilehome/profilehome.php', 'profilehome_home'); + logger("removed profilehome"); +} + +function profilehome_home(&$a, &$o){ + $user = get_config("profilehome","user"); + if ($user!==false) goaway($a->get_baseurl()."/profile/".$user); +} + +function profilehome_plugin_admin(&$a, &$o){ + $r = q("SELECT nickname, username FROM user WHERE verified=1 AND account_removed=0 AND account_expired=0"); + $users = array("##no##"=>"No redirect (use default home)"); + foreach ($r as $u) { + $users[$u['nickname']] = $u['username']." (".$u['nickname'].")"; + } + + $user = get_config("profilehome","user"); + + $t = file_get_contents(dirname(__file__)."/admin.tpl"); + $o = ''; + $o .= replace_macros( $t, array( + '$submit' => t('Submit'), + '$user' => array('user', t('Profile to use as home page'), $user, "", $users), + )); +} + +function profilehome_plugin_admin_post(&$a){ + check_form_security_token('profilehomesave'); + + $user = ((x($_POST, 'user')) ? notags(trim($_POST['user'])) : false); + if ($user=='##no##') $user=false; + set_config('profilehome', 'user', $user); + info( t('Profile home settings updated.') .EOL); +} \ No newline at end of file From 9bbadf951c0d290821342b91a1a84a2e23ae43e3 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Wed, 11 Jul 2012 03:42:05 -0400 Subject: [PATCH 02/19] move profilehome to friendicablog repo --- profilehome/admin.tpl | 2 -- profilehome/profilehome.php | 50 ------------------------------------- 2 files changed, 52 deletions(-) delete mode 100755 profilehome/admin.tpl delete mode 100755 profilehome/profilehome.php diff --git a/profilehome/admin.tpl b/profilehome/admin.tpl deleted file mode 100755 index cf7bc1a7..00000000 --- a/profilehome/admin.tpl +++ /dev/null @@ -1,2 +0,0 @@ -{{ inc field_select.tpl with $field=$user }}{{ endinc }} -
\ No newline at end of file diff --git a/profilehome/profilehome.php b/profilehome/profilehome.php deleted file mode 100755 index ad0421b8..00000000 --- a/profilehome/profilehome.php +++ /dev/null @@ -1,50 +0,0 @@ - - */ - - - -function profilehome_install() { - register_hook('home_content', 'addon/profilehome/profilehome.php', 'profilehome_home'); - logger("installed profilehome"); -} - -function profilehome_uninstall() { - unregister_hook('home_content', 'addon/profilehome/profilehome.php', 'profilehome_home'); - logger("removed profilehome"); -} - -function profilehome_home(&$a, &$o){ - $user = get_config("profilehome","user"); - if ($user!==false) goaway($a->get_baseurl()."/profile/".$user); -} - -function profilehome_plugin_admin(&$a, &$o){ - $r = q("SELECT nickname, username FROM user WHERE verified=1 AND account_removed=0 AND account_expired=0"); - $users = array("##no##"=>"No redirect (use default home)"); - foreach ($r as $u) { - $users[$u['nickname']] = $u['username']." (".$u['nickname'].")"; - } - - $user = get_config("profilehome","user"); - - $t = file_get_contents(dirname(__file__)."/admin.tpl"); - $o = ''; - $o .= replace_macros( $t, array( - '$submit' => t('Submit'), - '$user' => array('user', t('Profile to use as home page'), $user, "", $users), - )); -} - -function profilehome_plugin_admin_post(&$a){ - check_form_security_token('profilehomesave'); - - $user = ((x($_POST, 'user')) ? notags(trim($_POST['user'])) : false); - if ($user=='##no##') $user=false; - set_config('profilehome', 'user', $user); - info( t('Profile home settings updated.') .EOL); -} \ No newline at end of file From ec95e5a2dacc4e9f04e75c22a968f781a5a09239 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Dec 2012 03:24:55 +0100 Subject: [PATCH 03/19] forumlist: added a "div" for styling reasons privacy_image_cache: If a picture comes from another picture cache (like facebook) take the original picture --- forumlist/forumlist.php | 2 +- privacy_image_cache/privacy_image_cache.php | 28 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/forumlist/forumlist.php b/forumlist/forumlist.php index 37752462..95ae9890 100644 --- a/forumlist/forumlist.php +++ b/forumlist/forumlist.php @@ -74,7 +74,7 @@ function forumlist_network_mod_init($a,$b) { if(count($contacts)) { foreach($contacts as $contact) { - $forumlist .= '' . $contact['url'] . ' ' . $contact["name"]."
"; + $forumlist .= '
' . $contact['url'] . ' ' . $contact["name"]."
"; } } else { diff --git a/privacy_image_cache/privacy_image_cache.php b/privacy_image_cache/privacy_image_cache.php index 3be42620..b9367e49 100644 --- a/privacy_image_cache/privacy_image_cache.php +++ b/privacy_image_cache/privacy_image_cache.php @@ -119,6 +119,15 @@ function privacy_image_cache_init() { // It shouldn't happen but it does - spaces in URL $_REQUEST['url'] = str_replace(" ", "+", $_REQUEST['url']); + // if the picture seems to be from another picture cache then take the original source + $queryvar = privacy_image_cache_parse_query($_REQUEST['url']); + if ($queryvar['url'] != "") + $_REQUEST['url'] = urldecode($queryvar['url']); + + // if fetching facebook pictures don't fetch the thumbnail but the big one + if (strpos($_REQUEST['url'], ".fbcdn.net/") and (substr($_REQUEST['url'], -6) == "_s.jpg")) + $_REQUEST['url'] = substr($_REQUEST['url'], 0, -6)."_n.jpg"; + $img_str = fetch_url($_REQUEST['url'],true); $tempfile = tempnam(get_config("system","temppath"), "cache"); @@ -372,3 +381,22 @@ function privacy_image_cache_plugin_admin_post(&$a = null, &$o = null){ q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%"'); } } + +function privacy_image_cache_parse_query($var) { + /** + * Use this function to parse out the query array element from + * the output of parse_url(). + */ + $var = parse_url($var, PHP_URL_QUERY); + $var = html_entity_decode($var); + $var = explode('&', $var); + $arr = array(); + + foreach($var as $val) { + $x = explode('=', $val); + $arr[$x[0]] = $x[1]; + } + + unset($val, $x, $var); + return $arr; +} From dc77f3683ed83b8d8ec783805eecac962f341c03 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 25 Dec 2012 12:51:28 +0100 Subject: [PATCH 04/19] privacy_image_cache: Minor code beauty changes --- privacy_image_cache/privacy_image_cache.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/privacy_image_cache/privacy_image_cache.php b/privacy_image_cache/privacy_image_cache.php index b9367e49..d98c6b6d 100644 --- a/privacy_image_cache/privacy_image_cache.php +++ b/privacy_image_cache/privacy_image_cache.php @@ -328,14 +328,12 @@ function privacy_image_cache_cron(&$a = null, &$b = null) { logger("Purging old Cache of the Privacy Image Cache", LOGGER_DEBUG); q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime); - set_config('pi_cache', 'last_delete', $time); clear_cache($a->get_basepath(), $a->get_basepath()."/privacy_image_cache"); + + set_config('pi_cache', 'last_delete', $time); } - - - /** * @param App $a * @param null|object $o From b87ef672f18443a8d0a8f6ec05dd895533471999 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 28 Dec 2012 10:53:32 -0500 Subject: [PATCH 05/19] communityhome: load 'home.html', more config settings, remove twillingham folder update README --- communityhome/README.md | 23 ++ communityhome/communityhome.css | 3 +- communityhome/communityhome.php | 263 ++++++++++---------- communityhome/twillingham/README | 3 - communityhome/twillingham/communityhome.php | 107 -------- communityhome/view/directory_item.tpl | 4 +- 6 files changed, 164 insertions(+), 239 deletions(-) delete mode 100644 communityhome/twillingham/README delete mode 100644 communityhome/twillingham/communityhome.php diff --git a/communityhome/README.md b/communityhome/README.md index 3cf610ec..21f2a946 100755 --- a/communityhome/README.md +++ b/communityhome/README.md @@ -9,3 +9,26 @@ choosed to be in site directory), last ten public photos and last ten In main content is shown the community stream. This plugin doesn't honour your community page visibility site setting: the community stream is shown also if you have choose to not show the community page. + +If 'home.html' is found in your friendica root, its content is inserted +before community stream + +Each elements can be show or not. At the moment, there is no admin page +for settings, so this settings must be added to yout .htconfig.php + + + $a->config['communityhome']['showcommunitystream'] = true; + $a->config['communityhome']['showlastlike'] = true; + $a->config['communityhome']['showlastphotos'] = true; + $a->config['communityhome']['showactiveusers'] = true; + $a->config['communityhome']['showlastusers'] = true; + +If you don't want to show something, set it to false. + +Note: +----- + +- Default is "false". With no settings in .htconfig.php, nothing is +shown, except login form and content of 'home.html' + +- Active users query can be heavy for db, and on some system don't work diff --git a/communityhome/communityhome.css b/communityhome/communityhome.css index 2efb6ebd..45a65537 100755 --- a/communityhome/communityhome.css +++ b/communityhome/communityhome.css @@ -39,4 +39,5 @@ aside .directory-photo-img { max-width: 48px; max-height: 48px; } aside #likes { margin: 0px; padding: 0px; list-style: none; } -aside #login-extra-links { overflow: auto; width: 100%; padding-top:120px;} +aside #div_id_remember { overflow: auto; width: 100%; padding-top:120px;} +#login_openid input { width: 160px; } diff --git a/communityhome/communityhome.php b/communityhome/communityhome.php index 8b831888..e2c3deeb 100755 --- a/communityhome/communityhome.php +++ b/communityhome/communityhome.php @@ -35,145 +35,151 @@ function communityhome_home(&$a, &$o){ $aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true); // last 12 users - $aside['$lastusers_title'] = t('Latest users'); - $aside['$lastusers_items'] = array(); - $sql_extra = ""; - $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " ); - $order = " ORDER BY `register_date` DESC "; + if (get_config('communityhome','showlastusers')===true){ + $aside['$lastusers_title'] = t('Latest users'); + $aside['$lastusers_items'] = array(); + $sql_extra = ""; + $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " ); + $order = " ORDER BY `register_date` DESC "; - $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` - FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` - WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ", - 0, - 12 - ); -# $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl'); - $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' ); - if(count($r)) { - $photo = 'thumb'; - foreach($r as $rr) { - $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); - $entry = replace_macros($tpl,array( - '$id' => $rr['id'], - '$profile-link' => $profile_link, - '$photo' => $a->get_cached_avatar_image($rr[$photo]), - '$alt-text' => $rr['name'], - )); - $aside['$lastusers_items'][] = $entry; + $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` + FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` + WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ", + 0, + 12 + ); + # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl'); + $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' ); + if(count($r)) { + $photo = 'thumb'; + foreach($r as $rr) { + $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); + $entry = replace_macros($tpl,array( + '$id' => $rr['id'], + '$profile_link' => $profile_link, + '$photo' => $a->get_cached_avatar_image($rr[$photo]), + '$alt_text' => $rr['name'], + )); + $aside['$lastusers_items'][] = $entry; + } } } - // 12 most active users (by posts and contacts) // this query don't work on some mysql versions - $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM - (SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`, - (SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`, - ( - SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` - UNION ALL - SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` - ) AS `uni`, `user`, `profile` - WHERE `uni`.`uid`=`user`.`uid` - AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1 - GROUP BY `uid` - ORDER BY `items` DESC,`contacts` DESC - LIMIT 0,10"); - if($r && count($r)) { - $aside['$activeusers_title'] = t('Most active users'); - $aside['$activeusers_items'] = array(); - - $photo = 'thumb'; - foreach($r as $rr) { - $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); - $entry = replace_macros($tpl,array( - '$id' => $rr['id'], - '$profile-link' => $profile_link, - '$photo' => $rr[$photo], - '$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0')) - )); - $aside['$activeusers_items'][] = $entry; + if (get_config('communityhome','showactiveusers')===true){ + $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM + (SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`, + (SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`, + ( + SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` + UNION ALL + SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` + ) AS `uni`, `user`, `profile` + WHERE `uni`.`uid`=`user`.`uid` + AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1 + GROUP BY `uid` + ORDER BY `items` DESC,`contacts` DESC + LIMIT 0,10"); + if($r && count($r)) { + $aside['$activeusers_title'] = t('Most active users'); + $aside['$activeusers_items'] = array(); + + $photo = 'thumb'; + foreach($r as $rr) { + $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); + $entry = replace_macros($tpl,array( + '$id' => $rr['id'], + '$profile_link' => $profile_link, + '$photo' => $rr[$photo], + '$alt_text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0')) + )); + $aside['$activeusers_items'][] = $entry; + } } } - // last 12 photos - $aside['$photos_title'] = t('Latest photos'); - $aside['$photos_items'] = array(); - $r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM - (SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo` - WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s') - AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1` - INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`, - `user` - WHERE `user`.`uid` = `photo`.`uid` - AND `user`.`blockwall`=0 - AND `user`.`hidewall` = 0 - ORDER BY `photo`.`edited` DESC - LIMIT 0, 12", - dbesc(t('Contact Photos')), - dbesc(t('Profile Photos')) - ); + if (get_config('communityhome','showlastphotos')===true){ + $aside['$photos_title'] = t('Latest photos'); + $aside['$photos_items'] = array(); + $r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM + (SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo` + WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s') + AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1` + INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`, + `user` + WHERE `user`.`uid` = `photo`.`uid` + AND `user`.`blockwall`=0 + AND `user`.`hidewall` = 0 + ORDER BY `photo`.`edited` DESC + LIMIT 0, 12", + dbesc(t('Contact Photos')), + dbesc(t('Profile Photos')) + ); - - if(count($r)) { -# $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl'); - $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' ); - foreach($r as $rr) { - $photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id']; - $photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] .'.jpg'; - - $entry = replace_macros($tpl,array( - '$id' => $rr['id'], - '$profile-link' => $photo_page, - '$photo' => $photo_url, - '$alt-text' => $rr['username']." : ".$rr['desc'], - )); + + if(count($r)) { + # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl'); + $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' ); + foreach($r as $rr) { + $photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id']; + $photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] .'.jpg'; + + $entry = replace_macros($tpl,array( + '$id' => $rr['id'], + '$profile_link' => $photo_page, + '$photo' => $photo_url, + '$alt_text' => $rr['username']." : ".$rr['desc'], + )); - $aside['$photos_items'][] = $entry; + $aside['$photos_items'][] = $entry; + } } } // last 10 liked items - $aside['$like_title'] = t('Latest likes'); - $aside['$like_items'] = array(); - $r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM - (SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link` - FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1 - INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri` - WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%' - GROUP BY `uri` - ORDER BY `T1`.`created` DESC - LIMIT 0,10", - $a->get_baseurl(),$a->get_baseurl() - ); + if (get_config('communityhome','showlastlike')===true){ + $aside['$like_title'] = t('Latest likes'); + $aside['$like_items'] = array(); + $r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM + (SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link` + FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1 + INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri` + WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%' + GROUP BY `uri` + ORDER BY `T1`.`created` DESC + LIMIT 0,10", + $a->get_baseurl(),$a->get_baseurl() + ); - foreach ($r as $rr) { - $author = '' . $rr['liker'] . ''; - $objauthor = '' . $rr['author-name'] . ''; - - //var_dump($rr['verb'],$rr['object-type']); killme(); - switch($rr['verb']){ - case 'http://activitystrea.ms/schema/1.0/post': - switch ($rr['object-type']){ - case 'http://activitystrea.ms/schema/1.0/event': - $post_type = t('event'); - break; - default: + foreach ($r as $rr) { + $author = '' . $rr['liker'] . ''; + $objauthor = '' . $rr['author-name'] . ''; + + //var_dump($rr['verb'],$rr['object-type']); killme(); + switch($rr['verb']){ + case 'http://activitystrea.ms/schema/1.0/post': + switch ($rr['object-type']){ + case 'http://activitystrea.ms/schema/1.0/event': + $post_type = t('event'); + break; + default: + $post_type = t('status'); + } + break; + default: + if ($rr['resource-id']){ + $post_type = t('photo'); + $m=array(); preg_match("/\[url=([^]]*)\]/", $rr['body'], $m); + $rr['plink'] = $m[1]; + } else { $post_type = t('status'); - } - break; - default: - if ($rr['resource-id']){ - $post_type = t('photo'); - $m=array(); preg_match("/\[url=([^]]*)\]/", $rr['body'], $m); - $rr['plink'] = $m[1]; - } else { - $post_type = t('status'); - } - } - $plink = '' . $post_type . ''; + } + } + $plink = '' . $post_type . ''; - $aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink); - + $aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink); + + } } # $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl'); @@ -182,8 +188,13 @@ function communityhome_home(&$a, &$o){ $o = '

' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '

'; - $oldset = get_config('system','no_community_page'); - set_config('system','no_community_page', false); - $o .= community_content($a,1); - set_config('system','no_community_page', $oldset); + if(file_exists('home.html')) + $o = file_get_contents('home.html'); + + if (get_config('communityhome','showcommunitystream')===true){ + $oldset = get_config('system','no_community_page'); + set_config('system','no_community_page', false); + $o .= community_content($a,1); + set_config('system','no_community_page', $oldset); + } } diff --git a/communityhome/twillingham/README b/communityhome/twillingham/README deleted file mode 100644 index dbbe1419..00000000 --- a/communityhome/twillingham/README +++ /dev/null @@ -1,3 +0,0 @@ -This is a variant of the community home. Instead of displaying the community tab in the front page, we still use home.html, but we also add the latest users to the sidebar. - -Simply replace addon/communityhome/communityhome.php with this version then enable community home in your admin panel as usual. \ No newline at end of file diff --git a/communityhome/twillingham/communityhome.php b/communityhome/twillingham/communityhome.php deleted file mode 100644 index 102732ac..00000000 --- a/communityhome/twillingham/communityhome.php +++ /dev/null @@ -1,107 +0,0 @@ - - */ - - -require_once('mod/community.php'); - - -function communityhome_install() { - register_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home'); - logger("installed communityhome"); -} - -function communityhome_uninstall() { - unregister_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home'); - logger("removed communityhome"); -} - -function communityhome_home(&$a, &$o){ - // custom css - $a->page['htmlhead'] .= ''; - - $aside = array( - '$tab_1' => t('Login'), - '$tab_2' => t('OpenID'), - '$noOid' => get_config('system','no_openid'), - ); - - // login form - $aside['$login_title'] = t('Login'); - $aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true); - - // last 12 users - $aside['$lastusers_title'] = t('Latest users'); - $aside['$lastusers_items'] = array(); - $sql_extra = ""; - $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " ); - $order = " ORDER BY `register_date` DESC "; - - $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` - FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` - WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ", - 0, - 12 - ); - $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl'); - if(count($r)) { - $photo = 'thumb'; - foreach($r as $rr) { - $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); - $entry = replace_macros($tpl,array( - '$id' => $rr['id'], - '$profile-link' => $profile_link, - '$photo' => $rr[$photo], - '$alt-text' => $rr['name'], - )); - $aside['$lastusers_items'][] = $entry; - } - } - - // 12 most active users (by posts and contacts) - // this query don't work on some mysql versions - $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM - (SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`, - (SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`, - ( - SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` - UNION ALL - SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` - ) AS `uni`, `user`, `profile` - WHERE `uni`.`uid`=`user`.`uid` - AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1 - GROUP BY `uid` - ORDER BY `items` DESC,`contacts` DESC - LIMIT 0,10"); - if($r && count($r)) { - $aside['$activeusers_title'] = t('Most active users'); - $aside['$activeusers_items'] = array(); - - $photo = 'thumb'; - foreach($r as $rr) { - $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); - $entry = replace_macros($tpl,array( - '$id' => $rr['id'], - '$profile-link' => $profile_link, - '$photo' => $rr[$photo], - '$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0')) - )); - $aside['$activeusers_items'][] = $entry; - } - } - - - - - $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl'); - $a->page['aside'] = replace_macros($tpl, $aside); - $o = ''; - if(file_exists('home.html')) - - $o .= file_get_contents('home.html'); - -} diff --git a/communityhome/view/directory_item.tpl b/communityhome/view/directory_item.tpl index db1936e4..f32f5a4f 100755 --- a/communityhome/view/directory_item.tpl +++ b/communityhome/view/directory_item.tpl @@ -2,8 +2,8 @@
From 0ae7a3f42050b234741a258d1302f18c5ce6c6a2 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 28 Dec 2012 11:00:07 -0500 Subject: [PATCH 06/19] community home: update version --- communityhome/communityhome.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/communityhome/communityhome.php b/communityhome/communityhome.php index e2c3deeb..ba2af6de 100755 --- a/communityhome/communityhome.php +++ b/communityhome/communityhome.php @@ -2,7 +2,7 @@ /** * Name: Community home * Description: Show last community activity in homepage - * Version: 1.0 + * Version: 2.0 * Author: Fabio Comuni */ From 9c00bd1608cea9aa86fd00691c23d838758607bc Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 28 Dec 2012 11:01:14 -0500 Subject: [PATCH 07/19] community home: update tgz --- communityhome.tgz | Bin 4331 -> 4471 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/communityhome.tgz b/communityhome.tgz index 71f1f8e30f3e38731dbf8efd496e65f82623ba94..ab251425b711a5e6749dedbf1c4a8f56b036d49a 100755 GIT binary patch literal 4471 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 J8212p001{+!v_EW literal 4331 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 ZQ<=(CrZSbOOlA7g^k3O2d({AV008SYo=^Y) From cb77f46e9f0ab1b13ff74edb01d5de609e28535b Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 30 Dec 2012 22:59:12 +0100 Subject: [PATCH 08/19] privacy_image_cache: When a picture can't be retrieved after 10 seconds then show a blank picture --- privacy_image_cache/privacy_image_cache.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/privacy_image_cache/privacy_image_cache.php b/privacy_image_cache/privacy_image_cache.php index d98c6b6d..0e241e7e 100644 --- a/privacy_image_cache/privacy_image_cache.php +++ b/privacy_image_cache/privacy_image_cache.php @@ -128,7 +128,8 @@ function privacy_image_cache_init() { if (strpos($_REQUEST['url'], ".fbcdn.net/") and (substr($_REQUEST['url'], -6) == "_s.jpg")) $_REQUEST['url'] = substr($_REQUEST['url'], 0, -6)."_n.jpg"; - $img_str = fetch_url($_REQUEST['url'],true); + $redirects = 0; + $img_str = fetch_url($_REQUEST['url'],true, $redirects, 10); $tempfile = tempnam(get_config("system","temppath"), "cache"); file_put_contents($tempfile, $img_str); @@ -141,9 +142,9 @@ function privacy_image_cache_init() { $mime = "image/png"; $cachefile = ""; // Clear the cachefile so that the dummy isn't stored $valid = false; - $img = new Photo($img_str); + $img = new Photo($img_str, "image/png"); if($img->is_valid()) { - $img->scaleImage(1); + $img->scaleImage(10); $img_str = $img->imageString(); } //} else if (substr($img_str, 0, 6) == "GIF89a") { From f6d639122edc65fb93589a9d4afcdb1d16f604c9 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 1 Jan 2013 16:11:07 +0100 Subject: [PATCH 09/19] twitter: It is now possible to mirror own postings from twitter to friendica --- twitter/twitter.php | 150 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 131 insertions(+), 19 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index 6cb2d9cd..ad657799 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -36,6 +36,8 @@ * Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin */ +define('TWITTER_DEFAULT_POLL_INTERVAL', 30); // given in minutes + function twitter_install() { // we need some hooks, for the configuration and for sending tweets register_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings'); @@ -43,6 +45,7 @@ function twitter_install() { register_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local'); register_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook'); register_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets'); + register_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron'); logger("installed twitter"); } @@ -53,6 +56,7 @@ function twitter_uninstall() { unregister_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local'); unregister_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook'); unregister_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets'); + unregister_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron'); // old setting - remove only unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook'); @@ -72,8 +76,6 @@ function twitter_jot_nets(&$a,&$b) { $b .= '
' . t('Post to Twitter') . '
'; } - - } function twitter_settings_post ($a,$post) { @@ -87,20 +89,23 @@ function twitter_settings_post ($a,$post) { * if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair * from the user configuration */ - del_pconfig( local_user(), 'twitter', 'consumerkey' ); - del_pconfig( local_user(), 'twitter', 'consumersecret' ); - del_pconfig( local_user(), 'twitter', 'oauthtoken' ); - del_pconfig( local_user(), 'twitter', 'oauthsecret' ); - del_pconfig( local_user(), 'twitter', 'post' ); - del_pconfig( local_user(), 'twitter', 'post_by_default' ); - del_pconfig( local_user(), 'twitter', 'post_taglinks'); + del_pconfig(local_user(), 'twitter', 'consumerkey'); + del_pconfig(local_user(), 'twitter', 'consumersecret'); + del_pconfig(local_user(), 'twitter', 'oauthtoken'); + del_pconfig(local_user(), 'twitter', 'oauthsecret'); + del_pconfig(local_user(), 'twitter', 'post'); + del_pconfig(local_user(), 'twitter', 'post_by_default'); + del_pconfig(local_user(), 'twitter', 'post_taglinks'); + del_pconfig(local_user(), 'twitter', 'lastid'); + del_pconfig(local_user(), 'twitter', 'mirror_posts'); + del_pconfig(local_user(), 'twitter', 'intelligent_shortening'); } else { 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 = get_config('twitter', 'consumerkey' ); - $csecret = get_config('twitter', 'consumersecret' ); + $ckey = get_config('twitter', 'consumerkey'); + $csecret = get_config('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 @@ -119,6 +124,8 @@ function twitter_settings_post ($a,$post) { set_pconfig(local_user(),'twitter','post',intval($_POST['twitter-enable'])); set_pconfig(local_user(),'twitter','post_by_default',intval($_POST['twitter-default'])); set_pconfig(local_user(),'twitter','post_taglinks',intval($_POST['twitter-sendtaglinks'])); + set_pconfig(local_user(), 'twitter', 'mirror_posts', intval($_POST['twitter-mirror'])); + set_pconfig(local_user(), 'twitter', 'intelligent_shortening', intval($_POST['twitter-shortening'])); info( t('Twitter settings updated.') . EOL); }} } @@ -141,6 +148,10 @@ function twitter_settings(&$a,&$s) { $defchecked = (($defenabled) ? ' checked="checked" ' : ''); $linksenabled = get_pconfig(local_user(),'twitter','post_taglinks'); $linkschecked = (($linksenabled) ? ' checked="checked" ' : ''); + $mirrorenabled = get_pconfig(local_user(),'twitter','mirror_posts'); + $mirrorchecked = (($mirrorenabled) ? ' checked="checked" ' : ''); + $shorteningenabled = get_pconfig(local_user(),'twitter','intelligent_shortening'); + $shorteningchecked = (($shorteningenabled) ? ' checked="checked" ' : ''); $s .= '
'; $s .= '

'. t('Twitter Posting Settings') .'

'; @@ -198,6 +209,15 @@ function twitter_settings(&$a,&$s) { $s .= ''; $s .= ''; $s .= '
'; + + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= ''; + $s .= ''; + $s .= '
'; + $s .= ''; $s .= ''; $s .= '
'; @@ -385,15 +405,24 @@ function twitter_post_hook(&$a,&$b) { if($b['parent'] != $b['id']) return; + // if posts comes from twitter don't send it back + if($b['app'] == "twitter.com") + return; + logger('twitter post invoked'); load_pconfig($b['uid'], 'twitter'); - $ckey = get_config('twitter', 'consumerkey' ); - $csecret = get_config('twitter', 'consumersecret' ); - $otoken = get_pconfig($b['uid'], 'twitter', 'oauthtoken' ); - $osecret = get_pconfig($b['uid'], 'twitter', 'oauthsecret' ); + $ckey = get_config('twitter', 'consumerkey'); + $csecret = get_config('twitter', 'consumersecret'); + $otoken = get_pconfig($b['uid'], 'twitter', 'oauthtoken'); + $osecret = get_pconfig($b['uid'], 'twitter', 'oauthsecret'); + $intelligent_shortening = get_pconfig($b['uid'], 'twitter', 'intelligent_shortening'); + + // Global setting overrides this + if (get_config('twitter','intelligent_shortening')) + $intelligent_shortening = get_config('twitter','intelligent_shortening'); if($ckey && $csecret && $otoken && $osecret) { logger('twitter: we have customer key and oauth stuff, going to send.', LOGGER_DEBUG); @@ -403,9 +432,6 @@ function twitter_post_hook(&$a,&$b) { $tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret); // in theory max char is 140 but T. uses t.co to make links // longer so we give them 10 characters extra - - $intelligent_shortening = get_config('twitter','intelligent_shortening'); - if (!$intelligent_shortening) { $max_char = 130; // max. length for a tweet // we will only work with up to two times the length of the dent @@ -509,7 +535,7 @@ function twitter_plugin_admin(&$a, &$o){ $includes = array( '$field_input' => 'field_input.tpl', ); - $includes = set_template_includes($a->theme['template_engine'], $includes); + //$includes = set_template_includes($a->theme['template_engine'], $includes); $o = replace_macros($t, $includes + array( '$submit' => t('Submit'), @@ -518,3 +544,89 @@ function twitter_plugin_admin(&$a, &$o){ '$consumersecret' => array('consumersecret', t('Consumer secret'), get_config('twitter', 'consumersecret' ), '') )); } + +function twitter_cron($a,$b) { + $last = get_config('twitter','last_poll'); + + $poll_interval = intval(get_config('twitter','poll_interval')); + if(! $poll_interval) + $poll_interval = TWITTER_DEFAULT_POLL_INTERVAL; + + if($last) { + $next = $last + ($poll_interval * 60); + if($next > time()) { + logger('twitter: poll intervall not reached'); + return; + } + } + logger('twitter: cron_start'); + + $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY RAND() "); + if(count($r)) { + foreach($r as $rr) { + logger('twitter: fetching for user '.$rr['uid']); + twitter_fetchtimeline($a, $rr['uid']); + } + } + + logger('twitter: cron_end'); + + set_config('twitter','last_poll', time()); +} + +function twitter_fetchtimeline($a, $uid) { + $ckey = get_config('twitter', 'consumerkey'); + $csecret = get_config('twitter', 'consumersecret'); + $otoken = get_pconfig($uid, 'twitter', 'oauthtoken'); + $osecret = get_pconfig($uid, 'twitter', 'oauthsecret'); + $lastid = get_pconfig($uid, 'twitter', 'lastid'); + + require_once('library/twitteroauth.php'); + $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret); + + $parameters = array("exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false); + + if ($lastid <> "") + $parameters["since_id"] = $lastid; + + $items = $connection->get('statuses/user_timeline', $parameters); + $posts = array_reverse($items); + + foreach ($posts as $post) { + if ($post->id_str > $lastid) + $lastid = $post->id_str; + + if (!strpos($post->source, $a->get_hostname())) { + $_SESSION["authenticated"] = true; + $_SESSION["uid"] = $uid; + + $_REQUEST["type"] = "wall"; + $_REQUEST["api_source"] = true; + $_REQUEST["profile_uid"] = $uid; + $_REQUEST["source"] = "twitter.com"; + + //$_REQUEST["date"] = $post->created_at; + + $_REQUEST["body"] = $post->text; + if (is_string($post->place->name)) + $_REQUEST["location"] = $post->place->name; + + if (is_string($post->place->full_name)) + $_REQUEST["location"] = $post->place->full_name; + + if (is_array($post->geo->coordinates)) + $_REQUEST["coord"] = $post->geo->coordinates[0]." ".$post->geo->coordinates[1]; + + if (is_array($post->coordinates->coordinates)) + $_REQUEST["coord"] = $post->coordinates->coordinates[1]." ".$post->coordinates->coordinates[0]; + + //print_r($_REQUEST); + logger('twitter: posting for user '.$uid); + + require_once('mod/item.php'); + item_post($a); + + } + } + set_pconfig($uid, 'twitter', 'lastid', $lastid); +} From 1f5f0541edb211b4a14f7eb46416b71bee75d0d2 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 1 Jan 2013 18:20:56 +0100 Subject: [PATCH 10/19] statusnet: Now you can mirror posts from statusnet to friendica --- statusnet/statusnet.php | 161 ++++++++++++++++++++++++++++++++++------ twitter/twitter.php | 2 +- 2 files changed, 139 insertions(+), 24 deletions(-) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 4781fcc2..9167425a 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -30,6 +30,8 @@ * Thank you guys for the Twitter compatible API! */ +define('STATUSNET_DEFAULT_POLL_INTERVAL', 30); // given in minutes + require_once('library/twitteroauth.php'); class StatusNetOAuth extends TwitterOAuth { @@ -104,6 +106,7 @@ function statusnet_install() { register_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); register_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local'); register_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets'); + register_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron'); logger("installed statusnet"); } @@ -114,6 +117,7 @@ function statusnet_uninstall() { unregister_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); unregister_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local'); unregister_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets'); + unregister_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron'); // old setting - remove only unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); @@ -131,13 +135,10 @@ function statusnet_jot_nets(&$a,&$b) { $statusnet_defpost = get_pconfig(local_user(),'statusnet','post_by_default'); $selected = ((intval($statusnet_defpost) == 1) ? ' checked="checked" ' : ''); $b .= '
' - . t('Post to StatusNet') . '
'; + . t('Post to StatusNet') . '
'; } } - - - function statusnet_settings_post ($a,$post) { if(! local_user()) return; @@ -148,14 +149,17 @@ function statusnet_settings_post ($a,$post) { /*** * if the statusnet-disconnect checkbox is set, clear the statusnet configuration */ - del_pconfig( local_user(), 'statusnet', 'consumerkey' ); - del_pconfig( local_user(), 'statusnet', 'consumersecret' ); - del_pconfig( local_user(), 'statusnet', 'post' ); - del_pconfig( local_user(), 'statusnet', 'post_by_default' ); - del_pconfig( local_user(), 'statusnet', 'oauthtoken' ); - del_pconfig( local_user(), 'statusnet', 'oauthsecret' ); - del_pconfig( local_user(), 'statusnet', 'baseapi' ); - del_pconfig( local_user(), 'statusnet', 'post_taglinks'); + del_pconfig(local_user(), 'statusnet', 'consumerkey'); + del_pconfig(local_user(), 'statusnet', 'consumersecret'); + del_pconfig(local_user(), 'statusnet', 'post'); + del_pconfig(local_user(), 'statusnet', 'post_by_default'); + del_pconfig(local_user(), 'statusnet', 'oauthtoken'); + del_pconfig(local_user(), 'statusnet', 'oauthsecret'); + del_pconfig(local_user(), 'statusnet', 'baseapi'); + del_pconfig(local_user(), 'statusnet', 'post_taglinks'); + del_pconfig(local_user(), 'statusnet', 'lastid'); + del_pconfig(local_user(), 'statusnet', 'mirror_posts'); + del_pconfig(local_user(), 'statusnet', 'intelligent_shortening'); } else { if (isset($_POST['statusnet-preconf-apiurl'])) { /*** @@ -229,6 +233,8 @@ function statusnet_settings_post ($a,$post) { set_pconfig(local_user(),'statusnet','post',intval($_POST['statusnet-enable'])); set_pconfig(local_user(),'statusnet','post_by_default',intval($_POST['statusnet-default'])); set_pconfig(local_user(),'statusnet','post_taglinks',intval($_POST['statusnet-sendtaglinks'])); + set_pconfig(local_user(), 'statusnet', 'mirror_posts', intval($_POST['statusnet-mirror'])); + set_pconfig(local_user(), 'statusnet', 'intelligent_shortening', intval($_POST['statusnet-shortening'])); info( t('StatusNet settings updated.') . EOL); }}}} } @@ -253,6 +259,12 @@ function statusnet_settings(&$a,&$s) { $defchecked = (($defenabled) ? ' checked="checked" ' : ''); $linksenabled = get_pconfig(local_user(),'statusnet','post_taglinks'); $linkschecked = (($linksenabled) ? ' checked="checked" ' : ''); + + $mirrorenabled = get_pconfig(local_user(),'statusnet','mirror_posts'); + $mirrorchecked = (($mirrorenabled) ? ' checked="checked" ' : ''); + $shorteningenabled = get_pconfig(local_user(),'statusnet','intelligent_shortening'); + $shorteningchecked = (($shorteningenabled) ? ' checked="checked" ' : ''); + $s .= '
'; $s .= '

'. t('StatusNet Posting Settings').'

'; @@ -342,6 +354,15 @@ function statusnet_settings(&$a,&$s) { $s .= ''; $s .= ''; $s .= '
'; + + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= ''; + $s .= ''; + $s .= '
'; + $s .= ''; $s .= ''; $s .= '
'; @@ -523,20 +544,31 @@ function statusnet_post_hook(&$a,&$b) { if(! strstr($b['postopts'],'statusnet')) return; + // if posts comes from statusnet don't send it back + if($b['app'] == "StatusNet") + return; + + logger('statusnet post invoked'); + load_pconfig($b['uid'], 'statusnet'); - + $api = get_pconfig($b['uid'], 'statusnet', 'baseapi'); - $ckey = get_pconfig($b['uid'], 'statusnet', 'consumerkey' ); - $csecret = get_pconfig($b['uid'], 'statusnet', 'consumersecret' ); - $otoken = get_pconfig($b['uid'], 'statusnet', 'oauthtoken' ); - $osecret = get_pconfig($b['uid'], 'statusnet', 'oauthsecret' ); + $ckey = get_pconfig($b['uid'], 'statusnet', 'consumerkey'); + $csecret = get_pconfig($b['uid'], 'statusnet', 'consumersecret'); + $otoken = get_pconfig($b['uid'], 'statusnet', 'oauthtoken'); + $osecret = get_pconfig($b['uid'], 'statusnet', 'oauthsecret'); + $intelligent_shortening = get_pconfig($b['uid'], 'statusnet', 'intelligent_shortening'); + + // Global setting overrides this + if (get_config('statusnet','intelligent_shortening')) + $intelligent_shortening = get_config('statusnet','intelligent_shortening'); if($ckey && $csecret && $otoken && $osecret) { require_once('include/bbcode.php'); $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret); $max_char = $dent->get_maxlength(); // max. length for a dent - // we will only work with up to two times the length of the dent + // we will only work with up to two times the length of the dent // we can later send to StatusNet. This way we can "gain" some // information during shortening of potential links but do not // shorten all the links in a 200000 character long essay. @@ -697,14 +729,97 @@ function statusnet_plugin_admin(&$a, &$o){ 'key' => Array("key[$id]", t("Consumer Key"), "", ""), ); - $t = get_markup_template( "admin.tpl", "addon/statusnet/" ); $o = replace_macros($t, array( '$submit' => t('Submit'), - '$sites' => $sitesform, - )); - - } + +function statusnet_cron($a,$b) { + $last = get_config('statusnet','last_poll'); + + $poll_interval = intval(get_config('statusnet','poll_interval')); + if(! $poll_interval) + $poll_interval = STATUSNET_DEFAULT_POLL_INTERVAL; + + if($last) { + $next = $last + ($poll_interval * 60); + if($next > time()) { + logger('statusnet: poll intervall not reached'); + return; + } + } + logger('statusnet: cron_start'); + + $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY RAND() "); + if(count($r)) { + foreach($r as $rr) { + logger('statusnet: fetching for user '.$rr['uid']); + statusnet_fetchtimeline($a, $rr['uid']); + } + } + + logger('statusnet: cron_end'); + + set_config('statusnet','last_poll', time()); +} + +function statusnet_fetchtimeline($a, $uid) { + $ckey = get_pconfig($uid, 'statusnet', 'consumerkey'); + $csecret = get_pconfig($uid, 'statusnet', 'consumersecret'); + $api = get_pconfig($uid, 'statusnet', 'baseapi'); + $otoken = get_pconfig($uid, 'statusnet', 'oauthtoken'); + $osecret = get_pconfig($uid, 'statusnet', 'oauthsecret'); + $lastid = get_pconfig($uid, 'statusnet', 'lastid'); + + $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret); + + $parameters = array("exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false); + + if ($lastid <> "") + $parameters["since_id"] = $lastid; + + $items = $connection->get('statuses/user_timeline', $parameters); + $posts = array_reverse($items); + + foreach ($posts as $post) { + if ($post->id > $lastid) + $lastid = $post->id; + + if (!strpos($post->source, $a->get_hostname())) { + $_SESSION["authenticated"] = true; + $_SESSION["uid"] = $uid; + + $_REQUEST["type"] = "wall"; + $_REQUEST["api_source"] = true; + $_REQUEST["profile_uid"] = $uid; + $_REQUEST["source"] = "StatusNet"; + + //$_REQUEST["date"] = $post->created_at; + + $_REQUEST["body"] = $post->text; + if (is_string($post->place->name)) + $_REQUEST["location"] = $post->place->name; + + if (is_string($post->place->full_name)) + $_REQUEST["location"] = $post->place->full_name; + + if (is_array($post->geo->coordinates)) + $_REQUEST["coord"] = $post->geo->coordinates[0]." ".$post->geo->coordinates[1]; + + if (is_array($post->coordinates->coordinates)) + $_REQUEST["coord"] = $post->coordinates->coordinates[1]." ".$post->coordinates->coordinates[0]; + + //print_r($_REQUEST); + if ($_REQUEST["body"] != "") { + logger('statusnet: posting for user '.$uid); + + require_once('mod/item.php'); + item_post($a); + } + } + } + set_pconfig($uid, 'statusnet', 'lastid', $lastid); +} + diff --git a/twitter/twitter.php b/twitter/twitter.php index ad657799..cde64ae2 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -74,7 +74,7 @@ function twitter_jot_nets(&$a,&$b) { $tw_defpost = get_pconfig(local_user(),'twitter','post_by_default'); $selected = ((intval($tw_defpost) == 1) ? ' checked="checked" ' : ''); $b .= '
' - . t('Post to Twitter') . '
'; + . t('Post to Twitter') . ''; } } From 285253e15e97484435f09173bf4373a476632ad9 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 1 Jan 2013 18:30:47 +0100 Subject: [PATCH 11/19] statusnet: Retweets shouldn't be mirrored --- statusnet/statusnet.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 9167425a..fa417665 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -787,6 +787,9 @@ function statusnet_fetchtimeline($a, $uid) { if ($post->id > $lastid) $lastid = $post->id; + if (is_object($post->retweeted_status)) + continue; + if (!strpos($post->source, $a->get_hostname())) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; From f6d9ced311a9d6eb6e6d5b23bcf33820127c1016 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 1 Jan 2013 23:18:15 +0100 Subject: [PATCH 12/19] fbpost: Now you can mirror public facebook posts from your wall to friendica --- fbpost/fbpost.php | 231 ++++++++++++++++++++++++++++++++++++++-- statusnet/statusnet.php | 2 +- twitter/twitter.php | 8 +- 3 files changed, 226 insertions(+), 15 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index ab49c303..cdb1f05a 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -21,7 +21,8 @@ * authenticate to your site to establish identity. We will address this * in a future release. */ - + +define('FACEBOOK_DEFAULT_POLL_INTERVAL', 5); // given in minutes require_once('include/security.php'); @@ -32,6 +33,7 @@ function fbpost_install() { register_hook('connector_settings', 'addon/fbpost/fbpost.php', 'fbpost_plugin_settings'); register_hook('enotify', 'addon/fbpost/fbpost.php', 'fbpost_enotify'); register_hook('queue_predeliver', 'addon/fbpost/fbpost.php', 'fbpost_queue_hook'); + register_hook('cron', 'addon/fbpost/fbpost.php', 'fbpost_cron'); } @@ -42,8 +44,7 @@ function fbpost_uninstall() { unregister_hook('connector_settings', 'addon/fbpost/fbpost.php', 'fbpost_plugin_settings'); unregister_hook('enotify', 'addon/fbpost/fbpost.php', 'fbpost_enotify'); unregister_hook('queue_predeliver', 'addon/fbpost/fbpost.php', 'fbpost_queue_hook'); - - + unregister_hook('cron', 'addon/fbpost/fbpost.php', 'fbpost_cron'); } @@ -140,6 +141,9 @@ function fbpost_post(&$a) { $value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0); set_pconfig($uid,'facebook','post_by_default', $value); + $value = ((x($_POST,'mirror_posts')) ? intval($_POST['mirror_posts']) : 0); + set_pconfig($uid,'facebook','mirror_posts', $value); + $value = ((x($_POST,'suppress_view_on_friendica')) ? intval($_POST['suppress_view_on_friendica']) : 0); set_pconfig($uid,'facebook','suppress_view_on_friendica', $value); @@ -234,6 +238,10 @@ function fbpost_content(&$a) { $checked = (($suppress_view_on_friendica) ? ' checked="checked" ' : ''); $o .= '' . ' ' . t('Suppress "View on friendica"') . EOL; + $mirror_posts = get_pconfig(local_user(),'facebook','mirror_posts'); + $checked = (($mirror_posts) ? ' checked="checked" ' : ''); + $o .= '' . ' ' . t('Mirror wall posts from facebook to friendica.') . EOL; + // List all pages $post_to_page = get_pconfig(local_user(),'facebook','post_to_page'); $page_access_token = get_pconfig(local_user(),'facebook','page_access_token'); @@ -386,6 +394,10 @@ function fbpost_post_hook(&$a,&$b) { if($b['deleted'] || ($b['created'] !== $b['edited'])) return; + // if post comes from facebook don't send it back + if($b['app'] == "Facebook") + return; + /** * Post to Facebook stream */ @@ -931,28 +943,28 @@ function fbpost_queue_hook(&$a,&$b) { * @return bool|string */ function fbpost_get_app_access_token() { - + $acc_token = get_config('facebook','app_access_token'); - + if ($acc_token !== false) return $acc_token; - + $appid = get_config('facebook','appid'); $appsecret = get_config('facebook', 'appsecret'); - + if ($appid === false || $appsecret === false) { logger('fb_get_app_access_token: appid and/or appsecret not set', LOGGER_DEBUG); return false; } logger('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials', LOGGER_DATA); $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials'); - + if(strpos($x,'access_token=') !== false) { logger('fb_get_app_access_token: returned access token: ' . $x, LOGGER_DATA); - + $token = str_replace('access_token=', '', $x); if(strpos($token,'&') !== false) $token = substr($token,0,strpos($token,'&')); - + if ($token == "") { logger('fb_get_app_access_token: empty token: ' . $x, LOGGER_DEBUG); return false; @@ -965,3 +977,202 @@ function fbpost_get_app_access_token() { } } +function fbpost_cron($a,$b) { + $last = get_config('facebook','last_poll'); + + $poll_interval = intval(get_config('facebook','poll_interval')); + if(! $poll_interval) + $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL; + + if($last) { + $next = $last + ($poll_interval * 60); + if($next > time()) { + logger('facebook: poll intervall not reached'); + return; + } + } + logger('facebook: cron_start'); + + $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY RAND() "); + if(count($r)) { + foreach($r as $rr) { + logger('facebook: fetching for user '.$rr['uid']); + fbpost_fetchwall($a, $rr['uid']); + } + } + + logger('facebook: cron_end'); + + set_config('facebook','last_poll', time()); +} + +function fbpost_fetchwall($a, $uid) { + $access_token = get_pconfig($uid,'facebook','access_token'); + $lastcreated = get_pconfig($uid,'facebook','last_created'); + $lastcreated = ""; + + $url = 'https://graph.facebook.com/me/feed?access_token='.$access_token; + + if ($lastcreated != "") + $url .= "&since=".urlencode($lastcreated); + + $feed = fetch_url($url); + $data = json_decode($feed); + $items = array_reverse($data->data); + + foreach ($items as $item) { + if ($item->created_time > $lastcreated) + $lastcreated = $item->created_time; + + if ($item->application->id == get_config('facebook','appid')) + continue; + + if(isset($item->privacy) && $item->privacy->value !== 'EVERYONE') + continue; + + + $_SESSION["authenticated"] = true; + $_SESSION["uid"] = $uid; + + $_REQUEST["type"] = "wall"; + $_REQUEST["api_source"] = true; + $_REQUEST["profile_uid"] = $uid; + $_REQUEST["source"] = "Facebook"; + + $_REQUEST["body"] = (isset($item->message) ? escape_tags($item->message) : ''); + + if(isset($item->name) and isset($item->link)) + $_REQUEST["body"] .= "\n\n[bookmark=".$item->link."]".$item->name."[/bookmark]"; + elseif (isset($item->name)) + $_REQUEST["body"] .= "\n\n[b]" . $item->name."[/b]"; + + if(isset($item->caption)) { + if(!isset($item->name) and isset($item->link)) + $_REQUEST["body"] .= "\n\n[bookmark=".$item->link."]".$item->caption."[/bookmark]"; + //else + // $_REQUEST["body"] .= "[i]" . $item->caption."[/i]\n"; + } + + if(!isset($item->caption) and !isset($item->name)) { + if (isset($item->link)) + $_REQUEST["body"] .= "\n[url]".$item->link."[/url]\n"; + else + $_REQUEST["body"] .= "\n"; + } + + $quote = ""; + if(isset($item->description)) + $quote = $item->description; + + if (isset($item->properties)) + foreach ($item->properties as $property) + $quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]"; + + if ($quote) + $_REQUEST["body"] .= "\n[quote]".$quote."[/quote]"; + + // Only import the picture when the message is no video + // oembed display a picture of the video as well + if ($item->type != "video") { + if(isset($item->picture) && isset($item->link)) + $_REQUEST["body"] .= "\n".'[url='.$item->link.'][img]'.fpost_cleanpicture($item->picture).'[/img][/url]'; + else { + if (isset($item->picture)) + $_REQUEST["body"] .= "\n".'[img]'.fpost_cleanpicture($item->picture).'[/img]'; + // if just a link, it may be a wall photo - check + if(isset($item->link)) + $_REQUEST["body"] .= fbpost_get_photo($uid,$item->link); + } + } + + if (($datarray['app'] == "Events") and isset($item->actions)) + foreach ($item->actions as $action) + if ($action->name == "View") + $_REQUEST["body"] .= " [url=".$action->link."]".$item->story."[/url]"; + + if(trim($_REQUEST["body"]) == '') { + logger('facebook: empty body '.$item->id.' '.print_r($item, true)); + continue; + } + + $_REQUEST["body"] = trim($_REQUEST["body"]); + + if (isset($item->place)) { + if ($item->place->name or $item->place->location->street or + $item->place->location->city or $item->place->location->country) { + $_REQUEST["location"] = ''; + if ($item->place->name) + $_REQUEST["location"] .= $item->place->name; + if ($item->place->location->street) + $_REQUEST["location"] .= " ".$item->place->location->street; + if ($item->place->location->city) + $_REQUEST["location"] .= " ".$item->place->location->city; + if ($item->place->location->country) + $_REQUEST["location"] .= " ".$item->place->location->country; + + $_REQUEST["location"] = trim($_REQUEST["location"]); + } + if ($item->place->location->latitude and $item->place->location->longitude) + $_REQUEST["coord"] = substr($item->place->location->latitude, 0, 8) + .' '.substr($item->place->location->longitude, 0, 8); + } + + //print_r($_REQUEST); + logger('facebook: posting for user '.$uid); + + require_once('mod/item.php'); + item_post($a); + } + + set_pconfig($uid,'facebook','last_created', $lastcreated); +} + +function fbpost_get_photo($uid,$link) { + $access_token = get_pconfig($uid,'facebook','access_token'); + if(! $access_token || (! stristr($link,'facebook.com/photo.php'))) + return ""; + + $ret = preg_match('/fbid=([0-9]*)/',$link,$match); + if($ret) + $photo_id = $match[1]; + else + return ""; + + $x = fetch_url('https://graph.facebook.com/'.$photo_id.'?access_token='.$access_token); + $j = json_decode($x); + if($j->picture) + return "\n\n".'[url='.$link.'][img]'.fpost_cleanpicture($j->picture).'[/img][/url]'; + + return ""; +} + +function fpost_cleanpicture($image) { + + if (strpos($image, ".fbcdn.net/") and (substr($image, -6) == "_s.jpg")) + $image = substr($image, 0, -6)."_n.jpg"; + + $queryvar = fbpost_parse_query($image); + if ($queryvar['url'] != "") + $image = urldecode($queryvar['url']); + + return $image; +} + +function fbpost_parse_query($var) { + /** + * Use this function to parse out the query array element from + * the output of parse_url(). + */ + $var = parse_url($var, PHP_URL_QUERY); + $var = html_entity_decode($var); + $var = explode('&', $var); + $arr = array(); + + foreach($var as $val) { + $x = explode('=', $val); + $arr[$x[0]] = $x[1]; + } + + unset($val, $x, $var); + return $arr; +} diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index fa417665..1a42307c 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -30,7 +30,7 @@ * Thank you guys for the Twitter compatible API! */ -define('STATUSNET_DEFAULT_POLL_INTERVAL', 30); // given in minutes +define('STATUSNET_DEFAULT_POLL_INTERVAL', 5); // given in minutes require_once('library/twitteroauth.php'); diff --git a/twitter/twitter.php b/twitter/twitter.php index cde64ae2..3056f57b 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -36,7 +36,7 @@ * Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin */ -define('TWITTER_DEFAULT_POLL_INTERVAL', 30); // given in minutes +define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes function twitter_install() { // we need some hooks, for the configuration and for sending tweets @@ -405,8 +405,8 @@ function twitter_post_hook(&$a,&$b) { if($b['parent'] != $b['id']) return; - // if posts comes from twitter don't send it back - if($b['app'] == "twitter.com") + // if post comes from twitter don't send it back + if($b['app'] == "Twitter") return; logger('twitter post invoked'); @@ -603,7 +603,7 @@ function twitter_fetchtimeline($a, $uid) { $_REQUEST["type"] = "wall"; $_REQUEST["api_source"] = true; $_REQUEST["profile_uid"] = $uid; - $_REQUEST["source"] = "twitter.com"; + $_REQUEST["source"] = "Twitter"; //$_REQUEST["date"] = $post->created_at; From 88638d2338e21bd96ad33e0a13eebdfead908925 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 1 Jan 2013 23:38:15 +0100 Subject: [PATCH 13/19] fbpost: Now groups and pages can be mirrored as well --- fbpost/fbpost.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index cdb1f05a..9c2ee0cb 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -1008,10 +1008,13 @@ function fbpost_cron($a,$b) { function fbpost_fetchwall($a, $uid) { $access_token = get_pconfig($uid,'facebook','access_token'); + $post_to_page = get_pconfig($uid,'facebook','post_to_page'); $lastcreated = get_pconfig($uid,'facebook','last_created'); - $lastcreated = ""; - $url = 'https://graph.facebook.com/me/feed?access_token='.$access_token; + if ((int)$post_to_page == 0) + $post_to_page = "me"; + + $url = "https://graph.facebook.com/".$post_to_page."/feed?access_token=".$access_token; if ($lastcreated != "") $url .= "&since=".urlencode($lastcreated); From 3c875dcf6e67d4e196f9c0eb7b19e8b515b5afe4 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 1 Jan 2013 23:57:56 +0100 Subject: [PATCH 14/19] statusnet: Answers were mirrored as well - now there's a check against that. --- statusnet/statusnet.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 1a42307c..d5097c13 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -790,6 +790,9 @@ function statusnet_fetchtimeline($a, $uid) { if (is_object($post->retweeted_status)) continue; + if ($post->in_reply_to_status_id != "") + continue; + if (!strpos($post->source, $a->get_hostname())) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; From cb36c31f55a02ca1f5d35c42881856557ddc0e28 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 2 Jan 2013 21:05:14 +0100 Subject: [PATCH 15/19] fbpost: Some public posts weren't fetched. --- fbpost/fbpost.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index 9c2ee0cb..890f805b 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -1030,10 +1030,9 @@ function fbpost_fetchwall($a, $uid) { if ($item->application->id == get_config('facebook','appid')) continue; - if(isset($item->privacy) && $item->privacy->value !== 'EVERYONE') + if(isset($item->privacy) && ($item->privacy->value !== 'EVERYONE') && ($item->privacy->value !== '')) continue; - $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; @@ -1088,10 +1087,11 @@ function fbpost_fetchwall($a, $uid) { } } - if (($datarray['app'] == "Events") and isset($item->actions)) + /*if (($datarray['app'] == "Events") and isset($item->actions)) foreach ($item->actions as $action) if ($action->name == "View") $_REQUEST["body"] .= " [url=".$action->link."]".$item->story."[/url]"; + */ if(trim($_REQUEST["body"]) == '') { logger('facebook: empty body '.$item->id.' '.print_r($item, true)); From 8c154ddd08a6ac8d6666bb1090107546afed2f24 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 2 Jan 2013 22:48:10 +0100 Subject: [PATCH 16/19] fbpost: New permissions required for reading all wall posts. --- fbpost/fbpost.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index 890f805b..0c7e454a 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -213,7 +213,7 @@ function fbpost_content(&$a) { $o .= '
'; $o .= '' . t('Install Facebook Post connector for this account.') . ''; + . $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=read_stream,publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Install Facebook Post connector for this account.') . ''; $o .= '
'; } @@ -225,7 +225,7 @@ function fbpost_content(&$a) { $o .= '
'; $o .= '' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . ''; + . $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=read_stream,publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . ''; $o .= '
'; $o .= '
'; From a546a251077f4740df54936703a1084adf354d49 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 3 Jan 2013 22:11:46 +0100 Subject: [PATCH 17/19] fbpost: Beautifying the import to friendica statusnet+twitter: Beautifying the export to statusnet and twitter, solving the problem that posts were sometimes send twice --- fbpost/fbpost.php | 18 +++++++++++------- statusnet/statusnet.php | 11 ++++++++++- twitter/twitter.php | 11 ++++++++++- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index 0c7e454a..51bed7eb 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -1048,7 +1048,7 @@ function fbpost_fetchwall($a, $uid) { elseif (isset($item->name)) $_REQUEST["body"] .= "\n\n[b]" . $item->name."[/b]"; - if(isset($item->caption)) { + /*if(isset($item->caption)) { if(!isset($item->name) and isset($item->link)) $_REQUEST["body"] .= "\n\n[bookmark=".$item->link."]".$item->caption."[/bookmark]"; //else @@ -1060,22 +1060,26 @@ function fbpost_fetchwall($a, $uid) { $_REQUEST["body"] .= "\n[url]".$item->link."[/url]\n"; else $_REQUEST["body"] .= "\n"; - } + }*/ $quote = ""; - if(isset($item->description)) + if(isset($item->description) and ($item->type != "photo")) $quote = $item->description; - if (isset($item->properties)) - foreach ($item->properties as $property) - $quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]"; + if(isset($item->caption) and ($item->type == "photo")) + $quote = $item->caption; + + //if (isset($item->properties)) + // foreach ($item->properties as $property) + // $quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]"; if ($quote) $_REQUEST["body"] .= "\n[quote]".$quote."[/quote]"; // Only import the picture when the message is no video // oembed display a picture of the video as well - if ($item->type != "video") { + //if ($item->type != "video") { + if (($item->type != "video") and ($item->type != "photo")) { if(isset($item->picture) && isset($item->link)) $_REQUEST["body"] .= "\n".'[url='.$item->link.'][img]'.fpost_cleanpicture($item->picture).'[/img][/url]'; else { diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index d5097c13..b5d55ed7 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -448,6 +448,10 @@ function statusnet_shortenmsg($b, $max_char) { if ($b["title"] != "") $body = $b["title"]."\n\n".$body; + // Add some newlines so that the message could be cut better + $body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"), + array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body); + // remove the recycle signs and the names since they aren't helpful on twitter // recycle 1 $recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); @@ -773,6 +777,11 @@ function statusnet_fetchtimeline($a, $uid) { $osecret = get_pconfig($uid, 'statusnet', 'oauthsecret'); $lastid = get_pconfig($uid, 'statusnet', 'lastid'); + $application_name = get_config('statusnet', 'application_name'); + + if ($application_name == "") + $application_name = $a->get_hostname(); + $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret); $parameters = array("exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false); @@ -793,7 +802,7 @@ function statusnet_fetchtimeline($a, $uid) { if ($post->in_reply_to_status_id != "") continue; - if (!strpos($post->source, $a->get_hostname())) { + if (!strpos($post->source, $application_name)) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; diff --git a/twitter/twitter.php b/twitter/twitter.php index 3056f57b..2be686b3 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -306,6 +306,10 @@ function twitter_shortenmsg($b) { if ($b["title"] != "") $body = $b["title"]."\n\n".$body; + // Add some newlines so that the message could be cut better + $body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"), + array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body); + // remove the recycle signs and the names since they aren't helpful on twitter // recycle 1 $recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); @@ -581,6 +585,11 @@ function twitter_fetchtimeline($a, $uid) { $osecret = get_pconfig($uid, 'twitter', 'oauthsecret'); $lastid = get_pconfig($uid, 'twitter', 'lastid'); + $application_name = get_config('twitter', 'application_name'); + + if ($application_name == "") + $application_name = $a->get_hostname(); + require_once('library/twitteroauth.php'); $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret); @@ -596,7 +605,7 @@ function twitter_fetchtimeline($a, $uid) { if ($post->id_str > $lastid) $lastid = $post->id_str; - if (!strpos($post->source, $a->get_hostname())) { + if (!strpos($post->source, $application_name)) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; From 268c296f8b7c9b293808d5c0e3334dce883c9f3c Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 5 Jan 2013 15:56:04 +0100 Subject: [PATCH 18/19] Twitter connector: fix smarty issue --- twitter/twitter.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index 6cb2d9cd..356d855a 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -506,12 +506,7 @@ function twitter_plugin_admin_post(&$a){ function twitter_plugin_admin(&$a, &$o){ $t = get_markup_template( "admin.tpl", "addon/twitter/" ); - $includes = array( - '$field_input' => 'field_input.tpl', - ); - $includes = set_template_includes($a->theme['template_engine'], $includes); - - $o = replace_macros($t, $includes + array( + $o = replace_macros($t, array( '$submit' => t('Submit'), // name, label, value, help, [extra values] '$consumerkey' => array('consumerkey', t('Consumer key'), get_config('twitter', 'consumerkey' ), ''), From 7d3bf7144f83cbd64c67d4f7b491d4fccbdf1778 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 5 Jan 2013 16:33:39 +0100 Subject: [PATCH 19/19] statusnet/twitter: Don't include the quoted text when sending an update fbpost: Trying to beautify the posts from facebook. --- fbpost/fbpost.php | 4 ++-- statusnet/statusnet.php | 14 ++++++++++++++ twitter/twitter.php | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index 51bed7eb..bef8117e 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -1078,8 +1078,8 @@ function fbpost_fetchwall($a, $uid) { // Only import the picture when the message is no video // oembed display a picture of the video as well - //if ($item->type != "video") { - if (($item->type != "video") and ($item->type != "photo")) { + if ($item->type != "video") { + //if (($item->type != "video") and ($item->type != "photo")) { if(isset($item->picture) && isset($item->link)) $_REQUEST["body"] .= "\n".'[url='.$item->link.'][img]'.fpost_cleanpicture($item->picture).'[/img][/url]'; else { diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index b5d55ed7..6a00d3df 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -448,6 +448,20 @@ function statusnet_shortenmsg($b, $max_char) { if ($b["title"] != "") $body = $b["title"]."\n\n".$body; + if (strpos($body, "[bookmark") !== false) { + // splitting the text in two parts: + // before and after the bookmark + $pos = strpos($body, "[bookmark"); + $body1 = substr($body, 0, $pos); + $body2 = substr($body, $pos); + + // Removing all quotes after the bookmark + // they are mostly only the content after the bookmark. + $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2); + $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2); + $body = $body1.$body2; + } + // Add some newlines so that the message could be cut better $body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"), array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body); diff --git a/twitter/twitter.php b/twitter/twitter.php index 2be686b3..26c684f1 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -306,6 +306,20 @@ function twitter_shortenmsg($b) { if ($b["title"] != "") $body = $b["title"]."\n\n".$body; + if (strpos($body, "[bookmark") !== false) { + // splitting the text in two parts: + // before and after the bookmark + $pos = strpos($body, "[bookmark"); + $body1 = substr($body, 0, $pos); + $body2 = substr($body, $pos); + + // Removing all quotes after the bookmark + // they are mostly only the content after the bookmark. + $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2); + $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2); + $body = $body1.$body2; + } + // Add some newlines so that the message could be cut better $body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"), array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body);