diff --git a/adult_smile.tgz b/adult_smile.tgz
deleted file mode 100644
index 67e2a31e..00000000
Binary files a/adult_smile.tgz and /dev/null differ
diff --git a/adult_smile/adult_smile.php b/adult_smile/adult_smile.php
deleted file mode 100644
index 46574143..00000000
--- a/adult_smile/adult_smile.php
+++ /dev/null
@@ -1,34 +0,0 @@
-
- *
- * This is a template for how to extend the "smily" code.
- *
- */
-
-function adult_smile_install() {
- register_hook('smilie', 'addon/adult_smile/adult_smile.php', 'adult_smile_smilies');
-}
-
-function adult_smile_uninstall() {
- unregister_hook('smilie', 'addon/adult_smile/adult_smile.php', 'adult_smile_smilies');
-}
-
-
-
-function adult_smile_smilies(&$a,&$b) {
-
- $b['texts'][] = '(o)(o)';
- $b['icons'][] = '';
-
- $b['texts'][] = '(.)(.)';
- $b['icons'][] = '';
-
- $b['texts'][] = ':bong';
- $b['icons'][] = '';
-
-
-}
\ No newline at end of file
diff --git a/blockem.tgz b/blockem.tgz
index dd092204..c1842e52 100755
Binary files a/blockem.tgz and b/blockem.tgz differ
diff --git a/blockem/blockem.php b/blockem/blockem.php
index 9134bd0b..5ff87c58 100755
--- a/blockem/blockem.php
+++ b/blockem/blockem.php
@@ -109,7 +109,7 @@ function blockem_prepare_body(&$a,&$b) {
function blockem_display_item(&$a,&$b) {
if(strstr($b['output']['body'],'id="blockem-wrap-'))
- $b['output']['thumb'] = $a->get_baseurl() . "/images/default-profile-sm.jpg";
+ $b['output']['thumb'] = $a->get_baseurl() . "/images/person-80.jpg";
}
diff --git a/communityhome.tgz b/communityhome.tgz
index b08f2e56..dbb235bb 100755
Binary files a/communityhome.tgz and b/communityhome.tgz differ
diff --git a/communityhome/communityhome.php b/communityhome/communityhome.php
index 8f0aa867..14c40328 100755
--- a/communityhome/communityhome.php
+++ b/communityhome/communityhome.php
@@ -35,7 +35,7 @@ function communityhome_home(&$a, &$o){
$aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
// last 12 users
- $aside['$lastusers_title'] = t('Last users');
+ $aside['$lastusers_title'] = t('Latest users');
$aside['$lastusers_items'] = array();
$sql_extra = "";
$publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
@@ -95,7 +95,7 @@ function communityhome_home(&$a, &$o){
}
// last 12 photos
- $aside['$photos_title'] = t('Last 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`
@@ -130,7 +130,7 @@ function communityhome_home(&$a, &$o){
}
// last 10 liked items
- $aside['$like_title'] = t('Last likes');
+ $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`
diff --git a/communityhome/twillingham/README b/communityhome/twillingham/README
index bb574278..dbbe1419 100644
--- a/communityhome/twillingham/README
+++ b/communityhome/twillingham/README
@@ -1,7 +1,3 @@
-Thomas Willingham
+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.
-This isn't even close to being worth a pull request, but some people might find it useful.
-
-Enable community home in your admin panel, then replace communityhome.php with this one to get a front page like mine (a normal front page, but with latest users shown in the sidebar, which looks bleak when there's nothing in it).
-
-There are more graceful ways of doing this, I used communityhome as I plan to make use of a limited stream and likes in future.
+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/dwpost.tgz b/dwpost.tgz
index ecbb5198..c0fbb96b 100644
Binary files a/dwpost.tgz and b/dwpost.tgz differ
diff --git a/facebook.tgz b/facebook.tgz
index 783425ce..563d39cc 100644
Binary files a/facebook.tgz and b/facebook.tgz differ
diff --git a/facebook/README b/facebook/README
index 9687558e..b68ba3da 100755
--- a/facebook/README
+++ b/facebook/README
@@ -1,35 +1,43 @@
Installing the Friendica/Facebook connector
-1. register an API key for your site from developer.facebook.com
- a. We'd be very happy if you include "Friendica" in the application name
- to increase name recognition. The Friendica icons are also present
- in the images directory and may be uploaded as a Facebook app icon.
- Use images/friendica-16.jpg for the Icon and images/friendica-128.jpg for the Logo.
- b. The url should be your site URL with a trailing slash.
- You may use http://portal.friendika.com/privacy as the privacy policy
- URL unless your site has different requirements, and
- http://portal.friendika.com as the Terms of Service URL unless
- you have different requirements. (Friendica is a software application
- and does not require Terms of Service, though your installation of it might).
- c. Set the following values in your .htconfig.php file
- $a->config['facebook']['appid'] = 'xxxxxxxxxxx';
- $a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
- Replace with the settings Facebook gives you.
- d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
- to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com.
- e. Chose "Website" (the url should be your site URL with a trailing slash) in the
- "Select how your app integrates with Facebook" section.
-2. Enable the facebook plugin by including it in .htconfig.php - e.g.
- $a->config['system']['addon'] = 'plugin1,plugin2,facebook';
-3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
- and click 'Install Facebook Connector'.
-4. This will ask you to login to Facebook and grant permission to the
- plugin to do its stuff. Allow it to do so.
-5. Optional step: If you want to use Facebook Real Time Updates (so new messages
- and new contacts are added ~1min after they are postet / added on FB), go to
- Settings -> plugins -> facebook and press the "Activate Real-Time Updates"-button.
-6. You're done. To turn it off visit the Plugin Settings page again and
- 'Remove Facebook posting'.
+1. Visit https://developers.facebook.com/apps to register an app.
+ a) Click "Create a new app"
+ b) We'd be very happy if you include "Friendica" in the application name
+ to increase name recognition.
+ c) Edit your app settings on the setup page. The Friendica icons are present
+ in the images directory and may be uploaded as a Facebook app icon. Use
+ images/friendica-16.jpg for the Icon and images/Friendica-128.jpg for the logo.
+ d) In the App Display name enter the name of your app (this should default to the
+ name you chose in part a).
+ e) Enter YourDomain.com in the App Domain field and hit return.
+ f) In "Select how your app connects with Facebook select "Website" and enter the
+ full URL to your Friendica install including HTTPS and a trailing slash.
+
+2. Enable the Facebook plugin by clicking on the icon next to it's name on the plugin
+ page of your admin panel.
+ b) return to the Facebook plugin page in your admin panel, and fill in the App-ID
+ and Application Secret settings you got from Facebook.
+ c) Click save.
+ d) Finally, return to the Facebook settings page, and activate real-time updates.
+
+ i. If you for any reason prefer to use a configuration file instead of the admin panels,
+ Activate the plugin by including it in .htconfig.php, e.g.
+
+ $a->config['system']['addon'] = 'plugin1,plugin2,facebook';
+
+ and set the following values:
+ $a->config['facebook']['appid'] = 'xxxxxxxxxxx';
+ $a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
+
+ Replace with the settings Facebook gives you.
+
+
+3. To use the Facebook plugin, visit the "connector settings" area of your settings
+ page. Click "Install Facebook Connector".
+4. This will ask you to login to Facebook and allow the plugin to do it's stuff.
+ Allow it to do so.
+5. You're done. To turn it off visit the Plugin Settings page again and
+ 'Remove Facebook posting'.
Vidoes and embeds will not be posted if there is no other content. Links
and images will be converted to a format suitable for the Facebook API and
diff --git a/facebook/facebook.php b/facebook/facebook.php
index 4524a486..70a353dd 100755
--- a/facebook/facebook.php
+++ b/facebook/facebook.php
@@ -25,9 +25,8 @@
* d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set
* Site URL to yoursubdomain.yourdomain.com. Set Site Domain to your
* yourdomain.com.
- * 2. (This step is now obsolete. Enable the plugin via the Admin panel.)
- * Enable the facebook plugin by including it in .htconfig.php - e.g.
- * $a->config['system']['addon'] = 'plugin1,plugin2,facebook';
+ * 2. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
+ * and click 'Install Facebook Connector'.
* 3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
* and click 'Install Facebook Connector'.
* 4. This will ask you to login to Facebook and grant permission to the
@@ -46,8 +45,19 @@
* authenticate to your site to establish identity. We will address this
* in a future release.
*/
+
+ /** TODO
+ * - Implement a method for the administrator to delete all configuration data the plugin has created,
+ * e.g. the app_access_token
+ */
-define('FACEBOOK_MAXPOSTLEN', 420);
+// Size of maximum post length increased
+// see http://www.facebook.com/schrep/posts/203969696349811
+// define('FACEBOOK_MAXPOSTLEN', 420);
+define('FACEBOOK_MAXPOSTLEN', 63206);
+define('FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL', 259200); // 3 days
+define('FACEBOOK_DEFAULT_POLL_INTERVAL', 60); // given in minutes
+define('FACEBOOK_MIN_POLL_INTERVAL', 5);
function facebook_install() {
@@ -56,9 +66,8 @@ function facebook_install() {
register_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
register_hook('connector_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
register_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
+ register_hook('enotify', 'addon/facebook/facebook.php', 'facebook_enotify');
register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
-
- if (get_config('facebook', 'realtime_active') == 1) facebook_subscription_add_users(); // Restore settings, if the plugin was installed before
}
@@ -68,13 +77,12 @@ function facebook_uninstall() {
unregister_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
unregister_hook('connector_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
unregister_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
+ unregister_hook('enotify', 'addon/facebook/facebook.php', 'facebook_enotify');
unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
// hook moved
unregister_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook');
unregister_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
-
- if (get_config('facebook', 'realtime_active') == 1) facebook_subscription_del_users();
}
@@ -150,8 +158,12 @@ function facebook_init(&$a) {
$s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
if($s) {
$j = json_decode($s);
- logger('facebook_init: wall: ' . print_r($j,true), LOGGER_DATA);
- fb_consume_stream($uid,$j,($private_wall) ? false : true);
+ if (isset($j->data)) {
+ logger('facebook_init: wall: ' . print_r($j,true), LOGGER_DATA);
+ fb_consume_stream($uid,$j,($private_wall) ? false : true);
+ } else {
+ logger('facebook_init: wall: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
+ }
}
}
@@ -256,6 +268,10 @@ function fb_get_friends_sync_full($uid, $access_token, $person) {
$jp->link = 'http://facebook.com/profile.php?id=' . $person->id;
+ // If its a page then set the first name from the username
+ if (!$jp->first_name and $jp->username)
+ $jp->first_name = $jp->username;
+
// check if we already have a contact
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' LIMIT 1",
@@ -455,9 +471,21 @@ function facebook_content(&$a) {
info( t('Updating contacts') . EOL);
}
-
- $fb_installed = get_pconfig(local_user(),'facebook','post');
-
+ $o = '';
+
+ $fb_installed = false;
+ if (get_pconfig(local_user(),'facebook','post')) {
+ $access_token = get_pconfig(local_user(),'facebook','access_token');
+ if ($access_token) {
+ $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
+ $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
+ if($s) {
+ $j = json_decode($s);
+ if (isset($j->data)) $fb_installed = true;
+ }
+ }
+ }
+
$appid = get_config('facebook','appid');
if(! $appid) {
@@ -534,7 +562,7 @@ function facebook_cron($a,$b) {
$poll_interval = intval(get_config('facebook','poll_interval'));
if(! $poll_interval)
- $poll_interval = 3600;
+ $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
if($last) {
$next = $last + $poll_interval;
@@ -589,7 +617,7 @@ function facebook_cron($a,$b) {
if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent')) {
$res = mail($a->config['admin_email'], t('Problems with Facebook Real-Time Updates'),
- "Hi!\n\nThere's a problem with the Facebook Real-Time Updates that cannob be solved automatically. Maybe an permission issue?\n\nThis e-mail will only be sent once.",
+ "Hi!\n\nThere's a problem with the Facebook Real-Time Updates that cannot be solved automatically. Maybe a permission issue?\n\nPlease try to re-activate it on " . $a->config["system"]["url"] . "/admin/plugins/facebook\n\nThis e-mail will only be sent once.",
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit'
@@ -620,17 +648,58 @@ function facebook_plugin_settings(&$a,&$b) {
function facebook_plugin_admin(&$a, &$o){
+ $o = '';
- $activated = facebook_check_realtime_active();
- if ($activated) {
- $o = t('Real-Time Updates are activated.') . '
';
+
+ $appid = get_config('facebook', 'appid' );
+ $appsecret = get_config('facebook', 'appsecret' );
+ $poll_interval = get_config('facebook', 'poll_interval' );
+ if (!$poll_interval) $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
+
+ $ret1 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appid' LIMIT 1");
+ $ret2 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appsecret' LIMIT 1");
+ if ((count($ret1) > 0 && $ret1[0]['v'] != $appid) || (count($ret2) > 0 && $ret2[0]['v'] != $appsecret)) $o .= t('Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.
');
+
+ $working_connection = false;
+ if ($appid && $appsecret) {
+ $subs = facebook_subscriptions_get();
+ if ($subs === null) $o .= t('Error: the given API Key seems to be incorrect (the application access token could not be retrieved).') . ' ';
+ elseif (is_array($subs)) {
+ $o .= t('The given API Key seems to work correctly.') . ' ';
+ $working_connection = true;
+ } else $o .= t('The correctness of the API Key could not be detected. Somthing strange\'s going on.') . ' ';
+ }
+
+ $o .= ' ';
+ $o .= ' ';
+ $o .= ' ';
+ $o .= '';
+
+ if ($working_connection) {
+ $o .= '
' . t('Real-Time Updates') . '
';
+
+ $activated = facebook_check_realtime_active();
+ if ($activated) {
+ $o .= t('Real-Time Updates are activated.') . '
';
+ $o .= '';
+ } else {
+ $o .= t('Real-Time Updates not activated.') . ' ';
+ }
}
}
function facebook_plugin_admin_post(&$a, &$o){
+ check_form_security_token_redirectOnErr('/admin/plugins/facebook', 'fbsave');
+
+ if (x($_REQUEST,'fb_save_keys')) {
+ set_config('facebook', 'appid', $_REQUEST['appid']);
+ set_config('facebook', 'appsecret', $_REQUEST['appsecret']);
+ $poll_interval = IntVal($_REQUEST['poll_interval']);
+ if ($poll_interval >= FACEBOOK_MIN_POLL_INTERVAL) set_config('facebook', 'poll_interval', $poll_interval);
+ del_config('facebook', 'app_access_token');
+ info(t('The new values have been saved.'));
+ }
if (x($_REQUEST,'real_time_activate')) {
facebook_subscription_add_users();
}
@@ -664,6 +733,7 @@ function facebook_post_hook(&$a,&$b) {
*/
require_once('include/group.php');
+ require_once('include/html2plain.php');
logger('Facebook post');
@@ -784,7 +854,8 @@ function facebook_post_hook(&$a,&$b) {
if($b['verb'] == ACTIVITY_DISLIKE)
$msg = trim(strip_tags(bbcode($msg)));
- $search_str = $a->get_baseurl() . '/search';
+ // Old code
+ /*$search_str = $a->get_baseurl() . '/search';
if(preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is",$msg,$matches)) {
@@ -813,24 +884,83 @@ function facebook_post_hook(&$a,&$b) {
if((strpos($link,z_root()) !== false) && (! $image))
$image = $a->get_baseurl() . '/images/friendica-64.jpg';
- $msg = trim(strip_tags(bbcode($msg)));
+ $msg = trim(strip_tags(bbcode($msg)));*/
+
+ // New code
+
+ // Looking for the first image
+ $image = '';
+ if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches))
+ $image = $matches[3];
+
+ if ($image != '')
+ if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches))
+ $image = $matches[1];
+
+ // Checking for a bookmark element
+ $body = $b['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 the bookmark and all quotes after the bookmark
+ // they are mostly only the content after the bookmark.
+ $body2 = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'',$body2);
+ $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2);
+ $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2);
+
+ $body = $body1.$body2;
+ }
+
+ // At first convert the text to html
+ $html = bbcode($body);
+
+ // Then convert it to plain text
+ $msg = trim($b['title']." \n\n".html2plain($html, 0, true));
$msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8');
+ // Removing multiple newlines
+ while (strpos($msg, "\n\n\n") !== false)
+ $msg = str_replace("\n\n\n", "\n\n", $msg);
+
// add any attachments as text urls
+ $arr = explode(',',$b['attach']);
- $arr = explode(',',$b['attach']);
-
- if(count($arr)) {
+ if(count($arr)) {
$msg .= "\n";
- foreach($arr as $r) {
- $matches = false;
+ foreach($arr as $r) {
+ $matches = false;
$cnt = preg_match('|\[attach\]href=\"(.*?)\" size=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
if($cnt) {
- $msg .= $matches[1];
+ $msg .= "\n".$matches[1];
}
}
}
+ $link = '';
+ $linkname = '';
+ // look for bookmark-bbcode and handle it with priority
+ if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) {
+ $link = $matches[1];
+ $linkname = $matches[2];
+ }
+
+ // If there is no bookmark element then take the first link
+ if ($link == '') {
+ $links = collecturls($html);
+ if (sizeof($links) > 0) {
+ reset($links);
+ $link = current($links);
+ }
+ }
+
+ // Remove trailing and leading spaces
+ $msg = trim($msg);
+
+ // Since facebook increased the maxpostlen massively this never should happen again :)
if (strlen($msg) > FACEBOOK_MAXPOSTLEN) {
$shortlink = "";
require_once('library/slinky.php');
@@ -848,7 +978,19 @@ function facebook_post_hook(&$a,&$b) {
$msg = substr($msg, 0, FACEBOOK_MAXPOSTLEN - strlen($shortlink) - 4);
$msg .= '... ' . $shortlink;
}
- if(! strlen($msg))
+
+ // Fallback - if message is empty
+ if(!strlen($msg))
+ $msg = $link;
+
+ if(!strlen($msg))
+ $msg = $image;
+
+ if(!strlen($msg))
+ $msg = $linkname;
+
+ // If there is nothing to post then exit
+ if(!strlen($msg))
return;
logger('Facebook post: msg=' . $msg, LOGGER_DATA);
@@ -896,6 +1038,7 @@ function facebook_post_hook(&$a,&$b) {
if(! get_config('facebook','test_mode')) {
$x = post_url($url, $postvars);
+ logger('Facebook post returns: ' . $x, LOGGER_DEBUG);
$retj = json_decode($x);
if($retj->id) {
@@ -911,15 +1054,45 @@ function facebook_post_hook(&$a,&$b) {
add_to_queue($a->contact,NETWORK_FACEBOOK,$s);
notice( t('Facebook post failed. Queued for retry.') . EOL);
}
+
+ if (isset($retj->error) && $retj->error->type == "OAuthException" && $retj->error->code == 190) {
+ logger('Facebook session has expired due to changed password.', LOGGER_DEBUG);
+
+ $last_notification = get_pconfig($b['uid'], 'facebook', 'session_expired_mailsent');
+ if (!$last_notification || $last_notification < (time() - FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL)) {
+ require_once('include/enotify.php');
+
+ $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($b['uid']) );
+ notification(array(
+ 'uid' => $b['uid'],
+ 'type' => NOTIFY_SYSTEM,
+ 'system_type' => 'facebook_connection_invalid',
+ 'language' => $r[0]['language'],
+ 'to_name' => $r[0]['username'],
+ 'to_email' => $r[0]['email'],
+ 'source_name' => t('Administrator'),
+ 'source_link' => $a->config["system"]["url"],
+ 'source_photo' => $a->config["system"]["url"] . '/images/person-80.jpg',
+ ));
+
+ set_pconfig($b['uid'], 'facebook', 'session_expired_mailsent', time());
+ } else logger('Facebook: No notification, as the last one was sent on ' . $last_notification, LOGGER_DEBUG);
+ }
}
-
- logger('Facebook post returns: ' . $x, LOGGER_DEBUG);
}
}
}
}
}
+function facebook_enotify(&$app, &$data) {
+ if (x($data, 'params') && $data['params']['type'] == NOTIFY_SYSTEM && x($data['params'], 'system_type') && $data['params']['system_type'] == 'facebook_connection_invalid') {
+ $data['itemlink'] = '/facebook';
+ $data['epreamble'] = $data['preamble'] = t('Your Facebook connection became invalid. Please Re-authenticate.');
+ $data['subject'] = t('Facebook connection became invalid');
+ $data['body'] = sprintf( t("Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."), $data['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]", "[url=" . $app->config["system"]["url"] . "/facebook]", "[/url]");
+ }
+}
function facebook_post_local(&$a,&$b) {
@@ -1005,6 +1178,46 @@ function fb_queue_hook(&$a,&$b) {
}
}
+function fb_get_timeline($access_token, &$since) {
+
+ $entries->data = array();
+ $newest = 0;
+
+ $url = 'https://graph.facebook.com/me/home?access_token='.$access_token;
+
+ if ($since != 0)
+ $url .= "&since=".$since;
+
+ do {
+ $s = fetch_url($url);
+ $j = json_decode($s);
+ $oldestdate = time();
+ if (isset($j->data))
+ foreach ($j->data as $entry) {
+ $created = strtotime($entry->created_time);
+
+ if ($newest < $created)
+ $newest = $created;
+
+ if ($created >= $since)
+ $entries->data[] = $entry;
+
+ if ($created <= $oldestdate)
+ $oldestdate = $created;
+ }
+ else
+ break;
+
+ $url = $j->paging->next;
+
+ } while (($oldestdate > $since) and ($since != 0) and ($url != ''));
+
+ if ($newest > $since)
+ $since = $newest;
+
+ return($entries);
+}
+
function fb_consume_all($uid) {
require_once('include/items.php');
@@ -1018,23 +1231,33 @@ function fb_consume_all($uid) {
$s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
if($s) {
$j = json_decode($s);
- logger('fb_consume_stream: wall: ' . print_r($j,true), LOGGER_DATA);
- fb_consume_stream($uid,$j,($private_wall) ? false : true);
+ if (isset($j->data)) {
+ logger('fb_consume_stream: wall: ' . print_r($j,true), LOGGER_DATA);
+ fb_consume_stream($uid,$j,($private_wall) ? false : true);
+ } else {
+ logger('fb_consume_stream: wall: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
+ }
}
}
- $s = fetch_url('https://graph.facebook.com/me/home?access_token=' . $access_token);
- if($s) {
- $j = json_decode($s);
+ // Get the last date
+ $lastdate = get_pconfig($uid,'facebook','lastdate');
+ // fetch all items since the last date
+ $j = fb_get_timeline($access_token, &$lastdate);
+ if (isset($j->data)) {
logger('fb_consume_stream: feed: ' . print_r($j,true), LOGGER_DATA);
fb_consume_stream($uid,$j,false);
- }
+ // Write back the last date
+ set_pconfig($uid,'facebook','lastdate', $lastdate);
+ } else
+ logger('fb_consume_stream: feed: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
}
function fb_get_photo($uid,$link) {
$access_token = get_pconfig($uid,'facebook','access_token');
if(! $access_token || (! stristr($link,'facebook.com/photo.php')))
- return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
+ return "";
+ //return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
$ret = preg_match('/fbid=([0-9]*)/',$link,$match);
if($ret)
$photo_id = $match[1];
@@ -1042,8 +1265,8 @@ function fb_get_photo($uid,$link) {
$j = json_decode($x);
if($j->picture)
return "\n\n" . '[url=' . $link . '][img]' . $j->picture . '[/img][/url]';
- else
- return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
+ //else
+ // return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
}
function fb_consume_stream($uid,$j,$wall = false) {
@@ -1102,6 +1325,10 @@ function fb_consume_stream($uid,$j,$wall = false) {
if($from->id == $self_id)
$datarray['contact-id'] = $self[0]['id'];
else {
+ // Looking if user is known - if not he is added
+ $access_token = get_pconfig($uid, 'facebook', 'access_token');
+ fb_get_friends_sync_new($uid, $access_token, $from);
+
$r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
dbesc($from->id),
intval($uid)
@@ -1111,9 +1338,8 @@ function fb_consume_stream($uid,$j,$wall = false) {
}
// don't store post if we don't have a contact
-
if(! x($datarray,'contact-id')) {
- logger('no contact: post ignored');
+ logger('facebook: no contact '.$from->name.' '.$from->id.'. post ignored');
continue;
}
@@ -1148,24 +1374,92 @@ function fb_consume_stream($uid,$j,$wall = false) {
$datarray['author-avatar'] = 'https://graph.facebook.com/' . $from->id . '/picture';
$datarray['plink'] = $datarray['author-link'] . '&v=wall&story_fbid=' . substr($entry->id,strpos($entry->id,'_') + 1);
+ logger('facebook: post '.$entry->id.' from '.$from->name);
+
$datarray['body'] = escape_tags($entry->message);
- if($entry->picture && $entry->link) {
- $datarray['body'] .= "\n\n" . '[url=' . $entry->link . '][img]' . $entry->picture . '[/img][/url]';
+ if($entry->name and $entry->link)
+ $datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->name."[/bookmark]";
+ elseif ($entry->name)
+ $datarray['body'] .= "\n\n[b]" . $entry->name."[/b]";
+
+ if($entry->caption) {
+ if(!$entry->name and $entry->link)
+ $datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->caption."[/bookmark]";
+ else
+ $datarray['body'] .= "[i]" . $entry->caption."[/i]\n";
}
- else {
- if($entry->picture)
- $datarray['body'] .= "\n\n" . '[img]' . $entry->picture . '[/img]';
- // if just a link, it may be a wall photo - check
- if($entry->link)
- $datarray['body'] .= fb_get_photo($uid,$entry->link);
+
+ if(!$entry->caption and !$entry->name) {
+ if ($entry->link)
+ $datarray['body'] .= "\n[url]".$entry->link."[/url]\n";
+ else
+ $datarray['body'] .= "\n";
}
- if($entry->name)
- $datarray['body'] .= "\n" . $entry->name;
- if($entry->caption)
- $datarray['body'] .= "\n" . $entry->caption;
+
+ $quote = "";
if($entry->description)
- $datarray['body'] .= "\n" . $entry->description;
+ $quote = $entry->description;
+
+ if ($entry->properties)
+ foreach ($entry->properties as $property)
+ $quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]";
+
+ if ($quote)
+ $datarray['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 ($entry->type != "video") {
+ if($entry->picture && $entry->link) {
+ $datarray['body'] .= "\n" . '[url=' . $entry->link . '][img]'.$entry->picture.'[/img][/url]';
+ }
+ else {
+ if($entry->picture)
+ $datarray['body'] .= "\n" . '[img]' . $entry->picture . '[/img]';
+ // if just a link, it may be a wall photo - check
+ if($entry->link)
+ $datarray['body'] .= fb_get_photo($uid,$entry->link);
+ }
+ }
+
+ // Just as a test - to see if these are the missing entries
+ //if(trim($datarray['body']) == '')
+ // $datarray['body'] = $entry->story;
+
+ if(trim($datarray['body']) == '') {
+ logger('facebook: empty body '.$entry->id.' '.print_r($entry, true));
+ continue;
+ }
+
+ $datarray['body'] .= "\n";
+
+ if ($entry->icon)
+ $datarray['body'] .= "[img]".$entry->icon."[/img] ";
+
+ if ($entry->actions)
+ foreach ($entry->actions as $action)
+ if (($action->name != "Comment") and ($action->name != "Like"))
+ $datarray['body'] .= "[url=".$action->link."]".$action->name."[/url] ";
+
+ $datarray['body'] = trim($datarray['body']);
+
+ //if(($datarray['body'] != '') and ($uid == 1))
+ // $datarray['body'] .= "[noparse]".print_r($entry, true)."[/noparse]";
+
+ if ($entry->place->name)
+ $datarray['coord'] = $entry->place->name;
+ else if ($entry->place->location->street or $entry->place->location->city or $entry->place->location->Denmark) {
+ if ($entry->place->location->street)
+ $datarray['coord'] = $entry->place->location->street;
+ if ($entry->place->location->city)
+ $datarray['coord'] .= " ".$entry->place->location->city;
+ if ($entry->place->location->country)
+ $datarray['coord'] .= " ".$entry->place->location->country;
+ } else if ($entry->place->location->latitude and $entry->place->location->longitude)
+ $datarray['coord'] = substr($entry->place->location->latitude, 0, 8)
+ .' '.substr($entry->place->location->longitude, 0, 8);
+
$datarray['created'] = datetime_convert('UTC','UTC',$entry->created_time);
$datarray['edited'] = datetime_convert('UTC','UTC',$entry->updated_time);
@@ -1174,12 +1468,7 @@ function fb_consume_stream($uid,$j,$wall = false) {
if($entry->privacy && $entry->privacy->value !== 'EVERYONE') {
$datarray['private'] = 1;
- $datarray['allow_cid'] = '<' . $uid . '>';
- }
-
- if(trim($datarray['body']) == '') {
- logger('facebook: empty body');
- continue;
+ $datarray['allow_cid'] = '<' . $self[0]['id'] . '>';
}
$top_item = item_store($datarray);
@@ -1373,8 +1662,8 @@ function fb_get_app_access_token() {
logger('fb_get_app_access_token: appid and/or appsecret not set', LOGGER_DEBUG);
return false;
}
-
- $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . "&grant_type=client_credentials");
+ 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);
@@ -1402,11 +1691,10 @@ function facebook_subscription_del_users() {
$url = "https://graph.facebook.com/" . get_config('facebook', 'appid' ) . "/subscriptions?access_token=" . $access_token;
facebook_delete_url($url);
- del_config('facebook', 'realtime_active');
+ if (!facebook_check_realtime_active()) del_config('facebook', 'realtime_active');
}
-function facebook_subscription_add_users() {
-
+function facebook_subscription_add_users($second_try = false) {
$a = get_app();
$access_token = fb_get_app_access_token();
@@ -1427,9 +1715,18 @@ function facebook_subscription_add_users() {
del_config('facebook', 'cb_verify_token');
if ($j) {
+ $x = json_decode($j);
logger("Facebook reponse: " . $j, LOGGER_DATA);
-
- if (facebook_check_realtime_active()) set_config('facebook', 'realtime_active', 1);
+ if (isset($x->error)) {
+ logger('facebook_subscription_add_users: got an error: ' . $j);
+ if ($x->error->type == "OAuthException" && $x->error->code == 190) {
+ del_config('facebook', 'app_access_token');
+ if ($second_try === false) facebook_subscription_add_users(true);
+ }
+ } else {
+ logger('facebook_subscription_add_users: sucessful');
+ if (facebook_check_realtime_active()) set_config('facebook', 'realtime_active', 1);
+ }
};
}
@@ -1543,4 +1840,4 @@ function facebook_delete_url($url,$headers = null, &$redirects = 0, $timeout = 0
curl_close($ch);
return($body);
-}}
\ No newline at end of file
+}}
diff --git a/ijpost.tar.gz b/ijpost.tar.gz
deleted file mode 100644
index 4c67d491..00000000
Binary files a/ijpost.tar.gz and /dev/null differ
diff --git a/ijpost.tgz b/ijpost.tgz
new file mode 100644
index 00000000..555e0602
Binary files /dev/null and b/ijpost.tgz differ
diff --git a/impressum.tgz b/impressum.tgz
index 4f8ab29f..3e4ecd75 100755
Binary files a/impressum.tgz and b/impressum.tgz differ
diff --git a/impressum/README b/impressum/README
index 3f183fbf..fcf29aaf 100755
--- a/impressum/README
+++ b/impressum/README
@@ -1,9 +1,10 @@
Impressum Plugin for Friendica
Author: Tobias Diekershoff
+ http://diekershoff.homeunix.net/friendika/profile/tobias
tobias.diekershoff@gmx.net
-License: 3-clause BSD license (same as Friendica)
+License: 3-clause BSD license
About
This plugin adds an Impressum block to the /friendica page with informations
@@ -12,16 +13,22 @@ About
In the notes and postal fields you can use HTML tags for formatting.
Configuration:
- For configuration you can set the following variables in the .htconfig file
- * $a->config['impressum']['owner'] this is the Name of the Operator
- * $a->config['impressum']['ownerprofile'] this is an optional Friendica account
- where the above owner name will link to
- * $a->config['impressum']['email'] a contact email address (optional)
- will be displayed slightly obfuscated
- as name(at)example(dot)com
- * $a->config['impressum']['postal'] should contain a postal address where
- you can be reached at (optional)
- * $a->config['impressum']['notes'] additional informations that should
- be displayed in the Impressum block
+ Simply fill in the fields in the impressium settings page in the plugins area
+ of your admin panel.
+If you for any reason prefer to use a configuration file instead, you can set the
+following variables in the .htconfig file
+ * $a->config['impressum']['owner'] this is the Name of the Operator
+ * $a->config['impressum']['ownerprofile'] this is an optional Friendica account
+ where the above owner name will link to
+ * $a->config['impressum']['email'] a contact email address (optional)
+ will be displayed slightly obfuscated
+ as name(at)example(dot)com
+
+ * $a->config['impressum']['postal'] should contain a postal address where
+ you can be reached at (optional)
+ * $a->config['impressum']['notes'] additional informations that should
+ be displayed in the Impressum block
+ * $a->config['impressum']['footer_text'] Text that will be displayed at
+ the bottom of the pages.
diff --git a/impressum/admin.tpl b/impressum/admin.tpl
index cfba8df7..849c11f9 100755
--- a/impressum/admin.tpl
+++ b/impressum/admin.tpl
@@ -3,4 +3,5 @@
{{ inc field_input.tpl with $field=$postal }}{{ endinc }}
{{ inc field_input.tpl with $field=$notes }}{{ endinc }}
{{ inc field_input.tpl with $field=$email }}{{ endinc }}
+{{ inc field_input.tpl with $field=$footer_text }}{{ endinc }}
diff --git a/impressum/impressum.css b/impressum/impressum.css
new file mode 100644
index 00000000..ec0b5e57
--- /dev/null
+++ b/impressum/impressum.css
@@ -0,0 +1,4 @@
+#impressum_footer {
+ padding-top: 15px;
+ font-size: 0.8em;
+}
diff --git a/impressum/impressum.php b/impressum/impressum.php
index ce9790bb..76002279 100755
--- a/impressum/impressum.php
+++ b/impressum/impressum.php
@@ -2,18 +2,20 @@
/**
* Name: Impressum
* Description: Plugin to add contact information to the about page (/friendica)
- * Version: 1.0
- * Author: Tobias Diekershoff
+ * Version: 1.1
+ * Author: Tobias Diekershoff
* License: 3-clause BSD license
*/
function impressum_install() {
register_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
+ register_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
logger("installed impressum plugin");
}
function impressum_uninstall() {
unregister_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
+ unregister_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
logger("uninstalled impressum plugin");
}
function obfuscate_email ($s) {
@@ -21,6 +23,13 @@ function obfuscate_email ($s) {
$s = str_replace('.','(dot)',$s);
return $s;
}
+function impressum_footer($a, &$b) {
+ $text = get_config('impressum','footer_text');
+ if (! $text == '') {
+ $a->page['htmlhead'] .= '';
+ $b .= '';
+ }
+}
function impressum_show($a,&$b) {
$b .= '
';
+
+
+
+
+
+$channels = ((x($_GET,'channels')) ? $_GET['channels'] : 'friendica');
/* add the chatroom frame and some html
* by altering the "channels=friendica" part of the URL, you can add/remove channels.
@@ -43,8 +61,8 @@ $o = '';
*/
$o .= <<< EOT
' . t('Not Safe For Work (General Purpose Content Filter) settings') . '
';
$s .= '
';
-
- $s .= '';
+ $s .= '
' . t ('This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter.') . '
';
diff --git a/openstreetmap.tgz b/openstreetmap.tgz
index 64a55d81..29fced0a 100644
Binary files a/openstreetmap.tgz and b/openstreetmap.tgz differ
diff --git a/openstreetmap/README b/openstreetmap/README
index 41fc842c..beac3a21 100644
--- a/openstreetmap/README
+++ b/openstreetmap/README
@@ -16,15 +16,33 @@ Support the OpenStreetMap community and share the load.
___ Configuration ___
+If you for any reason prefer to use a configuration file instead
+of the admin panels, please refer to the Alternative Configuration below.
+
+Activate the plugin from your admin panel.
+
+You can now add a Tile Server and default zoom level in the plugin settings
+page of your admin panel.
+
+The Time Server URL points to the tile server you want to use. Use the full URL,
+with protocol (http/s) and trailing slash. You can configure the default zoom
+level on the map in the Default Zoom box. 1 will show the whole world and 18 is the highest
+zoom level available.
+
+
+___ Alternative Configuration ___
+
Open the .htconfig.php file and add "openstreetmap" to the list of activated
addons.
+
$a->config['system']['addon'] = "openstreetmap, ..."
You have to add two configuration variables for the addon:
+
$a->config['openstreetmap']['tmsserver'] = 'http://www.openstreetmap.org/';
$a->config['openstreetmap']['zoom'] = '18';
The *tmsserver* points to the tile server you want to use. Use the full URL,
-with protocol (http/s) and trailing slash. You can configure the default zoom
-level on the map with *zoom*. 1 will show the whole world and 18 is the highest
-zoom level available.
+with protocol (http/s) and trailing slash. You can configure the default zoom
+level on the map with *zoom*. 1 will show the whole world and 18 is the highest
+zoom level available.
\ No newline at end of file
diff --git a/page.tgz b/page.tgz
new file mode 100644
index 00000000..84fb7b81
Binary files /dev/null and b/page.tgz differ
diff --git a/page/page.php b/page/page.php
new file mode 100755
index 00000000..72972ede
--- /dev/null
+++ b/page/page.php
@@ -0,0 +1,60 @@
+
+ * based on pages plugin by
+ * Author: Michael Vogel
+ *
+ */
+
+function page_install() {
+ register_hook('page_end', 'addon/page/page.php', 'page_page_end');
+}
+
+function page_uninstall() {
+ unregister_hook('page_end', 'addon/page/page.php', 'page_page_end');
+}
+
+
+function page_getpage($uid) {
+
+
+ $pagelist = array();
+
+ $contacts = q("SELECT `id`, `url`, `name`, `micro`FROM `contact`
+ WHERE `network`= 'dfrn' AND `forum` = 1 AND `uid` = %d",
+ intval($uid)
+ );
+
+ $page = array();
+
+ // Look if the profile is a community page
+ foreach($contacts as $contact) {
+ $page[] = array("url"=>$contact["url"], "name"=>$contact["name"], "id"=>$contact["id"], "micro"=>$contact['micro']);
+ }
+ return($page);
+}
+
+function page_page_end($a,&$b) {
+ // Only move on if if it's the "network" module and there is a logged on user
+ if (($a->module != "network") OR ($a->user['uid'] == 0))
+ return;
+
+ $page = '
";
- if (sizeof($contacts) > 0)
- $a->page['aside'] = $pages.$a->page['aside'];
-}
-?>
diff --git a/piwik.tgz b/piwik.tgz
index febb641e..230c1f50 100755
Binary files a/piwik.tgz and b/piwik.tgz differ
diff --git a/piwik/README b/piwik/README
index e276ccd4..c648a4d1 100755
--- a/piwik/README
+++ b/piwik/README
@@ -1,6 +1,7 @@
## Piwik Plugin ##
by Tobias Diekershoff
+ http://diekershoff.homeunix.net/friendika/profile/tobias
tobias.diekershoff(at)gmx.net
This addon allows you to embed the code necessary for the FLOSS webanalytics
@@ -19,6 +20,13 @@ styling the opt-out notice.
### Configuration ###
+The easiest way to configure this addon is by activating the admin panels of
+your ~friendica server and then enter the needed details on the config page
+for the addon.
+
+If you don't want to use the admin panel, you can configure the addon through
+the .htconfig file.
+
Open the .htconfig.php file and add "piwik" to the list of activated addons.
$a->config['system']['addon'] = "piwik, ..."
diff --git a/piwik/piwik.php b/piwik/piwik.php
index dbb1f45a..3e0d718f 100755
--- a/piwik/piwik.php
+++ b/piwik/piwik.php
@@ -3,7 +3,7 @@
* Name: Piwik Analytics
* Description: Piwik Analytics Plugin for Friendica
* Version: 1.1
- * Author: Tobias Diekershoff
+ * Author: Tobias Diekershoff
* Author: Klaus Weidenbach
*/
@@ -49,7 +49,7 @@ function piwik_analytics($a,&$b) {
* associated CSS file. We just have to tell Friendica to get it
* into the page header.
*/
- $a->page['htmlhead'] .= '' . "\r\n";
+ $a->page['htmlhead'] .= '';
/*
* Get the configuration variables from the .htconfig file.
diff --git a/showmore.tgz b/showmore.tgz
index 6c2203a1..394a99fd 100644
Binary files a/showmore.tgz and b/showmore.tgz differ
diff --git a/showmore/showmore.php b/showmore/showmore.php
index 7842a58e..2b4d5d0f 100755
--- a/showmore/showmore.php
+++ b/showmore/showmore.php
@@ -46,7 +46,8 @@ function showmore_addon_settings(&$a,&$s) {
$s .= '
';
$s .= '';
-// $s .= '
' . t('Use /expression/ to provide regular expressions') . '
';
+// $s .= '
' . t('Use /expression/ to provide regular expressions') . '
';
@@ -425,7 +433,12 @@ function statusnet_post_hook(&$a,&$b) {
// 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.
- $tmp = substr($b['body'], 0, 2*$max_char);
+ if (! $b['title']=='') {
+ $tmp = $b['title'] . ' : '. $b['body'];
+ $tmp = substr($tmp, 0, 4*$max_char);
+ } else {
+ $tmp = substr($b['body'], 0, 3*$max_char);
+ }
// if [url=bla][img]blub.png[/img][/url] get blub.png
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
// preserve links to images, videos and audios
@@ -435,11 +448,13 @@ function statusnet_post_hook(&$a,&$b) {
$tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp);
$tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp);
$tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp);
+ $linksenabled = get_pconfig($b['uid'],'statusnet','post_taglinks');
// if a #tag is linked, don't send the [url] over to SN
- // this is commented out by default as it means backlinks
- // to friendica, if you don't like this feel free to
- // uncomment the following line
-// $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
+ // that is, don't send if the option is not set in the
+ // connector settings
+ if ($linksenabled=='0') {
+ $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
+ }
// preserve links to webpages
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
$tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp);
@@ -465,7 +480,13 @@ function statusnet_post_hook(&$a,&$b) {
$shortlink = short_link( $b['plink'] );
// the new message will be shortened such that "... $shortlink"
// will fit into the character limit
- $msg = substr($msg, 0, $max_char-strlen($shortlink)-4);
+ $msg = nl2br(substr($msg, 0, $max_char-strlen($shortlink)-4));
+ $msg = str_replace(array(' ',' '),' ',$msg);
+ $e = explode(' ', $msg);
+ // remove the last word from the cut down message to
+ // avoid sending cut words to the MicroBlog
+ array_pop($e);
+ $msg = implode(' ', $e);
$msg .= '... ' . $shortlink;
}
// and now tweet it :-)
diff --git a/twitter.tgz b/twitter.tgz
index 18416d1f..52a05cc6 100755
Binary files a/twitter.tgz and b/twitter.tgz differ
diff --git a/twitter/README b/twitter/README
index 99edf0d3..12bb6664 100755
--- a/twitter/README
+++ b/twitter/README
@@ -1,5 +1,6 @@
____ Twitter Plugin ____
By Tobias Diekershoff
+ http://diekershoff.homeunix.net/friendika/profile/tobias
tobias.diekershoff(at)gmx.net
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -47,18 +48,31 @@ ___ Configuration ___
__ Global Configuration __
+If you enabled an administrator account, please use the admin panel to configure
+the Twitter relay. If you for any reason prefer to use a configuration file instead
+of the admin panels, please refer to the Alternative Configuration below.
+
+Activate the plugin from the plugins section of your admin panel. When you have
+done so, add your consumer key and consumer secret in the settings section of the
+plugin page.
+
+When this is done your user can now configure their Twitter connection at
+"Settings -> Connector Settings" and enable the forwarding of their *public*
+messages to Twitter.
+
+__ Alternative Configuration __
+
To activate this addon add @twitter@ to the list of active addons in your
.htconfig.php file
- $a->config['system']['addon'] = "twitter, ..."
+
+$a->config['system']['addon'] = "twitter, ..."
+
Afterwards you need to add your OAuth consumer key / secret pair to it by
adding the following two lines
$a->config['twitter']['consumerkey'] = 'your consumer KEY here';
$a->config['twitter']['consumersecret'] = 'your consumer SECRET here';
-When this is done your user can now configure their Twitter connection at
-"Settings -> Plugin Settings" and enable the forwarding of their *public*
-messages to Twitter.
__ User Configuration __
@@ -75,3 +89,4 @@ on the "Plugin Settings" page displaying two check boxes. One to enable/disable
the forwarding of *all public* postings to Twitter and one to clear the
personal configuration from the Twitter credentials.
+
diff --git a/twitter/twitter.css b/twitter/twitter.css
index 899cfd17..75747979 100755
--- a/twitter/twitter.css
+++ b/twitter/twitter.css
@@ -12,7 +12,7 @@
}
#twitter-disconnect-label {
float: left;
- width: 200px;
+ width: 250px;
margin-bottom: 25px;
}
@@ -21,16 +21,25 @@
}
#twitter-enable-label {
float: left;
- width: 200px;
+ width: 250px;
margin-bottom: 5px;
}
+#twitter-default-label {
+ float: left;
+ width: 250px;
+}
+#twitter-sendtaglinks-label {
+ float: left;
+ width: 250px;
+ margin-bottom: 25px;
+}
#twitter-checkbox {
float: left;
}
#twitter-pin-label {
float: left;
- width: 200px;
+ width: 250px;
margin-bottom: 25px;
}
diff --git a/twitter/twitter.php b/twitter/twitter.php
index 4f4d7280..32b4980f 100755
--- a/twitter/twitter.php
+++ b/twitter/twitter.php
@@ -2,8 +2,8 @@
/**
* Name: Twitter Connector
* Description: Relay public postings to a connected Twitter account
- * Version: 1.0.2
- * Author: Tobias Diekershoff
+ * Version: 1.0.3
+ * Author: Tobias Diekershoff
*/
@@ -93,6 +93,7 @@ function twitter_settings_post ($a,$post) {
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');
} else {
if (isset($_POST['twitter-pin'])) {
// if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
@@ -109,6 +110,7 @@ function twitter_settings_post ($a,$post) {
set_pconfig(local_user(),'twitter', 'oauthtoken', $token['oauth_token']);
set_pconfig(local_user(),'twitter', 'oauthsecret', $token['oauth_token_secret']);
set_pconfig(local_user(),'twitter', 'post', 1);
+ set_pconfig(local_user(),'twitter', 'post_taglinks', 1);
// reload the Addon Settings page, if we don't do it see Bug #42
goaway($a->get_baseurl().'/settings/connectors');
} else {
@@ -116,6 +118,7 @@ function twitter_settings_post ($a,$post) {
// to post a tweet for every new __public__ posting to the wall
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']));
info( t('Twitter settings updated.') . EOL);
}}
}
@@ -136,6 +139,8 @@ function twitter_settings(&$a,&$s) {
$checked = (($enabled) ? ' checked="checked" ' : '');
$defenabled = get_pconfig(local_user(),'twitter','post_by_default');
$defchecked = (($defenabled) ? ' checked="checked" ' : '');
+ $linksenabled = get_pconfig(local_user(),'twitter','post_taglinks');
+ $linkschecked = (($linksenabled) ? ' checked="checked" ' : '');
$s .= '
';
@@ -291,7 +299,12 @@ function twitter_post_hook(&$a,&$b) {
// we can later send to Twitter. 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.
- $tmp = substr($b['body'], 0, 2*$max_char);
+ if (! $b['title']=='') {
+ $tmp = $b['title'] . ' : '. $b['body'];
+ $tmp = substr($tmp, 0, 4*$max_char);
+ } else {
+ $tmp = substr($b['body'], 0, 3*$max_char);
+ }
// if [url=bla][img]blub.png[/img][/url] get blub.png
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
// preserve links to images, videos and audios
@@ -301,12 +314,13 @@ function twitter_post_hook(&$a,&$b) {
$tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp);
$tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp);
$tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp);
+ $linksenabled = get_pconfig($b['uid'],'twitter','post_taglinks');
// if a #tag is linked, don't send the [url] over to SN
- // this is commented out by default as it means backlinks
- // to friendica, if you don't like this feel free to
- // uncomment the following line
-// $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
- // preserve links to webpages
+ // that is, don't send if the option is not set in the
+ // connector settings
+ if ($linksenabled=='0') {
+ $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
+ }
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
$tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp);
// find all http or https links in the body of the entry and
@@ -331,7 +345,13 @@ function twitter_post_hook(&$a,&$b) {
$shortlink = short_link( $b['plink'] );
// the new message will be shortened such that "... $shortlink"
// will fit into the character limit
- $msg = substr($msg, 0, $max_char-strlen($shortlink)-4);
+ $msg = nl2br(substr($msg, 0, $max_char-strlen($shortlink)-4));
+ $msg = str_replace(array(' ',' '),' ',$msg);
+ $e = explode(' ', $msg);
+ // remove the last word from the cut down message to
+ // avoid sending cut words to the MicroBlog
+ array_pop($e);
+ $msg = implode(' ', $e);
$msg .= '... ' . $shortlink;
}
// and now tweet it :-)
diff --git a/viewsrc.tgz b/viewsrc.tgz
index 4717ab05..2ace240a 100644
Binary files a/viewsrc.tgz and b/viewsrc.tgz differ
diff --git a/viewsrc/viewsrc.php b/viewsrc/viewsrc.php
index e39fe8a6..f165e9c5 100644
--- a/viewsrc/viewsrc.php
+++ b/viewsrc/viewsrc.php
@@ -11,16 +11,28 @@
function viewsrc_install() {
register_hook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
+ register_hook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
}
function viewsrc_uninstall() {
unregister_hook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
+ unregister_hook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
+
}
+function viewsrc_page_end(&$a, &$o){
+ $a->page['htmlhead'] .= <<< EOS
+
+EOS;
+}
function viewsrc_item_photo_menu(&$a,&$b) {
- if(! local_user())
+ if((! local_user()) || (local_user() != $b['item']['uid']))
return;
$b['menu'] = array_merge( array( t('View Source') => $a->get_baseurl() . '/viewsrc/'. $b['item']['id']), $b['menu']);
diff --git a/widgets.tgz b/widgets.tgz
index c1d96048..47d5f588 100755
Binary files a/widgets.tgz and b/widgets.tgz differ
diff --git a/widgets/widgets.php b/widgets/widgets.php
index 27cabfd6..47a6e48a 100755
--- a/widgets/widgets.php
+++ b/widgets/widgets.php
@@ -19,7 +19,8 @@ function widgets_uninstall() {
function widgets_settings_post(){
-
+ if(! local_user())
+ return;
if (isset($_POST['widgets-submit'])){
del_pconfig(local_user(), 'widgets', 'key');
diff --git a/wppost.tgz b/wppost.tgz
index 22194335..b07bf6e0 100755
Binary files a/wppost.tgz and b/wppost.tgz differ
diff --git a/wppost/wppost.php b/wppost/wppost.php
index 264a342c..28e4e369 100755
--- a/wppost/wppost.php
+++ b/wppost/wppost.php
@@ -168,6 +168,24 @@ function wppost_send(&$a,&$b) {
if($wp_username && $wp_password && $wp_blog) {
require_once('include/bbcode.php');
+ require_once('include/html2plain.php');
+
+ // If the title is empty then try to guess
+ if ($b['title'] == '') {
+ // Take the description from the bookmark
+ if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches))
+ $b['title'] = $matches[2];
+
+ // If no bookmark is found then take the first line
+ if ($b['title'] == '') {
+ $title = html2plain(bbcode($b['body']), 0, true);
+ $pos = strpos($title, "\n");
+ if (($pos == 0) or ($pos > 60))
+ $pos = 60;
+
+ $b['title'] = substr($title, 0, $pos);
+ }
+ }
$title = '' . (($b['title']) ? $b['title'] : t('Post from Friendica')) . '';
$post = $title . bbcode($b['body']);