diff --git a/altpager.tgz b/altpager.tgz index 87bb2f8f..fbfd5594 100644 Binary files a/altpager.tgz and b/altpager.tgz differ diff --git a/altpager/altpager.php b/altpager/altpager.php index 20517d2f..c6f537bd 100755 --- a/altpager/altpager.php +++ b/altpager/altpager.php @@ -93,7 +93,7 @@ function altpager_settings(&$a,&$s) { } function altpager_plugin_admin(&$a, &$o){ - $t = file_get_contents( "addon/altpager/admin.tpl" ); + $t = get_markup_template( "admin.tpl", "addon/altpager/" ); $o = replace_macros($t, array( '$submit' => t('Submit'), '$global' => array('altpagerchoice', t('Global'), 1, t('Force global use of the alternate pager'), get_config('alt_pager', 'global') == 1), @@ -106,3 +106,4 @@ function altpager_plugin_admin_post(&$a){ set_config('alt_pager','global',($choice == 1 ? 1 : 0)); info( t('Settings updated.'). EOL ); } + diff --git a/altpager/admin.tpl b/altpager/view/admin.tpl old mode 100755 new mode 100644 similarity index 100% rename from altpager/admin.tpl rename to altpager/view/admin.tpl diff --git a/remote_permissions/admin.tpl b/altpager/view/admin.tpl.old old mode 100644 new mode 100755 similarity index 100% rename from remote_permissions/admin.tpl rename to altpager/view/admin.tpl.old diff --git a/altpager/view/smarty3/admin.tpl b/altpager/view/smarty3/admin.tpl new file mode 100644 index 00000000..e67afd73 --- /dev/null +++ b/altpager/view/smarty3/admin.tpl @@ -0,0 +1,3 @@ +{{include file="field_radio.tpl" field=$global}} +{{include file="field_radio.tpl" field=$individual}} +
diff --git a/blackout.tgz b/blackout.tgz index 4b5a5d31..6d081dc4 100644 Binary files a/blackout.tgz and b/blackout.tgz differ diff --git a/blackout/blackout.php b/blackout/blackout.php index 2cb7c041..83495611 100644 --- a/blackout/blackout.php +++ b/blackout/blackout.php @@ -93,8 +93,9 @@ function blackout_plugin_admin(&$a, &$o) { if (! is_string($myend)) { $myend = "YYYY-MM-DD:hhmm"; } $myurl = get_config('blackout','url'); if (! is_string($myurl)) { $myurl = "http://www.example.com"; } - $t = file_get_contents( dirname(__file__)."/admin.tpl" ); - $o = replace_macros($t, array( + $t = get_markup_template( "admin.tpl", "addon/blackout/" ); + + $o = replace_macros($t, array( '$submit' => t('Submit'), '$rurl' => array("rurl", "Redirect URL", $myurl, "all your visitors from the web will be redirected to this URL"), '$startdate' => array("startdate", "Begin of the Blackout
(YYYY-MM-DD hh:mm)", $mystart, "format is YYYY year, MM month, DD day, hh hour and mm minute"), diff --git a/blackout/admin.tpl b/blackout/view/admin.tpl similarity index 100% rename from blackout/admin.tpl rename to blackout/view/admin.tpl diff --git a/blackout/view/smarty3/admin.tpl b/blackout/view/smarty3/admin.tpl new file mode 100644 index 00000000..11a4d914 --- /dev/null +++ b/blackout/view/smarty3/admin.tpl @@ -0,0 +1,11 @@ +{{include file="field_input.tpl" field=$startdate}} +{{include file="field_input.tpl" field=$enddate}} +{{include file="field_input.tpl" field=$rurl}} + +
Note: The redirect will be active from the moment you +press the submit button. Users currently logged in will not be +thrown out but can't login again after logging out should the blackout is +still in place.
+ +
diff --git a/communityhome.tgz b/communityhome.tgz index 20f7b964..ab251425 100755 Binary files a/communityhome.tgz and b/communityhome.tgz differ 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 484842cc..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 */ @@ -35,152 +35,166 @@ 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'); - 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'); - 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'); +# $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl'); + $tpl = get_markup_template('communityhome.tpl', 'addon/communityhome/'); $a->page['aside'] = replace_macros($tpl, $aside); $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/communityhome.tpl b/communityhome/view/communityhome.tpl similarity index 100% rename from communityhome/communityhome.tpl rename to communityhome/view/communityhome.tpl diff --git a/communityhome/directory_item.tpl b/communityhome/view/directory_item.tpl similarity index 62% rename from communityhome/directory_item.tpl rename to communityhome/view/directory_item.tpl index db1936e4..f32f5a4f 100755 --- a/communityhome/directory_item.tpl +++ b/communityhome/view/directory_item.tpl @@ -2,8 +2,8 @@
diff --git a/communityhome/view/smarty3/communityhome.tpl b/communityhome/view/smarty3/communityhome.tpl new file mode 100644 index 00000000..b8f80381 --- /dev/null +++ b/communityhome/view/smarty3/communityhome.tpl @@ -0,0 +1,70 @@ + +{{if $noOid}} +

{{$login_title}}

+{{else}} + +{{/if}} +{{$login_form}} + + +{{if $lastusers_title}} +

{{$lastusers_title}}

+
+{{foreach $lastusers_items as $i}} + {{$i}} +{{/foreach}} +
+{{/if}} + + +{{if $activeusers_title}} +

{{$activeusers_title}}

+
+{{foreach $activeusers_items as $i}} + {{$i}} +{{/foreach}} +
+{{/if}} + +{{if $photos_title}} +

{{$photos_title}}

+
+{{foreach $photos_items as $i}} + {{$i}} +{{/foreach}} +
+{{/if}} + + +{{if $like_title}} +

{{$like_title}}

+ +{{/if}} diff --git a/communityhome/view/smarty3/directory_item.tpl b/communityhome/view/smarty3/directory_item.tpl new file mode 100644 index 00000000..5fb11986 --- /dev/null +++ b/communityhome/view/smarty3/directory_item.tpl @@ -0,0 +1,10 @@ + +
+
+
+ + {{$alt}}-text + +
+
+
diff --git a/extcron.tgz b/extcron.tgz index 0e5b2892..dabe1d09 100755 Binary files a/extcron.tgz and b/extcron.tgz differ diff --git a/extcron/extcron.php b/extcron/extcron.php index e3c21209..3eb34cdc 100755 --- a/extcron/extcron.php +++ b/extcron/extcron.php @@ -5,7 +5,7 @@ * Name: external cron * Description: Use external server or service to run poller regularly * Version: 1.0 - * Author: Mike Macgirvin + * Author: Mike Macgirvin * * Notes: External service needs to make a web request to http(s)://yoursite/extcron */ diff --git a/facebook.tgz b/facebook.tgz index 6bf8f7a9..2dbd4efd 100644 Binary files a/facebook.tgz and b/facebook.tgz differ diff --git a/facebook/facebook.php b/facebook/facebook.php index f977bef9..4c1c0a14 100644 --- a/facebook/facebook.php +++ b/facebook/facebook.php @@ -383,10 +383,12 @@ function fb_get_friends_sync_full($uid, $access_token, $persons) { if($s) { $results = json_decode($s); logger('fb_get_friends: info: ' . print_r($results,true), LOGGER_DATA); - foreach ($results as $contact) { - if ($contact->code != 200) logger('fb_get_friends: not found: ' . print_r($contact,true), LOGGER_DEBUG); - else fb_get_friends_sync_parsecontact($uid, json_decode($contact->body)); - } + if(count($results)) { + foreach ($results as $contact) { + if ($contact->code != 200) logger('fb_get_friends: not found: ' . print_r($contact,true), LOGGER_DEBUG); + else fb_get_friends_sync_parsecontact($uid, json_decode($contact->body)); + } + } } } } diff --git a/fbpost.tgz b/fbpost.tgz index ecf933d8..790a5732 100644 Binary files a/fbpost.tgz and b/fbpost.tgz differ diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index ab49c303..1486afdb 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); @@ -209,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 .= '
'; } @@ -221,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 .= '
'; @@ -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,14 @@ function fbpost_post_hook(&$a,&$b) { if($b['deleted'] || ($b['created'] !== $b['edited'])) return; + // Don't transmit answers (have to be cleaned up in the following code) + if($b['parent'] != $b['id']) + return; + + // if post comes from facebook don't send it back + if($b['app'] == "Facebook") + return; + /** * Post to Facebook stream */ @@ -931,28 +947,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 +981,214 @@ 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'); + $post_to_page = get_pconfig($uid,'facebook','post_to_page'); + $lastcreated = get_pconfig($uid,'facebook','last_created'); + + if ((int)$post_to_page == 0) + $post_to_page = "me"; + + $url = "https://graph.facebook.com/".$post_to_page."/feed?access_token=".$access_token; + + $first_time = ($lastcreated == ""); + + 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 ($first_time) + continue; + + if ($item->application->id == get_config('facebook','appid')) + continue; + + if(isset($item->privacy) && ($item->privacy->value !== 'EVERYONE') && ($item->privacy->value !== '')) + 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) and ($item->type != "photo")) + $quote = $item->description; + + 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") 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 { + 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/forumdirectory.tgz b/forumdirectory.tgz index 09fcb4ce..0a84585d 100644 Binary files a/forumdirectory.tgz and b/forumdirectory.tgz differ diff --git a/forumdirectory/forumdirectory.php b/forumdirectory/forumdirectory.php index 83f19d01..9837b9c1 100644 --- a/forumdirectory/forumdirectory.php +++ b/forumdirectory/forumdirectory.php @@ -163,16 +163,17 @@ function forumdirectory_content(&$a) { $about = ((x($profile,'about') == 1) ? t('About:') : False); - $tpl = file_get_contents( dirname(__file__).'/forumdirectory_item.tpl'); +# $tpl = file_get_contents( dirname(__file__).'/forumdirectory_item.tpl'); + $tpl = get_markup_template( 'forumdirectory_item.tpl', 'addon/forumdirectory/' ); $entry = replace_macros($tpl,array( '$id' => $rr['id'], - '$profile-link' => $profile_link, + '$profile_link' => $profile_link, '$photo' => $a->get_cached_avatar_image($rr[$photo]), - '$alt-text' => $rr['name'], + '$alt_text' => $rr['name'], '$name' => $rr['name'], '$details' => $pdesc . $details, - '$page-type' => $page_type, + '$page_type' => $page_type, '$profile' => $profile, '$location' => template_escape($location), '$gender' => $gender, diff --git a/forumdirectory/forumdirectory_item.tpl b/forumdirectory/view/forumdirectory_item.tpl similarity index 94% rename from forumdirectory/forumdirectory_item.tpl rename to forumdirectory/view/forumdirectory_item.tpl index 3b24d25f..e1bbffec 100755 --- a/forumdirectory/forumdirectory_item.tpl +++ b/forumdirectory/view/forumdirectory_item.tpl @@ -2,14 +2,14 @@
$name
-
$page-type
+
$page_type
{{ if $pdesc }}
$profile.pdesc
{{ endif }}
diff --git a/forumdirectory/view/smarty3/forumdirectory_item.tpl b/forumdirectory/view/smarty3/forumdirectory_item.tpl new file mode 100644 index 00000000..66410efe --- /dev/null +++ b/forumdirectory/view/smarty3/forumdirectory_item.tpl @@ -0,0 +1,42 @@ + +
+
+
+ + {{$alt_text}} + +
+
+
+
{{$name}}
+
{{$page_type}}
+ {{if $pdesc}}
{{$profile.pdesc}}
{{/if}} +
+
+ {{if $location}} +
{{$location}}
+
+ {{if $profile.address}}
{{$profile.address}}
{{/if}} + + {{$profile.locality}}{{if $profile.locality}}, {{/if}} + {{$profile.region}} + {{$profile.postal-code}} + + {{if $profile.country-name}}{{$profile.country-name}}{{/if}} +
+
+ {{/if}} + + {{if $gender}}
{{$gender}}
{{$profile.gender}}
{{/if}} +
+
+ {{if $marital}}
{{$marital}}
{{$profile.marital}}
{{/if}} + + {{if $homepage}}
{{$homepage}}
{{$profile.homepage}}
{{/if}} +
+
+
+ {{if $about}}
{{$about}}
{{$profile.about}}
{{/if}} +
+
+
diff --git a/forumlist.tgz b/forumlist.tgz index 1f303145..8356d443 100644 Binary files a/forumlist.tgz and b/forumlist.tgz differ 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 .= '"; } } else { diff --git a/fromgplus.tgz b/fromgplus.tgz index 712019e4..0a402b76 100644 Binary files a/fromgplus.tgz and b/fromgplus.tgz differ diff --git a/fromgplus/README b/fromgplus/README index db5bb38e..82a29f66 100644 --- a/fromgplus/README +++ b/fromgplus/README @@ -7,4 +7,9 @@ $a->config['fromgplus']['poll_interval'] = 10; You need an API key for "Simple API Access". -You get it via https://code.google.com/apis/console/ and then "API Access". +- You go to https://code.google.com/apis/console/ +- Then you go to "Services" and activate "Google+ API". +- After that you go to "API Access". +- At the bottom of the page you see "Simple API Access". + +The value after "API key:" is the key that you need. diff --git a/fromgplus/fromgplus.php b/fromgplus/fromgplus.php index a6760ca5..f7841300 100644 --- a/fromgplus/fromgplus.php +++ b/fromgplus/fromgplus.php @@ -327,22 +327,27 @@ function fromgplus_fetch($a, $uid) { case "activity": $post = fromgplus_html2bbcode($item->annotation)."\n"; - $post .= fromgplus_html2bbcode("♲"); - //$post .= html2bbcode("♻"); - //$post .= fromgplus_html2bbcode("◌"); - $post .= " [url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url] \n"; - /*$post .= "[share author='".$item->object->actor->displayName. - "' profile='".$item->object->actor->url. - "' avatar='".$item->object->actor->image->url. - "' link='".$item->object->url."']\n";*/ + if (intval(get_config('system','new_share'))) { + $post .= "[share author='".str_replace("'", "'",$item->object->actor->displayName). + "' profile='".$item->object->actor->url. + "' avatar='".$item->object->actor->image->url. + "' link='".$item->object->url."']"; - $post .= fromgplus_html2bbcode($item->object->content); + $post .= fromgplus_html2bbcode($item->object->content); - if (is_array($item->object->attachments)) - $post .= "\n".trim(fromgplus_handleattachments($item)); + if (is_array($item->object->attachments)) + $post .= "\n".trim(fromgplus_handleattachments($item)); - //$post .= "[/share]"; + $post .= "[/share]"; + } else { + $post .= fromgplus_html2bbcode("♲"); + $post .= " [url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url] \n"; + $post .= fromgplus_html2bbcode($item->object->content); + + if (is_array($item->object->attachments)) + $post .= "\n".trim(fromgplus_handleattachments($item)); + } if (isset($item->address)) $location = $item->address; diff --git a/geonames/geonames.php b/geonames/geonames.php index 8226fc0b..19725bef 100755 --- a/geonames/geonames.php +++ b/geonames/geonames.php @@ -40,8 +40,8 @@ function geonames_install() { * */ - register_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_settings'); - register_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_settings_post'); + register_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin'); + register_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post'); logger("installed geonames"); } @@ -58,8 +58,8 @@ function geonames_uninstall() { */ unregister_hook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook'); - unregister_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_settings'); - unregister_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_settings_post'); + unregister_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin'); + unregister_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post'); logger("removed geonames"); @@ -135,7 +135,7 @@ function geonames_post_hook($a, &$item) { * */ -function geonames_settings_post($a,$post) { +function geonames_plugin_admin_post($a,$post) { if(! local_user() || (! x($_POST,'geonames-submit'))) return; set_pconfig(local_user(),'geonames','enable',intval($_POST['geonames'])); @@ -153,7 +153,7 @@ function geonames_settings_post($a,$post) { -function geonames_settings(&$a,&$s) { +function geonames_plugin_admin(&$a,&$s) { if(! local_user()) return; diff --git a/gravatar.tgz b/gravatar.tgz index 25106f26..561c4aae 100644 Binary files a/gravatar.tgz and b/gravatar.tgz differ diff --git a/gravatar/gravatar.php b/gravatar/gravatar.php index fc5358eb..12a8e44f 100644 --- a/gravatar/gravatar.php +++ b/gravatar/gravatar.php @@ -55,7 +55,7 @@ function gravatar_lookup($a, &$b) { * Display admin settings for this addon */ function gravatar_plugin_admin (&$a, &$o) { - $t = file_get_contents( dirname(__file__)."/admin.tpl"); + $t = get_markup_template( "admin.tpl", "addon/gravatar/" ); $default_avatar = get_config('gravatar', 'default_img'); $rating = get_config('gravatar', 'rating'); diff --git a/gravatar/admin.tpl b/gravatar/view/admin.tpl similarity index 100% rename from gravatar/admin.tpl rename to gravatar/view/admin.tpl diff --git a/gravatar/view/smarty3/admin.tpl b/gravatar/view/smarty3/admin.tpl new file mode 100644 index 00000000..5dfd4488 --- /dev/null +++ b/gravatar/view/smarty3/admin.tpl @@ -0,0 +1,3 @@ +{{include file="field_select.tpl" field=$default_avatar}} +{{include file="field_select.tpl" field=$rating}} +
diff --git a/impressum.tgz b/impressum.tgz index 8c36df6f..b47b625c 100755 Binary files a/impressum.tgz and b/impressum.tgz differ diff --git a/impressum/impressum.php b/impressum/impressum.php index 9d038178..3c1106c9 100755 --- a/impressum/impressum.php +++ b/impressum/impressum.php @@ -78,7 +78,7 @@ function impressum_plugin_admin_post (&$a) { info( t('Settings updated.'). EOL ); } function impressum_plugin_admin (&$a, &$o) { - $t = file_get_contents( dirname(__file__). "/admin.tpl" ); + $t = get_markup_template( "admin.tpl", "addon/impressum/" ); $o = replace_macros($t, array( '$submit' => t('Submit'), '$owner' => array('owner', t('Site Owner'), get_config('impressum','owner'), t('The page operators name.')), diff --git a/impressum/admin.tpl b/impressum/view/admin.tpl old mode 100755 new mode 100644 similarity index 100% rename from impressum/admin.tpl rename to impressum/view/admin.tpl diff --git a/impressum/view/smarty3/admin.tpl b/impressum/view/smarty3/admin.tpl new file mode 100644 index 00000000..80b67824 --- /dev/null +++ b/impressum/view/smarty3/admin.tpl @@ -0,0 +1,7 @@ +{{include file="field_input.tpl" field=$owner}} +{{include file="field_input.tpl" field=$ownerprofile}} +{{include file="field_textarea.tpl" field=$postal}} +{{include file="field_textarea.tpl" field=$notes}} +{{include file="field_input.tpl" field=$email}} +{{include file="field_textarea.tpl" field=$footer_text}} +
diff --git a/libravatar.tgz b/libravatar.tgz index 0405af9b..d61f63ba 100644 Binary files a/libravatar.tgz and b/libravatar.tgz differ diff --git a/libravatar/libravatar.php b/libravatar/libravatar.php index 08ed6d00..8cbf1e98 100644 --- a/libravatar/libravatar.php +++ b/libravatar/libravatar.php @@ -60,7 +60,7 @@ function libravatar_lookup($a, &$b) { * Display admin settings for this addon */ function libravatar_plugin_admin (&$a, &$o) { - $t = file_get_contents( dirname(__file__)."/admin.tpl"); + $t = get_markup_template( "admin.tpl", "addon/libravatar" ); $default_avatar = get_config('libravatar', 'default_img'); diff --git a/libravatar/admin.tpl b/libravatar/view/admin.tpl similarity index 100% rename from libravatar/admin.tpl rename to libravatar/view/admin.tpl diff --git a/libravatar/view/smarty3/admin.tpl b/libravatar/view/smarty3/admin.tpl new file mode 100644 index 00000000..ee958287 --- /dev/null +++ b/libravatar/view/smarty3/admin.tpl @@ -0,0 +1,2 @@ +{{include file="field_select.tpl" field=$default_avatar}} +
diff --git a/mathjax.tgz b/mathjax.tgz index 37bfbf61..a340aee4 100644 Binary files a/mathjax.tgz and b/mathjax.tgz differ diff --git a/mathjax/mathjax.php b/mathjax/mathjax.php index 7105772b..e57d69bf 100644 --- a/mathjax/mathjax.php +++ b/mathjax/mathjax.php @@ -66,11 +66,12 @@ function mathjax_plugin_admin_post (&$a) { info( t('Settings updated.'). EOL); } function mathjax_plugin_admin (&$a, &$o) { - $t = file_get_contents( dirname(__file__)."/admin.tpl"); - if (get_config('mathjax','baseurl','') == '') { - set_config('mathjax','baseurl','http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'); - } - $o = replace_macros( $t, array( + $t = get_markup_template( "admin.tpl", "addon/mathjax/" ); + if (get_config('mathjax','baseurl','') == '') { + set_config('mathjax','baseurl','http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'); + } + + $o = replace_macros( $t, array( '$baseurl' => array('baseurl', t('MathJax Base URL'), get_config('mathjax','baseurl' ), t('The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax.')), - )); + )); } diff --git a/mathjax/admin.tpl b/mathjax/view/admin.tpl similarity index 100% rename from mathjax/admin.tpl rename to mathjax/view/admin.tpl diff --git a/mathjax/view/smarty3/admin.tpl b/mathjax/view/smarty3/admin.tpl new file mode 100644 index 00000000..f6ec03e0 --- /dev/null +++ b/mathjax/view/smarty3/admin.tpl @@ -0,0 +1,2 @@ +{{include file="field_input.tpl" field=$baseurl}} +
diff --git a/openstreetmap.tgz b/openstreetmap.tgz index c195d151..967b5601 100644 Binary files a/openstreetmap.tgz and b/openstreetmap.tgz differ diff --git a/openstreetmap/openstreetmap.js b/openstreetmap/openstreetmap.js new file mode 100644 index 00000000..479e769c --- /dev/null +++ b/openstreetmap/openstreetmap.js @@ -0,0 +1,41 @@ +var toolserver = 'http://toolserver.org/~kolossos/openlayers/kml-on-ol.php'; +var startTag = ''; + +jQuery(document).ready(function($) { + + $('.wall-item-content-wrapper').each(function(index) { + var link = $(this).find('.wall-item-location .OSMMapLink'); + link.toggle(addIframe, removeIframe); + }); +}); + +function addIframe(ev) { + var coordinate = $(ev.target).attr('title'); + + var newTag = startTag + convertCoordinateString(coordinate) + endTag; + $(ev.target).parents('.wall-item-content-wrapper').append(newTag); +} + +function removeIframe(ev) { + $(ev.target).parents('.wall-item-content-wrapper').find('iframe').remove(); + +} + +function convertCoordinateString(coordinate) { + var locstring = coordinate.split(' '); + var northSouth; + var westEast; + + if (locstring[0] < 0) { + northSouth = '_S_'; + }else{ + northSouth = '_N_'; + } + if (locstring[1] < 0) { + westEast = '_W'; + }else{ + westEast = '_E'; + } + return Math.abs(locstring[0]) + northSouth + Math.abs(locstring[1]) + westEast; +} \ No newline at end of file diff --git a/openstreetmap/openstreetmap.php b/openstreetmap/openstreetmap.php index fda29905..2c5975eb 100755 --- a/openstreetmap/openstreetmap.php +++ b/openstreetmap/openstreetmap.php @@ -10,24 +10,33 @@ function openstreetmap_install() { register_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location'); + register_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader'); logger("installed openstreetmap"); } function openstreetmap_uninstall() { unregister_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location'); + unregister_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader'); logger("removed openstreetmap"); } +function openstreetmap_alterheader($a, &$navHtml) { + $addScriptTag='' . "\r\n"; + $a->page['htmlhead'] .= $addScriptTag; +} function openstreetmap_location($a, &$item) { + + // + if(! (strlen($item['location']) || strlen($item['coord']))) - return; + return; /* * Get the configuration variables from the .htconfig file. - */ + */ $tmsserver = get_config('openstreetmap','tmsserver'); if(! $tmsserver) $tmsserver = 'http://openstreetmap.org'; @@ -38,12 +47,27 @@ function openstreetmap_location($a, &$item) { $location = ''; $coord = ''; + + if($item['location'] && !$item['coord'] && true){ //if only a location is given, find the lat-lon + $geo_account='demo'; + + $s = fetch_url('http://api.geonames.org/search?maxRows=1&fuzzy=0.8&q=' . $item['location'] . '&username=' . $geo_account); + + if($s){ + $xml = parse_xml_string($s); + + if($xml->geoname->lat && $xml->geoname->lng){ + $item['coord'] = $xml->geoname->lat . ' ' . $xml->geoname->lng; + } + } + } + $location = (($item['location']) ? '' . $item['location'] . '' : ''); if($item['coord']) { $coords = explode(' ', $item['coord']); if(count($coords) > 1) { - $coord = '' . $item['coord'] . '' ; + $coord = ' Map ' ; } } if(strlen($coord)) { @@ -58,7 +82,7 @@ function openstreetmap_location($a, &$item) { function openstreetmap_plugin_admin (&$a, &$o) { - $t = file_get_contents( dirname(__file__)."/admin.tpl"); + $t = get_markup_template( "admin.tpl", "addon/openstreetmap/" ); $tmsserver = get_config('openstreetmap','tmsserver'); if(! $tmsserver) $tmsserver = 'http://openstreetmap.org'; @@ -67,9 +91,9 @@ function openstreetmap_plugin_admin (&$a, &$o) { $zoom = 17; $o = replace_macros( $t, array( - '$submit' => t('Submit'), - '$tmsserver' => array('tmsserver', t('Tile Server URL'), $tmsserver, t('A list of public tile servers')), - '$zoom' => array('zoom', t('Default zoom'), $zoom, t('The default zoom level. (1:world, 18:highest)')), + '$submit' => t('Submit'), + '$tmsserver' => array('tmsserver', t('Tile Server URL'), $tmsserver, t('A list of public tile servers')), + '$zoom' => array('zoom', t('Default zoom'), $zoom, t('The default zoom level. (1:world, 18:highest)')), )); } function openstreetmap_plugin_admin_post (&$a) { diff --git a/openstreetmap/admin.tpl b/openstreetmap/view/admin.tpl similarity index 100% rename from openstreetmap/admin.tpl rename to openstreetmap/view/admin.tpl diff --git a/openstreetmap/view/smarty3/admin.tpl b/openstreetmap/view/smarty3/admin.tpl new file mode 100644 index 00000000..6ee07174 --- /dev/null +++ b/openstreetmap/view/smarty3/admin.tpl @@ -0,0 +1,3 @@ +{{include file="field_input.tpl" field=$tmsserver}} +{{include file="field_input.tpl" field=$zoom}} +
diff --git a/page.tgz b/page.tgz index 02140ce9..c9610e28 100644 Binary files a/page.tgz and b/page.tgz differ diff --git a/piwik.tgz b/piwik.tgz index 080dd9e3..a5bd437a 100755 Binary files a/piwik.tgz and b/piwik.tgz differ diff --git a/piwik/piwik.php b/piwik/piwik.php index 9ba15db6..3501b2c8 100755 --- a/piwik/piwik.php +++ b/piwik/piwik.php @@ -84,7 +84,7 @@ function piwik_analytics($a,&$b) { } } function piwik_plugin_admin (&$a, &$o) { - $t = file_get_contents( dirname(__file__)."/admin.tpl"); + $t = get_markup_template( "admin.tpl", "addon/piwik/" ); $o = replace_macros( $t, array( '$submit' => t('Submit'), '$baseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), t('Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)')), diff --git a/piwik/admin.tpl b/piwik/view/admin.tpl old mode 100755 new mode 100644 similarity index 100% rename from piwik/admin.tpl rename to piwik/view/admin.tpl diff --git a/piwik/view/smarty3/admin.tpl b/piwik/view/smarty3/admin.tpl new file mode 100644 index 00000000..bfe04aa3 --- /dev/null +++ b/piwik/view/smarty3/admin.tpl @@ -0,0 +1,5 @@ +{{include file="field_input.tpl" field=$baseurl}} +{{include file="field_input.tpl" field=$siteid}} +{{include file="field_checkbox.tpl" field=$optout}} +{{include file="field_checkbox.tpl" field=$async}} +
diff --git a/privacy_image_cache.tgz b/privacy_image_cache.tgz index 13239d90..45444a68 100644 Binary files a/privacy_image_cache.tgz and b/privacy_image_cache.tgz differ diff --git a/privacy_image_cache/privacy_image_cache.php b/privacy_image_cache/privacy_image_cache.php index a47f0e1a..0e241e7e 100644 --- a/privacy_image_cache/privacy_image_cache.php +++ b/privacy_image_cache/privacy_image_cache.php @@ -119,7 +119,17 @@ function privacy_image_cache_init() { // It shouldn't happen but it does - spaces in URL $_REQUEST['url'] = str_replace(" ", "+", $_REQUEST['url']); - $img_str = fetch_url($_REQUEST['url'],true); + // 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"; + + $redirects = 0; + $img_str = fetch_url($_REQUEST['url'],true, $redirects, 10); $tempfile = tempnam(get_config("system","temppath"), "cache"); file_put_contents($tempfile, $img_str); @@ -132,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") { @@ -226,13 +236,21 @@ function privacy_image_cache_cachename($url, $writemode = false) { * @return boolean */ function privacy_image_cache_is_local_image($url) { - if ($url[0] == '/') return true; + if ($url[0] == '/') return true; + if (strtolower(substr($url, 0, 5)) == "data:") return true; + // Check if the cached path would be longer than 255 characters - apache doesn't like it + if (is_dir($_SERVER["DOCUMENT_ROOT"]."/privacy_image_cache")) { + $cachedurl = get_app()->get_baseurl()."/privacy_image_cache/". privacy_image_cache_cachename($url); + if (strlen($url) > 255) + return true; + } + // links normalised - bug #431 - $baseurl = normalise_link(get_app()->get_baseurl()); + $baseurl = normalise_link(get_app()->get_baseurl()); $url = normalise_link($url); - return (substr($url, 0, strlen($baseurl)) == $baseurl); + return (substr($url, 0, strlen($baseurl)) == $baseurl); } /** @@ -311,14 +329,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 @@ -364,3 +380,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; +} diff --git a/procrunner.tgz b/procrunner.tgz new file mode 100644 index 00000000..fec9dfa7 Binary files /dev/null and b/procrunner.tgz differ diff --git a/procrunner/procrunner.php b/procrunner/procrunner.php new file mode 100755 index 00000000..4c6f64b6 --- /dev/null +++ b/procrunner/procrunner.php @@ -0,0 +1,53 @@ + + * Author: Mike Macgirvin + */ + +function procrunner_install() { + + $addons = get_config('system','addon'); + if(strstr('poormancron',$addons)) { + logger('procrunner incompatible with poormancron. Not installing procrunner.'); + return; + } + + // check for command line php + $a = get_app(); + $ex = Array(); + $ex[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); + $ex[1] = dirname(dirname(dirname(__file__)))."/testargs.php"; + $ex[2] = "test"; + $out = exec(implode(" ", $ex)); + if ($out==="test") { + logger('procrunner not required on this system. Not installing.'); + return; + } else { + register_hook('proc_run', 'addon/procrunner/procrunner.php','procrunner_procrun'); + logger("installed procrunner"); + } + +} + +function procrunner_uninstall() { + unregister_hook('proc_run', 'addon/procrunner/procrunner.php','procrunner_procrun'); + logger("removed procrunner"); +} + + + +function procrunner_procrun(&$a, &$arr) { + + $argv = $arr['args']; + $arr['run_cmd'] = false; + logger("procrunner procrun ".implode(", ",$argv)); + array_shift($argv); + $argc = count($argv); + logger("procrunner procrun require_once ".basename($argv[0])); + require_once(basename($argv[0])); + $funcname=str_replace(".php", "", basename($argv[0]))."_run"; + $funcname($argv, $argc); +} diff --git a/remote_permissions.tgz b/remote_permissions.tgz index 8c137d10..fef4f39b 100644 Binary files a/remote_permissions.tgz and b/remote_permissions.tgz differ diff --git a/remote_permissions/remote_permissions.php b/remote_permissions/remote_permissions.php index 95e74ee1..8955130f 100644 --- a/remote_permissions/remote_permissions.php +++ b/remote_permissions/remote_permissions.php @@ -39,7 +39,8 @@ function remote_permissions_settings(&$a,&$o) { /* Add some HTML to the existing form */ - $t = file_get_contents("addon/remote_permissions/settings.tpl" ); +// $t = file_get_contents("addon/remote_permissions/settings.tpl" ); + $t = get_markup_template("settings.tpl", "addon/remote_permissions/" ); $o .= replace_macros($t, array( '$remote_perms_title' => t('Remote Permissions Settings'), '$remote_perms_label' => t('Allow recipients of your private posts to see the other recipients of the posts'), @@ -190,7 +191,7 @@ function remote_permissions_content($a, $item_copy) { } function remote_permissions_plugin_admin(&$a, &$o){ - $t = file_get_contents( "addon/remote_permissions/admin.tpl" ); + $t = get_markup_template( "admin.tpl", "addon/remote_permissions/" ); $o = replace_macros($t, array( '$submit' => t('Submit'), '$global' => array('remotepermschoice', t('Global'), 1, t('The posts of every user on this server show the post recipients'), get_config('remote_perms', 'global') == 1), diff --git a/remote_permissions/view/admin.tpl b/remote_permissions/view/admin.tpl new file mode 100644 index 00000000..60558808 --- /dev/null +++ b/remote_permissions/view/admin.tpl @@ -0,0 +1,3 @@ +{{ inc field_radio.tpl with $field=$global }}{{ endinc }} +{{ inc field_radio.tpl with $field=$individual }}{{ endinc }} +
diff --git a/remote_permissions/settings.tpl b/remote_permissions/view/settings.tpl similarity index 100% rename from remote_permissions/settings.tpl rename to remote_permissions/view/settings.tpl diff --git a/remote_permissions/view/smarty3/admin.tpl b/remote_permissions/view/smarty3/admin.tpl new file mode 100644 index 00000000..e67afd73 --- /dev/null +++ b/remote_permissions/view/smarty3/admin.tpl @@ -0,0 +1,3 @@ +{{include file="field_radio.tpl" field=$global}} +{{include file="field_radio.tpl" field=$individual}} +
diff --git a/remote_permissions/view/smarty3/settings.tpl b/remote_permissions/view/smarty3/settings.tpl new file mode 100644 index 00000000..df89a32e --- /dev/null +++ b/remote_permissions/view/smarty3/settings.tpl @@ -0,0 +1,8 @@ +
+

{{$remote_perms_title}}

+
+ + +
+
+ diff --git a/statusnet.tgz b/statusnet.tgz index 92a10317..ea19ef18 100755 Binary files a/statusnet.tgz and b/statusnet.tgz differ diff --git a/statusnet/statusnet.css b/statusnet/statusnet.css index a5594cb7..d8b9f1f1 100755 --- a/statusnet/statusnet.css +++ b/statusnet/statusnet.css @@ -15,19 +15,15 @@ width: 250px; margin-bottom: 25px; } -#statusnet-default-label { - float: left; - width: 250px; -} -#statusnet-sendtaglinks-label { - float: left; - width: 250px; - margin-bottom: 25px; -} #statusnet-disconnect { float: left; } +#statusnet-default-label, +#statusnet-sendtaglinks-label, +#statusnet-shortening-label, +#statusnet-mirror-label, +#statusnet-pin-label, #statusnet-enable-label { float: left; width: 250px; @@ -38,11 +34,6 @@ float: left; } -#statusnet-pin-label { - float: left; - width: 250px; - margin-bottom: 25px; -} #statusnet-pin { float: left; } diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index d7d490fd..f3678c80 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', 5); // 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 .= '
'; @@ -427,6 +448,24 @@ 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); + // remove the recycle signs and the names since they aren't helpful on twitter // recycle 1 $recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); @@ -523,20 +562,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 +747,113 @@ function statusnet_plugin_admin(&$a, &$o){ 'key' => Array("key[$id]", t("Consumer Key"), "", ""), ); - - $t = file_get_contents( dirname(__file__). "/admin.tpl" ); + $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'); + + $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); + + $first_time = ($lastid == ""); + + 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 ($first_time) + continue; + + if (is_object($post->retweeted_status)) + continue; + + if ($post->in_reply_to_status_id != "") + continue; + + if (!strpos($post->source, $application_name)) { + $_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/statusnet/admin.tpl b/statusnet/view/admin.tpl old mode 100755 new mode 100644 similarity index 100% rename from statusnet/admin.tpl rename to statusnet/view/admin.tpl diff --git a/statusnet/view/smarty3/admin.tpl b/statusnet/view/smarty3/admin.tpl new file mode 100644 index 00000000..e2a8408f --- /dev/null +++ b/statusnet/view/smarty3/admin.tpl @@ -0,0 +1,16 @@ +{{foreach $sites as $s}} + {{include file="field_input.tpl" field=$s.sitename}} + {{include file="field_input.tpl" field=$s.apiurl}} + {{include file="field_input.tpl" field=$s.secret}} + {{include file="field_input.tpl" field=$s.key}} + {{if $s.delete}} + {{include file="field_checkbox.tpl" field=$s.delete}} +
+ {{else}} +

Fill this form to add a new site

+ {{/if}} + +{{/foreach}} + + +
diff --git a/tumblr.tgz b/tumblr.tgz index 4c0fecf3..b4f6ff9b 100755 Binary files a/tumblr.tgz and b/tumblr.tgz differ diff --git a/tumblr/tumblr.php b/tumblr/tumblr.php index 01ba04bb..4bbae8e6 100755 --- a/tumblr/tumblr.php +++ b/tumblr/tumblr.php @@ -1,379 +1,380 @@ - - */ - -require_once('library/OAuth1.php'); -require_once('addon/tumblr/tumblroauth/tumblroauth.php'); - -function tumblr_install() { - register_hook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local'); - register_hook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send'); - register_hook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets'); - register_hook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings'); - register_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post'); - -} -function tumblr_uninstall() { - unregister_hook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local'); - unregister_hook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send'); - unregister_hook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets'); - unregister_hook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings'); - unregister_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post'); -} - -function tumblr_module() {} - -function tumblr_content(&$a) { - - if(! local_user()) { - notice( t('Permission denied.') . EOL); - return ''; - } - - if (isset($a->argv[1])) - switch ($a->argv[1]) { - case "connect": - $o = tumblr_connect($a); - break; - case "callback": - $o = tumblr_callback($a); - break; - default: - $o = print_r($a->argv, true); - break; - } - else - $o = tumblr_connect($a); - - return $o; -} - -function tumblr_connect($a) { - // Start a session. This is necessary to hold on to a few keys the callback script will also need - session_start(); - - // Include the TumblrOAuth library - //require_once('addon/tumblr/tumblroauth/tumblroauth.php'); - - // Define the needed keys - $consumer_key = get_config('tumblr','consumer_key'); - $consumer_secret = get_config('tumblr','consumer_secret'); - - // The callback URL is the script that gets called after the user authenticates with tumblr - // In this example, it would be the included callback.php - $callback_url = $a->get_baseurl()."/tumblr/callback"; - - // Let's begin. First we need a Request Token. The request token is required to send the user - // to Tumblr's login page. - - // Create a new instance of the TumblrOAuth library. For this step, all we need to give the library is our - // Consumer Key and Consumer Secret - $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret); - - // Ask Tumblr for a Request Token. Specify the Callback URL here too (although this should be optional) - $request_token = $tum_oauth->getRequestToken($callback_url); - - // Store the request token and Request Token Secret as out callback.php script will need this - $_SESSION['request_token'] = $token = $request_token['oauth_token']; - $_SESSION['request_token_secret'] = $request_token['oauth_token_secret']; - - // Check the HTTP Code. It should be a 200 (OK), if it's anything else then something didn't work. - switch ($tum_oauth->http_code) { - case 200: - // Ask Tumblr to give us a special address to their login page - $url = $tum_oauth->getAuthorizeURL($token); - - // Redirect the user to the login URL given to us by Tumblr - header('Location: ' . $url); - - // That's it for our side. The user is sent to a Tumblr Login page and - // asked to authroize our app. After that, Tumblr sends the user back to - // our Callback URL (callback.php) along with some information we need to get - // an access token. - - break; - default: - // Give an error message - $o = 'Could not connect to Tumblr. Refresh the page or try again later.'; - } - return($o); -} - -function tumblr_callback($a) { - - // Start a session, load the library - session_start(); - //require_once('addon/tumblr/tumblroauth/tumblroauth.php'); - - // Define the needed keys - $consumer_key = get_config('tumblr','consumer_key'); - $consumer_secret = get_config('tumblr','consumer_secret'); - - // Once the user approves your app at Tumblr, they are sent back to this script. - // This script is passed two parameters in the URL, oauth_token (our Request Token) - // and oauth_verifier (Key that we need to get Access Token). - // We'll also need out Request Token Secret, which we stored in a session. - - // Create instance of TumblrOAuth. - // It'll need our Consumer Key and Secret as well as our Request Token and Secret - $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $_SESSION['request_token'], $_SESSION['request_token_secret']); - - // Ok, let's get an Access Token. We'll need to pass along our oauth_verifier which was given to us in the URL. - $access_token = $tum_oauth->getAccessToken($_REQUEST['oauth_verifier']); - - // We're done with the Request Token and Secret so let's remove those. - unset($_SESSION['request_token']); - unset($_SESSION['request_token_secret']); - - // Make sure nothing went wrong. - if (200 == $tum_oauth->http_code) { - // good to go - } else { - return('Unable to authenticate'); - } - - // What's next? Now that we have an Access Token and Secret, we can make an API call. - set_pconfig(local_user(), "tumblr", "oauth_token", $access_token['oauth_token']); - set_pconfig(local_user(), "tumblr", "oauth_token_secret", $access_token['oauth_token_secret']); - - $o = t("You are now authenticated to tumblr."); - $o .= '
'.t("return to the connector page").''; - return($o); -} - -function tumblr_jot_nets(&$a,&$b) { - if(! local_user()) - return; - - $tmbl_post = get_pconfig(local_user(),'tumblr','post'); - if(intval($tmbl_post) == 1) { - $tmbl_defpost = get_pconfig(local_user(),'tumblr','post_by_default'); - $selected = ((intval($tmbl_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' - . t('Post to Tumblr') . '
'; - } -} - - -function tumblr_settings(&$a,&$s) { - - if(! local_user()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - $a->page['htmlhead'] .= '' . "\r\n"; - - /* Get the current state of our config variables */ - - $enabled = get_pconfig(local_user(),'tumblr','post'); - - $checked = (($enabled) ? ' checked="checked" ' : ''); - - $def_enabled = get_pconfig(local_user(),'tumblr','post_by_default'); - - $def_checked = (($def_enabled) ? ' checked="checked" ' : ''); - - /* Add some HTML to the existing form */ - - $s .= '
'; - $s .= '

' . t('Tumblr Post Settings') . '

'; - - $s .= '
'; - - $s .= '
'; - $s .= ''; - $s .= ''; - $s .= '
'; - - $s .= '
'; - $s .= ''; - $s .= ''; - $s .= '
'; - - $oauth_token = get_pconfig(local_user(), "tumblr", "oauth_token"); - $oauth_token_secret = get_pconfig(local_user(), "tumblr", "oauth_token_secret"); - - $s .= '
'; - if (($oauth_token != "") and ($oauth_token_secret != "")) { - - $page = get_pconfig(local_user(),'tumblr','page'); - $consumer_key = get_config('tumblr','consumer_key'); - $consumer_secret = get_config('tumblr','consumer_secret'); - - $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret); - - $userinfo = $tum_oauth->get('user/info'); - - $blogs = array(); - - $s .= t("Post to page:").""; - } else - $s .= t("You are not authenticated to tumblr"); - $s .= '
'; - - /* provide a submit button */ - - $s .= '
'; - -} - - -function tumblr_settings_post(&$a,&$b) { - - if(x($_POST,'tumblr-submit')) { - - set_pconfig(local_user(),'tumblr','post',intval($_POST['tumblr'])); - set_pconfig(local_user(),'tumblr','page',$_POST['tumblr_page']); - set_pconfig(local_user(),'tumblr','post_by_default',intval($_POST['tumblr_bydefault'])); - - } - -} - -function tumblr_post_local(&$a,&$b) { - - // This can probably be changed to allow editing by pointing to a different API endpoint - - if($b['edit']) - return; - - if((! local_user()) || (local_user() != $b['uid'])) - return; - - if($b['private'] || $b['parent']) - return; - - $tmbl_post = intval(get_pconfig(local_user(),'tumblr','post')); - - $tmbl_enable = (($tmbl_post && x($_REQUEST,'tumblr_enable')) ? intval($_REQUEST['tumblr_enable']) : 0); - - if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'tumblr','post_by_default'))) - $tmbl_enable = 1; - - if(! $tmbl_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'tumblr'; -} - - - - -function tumblr_send(&$a,&$b) { - - if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) - return; - - if(! strstr($b['postopts'],'tumblr')) - return; - - if($b['parent'] != $b['id']) - return; - - $oauth_token = get_pconfig($b['uid'], "tumblr", "oauth_token"); - $oauth_token_secret = get_pconfig($b['uid'], "tumblr", "oauth_token_secret"); - $page = get_pconfig($b['uid'], "tumblr", "page"); - $tmbl_blog = 'blog/'.$page.'/post'; - - if($oauth_token && $oauth_token_secret && $tmbl_blog) { - - require_once('include/bbcode.php'); - - $tag_arr = array(); - $tags = ''; - $x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER); - - if($x) { - foreach($matches as $mtch) { - $tag_arr[] = $mtch[2]; - } - } - if(count($tag_arr)) - $tags = implode(',',$tag_arr); - - $link = ""; - $video = false; - $title = trim($b['title']); - - // Checking for a bookmark - if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) { - $link = $matches[1]; - if ($title == '') - $title = html_entity_decode($matches[2],ENT_QUOTES,'UTF-8'); - - $body = $b['body']; - // 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 the bookmark - $body2 = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'',$body2); - $body = $body1.$body2; - - $video = ((stristr($link,'youtube')) || (stristr($link,'youtu.be')) || (stristr($mtch[1],'vimeo'))); - } - - $params = array( - 'format' => 'html', - 'tweet' => 'off', - 'tags' => $tags); - - if (($link != '') and $video) { - $params['type'] = "video"; - $params['embed'] = $link; - if ($title != '') - $params['caption'] = '

'.$title. - "

".bbcode($body, false, false)."

"; - else - $params['caption'] = bbcode($body, false, false); - } else if (($link != '') and !$video) { - $params['type'] = "link"; - $params['title'] = $title; - $params['url'] = $link; - $params['description'] = bbcode($b["body"], false, false); - } else { - $params['type'] = "text"; - $params['title'] = $title; - $params['body'] = bbcode($b['body'], false, false); - } - - $consumer_key = get_config('tumblr','consumer_key'); - $consumer_secret = get_config('tumblr','consumer_secret'); - - $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret); - - // Make an API call with the TumblrOAuth instance. - $x = $tum_oauth->post($tmbl_blog,$params); - - $ret_code = $tum_oauth->http_code; - - if($ret_code == 201) - logger('tumblr_send: success'); - elseif($ret_code == 403) - logger('tumblr_send: authentication failure'); - else - logger('tumblr_send: general error: ' . print_r($x,true)); - - } -} + + */ + +require_once('library/OAuth1.php'); +require_once('addon/tumblr/tumblroauth/tumblroauth.php'); + +function tumblr_install() { + register_hook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local'); + register_hook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send'); + register_hook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets'); + register_hook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings'); + register_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post'); + +} +function tumblr_uninstall() { + unregister_hook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local'); + unregister_hook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send'); + unregister_hook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets'); + unregister_hook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings'); + unregister_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post'); +} + +function tumblr_module() {} + +function tumblr_content(&$a) { + + if(! local_user()) { + notice( t('Permission denied.') . EOL); + return ''; + } + + if (isset($a->argv[1])) + switch ($a->argv[1]) { + case "connect": + $o = tumblr_connect($a); + break; + case "callback": + $o = tumblr_callback($a); + break; + default: + $o = print_r($a->argv, true); + break; + } + else + $o = tumblr_connect($a); + + return $o; +} + +function tumblr_connect($a) { + // Start a session. This is necessary to hold on to a few keys the callback script will also need + session_start(); + + // Include the TumblrOAuth library + //require_once('addon/tumblr/tumblroauth/tumblroauth.php'); + + // Define the needed keys + $consumer_key = get_config('tumblr','consumer_key'); + $consumer_secret = get_config('tumblr','consumer_secret'); + + // The callback URL is the script that gets called after the user authenticates with tumblr + // In this example, it would be the included callback.php + $callback_url = $a->get_baseurl()."/tumblr/callback"; + + // Let's begin. First we need a Request Token. The request token is required to send the user + // to Tumblr's login page. + + // Create a new instance of the TumblrOAuth library. For this step, all we need to give the library is our + // Consumer Key and Consumer Secret + $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret); + + // Ask Tumblr for a Request Token. Specify the Callback URL here too (although this should be optional) + $request_token = $tum_oauth->getRequestToken($callback_url); + + // Store the request token and Request Token Secret as out callback.php script will need this + $_SESSION['request_token'] = $token = $request_token['oauth_token']; + $_SESSION['request_token_secret'] = $request_token['oauth_token_secret']; + + // Check the HTTP Code. It should be a 200 (OK), if it's anything else then something didn't work. + switch ($tum_oauth->http_code) { + case 200: + // Ask Tumblr to give us a special address to their login page + $url = $tum_oauth->getAuthorizeURL($token); + + // Redirect the user to the login URL given to us by Tumblr + header('Location: ' . $url); + + // That's it for our side. The user is sent to a Tumblr Login page and + // asked to authroize our app. After that, Tumblr sends the user back to + // our Callback URL (callback.php) along with some information we need to get + // an access token. + + break; + default: + // Give an error message + $o = 'Could not connect to Tumblr. Refresh the page or try again later.'; + } + return($o); +} + +function tumblr_callback($a) { + + // Start a session, load the library + session_start(); + //require_once('addon/tumblr/tumblroauth/tumblroauth.php'); + + // Define the needed keys + $consumer_key = get_config('tumblr','consumer_key'); + $consumer_secret = get_config('tumblr','consumer_secret'); + + // Once the user approves your app at Tumblr, they are sent back to this script. + // This script is passed two parameters in the URL, oauth_token (our Request Token) + // and oauth_verifier (Key that we need to get Access Token). + // We'll also need out Request Token Secret, which we stored in a session. + + // Create instance of TumblrOAuth. + // It'll need our Consumer Key and Secret as well as our Request Token and Secret + $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $_SESSION['request_token'], $_SESSION['request_token_secret']); + + // Ok, let's get an Access Token. We'll need to pass along our oauth_verifier which was given to us in the URL. + $access_token = $tum_oauth->getAccessToken($_REQUEST['oauth_verifier']); + + // We're done with the Request Token and Secret so let's remove those. + unset($_SESSION['request_token']); + unset($_SESSION['request_token_secret']); + + // Make sure nothing went wrong. + if (200 == $tum_oauth->http_code) { + // good to go + } else { + return('Unable to authenticate'); + } + + // What's next? Now that we have an Access Token and Secret, we can make an API call. + set_pconfig(local_user(), "tumblr", "oauth_token", $access_token['oauth_token']); + set_pconfig(local_user(), "tumblr", "oauth_token_secret", $access_token['oauth_token_secret']); + + $o = t("You are now authenticated to tumblr."); + $o .= '
'.t("return to the connector page").''; + return($o); +} + +function tumblr_jot_nets(&$a,&$b) { + if(! local_user()) + return; + + $tmbl_post = get_pconfig(local_user(),'tumblr','post'); + if(intval($tmbl_post) == 1) { + $tmbl_defpost = get_pconfig(local_user(),'tumblr','post_by_default'); + $selected = ((intval($tmbl_defpost) == 1) ? ' checked="checked" ' : ''); + $b .= '
' + . t('Post to Tumblr') . '
'; + } +} + + +function tumblr_settings(&$a,&$s) { + + if(! local_user()) + return; + + /* Add our stylesheet to the page so we can make our settings look nice */ + + $a->page['htmlhead'] .= '' . "\r\n"; + + /* Get the current state of our config variables */ + + $enabled = get_pconfig(local_user(),'tumblr','post'); + + $checked = (($enabled) ? ' checked="checked" ' : ''); + + $def_enabled = get_pconfig(local_user(),'tumblr','post_by_default'); + + $def_checked = (($def_enabled) ? ' checked="checked" ' : ''); + + /* Add some HTML to the existing form */ + + $s .= '
'; + $s .= '

' . t('Tumblr Post Settings') . '

'; + + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $oauth_token = get_pconfig(local_user(), "tumblr", "oauth_token"); + $oauth_token_secret = get_pconfig(local_user(), "tumblr", "oauth_token_secret"); + + $s .= '
'; + if (($oauth_token != "") and ($oauth_token_secret != "")) { + + $page = get_pconfig(local_user(),'tumblr','page'); + $consumer_key = get_config('tumblr','consumer_key'); + $consumer_secret = get_config('tumblr','consumer_secret'); + + $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret); + + $userinfo = $tum_oauth->get('user/info'); + + $blogs = array(); + + $s .= t("Post to page:").""; + } else + $s .= t("You are not authenticated to tumblr"); + $s .= '
'; + + /* provide a submit button */ + + $s .= '
'; + +} + + +function tumblr_settings_post(&$a,&$b) { + + if(x($_POST,'tumblr-submit')) { + + set_pconfig(local_user(),'tumblr','post',intval($_POST['tumblr'])); + set_pconfig(local_user(),'tumblr','page',$_POST['tumblr_page']); + set_pconfig(local_user(),'tumblr','post_by_default',intval($_POST['tumblr_bydefault'])); + + } + +} + +function tumblr_post_local(&$a,&$b) { + + // This can probably be changed to allow editing by pointing to a different API endpoint + + if($b['edit']) + return; + + if((! local_user()) || (local_user() != $b['uid'])) + return; + + if($b['private'] || $b['parent']) + return; + + $tmbl_post = intval(get_pconfig(local_user(),'tumblr','post')); + + $tmbl_enable = (($tmbl_post && x($_REQUEST,'tumblr_enable')) ? intval($_REQUEST['tumblr_enable']) : 0); + + if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'tumblr','post_by_default'))) + $tmbl_enable = 1; + + if(! $tmbl_enable) + return; + + if(strlen($b['postopts'])) + $b['postopts'] .= ','; + $b['postopts'] .= 'tumblr'; +} + + + + +function tumblr_send(&$a,&$b) { + + if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) + return; + + if(! strstr($b['postopts'],'tumblr')) + return; + + if($b['parent'] != $b['id']) + return; + + $oauth_token = get_pconfig($b['uid'], "tumblr", "oauth_token"); + $oauth_token_secret = get_pconfig($b['uid'], "tumblr", "oauth_token_secret"); + $page = get_pconfig($b['uid'], "tumblr", "page"); + $tmbl_blog = 'blog/'.$page.'/post'; + + if($oauth_token && $oauth_token_secret && $tmbl_blog) { + + require_once('include/bbcode.php'); + + $tag_arr = array(); + $tags = ''; + $x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER); + + if($x) { + foreach($matches as $mtch) { + $tag_arr[] = $mtch[2]; + } + } + if(count($tag_arr)) + $tags = implode(',',$tag_arr); + + $link = ""; + $video = false; + $title = trim($b['title']); + + // Checking for a bookmark + if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) { + $link = $matches[1]; + if ($title == '') + $title = html_entity_decode($matches[2],ENT_QUOTES,'UTF-8'); + + $body = $b['body']; + // 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 the bookmark + $body2 = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'',$body2); + $body = $body1.$body2; + + $video = ((stristr($link,'youtube')) || (stristr($link,'youtu.be')) || (stristr($mtch[1],'vimeo'))); + } + + $params = array( + 'format' => 'html', + 'tweet' => 'off', + 'tags' => $tags); + + if (($link != '') and $video) { + $params['type'] = "video"; + $params['embed'] = $link; + if ($title != '') + $params['caption'] = '

'.$title. + "

".bbcode($body, false, false)."

"; + else + $params['caption'] = bbcode($body, false, false); + } else if (($link != '') and !$video) { + $params['type'] = "link"; + $params['title'] = $title; + $params['url'] = $link; + $params['description'] = bbcode($b["body"], false, false); + } else { + $params['type'] = "text"; + $params['title'] = $title; + $params['body'] = bbcode($b['body'], false, false); + } + + $consumer_key = get_config('tumblr','consumer_key'); + $consumer_secret = get_config('tumblr','consumer_secret'); + + $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret); + + // Make an API call with the TumblrOAuth instance. + $x = $tum_oauth->post($tmbl_blog,$params); + + $ret_code = $tum_oauth->http_code; + + if($ret_code == 201) + logger('tumblr_send: success'); + elseif($ret_code == 403) + logger('tumblr_send: authentication failure'); + else + logger('tumblr_send: general error: ' . print_r($x,true)); + + } +} + diff --git a/twitter.tgz b/twitter.tgz index 287619c2..7558bca9 100755 Binary files a/twitter.tgz and b/twitter.tgz differ diff --git a/twitter/README b/twitter/README index ff08976c..8041f317 100755 --- a/twitter/README +++ b/twitter/README @@ -3,17 +3,14 @@ By Tobias Diekershoff http://diekershoff.homeunix.net/friendika/profile/tobias tobias.diekershoff(at)gmx.net -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! This addon is currently under development. If you have any problem !! -!! with it, please contact the Author. !! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - With this addon to Friendica you can give your user the possibility to post their *public* messages to Twitter. The messages will be strapped their rich context and shortened to 140 characters length if necessary. If shortening of the message was performed a link will be added to the Tweet pointing to the original message on your server. +The addon can also mirror a users Tweets into the ~friendica wall. + There is a similar addon for forwarding public messages to "StatusNet":http://status.net [[StatusNet Plugin]]. diff --git a/twitter/twitter.css b/twitter/twitter.css index 75747979..3ff37cda 100755 --- a/twitter/twitter.css +++ b/twitter/twitter.css @@ -19,29 +19,20 @@ #twitter-disconnect { float: left; } -#twitter-enable-label { - float: left; - width: 250px; - margin-bottom: 5px; -} -#twitter-default-label { - float: left; - width: 250px; -} -#twitter-sendtaglinks-label { +#twitter-default-label, +#twitter-sendtaglinks-label, +#twitter-enable-label, +#twitter-shortening-label, +#twitter-mirror-label, +#twitter-pin-label { float: left; width: 250px; - margin-bottom: 25px; + margin-bottom: 10px; } #twitter-checkbox { float: left; } -#twitter-pin-label { - float: left; - width: 250px; - margin-bottom: 25px; -} #twitter-pin { float: left; diff --git a/twitter/twitter.php b/twitter/twitter.php index ee3bd0fb..0452db60 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', 5); // 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'); @@ -70,10 +74,8 @@ 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') . '
'; } - - } 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 .= '
'; @@ -286,6 +306,24 @@ 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); + // remove the recycle signs and the names since they aren't helpful on twitter // recycle 1 $recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); @@ -385,15 +423,24 @@ function twitter_post_hook(&$a,&$b) { if($b['parent'] != $b['id']) return; + // if post comes from twitter don't send it back + if($b['app'] == "Twitter") + 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 +450,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 @@ -499,16 +543,116 @@ function twitter_post_hook(&$a,&$b) { function twitter_plugin_admin_post(&$a){ $consumerkey = ((x($_POST,'consumerkey')) ? notags(trim($_POST['consumerkey'])) : ''); $consumersecret = ((x($_POST,'consumersecret')) ? notags(trim($_POST['consumersecret'])): ''); + $applicationname = ((x($_POST, 'applicationname')) ? notags(trim($_POST['applicationname'])):''); set_config('twitter','consumerkey',$consumerkey); set_config('twitter','consumersecret',$consumersecret); + set_config('twitter','application_name',$applicationname); info( t('Settings updated.'). EOL ); } function twitter_plugin_admin(&$a, &$o){ - $t = file_get_contents( dirname(__file__). "/admin.tpl" ); + $t = get_markup_template( "admin.tpl", "addon/twitter/" ); + $o = replace_macros($t, array( '$submit' => t('Submit'), // 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' ), '') + '$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')) )); } + +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'); + + $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); + + $parameters = array("exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false); + + $first_time = ($lastid == ""); + + 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 ($first_time) + continue; + + if (!strpos($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["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); +} diff --git a/twitter/admin.tpl b/twitter/view/admin.tpl old mode 100755 new mode 100644 similarity index 75% rename from twitter/admin.tpl rename to twitter/view/admin.tpl index a83eb07a..b89f51b6 --- a/twitter/admin.tpl +++ b/twitter/view/admin.tpl @@ -1,3 +1,4 @@ {{ inc field_input.tpl with $field=$consumerkey }}{{ endinc }} {{ inc field_input.tpl with $field=$consumersecret }}{{ endinc }} +{{ inc field_input.tpl with $field=$applicationname }}{{ endinc }}
diff --git a/twitter/view/smarty3/admin.tpl b/twitter/view/smarty3/admin.tpl new file mode 100644 index 00000000..554ed5a0 --- /dev/null +++ b/twitter/view/smarty3/admin.tpl @@ -0,0 +1,4 @@ +{{include file="field_input.tpl" field=$consumerkey}} +{{include file="field_input.tpl" field=$consumersecret}} +{{include file="field_input.tpl" field=$applicationname}} +
diff --git a/uhremotestorage.tgz b/uhremotestorage.tgz index 4aa58096..7a758b00 100755 Binary files a/uhremotestorage.tgz and b/uhremotestorage.tgz differ diff --git a/uhremotestorage/uhremotestorage.php b/uhremotestorage/uhremotestorage.php index a2a8cc3d..85d6b13e 100755 --- a/uhremotestorage/uhremotestorage.php +++ b/uhremotestorage/uhremotestorage.php @@ -78,7 +78,7 @@ function uhremotestorage_settings($a, &$s){ 'Dropbox' => 'Dropbox', ); */ - $tpl = file_get_contents(dirname(__file__)."/settings.tpl"); + $tpl = get_markup_template("settings.tpl", "addon/uhremotestorage/"); $s .= replace_macros($tpl, array( '$title' => 'Unhosted remote storage', '$desc' => sprintf( t('Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See RemoteStorage WebFinger'), $uid ), diff --git a/uhremotestorage/settings.tpl b/uhremotestorage/view/settings.tpl old mode 100755 new mode 100644 similarity index 100% rename from uhremotestorage/settings.tpl rename to uhremotestorage/view/settings.tpl diff --git a/uhremotestorage/view/smarty3/settings.tpl b/uhremotestorage/view/smarty3/settings.tpl new file mode 100644 index 00000000..9a0a55f3 --- /dev/null +++ b/uhremotestorage/view/smarty3/settings.tpl @@ -0,0 +1,9 @@ +
+

{{$title}}

+

{{$desc}}

+ {{include file="field_input.tpl" field=$url}} + {{include file="field_input.tpl" field=$auth}} + {{include file="field_select.tpl" field=$api}} +
+ +
diff --git a/widgets.tgz b/widgets.tgz index f3b18578..d89204f5 100755 Binary files a/widgets.tgz and b/widgets.tgz differ diff --git a/widgets/settings.tpl b/widgets/view/settings.tpl similarity index 100% rename from widgets/settings.tpl rename to widgets/view/settings.tpl diff --git a/widgets/view/smarty3/settings.tpl b/widgets/view/smarty3/settings.tpl new file mode 100644 index 00000000..017fa120 --- /dev/null +++ b/widgets/view/smarty3/settings.tpl @@ -0,0 +1,19 @@ +
+

{{$title}}

+
+ + {{$key}} +
+ +
+ +
+ +

{{$widgets_h}}

+
    + {{foreach $widgets as $w}} +
  • {{$w.1}}
  • + {{/foreach}} +
+ +
diff --git a/widgets/view/smarty3/widget_like.tpl b/widgets/view/smarty3/widget_like.tpl new file mode 100644 index 00000000..ad529575 --- /dev/null +++ b/widgets/view/smarty3/widget_like.tpl @@ -0,0 +1,3 @@ + +{{$like}} like +{{$dislike}} dislike diff --git a/widgets/widget_like.tpl b/widgets/view/widget_like.tpl similarity index 100% rename from widgets/widget_like.tpl rename to widgets/view/widget_like.tpl diff --git a/widgets/widget_like.php b/widgets/widget_like.php index 649d4a76..8f356da9 100755 --- a/widgets/widget_like.php +++ b/widgets/widget_like.php @@ -52,7 +52,8 @@ function like_widget_content(&$a, $conf){ $o = ""; - $t = file_get_contents( dirname(__file__). "/widget_like.tpl" ); +# $t = file_get_contents( dirname(__file__). "/widget_like.tpl" ); + $t = get_markup_template("widget_like.tpl", "addon/widgets/"); $o .= replace_macros($t, array( '$like' => $likes, '$strlike' => sprintf( tt("%d person likes this", "%d people like this", $likes), $likes), diff --git a/widgets/widgets.php b/widgets/widgets.php index 47a6e48a..72534ce3 100755 --- a/widgets/widgets.php +++ b/widgets/widgets.php @@ -51,7 +51,8 @@ function widgets_settings(&$a,&$o) { - $t = file_get_contents( dirname(__file__). "/settings.tpl" ); +# $t = file_get_contents( dirname(__file__). "/settings.tpl" ); + $t = get_markup_template("settings.tpl", "addon/widgets/"); $o .= replace_macros($t, array( '$submit' => t('Generate new key'), '$baseurl' => $a->get_baseurl(),