]> git.mxchange.org Git - friendica-addons.git/commitdiff
Merge branch 'master' of https://github.com/friendica/friendica-addons
authorThomas Willingham <founder@kakste.com>
Sat, 26 Jan 2013 20:04:31 +0000 (20:04 +0000)
committerThomas Willingham <founder@kakste.com>
Sat, 26 Jan 2013 20:04:31 +0000 (20:04 +0000)
113 files changed:
altpager.tgz
altpager/admin.tpl [deleted file]
altpager/altpager.php
altpager/view/admin.tpl [new file with mode: 0644]
altpager/view/admin.tpl.old [new file with mode: 0755]
altpager/view/smarty3/admin.tpl [new file with mode: 0644]
blackout.tgz
blackout/admin.tpl [deleted file]
blackout/blackout.php
blackout/view/admin.tpl [new file with mode: 0644]
blackout/view/smarty3/admin.tpl [new file with mode: 0644]
communityhome.tgz
communityhome/README.md
communityhome/communityhome.css
communityhome/communityhome.php
communityhome/communityhome.tpl [deleted file]
communityhome/directory_item.tpl [deleted file]
communityhome/twillingham/README [deleted file]
communityhome/twillingham/communityhome.php [deleted file]
communityhome/view/communityhome.tpl [new file with mode: 0755]
communityhome/view/directory_item.tpl [new file with mode: 0755]
communityhome/view/smarty3/communityhome.tpl [new file with mode: 0644]
communityhome/view/smarty3/directory_item.tpl [new file with mode: 0644]
extcron.tgz
extcron/extcron.php
facebook.tgz
facebook/facebook.php
fbpost.tgz
fbpost/fbpost.php
forumdirectory.tgz
forumdirectory/forumdirectory.php
forumdirectory/forumdirectory_item.tpl [deleted file]
forumdirectory/view/forumdirectory_item.tpl [new file with mode: 0755]
forumdirectory/view/smarty3/forumdirectory_item.tpl [new file with mode: 0644]
forumlist.tgz
forumlist/forumlist.php
fromgplus.tgz
fromgplus/README
fromgplus/fromgplus.php
geonames/geonames.php
gravatar.tgz
gravatar/admin.tpl [deleted file]
gravatar/gravatar.php
gravatar/view/admin.tpl [new file with mode: 0644]
gravatar/view/smarty3/admin.tpl [new file with mode: 0644]
impressum.tgz
impressum/admin.tpl [deleted file]
impressum/impressum.php
impressum/view/admin.tpl [new file with mode: 0644]
impressum/view/smarty3/admin.tpl [new file with mode: 0644]
libravatar.tgz
libravatar/admin.tpl [deleted file]
libravatar/libravatar.php
libravatar/view/admin.tpl [new file with mode: 0644]
libravatar/view/smarty3/admin.tpl [new file with mode: 0644]
mathjax.tgz
mathjax/admin.tpl [deleted file]
mathjax/mathjax.php
mathjax/view/admin.tpl [new file with mode: 0644]
mathjax/view/smarty3/admin.tpl [new file with mode: 0644]
openstreetmap.tgz
openstreetmap/admin.tpl [deleted file]
openstreetmap/openstreetmap.js [new file with mode: 0644]
openstreetmap/openstreetmap.php
openstreetmap/view/admin.tpl [new file with mode: 0644]
openstreetmap/view/smarty3/admin.tpl [new file with mode: 0644]
page.tgz
piwik.tgz
piwik/admin.tpl [deleted file]
piwik/piwik.php
piwik/view/admin.tpl [new file with mode: 0644]
piwik/view/smarty3/admin.tpl [new file with mode: 0644]
privacy_image_cache.tgz
privacy_image_cache/privacy_image_cache.php
procrunner.tgz [new file with mode: 0644]
procrunner/procrunner.php [new file with mode: 0755]
remote_permissions.tgz
remote_permissions/admin.tpl [deleted file]
remote_permissions/remote_permissions.php
remote_permissions/settings.tpl [deleted file]
remote_permissions/view/admin.tpl [new file with mode: 0644]
remote_permissions/view/settings.tpl [new file with mode: 0644]
remote_permissions/view/smarty3/admin.tpl [new file with mode: 0644]
remote_permissions/view/smarty3/settings.tpl [new file with mode: 0644]
statusnet.tgz
statusnet/admin.tpl [deleted file]
statusnet/statusnet.css
statusnet/statusnet.php
statusnet/view/admin.tpl [new file with mode: 0644]
statusnet/view/smarty3/admin.tpl [new file with mode: 0644]
tumblr.tgz
tumblr/tumblr.php
twitter.tgz
twitter/README
twitter/admin.tpl [deleted file]
twitter/twitter.css
twitter/twitter.php
twitter/view/admin.tpl [new file with mode: 0644]
twitter/view/smarty3/admin.tpl [new file with mode: 0644]
uhremotestorage.tgz
uhremotestorage/settings.tpl [deleted file]
uhremotestorage/uhremotestorage.php
uhremotestorage/view/settings.tpl [new file with mode: 0644]
uhremotestorage/view/smarty3/settings.tpl [new file with mode: 0644]
widgets.tgz
widgets/settings.tpl [deleted file]
widgets/view/settings.tpl [new file with mode: 0755]
widgets/view/smarty3/settings.tpl [new file with mode: 0644]
widgets/view/smarty3/widget_like.tpl [new file with mode: 0644]
widgets/view/widget_like.tpl [new file with mode: 0755]
widgets/widget_like.php
widgets/widget_like.tpl [deleted file]
widgets/widgets.php

index 87bb2f8fc2306b3d89eb6d3572f56e673a388904..fbfd5594954d81a03e5007215e4d0637883ac40e 100644 (file)
Binary files a/altpager.tgz and b/altpager.tgz differ
diff --git a/altpager/admin.tpl b/altpager/admin.tpl
deleted file mode 100755 (executable)
index 6055880..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{ inc field_radio.tpl with $field=$global }}{{ endinc }}
-{{ inc field_radio.tpl with $field=$individual }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index 20517d2f16ef41d85e959e1183877d6acb3cead2..c6f537bd45aa785343350ae1f24173f3dc437621 100755 (executable)
@@ -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/view/admin.tpl b/altpager/view/admin.tpl
new file mode 100644 (file)
index 0000000..6055880
--- /dev/null
@@ -0,0 +1,3 @@
+{{ inc field_radio.tpl with $field=$global }}{{ endinc }}
+{{ inc field_radio.tpl with $field=$individual }}{{ endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/altpager/view/admin.tpl.old b/altpager/view/admin.tpl.old
new file mode 100755 (executable)
index 0000000..6055880
--- /dev/null
@@ -0,0 +1,3 @@
+{{ inc field_radio.tpl with $field=$global }}{{ endinc }}
+{{ inc field_radio.tpl with $field=$individual }}{{ endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/altpager/view/smarty3/admin.tpl b/altpager/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..e67afd7
--- /dev/null
@@ -0,0 +1,3 @@
+{{include file="field_radio.tpl" field=$global}}
+{{include file="field_radio.tpl" field=$individual}}
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index 4b5a5d312d391537ef64ea909cf8ecdcffe15f0c..6d081dc4a55b5fdc050e9cb87f99d9a47af05ac8 100644 (file)
Binary files a/blackout.tgz and b/blackout.tgz differ
diff --git a/blackout/admin.tpl b/blackout/admin.tpl
deleted file mode 100644 (file)
index 2592219..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{{ inc field_input.tpl with $field=$startdate }}{{ endinc }}
-{{ inc field_input.tpl with $field=$enddate }}{{ endinc }}
-{{ inc field_input.tpl with $field=$rurl }}{{ endinc }}
-
-<div style="border: 2px solid #f00; padding: 10px; margin:
-10px;font-size: 1.2em;"><strong>Note</strong>: The redirect will be active from the moment you
-press the submit button. Users currently logged in will <strong>not</strong> be
-thrown out but can't login again after logging out should the blackout is
-still in place.</div>
-
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index 2cb7c041d6cf3dff8f60486a10f2e4a4d879ffd4..834956114e4db95385b98e22603847d785ca645b 100644 (file)
@@ -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<br />(YYYY-MM-DD hh:mm)", $mystart, "format is <em>YYYY</em> year, <em>MM</em> month, <em>DD</em> day, <em>hh</em> hour and <em>mm</em> minute"),
diff --git a/blackout/view/admin.tpl b/blackout/view/admin.tpl
new file mode 100644 (file)
index 0000000..2592219
--- /dev/null
@@ -0,0 +1,11 @@
+{{ inc field_input.tpl with $field=$startdate }}{{ endinc }}
+{{ inc field_input.tpl with $field=$enddate }}{{ endinc }}
+{{ inc field_input.tpl with $field=$rurl }}{{ endinc }}
+
+<div style="border: 2px solid #f00; padding: 10px; margin:
+10px;font-size: 1.2em;"><strong>Note</strong>: The redirect will be active from the moment you
+press the submit button. Users currently logged in will <strong>not</strong> be
+thrown out but can't login again after logging out should the blackout is
+still in place.</div>
+
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/blackout/view/smarty3/admin.tpl b/blackout/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..11a4d91
--- /dev/null
@@ -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}}
+
+<div style="border: 2px solid #f00; padding: 10px; margin:
+10px;font-size: 1.2em;"><strong>Note</strong>: The redirect will be active from the moment you
+press the submit button. Users currently logged in will <strong>not</strong> be
+thrown out but can't login again after logging out should the blackout is
+still in place.</div>
+
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index 20f7b9642c0e676d43f9143eb52e1df174bde2ff..ab251425b711a5e6749dedbf1c4a8f56b036d49a 100755 (executable)
Binary files a/communityhome.tgz and b/communityhome.tgz differ
index 3cf610ec17689aad9f90f2de3bf267d3a9be6bd9..21f2a9465f97389ea0d36325c93721e3e72ccdfe 100755 (executable)
@@ -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
index 2efb6ebd50621dc99db5367a54cfb5cdc662c1e5..45a65537487994063ffab79fdcfe09ccb1c04cf0 100755 (executable)
@@ -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; }
index 484842cce7b53e56b7cd4ae091edcf9d4067d6a8..ba2af6de62bf36340a92ec9b8dd49bae2fdfd2cb 100755 (executable)
@@ -2,7 +2,7 @@
 /**
  * Name: Community home
  * Description: Show last community activity in homepage
- * Version: 1.0
+ * Version: 2.0
  * Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
  */
 
@@ -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  = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
-               $objauthor =  '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
-               
-               //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  = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
+                       $objauthor =  '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
+                       
+                       //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 = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
+                                       }
+                       }
+                       $plink = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
 
-               $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 = '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>';
        
-       $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/communityhome.tpl b/communityhome/communityhome.tpl
deleted file mode 100755 (executable)
index 8468780..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<script>
-       $(function(){
-               $("#tab_1 a").click(function(e){
-                       $("#login_standard").show();
-                       $("#login_openid").hide();
-                       $("#tab_1").addClass("active");
-                       $("#tab_2").removeClass("active");
-                       e.preventDefault();
-                       return false;
-               });
-               $("#tab_2 a").click(function(e){
-                       $("#login_openid").show();
-                       $("#login_standard").hide();
-                       $("#tab_2").addClass("active");
-                       $("#tab_1").removeClass("active");
-                       e.preventDefault();
-                       return false;
-                       
-               });
-               
-       });
-</script>
-{{ if $noOid }}
-       <h3>$login_title</h3>
-{{ else }}
-<ul class="tabs">
-       <li id="tab_1" class="tab button active"><a href="#">$tab_1</a></li>
-       <li id="tab_2" class="tab button"><a href="#">$tab_2</a></li>
-</ul>
-{{ endif }}
-$login_form
-
-
-{{ if $lastusers_title }}
-<h3>$lastusers_title</h3>
-<div class='items-wrapper'>
-{{ for $lastusers_items as $i }}
-       $i
-{{ endfor }}
-</div>
-{{ endif }}
-
-
-{{ if $activeusers_title }}
-<h3>$activeusers_title</h3>
-<div class='items-wrapper'>
-{{ for $activeusers_items as $i }}
-       $i
-{{ endfor }}
-</div>
-{{ endif }}
-
-{{ if $photos_title }}
-<h3>$photos_title</h3>
-<div class='items-wrapper'>
-{{ for $photos_items as $i }}
-       $i
-{{ endfor }}
-</div>
-{{ endif }}
-
-
-{{ if $like_title }}
-<h3>$like_title</h3>
-<ul id='likes'>
-{{ for $like_items as $i }}
-       <li>$i</li>
-{{ endfor }}
-</ul>
-{{ endif }}
diff --git a/communityhome/directory_item.tpl b/communityhome/directory_item.tpl
deleted file mode 100755 (executable)
index db1936e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-
-<div class="directory-item" id="directory-item-$id" >
-       <div class="directory-photo-wrapper" id="directory-photo-wrapper-$id" > 
-               <div class="directory-photo" id="directory-photo-$id" >
-                       <a href="$profile-link" class="directory-profile-link" id="directory-profile-link-$id" >
-                               <img class="directory-photo-img" src="$photo" alt="$alt-text" title="$alt-text" />
-                       </a>
-               </div>
-       </div>
-</div>
diff --git a/communityhome/twillingham/README b/communityhome/twillingham/README
deleted file mode 100644 (file)
index dbbe141..0000000
+++ /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 (file)
index 102732a..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/**
- * Name: Community home
- * Description: Show last community activity in homepage
- * Version: 1.0
- * Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
- */
-
-
-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'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/communityhome/communityhome.css" media="all" />';
-       
-       $aside = array(
-               '$tab_1' => t('Login'),
-               '$tab_2' => t('OpenID'),
-               '$noOid' => get_config('system','no_openid'),
-       );
-       
-       // login form
-       $aside['$login_title'] =  t('Login');
-       $aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
-       
-       // last 12 users
-       $aside['$lastusers_title'] = t('Latest users');
-       $aside['$lastusers_items'] = array();
-       $sql_extra = "";
-       $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
-       $order = " ORDER BY `register_date` DESC ";
-
-       $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
-                       FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` 
-                       WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
-               0,
-               12
-       );
-       $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
-       if(count($r)) {
-               $photo = 'thumb';
-               foreach($r as $rr) {
-                       $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
-                       $entry = replace_macros($tpl,array(
-                               '$id' => $rr['id'],
-                               '$profile-link' => $profile_link,
-                               '$photo' => $rr[$photo],
-                               '$alt-text' => $rr['name'],
-                       ));
-                       $aside['$lastusers_items'][] = $entry;
-               }
-       }
-       
-       // 12 most active users (by posts and contacts)
-       // this query don't work on some mysql versions
-       $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`  FROM
-                       (SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
-                       (SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
-                       (
-                       SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` 
-                       UNION ALL 
-                       SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
-                       ) AS `uni`, `user`, `profile`
-                       WHERE `uni`.`uid`=`user`.`uid`
-                       AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
-                       GROUP BY `uid`
-                       ORDER BY `items` DESC,`contacts` DESC
-                       LIMIT 0,10");
-       if($r && count($r)) {
-               $aside['$activeusers_title']  = t('Most active users');
-               $aside['$activeusers_items']  = array();
-               
-               $photo = 'thumb';
-               foreach($r as $rr) {
-                       $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
-                       $entry = replace_macros($tpl,array(
-                               '$id' => $rr['id'],
-                               '$profile-link' => $profile_link,
-                               '$photo' => $rr[$photo],
-                               '$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
-                       ));
-                       $aside['$activeusers_items'][] = $entry;
-               }
-       }
-       
-       
-       
-       
-       $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl');
-       $a->page['aside'] = replace_macros($tpl, $aside);
-       $o = '';
-       if(file_exists('home.html'))
-       
-               $o .= file_get_contents('home.html');
-       
-}
diff --git a/communityhome/view/communityhome.tpl b/communityhome/view/communityhome.tpl
new file mode 100755 (executable)
index 0000000..8468780
--- /dev/null
@@ -0,0 +1,70 @@
+<script>
+       $(function(){
+               $("#tab_1 a").click(function(e){
+                       $("#login_standard").show();
+                       $("#login_openid").hide();
+                       $("#tab_1").addClass("active");
+                       $("#tab_2").removeClass("active");
+                       e.preventDefault();
+                       return false;
+               });
+               $("#tab_2 a").click(function(e){
+                       $("#login_openid").show();
+                       $("#login_standard").hide();
+                       $("#tab_2").addClass("active");
+                       $("#tab_1").removeClass("active");
+                       e.preventDefault();
+                       return false;
+                       
+               });
+               
+       });
+</script>
+{{ if $noOid }}
+       <h3>$login_title</h3>
+{{ else }}
+<ul class="tabs">
+       <li id="tab_1" class="tab button active"><a href="#">$tab_1</a></li>
+       <li id="tab_2" class="tab button"><a href="#">$tab_2</a></li>
+</ul>
+{{ endif }}
+$login_form
+
+
+{{ if $lastusers_title }}
+<h3>$lastusers_title</h3>
+<div class='items-wrapper'>
+{{ for $lastusers_items as $i }}
+       $i
+{{ endfor }}
+</div>
+{{ endif }}
+
+
+{{ if $activeusers_title }}
+<h3>$activeusers_title</h3>
+<div class='items-wrapper'>
+{{ for $activeusers_items as $i }}
+       $i
+{{ endfor }}
+</div>
+{{ endif }}
+
+{{ if $photos_title }}
+<h3>$photos_title</h3>
+<div class='items-wrapper'>
+{{ for $photos_items as $i }}
+       $i
+{{ endfor }}
+</div>
+{{ endif }}
+
+
+{{ if $like_title }}
+<h3>$like_title</h3>
+<ul id='likes'>
+{{ for $like_items as $i }}
+       <li>$i</li>
+{{ endfor }}
+</ul>
+{{ endif }}
diff --git a/communityhome/view/directory_item.tpl b/communityhome/view/directory_item.tpl
new file mode 100755 (executable)
index 0000000..f32f5a4
--- /dev/null
@@ -0,0 +1,10 @@
+
+<div class="directory-item" id="directory-item-$id" >
+       <div class="directory-photo-wrapper" id="directory-photo-wrapper-$id" > 
+               <div class="directory-photo" id="directory-photo-$id" >
+                       <a href="$profile_link" class="directory-profile-link" id="directory-profile-link-$id" >
+                               <img class="directory-photo-img" src="$photo" alt="$alt_text" title="$alt_text" />
+                       </a>
+               </div>
+       </div>
+</div>
diff --git a/communityhome/view/smarty3/communityhome.tpl b/communityhome/view/smarty3/communityhome.tpl
new file mode 100644 (file)
index 0000000..b8f8038
--- /dev/null
@@ -0,0 +1,70 @@
+<script>
+       $(function(){
+               $("#tab_1 a").click(function(e){
+                       $("#login_standard").show();
+                       $("#login_openid").hide();
+                       $("#tab_1").addClass("active");
+                       $("#tab_2").removeClass("active");
+                       e.preventDefault();
+                       return false;
+               });
+               $("#tab_2 a").click(function(e){
+                       $("#login_openid").show();
+                       $("#login_standard").hide();
+                       $("#tab_2").addClass("active");
+                       $("#tab_1").removeClass("active");
+                       e.preventDefault();
+                       return false;
+                       
+               });
+               
+       });
+</script>
+{{if $noOid}}
+       <h3>{{$login_title}}</h3>
+{{else}}
+<ul class="tabs">
+       <li id="tab_1" class="tab button active"><a href="#">{{$tab_1}}</a></li>
+       <li id="tab_2" class="tab button"><a href="#">{{$tab_2}}</a></li>
+</ul>
+{{/if}}
+{{$login_form}}
+
+
+{{if $lastusers_title}}
+<h3>{{$lastusers_title}}</h3>
+<div class='items-wrapper'>
+{{foreach $lastusers_items as $i}}
+       {{$i}}
+{{/foreach}}
+</div>
+{{/if}}
+
+
+{{if $activeusers_title}}
+<h3>{{$activeusers_title}}</h3>
+<div class='items-wrapper'>
+{{foreach $activeusers_items as $i}}
+       {{$i}}
+{{/foreach}}
+</div>
+{{/if}}
+
+{{if $photos_title}}
+<h3>{{$photos_title}}</h3>
+<div class='items-wrapper'>
+{{foreach $photos_items as $i}}
+       {{$i}}
+{{/foreach}}
+</div>
+{{/if}}
+
+
+{{if $like_title}}
+<h3>{{$like_title}}</h3>
+<ul id='likes'>
+{{foreach $like_items as $i}}
+       <li>{{$i}}</li>
+{{/foreach}}
+</ul>
+{{/if}}
diff --git a/communityhome/view/smarty3/directory_item.tpl b/communityhome/view/smarty3/directory_item.tpl
new file mode 100644 (file)
index 0000000..5fb1198
--- /dev/null
@@ -0,0 +1,10 @@
+
+<div class="directory-item" id="directory-item-{{$id}}" >
+       <div class="directory-photo-wrapper" id="directory-photo-wrapper-{{$id}}" > 
+               <div class="directory-photo" id="directory-photo-{{$id}}" >
+                       <a href="{{$profile}}-link" class="directory-profile-link" id="directory-profile-link-{{$id}}" >
+                               <img class="directory-photo-img" src="{{$photo}}" alt="{{$alt}}-text" title="{{$alt}}-text" />
+                       </a>
+               </div>
+       </div>
+</div>
index 0e5b28929a2942f5105b87922f563f5184f6fdeb..dabe1d09db19ebba110adfad1ae1ed77caf438bc 100755 (executable)
Binary files a/extcron.tgz and b/extcron.tgz differ
index e3c21209b3c33e28d8e34caef0181d98efd183f5..3eb34cdcb2dcd2e072d5c75dd5794a8d467c6dbc 100755 (executable)
@@ -5,7 +5,7 @@
  * Name: external cron
  * Description: Use external server or service to run poller regularly
  * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ * Author: Mike Macgirvin <https://macgirvin.com/profile/mike>
  * 
  * Notes: External service needs to make a web request to http(s)://yoursite/extcron
  */
index 6bf8f7a990c5c31be19c91051e7924d8234cf90b..2dbd4efd0f28329b0616821454299916880db917 100644 (file)
Binary files a/facebook.tgz and b/facebook.tgz differ
index f977bef90192f469097bc26d3cb729aab93447f9..4c1c0a14142dcc34e5768ceb103454fc0d5f2f2c 100644 (file)
@@ -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));
+               }
+                       }
         }
     }
 }
index ecf933d8e023c0c5ddabf96e975d3e7364682796..790a573214bb411a4a4ba3f1a00ca8364d199fb9 100644 (file)
Binary files a/fbpost.tgz and b/fbpost.tgz differ
index ab49c30336c3d5992c376fff76bd1ca4e162a902..1486afdb2ba6efb802cf87075ccfd16c2c813d29 100644 (file)
@@ -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 .= '<div id="fbpost-enable-wrapper">';
 
                $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri=' 
-                       . $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Install Facebook Post connector for this account.') . '</a>';
+                       . $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.') . '</a>';
                $o .= '</div>';
        }
 
@@ -221,7 +225,7 @@ function fbpost_content(&$a) {
                $o .= '<div id="fbpost-enable-wrapper">';
 
                $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri=' 
-                       . $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . '</a>';
+                       . $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.]') . '</a>';
                $o .= '</div>';
 
                $o .= '<div id="fbpost-post-default-form">';
@@ -234,6 +238,10 @@ function fbpost_content(&$a) {
                $checked = (($suppress_view_on_friendica) ? ' checked="checked" ' : '');
                $o .= '<input type="checkbox" name="suppress_view_on_friendica" value="1"' . $checked . '/>' . ' ' . t('Suppress "View on friendica"') . EOL;
 
+               $mirror_posts = get_pconfig(local_user(),'facebook','mirror_posts');
+               $checked = (($mirror_posts) ? ' checked="checked" ' : '');
+               $o .= '<input type="checkbox" name="mirror_posts" value="1"' . $checked . '/>' . ' ' . 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;
+}
index 09fcb4ce9db4189b230611884834b684a24cae94..0a84585dd41af97f49d12658c1f3576c295b5c4b 100644 (file)
Binary files a/forumdirectory.tgz and b/forumdirectory.tgz differ
index 83f19d011845a92c592f59a9584c724f0f8e2f48..9837b9c18aa878f84c4a7bdf0a5f654b76a57acc 100644 (file)
@@ -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/forumdirectory_item.tpl
deleted file mode 100755 (executable)
index 3b24d25..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-
-<div class="forumdirectory-item" id="forumdirectory-item-$id" >
-       <div class="forumdirectory-photo-wrapper" id="forumdirectory-photo-wrapper-$id" > 
-               <div class="forumdirectory-photo" id="forumdirectory-photo-$id" >
-                       <a href="$profile-link" class="forumdirectory-profile-link" id="forumdirectory-profile-link-$id" >
-                               <img class="forumdirectory-photo-img photo" src="$photo" alt="$alt-text" title="$alt-text" />
-                       </a>
-               </div>
-       </div>
-       <div class="forumdirectory-profile-wrapper" id="forumdirectory-profile-wrapper-$id" >
-               <div class="contact-name" id="forumdirectory-name-$id">$name</div>
-               <div class="page-type">$page-type</div>
-               {{ if $pdesc }}<div class="forumdirectory-profile-title">$profile.pdesc</div>{{ endif }}
-       <div class="forumdirectory-detailcolumns-wrapper" id="forumdirectory-detailcolumns-wrapper-$id">
-               <div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn1-wrapper-$id">       
-                       {{ if $location }}
-                           <dl class="location"><dt class="location-label">$location</dt>
-                               <dd class="adr">
-                                       {{ if $profile.address }}<div class="street-address">$profile.address</div>{{ endif }}
-                                       <span class="city-state-zip">
-                                               <span class="locality">$profile.locality</span>{{ if $profile.locality }}, {{ endif }}
-                                               <span class="region">$profile.region</span>
-                                               <span class="postal-code">$profile.postal-code</span>
-                                       </span>
-                                       {{ if $profile.country-name }}<span class="country-name">$profile.country-name</span>{{ endif }}
-                               </dd>
-                               </dl>
-                       {{ endif }}
-
-                       {{ if $gender }}<dl class="mf"><dt class="gender-label">$gender</dt> <dd class="x-gender">$profile.gender</dd></dl>{{ endif }}
-                       </div>  
-                       <div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn2-wrapper-$id">       
-                               {{ if $marital }}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>$marital</dt><dd class="marital-text">$profile.marital</dd></dl>{{ endif }}
-
-                               {{ if $homepage }}<dl class="homepage"><dt class="homepage-label">$homepage</dt><dd class="homepage-url"><a href="$profile.homepage" target="external-link">$profile.homepage</a></dd></dl>{{ endif }}
-                       </div>
-               </div>
-               <div class="forumdirectory-copy-wrapper" id="forumdirectory-copy-wrapper-$id" >
-                       {{ if $about }}<dl class="forumdirectory-copy"><dt class="forumdirectory-copy-label">$about</dt><dd class="forumdirectory-copy-data">$profile.about</dd></dl>{{ endif }}
-               </div>
-       </div>
-</div>
diff --git a/forumdirectory/view/forumdirectory_item.tpl b/forumdirectory/view/forumdirectory_item.tpl
new file mode 100755 (executable)
index 0000000..e1bbffe
--- /dev/null
@@ -0,0 +1,42 @@
+
+<div class="forumdirectory-item" id="forumdirectory-item-$id" >
+       <div class="forumdirectory-photo-wrapper" id="forumdirectory-photo-wrapper-$id" > 
+               <div class="forumdirectory-photo" id="forumdirectory-photo-$id" >
+                       <a href="$profile_link" class="forumdirectory-profile-link" id="forumdirectory-profile-link-$id" >
+                               <img class="forumdirectory-photo-img photo" src="$photo" alt="$alt_text" title="$alt_text" />
+                       </a>
+               </div>
+       </div>
+       <div class="forumdirectory-profile-wrapper" id="forumdirectory-profile-wrapper-$id" >
+               <div class="contact-name" id="forumdirectory-name-$id">$name</div>
+               <div class="page-type">$page_type</div>
+               {{ if $pdesc }}<div class="forumdirectory-profile-title">$profile.pdesc</div>{{ endif }}
+       <div class="forumdirectory-detailcolumns-wrapper" id="forumdirectory-detailcolumns-wrapper-$id">
+               <div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn1-wrapper-$id">       
+                       {{ if $location }}
+                           <dl class="location"><dt class="location-label">$location</dt>
+                               <dd class="adr">
+                                       {{ if $profile.address }}<div class="street-address">$profile.address</div>{{ endif }}
+                                       <span class="city-state-zip">
+                                               <span class="locality">$profile.locality</span>{{ if $profile.locality }}, {{ endif }}
+                                               <span class="region">$profile.region</span>
+                                               <span class="postal-code">$profile.postal-code</span>
+                                       </span>
+                                       {{ if $profile.country-name }}<span class="country-name">$profile.country-name</span>{{ endif }}
+                               </dd>
+                               </dl>
+                       {{ endif }}
+
+                       {{ if $gender }}<dl class="mf"><dt class="gender-label">$gender</dt> <dd class="x-gender">$profile.gender</dd></dl>{{ endif }}
+                       </div>  
+                       <div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn2-wrapper-$id">       
+                               {{ if $marital }}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>$marital</dt><dd class="marital-text">$profile.marital</dd></dl>{{ endif }}
+
+                               {{ if $homepage }}<dl class="homepage"><dt class="homepage-label">$homepage</dt><dd class="homepage-url"><a href="$profile.homepage" target="external-link">$profile.homepage</a></dd></dl>{{ endif }}
+                       </div>
+               </div>
+               <div class="forumdirectory-copy-wrapper" id="forumdirectory-copy-wrapper-$id" >
+                       {{ if $about }}<dl class="forumdirectory-copy"><dt class="forumdirectory-copy-label">$about</dt><dd class="forumdirectory-copy-data">$profile.about</dd></dl>{{ endif }}
+               </div>
+       </div>
+</div>
diff --git a/forumdirectory/view/smarty3/forumdirectory_item.tpl b/forumdirectory/view/smarty3/forumdirectory_item.tpl
new file mode 100644 (file)
index 0000000..66410ef
--- /dev/null
@@ -0,0 +1,42 @@
+
+<div class="forumdirectory-item" id="forumdirectory-item-{{$id}}" >
+       <div class="forumdirectory-photo-wrapper" id="forumdirectory-photo-wrapper-{{$id}}" > 
+               <div class="forumdirectory-photo" id="forumdirectory-photo-{{$id}}" >
+                       <a href="{{$profile_link}}" class="forumdirectory-profile-link" id="forumdirectory-profile-link-{{$id}}" >
+                               <img class="forumdirectory-photo-img photo" src="{{$photo}}" alt="{{$alt_text}}" title="{{$alt_text}}" />
+                       </a>
+               </div>
+       </div>
+       <div class="forumdirectory-profile-wrapper" id="forumdirectory-profile-wrapper-{{$id}}" >
+               <div class="contact-name" id="forumdirectory-name-{{$id}}">{{$name}}</div>
+               <div class="page-type">{{$page_type}}</div>
+               {{if $pdesc}}<div class="forumdirectory-profile-title">{{$profile.pdesc}}</div>{{/if}}
+       <div class="forumdirectory-detailcolumns-wrapper" id="forumdirectory-detailcolumns-wrapper-{{$id}}">
+               <div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn1-wrapper-{{$id}}">   
+                       {{if $location}}
+                           <dl class="location"><dt class="location-label">{{$location}}</dt>
+                               <dd class="adr">
+                                       {{if $profile.address}}<div class="street-address">{{$profile.address}}</div>{{/if}}
+                                       <span class="city-state-zip">
+                                               <span class="locality">{{$profile.locality}}</span>{{if $profile.locality}}, {{/if}}
+                                               <span class="region">{{$profile.region}}</span>
+                                               <span class="postal-code">{{$profile.postal-code}}</span>
+                                       </span>
+                                       {{if $profile.country-name}}<span class="country-name">{{$profile.country-name}}</span>{{/if}}
+                               </dd>
+                               </dl>
+                       {{/if}}
+
+                       {{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="x-gender">{{$profile.gender}}</dd></dl>{{/if}}
+                       </div>  
+                       <div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn2-wrapper-{{$id}}">   
+                               {{if $marital}}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>{{$marital}}</dt><dd class="marital-text">{{$profile.marital}}</dd></dl>{{/if}}
+
+                               {{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url"><a href="{{$profile.homepage}}" target="external-link">{{$profile.homepage}}</a></dd></dl>{{/if}}
+                       </div>
+               </div>
+               <div class="forumdirectory-copy-wrapper" id="forumdirectory-copy-wrapper-{{$id}}" >
+                       {{if $about}}<dl class="forumdirectory-copy"><dt class="forumdirectory-copy-label">{{$about}}</dt><dd class="forumdirectory-copy-data">{{$profile.about}}</dd></dl>{{/if}}
+               </div>
+       </div>
+</div>
index 1f303145a19366d9c5b261966f6bbf5473136c16..8356d443d0cb1ade39c865f13e6efcca67e36f79 100644 (file)
Binary files a/forumlist.tgz and b/forumlist.tgz differ
index 37752462912efccd9a70bc8fdb882b9bad5b5f94..95ae98909bf81e4e81905ae21cf6c0beb7c054a0 100644 (file)
@@ -74,7 +74,7 @@ function forumlist_network_mod_init($a,$b) {
 
        if(count($contacts)) {
                foreach($contacts as $contact) {
-                       $forumlist .= '<a href="' . $a->get_baseurl() . '/redir/' . $contact["id"] . '" title="' . $contact['url'] . '" class="label sparkle" target="external-link"><img class="forumlist-img" height="20" width="20" src="' . $contact['micro'] .'" alt="' . $contact['url'] . '" /></a> <a href="' . $a->get_baseurl() . '/network?f=&cid=' . $contact['id'] . '" >' . $contact["name"]."</a><br />";
+                       $forumlist .= '<div><a href="' . $a->get_baseurl() . '/redir/' . $contact["id"] . '" title="' . $contact['url'] . '" class="label sparkle" target="external-link"><img class="forumlist-img" height="20" width="20" src="' . $contact['micro'] .'" alt="' . $contact['url'] . '" /></a> <a href="' . $a->get_baseurl() . '/network?f=&cid=' . $contact['id'] . '" >' . $contact["name"]."</a></div>";
                }
        }
        else {
index 712019e45ab9d7971e278cef2534c7f78ea72950..0a402b7657a8cd0a3007b443006230416981e847 100644 (file)
Binary files a/fromgplus.tgz and b/fromgplus.tgz differ
index db5bb38e0613c3917afe1de8b721540c0b564faa..82a29f6635e414dcc9c6aef6b2e11beb48c3d4e6 100644 (file)
@@ -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.
index a6760ca50eda8764af73b7524ede4cb4185652bc..f7841300f3531d5a3f7bd5d15082eaf59b932229 100644 (file)
@@ -327,22 +327,27 @@ function fromgplus_fetch($a, $uid) {
 
                                case "activity":
                                        $post = fromgplus_html2bbcode($item->annotation)."\n";
-                                       $post .= fromgplus_html2bbcode("&#x2672;");
-                                       //$post .= html2bbcode("&#x267B;");
-                                       //$post .= fromgplus_html2bbcode("&#x25CC;");
-                                       $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("'", "&#039;",$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]";
+                                       } else {
+                                               $post .= fromgplus_html2bbcode("&#x2672;");
+                                               $post .= " [url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url] \n";
+                                               $post .= fromgplus_html2bbcode($item->object->content);
 
-                                       //$post .= "[/share]";
+                                               if (is_array($item->object->attachments))
+                                                       $post .= "\n".trim(fromgplus_handleattachments($item));
+                                       }
 
                                        if (isset($item->address))
                                                $location = $item->address;
index 8226fc0bf6701170ac6518bd94cf185d2a4bfeb3..19725bef3ff53e1561f236cead784715fe8e9757 100755 (executable)
@@ -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;
index 25106f2658a5c407d184214ee68f1aa089ad7ae5..561c4aaecc00a7c3a8518f328814358b2e513f88 100644 (file)
Binary files a/gravatar.tgz and b/gravatar.tgz differ
diff --git a/gravatar/admin.tpl b/gravatar/admin.tpl
deleted file mode 100644 (file)
index 83144e4..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{ inc field_select.tpl with $field=$default_avatar}}{{ endinc }}
-{{ inc field_select.tpl with $field=$rating }}{{ endinc }}
-<div class="submit"><input type="submit" value="$submit" /></div>
index fc5358eb41673088f87bad781fcbe1cc4420eec1..12a8e44f2932670c17bb5eb536c38d775099122e 100644 (file)
@@ -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/view/admin.tpl b/gravatar/view/admin.tpl
new file mode 100644 (file)
index 0000000..83144e4
--- /dev/null
@@ -0,0 +1,3 @@
+{{ inc field_select.tpl with $field=$default_avatar}}{{ endinc }}
+{{ inc field_select.tpl with $field=$rating }}{{ endinc }}
+<div class="submit"><input type="submit" value="$submit" /></div>
diff --git a/gravatar/view/smarty3/admin.tpl b/gravatar/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..5dfd448
--- /dev/null
@@ -0,0 +1,3 @@
+{{include file="field_select.tpl" field=$default_avatar}}
+{{include file="field_select.tpl" field=$rating}}
+<div class="submit"><input type="submit" value="{{$submit}}" /></div>
index 8c36df6f2b4afa2bdd1a5c080103f3375cb73389..b47b625cf743a9c32a4caa45007446970cc45c63 100755 (executable)
Binary files a/impressum.tgz and b/impressum.tgz differ
diff --git a/impressum/admin.tpl b/impressum/admin.tpl
deleted file mode 100755 (executable)
index 901df73..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-{{ inc field_input.tpl with $field=$owner }}{{ endinc }}
-{{ inc field_input.tpl with $field=$ownerprofile }}{{ endinc }}
-{{ inc field_textarea.tpl with $field=$postal }}{{ endinc }}
-{{ inc field_textarea.tpl with $field=$notes }}{{ endinc }}
-{{ inc field_input.tpl with $field=$email }}{{ endinc }}
-{{ inc field_textarea.tpl with $field=$footer_text }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index 9d038178beb8eca2ccf65011481e48702c5b559e..3c1106c9a9761cf056ae63258c871ccafbdb9cc7 100755 (executable)
@@ -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/view/admin.tpl b/impressum/view/admin.tpl
new file mode 100644 (file)
index 0000000..901df73
--- /dev/null
@@ -0,0 +1,7 @@
+{{ inc field_input.tpl with $field=$owner }}{{ endinc }}
+{{ inc field_input.tpl with $field=$ownerprofile }}{{ endinc }}
+{{ inc field_textarea.tpl with $field=$postal }}{{ endinc }}
+{{ inc field_textarea.tpl with $field=$notes }}{{ endinc }}
+{{ inc field_input.tpl with $field=$email }}{{ endinc }}
+{{ inc field_textarea.tpl with $field=$footer_text }}{{ endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/impressum/view/smarty3/admin.tpl b/impressum/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..80b6782
--- /dev/null
@@ -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}}
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index 0405af9bd532c8ec17112fcbbd3b92d65f07ead8..d61f63bafb394b797b18708f861695ff5cd5af27 100644 (file)
Binary files a/libravatar.tgz and b/libravatar.tgz differ
diff --git a/libravatar/admin.tpl b/libravatar/admin.tpl
deleted file mode 100644 (file)
index 814f4a4..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-{{ inc field_select.tpl with $field=$default_avatar}}{{ endinc }}
-<div class="submit"><input type="submit" value="$submit" /></div>
index 08ed6d00b21302d99a0df51920b3e3ff831dedbc..8cbf1e980a611fae3332c58bb127072e7f93350d 100644 (file)
@@ -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/view/admin.tpl b/libravatar/view/admin.tpl
new file mode 100644 (file)
index 0000000..814f4a4
--- /dev/null
@@ -0,0 +1,2 @@
+{{ inc field_select.tpl with $field=$default_avatar}}{{ endinc }}
+<div class="submit"><input type="submit" value="$submit" /></div>
diff --git a/libravatar/view/smarty3/admin.tpl b/libravatar/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..ee95828
--- /dev/null
@@ -0,0 +1,2 @@
+{{include file="field_select.tpl" field=$default_avatar}}
+<div class="submit"><input type="submit" value="{{$submit}}" /></div>
index 37bfbf616cfff3024c206cfe7fbe8caec319ee62..a340aee4799954fc0fb5c9e128f91dd868b14700 100644 (file)
Binary files a/mathjax.tgz and b/mathjax.tgz differ
diff --git a/mathjax/admin.tpl b/mathjax/admin.tpl
deleted file mode 100644 (file)
index 1c723cd..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-{{ inc field_input.tpl with $field=$baseurl }}{{endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index 7105772ba80fe1120776c422305949186dbae118..e57d69bf54f6db84fdbca972622c4d319aea31d2 100644 (file)
@@ -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/view/admin.tpl b/mathjax/view/admin.tpl
new file mode 100644 (file)
index 0000000..1c723cd
--- /dev/null
@@ -0,0 +1,2 @@
+{{ inc field_input.tpl with $field=$baseurl }}{{endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/mathjax/view/smarty3/admin.tpl b/mathjax/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..f6ec03e
--- /dev/null
@@ -0,0 +1,2 @@
+{{include file="field_input.tpl" field=$baseurl}}
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index c195d151cbcb66c49f95f39d2a8c0a13967fe5c5..967b56017b7e109cf26897381ebb1083ecf3b628 100644 (file)
Binary files a/openstreetmap.tgz and b/openstreetmap.tgz differ
diff --git a/openstreetmap/admin.tpl b/openstreetmap/admin.tpl
deleted file mode 100644 (file)
index 75db9cd..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{ inc field_input.tpl with $field=$tmsserver }}{{ endinc }}
-{{ inc field_input.tpl with $field=$zoom }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/openstreetmap/openstreetmap.js b/openstreetmap/openstreetmap.js
new file mode 100644 (file)
index 0000000..479e769
--- /dev/null
@@ -0,0 +1,41 @@
+var toolserver = 'http://toolserver.org/~kolossos/openlayers/kml-on-ol.php';\r
+var startTag = '<iframe class="osmFrame" style="width: 100%; height: 350px; clear: both;" src="'+ toolserver + '?lang=de&amp;uselang=de&amp;params=';\r
+var endTag = '"></iframe>';\r
+\r
+jQuery(document).ready(function($) {\r
+\r
+       $('.wall-item-content-wrapper').each(function(index) {\r
+               var link = $(this).find('.wall-item-location .OSMMapLink');\r
+               link.toggle(addIframe, removeIframe);\r
+       });\r
+});\r
+\r
+function addIframe(ev) {\r
+       var coordinate = $(ev.target).attr('title');\r
+\r
+       var newTag = startTag + convertCoordinateString(coordinate) + endTag;\r
+       $(ev.target).parents('.wall-item-content-wrapper').append(newTag);\r
+}\r
+\r
+function removeIframe(ev) {\r
+       $(ev.target).parents('.wall-item-content-wrapper').find('iframe').remove();\r
+\r
+}\r
+\r
+function convertCoordinateString(coordinate) {\r
+       var locstring = coordinate.split(' ');\r
+       var northSouth;\r
+       var westEast;\r
+\r
+       if (locstring[0] < 0) {\r
+               northSouth = '_S_';\r
+       }else{\r
+               northSouth = '_N_';\r
+       }\r
+       if (locstring[1] < 0) {\r
+               westEast = '_W';\r
+       }else{\r
+               westEast = '_E';\r
+       }\r
+       return Math.abs(locstring[0]) + northSouth + Math.abs(locstring[1]) + westEast;\r
+}
\ No newline at end of file
index fda29905d411821fb145ce80aae1c01767731ced..2c5975ebd82a5ab11d72d9482d80f5faf7479bd2 100755 (executable)
 
 function openstreetmap_install() {
        register_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
+       register_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');\r
 
        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='<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/openstreetmap/openstreetmap.js' . '"></script>' . "\r\n";\r
+       $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';
+\r
+               $s = fetch_url('http://api.geonames.org/search?maxRows=1&fuzzy=0.8&q=' . $item['location']  . '&username=' . $geo_account);\r
+\r
+               if($s){\r
+                       $xml = parse_xml_string($s);\r
+\r
+                       if($xml->geoname->lat && $xml->geoname->lng){\r
+                               $item['coord'] = $xml->geoname->lat . ' ' . $xml->geoname->lng;
+                       }\r
+               }
+       }
+
        $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="'.$tmsserver.'?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
 
        if($item['coord']) {
                $coords = explode(' ', $item['coord']);
                if(count($coords) > 1) {
-                       $coord = '<a target="map" title="' . $item['coord'] . '" href="'.$tmsserver.'?lat=' . urlencode($coords[0]) . '&lon=' . urlencode($coords[1]) . '&zoom='.$zoom.'">' . $item['coord'] . '</a>' ;
+                       $coord = '<a target="map" class="OSMMapLink" title="' . $item['coord'] . '" href="'.$tmsserver.'?lat=' . urlencode($coords[0]) . '&lon=' . urlencode($coords[1]) . '&zoom='.$zoom.'"> Map </a>' ;
                }
        }
        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 <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')),
-               '$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 <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')),
+                       '$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/view/admin.tpl b/openstreetmap/view/admin.tpl
new file mode 100644 (file)
index 0000000..75db9cd
--- /dev/null
@@ -0,0 +1,3 @@
+{{ inc field_input.tpl with $field=$tmsserver }}{{ endinc }}
+{{ inc field_input.tpl with $field=$zoom }}{{ endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/openstreetmap/view/smarty3/admin.tpl b/openstreetmap/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..6ee0717
--- /dev/null
@@ -0,0 +1,3 @@
+{{include file="field_input.tpl" field=$tmsserver}}
+{{include file="field_input.tpl" field=$zoom}}
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index 02140ce92def21beac5e562e0db67eefd522ff8a..c9610e28bb66cd2f9578de2e642b5cfc1b7d3bc7 100644 (file)
Binary files a/page.tgz and b/page.tgz differ
index 080dd9e32c6bfd1513b54dcd98fa04ace138b5ed..a5bd437aa4c566a3518df99c19aad2141aadd904 100755 (executable)
Binary files a/piwik.tgz and b/piwik.tgz differ
diff --git a/piwik/admin.tpl b/piwik/admin.tpl
deleted file mode 100755 (executable)
index e57758a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{{ inc field_input.tpl with $field=$baseurl }}{{ endinc }}
-{{ inc field_input.tpl with $field=$siteid }}{{ endinc }}
-{{ inc field_checkbox.tpl with $field=$optout }}{{ endinc }}
-{{ inc field_checkbox.tpl with $field=$async }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index 9ba15db63f9e7dd35445f8cae10d3ef2daad8038..3501b2c8c7a040df36776ed4f21dab4b0460d154 100755 (executable)
@@ -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/view/admin.tpl b/piwik/view/admin.tpl
new file mode 100644 (file)
index 0000000..e57758a
--- /dev/null
@@ -0,0 +1,5 @@
+{{ inc field_input.tpl with $field=$baseurl }}{{ endinc }}
+{{ inc field_input.tpl with $field=$siteid }}{{ endinc }}
+{{ inc field_checkbox.tpl with $field=$optout }}{{ endinc }}
+{{ inc field_checkbox.tpl with $field=$async }}{{ endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/piwik/view/smarty3/admin.tpl b/piwik/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..bfe04aa
--- /dev/null
@@ -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}}
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index 13239d9046359957aae6e93d4b4c9cfe275517a0..45444a683932dcf4da5a6c8ee63fee86b5f868f2 100644 (file)
Binary files a/privacy_image_cache.tgz and b/privacy_image_cache.tgz differ
index a47f0e1ac5294b7aa0cf405ed619afa4655f79f9..0e241e7e36825b8aea73635b30aa5fdb396c05cf 100644 (file)
@@ -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,13 +329,11 @@ 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
@@ -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 (file)
index 0000000..fec9dfa
Binary files /dev/null and b/procrunner.tgz differ
diff --git a/procrunner/procrunner.php b/procrunner/procrunner.php
new file mode 100755 (executable)
index 0000000..4c6f64b
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Name: Proc Runner
+ * Description: Derivative of poormancron when proc_open() and exec() are disabled
+ * Version: 1.0
+ * Author: Fabio Comuni <http://kirgroup.com/profile/fabrix>
+ * 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);
+}
index 8c137d10fd65fc5204c3ee7a180b06008ef01559..fef4f39bf5e8e1ed19b3632fdc873034d3870cee 100644 (file)
Binary files a/remote_permissions.tgz and b/remote_permissions.tgz differ
diff --git a/remote_permissions/admin.tpl b/remote_permissions/admin.tpl
deleted file mode 100644 (file)
index 6055880..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{ inc field_radio.tpl with $field=$global }}{{ endinc }}
-{{ inc field_radio.tpl with $field=$individual }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index 95e74ee194598f1068b1758221fb6c46d405b999..8955130f8150176bd29b675cb72ca06dccb1bb3e 100644 (file)
@@ -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/settings.tpl b/remote_permissions/settings.tpl
deleted file mode 100644 (file)
index 9fd9895..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-       <div class="settings-block">
-       <h3>$remote_perms_title</h3>
-       <div id="remote-perms-wrapper">
-       <label id="remote-perms-label" for="remote-perms">$remote_perms_label</label>
-       <input id="remote-perms-input" type="checkbox" name="remote-perms" value="1" $checked />
-       </div><div class="clear"></div>
-       <div class="settings-submit-wrapper" ><input type="submit" name="remote-perms-submit" class="settings-submit" value="$submit" /></div></div>
-
diff --git a/remote_permissions/view/admin.tpl b/remote_permissions/view/admin.tpl
new file mode 100644 (file)
index 0000000..6055880
--- /dev/null
@@ -0,0 +1,3 @@
+{{ inc field_radio.tpl with $field=$global }}{{ endinc }}
+{{ inc field_radio.tpl with $field=$individual }}{{ endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/remote_permissions/view/settings.tpl b/remote_permissions/view/settings.tpl
new file mode 100644 (file)
index 0000000..9fd9895
--- /dev/null
@@ -0,0 +1,8 @@
+       <div class="settings-block">
+       <h3>$remote_perms_title</h3>
+       <div id="remote-perms-wrapper">
+       <label id="remote-perms-label" for="remote-perms">$remote_perms_label</label>
+       <input id="remote-perms-input" type="checkbox" name="remote-perms" value="1" $checked />
+       </div><div class="clear"></div>
+       <div class="settings-submit-wrapper" ><input type="submit" name="remote-perms-submit" class="settings-submit" value="$submit" /></div></div>
+
diff --git a/remote_permissions/view/smarty3/admin.tpl b/remote_permissions/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..e67afd7
--- /dev/null
@@ -0,0 +1,3 @@
+{{include file="field_radio.tpl" field=$global}}
+{{include file="field_radio.tpl" field=$individual}}
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
diff --git a/remote_permissions/view/smarty3/settings.tpl b/remote_permissions/view/smarty3/settings.tpl
new file mode 100644 (file)
index 0000000..df89a32
--- /dev/null
@@ -0,0 +1,8 @@
+       <div class="settings-block">
+       <h3>{{$remote_perms_title}}</h3>
+       <div id="remote-perms-wrapper">
+       <label id="remote-perms-label" for="remote-perms">{{$remote_perms_label}}</label>
+       <input id="remote-perms-input" type="checkbox" name="remote-perms" value="1" {{$checked}} />
+       </div><div class="clear"></div>
+       <div class="settings-submit-wrapper" ><input type="submit" name="remote-perms-submit" class="settings-submit" value="{{$submit}}" /></div></div>
+
index 92a10317412198a219debe3c33b27ff2f60429fe..ea19ef18e6b4d640896c428ea01bf121671f403d 100755 (executable)
Binary files a/statusnet.tgz and b/statusnet.tgz differ
diff --git a/statusnet/admin.tpl b/statusnet/admin.tpl
deleted file mode 100755 (executable)
index b40adf3..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{{ for $sites as $s }}
-       {{ inc field_input.tpl with $field=$s.sitename }}{{ endinc }}
-       {{ inc field_input.tpl with $field=$s.apiurl }}{{ endinc }}
-       {{ inc field_input.tpl with $field=$s.secret }}{{ endinc }}
-       {{ inc field_input.tpl with $field=$s.key }}{{ endinc }}
-       {{ if $s.delete }}
-               {{ inc field_checkbox.tpl with $field=$s.delete }}{{ endinc }}
-               <hr>
-       {{ else }}
-               <p>Fill this form to add a new site</p>
-       {{ endif }}
-       
-{{ endfor }}
-
-
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index a5594cb70249ae183b2de56eafea233de1caf546..d8b9f1f136e857e26db11335ce30fed023b8ffb6 100755 (executable)
        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;
        float: left;
 }
 
-#statusnet-pin-label {
-       float: left;
-       width: 250px;
-       margin-bottom: 25px;
-}
 #statusnet-pin {
        float: left;
 }
index d7d490fdd3e3aa70235c0f3724e06954fc1c267b..f3678c805b6b157f83a531db2a8779f81b7b93ac 100755 (executable)
@@ -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 .= '<div class="profile-jot-net"><input type="checkbox" name="statusnet_enable"' . $selected . ' value="1" /> ' 
-                       . t('Post to StatusNet') . '</div>';    
+                       . t('Post to StatusNet') . '</div>';
        }
 }
 
-
-
-
 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 .= '<div class="settings-block">';
        $s .= '<h3>'. t('StatusNet Posting Settings').'</h3>';
 
@@ -342,6 +354,15 @@ function statusnet_settings(&$a,&$s) {
                        $s .= '<label id="statusnet-default-label" for="statusnet-default">'. t('Send public postings to StatusNet by default') .'</label>';
                        $s .= '<input id="statusnet-default" type="checkbox" name="statusnet-default" value="1" ' . $defchecked . '/>';
                        $s .= '<div class="clear"></div>';
+
+                       $s .= '<label id="statusnet-mirror-label" for="statusnet-mirror">'.t('Mirror all posts from statusnet that are no replies or repeated messages').'</label>';
+                       $s .= '<input id="statusnet-mirror" type="checkbox" name="statusnet-mirror" value="1" '. $mirrorchecked . '/>';
+                       $s .= '<div class="clear"></div>';
+
+                       $s .= '<label id="statusnet-shortening-label" for="statusnet-shortening">'.t('Shortening method that optimizes the post').'</label>';
+                       $s .= '<input id="statusnet-shortening" type="checkbox" name="statusnet-shortening" value="1" '. $shorteningchecked . '/>';
+                       $s .= '<div class="clear"></div>';
+
                         $s .= '<label id="statusnet-sendtaglinks-label" for="statusnet-sendtaglinks">'.t('Send linked #-tags and @-names to StatusNet').'</label>';
                         $s .= '<input id="statusnet-sendtaglinks" type="checkbox" name="statusnet-sendtaglinks" value="1" '. $linkschecked . '/>';
                        $s .= '</div><div class="clear"></div>';
@@ -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("&#x2672; ", 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/view/admin.tpl b/statusnet/view/admin.tpl
new file mode 100644 (file)
index 0000000..b40adf3
--- /dev/null
@@ -0,0 +1,16 @@
+{{ for $sites as $s }}
+       {{ inc field_input.tpl with $field=$s.sitename }}{{ endinc }}
+       {{ inc field_input.tpl with $field=$s.apiurl }}{{ endinc }}
+       {{ inc field_input.tpl with $field=$s.secret }}{{ endinc }}
+       {{ inc field_input.tpl with $field=$s.key }}{{ endinc }}
+       {{ if $s.delete }}
+               {{ inc field_checkbox.tpl with $field=$s.delete }}{{ endinc }}
+               <hr>
+       {{ else }}
+               <p>Fill this form to add a new site</p>
+       {{ endif }}
+       
+{{ endfor }}
+
+
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/statusnet/view/smarty3/admin.tpl b/statusnet/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..e2a8408
--- /dev/null
@@ -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}}
+               <hr>
+       {{else}}
+               <p>Fill this form to add a new site</p>
+       {{/if}}
+       
+{{/foreach}}
+
+
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index 4c0fecf33741c642d0080022b164b115fee3b842..b4f6ff9b7b098fddef0af87f795d6c6f49082d8b 100755 (executable)
Binary files a/tumblr.tgz and b/tumblr.tgz differ
index 01ba04bb0a5f7f38f9f6fbbe0c034e34e718c80b..4bbae8e6c06c47234e80d7dc414737fac1900b41 100755 (executable)
-<?php\r
-\r
-/**\r
- * Name: Tumblr Post Connector\r
- * Description: Post to Tumblr\r
- * Version: 1.0\r
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>\r
- */\r
-\r
-require_once('library/OAuth1.php');\r
-require_once('addon/tumblr/tumblroauth/tumblroauth.php');\r
-\r
-function tumblr_install() {\r
-    register_hook('post_local',           'addon/tumblr/tumblr.php', 'tumblr_post_local');\r
-    register_hook('notifier_normal',      'addon/tumblr/tumblr.php', 'tumblr_send');\r
-    register_hook('jot_networks',         'addon/tumblr/tumblr.php', 'tumblr_jot_nets');\r
-    register_hook('connector_settings',      'addon/tumblr/tumblr.php', 'tumblr_settings');\r
-    register_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');\r
-\r
-}\r
-function tumblr_uninstall() {\r
-    unregister_hook('post_local',       'addon/tumblr/tumblr.php', 'tumblr_post_local');\r
-    unregister_hook('notifier_normal',  'addon/tumblr/tumblr.php', 'tumblr_send');\r
-    unregister_hook('jot_networks',     'addon/tumblr/tumblr.php', 'tumblr_jot_nets');\r
-    unregister_hook('connector_settings',      'addon/tumblr/tumblr.php', 'tumblr_settings');\r
-    unregister_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');\r
-}\r
-\r
-function tumblr_module() {}\r
-\r
-function tumblr_content(&$a) {\r
-\r
-       if(! local_user()) {\r
-               notice( t('Permission denied.') . EOL);\r
-               return '';\r
-       }\r
-\r
-       if (isset($a->argv[1]))\r
-               switch ($a->argv[1]) {\r
-                       case "connect":\r
-                               $o = tumblr_connect($a);\r
-                               break;\r
-                       case "callback":\r
-                               $o = tumblr_callback($a);\r
-                               break;\r
-                       default:\r
-                               $o = print_r($a->argv, true);\r
-                               break;\r
-               }\r
-       else\r
-               $o = tumblr_connect($a);\r
-\r
-       return $o;\r
-}\r
-\r
-function tumblr_connect($a) {\r
-       // Start a session.  This is necessary to hold on to  a few keys the callback script will also need\r
-       session_start();\r
-\r
-       // Include the TumblrOAuth library\r
-       //require_once('addon/tumblr/tumblroauth/tumblroauth.php');\r
-\r
-       // Define the needed keys\r
-       $consumer_key = get_config('tumblr','consumer_key');\r
-       $consumer_secret = get_config('tumblr','consumer_secret');\r
-\r
-       // The callback URL is the script that gets called after the user authenticates with tumblr\r
-       // In this example, it would be the included callback.php\r
-       $callback_url = $a->get_baseurl()."/tumblr/callback";\r
-\r
-       // Let's begin.  First we need a Request Token.  The request token is required to send the user\r
-       // to Tumblr's login page.\r
-\r
-       // Create a new instance of the TumblrOAuth library.  For this step, all we need to give the library is our\r
-       // Consumer Key and Consumer Secret\r
-       $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret);\r
-\r
-       // Ask Tumblr for a Request Token.  Specify the Callback URL here too (although this should be optional)\r
-       $request_token = $tum_oauth->getRequestToken($callback_url);\r
-\r
-       // Store the request token and Request Token Secret as out callback.php script will need this\r
-       $_SESSION['request_token'] = $token = $request_token['oauth_token'];\r
-       $_SESSION['request_token_secret'] = $request_token['oauth_token_secret'];\r
-\r
-       // Check the HTTP Code.  It should be a 200 (OK), if it's anything else then something didn't work.\r
-       switch ($tum_oauth->http_code) {\r
-         case 200:\r
-           // Ask Tumblr to give us a special address to their login page\r
-           $url = $tum_oauth->getAuthorizeURL($token);\r
-\r
-               // Redirect the user to the login URL given to us by Tumblr\r
-           header('Location: ' . $url);\r
-\r
-               // That's it for our side.  The user is sent to a Tumblr Login page and\r
-               // asked to authroize our app.  After that, Tumblr sends the user back to\r
-               // our Callback URL (callback.php) along with some information we need to get\r
-               // an access token.\r
-\r
-           break;\r
-       default:\r
-           // Give an error message\r
-           $o = 'Could not connect to Tumblr. Refresh the page or try again later.';\r
-       }\r
-       return($o);\r
-}\r
-\r
-function tumblr_callback($a) {\r
-\r
-       // Start a session, load the library\r
-       session_start();\r
-       //require_once('addon/tumblr/tumblroauth/tumblroauth.php');\r
-\r
-       // Define the needed keys\r
-       $consumer_key = get_config('tumblr','consumer_key');\r
-       $consumer_secret = get_config('tumblr','consumer_secret');\r
-\r
-       // Once the user approves your app at Tumblr, they are sent back to this script.\r
-       // This script is passed two parameters in the URL, oauth_token (our Request Token)\r
-       // and oauth_verifier (Key that we need to get Access Token).\r
-       // We'll also need out Request Token Secret, which we stored in a session.\r
-\r
-       // Create instance of TumblrOAuth.\r
-       // It'll need our Consumer Key and Secret as well as our Request Token and Secret\r
-       $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $_SESSION['request_token'], $_SESSION['request_token_secret']);\r
-\r
-       // Ok, let's get an Access Token. We'll need to pass along our oauth_verifier which was given to us in the URL. \r
-       $access_token = $tum_oauth->getAccessToken($_REQUEST['oauth_verifier']);\r
-\r
-       // We're done with the Request Token and Secret so let's remove those.\r
-       unset($_SESSION['request_token']);\r
-       unset($_SESSION['request_token_secret']);\r
-\r
-       // Make sure nothing went wrong.\r
-       if (200 == $tum_oauth->http_code) {\r
-         // good to go\r
-       } else {\r
-         return('Unable to authenticate');\r
-       }\r
-\r
-       // What's next?  Now that we have an Access Token and Secret, we can make an API call.\r
-       set_pconfig(local_user(), "tumblr", "oauth_token", $access_token['oauth_token']);\r
-       set_pconfig(local_user(), "tumblr", "oauth_token_secret", $access_token['oauth_token_secret']);\r
-\r
-       $o = t("You are now authenticated to tumblr.");\r
-       $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';\r
-       return($o);\r
-}\r
-\r
-function tumblr_jot_nets(&$a,&$b) {\r
-    if(! local_user())\r
-        return;\r
-\r
-    $tmbl_post = get_pconfig(local_user(),'tumblr','post');\r
-    if(intval($tmbl_post) == 1) {\r
-        $tmbl_defpost = get_pconfig(local_user(),'tumblr','post_by_default');\r
-        $selected = ((intval($tmbl_defpost) == 1) ? ' checked="checked" ' : '');\r
-        $b .= '<div class="profile-jot-net"><input type="checkbox" name="tumblr_enable"' . $selected . ' value="1" /> '\r
-            . t('Post to Tumblr') . '</div>';\r
-    }\r
-}\r
-\r
-\r
-function tumblr_settings(&$a,&$s) {\r
-\r
-    if(! local_user())\r
-        return;\r
-\r
-    /* Add our stylesheet to the page so we can make our settings look nice */\r
-\r
-    $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/tumblr/tumblr.css' . '" media="all" />' . "\r\n";\r
-\r
-    /* Get the current state of our config variables */\r
-\r
-    $enabled = get_pconfig(local_user(),'tumblr','post');\r
-\r
-    $checked = (($enabled) ? ' checked="checked" ' : '');\r
-\r
-    $def_enabled = get_pconfig(local_user(),'tumblr','post_by_default');\r
-\r
-    $def_checked = (($def_enabled) ? ' checked="checked" ' : '');\r
-\r
-    /* Add some HTML to the existing form */\r
-\r
-    $s .= '<div class="settings-block">';\r
-    $s .= '<h3>' . t('Tumblr Post Settings') . '</h3>';\r
-\r
-    $s .= '<div id="tumblr-username-wrapper">';\r
-    $s .= '<a href="'.$a->get_baseurl().'/tumblr/connect">'.t("(Re-)Authenticate your tumblr page").'</a>';\r
-    $s .= '</div><div class="clear"></div>';\r
-\r
-    $s .= '<div id="tumblr-enable-wrapper">';\r
-    $s .= '<label id="tumblr-enable-label" for="tumblr-checkbox">' . t('Enable Tumblr Post Plugin') . '</label>';\r
-    $s .= '<input id="tumblr-checkbox" type="checkbox" name="tumblr" value="1" ' . $checked . '/>';\r
-    $s .= '</div><div class="clear"></div>';\r
-\r
-    $s .= '<div id="tumblr-bydefault-wrapper">';\r
-    $s .= '<label id="tumblr-bydefault-label" for="tumblr-bydefault">' . t('Post to Tumblr by default') . '</label>';\r
-    $s .= '<input id="tumblr-bydefault" type="checkbox" name="tumblr_bydefault" value="1" ' . $def_checked . '/>';\r
-    $s .= '</div><div class="clear"></div>';\r
-\r
-    $oauth_token = get_pconfig(local_user(), "tumblr", "oauth_token");\r
-    $oauth_token_secret = get_pconfig(local_user(), "tumblr", "oauth_token_secret");\r
-\r
-    $s .= '<div id="tumblr-password-wrapper">';\r
-    if (($oauth_token != "") and ($oauth_token_secret != "")) {\r
-\r
-       $page = get_pconfig(local_user(),'tumblr','page');\r
-       $consumer_key = get_config('tumblr','consumer_key');\r
-       $consumer_secret = get_config('tumblr','consumer_secret');\r
-\r
-       $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);\r
-\r
-       $userinfo = $tum_oauth->get('user/info');\r
-\r
-       $blogs = array();\r
-\r
-       $s .= t("Post to page:")."<select name='tumblr_page'>";\r
-       foreach($userinfo->response->user->blogs as $blog) {\r
-               $blogurl = substr(str_replace(array("http://", "https://"), array("", ""), $blog->url), 0, -1);\r
-               if ($page == $blogurl)\r
-                       $s .= "<option value='".$blogurl."' selected>".$blogurl."</option>";\r
-               else\r
-                       $s .= "<option value='".$blogurl."'>".$blogurl."</option>";\r
-       }\r
-\r
-       $s .= "</select>";\r
-    } else\r
-       $s .= t("You are not authenticated to tumblr");\r
-    $s .= '</div><div class="clear"></div>';\r
-\r
-    /* provide a submit button */\r
-\r
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="tumblr-submit" name="tumblr-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';\r
-\r
-}\r
-\r
-\r
-function tumblr_settings_post(&$a,&$b) {\r
-\r
-       if(x($_POST,'tumblr-submit')) {\r
-\r
-               set_pconfig(local_user(),'tumblr','post',intval($_POST['tumblr']));\r
-               set_pconfig(local_user(),'tumblr','page',$_POST['tumblr_page']);\r
-               set_pconfig(local_user(),'tumblr','post_by_default',intval($_POST['tumblr_bydefault']));\r
-\r
-       }\r
-\r
-}\r
-\r
-function tumblr_post_local(&$a,&$b) {\r
-\r
-       // This can probably be changed to allow editing by pointing to a different API endpoint\r
-\r
-       if($b['edit'])\r
-               return;\r
-\r
-       if((! local_user()) || (local_user() != $b['uid']))\r
-               return;\r
-\r
-       if($b['private'] || $b['parent'])\r
-               return;\r
-\r
-    $tmbl_post   = intval(get_pconfig(local_user(),'tumblr','post'));\r
-\r
-       $tmbl_enable = (($tmbl_post && x($_REQUEST,'tumblr_enable')) ? intval($_REQUEST['tumblr_enable']) : 0);\r
-\r
-       if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'tumblr','post_by_default')))\r
-               $tmbl_enable = 1;\r
-\r
-    if(! $tmbl_enable)\r
-       return;\r
-\r
-    if(strlen($b['postopts']))\r
-       $b['postopts'] .= ',';\r
-     $b['postopts'] .= 'tumblr';\r
-}\r
-\r
-\r
-\r
-\r
-function tumblr_send(&$a,&$b) {\r
-\r
-    if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))\r
-        return;\r
-\r
-    if(! strstr($b['postopts'],'tumblr'))\r
-        return;\r
-\r
-    if($b['parent'] != $b['id'])\r
-        return;\r
-\r
-       $oauth_token = get_pconfig($b['uid'], "tumblr", "oauth_token");\r
-       $oauth_token_secret = get_pconfig($b['uid'], "tumblr", "oauth_token_secret");\r
-       $page = get_pconfig($b['uid'], "tumblr", "page");\r
-       $tmbl_blog = 'blog/'.$page.'/post';\r
-\r
-       if($oauth_token && $oauth_token_secret && $tmbl_blog) {\r
-\r
-               require_once('include/bbcode.php');\r
-\r
-               $tag_arr = array();\r
-               $tags = '';\r
-               $x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER);\r
-\r
-               if($x) {\r
-                       foreach($matches as $mtch) {\r
-                               $tag_arr[] = $mtch[2];\r
-                       }\r
-               }\r
-               if(count($tag_arr))\r
-                       $tags = implode(',',$tag_arr);\r
-\r
-               $link = "";\r
-               $video = false;\r
-               $title = trim($b['title']);\r
-\r
-               // Checking for a bookmark\r
-               if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) {\r
-                       $link = $matches[1];\r
-                       if ($title == '')\r
-                               $title = html_entity_decode($matches[2],ENT_QUOTES,'UTF-8');\r
-\r
-                       $body = $b['body'];\r
-                       // splitting the text in two parts:\r
-                       // before and after the bookmark\r
-                       $pos = strpos($body, "[bookmark");\r
-                       $body1 = substr($body, 0, $pos);\r
-                       $body2 = substr($body, $pos);\r
-\r
-                       // Removing the bookmark\r
-                       $body2 = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'',$body2);\r
-                       $body = $body1.$body2;\r
-\r
-                       $video = ((stristr($link,'youtube')) || (stristr($link,'youtu.be')) || (stristr($mtch[1],'vimeo')));\r
-               }\r
-\r
-               $params = array(\r
-                       'format' => 'html',\r
-                       'tweet' => 'off',\r
-                       'tags' => $tags);\r
-\r
-               if (($link != '') and $video) {\r
-                       $params['type'] = "video";\r
-                       $params['embed'] = $link;\r
-                       if ($title != '')\r
-                               $params['caption'] = '<h1><a href="'.$link.'">'.$title.\r
-                                                       "</a></h1><p>".bbcode($body, false, false)."</p>";\r
-                       else\r
-                               $params['caption'] = bbcode($body, false, false);\r
-               } else if (($link != '') and !$video) {\r
-                       $params['type'] = "link";\r
-                       $params['title'] = $title;\r
-                       $params['url'] = $link;\r
-                       $params['description'] = bbcode($b["body"], false, false);\r
-               } else {\r
-                       $params['type'] = "text";\r
-                       $params['title'] = $title;\r
-                       $params['body'] = bbcode($b['body'], false, false);\r
-               }\r
-\r
-               $consumer_key = get_config('tumblr','consumer_key');\r
-               $consumer_secret = get_config('tumblr','consumer_secret');\r
-\r
-               $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);\r
-\r
-               // Make an API call with the TumblrOAuth instance.\r
-               $x = $tum_oauth->post($tmbl_blog,$params);\r
-\r
-               $ret_code = $tum_oauth->http_code;\r
-\r
-               if($ret_code == 201)\r
-                       logger('tumblr_send: success');\r
-               elseif($ret_code == 403)\r
-                       logger('tumblr_send: authentication failure');\r
-               else\r
-                       logger('tumblr_send: general error: ' . print_r($x,true));\r
-\r
-       }\r
-}\r
+<?php
+
+/**
+ * Name: Tumblr Post Connector
+ * Description: Post to Tumblr
+ * Version: 1.0
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ */
+
+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 .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';
+       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 .= '<div class="profile-jot-net"><input type="checkbox" name="tumblr_enable"' . $selected . ' value="1" /> '
+            . t('Post to Tumblr') . '</div>';
+    }
+}
+
+
+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'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/tumblr/tumblr.css' . '" media="all" />' . "\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 .= '<div class="settings-block">';
+    $s .= '<h3>' . t('Tumblr Post Settings') . '</h3>';
+
+    $s .= '<div id="tumblr-username-wrapper">';
+    $s .= '<a href="'.$a->get_baseurl().'/tumblr/connect">'.t("(Re-)Authenticate your tumblr page").'</a>';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="tumblr-enable-wrapper">';
+    $s .= '<label id="tumblr-enable-label" for="tumblr-checkbox">' . t('Enable Tumblr Post Plugin') . '</label>';
+    $s .= '<input id="tumblr-checkbox" type="checkbox" name="tumblr" value="1" ' . $checked . '/>';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="tumblr-bydefault-wrapper">';
+    $s .= '<label id="tumblr-bydefault-label" for="tumblr-bydefault">' . t('Post to Tumblr by default') . '</label>';
+    $s .= '<input id="tumblr-bydefault" type="checkbox" name="tumblr_bydefault" value="1" ' . $def_checked . '/>';
+    $s .= '</div><div class="clear"></div>';
+
+    $oauth_token = get_pconfig(local_user(), "tumblr", "oauth_token");
+    $oauth_token_secret = get_pconfig(local_user(), "tumblr", "oauth_token_secret");
+
+    $s .= '<div id="tumblr-password-wrapper">';
+    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:")."<select name='tumblr_page'>";
+       foreach($userinfo->response->user->blogs as $blog) {
+               $blogurl = substr(str_replace(array("http://", "https://"), array("", ""), $blog->url), 0, -1);
+               if ($page == $blogurl)
+                       $s .= "<option value='".$blogurl."' selected>".$blogurl."</option>";
+               else
+                       $s .= "<option value='".$blogurl."'>".$blogurl."</option>";
+       }
+
+       $s .= "</select>";
+    } else
+       $s .= t("You are not authenticated to tumblr");
+    $s .= '</div><div class="clear"></div>';
+
+    /* provide a submit button */
+
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="tumblr-submit" name="tumblr-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+}
+
+
+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'] = '<h1><a href="'.$link.'">'.$title.
+                                                       "</a></h1><p>".bbcode($body, false, false)."</p>";
+                       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));
+
+       }
+}
+
index 287619c255709f825338ba63a209d59ceb28746f..7558bca9d37cc7448a90ff2173ea8a24561da0e6 100755 (executable)
Binary files a/twitter.tgz and b/twitter.tgz differ
index ff08976c79613d98828d078c0b603c1c1f25158b..8041f317be8582ffa39a8adb8f1ae41c2bbd99eb 100755 (executable)
@@ -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/admin.tpl b/twitter/admin.tpl
deleted file mode 100755 (executable)
index a83eb07..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{ inc field_input.tpl with $field=$consumerkey }}{{ endinc }}
-{{ inc field_input.tpl with $field=$consumersecret }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
index 75747979eb952a9c07b442ea8d5e330cee0912e5..3ff37cda4a1d0bbfd2fdfece7a3b397172c52907 100755 (executable)
 #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;
index ee3bd0fbda5467dcc85897f8e327a5bc9ff905c1..0452db60360876306ed31ac4b82fb7fb1c284db6 100755 (executable)
@@ -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 .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . ' value="1" /> ' 
-                       . t('Post to Twitter') . '</div>';      
+                       . t('Post to Twitter') . '</div>';
        }
-
-
 }
 
 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 .= '<div class="settings-block">';
        $s .= '<h3>'. t('Twitter Posting Settings') .'</h3>';
@@ -198,6 +209,15 @@ function twitter_settings(&$a,&$s) {
                         $s .= '<label id="twitter-default-label" for="twitter-default">'. t('Send public postings to Twitter by default') .'</label>';
                         $s .= '<input id="twitter-default" type="checkbox" name="twitter-default" value="1" ' . $defchecked . '/>';
                        $s .= '<div class="clear"></div>';
+
+                        $s .= '<label id="twitter-mirror-label" for="twitter-mirror">'.t('Mirror all posts from twitter that are no replies or retweets').'</label>';
+                        $s .= '<input id="twitter-mirror" type="checkbox" name="twitter-mirror" value="1" '. $mirrorchecked . '/>';
+                       $s .= '<div class="clear"></div>';
+
+                        $s .= '<label id="twitter-shortening-label" for="twitter-shortening">'.t('Shortening method that optimizes the tweet').'</label>';
+                        $s .= '<input id="twitter-shortening" type="checkbox" name="twitter-shortening" value="1" '. $shorteningchecked . '/>';
+                       $s .= '<div class="clear"></div>';
+
                         $s .= '<label id="twitter-sendtaglinks-label" for="twitter-sendtaglinks">'.t('Send linked #-tags and @-names to Twitter').'</label>';
                         $s .= '<input id="twitter-sendtaglinks" type="checkbox" name="twitter-sendtaglinks" value="1" '. $linkschecked . '/>';
                        $s .= '</div><div class="clear"></div>';
@@ -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("&#x2672; ", 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/view/admin.tpl b/twitter/view/admin.tpl
new file mode 100644 (file)
index 0000000..b89f51b
--- /dev/null
@@ -0,0 +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 }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/twitter/view/smarty3/admin.tpl b/twitter/view/smarty3/admin.tpl
new file mode 100644 (file)
index 0000000..554ed5a
--- /dev/null
@@ -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}}
+<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
index 4aa58096d8ce8de26c9e0fa783fb64922bdb1ea2..7a758b00d0714884bd790f37e5123e3b2d74e9b4 100755 (executable)
Binary files a/uhremotestorage.tgz and b/uhremotestorage.tgz differ
diff --git a/uhremotestorage/settings.tpl b/uhremotestorage/settings.tpl
deleted file mode 100755 (executable)
index 22d7d60..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<div class="settings-block">
-       <h3>$title</h3>
-       <p>$desc</p>
-       {{ inc field_input.tpl with $field=$url }}{{ endinc }}
-       {{ inc field_input.tpl with $field=$auth }}{{ endinc }}
-       {{ inc field_select.tpl with $field=$api }}{{ endinc }}
-       <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>      
-
-</div>
index a2a8cc3dd107cf4ccdc0ca2e6c5416b82e14eb0d..85d6b13e8c34186c60a8775686d65eb4a6715af1 100755 (executable)
@@ -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 <a href="http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger">RemoteStorage WebFinger</a>'), $uid ),
diff --git a/uhremotestorage/view/settings.tpl b/uhremotestorage/view/settings.tpl
new file mode 100644 (file)
index 0000000..22d7d60
--- /dev/null
@@ -0,0 +1,9 @@
+<div class="settings-block">
+       <h3>$title</h3>
+       <p>$desc</p>
+       {{ inc field_input.tpl with $field=$url }}{{ endinc }}
+       {{ inc field_input.tpl with $field=$auth }}{{ endinc }}
+       {{ inc field_select.tpl with $field=$api }}{{ endinc }}
+       <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>      
+
+</div>
diff --git a/uhremotestorage/view/smarty3/settings.tpl b/uhremotestorage/view/smarty3/settings.tpl
new file mode 100644 (file)
index 0000000..9a0a55f
--- /dev/null
@@ -0,0 +1,9 @@
+<div class="settings-block">
+       <h3>{{$title}}</h3>
+       <p>{{$desc}}</p>
+       {{include file="field_input.tpl" field=$url}}
+       {{include file="field_input.tpl" field=$auth}}
+       {{include file="field_select.tpl" field=$api}}
+       <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>  
+
+</div>
index f3b1857838ac7c0594cf2b9c5c6c5a45f5296ec1..d89204f59ae1bec973dba92e42bdac79fa7d9d26 100755 (executable)
Binary files a/widgets.tgz and b/widgets.tgz differ
diff --git a/widgets/settings.tpl b/widgets/settings.tpl
deleted file mode 100755 (executable)
index 9d0f21d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<div class="settings-block">
-       <h3 class="settings-heading">$title</h3>
-       <div class='field noedit'>
-               <label>$label</label>
-               <tt>$key</tt>
-       </div>
-       
-       <div class="settings-submit-wrapper">
-               <input type="submit" value="$submit" class="settings-submit" name="widgets-submit" />
-       </div>
-       
-       <h4>$widgets_h</h4>
-       <ul>
-               {{ for $widgets as $w }}
-                       <li><a href="$baseurl/widgets/$w.0/?k=$key&p=1">$w.1</a></li>
-               {{ endfor }}
-       </ul>
-       
-</div>
diff --git a/widgets/view/settings.tpl b/widgets/view/settings.tpl
new file mode 100755 (executable)
index 0000000..9d0f21d
--- /dev/null
@@ -0,0 +1,19 @@
+<div class="settings-block">
+       <h3 class="settings-heading">$title</h3>
+       <div class='field noedit'>
+               <label>$label</label>
+               <tt>$key</tt>
+       </div>
+       
+       <div class="settings-submit-wrapper">
+               <input type="submit" value="$submit" class="settings-submit" name="widgets-submit" />
+       </div>
+       
+       <h4>$widgets_h</h4>
+       <ul>
+               {{ for $widgets as $w }}
+                       <li><a href="$baseurl/widgets/$w.0/?k=$key&p=1">$w.1</a></li>
+               {{ endfor }}
+       </ul>
+       
+</div>
diff --git a/widgets/view/smarty3/settings.tpl b/widgets/view/smarty3/settings.tpl
new file mode 100644 (file)
index 0000000..017fa12
--- /dev/null
@@ -0,0 +1,19 @@
+<div class="settings-block">
+       <h3 class="settings-heading">{{$title}}</h3>
+       <div class='field noedit'>
+               <label>{{$label}}</label>
+               <tt>{{$key}}</tt>
+       </div>
+       
+       <div class="settings-submit-wrapper">
+               <input type="submit" value="{{$submit}}" class="settings-submit" name="widgets-submit" />
+       </div>
+       
+       <h4>{{$widgets_h}}</h4>
+       <ul>
+               {{foreach $widgets as $w}}
+                       <li><a href="{{$baseurl}}/widgets/{{$w.0}}/?k={{$key}}&p=1">{{$w.1}}</a></li>
+               {{/foreach}}
+       </ul>
+       
+</div>
diff --git a/widgets/view/smarty3/widget_like.tpl b/widgets/view/smarty3/widget_like.tpl
new file mode 100644 (file)
index 0000000..ad52957
--- /dev/null
@@ -0,0 +1,3 @@
+<style>body {font-size: 0.8em; margin: 0px; padding: 0px;}</style>
+<span class='f9k_like' title="{{$strlike}}">{{$like}} <img src="{{$baseurl}}/images/like.gif" alt="like"/></span> 
+<span class='f9k_dislike' title="{{$strdislike}}">{{$dislike}} <img src="{{$baseurl}}/images/dislike.gif" alt="dislike"/></span>
diff --git a/widgets/view/widget_like.tpl b/widgets/view/widget_like.tpl
new file mode 100755 (executable)
index 0000000..3c26d1d
--- /dev/null
@@ -0,0 +1,3 @@
+<style>body {font-size: 0.8em; margin: 0px; padding: 0px;}</style>
+<span class='f9k_like' title="$strlike">$like <img src="$baseurl/images/like.gif" alt="like"/></span> 
+<span class='f9k_dislike' title="$strdislike">$dislike <img src="$baseurl/images/dislike.gif" alt="dislike"/></span>
index 649d4a767ec1b4d65311dc83ae304953c614a731..8f356da976b856b9326a3ceb217be18086314802 100755 (executable)
@@ -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/widget_like.tpl b/widgets/widget_like.tpl
deleted file mode 100755 (executable)
index 3c26d1d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<style>body {font-size: 0.8em; margin: 0px; padding: 0px;}</style>
-<span class='f9k_like' title="$strlike">$like <img src="$baseurl/images/like.gif" alt="like"/></span> 
-<span class='f9k_dislike' title="$strdislike">$dislike <img src="$baseurl/images/dislike.gif" alt="dislike"/></span>
index 47a6e48a6fe6deea6903fb25b3d8f4244206112a..72534ce3bb75863556051ffbbbe91c13738eacc0 100755 (executable)
@@ -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(),