From dc8b86ae8158936704f8c4603b8cf7dc635f4ac4 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 17 May 2013 08:12:38 +0200 Subject: [PATCH 01/51] pumpio: Added README Twitter: Changed the behaviour with the maximum length of posts --- pumpio/README | 5 +++++ twitter/twitter.php | 15 ++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 pumpio/README diff --git a/pumpio/README b/pumpio/README new file mode 100644 index 000000000..f658d52ca --- /dev/null +++ b/pumpio/README @@ -0,0 +1,5 @@ +To let the connector work properly you should define an application name in the .htconfig: + +$a->config['pumpio']['application_name'] = "Name of you site"; + +This name appears at pump.io and is mportant for not mirroring back posts that came from friendica. diff --git a/twitter/twitter.php b/twitter/twitter.php index 21dbc0ba2..223f69bd7 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -286,7 +286,7 @@ function twitter_shortenmsg($b) { require_once("include/bbcode.php"); require_once("include/html2plain.php"); - $max_char = 130; + $max_char = 140; // Looking for the first image $image = ''; @@ -389,15 +389,20 @@ function twitter_shortenmsg($b) { if (($msglink == "") and strlen($msg) > $max_char) $msglink = $b["plink"]; - // If the message is short enough then don't modify it. (if the link exists in the original message) - if ((strlen(trim($origmsg)) <= $max_char) AND (strpos($origmsg, $msglink) OR ($msglink == ""))) + // If the message is short enough then don't modify it. + if ((strlen(trim($origmsg)) <= $max_char) AND ($msglink == "")) + return(trim($origmsg)); + + // If the message is short enough and the link exists in the original message don't modify it as well + // -3 because of the bad shortener of twitter + if ((strlen(trim($origmsg)) <= ($max_char - 3)) AND strpos($origmsg, $msglink)) return(trim($origmsg)); if (strlen($msglink) > 20) $msglink = short_link($msglink); - if (strlen(trim($msg." ".$msglink)) > $max_char) { - $msg = substr($msg, 0, $max_char - (strlen($msglink))); + if (strlen(trim($msg." ".$msglink)) > ($max_char - 3)) { + $msg = substr($msg, 0, ($max_char - 3) - (strlen($msglink))); $lastchar = substr($msg, -1); $msg = substr($msg, 0, -1); $pos = strrpos($msg, "\n"); From bd92ac02e15b27b16d1be7a52729a6f4e07bf38f Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 25 May 2013 00:22:08 +0200 Subject: [PATCH 02/51] gpluspost: There is a new option to suppress posts without links. --- gpluspost/gpluspost.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gpluspost/gpluspost.php b/gpluspost/gpluspost.php index db240aa3e..352784959 100644 --- a/gpluspost/gpluspost.php +++ b/gpluspost/gpluspost.php @@ -51,6 +51,9 @@ function gpluspost_settings(&$a,&$s) { $noloop_enabled = get_pconfig(local_user(),'gpluspost','no_loop_prevention'); $noloop_checked = (($noloop_enabled) ? ' checked="checked" ' : ''); + $skip_enabled = get_pconfig(local_user(),'gpluspost','skip_without_link'); + $skip_checked = (($skip_enabled) ? ' checked="checked" ' : ''); + $s .= '
'; $s .= '

' . t('Google+ Post Settings') . '

'; $s .= '
'; @@ -68,6 +71,11 @@ function gpluspost_settings(&$a,&$s) { $s .= ''; $s .= '
'; + $s .= '
'; + /* provide a submit button */ $s .= '
'; @@ -81,6 +89,7 @@ function gpluspost_settings_post(&$a,&$b) { set_pconfig(local_user(),'gpluspost','post',intval($_POST['gpluspost'])); set_pconfig(local_user(),'gpluspost','post_by_default',intval($_POST['gpluspost_bydefault'])); set_pconfig(local_user(),'gpluspost','no_loop_prevention',intval($_POST['gpluspost_noloopprevention'])); + set_pconfig(local_user(),'gpluspost','skip_without_link',intval($_POST['gpluspost_skipwithoutlink'])); } } @@ -286,7 +295,7 @@ function gpluspost_feeditem($pid, $uid) { require_once('include/bbcode.php'); require_once("include/html2plain.php"); - $max_char = 140; + $skipwithoutlink = get_pconfig($uid,'gpluspost','skip_without_link'); $items = q("SELECT `uri`, `plink`, `author-link`, `author-name`, `created`, `edited`, `id`, `title`, `body` from `item` WHERE id=%d", intval($pid)); foreach ($items AS $item) { @@ -349,7 +358,9 @@ function gpluspost_feeditem($pid, $uid) { else if ($image != "") $msglink = $image; - if ($msglink == "") + if (($msglink == "") AND $skipwithoutlink) + continue; + else if ($msglink == "") $msglink = $item["plink"]; // Fetching the title - or the first line From 4db1f50c6141b3ff4c26076c7a5737c6b58fbd45 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 31 May 2013 13:23:18 +0200 Subject: [PATCH 03/51] markdownify the README --- statusnet/README | 102 ------------------------------- statusnet/README.md | 144 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 102 deletions(-) delete mode 100755 statusnet/README create mode 100644 statusnet/README.md diff --git a/statusnet/README b/statusnet/README deleted file mode 100755 index df0412d0e..000000000 --- a/statusnet/README +++ /dev/null @@ -1,102 +0,0 @@ -____ StatusNet Plugin ____ -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 any StatusNet instance (like identi.ca for example). -The messages will be strapped their rich context and shortened to to the character -limit of the StatusNet instance in question if necessary. If shortening of the -message was performed a link will be added to the notice pointing to the -original message on your server. - -There is a similar plugin to forward public messages to Twitter: Twitter Plugin. - -Online version of this document: http://ur1.ca/35mpb - -___ Requirements ___ - -Due to the distributed nature of the StatusNet network, each user who wishes to -forward public messages to a StatusNet account has to get the OAuth credentials -for themselves, which makes this addon a little bit more user unfriendly than -the Twitter Plugin is. Nothing too geeky though! - -The inclusion of a shorturl for the original posting in cases when the message -was longer than the maximal allowed notice length requires it, that you have -PHP5+ and curl on your server. -Where to find - -In the Friendica git repository /addon/statusnet/, this directory contains all -required PHP files (including the Twitter OAuth library [1] by Abraham Williams, -MIT licensed and the Slinky library [2] by Beau Lebens, BSD license), a CSS file -for styling of the user configuration and an image to Sign in with StatusNet. - -[1] https://github.com/abraham/twitteroauth -[2] http://dentedreality.com.au/projects/slinky - -___ Configuration ___ - -__ Global Configuration __ - -If you have configured an admin account, you can configure this plugin from -the admin panel. First activate it from the plugin section of the panel. -Afterwards you will have a separate configuration page for the plugin, where -you can provide a set of globally available OAuth credentials for different -StatusNet pages which will be available for all users of your server. - -If you don't use the admin panel, you can configure the relay using the -.htconfig.php file of your friendica installation. To activate the relay add -it's name to the list of activated addons. - - $a->config['system']['addon'] = "statusnet, ..." - -If you want to provide preconfigured StatusNet instances for your user add the -credentials for them by adding - -$a->config['statusnet']['sites'] = array ( - array ('sitename' => 'identi.ca', 'apiurl' => 'https://identi.ca/api/', - 'consumersecret' => 'OAuth Consumer Secret here', 'consumerkey' => 'OAuth - Consumer Key here'), - array ('sitename' => 'Some other Server', 'apiurl' => - 'http://status.example.com/api/', 'consumersecret' => 'OAuth - Consumer Secret here', 'consumerkey' => 'OAuth Consumer Key here') -); - -to the config file. - -Regardless of providing global OAuth credentials for your users or not, they -can always add their own OAuth-Key and -Secret thus enable the relay for any -StatusNet instance they may have an account at. - -__ User Configuration __ - -When the addon is activated the user has to aquire three things in order to -connect to the StatusNet account of choice. - * the base URL for the StatusNet API, for identi.ca this is - https://identi.ca/api/ - * OAuth Consumer key & secret - -To get the OAuth Consumer key pair the user has to (a) ask her Friendica admin -if a pair already exists or (b) has to register the Friendica server as a -client application on the StatusNet server. This can be done from the account -settings under "Connect -> Connections -> Register an OAuth client application --> Register a new application". - -During the registration of the OAuth client remember the following: - * there is no callback url - * register a desktop client - * with read & write access - * the Source URL should be the URL of your Friendica server - -After the required credentials for the application are stored in the -configuration you have to actually connect your Friendica account with -StatusNet. To do so follow the Sign in with StatusNet button, allow the access -and copy the security code into the plugin configuration. Friendica will then -try to acquire the final OAuth credentials from the API, if successful the -plugin settings will allow you to select to post your public messages to your -StatusNet account. diff --git a/statusnet/README.md b/statusnet/README.md new file mode 100644 index 000000000..a76091ddc --- /dev/null +++ b/statusnet/README.md @@ -0,0 +1,144 @@ +StatusNet Connector +=================== +Main authors Tobias Diekershoff and Michael Vogel. + +With this addon to Friendica you can give your user the possibility to post +their public messages to any StatusNet instance. The messages will be strapped +their rich context and shortened to to the character limit of the StatusNet +instance in question if necessary. If shortening of the message was performed a +link will be added to the notice pointing to the original message on your +server. + +Requirements +------------ + +Due to the distributed nature of the StatusNet network, each user who wishes to +forward public messages to a StatusNet account has to get the OAuth credentials +for themselves, which makes this addon a little bit more user unfriendly than +the Twitter Plugin is. Nothing too geeky though! + +The inclusion of a shorturl for the original posting in cases when the message +was longer than the maximal allowed notice length requires it, that you have +PHP5+ and curl on your server. +Where to find + +In the Friendica git repository /addon/statusnet/, this directory contains all +required PHP files (including the [Twitter OAuth library] [1] by Abraham Williams, +MIT licensed and the [Slinky library] [2] by Beau Lebens, BSD license), a CSS file +for styling of the user configuration and an image to Sign in with StatusNet. + +[1]:https://github.com/abraham/twitteroauth +[2]:http://dentedreality.com.au/projects/slinky + +Configuration +============= + +Global Configuration +-------------------- + +**If you have configured an admin account, you can configure this plugin from +the admin panel.** First activate it from the plugin section of the panel. +Afterwards you will have a separate configuration page for the plugin, where +you can provide a set of globally available OAuth credentials for different +StatusNet pages which will be available for all users of your server. + +If you don't use the admin panel, you can configure the relay using the +.htconfig.php file of your friendica installation. To activate the relay add +it's name to the list of activated addons. + + $a->config['system']['addon'] = "statusnet, ..." + +If you want to provide preconfigured StatusNet instances for your user add the +credentials for them by adding + + $a->config['statusnet']['sites'] = array ( + array ('sitename' => 'identi.ca', 'apiurl' => 'https://identi.ca/api/', + 'consumersecret' => 'OAuth Consumer Secret here', 'consumerkey' => 'OAuth + Consumer Key here'), + array ('sitename' => 'Some other Server', 'apiurl' => + 'http://status.example.com/api/', 'consumersecret' => 'OAuth + Consumer Secret here', 'consumerkey' => 'OAuth Consumer Key here') + ); + +to the config file. + +Regardless of providing global OAuth credentials for your users or not, they +can always add their own OAuth-Key and -Secret thus enable the relay for any +StatusNet instance they may have an account at. + +User Configuration +------------------ + +When the addon is activated the user has to aquire three things in order to +connect to the StatusNet account of choice. + +* the base URL for the StatusNet API, for identi.ca this is https://identi.ca/api/ +* OAuth Consumer key & secret + +To get the OAuth Consumer key pair the user has to (a) ask her Friendica admin +if a pair already exists or (b) has to register the Friendica server as a +client application on the StatusNet server. This can be done from the account +settings under "Connect -> Connections -> Register an OAuth client application +-> Register a new application". + +During the registration of the OAuth client remember the following: + +* there is no callback url +* register a desktop client +* with read & write access +* the Source URL should be the URL of your Friendica server + +After the required credentials for the application are stored in the +configuration you have to actually connect your Friendica account with +StatusNet. To do so follow the Sign in with StatusNet button, allow the access +and copy the security code into the plugin configuration. Friendica will then +try to acquire the final OAuth credentials from the API, if successful the +plugin settings will allow you to select to post your public messages to your +StatusNet account. + +Mirroring of Public Postings +---------------------------- + +To avoid endless loops of public postings that are send to StatusNet and then +mirrored back into your friendica stream you have to set the _name of the +application you registered there_ of your friendica node is using to post to +StatusNet in the .htconfig.php file. + + $a->config['statusnet']['application_name'] = "yourname here"; + +Connector Options for the User +============================== + +* **Allow posting to StatusNet** If you want your _public postings_ being + optionally posted to your associated StatusNet accout as well, you need to + check this box. +* **Send public postings to StatusNet by default** if you want to have _all_ + your public postings beeing send to your StatusNet account you need to check + this button as well. Otherwise you have to enable the relay of your postings + in the ACL dialog (click the lock button) before posting an entry. +* **Mirror all posts from statusnet that are no replies or repeated messages** + _TODO add info about the mirroring_ +* **Shortening method that optimizes the post** by default friendica checks how + many characters your StatusNet instance allows you to use for a posting and + if a posting is longer then this amount of characters it will shorten the + message posted on StatusNet and add a short link back to the original + posting. Optionally you can check this box to have the shortening of the + message use an optimization algorithm. _TODO add infos how this is + optimized_ +* **Send linked #-tags and @-names to StatusNet** if you want your #-tags and + @-mentions linked to the friendica network, check this box. If you want to + have StatusNet handle these things for the relayed end of the posting chain, + uncheck it. +* **Clear OAuth configuration** if you want to remove the currently associated + StatusNet account from your friendica account you have to check this box and + then hit the submit button. The saved settings will be deleted and you have + to reconfigure the StatusNet connector to be able to relay your public + postings to a StatusNet account. + +License +======= + +The _StatusNet Connector_ is licensed unter the [3-clause BSD license][3] see the +LICENSE file in the addons directory. + +[3]: http://opensource.org/licenses/BSD-3-Clause From 2e22106238756aea3e34e71f3664925f8e2604f1 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 31 May 2013 13:27:31 +0200 Subject: [PATCH 04/51] license stuff --- statusnet/statusnet.php | 42 +++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index ca0b17da6..3a5ceb8a1 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -5,24 +5,34 @@ * Version: 1.0.5 * Author: Tobias Diekershoff * Author: Michael Vogel + * + * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * * copyright notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ -/* StatusNet Plugin for Friendica - * - * Author: Tobias Diekershoff - * tobias.diekershoff@gmx.net - * - * License:3-clause BSD license - * - * Configuration: - * To activate the plugin itself add it to the $a->config['system']['addon'] - * setting. After this, your user can configure their Twitter account settings - * from "Settings -> Plugin Settings". - * - * Requirements: PHP5, curl [Slinky library] - * - * Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin - */ /*** * We have to alter the TwitterOAuth class a little bit to work with any StatusNet From 5b1db103c3a18e94427dcbf554b0d02640427f6c Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 31 May 2013 15:51:53 +0200 Subject: [PATCH 05/51] some fixes for the README --- statusnet/README.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/statusnet/README.md b/statusnet/README.md index a76091ddc..3e7540f0e 100644 --- a/statusnet/README.md +++ b/statusnet/README.md @@ -2,7 +2,7 @@ StatusNet Connector =================== Main authors Tobias Diekershoff and Michael Vogel. -With this addon to Friendica you can give your user the possibility to post +With this addon to friendica you can give your user the possibility to post their public messages to any StatusNet instance. The messages will be strapped their rich context and shortened to to the character limit of the StatusNet instance in question if necessary. If shortening of the message was performed a @@ -22,7 +22,7 @@ was longer than the maximal allowed notice length requires it, that you have PHP5+ and curl on your server. Where to find -In the Friendica git repository /addon/statusnet/, this directory contains all +In the friendica addon git repository /statusnet/, this directory contains all required PHP files (including the [Twitter OAuth library] [1] by Abraham Williams, MIT licensed and the [Slinky library] [2] by Beau Lebens, BSD license), a CSS file for styling of the user configuration and an image to Sign in with StatusNet. @@ -69,10 +69,10 @@ StatusNet instance they may have an account at. User Configuration ------------------ -When the addon is activated the user has to aquire three things in order to +When the addon is activated the user has to acquire three things in order to connect to the StatusNet account of choice. -* the base URL for the StatusNet API, for identi.ca this is https://identi.ca/api/ +* the base URL for the StatusNet API, for identi.ca this was https://identi.ca/api/ * OAuth Consumer key & secret To get the OAuth Consumer key pair the user has to (a) ask her Friendica admin @@ -83,13 +83,13 @@ settings under "Connect -> Connections -> Register an OAuth client application During the registration of the OAuth client remember the following: -* there is no callback url +* there is no callback URL * register a desktop client * with read & write access -* the Source URL should be the URL of your Friendica server +* the Source URL should be the URL of your friendica server After the required credentials for the application are stored in the -configuration you have to actually connect your Friendica account with +configuration you have to actually connect your friendica account with StatusNet. To do so follow the Sign in with StatusNet button, allow the access and copy the security code into the plugin configuration. Friendica will then try to acquire the final OAuth credentials from the API, if successful the @@ -113,11 +113,14 @@ Connector Options for the User optionally posted to your associated StatusNet accout as well, you need to check this box. * **Send public postings to StatusNet by default** if you want to have _all_ - your public postings beeing send to your StatusNet account you need to check + your public postings being send to your StatusNet account you need to check this button as well. Otherwise you have to enable the relay of your postings in the ACL dialog (click the lock button) before posting an entry. * **Mirror all posts from statusnet that are no replies or repeated messages** - _TODO add info about the mirroring_ + if you want your postings from StatusNet also appear in your friendica + postings, check this box. Replies to other people postings, repostings and your own + postings that were send from friendica wont be mirrored into your friendica + stream. * **Shortening method that optimizes the post** by default friendica checks how many characters your StatusNet instance allows you to use for a posting and if a posting is longer then this amount of characters it will shorten the @@ -138,7 +141,7 @@ Connector Options for the User License ======= -The _StatusNet Connector_ is licensed unter the [3-clause BSD license][3] see the +The _StatusNet Connector_ is licensed under the [3-clause BSD license][3] see the LICENSE file in the addons directory. [3]: http://opensource.org/licenses/BSD-3-Clause From 08f59f89dff5a043d7dcf4d34e5d0399e93144a6 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 31 May 2013 15:55:37 +0200 Subject: [PATCH 06/51] SN license stuff --- statusnet/LICENSE | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 statusnet/LICENSE diff --git a/statusnet/LICENSE b/statusnet/LICENSE new file mode 100644 index 000000000..062cc8880 --- /dev/null +++ b/statusnet/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 3f259134d8b890213a14ce4107d10ca0625ce100 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 31 May 2013 16:22:04 +0200 Subject: [PATCH 07/51] Typo --- statusnet/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/statusnet/README.md b/statusnet/README.md index 3e7540f0e..99f3a73a4 100644 --- a/statusnet/README.md +++ b/statusnet/README.md @@ -110,7 +110,7 @@ Connector Options for the User ============================== * **Allow posting to StatusNet** If you want your _public postings_ being - optionally posted to your associated StatusNet accout as well, you need to + optionally posted to your associated StatusNet account as well, you need to check this box. * **Send public postings to StatusNet by default** if you want to have _all_ your public postings being send to your StatusNet account you need to check From d18eb959db9e40b1d7405e9f062332137c66a8c5 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 31 May 2013 16:26:10 +0200 Subject: [PATCH 08/51] markdownification of the Twitter README file --- twitter/LICENSE | 24 ++++++++ twitter/README | 92 ------------------------------ twitter/README.md | 140 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 92 deletions(-) create mode 100644 twitter/LICENSE delete mode 100755 twitter/README create mode 100644 twitter/README.md diff --git a/twitter/LICENSE b/twitter/LICENSE new file mode 100644 index 000000000..062cc8880 --- /dev/null +++ b/twitter/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/twitter/README b/twitter/README deleted file mode 100755 index 8041f317b..000000000 --- a/twitter/README +++ /dev/null @@ -1,92 +0,0 @@ -____ Twitter Plugin ____ -By Tobias Diekershoff - http://diekershoff.homeunix.net/friendika/profile/tobias - tobias.diekershoff(at)gmx.net - -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]]. - -Online version of this document: http://ur1.ca/35mml - -___ Requirements ___ - -To use this plugin you have to register an application for your friendica -instance on Twitter with - * read and write access - * don't set a callback URL - * we do not intend to use Twitter for login -The registration can be done at twitter.com/apps and you need a Twitter -account for doing so. - -After you registered the application you get an OAuth consumer key / secret -pair that identifies your app, you will need them for configuration. - -The inclusion of a shorturl for the original posting in cases when the -message was longer than 140 characters requires it, that you have *PHP5+* and -*curl* on your server. - -___ Where to find ___ - -In the Friendica git repository /addon/twitter/, this directory contains -all required PHP files (including the Twitter OAuth library [1] by Abraham -Williams, MIT licensed and the Slinky library [2] by Beau Lebens, BSD license), -a CSS file for styling of the user configuration and an image to _Sign in with -Twitter_. - -[1] https://github.com/abraham/twitteroauth -[2] http://dentedreality.com.au/projects/slinky/ - -___ 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, ..." - -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'; - - -__ User Configuration __ - -When the OAuth consumer informations are correctly placed into the -configuration file and a user visits the "Plugin Settings" page they can now -connect to Twitter. To do so one has to follow the _Sign in with Twitter_ -button (the page will be opened in a new browser window/tab) and get a PIN from -Twitter. This PIN has to be entered on the settings page. After submitting the -PIN the plugin will get OAuth credentials identifying this user from the -Friendica account. - -If this first step was successful the Twitter configuration will be changed -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/README.md b/twitter/README.md new file mode 100644 index 000000000..13f0152f9 --- /dev/null +++ b/twitter/README.md @@ -0,0 +1,140 @@ +Twitter Plugin +============== + +Main authors Tobias Diekershoff and Michael Vogel. + +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). + +Requirements +------------ + +To use this plugin you have to register an application for your friendica +instance on Twitter with +* read and write access +* don't set a callback URL +* we do not intend to use Twitter for login +The registration can be done at twitter.com/apps and you need a Twitter +account for doing so. + +After you registered the application you get an OAuth consumer key / secret +pair that identifies your app, you will need them for configuration. + +The inclusion of a shorturl for the original posting in cases when the +message was longer than 140 characters requires it, that you have *PHP5+* and +*curl* on your server. + +Where to find +------------- + +In the friendica addon git repository /twitter/, this directory contains +all required PHP files (including the [Twitter OAuth library][1] by Abraham +Williams, MIT licensed and the [Slinky library][2] by Beau Lebens, BSD license), +a CSS file for styling of the user configuration and an image to _Sign in with +Twitter_. + +[1]: https://github.com/abraham/twitteroauth +[2]: http://dentedreality.com.au/projects/slinky/ + +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, ..." + +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'; + + +Mirroring of Public Postings +---------------------------- + +To avoid endless loops of public postings that are send to Twitter and then +mirrored back into your friendica stream you have to set the _name of the +application you registered there_ of your friendica node is using to post to +Twitter in the .htconfig.php file. + + $a->config['twitter']['application_name'] = "yourname here"; + +Connector Options for the User +============================== + +When the OAuth consumer informations are correctly placed into the +configuration file and a user visits the "Connector Settings" page they can now +connect to Twitter. To do so one has to follow the _Sign in with Twitter_ +button (the page will be opened in a new browser window/tab) and get a PIN from +Twitter. This PIN has to be entered on the settings page. After submitting the +PIN the plugin will get OAuth credentials identifying this user from the +friendica account. + +After this step was successful the user now has the following config options. + +* **Allow posting to StatusNet** If you want your _public postings_ being + optionally posted to your associated Twitter account as well, you need to + check this box. +* **Send public postings to StatusNet by default** if you want to have _all_ + your public postings being send to your Twitter account you need to check + this button as well. Otherwise you have to enable the relay of your postings + in the ACL dialog (click the lock button) before posting an entry. +* **Mirror all posts from statusnet that are no replies or repeated messages** + if you want your postings from Twitter also appear in your friendica + postings, check this box. Replies to other people postings, repostings and your own + postings that were send from friendica wont be mirrored into your friendica + stream. +* **Shortening method that optimizes the post** by default friendica checks how + many characters your Twitter instance allows you to use for a posting and + if a posting is longer then this amount of characters it will shorten the + message posted on Twitter and add a short link back to the original + posting. Optionally you can check this box to have the shortening of the + message use an optimization algorithm. _TODO add infos how this is + optimized_ +* **Send linked #-tags and @-names to StatusNet** if you want your #-tags and + @-mentions linked to the friendica network, check this box. If you want to + have Twitter handle these things for the relayed end of the posting chain, + uncheck it. +* **Clear OAuth configuration** if you want to remove the currently associated + Twitter account from your friendica account you have to check this box and + then hit the submit button. The saved settings will be deleted and you have + to reconfigure the Twitter connector to be able to relay your public + postings to a Twitter account. + +License +======= + +The _StatusNet Connector_ is licensed under the [3-clause BSD license][3] see the +LICENSE file in the addons directory. + +[3]: http://opensource.org/licenses/BSD-3-Clause + + From 106c2566f21c52e033ef9fe829850ec552755f82 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 31 May 2013 16:26:51 +0200 Subject: [PATCH 09/51] clarification --- twitter/twitter.php | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index 21dbc0ba2..bde494e1f 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -5,9 +5,34 @@ * Version: 1.0.4 * Author: Tobias Diekershoff * Author: Michael Vogel + * + * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * * copyright notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * */ - - + /* Twitter Plugin for Friendica * * Author: Tobias Diekershoff From 3af1c4826daea3acc43669fa4fb26c77139aac3f Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 08:34:05 +0200 Subject: [PATCH 10/51] LICENSE fole --- impressum/LICENSE | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 impressum/LICENSE diff --git a/impressum/LICENSE b/impressum/LICENSE new file mode 100644 index 000000000..6e29fda4f --- /dev/null +++ b/impressum/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011-2013 Tobias Diekershoff +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From ea25e0a6127dcb38f44ba6d57989c8b0466e3f0c Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 08:45:37 +0200 Subject: [PATCH 11/51] markdownification of the README --- impressum/README | 34 ---------------------------------- impressum/README.md | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 34 deletions(-) delete mode 100755 impressum/README create mode 100755 impressum/README.md diff --git a/impressum/README b/impressum/README deleted file mode 100755 index fcf29aaf3..000000000 --- a/impressum/README +++ /dev/null @@ -1,34 +0,0 @@ -Impressum Plugin for Friendica - -Author: Tobias Diekershoff - http://diekershoff.homeunix.net/friendika/profile/tobias - tobias.diekershoff@gmx.net - -License: 3-clause BSD license - -About - This plugin adds an Impressum block to the /friendica page with informations - about the page operator/owner and how to contact you in case of any questions. - - In the notes and postal fields you can use HTML tags for formatting. - -Configuration: - 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/README.md b/impressum/README.md new file mode 100755 index 000000000..cf420ba10 --- /dev/null +++ b/impressum/README.md @@ -0,0 +1,38 @@ +Impressum Plugin for Friendica +============================== + +* Author: Tobias Diekershoff +* License: [3-clause BSD](http://opensource.org/licenses/BSD-3-Clause) license + (see the LICENSE file in the addon directory) + +About +----- +This plugin adds an Impressum (contact) block to the /friendica page with +informations about the page operator/owner and how to contact you in case of +any questions. + +In the notes and postal fields you can use bbcode tags for formatting, like in +normal friendica postings.. + +Configuration +------------- +Simply fill in the fields in the impressium settings page in the plugins +area of your admin panel. For email adresses the "@" symbol will be obfuscated +in the source of the page to make in harder for harvesting tools. + +Manual Configuration +-------------------- +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. From fa0390bdd1921d3bdd9a0512986ed493ee432a83 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 08:53:15 +0200 Subject: [PATCH 12/51] fix the submit button --- mathjax/mathjax.php | 1 + 1 file changed, 1 insertion(+) diff --git a/mathjax/mathjax.php b/mathjax/mathjax.php index e57d69bf5..ccc6ca0c0 100644 --- a/mathjax/mathjax.php +++ b/mathjax/mathjax.php @@ -72,6 +72,7 @@ function mathjax_plugin_admin (&$a, &$o) { } $o = replace_macros( $t, array( + '$submit' => t('Submit'), '$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.')), )); } From 7f1228e193a1745b43c47759688d73641620fc58 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 09:17:25 +0200 Subject: [PATCH 13/51] markdownification of the README --- mathjax/README | 31 ------------------------------- mathjax/README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 31 deletions(-) delete mode 100644 mathjax/README create mode 100644 mathjax/README.md diff --git a/mathjax/README b/mathjax/README deleted file mode 100644 index 023e1c898..000000000 --- a/mathjax/README +++ /dev/null @@ -1,31 +0,0 @@ -Addon for Friendika to include MathJax (LaTeX math syntax) - -This addon lets your users use LaTeX to type mathematical formulas -within their posts. MathJax takes care about the best method for the -browser to display the formula and provides compatibility to 99% -of the modern browsers. - -You can either use the MathJax CDN online, thus loading the required javascript -libraries from the MathJax cloud, or use a local installation of MathJax. -Please see the plugin settings in the admin panel for configuration possibles. -If you don't set up a local MathJax instance, leave the configuration untouched -it will fall back to the MathJax cloud as default value. - -If you don't use the admin panel add mathjax to the list of active addons - -$a->config['system']['addon'] = [..., mathjax, ...] - -To select the source of the included javascript libraries add a line - -$a->config['mathjax']['baseurl'] = 'the URL to your MathJax installation'; - -to your .htconfig.php file. If this line is not there, the addon assumes that -you want to use the MathJax cloud (CDN). - -Please note that your usage of the CDN is governed by the "MathJax CDN Terms of -Service" see http://www.mathjax.org/download/mathjax-cdn-terms-of-service/ - -Author: Tobias Diekershoff - http://diekershoff.homeunix.net/friendika/profile/tobias - email: tobias.diekershoff@gmx.net - diff --git a/mathjax/README.md b/mathjax/README.md new file mode 100644 index 000000000..9647a986d --- /dev/null +++ b/mathjax/README.md @@ -0,0 +1,43 @@ +MathJax Addon +============= + +* Author: Tobias Diekershoff +* License: [3-clause BSD](http://opensource.org/licenses/BSD-3-Clause) license + (see the LICENSE file in the addon directory) + +About +----- + +This addon for friendica includes the [MathJax][1] CDN to enable rendering of +[LaTeX][2] formulae in your friendica postings. + +Configuration +------------- +All you need to do is provide friendica with the base URL of MathJax. This can +be either the URL of the CDN of MathJax or your own installation. + +In case you want to use the CDN you can try the following URL as a quick start + + http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML + +In case you don't want or can use the admin panel of firneidca you can activate +the addon by adding _mathjax_ to the + + $a->config['system']['addon'] + +list in your .htconfig.php file and then providing the base URL after that + + $a->config['mathjax']['baseurl'] = 'the URL to your MathJax installation'; + +Usage +===== + +Once the addon is configured you can use LaTeX syntax in your postings to share +formulae with your contacts. But remember that the formulae are rendered in the +browser of the user thus your contacts need to activate this addon as well. If +they don't they will only see the LaTeX syntax in your texts. + +Just enclose your equations in $$...$$ pairs like e.g. $$f_c(x)=ax+b$$. + +[1]: http://www.mathjax.org/ +[2]: https://en.wikipedia.org/wiki/LaTeX From 207ac94509c684e525904baec1038367e5cc4c14 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 09:17:58 +0200 Subject: [PATCH 14/51] license file --- mathjax/LICENSE | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 mathjax/LICENSE diff --git a/mathjax/LICENSE b/mathjax/LICENSE new file mode 100644 index 000000000..6e29fda4f --- /dev/null +++ b/mathjax/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011-2013 Tobias Diekershoff +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 273a53149af56e5ef6794206cacbcd1a240492df Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 11:25:38 +0200 Subject: [PATCH 15/51] markdownification of the WebRTC README --- webrtc/{README => README.md} | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) rename webrtc/{README => README.md} (80%) diff --git a/webrtc/README b/webrtc/README.md similarity index 80% rename from webrtc/README rename to webrtc/README.md index 75797f180..d29500a67 100644 --- a/webrtc/README +++ b/webrtc/README.md @@ -1,7 +1,7 @@ -Webrtc Plugin -==================== +WebRTC Plugin +============= -This is a quick and dirty addon to add a webrtc website as an app. As webrtc +This is a quick and dirty addon to add a [webrtc][1] website as an app. As webrtc advances so rapidly there is s a chance this plugin will be obsolete. Webrtc is a new video and audio conferencing tool that is browser to browser communication, no need to download specific software for just conferencing. @@ -12,7 +12,7 @@ between the participants. If you would like to try this plugin please download one of the following either Chrome/Chromium 25 or higher or Firefox 21 or higher. Then test it by -visiting a known webrtc instance (i.e. https://live.mayfirst.org) create a +visiting a known webrtc instance (i.e. [live.mayfirst.org](https://live.mayfirst.org)) create a room, you should be asked to share your camera and microphone (firefox will let you choose one or the other, whereas chrome/chromium asks for both in one question). @@ -20,3 +20,5 @@ question). If the test is successful then proceed with copying the webrtc instance you would like to use and place it in the config window and save. Now when you opent he app it will load the webrtc instance for you to use. + +[1]: https://en.wikipedia.org/wiki/WebRTC From 0d9a7de631c711ff327aaa20faa527303f672db5 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 17:19:02 +0200 Subject: [PATCH 16/51] markdownification of the README --- blackout/{README => README.md} | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) rename blackout/{README => README.md} (85%) diff --git a/blackout/README b/blackout/README.md similarity index 85% rename from blackout/README rename to blackout/README.md index 0580d5272..1974ef7b0 100644 --- a/blackout/README +++ b/blackout/README.md @@ -1,11 +1,12 @@ -Name: blackout -Description: Blackout your ~friendica node during a given period -License: MIT -Version: 1.0 -Author: Tobias Diekershoff +blackout addon +============== +* Description: Blackout your ~friendica node during a given period +* License: [MIT](http://opensource.org/licenses/MIT) +* Version: 1.0 +* Author: Tobias Diekershoff About -===== +----- This plugin will allow you to enter a date/time period during which all your ~friendica visitors from the web will be redirected to a page @@ -21,12 +22,12 @@ the entered time periode and fix typos without having to hack the database directly. Requirements -============ +------------- -THIS ADDON REQUIRES PHP VERSION 5.3 OR HIGHER. +**THIS ADDON REQUIRES PHP VERSION 5.3 OR HIGHER.** License -======= +------- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 1c8b38179b1607893970ccc8fa2cbb3414b754fa Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 17:22:00 +0200 Subject: [PATCH 17/51] added LICENSE file to blackout --- blackout/LICENSE | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 blackout/LICENSE diff --git a/blackout/LICENSE b/blackout/LICENSE new file mode 100644 index 000000000..8a66fbdf9 --- /dev/null +++ b/blackout/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Tobias Diekershoff + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From 62949af91e2423e0494613917f1710dc7300c927 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 17:30:44 +0200 Subject: [PATCH 18/51] mardownification of the README --- piwik/{README => README.md} | 38 ++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) rename piwik/{README => README.md} (63%) diff --git a/piwik/README b/piwik/README.md similarity index 63% rename from piwik/README rename to piwik/README.md index c648a4d12..1005970be 100755 --- a/piwik/README +++ b/piwik/README.md @@ -1,24 +1,24 @@ -## Piwik Plugin ## +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 tool Piwik into the Friendica pages. -[Online version of this Document](http://ur1.ca/35m2x) - -### Requirements ### +Requirements +------------ To use this plugin you need a [piwik](http://piwik.org/) installation. -### Where to find ### +Where to find +------------- -In the Friendica git repository `/addon/piwik/piwik.php` and a CSS file for +In the Friendica addon git repository `/piwik/piwik.php` and a CSS file for styling the opt-out notice. -### Configuration ### +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 @@ -38,20 +38,24 @@ You have to add 4 more configuration variables for the addon: $a->config['piwik']['optout'] = true; $a->config['piwik']['async'] = false; -The *baseurl* points to your Piwik installation. Use the absolute path, +Configuration fields +--------------------- + +* The *baseurl* points to your Piwik installation. Use the absolute path, remember trailing slashes but ignore the protocol (http/s) part of the URL. -Change the *sideid* parameter to whatever ID you want to use for tracking your -Friendica installation. The *optout* parameter (true|false) defines whether or +* Change the *sideid* parameter to whatever ID you want to use for tracking your +Friendica installation. +* The *optout* parameter (true|false) defines whether or not a short notice about the utilization of Piwik will be displayed on every page of your Friendica site (at the bottom of the page with some spacing to the other content). Part of the note is a link that allows the visitor to set an _opt-out_ cookie which will prevent visits from that user be tracked by piwik. +* The *async* parameter (true|false) defines whether or not to use asynchronous +tracking so pages load (or appear to load) faster. Currently the optional notice states the following: - This website is tracked using the Piwik analytics tool. If you do not want - that your visits are logged this way you can set a cookie to prevent Piwik - from tracking further visits of the site (opt-out). +> This website is tracked using the Piwik analytics tool. If you do not want +> that your visits are logged this way you can set a cookie to prevent Piwik +> from tracking further visits of the site (opt-out). -The *async* parameter (true|false) defines whether or not to use asynchronous -tracking so pages load (or appear to load) faster. From 693ae2fe44b5d3e69e86dca95121328b88d173c7 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 1 Jun 2013 17:35:06 +0200 Subject: [PATCH 19/51] added LICENSE file --- piwik/LICENSE | 24 ++++++++++++++++++++++++ piwik/README.md | 9 ++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 piwik/LICENSE diff --git a/piwik/LICENSE b/piwik/LICENSE new file mode 100644 index 000000000..5e7528775 --- /dev/null +++ b/piwik/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011-2013 Tobias Diekershoff, Klaus Weidenbach +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/piwik/README.md b/piwik/README.md index 1005970be..0ac2ff72b 100755 --- a/piwik/README.md +++ b/piwik/README.md @@ -1,7 +1,7 @@ Piwik Plugin ============ -by Tobias Diekershoff +by Tobias Diekershoff and Klaus Weidenbach This addon allows you to embed the code necessary for the FLOSS webanalytics tool Piwik into the Friendica pages. @@ -59,3 +59,10 @@ Currently the optional notice states the following: > that your visits are logged this way you can set a cookie to prevent Piwik > from tracking further visits of the site (opt-out). +License +======= + +The _Piwik addon_ is licensed under the [3-clause BSD license][3] see the +LICENSE file in the addons directory. + +[3]: http://opensource.org/licenses/BSD-3-Clause From ff8146c51e91c07e31070ad3311a3f8de34c576f Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 8 Jun 2013 12:29:16 +0200 Subject: [PATCH 20/51] fromgplus: double descriptions are now suppressed. --- fromgplus/fromgplus.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fromgplus/fromgplus.php b/fromgplus/fromgplus.php index 05cc8ec23..5d0e86c3d 100644 --- a/fromgplus/fromgplus.php +++ b/fromgplus/fromgplus.php @@ -212,7 +212,7 @@ function fromgplus_cleanupgoogleproxy($fullImage, $image) { return($cleaned); } -function fromgplus_handleattachments($item) { +function fromgplus_handleattachments($item, $displaytext) { $post = ""; $quote = ""; @@ -251,7 +251,7 @@ function fromgplus_handleattachments($item) { elseif ($images["full"] != "") $post .= "\n[img]".$images["full"]."[/img]\n"; - if ($attachment->displayName != "") + if (($attachment->displayName != "") AND ($attachment->displayName != $displaytext)) $post .= fromgplus_html2bbcode($attachment->displayName)."\n"; break; @@ -319,7 +319,7 @@ function fromgplus_fetch($a, $uid) { $post = fromgplus_html2bbcode($item->object->content); if (is_array($item->object->attachments)) - $post .= fromgplus_handleattachments($item); + $post .= fromgplus_handleattachments($item, $item->object->content); // geocode, placeName if (isset($item->address)) @@ -346,7 +346,7 @@ function fromgplus_fetch($a, $uid) { $post .= fromgplus_html2bbcode($item->object->content); if (is_array($item->object->attachments)) - $post .= "\n".trim(fromgplus_handleattachments($item)); + $post .= "\n".trim(fromgplus_handleattachments($item, $item->object->content)); $post .= "[/share]"; } else { @@ -355,7 +355,7 @@ function fromgplus_fetch($a, $uid) { $post .= fromgplus_html2bbcode($item->object->content); if (is_array($item->object->attachments)) - $post .= "\n".trim(fromgplus_handleattachments($item)); + $post .= "\n".trim(fromgplus_handleattachments($item, $item->object->content)); } if (isset($item->address)) From 31b7480effa86109af46b9a4e25b0cc637511621 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 11 Jun 2013 07:53:54 +0200 Subject: [PATCH 21/51] gpluspost: "Hootsuite" instead of "Seesmic" --- gpluspost/gpluspost.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpluspost/gpluspost.php b/gpluspost/gpluspost.php index 352784959..dae59efe9 100644 --- a/gpluspost/gpluspost.php +++ b/gpluspost/gpluspost.php @@ -2,7 +2,7 @@ /** * Name: G+ Post - * Description: Posts to a Google+ page with the help of Seesmic + * Description: Posts to a Google+ page with the help of Hootsuite * Version: 0.1 * Author: Michael Vogel */ From 1b250fad733200f28752d1b0bf9c148d95686af1 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 14 Jun 2013 19:40:10 +0200 Subject: [PATCH 22/51] moved my profile --- blackout/blackout.php | 2 +- impressum/impressum.php | 2 +- mathjax/mathjax.php | 2 +- piwik/piwik.php | 4 +--- statusnet/statusnet.php | 2 +- twitter/twitter.php | 4 +--- webrtc/webrtc.php | 4 ++-- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/blackout/blackout.php b/blackout/blackout.php index 834956114..e629b7a38 100644 --- a/blackout/blackout.php +++ b/blackout/blackout.php @@ -4,7 +4,7 @@ * Description: Blackout your ~friendica node during a given period, requires PHP >= 5.3 * License: MIT * Version: 1.0 - * Author: Tobias Diekershoff + * Author: Tobias Diekershoff * * About * ===== diff --git a/impressum/impressum.php b/impressum/impressum.php index 3c1106c9a..8bcc8b7dd 100755 --- a/impressum/impressum.php +++ b/impressum/impressum.php @@ -3,7 +3,7 @@ * Name: Impressum * Description: Plugin to add contact information to the about page (/friendica) * Version: 1.2 - * Author: Tobias Diekershoff + * Author: Tobias Diekershoff * License: 3-clause BSD license */ diff --git a/mathjax/mathjax.php b/mathjax/mathjax.php index ccc6ca0c0..d97e96496 100644 --- a/mathjax/mathjax.php +++ b/mathjax/mathjax.php @@ -4,7 +4,7 @@ * Name: MathJax * Description: Addon for Friendika to include MathJax (LaTeX math syntax) * Version: 1.0 - * Author: Tobias Diekershoff + * Author: Tobias Diekershoff * License: 3-clause BSD license */ diff --git a/piwik/piwik.php b/piwik/piwik.php index 3501b2c8c..a2086bdcb 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 */ @@ -26,8 +26,6 @@ * installation has. Alter the baseurl to fit your needs, don't care * about http/https but beware to put the trailing / at the end of your * setting. - * - * Documentation see http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Piwik_Plugin */ function piwik_install() { diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 3a5ceb8a1..eeca3d607 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -3,7 +3,7 @@ * Name: StatusNet Connector * Description: Relay public postings to a connected StatusNet account * Version: 1.0.5 - * Author: Tobias Diekershoff + * Author: Tobias Diekershoff * Author: Michael Vogel * * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel diff --git a/twitter/twitter.php b/twitter/twitter.php index bde494e1f..8b4dec996 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -3,7 +3,7 @@ * Name: Twitter Connector * Description: Relay public postings to a connected Twitter account * Version: 1.0.4 - * Author: Tobias Diekershoff + * Author: Tobias Diekershoff * Author: Michael Vogel * * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel @@ -58,8 +58,6 @@ * from "Settings -> Plugin Settings". * * Requirements: PHP5, curl [Slinky library] - * - * Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin */ define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes diff --git a/webrtc/webrtc.php b/webrtc/webrtc.php index 7a4e8cf77..e0d333930 100644 --- a/webrtc/webrtc.php +++ b/webrtc/webrtc.php @@ -3,8 +3,8 @@ * Name: WebRTC Application * Description: add a webrtc instance for video/audio * Version: 1.0 - * Author: stephen mahood - * Author: Tobias Diekershoff + * Author: Stephen Mahood + * Author: Tobias Diekershoff */ function webrtc_install() { From bd0468303ba27f524f8d7900d888e9aa5a057b58 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 14 Jun 2013 20:08:10 +0200 Subject: [PATCH 23/51] SN: add the hint about the / to the admin panel config screen --- statusnet/statusnet.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index eeca3d607..154e14659 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -758,7 +758,7 @@ function statusnet_plugin_admin(&$a, &$o){ foreach($sites as $id=>$s){ $sitesform[] = Array( 'sitename' => Array("sitename[$id]", "Site name", $s['sitename'], ""), - 'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], ""), + 'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], t("Base API Path \x28remember the trailing /\x29") ), 'secret' => Array("secret[$id]", "Secret", $s['consumersecret'], ""), 'key' => Array("key[$id]", "Key", $s['consumerkey'], ""), 'applicationname' => Array("applicationname[$id]", "Application name", $s['applicationname'], ""), @@ -770,7 +770,7 @@ function statusnet_plugin_admin(&$a, &$o){ $id++; $sitesform[] = Array( 'sitename' => Array("sitename[$id]", t("Site name"), "", ""), - 'apiurl' => Array("apiurl[$id]", t("API URL"), "", ""), + 'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], t("Base API Path \x28remember the trailing /\x29") ), 'secret' => Array("secret[$id]", t("Consumer Secret"), "", ""), 'key' => Array("key[$id]", t("Consumer Key"), "", ""), 'applicationname' => Array("applicationname[$id]", t("Application name"), "", ""), From aa0db37feae29aa265dbcf1c9446760e85b4ffc1 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 08:48:31 +0200 Subject: [PATCH 24/51] c&p typo and checking for a trailing / in admin panel --- statusnet/statusnet.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 154e14659..b3450d956 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -727,6 +727,8 @@ function statusnet_plugin_admin_post(&$a){ foreach($_POST['sitename'] as $id=>$sitename){ $sitename=trim($sitename); $apiurl=trim($_POST['apiurl'][$id]); + if (! (substr($apiurl, -1)=='/')) + $apiurl=$apiurl.'/'; $secret=trim($_POST['secret'][$id]); $key=trim($_POST['key'][$id]); $applicationname = ((x($_POST, 'applicationname')) ? notags(trim($_POST['applicationname'][$id])):''); @@ -770,7 +772,7 @@ function statusnet_plugin_admin(&$a, &$o){ $id++; $sitesform[] = Array( 'sitename' => Array("sitename[$id]", t("Site name"), "", ""), - 'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], t("Base API Path \x28remember the trailing /\x29") ), + 'apiurl' => Array("apiurl[$id]", "Api url", "", t("Base API Path \x28remember the trailing /\x29") ), 'secret' => Array("secret[$id]", t("Consumer Secret"), "", ""), 'key' => Array("key[$id]", t("Consumer Key"), "", ""), 'applicationname' => Array("applicationname[$id]", t("Application name"), "", ""), From 73aabf82b2b31840da42d5a3897193c4101e1542 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 08:52:14 +0200 Subject: [PATCH 25/51] updatet the SN tarball --- statusnet.tgz | Bin 34767 -> 37029 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/statusnet.tgz b/statusnet.tgz index e92174ac8b09b54d250a04f5fb5c46ff19d2c334..dce1dd52786aee8763f2a07b5e543046167270c3 100755 GIT binary patch literal 37029 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�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 From 11199550575a9904d97ba7e90f23688f724a0864 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 10:51:27 +0200 Subject: [PATCH 26/51] cal: basic addon layout --- cal/cal.php | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 cal/cal.php diff --git a/cal/cal.php b/cal/cal.php new file mode 100644 index 000000000..302549bb6 --- /dev/null +++ b/cal/cal.php @@ -0,0 +1,40 @@ + + * License: MIT + * ******************************************************************/ + + +function cal_install() +{ +} +function cal_uninstall() +{ +} +function cal_module() +{ +} +/* pathes + * /cal/$user/export/$format + */ +function cal_content() +{ + $a = get_app(); + $o = ""; + if ($a->argc == 1) { + $o = "

".t('Some text to explain what this does.')."

"; + } elseif ($a->argc==4) { + $username = $a->argv[1]; + $do = $a->argv[2]; + $format = $a->argv[3]; + $o = "

".$do." calendar for ".$username." as ".$format." file.

"; + } else { + $o = "

".t('Wrong number of parameters')."

"; + } + return $o; +} + +?> From a79bd7c9f43652a565ca539a80cc41fa4d852637 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 10:54:42 +0200 Subject: [PATCH 27/51] added MIT License file --- cal/LICENSE | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 cal/LICENSE diff --git a/cal/LICENSE b/cal/LICENSE new file mode 100644 index 000000000..b25517961 --- /dev/null +++ b/cal/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013 Tobias Diekershoff + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From 6ddd3100a76aaa36c8dc6baea3d429205d6db9b2 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 11:03:30 +0200 Subject: [PATCH 28/51] cal: basic README added --- cal/LICENSE | 2 +- cal/README.md | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 cal/README.md diff --git a/cal/LICENSE b/cal/LICENSE index b25517961..2c696e9a1 100644 --- a/cal/LICENSE +++ b/cal/LICENSE @@ -5,7 +5,7 @@ of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. diff --git a/cal/README.md b/cal/README.md new file mode 100644 index 000000000..ded1b330a --- /dev/null +++ b/cal/README.md @@ -0,0 +1,27 @@ +Calendar Export +=============== + +This addon makes it possible to export the events posted by your users being +exported to other formats, so they can be imported into other calendar +applications. + +Exporting a calendar is an _opt-in_ feature which has to be activated by each +of the users in the _addon settings_. As the admin you can only provide the +service but should not force it upon your users. + +The calendars are exported at + + http://example.com/cal/username/format + +currently the only supported format is __ical__. + +Author +------ + +This addon is developed by [Tobias Diekershoff](https://f.diekershoff.de/profile/tobias). + +License +------- + +This addon is licensed under the [MIT](http://opensource.org/licenses/MIT) +license, see also the LICENSE file in the addon directory. From c9880c23724fbf010446326647d255962cbe3b14 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 11:51:19 +0200 Subject: [PATCH 29/51] cal: added settings functions --- cal/cal.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cal/cal.php b/cal/cal.php index 302549bb6..f38239681 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -10,9 +10,13 @@ function cal_install() { + register_hook('plugin_settings', 'addon/cal/cal.php', 'cal_addon_settings'); + register_hook('plugin_settings_post', 'addon/cal/cal.php', 'cal_addon_settings_post'); } function cal_uninstall() { + unregister_hook('plugin_settings', 'addon/cal/cal.php', 'cal_addon_settings'); + unregister_hook('plugin_settings_post', 'addon/cal/cal.php', 'cal_addon_settings_post'); } function cal_module() { @@ -37,4 +41,15 @@ function cal_content() return $o; } +function cal_addon_settings_post ( &$a, &$b ) +{ + if (! local_user()) + return; +} +function cal_addon_settings ( &$a, &$s ) +{ + if (! local_user()) + return; +} + ?> From 70432578967279c40df82d459117205805dcfae9 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 12:14:33 +0200 Subject: [PATCH 30/51] cal: added user config --- cal/cal.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cal/cal.php b/cal/cal.php index f38239681..adef464be 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -45,11 +45,30 @@ function cal_addon_settings_post ( &$a, &$b ) { if (! local_user()) return; + + if (!x($_POST,'cal-submit')) + return; + + set_pconfig(local_user(),'cal','enable',intval($_POST['cal-enable'])); } function cal_addon_settings ( &$a, &$s ) { if (! local_user()) return; + + $enabled = get_pconfig(local_user(), 'cal', 'enable'); + $checked = (($enabled) ? ' checked="checked" ' : ''); + $url = $a->get_baseurl().'/cal/'.$a->user['nickname'].'/export/ical'; + + $s .= '

'.t('Export Events').'

'; + $s .= '

'.t('If this is enabled, you public events will be available at').' '.$url.'

'; + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + $s .= '
'; + $s .= '
'; + } ?> From 2a368fa6ac2fa19e51e39c97a99378354f2c2627 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 15 Jun 2013 21:34:56 +0200 Subject: [PATCH 31/51] cal: export to ical --- cal/cal.php | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 4 deletions(-) diff --git a/cal/cal.php b/cal/cal.php index adef464be..6e8829de5 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -22,25 +22,116 @@ function cal_module() { } /* pathes - * /cal/$user/export/$format + * /cal/$user/export/$ + * currently supported format is ical (iCalendar */ function cal_content() { $a = get_app(); $o = ""; if ($a->argc == 1) { - $o = "

".t('Some text to explain what this does.')."

"; + $o .= "

".t('Event Export')."

".t('You can download public events from: ').$a->get_baseurl()."/cal/username/export/ical

"; } elseif ($a->argc==4) { + // get the parameters from the request we just received $username = $a->argv[1]; $do = $a->argv[2]; $format = $a->argv[3]; - $o = "

".$do." calendar for ".$username." as ".$format." file.

"; + // check that there is a user matching the requested profile + $r = q("SELECT uid FROM user WHERE nickname='".$username."' LIMIT 1;"); + if (count($r)) + { + $uid = $r[0]['uid']; + } else { + killme(); + } + // if we shall do anything other then export, end here + if (! $do == 'export' ) + killme(); + // check if the user allows us to share the profile + $enable = get_pconfig( $uid, 'cal', 'enable'); + if (! $enable == 1) { + info(t('The user does not export the calendar.')); + return; + } + // we are allowed to show events + // get the timezone the user is in + $r = q("SELECT timezone FROM user WHERE uid=".$uid." LIMIT 1;"); + if (count($r)) + $timezone = $r[0]['timezone']; + // does the user who requests happen to be the owner of the events + // requested? then show all of your events, otherwise only those that + // don't have limitations set in allow_cid and allow_gid + if (local_user() == $uid) { + $r = q("SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location` FROM `event` WHERE `uid`=".$uid.";"); + } else { + $r = q("SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location` FROM `event` WHERE `allow_cid`='' and `allow_gid`='' and `uid`='".$uid."';"); + } + // we have the events that are available for the requestor + // now format the output according to the requested format + $res = cal_format_output($r, $format, $timezone); + if (! $res=='') + info($res); } else { - $o = "

".t('Wrong number of parameters')."

"; + // wrong number of parameters + killme(); } return $o; } +function cal_format_output ($r, $f, $tz) +{ + $res = t('This calendar format is not supported');; + switch ($f) + { + case "ical": + header("Content-type: text/icon"); + $res = ''; + $o = 'BEGIN:VCALENDAR'. PHP_EOL + . 'PRODID:-//friendica calendar export//0.1//EN' . PHP_EOL + . 'VERSION:2.0' . PHP_EOL; +// TODO include timezone informations in cases were the time is not in UTC +// . 'BEGIN:VTIMEZONE' . PHP_EOL +// . 'TZID:' . $tz . PHP_EOL +// . 'END:VTIMEZONE' . PHP_EOL; + foreach ($r as $rr) { + if ($rr['adjust'] == 1) { + $UTC = 'Z'; + } else { + $UTC = ''; + } + $o .= 'BEGIN:VEVENT' . PHP_EOL; + if ($rr[start]) { + $tmp = strtotime($rr['start']); + $dtformat = "%Y%m%dT%H%M%S".$UTC; + $o .= 'DTSTART:'.strftime($dtformat, $tmp).PHP_EOL; + } + if ($rr['finish']) { + $tmp = strtotime($rr['finish']); + $dtformat = "%Y%m%dT%H%M%S".$UTC; + $o .= 'DTEND:'.strftime($dtformat, $tmp).PHP_EOL; + } + if ($rr['summary']) + $tmp = $rr['summary']; + $tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp); + $o .= 'SUMMARY:' . $tmp . PHP_EOL; + if ($rr['desc']) + $tmp = $rr['desc']; + $tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp); + $o .= 'DESCRIPTION:' . $tmp . PHP_EOL; + if ($rr['location']) { + $tmp = $rr['location']; + $tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp); + $o .= 'LOCATION:' . $tmp . PHP_EOL; + } + $o .= 'END:VEVENT' . PHP_EOL; + } + $o .= 'END:VCALENDAR' . PHP_EOL; + echo $o; + killme(); + } + return $res; +} + function cal_addon_settings_post ( &$a, &$b ) { if (! local_user()) From 35568f0cf76d098363920542980451607d27551a Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 08:45:55 +0200 Subject: [PATCH 32/51] cal: added CSV export --- cal/cal.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/cal/cal.php b/cal/cal.php index 6e8829de5..fb5ae482c 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -83,8 +83,26 @@ function cal_format_output ($r, $f, $tz) $res = t('This calendar format is not supported');; switch ($f) { + // format the exported data as a CSV file + case "csv": + header("Content-type: text/csv"); + $o = '"Subject", "Start Date", "Start Time", "Description", "End Date", "End Time", "Location"' . PHP_EOL; + foreach ($r as $rr) { + $tmp1 = strtotime($rr['start']); + $tmp2 = strtotime($rr['finish']); + $time_format = "%H:%M:%S"; + $date_format = "%d.%m.%Y"; + $o .= '"'.$rr['summary'].'", "'.strftime($date_format, $tmp1) . + '", "'.strftime($time_format, $tmp1).'", "'.$rr['desc'] . + '", "'.strftime($date_format, $tmp2) . + '", "'.strftime($time_format, $tmp2) . + '", "'.$rr['location'].'"' . PHP_EOL; + } + echo $o; + killme(); + case "ical": - header("Content-type: text/icon"); + header("Content-type: text/ics"); $res = ''; $o = 'BEGIN:VCALENDAR'. PHP_EOL . 'PRODID:-//friendica calendar export//0.1//EN' . PHP_EOL From 9c541ae7697ffe1659d44179980f1dde0b91ede5 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 08:49:10 +0200 Subject: [PATCH 33/51] cal: user settings info about supported formats --- cal/cal.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cal/cal.php b/cal/cal.php index fb5ae482c..461cb0208 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -167,10 +167,11 @@ function cal_addon_settings ( &$a, &$s ) $enabled = get_pconfig(local_user(), 'cal', 'enable'); $checked = (($enabled) ? ' checked="checked" ' : ''); - $url = $a->get_baseurl().'/cal/'.$a->user['nickname'].'/export/ical'; + $url = $a->get_baseurl().'/cal/'.$a->user['nickname'].'/export/format'; $s .= '

'.t('Export Events').'

'; $s .= '

'.t('If this is enabled, you public events will be available at').' '.$url.'

'; + $s .= '

'.t('Currently supported formats are ical and csv.').'

'; $s .= '
'; $s .= ''; $s .= ''; From f5e09c787d7bb02070ea9a7350502c259061ed8b Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 08:51:11 +0200 Subject: [PATCH 34/51] cal: added csv support to the README --- cal/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cal/README.md b/cal/README.md index ded1b330a..c19f07cee 100644 --- a/cal/README.md +++ b/cal/README.md @@ -13,7 +13,10 @@ The calendars are exported at http://example.com/cal/username/format -currently the only supported format is __ical__. +currently the following formats are supported + +* ical +* csv. Author ------ From d5b79c8194273804466b5beaa80ac251cf1e2f56 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 08:54:04 +0200 Subject: [PATCH 35/51] cal: added tarball --- cal.tgz | Bin 0 -> 3395 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 cal.tgz diff --git a/cal.tgz b/cal.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7a9bedd9dd4e17d4e92793c453d868a226233f60 GIT binary patch literal 3395 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 Z6;x0`1r=0KK?Q#U_&1{$0$Tu3006Suoe2N{ literal 0 HcmV?d00001 From 18e8f8d8fbf40d3d55ecfcb2e8d0506488fe023a Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 09:34:44 +0200 Subject: [PATCH 36/51] cal: missing export in README --- cal.tgz | Bin 3395 -> 3394 bytes cal/README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cal.tgz b/cal.tgz index 7a9bedd9dd4e17d4e92793c453d868a226233f60..c52061d58b1cb4415a9cbb6799694cd584aa4e6c 100644 GIT binary patch literal 3394 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 Ygc3?9p@b4j_)ms^02G;P`T$S>03A<{fdBvi literal 3395 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 Z6;x0`1r=0KK?Q#U_&1{$0$Tu3006Suoe2N{ diff --git a/cal/README.md b/cal/README.md index c19f07cee..f21856509 100644 --- a/cal/README.md +++ b/cal/README.md @@ -11,7 +11,7 @@ service but should not force it upon your users. The calendars are exported at - http://example.com/cal/username/format + http://example.com/cal/username/export/format currently the following formats are supported From 69065bfd109b427104fcdf18919635681b27241d Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 12:15:38 +0200 Subject: [PATCH 37/51] cal: added TODO note to CSV export --- cal/cal.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cal/cal.php b/cal/cal.php index 461cb0208..597e53231 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -88,6 +88,8 @@ function cal_format_output ($r, $f, $tz) header("Content-type: text/csv"); $o = '"Subject", "Start Date", "Start Time", "Description", "End Date", "End Time", "Location"' . PHP_EOL; foreach ($r as $rr) { +// TODO the time / date entries don't include any information about the +// timezone the event is scheduled in :-/ $tmp1 = strtotime($rr['start']); $tmp2 = strtotime($rr['finish']); $time_format = "%H:%M:%S"; From d399dde3ba4cc27a68f90c896ccbcd4582a9301e Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 13:20:39 +0200 Subject: [PATCH 38/51] cal: cleanup the README --- cal.tgz | Bin 3394 -> 3439 bytes cal/README.md | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cal.tgz b/cal.tgz index c52061d58b1cb4415a9cbb6799694cd584aa4e6c..cb075e2218572475d22f126ad79dba4df15164c6 100644 GIT binary patch delta 3437 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 PFAV`Qv{TlIt(tr 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 Date: Sun, 16 Jun 2013 15:24:32 +0200 Subject: [PATCH 39/51] cal: code cleanup --- cal.tgz | Bin 3439 -> 3472 bytes cal/cal.php | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cal.tgz b/cal.tgz index cb075e2218572475d22f126ad79dba4df15164c6..b01a169dbeba86ac9b7f4305b4584b35654eac82 100644 GIT binary patch literal 3472 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 RDB&**{{d$|?Ee5z001sozajtt diff --git a/cal/cal.php b/cal/cal.php index 597e53231..5ec8d73e1 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -22,8 +22,8 @@ function cal_module() { } /* pathes - * /cal/$user/export/$ - * currently supported format is ical (iCalendar + * /cal/$user/export/$format + * currently supported formats are ical (iCalendar) and CSV */ function cal_content() { @@ -80,7 +80,7 @@ function cal_content() function cal_format_output ($r, $f, $tz) { - $res = t('This calendar format is not supported');; + $res = t('This calendar format is not supported'); switch ($f) { // format the exported data as a CSV file @@ -105,11 +105,11 @@ function cal_format_output ($r, $f, $tz) case "ical": header("Content-type: text/ics"); - $res = ''; $o = 'BEGIN:VCALENDAR'. PHP_EOL . 'PRODID:-//friendica calendar export//0.1//EN' . PHP_EOL . 'VERSION:2.0' . PHP_EOL; // TODO include timezone informations in cases were the time is not in UTC +// see http://tools.ietf.org/html/rfc2445#section-4.8.3 // . 'BEGIN:VTIMEZONE' . PHP_EOL // . 'TZID:' . $tz . PHP_EOL // . 'END:VTIMEZONE' . PHP_EOL; From f9deb708c74461ae69b4eb1a833b3a21cebb6a68 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 16 Jun 2013 22:03:41 +0200 Subject: [PATCH 40/51] cal: CSV date now is YYYY-MM-DD --- cal.tgz | Bin 3472 -> 3477 bytes cal/cal.php | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cal.tgz b/cal.tgz index b01a169dbeba86ac9b7f4305b4584b35654eac82..259d9563dd6dd560f3b684c12781d3c9925c9eb0 100644 GIT binary patch literal 3477 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 Date: Wed, 19 Jun 2013 13:19:46 +0200 Subject: [PATCH 41/51] cal: typo --- cal/cal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cal/cal.php b/cal/cal.php index 4d251d372..b9c27755e 100644 --- a/cal/cal.php +++ b/cal/cal.php @@ -172,7 +172,7 @@ function cal_addon_settings ( &$a, &$s ) $url = $a->get_baseurl().'/cal/'.$a->user['nickname'].'/export/format'; $s .= '

'.t('Export Events').'

'; - $s .= '

'.t('If this is enabled, you public events will be available at').' '.$url.'

'; + $s .= '

'.t('If this is enabled, your public events will be available at').' '.$url.'

'; $s .= '

'.t('Currently supported formats are ical and csv.').'

'; $s .= '
'; $s .= ''; From 6c8e16938bea824cf7414f720238cb078e2f1a20 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Wed, 19 Jun 2013 13:28:02 +0200 Subject: [PATCH 42/51] cal: added DE translation --- cal/lang/C/messages.po | 54 +++++++++++++++++++++++++++++++++++++++++ cal/lang/C/strings.php | 12 +++++++++ cal/lang/de/strings.php | 11 +++++++++ 3 files changed, 77 insertions(+) create mode 100644 cal/lang/C/messages.po create mode 100644 cal/lang/C/strings.php create mode 100644 cal/lang/de/strings.php diff --git a/cal/lang/C/messages.po b/cal/lang/C/messages.po new file mode 100644 index 000000000..db7ae28b9 --- /dev/null +++ b/cal/lang/C/messages.po @@ -0,0 +1,54 @@ +# ADDON cal +# Copyright (C) +# This file is distributed under the same license as the Friendica cal addon package. +# +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-06-19 13:20+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: cal.php:33 +msgid "Event Export" +msgstr "" + +#: cal.php:33 +msgid "You can download public events from: " +msgstr "" + +#: cal.php:53 +msgid "The user does not export the calendar." +msgstr "" + +#: cal.php:83 +msgid "This calendar format is not supported" +msgstr "" + +#: cal.php:174 +msgid "Export Events" +msgstr "" + +#: cal.php:175 +msgid "If this is enabled, your public events will be available at" +msgstr "" + +#: cal.php:176 +msgid "Currently supported formats are ical and csv." +msgstr "" + +#: cal.php:178 +msgid "Enable calendar export" +msgstr "" + +#: cal.php:181 +msgid "Submit" +msgstr "" diff --git a/cal/lang/C/strings.php b/cal/lang/C/strings.php new file mode 100644 index 000000000..a72dc1191 --- /dev/null +++ b/cal/lang/C/strings.php @@ -0,0 +1,12 @@ +strings["Event Export"] = ""; +$a->strings["You can download public events from: "] = ""; +$a->strings["The user does not export the calendar."] = ""; +$a->strings["This calendar format is not supported"] = ""; +$a->strings["Export Events"] = ""; +$a->strings["If this is enabled, your public events will be available at"] = ""; +$a->strings["Currently supported formats are ical and csv."] = ""; +$a->strings["Enable calendar export"] = ""; +$a->strings["Submit"] = ""; diff --git a/cal/lang/de/strings.php b/cal/lang/de/strings.php new file mode 100644 index 000000000..b3d658b1d --- /dev/null +++ b/cal/lang/de/strings.php @@ -0,0 +1,11 @@ +strings["Event Export"] = "Export von Veranstaltungen"; +$a->strings["You can download public events from: "] = "Öffentliche Veranstaltungen können unter folgender Adresse geladen werden: "; +$a->strings["The user does not export the calendar."] = "Dieser Nutzer exportiert keine Veranstaltungen."; +$a->strings["This calendar format is not supported"] = "Dieses Kalenderformat wird nicht unterstützt "; +$a->strings["Export Events"] = "Export von Veranstaltungen"; +$a->strings["If this is enabled, your public events will be available at"] = "ISt dieses Addpn aktiviert werden deine öffentlichen Veranstaltungen exportiert. Die Adresse zum Download lautet"; +$a->strings["Currently supported formats are ical and csv."] = "Derzeit werden die Formate ical und csv unterstützt."; +$a->strings["Enable calendar export"] = "Aktiviere den Kalenderexport"; From 689e0842a77aae49a09dd1b4a4198c3848577391 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Wed, 19 Jun 2013 14:14:12 +0200 Subject: [PATCH 43/51] cal: typo in DE translation --- cal/lang/de/strings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cal/lang/de/strings.php b/cal/lang/de/strings.php index b3d658b1d..178e12810 100644 --- a/cal/lang/de/strings.php +++ b/cal/lang/de/strings.php @@ -6,6 +6,6 @@ $a->strings["You can download public events from: "] = "Öffentliche Veranstaltu $a->strings["The user does not export the calendar."] = "Dieser Nutzer exportiert keine Veranstaltungen."; $a->strings["This calendar format is not supported"] = "Dieses Kalenderformat wird nicht unterstützt "; $a->strings["Export Events"] = "Export von Veranstaltungen"; -$a->strings["If this is enabled, your public events will be available at"] = "ISt dieses Addpn aktiviert werden deine öffentlichen Veranstaltungen exportiert. Die Adresse zum Download lautet"; +$a->strings["If this is enabled, your public events will be available at"] = "Ist dieses Addpn aktiviert werden deine öffentlichen Veranstaltungen exportiert. Die Adresse zum Download lautet"; $a->strings["Currently supported formats are ical and csv."] = "Derzeit werden die Formate ical und csv unterstützt."; $a->strings["Enable calendar export"] = "Aktiviere den Kalenderexport"; From fc5670530dba7b720fbf497203eb28de68ccf6eb Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Wed, 19 Jun 2013 14:22:09 +0200 Subject: [PATCH 44/51] cal: typo in DE translation --- cal/lang/de/strings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cal/lang/de/strings.php b/cal/lang/de/strings.php index 178e12810..968a0a8a2 100644 --- a/cal/lang/de/strings.php +++ b/cal/lang/de/strings.php @@ -6,6 +6,6 @@ $a->strings["You can download public events from: "] = "Öffentliche Veranstaltu $a->strings["The user does not export the calendar."] = "Dieser Nutzer exportiert keine Veranstaltungen."; $a->strings["This calendar format is not supported"] = "Dieses Kalenderformat wird nicht unterstützt "; $a->strings["Export Events"] = "Export von Veranstaltungen"; -$a->strings["If this is enabled, your public events will be available at"] = "Ist dieses Addpn aktiviert werden deine öffentlichen Veranstaltungen exportiert. Die Adresse zum Download lautet"; +$a->strings["If this is enabled, your public events will be available at"] = "Ist dieses Addon aktiviert werden deine öffentlichen Veranstaltungen exportiert. Die Adresse zum Download lautet"; $a->strings["Currently supported formats are ical and csv."] = "Derzeit werden die Formate ical und csv unterstützt."; $a->strings["Enable calendar export"] = "Aktiviere den Kalenderexport"; From ca671fc49beb8efdc0cd7bc1d26d5a1398440d75 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 21 Jun 2013 12:07:06 +0200 Subject: [PATCH 45/51] only the public events of the user are exported, not public eventy by contacts and some validation of the exported ical file --- cal.tgz | Bin 3477 -> 4394 bytes cal/cal.php | 14 ++++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cal.tgz b/cal.tgz index 259d9563dd6dd560f3b684c12781d3c9925c9eb0..2c080ac52499e6ec64635b90eb309a82a8b8c89a 100644 GIT binary patch literal 4394 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%0A`_ry>UZ_9tuw)$u5t6`|s#e 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 Date: Sat, 22 Jun 2013 20:05:03 +0200 Subject: [PATCH 46/51] jappixmini: Added parameters for a default server and a default username as well as a central defined bosh server address. --- jappixmini/jappixmini.php | 42 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/jappixmini/jappixmini.php b/jappixmini/jappixmini.php index 69c58e94c..aac5c5486 100644 --- a/jappixmini/jappixmini.php +++ b/jappixmini/jappixmini.php @@ -122,6 +122,22 @@ function jappixmini_plugin_admin(&$a, &$o) { $o .= ''; $o .= '
'; + // bosh address + $bosh_address = get_config("jappixmini", "bosh_address"); + $o .= '


'; + $o .= '

'; + + // default server address + $default_server = get_config("jappixmini", "default_server"); + $o .= '


'; + $o .= '

'; + + // default user name to friendica nickname + $default_user = intval(get_config("jappixmini", "default_user")); + $default_user = intval($default_user) ? ' checked="checked"' : ''; + $o .= ''; + $o .= '
'; + // info text field $info_text = get_config("jappixmini", "infotext"); $o .= '


'; @@ -137,8 +153,14 @@ function jappixmini_plugin_admin_post(&$a) { if ($submit) { $info_text = $_REQUEST['jappixmini-infotext']; $bosh_proxy = intval($_REQUEST['jappixmini-proxy']); + $default_user = intval($_REQUEST['jappixmini-defaultuser']); + $bosh_address = $_REQUEST['jappixmini-address']; + $default_server = $_REQUEST['jappixmini-server']; set_config("jappixmini", "infotext", $info_text); set_config("jappixmini", "bosh_proxy", $bosh_proxy); + set_config("jappixmini", "bosh_address", $bosh_address); + set_config("jappixmini", "default_server", $default_server); + set_config("jappixmini", "default_user", $default_user); } } @@ -224,6 +246,11 @@ function jappixmini_settings(&$a, &$s) { $dontinsertchat = get_pconfig(local_user(),'jappixmini','dontinsertchat'); $insertchat = !(intval($dontinsertchat) ? ' checked="checked"' : ''); + $defaultbosh = get_config("jappixmini", "bosh_address"); + + if ($defaultbosh != "") + set_pconfig(local_user(),'jappixmini','bosh', $defaultbosh); + $username = get_pconfig(local_user(),'jappixmini','username'); $username = htmlentities($username); $server = get_pconfig(local_user(),'jappixmini','server'); @@ -239,6 +266,12 @@ function jappixmini_settings(&$a, &$s) { $encrypt_checked = $encrypt ? ' checked="checked"' : ''; $encrypt_disabled = $encrypt ? '' : ' disabled="disabled"'; + if ($server == "") + $server = get_config("jappixmini", "default_server"); + + if (($username == "") and get_config("jappixmini", "default_user")) + $username = $a->user["nickname"]; + $info_text = get_config("jappixmini", "infotext"); $info_text = htmlentities($info_text); $info_text = str_replace("\n", "
", $info_text); @@ -278,9 +311,12 @@ function jappixmini_settings(&$a, &$s) { $s .= ' '; $s .= '
'; - $s .= ''; - $s .= ' '; - $s .= '
'; + if (defaultbosh == "") { + $s .= ''; + $s .= ' '; + $s .= '
'; + } + $s .= ''; $s .= ' '; From eccc3bfc45cd1ab48b82ff1a78c740fc526cbe30 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Jun 2013 00:26:49 +0200 Subject: [PATCH 47/51] jappixmini: The login window is repositioned so that there are no problems with "vier" --- jappixmini/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jappixmini/lib.js b/jappixmini/lib.js index a777a7fdd..ed52f5974 100644 --- a/jappixmini/lib.js +++ b/jappixmini/lib.js @@ -40,7 +40,7 @@ function jappixmini_addon_get_client_secret(callback) { var div = document.getElementById("#jappixmini-password-query-div"); if (!div) { - div = $('

Retype your Friendica password for chatting:
'); + div = $('
Retype your Friendica password for chatting:
'); var input = $('') div.append(input); From 21778176e6fa03d97705c1a74f24f2b49dca8aa3 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Jun 2013 03:30:22 +0200 Subject: [PATCH 48/51] pumpio: Resetting of authentification data is added. --- pumpio/pumpio.css | 4 +- pumpio/pumpio.php | 121 +++++++++++++++++++++++++++------------------- 2 files changed, 73 insertions(+), 52 deletions(-) diff --git a/pumpio/pumpio.css b/pumpio/pumpio.css index eba380e4f..020f3697b 100755 --- a/pumpio/pumpio.css +++ b/pumpio/pumpio.css @@ -1,11 +1,11 @@ -#pumpio-mirror-label,#pumpio-public-label, #pumpio-enable-label, #pumpio-username-label, #pumpio-servername-label, #pumpio-bydefault-label { +#pumpio-mirror-label,#pumpio-public-label, #pumpio-enable-label, #pumpio-username-label, #pumpio-servername-label, #pumpio-bydefault-label, #pumpio-delete-label { float: left; width: 200px; margin-top: 10px; } -#pumpio-mirror,#pumpio-public, #pumpio-checkbox, #pumpio-username, #pumpio-servername, #pumpio-bydefault { +#pumpio-mirror,#pumpio-public, #pumpio-checkbox, #pumpio-username, #pumpio-servername, #pumpio-bydefault, #pumpio-delete { float: left; margin-top: 10px; } diff --git a/pumpio/pumpio.php b/pumpio/pumpio.php index b7634bcbd..da723eca9 100755 --- a/pumpio/pumpio.php +++ b/pumpio/pumpio.php @@ -198,47 +198,59 @@ function pumpio_settings(&$a,&$s) { $s .= '
'; $s .= '

' . t('Pump.io Post Settings') . '

'; - $s .= '
'; - $s .= ''; - $s .= ''; - $s .= '
'; - $s .= '
'; $s .= ''; $s .= ''; $s .= '
'; + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + if (($username != '') AND ($servername != '')) { - $s .= '
'; - - $s .= '
'; - $s .= ''; - $s .= ''; - $s .= '
'; - - $s .= '
'; - $s .= ''; - $s .= ''; - $s .= '
'; - - $s .= '
'; - $s .= ''; - $s .= ''; - $s .= '
'; - - $s .= '
'; - $s .= ''; - $s .= ''; - $s .= '
'; $oauth_token = get_pconfig(local_user(), "pumpio", "oauth_token"); $oauth_token_secret = get_pconfig(local_user(), "pumpio", "oauth_token_secret"); $s .= '
'; - if (($oauth_token == "") OR ($oauth_token_secret == "")) - $s .= t("You are not authenticated to pumpio"); + if (($oauth_token == "") OR ($oauth_token_secret == "")) { + $s .= '
'; + + //$s .= t("You are not authenticated to pumpio"); + } else { + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + //$s .= '
'; + + } $s .= '
'; } @@ -253,28 +265,37 @@ function pumpio_settings(&$a,&$s) { function pumpio_settings_post(&$a,&$b) { if(x($_POST,'pumpio-submit')) { - // filtering the username if it is filled wrong - $user = $_POST['pumpio_user']; - if (strstr($user, "@")) { - $pos = strpos($user, "@"); - if ($pos > 0) - $user = substr($user, 0, $pos); + if(x($_POST,'pumpio_delete')) { + set_pconfig(local_user(),'pumpio','consumer_key',''); + set_pconfig(local_user(),'pumpio','consumer_secret',''); + set_pconfig(local_user(),'pumpio','host',''); + set_pconfig(local_user(),'pumpio','oauth_token',''); + set_pconfig(local_user(),'pumpio','oauth_token_secret',''); + set_pconfig(local_user(),'pumpio','post',false); + set_pconfig(local_user(),'pumpio','post_by_default',false); + set_pconfig(local_user(),'pumpio','user',''); + } else { + // filtering the username if it is filled wrong + $user = $_POST['pumpio_user']; + if (strstr($user, "@")) { + $pos = strpos($user, "@"); + if ($pos > 0) + $user = substr($user, 0, $pos); + } + + // Filtering the hostname if someone is entering it with "http" + $host = $_POST['pumpio_host']; + $host = trim($host); + $host = str_replace(array("https://", "http://"), array("", ""), $host); + + set_pconfig(local_user(),'pumpio','post',intval($_POST['pumpio'])); + set_pconfig(local_user(),'pumpio','host',$host); + set_pconfig(local_user(),'pumpio','user',$user); + set_pconfig(local_user(),'pumpio','public',$_POST['pumpio_public']); + set_pconfig(local_user(),'pumpio','mirror',$_POST['pumpio_mirror']); + set_pconfig(local_user(),'pumpio','post_by_default',intval($_POST['pumpio_bydefault'])); } - - // Filtering the hostname if someone is entering it with "http" - $host = $_POST['pumpio_host']; - $host = trim($host); - $host = str_replace(array("https://", "http://"), array("", ""), $host); - - set_pconfig(local_user(),'pumpio','post',intval($_POST['pumpio'])); - set_pconfig(local_user(),'pumpio','host',$host); - set_pconfig(local_user(),'pumpio','user',$user); - set_pconfig(local_user(),'pumpio','public',$_POST['pumpio_public']); - set_pconfig(local_user(),'pumpio','mirror',$_POST['pumpio_mirror']); - set_pconfig(local_user(),'pumpio','post_by_default',intval($_POST['pumpio_bydefault'])); - } - } function pumpio_post_local(&$a,&$b) { From c9864aa8c0f80818e7a443358aba44664cfe63f4 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 24 Jun 2013 12:41:08 +0200 Subject: [PATCH 49/51] the impressum module now activates /impressum --- impressum/impressum.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/impressum/impressum.php b/impressum/impressum.php index 8bcc8b7dd..2a84fbadf 100755 --- a/impressum/impressum.php +++ b/impressum/impressum.php @@ -20,6 +20,14 @@ function impressum_uninstall() { unregister_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer'); logger("uninstalled impressum plugin"); } + +function impressum_module() { +} +function impressum_content() { + $a = get_app(); + goaway($a->get_baseurl().'/friendica/'); +} + function obfuscate_email ($s) { $s = str_replace('@','(at)',$s); $s = str_replace('.','(dot)',$s); From 76d6a6fcb7bd09dd7ee8fa7268e197ff066b7517 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 24 Jun 2013 12:42:41 +0200 Subject: [PATCH 50/51] impressum level up --- impressum/impressum.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impressum/impressum.php b/impressum/impressum.php index 2a84fbadf..6714dfc13 100755 --- a/impressum/impressum.php +++ b/impressum/impressum.php @@ -2,7 +2,7 @@ /** * Name: Impressum * Description: Plugin to add contact information to the about page (/friendica) - * Version: 1.2 + * Version: 1.3 * Author: Tobias Diekershoff * License: 3-clause BSD license */ From 2dab9cc138433d9cf4e21a032b142842e455af71 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 24 Jun 2013 12:43:06 +0200 Subject: [PATCH 51/51] impressum: new tarball --- impressum.tgz | Bin 7434 -> 8501 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/impressum.tgz b/impressum.tgz index c483e08555695c293d6db8ab3893ad5c4c06e18e..d1c70af7c129564d67c01145297bde9e4231207b 100755 GIT binary patch literal 8501 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 literal 7434 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