-#!/bin/sh
+#!/bin/bash
# Make doesn't handle subdirs very well
# without providing a Makefile in each one.
# So we will just manually find any source
--- /dev/null
+Thomas Willingham
+
+This isn't even close to being worth a pull request, but some people might find it useful.
+
+Enable community home in your admin panel, then replace communityhome.php with this one to get a front page like mine (a normal front page, but with latest users shown in the sidebar, which looks bleak when there's nothing in it).
+
+There are more graceful ways of doing this, I used communityhome as I plan to make use of a limited stream and likes in future.
--- /dev/null
+<?php
+/**
+ * Name: Community home
+ * Description: Show last community activity in homepage
+ * Version: 1.0
+ * Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
+ */
+
+
+require_once('mod/community.php');
+
+
+function communityhome_install() {
+ register_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
+ logger("installed communityhome");
+}
+
+function communityhome_uninstall() {
+ unregister_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
+ logger("removed communityhome");
+}
+
+function communityhome_home(&$a, &$o){
+ // custom css
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/communityhome/communityhome.css" media="all" />';
+
+ $aside = array(
+ '$tab_1' => t('Login'),
+ '$tab_2' => t('OpenID'),
+ '$noOid' => get_config('system','no_openid'),
+ );
+
+ // login form
+ $aside['$login_title'] = t('Login');
+ $aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
+
+ // last 12 users
+ $aside['$lastusers_title'] = t('Latest users');
+ $aside['$lastusers_items'] = array();
+ $sql_extra = "";
+ $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
+ $order = " ORDER BY `register_date` DESC ";
+
+ $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
+ FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
+ WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
+ 0,
+ 12
+ );
+ $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
+ if(count($r)) {
+ $photo = 'thumb';
+ foreach($r as $rr) {
+ $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
+ $entry = replace_macros($tpl,array(
+ '$id' => $rr['id'],
+ '$profile-link' => $profile_link,
+ '$photo' => $rr[$photo],
+ '$alt-text' => $rr['name'],
+ ));
+ $aside['$lastusers_items'][] = $entry;
+ }
+ }
+
+ // 12 most active users (by posts and contacts)
+ // this query don't work on some mysql versions
+ $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM
+ (SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
+ (SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
+ (
+ SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
+ UNION ALL
+ SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
+ ) AS `uni`, `user`, `profile`
+ WHERE `uni`.`uid`=`user`.`uid`
+ AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
+ GROUP BY `uid`
+ ORDER BY `items` DESC,`contacts` DESC
+ LIMIT 0,10");
+ if($r && count($r)) {
+ $aside['$activeusers_title'] = t('Most active users');
+ $aside['$activeusers_items'] = array();
+
+ $photo = 'thumb';
+ foreach($r as $rr) {
+ $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
+ $entry = replace_macros($tpl,array(
+ '$id' => $rr['id'],
+ '$profile-link' => $profile_link,
+ '$photo' => $rr[$photo],
+ '$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
+ ));
+ $aside['$activeusers_items'][] = $entry;
+ }
+ }
+
+
+
+
+ $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl');
+ $a->page['aside'] = replace_macros($tpl, $aside);
+ $o = '';
+ if(file_exists('home.html'))
+
+ $o .= file_get_contents('home.html');
+
+}
Replace with the settings Facebook gives you.
d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com.
+ e. Chose "Website" (the url should be your site URL with a trailing slash) in the
+ "Select how your app integrates with Facebook" section.
2. Enable the facebook plugin by including it in .htconfig.php - e.g.
$a->config['system']['addon'] = 'plugin1,plugin2,facebook';
3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
* d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set
* Site URL to yoursubdomain.yourdomain.com. Set Site Domain to your
* yourdomain.com.
- * 2. Enable the facebook plugin by including it in .htconfig.php - e.g.
+ * 2. (This step is now obsolete. Enable the plugin via the Admin panel.)
+ * Enable the facebook plugin by including it in .htconfig.php - e.g.
* $a->config['system']['addon'] = 'plugin1,plugin2,facebook';
* 3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
* and click 'Install Facebook Connector'.
logger('facebook: postvars: ' . print_r($postvars,true));
// "test_mode" prevents anything from actually being posted.
- // Otherwise, let's do it.
+ // Otherwise, let's do it.
if(! get_config('facebook','test_mode')) {
$x = post_url($url, $postvars);
if(! x($datarray,'contact-id')) {
logger('no contact: post ignored');
- continue;
+ continue;
}
- $datarray['verb'] = ACTIVITY_POST;
+ $datarray['verb'] = ACTIVITY_POST;
if($wall) {
$datarray['owner-name'] = $self[0]['name'];
$datarray['owner-link'] = $self[0]['url'];
--- /dev/null
+
+#gnot-desc {
+ margin-bottom: 10px;
+}
+
+#gnot-label {
+ float: left;
+ width: 200px;
+ margin-bottom: 25px;
+}
+
+#gnot {
+ float: left;
+}
+
+
--- /dev/null
+<?php
+/**
+ * Name: Gnot
+ * Description: Thread email comment notifications on Gmail and anonymise them
+ * Version: 1.0
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ *
+ *
+ */
+
+
+function gnot_install() {
+
+ register_hook('plugin_settings', 'addon/gnot/gnot.php', 'gnot_settings');
+ register_hook('plugin_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
+ register_hook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
+
+ logger("installed gnot");
+}
+
+
+function gnot_uninstall() {
+
+ unregister_hook('plugin_settings', 'addon/gnot/gnot.php', 'gnot_settings');
+ unregister_hook('plugin_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
+ unregister_hook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
+
+
+ logger("removed gnot");
+}
+
+
+
+/**
+ *
+ * Callback from the settings post function.
+ * $post contains the $_POST array.
+ * We will make sure we've got a valid user account
+ * and if so set our configuration setting for this person.
+ *
+ */
+
+function gnot_settings_post($a,$post) {
+ if(! local_user() || (! x($_POST,'gnot-submit')))
+ return;
+
+ set_pconfig(local_user(),'gnot','enable',intval($_POST['gnot']));
+ info( t('Gnot settings updated.') . EOL);
+}
+
+
+/**
+ *
+ * Called from the Plugin Setting form.
+ * Add our own settings info to the page.
+ *
+ */
+
+
+
+function gnot_settings(&$a,&$s) {
+
+ if(! local_user())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/gnot/gnot.css' . '" media="all" />' . "\r\n";
+
+ /* Get the current state of our config variable */
+
+ $gnot = intval(get_pconfig(local_user(),'gnot','enable'));
+
+ $gnot_checked = (($gnot) ? ' checked="checked" ' : '' );
+
+ /* Add some HTML to the existing form */
+
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . t('Gnot Settings') . '</h3>';
+ $s .= '<div id="gnot-wrapper">';
+ $s .= '<div id="gnot-desc">' . t("Allows threading of email comment notifications on Gmail and anonymising the subject line.") . '</div>';
+ $s .= '<label id="gnot-label" for="gnot">' . t('Enable this plugin/addon?') . '</label>';
+ $s .= '<input id="gnot-input" type="checkbox" name="gnot" value="1"'. $gnot_checked . '/>';
+ $s .= '</div><div class="clear"></div>';
+
+ /* provide a submit button */
+
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="gnot-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+}
+
+
+function gnot_enotify_mail(&$a,&$b) {
+ if((! $b['uid']) || (! intval(get_pconfig($b['uid'], 'gnot','enable'))))
+ return;
+ if($b['type'] == NOTIFY_COMMENT)
+ $b['subject'] = sprintf( t('[Friendica:Notify] Comment to conversation #%d'), $b['parent']);
+}
+
$cancel = t('Cancel');
$failed = t('Failed');
+ $maximagesize = intval(get_config('system','maximagesize'));
+
$b['addon_text'] .= <<< EOT
<div id="file-uploader-demo1">
'</li>',
debug: true,
+ sizeLimit: $maximagesize,
onSubmit: function(id,filename) {
if (typeof acl!="undefined"){
uploader.setParams( {
--- /dev/null
+
+#ljpost-enable-label, #ljpost-username-label, #ljpost-password-label, #ljpost-bydefault-label {
+ float: left;
+ width: 200px;
+ margin-top: 10px;
+}
+
+#ljpost-checkbox, #ljpost-username, #ljpost-password, #ljpost-bydefault {
+ float: left;
+ margin-top: 10px;
+}
+
+#ljpost-submit {
+ margin-top: 15px;
+}
+
--- /dev/null
+<?php
+
+/**
+ * Name: LiveJournal Post Connector
+ * Description: Post to LiveJournal
+ * Version: 1.0
+ * Author: Tony Baldwin <http://theshi.re/profile/tony>
+ * Author: Michael Johnston
+ */
+
+function ljpost_install() {
+ register_hook('post_local', 'addon/ljpost/ljpost.php', 'ljpost_post_local');
+ register_hook('notifier_normal', 'addon/ljpost/ljpost.php', 'ljpost_send');
+ register_hook('jot_networks', 'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
+ register_hook('connector_settings', 'addon/ljpost/ljpost.php', 'ljpost_settings');
+ register_hook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
+
+}
+function ljpost_uninstall() {
+ unregister_hook('post_local', 'addon/ljpost/ljpost.php', 'ljpost_post_local');
+ unregister_hook('notifier_normal', 'addon/ljpost/ljpost.php', 'ljpost_send');
+ unregister_hook('jot_networks', 'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
+ unregister_hook('connector_settings', 'addon/ljpost/ljpost.php', 'ljpost_settings');
+ unregister_hook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
+
+}
+
+
+function ljpost_jot_nets(&$a,&$b) {
+ if(! local_user())
+ return;
+
+ $lj_post = get_pconfig(local_user(),'ljpost','post');
+ if(intval($lj_post) == 1) {
+ $lj_defpost = get_pconfig(local_user(),'ljpost','post_by_default');
+ $selected = ((intval($lj_defpost) == 1) ? ' checked="checked" ' : '');
+ $b .= '<div class="profile-jot-net"><input type="checkbox" name="ljpost_enable" ' . $selected . ' value="1" /> '
+ . t('Post to LiveJournal') . '</div>';
+ }
+}
+
+
+function ljpost_settings(&$a,&$s) {
+
+ if(! local_user())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/ljpost/ljpost.css' . '" media="all" />' . "\r\n";
+
+ /* Get the current state of our config variables */
+
+ $enabled = get_pconfig(local_user(),'ljpost','post');
+
+ $checked = (($enabled) ? ' checked="checked" ' : '');
+
+ $def_enabled = get_pconfig(local_user(),'ljpost','post_by_default');
+
+ $def_checked = (($def_enabled) ? ' checked="checked" ' : '');
+
+ $lj_username = get_pconfig(local_user(), 'ljpost', 'lj_username');
+ $lj_password = get_pconfig(local_user(), 'ljpost', 'lj_password');
+
+
+ /* Add some HTML to the existing form */
+
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . t('LiveJournal Post Settings') . '</h3>';
+ $s .= '<div id="ljpost-enable-wrapper">';
+ $s .= '<label id="ljpost-enable-label" for="ljpost-checkbox">' . t('Enable LiveJournal Post Plugin') . '</label>';
+ $s .= '<input id="ljpost-checkbox" type="checkbox" name="ljpost" value="1" ' . $checked . '/>';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="ljpost-username-wrapper">';
+ $s .= '<label id="ljpost-username-label" for="ljpost-username">' . t('LiveJournal username') . '</label>';
+ $s .= '<input id="ljpost-username" type="text" name="lj_username" value="' . $lj_username . '" />';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="ljpost-password-wrapper">';
+ $s .= '<label id="ljpost-password-label" for="ljpost-password">' . t('LiveJournal password') . '</label>';
+ $s .= '<input id="ljpost-password" type="password" name="lj_password" value="' . $lj_password . '" />';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="ljpost-bydefault-wrapper">';
+ $s .= '<label id="ljpost-bydefault-label" for="ljpost-bydefault">' . t('Post to LiveJournal by default') . '</label>';
+ $s .= '<input id="ljpost-bydefault" type="checkbox" name="lj_bydefault" value="1" ' . $def_checked . '/>';
+ $s .= '</div><div class="clear"></div>';
+
+ /* provide a submit button */
+
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ljpost-submit" name="ljpost-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+}
+
+
+function ljpost_settings_post(&$a,&$b) {
+
+ if(x($_POST,'ljpost-submit')) {
+
+ set_pconfig(local_user(),'ljpost','post',intval($_POST['ljpost']));
+ set_pconfig(local_user(),'ljpost','post_by_default',intval($_POST['lj_bydefault']));
+ set_pconfig(local_user(),'ljpost','lj_username',trim($_POST['lj_username']));
+ set_pconfig(local_user(),'ljpost','lj_password',trim($_POST['lj_password']));
+
+ }
+
+}
+
+function ljpost_post_local(&$a,&$b) {
+
+ // This can probably be changed to allow editing by pointing to a different API endpoint
+
+ if($b['edit'])
+ return;
+
+ if((! local_user()) || (local_user() != $b['uid']))
+ return;
+
+ if($b['private'] || $b['parent'])
+ return;
+
+ $lj_post = intval(get_pconfig(local_user(),'ljpost','post'));
+
+ $lj_enable = (($lj_post && x($_REQUEST,'ljpost_enable')) ? intval($_REQUEST['ljpost_enable']) : 0);
+
+ if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'ljpost','post_by_default')))
+ $lj_enable = 1;
+
+ if(! $lj_enable)
+ return;
+
+ if(strlen($b['postopts']))
+ $b['postopts'] .= ',';
+ $b['postopts'] .= 'ljpost';
+}
+
+
+
+
+function ljpost_send(&$a,&$b) {
+
+ if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
+ return;
+
+ if(! strstr($b['postopts'],'ljpost'))
+ return;
+
+ if($b['parent'] != $b['id'])
+ return;
+
+ // LiveJournal post in the LJ user's timezone.
+ // Hopefully the person's Friendica account
+ // will be set to the same thing.
+
+ $tz = 'UTC';
+
+ $x = q("select timezone from user where uid = %d limit 1",
+ intval($b['uid'])
+ );
+ if($x && strlen($x[0]['timezone']))
+ $tz = $x[0]['timezone'];
+
+ $lj_username = xmlify(get_pconfig($b['uid'],'ljpost','lj_username'));
+ $lj_password = xmlify(get_pconfig($b['uid'],'ljpost','lj_password'));
+ $lj_journal = xmlify(get_pconfig($b['uid'],'ljpost','lj_journal'));
+// if(! $lj_journal)
+// $lj_journal = $lj_username;
+
+ $lj_blog = xmlify(get_pconfig($b['uid'],'ljpost','lj_blog'));
+ if(! strlen($lj_blog))
+ $lj_blog = xmlify('http://www.livejournal.com/interface/xmlrpc');
+
+ if($lj_username && $lj_password && $lj_blog) {
+
+ require_once('include/bbcode.php');
+ require_once('include/datetime.php');
+
+ $title = xmlify($b['title']);
+ $post = bbcode($b['body']);
+ $post = xmlify($post);
+
+ $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+ $year = intval(substr($date,0,4));
+ $mon = intval(substr($date,5,2));
+ $day = intval(substr($date,8,2));
+ $hour = intval(substr($date,11,2));
+ $min = intval(substr($date,14,2));
+
+ $xml = <<< EOT
+<?xml version="1.0" encoding="utf-8"?>
+<methodCall>
+ <methodName>LJ.XMLRPC.postevent</methodName>
+ <params>
+ <param><value>
+ <struct>
+ <member><name>username</name><value><string>$lj_username</string></value></member>
+ <member><name>password</name><value><string>$lj_password</string></value></member>
+ <member><name>event</name><value><string>$post</string></value></member>
+ <member><name>subject</name><value><string>$title</string></value></member>
+ <member><name>lineendings</name><value><string>unix</string></value></member>
+ <member><name>year</name><value><int>$year</int></value></member>
+ <member><name>mon</name><value><int>$mon</int></value></member>
+ <member><name>day</name><value><int>$day</int></value></member>
+ <member><name>hour</name><value><int>$hour</int></value></member>
+ <member><name>min</name><value><int>$min</int></value></member>
+ </struct>
+ </value></param>
+ </params>
+</methodCall>
+
+EOT;
+
+ logger('ljpost: data: ' . $xml, LOGGER_DATA);
+
+ if($lj_blog !== 'test')
+ $x = post_url($lj_blog,$xml);
+ logger('posted to livejournal: ' . ($x) ? $x : '', LOGGER_DEBUG);
+
+ }
+}
+
--- /dev/null
+ ____ OpenStreetMap Plugin ____
+by Mike Macgirvin
+ Klaus Weidenbach
+
+This addon allows you to use OpenStreetMap for displaying locations.
+
+___ Requirements ___
+
+To use this plugin you need a tile Server that provides the maps.
+OpenStreetMap data is free for everyone to use. Their tile servers are not.
+Please take a look at their "Tile Usage Policy":
+http://wiki.openstreetmap.org/wiki/Tile_usage_policy
+You can run your own tile server or choose one from their list of public
+tile servers: http://wiki.openstreetmap.org/wiki/TMS
+Support the OpenStreetMap community and share the load.
+
+___ Configuration ___
+
+Open the .htconfig.php file and add "openstreetmap" to the list of activated
+addons.
+ $a->config['system']['addon'] = "openstreetmap, ..."
+
+You have to add two configuration variables for the addon:
+ $a->config['openstreetmap']['tmsserver'] = 'http://www.openstreetmap.org/';
+ $a->config['openstreetmap']['zoom'] = '18';
+
+The *tmsserver* points to the tile server you want to use. Use the full URL,
+with protocol (http/s) and trailing slash. You can configure the default zoom
+level on the map with *zoom*. 1 will show the whole world and 18 is the highest
+zoom level available.
--- /dev/null
+{{ inc field_input.tpl with $field=$tmsserver }}{{ endinc }}
+{{ inc field_input.tpl with $field=$zoom }}{{ endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
<?php
/**
- * Name: Open Street Map
- * Description: Use openstreetmap.org for displaying locations.
- * Version: 1.0
+ * Name: OpenStreetMap
+ * Description: Use OpenStreetMap for displaying locations.
+ * Version: 1.1
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- *
+ * Author: Klaus Weidenbach
*
*/
-
function openstreetmap_install() {
-
register_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
logger("installed openstreetmap");
}
-
function openstreetmap_uninstall() {
-
unregister_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
logger("removed openstreetmap");
}
-
function openstreetmap_location($a, &$item) {
-
if(! (strlen($item['location']) || strlen($item['coord'])))
return;
+ /*
+ * Get the configuration variables from the .htconfig file.
+ */
+ $tmsserver = get_config('openstreetmap','tmsserver');
+ if(! $tmsserver)
+ $tmsserver = 'http://openstreetmap.org';
+ $zoom = get_config('openstreetmap','zoom');
+ if(! $zoom)
+ $zoom = 17;
+
$location = '';
$coord = '';
- $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://www.openstreetmap.org/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
+ $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="'.$tmsserver.'?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
if($item['coord']) {
$coords = explode(' ', $item['coord']);
if(count($coords) > 1) {
- $coord = '<a target="map" title="' . $item['coord'] . '" href="http://www.openstreetmap.org/?lat=' . urlencode($coords[0]) . '&lon=' . urlencode($coords[1]) . '&zoom=18">' . $item['coord'] . '</a>' ;
+ $coord = '<a target="map" title="' . $item['coord'] . '" href="'.$tmsserver.'?lat=' . urlencode($coords[0]) . '&lon=' . urlencode($coords[1]) . '&zoom='.$zoom.'">' . $item['coord'] . '</a>' ;
}
}
if(strlen($coord)) {
return;
}
+
+function openstreetmap_plugin_admin (&$a, &$o) {
+ $t = file_get_contents( dirname(__file__)."/admin.tpl");
+ $tmsserver = get_config('openstreetmap','tmsserver');
+ if(! $tmsserver)
+ $tmsserver = 'http://openstreetmap.org';
+ $zoom = get_config('openstreetmap','zoom');
+ if(! $zoom)
+ $zoom = 17;
+
+ $o = replace_macros( $t, array(
+ '$submit' => t('Submit'),
+ '$tmsserver' => array('tmsserver', t('Tile Server URL'), $tmsserver, t('A list of <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')),
+ '$zoom' => array('zoom', t('Default zoom'), $zoom, t('The default zoom level. (1:world, 18:highest)')),
+ ));
+}
+function openstreetmap_plugin_admin_post (&$a) {
+ $url = ((x($_POST, 'tmsserver')) ? notags(trim($_POST['tmsserver'])) : '');
+ $zoom = ((x($_POST, 'zoom')) ? intval(trim($_POST['zoom'])) : '17');
+ set_config('openstreetmap', 'tmsserver', $url);
+ set_config('openstreetmap', 'zoom', $zoom);
+ info( t('Settings updated.'). EOL);
+}
-____ Piwik Plugin ____
-by Tobias Diekershoff
+## Piwik Plugin ##
+
+by Tobias Diekershoff
tobias.diekershoff(at)gmx.net
This addon allows you to embed the code necessary for the FLOSS webanalytics
-tool piwik into the Friendica pages.
+tool Piwik into the Friendica pages.
-Online version of this Document: http://ur1.ca/35m2x
+[Online version of this Document](http://ur1.ca/35m2x)
-___ Requirements ___
+### Requirements ###
-To use this plugin you need a "piwik":http://piwik.org installation.
+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 git repository `/addon/piwik/piwik.php` and a CSS file for
styling the opt-out notice.
-___ Configuration ___
+### Configuration ###
+
+Open the .htconfig.php file and add "piwik" to the list of activated addons.
-Open the .htconfig.php file and add "piwik" to the list of activated addons.
$a->config['system']['addon'] = "piwik, ..."
-You have to add 3 more configuration variables for the addon:
-$a->config['piwik']['baseurl'] = 'example.com/piwik/';
-$a->config['piwik']['sideid'] = '1';
-$a->config['piwik']['optout'] = true;
+You have to add 4 more configuration variables for the addon:
+
+ $a->config['piwik']['baseurl'] = 'example.com/piwik/';
+ $a->config['piwik']['sideid'] = '1';
+ $a->config['piwik']['optout'] = true;
+ $a->config['piwik']['async'] = false;
-The *baseurl* points to your piwik installation. Use the absolute path,
+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
-not a short notice about the utilization of piwik will be displayed on every
+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.
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.
{{ inc field_input.tpl with $field=$baseurl }}{{ endinc }}
{{ inc field_input.tpl with $field=$siteid }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$optout }}{{ endinc }}
+{{ inc field_checkbox.tpl with $field=$async }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
/**
* Name: Piwik Analytics
* Description: Piwik Analytics Plugin for Friendica
- * Version: 1.0
+ * Version: 1.1
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
+ * Author: Klaus Weidenbach
*/
-
/* Piwik Analytics Plugin for Friendica
*
* Author: Tobias Diekershoff
* tobias.diekershoff@gmx.net
*
-* License: 3-clause BSD license
+ * License: 3-clause BSD license
*
* Configuration:
- * Add the following two lines to your .htconfig.php file:
+ * Add the following lines to your .htconfig.php file:
*
* $a->config['piwik']['baseurl'] = 'www.example.com/piwik/';
* $a->config['piwik']['siteid'] = '1';
* $a->config['piwik']['optout'] = true; // set to false to disable
+ * $a->config['piwik']['async'] = false; // set to true to enable
*
* Change the siteid to the ID that the Piwik tracker for your Friendica
* installation has. Alter the baseurl to fit your needs, don't care
function piwik_install() {
register_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
- logger("installed piwik plugin");
+ logger("installed piwik plugin");
}
function piwik_uninstall() {
unregister_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
- logger("uninstalled piwik plugin");
+ logger("uninstalled piwik plugin");
}
function piwik_analytics($a,&$b) {
$baseurl = get_config('piwik','baseurl');
$siteid = get_config('piwik','siteid');
$optout = get_config('piwik','optout');
+ $async = get_config('piwik','async');
/*
- * Add the Piwik code for the site.
+ * Add the Piwik tracking code for the site.
+ * If async is set to true use asynchronous tracking
*/
- $b .= "<div id='piwik-code-block'> <!-- Piwik -->\r\n <script type=\"text/javascript\">\r\n var pkBaseURL = ((\"https:\" == document.location.protocol) ? \"https://".$baseurl."\" : \"http://".$baseurl."\");\r\n document.write(unescape(\"%3Cscript src='\" + pkBaseURL + \"piwik.js' type='text/javascript'%3E%3C/script%3E\"));\r\n </script>\r\n<script type=\"text/javascript\">\r\n try {\r\n var piwikTracker = Piwik.getTracker(pkBaseURL + \"piwik.php\", ".$siteid.");\r\n piwikTracker.trackPageView();\r\n piwikTracker.enableLinkTracking();\r\n }\r\n catch( err ) {}\r\n </script>\r\n<noscript><p><img src=\"http://".$baseurl."/piwik.php?idsite=".$siteid."\" style=\"border:0\" alt=\"\" /></p></noscript>\r\n <!-- End Piwik Tracking Tag --> </div>";
+ if ($async) {
+ $a->page['htmlhead'] .= "<!-- Piwik --> <script type=\"text/javascript\">\r\nvar _paq = _paq || [];\r\n(function(){ var u=((\"https:\" == document.location.protocol) ? \"https://".$baseurl."\" : \"http://".$baseurl."\");\r\n_paq.push(['setSiteId', ".$siteid."]);\r\n_paq.push(['setTrackerUrl', u+'piwik.php']);\r\n_paq.push(['trackPageView']);\r\n_paq.push(['enableLinkTracking']);\r\nvar d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.type='text/javascript';\r\ng.defer=true; g.async=true; g.src=u+'piwik.js';\r\ns.parentNode.insertBefore(g,s); })();\r\n </script>\r\n<!-- End Piwik Code -->\r\n";
+ $b .= "<div id='piwik-code-block'> <!-- Piwik -->\r\n<noscript><p><img src=\"http://".$baseurl."piwik.php?idsite=".$siteid."\" style=\"border:0\" alt=\"\" /></p></noscript>\r\n <!-- End Piwik Tracking Tag --> </div>";
+ } else {
+ $b .= "<div id='piwik-code-block'> <!-- Piwik -->\r\n <script type=\"text/javascript\">\r\n var pkBaseURL = ((\"https:\" == document.location.protocol) ? \"https://".$baseurl."\" : \"http://".$baseurl."\");\r\n document.write(unescape(\"%3Cscript src='\" + pkBaseURL + \"piwik.js' type='text/javascript'%3E%3C/script%3E\"));\r\n </script>\r\n<script type=\"text/javascript\">\r\n try {\r\n var piwikTracker = Piwik.getTracker(pkBaseURL + \"piwik.php\", ".$siteid.");\r\n piwikTracker.trackPageView();\r\n piwikTracker.enableLinkTracking();\r\n }\r\n catch( err ) {}\r\n </script>\r\n<noscript><p><img src=\"http://".$baseurl."piwik.php?idsite=".$siteid."\" style=\"border:0\" alt=\"\" /></p></noscript>\r\n <!-- End Piwik Tracking Tag --> </div>";
+ }
+
/*
* If the optout variable is set to true then display the notice
* otherwise just include the above code into the page.
*/
if ($optout) {
- $b .= "<div id='piwik-optout-link'>";
- $b .= t("This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool.");
- $b .= " ";
- $the_url = "http://".$baseurl ."index.php?module=CoreAdminHome&action=optOut";
- $b .= sprintf(t("If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."), $the_url);
- $b .= "</div>";
+ $b .= "<div id='piwik-optout-link'>";
+ $b .= t("This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool.");
+ $b .= " ";
+ $the_url = "http://".$baseurl ."index.php?module=CoreAdminHome&action=optOut";
+ $b .= sprintf(t("If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."), $the_url);
+ $b .= "</div>";
}
-
}
function piwik_plugin_admin (&$a, &$o) {
- $t = file_get_contents( dirname(__file__)."/admin.tpl");
- $o = replace_macros( $t, array(
- '$submit' => t('Submit'),
- '$baseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), ''),
- '$siteid' => array('siteid', t('Site ID'), get_config('piwik','siteid' ), ''),
- '$optout' => array('optout', t('Show opt-out cookie link?'), get_config('piwik','optout' ), ''),
- ));
+ $t = file_get_contents( dirname(__file__)."/admin.tpl");
+ $o = replace_macros( $t, array(
+ '$submit' => t('Submit'),
+ '$baseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), t('Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)')),
+ '$siteid' => array('siteid', t('Site ID'), get_config('piwik','siteid' ), ''),
+ '$optout' => array('optout', t('Show opt-out cookie link?'), get_config('piwik','optout' ), ''),
+ '$async' => array('async', t('Asynchronous tracking'), get_config('piwik','async' ), ''),
+ ));
}
function piwik_plugin_admin_post (&$a) {
- $url = ((x($_POST, 'baseurl')) ? notags(trim($_POST['baseurl'])) : '');
- $id = ((x($_POST, 'siteid')) ? trim($_POST['siteid']) : '');
- $optout = ((x($_POST, 'optout')) ? trim($_POST['optout']) : '');
- set_config('piwik', 'baseurl', $url);
- set_config('piwik', 'siteid', $id);
- set_config('piwik', 'optout', $optout);
- info( t('Settings updated.'). EOL);
+ $url = ((x($_POST, 'baseurl')) ? notags(trim($_POST['baseurl'])) : '');
+ $id = ((x($_POST, 'siteid')) ? trim($_POST['siteid']) : '');
+ $optout = ((x($_POST, 'optout')) ? trim($_POST['optout']) : '');
+ $async = ((x($_POST, 'async')) ? trim($_POST['async']) : '');
+ set_config('piwik', 'baseurl', $url);
+ set_config('piwik', 'siteid', $id);
+ set_config('piwik', 'optout', $optout);
+ set_config('piwik', 'async', $async);
+ info( t('Settings updated.'). EOL);
}
--- /dev/null
+
+#qcomment-label {
+ float: left;
+ width: 300px;
+ margin-top: 10px;
+}
+
+#qcomment-words {
+ float: left;
+ margin-top: 10px;
+ width: 100px;
+ height: 150px;
+
+}
+
+#qcomment-submit {
+ margin-top: 15px;
+}
+
--- /dev/null
+<?php
+
+
+/**
+ * Name: Quick Comment
+ * Description: Two click comments
+ * Version: 1.0
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ *
+ * Provides a set of text "snippets" which can be inserted into a comment window by clicking on them.
+ * First enable the addon in the system admin panel.
+ * Then each person can tailor their choice of words in Settings->Plugin Settings in the Qcomment
+ * pane. Initially no qcomments are provided, but on viewing the settings page, a default set of
+ * of words is suggested. These can be accepted (click Submit) or edited first. Each text line represents
+ * a different qcomment.
+ * Many themes will hide the qcomments above or immediately adjacent to the comment input box until
+ * you wish to use them. On some themes they may be visible.
+ * Wave the mouse around near the comment input box and the qcomments will show up. Click on any of
+ * them to open the comment window fully and insert the qcomment. Then "Submit" will submit it.
+ *
+ */
+
+function qcomment_install() {
+ register_hook('plugin_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
+ register_hook('plugin_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
+
+}
+
+
+function qcomment_uninstall() {
+ unregister_hook('plugin_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
+ unregister_hook('plugin_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
+
+}
+
+
+
+
+
+function qcomment_addon_settings(&$a,&$s) {
+
+ if(! local_user())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/qcomment/qcomment.css' . '" media="all" />' . "\r\n";
+
+ $words = get_pconfig(local_user(),'qcomment','words');
+ if($words === false)
+ $words = t(':-)') . "\n" . t(':-(') . "\n" . t('lol');
+
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . t('Quick Comment Settings') . '</h3>';
+ $s .= '<div id="qcomment-wrapper">';
+ $s .= '<div id="qcomment-desc">' . t("Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies.") . '</div>';
+ $s .= '<label id="qcomment-label" for="qcomment-words">' . t('Enter quick comments, one per line') . ' </label>';
+ $s .= '<textarea id="qcomment-words" type="text" name="qcomment-words" >' . htmlspecialchars(unxmlify($words)) . '</textarea>';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="qcomment-submit" name="qcomment-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
+ $s .= '</div>';
+
+ return;
+
+}
+
+function qcomment_addon_settings_post(&$a,&$b) {
+
+ if(! local_user())
+ return;
+
+ if($_POST['qcomment-submit']) {
+ set_pconfig(local_user(),'qcomment','words',xmlify($_POST['qcomment-words']));
+ info( t('Quick Comment settings saved.') . EOL);
+ }
+}
+
--- /dev/null
+Show more
+
+Shortens messages and offers a link to show more.
--- /dev/null
+
+#showmore-label, #showmore-enable-label {
+ float: left;
+ width: 300px;
+ margin-top: 10px;
+}
+
+#showmore-words, #showmore-enable {
+ float: left;
+ margin-top: 10px;
+}
+
+#showmore-submit {
+ margin-top: 15px;
+}
+
+.showmore-desc {
+ margin-top: 10px;
+}
--- /dev/null
+<?php
+/**
+ * Name: Show More
+ * Description: Collapse posts
+ * Version: 1.0
+ * Author: Michael Vogel <ike@piratenpartei.de>
+ * based upon NSFW from Mike Macgirvin <http://macgirvin.com/profile/mike>
+ *
+ */
+
+function showmore_install() {
+ register_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
+ register_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
+ register_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
+}
+
+function showmore_uninstall() {
+ unregister_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
+ unregister_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
+ unregister_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
+}
+
+function showmore_addon_settings(&$a,&$s) {
+
+ if(! local_user())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/showmore/showmore.css'.'" media="all"/>'."\r\n";
+
+ $enable_checked = (intval(get_pconfig(local_user(),'showmore','disable')) ? '' : ' checked="checked"');
+ $chars = get_pconfig(local_user(),'showmore','chars');
+ if(!$chars)
+ $chars = '1100';
+
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . t('"Show more" Settings').'</h3>';
+ $s .= '<div id="showmore-wrapper">';
+
+ $s .= '<label id="showmore-enable-label" for="showmore-enable">'.t('Enable Show More').'</label>';
+ $s .= '<input id="showmore-enable" type="checkbox" name="showmore-enable" value="1"'.$enable_checked.' />';
+ $s .= '<div class="clear"></div>';
+ $s .= '<label id="showmore-label" for="showmore-chars">'.t('Cutting posts after how much characters').' </label>';
+ $s .= '<input id="showmore-words" type="text" name="showmore-chars" value="'.$chars.'" />';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="showmore-submit" name="showmore-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
+// $s .= '<div class="showmore-desc">' . t('Use /expression/ to provide regular expressions') . '</div></div>';
+
+ return;
+}
+
+function showmore_addon_settings_post(&$a,&$b) {
+
+ if(! local_user())
+ return;
+
+ if($_POST['showmore-submit']) {
+ set_pconfig(local_user(),'showmore','chars',trim($_POST['showmore-chars']));
+ $enable = ((x($_POST,'showmore-enable')) ? intval($_POST['showmore-enable']) : 0);
+ $disable = 1-$enable;
+ set_pconfig(local_user(),'showmore','disable', $disable);
+ info( t('Show More Settings saved.') . EOL);
+ }
+}
+
+function showmore_prepare_body(&$a,&$b) {
+
+ $words = null;
+ if(get_pconfig(local_user(),'showmore','disable'))
+ return;
+
+ $chars = (int)get_pconfig(local_user(),'showmore','chars');
+ if(!$chars)
+ $chars = 1100;
+
+ if (strlen(strip_tags(trim($b['html']))) > $chars) {
+ $found = true;
+ $shortened = trim(showmore_cutitem($b['html'], $chars))."...";
+ }
+
+ if($found) {
+ $rnd = random_string(8);
+ $b['html'] = '<span id="showmore-teaser-'.$rnd.'" style="display: block;">'.$shortened." ".
+ '<span id="showmore-wrap-'.$rnd.'" style="white-space:nowrap;" class="fakelink" onclick="openClose(\'showmore-'.$rnd.'\'); openClose(\'showmore-teaser-'.$rnd.'\');" >'.sprintf(t('Show More')).'</span></span>'.
+ '<div id="showmore-'.$rnd.'" style="display: none;">'.$b['html'].'</div>';
+ }
+}
+
+function showmore_cutitem($text, $limit) {
+ $text = trim($text);
+
+ $text = mb_convert_encoding($text, 'HTML-ENTITIES', "UTF-8");
+
+ $text = substr($text, 0, $limit);
+
+ $pos1 = strrpos($text, "<");
+ $pos2 = strrpos($text, ">");
+ $pos3 = strrpos($text, "&");
+ $pos4 = strrpos($text, ";");
+
+ if ($pos1 > $pos3) {
+ if ($pos1 > $pos2)
+ $text = substr($text, 0, $pos1);
+ } else {
+ if ($pos3 > $pos4)
+ $text = substr($text, 0, $pos3);
+ }
+
+ $doc = new DOMDocument();
+ $doc->preserveWhiteSpace = false;
+
+ $doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">';
+ @$doc->loadHTML($doctype."<html><body>".$text."</body></html>");
+
+ $text = $doc->saveHTML();
+ $text = str_replace(array("<html><body>", "</body></html>", $doctype), array("", "", ""), $text);
+
+ return($text);
+}
<?php
/**
* Name: StatusNet Connector
- * Version: 1.0.2
+ * Description: Relay public postings to a connected StatusNet account
+ * Version: 1.0.3
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
*/
* Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin
*/
-/* __TODO__
- *
- * - what about multimedia content?
- * so far we just strip HTML tags from the message
- */
-
-
/***
* We have to alter the TwitterOAuth class a little bit to work with any StatusNet
* installation abroad. Basically it's only make the API path variable and be happy.
if (isset($_POST['statusnet-disconnect'])) {
/***
* if the statusnet-disconnect checkbox is set, clear the statusnet configuration
- * TODO can we revoke the access tokens at Twitter and do we need to do so?
*/
del_pconfig( local_user(), 'statusnet', 'consumerkey' );
del_pconfig( local_user(), 'statusnet', 'consumersecret' );
$details = $connection->get('account/verify_credentials');
$s .= '<div id="statusnet-info" ><img id="statusnet-avatar" src="'.$details->profile_image_url.'" /><p id="statusnet-info-block">'. t('Currently connected to: ') .'<a href="'.$details->statusnet_profile_url.'" target="_statusnet">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
$s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
+ if ($a->user['hidewall']) {
+ $s .= '<p>'. t('<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') .'</p>';
+ }
$s .= '<div id="statusnet-enable-wrapper">';
$s .= '<label id="statusnet-enable-label" for="statusnet-checkbox">'. t('Allow posting to StatusNet') .'</label>';
$s .= '<input id="statusnet-checkbox" type="checkbox" name="statusnet-enable" value="1" ' . $checked . '/>';
}
}
+if (! function_exists( 'short_link' )) {
+function short_link($url) {
+ require_once('library/slinky.php');
+ $slinky = new Slinky( $url );
+ $yourls_url = get_config('yourls','url1');
+ if ($yourls_url) {
+ $yourls_username = get_config('yourls','username1');
+ $yourls_password = get_config('yourls', 'password1');
+ $yourls_ssl = get_config('yourls', 'ssl1');
+ $yourls = new Slinky_YourLS();
+ $yourls->set( 'username', $yourls_username );
+ $yourls->set( 'password', $yourls_password );
+ $yourls->set( 'ssl', $yourls_ssl );
+ $yourls->set( 'yourls-url', $yourls_url );
+ $slinky->set_cascade( array( $yourls, new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
+ }
+ else {
+ // setup a cascade of shortening services
+ // try to get a short link from these services
+ // in the order ur1.ca, trim, id.gd, tinyurl
+ $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
+ }
+ return $slinky->short();
+} };
+
function statusnet_post_hook(&$a,&$b) {
/**
require_once('include/bbcode.php');
$dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
- $max_char = $dent->get_maxlength(); // max. length for a dent
- $msg = strip_tags(bbcode($b['body']));
+ $max_char = $dent->get_maxlength(); // max. length for a dent
+ // we will only work with up to two times the length of the dent
+ // we can later send to StatusNet. This way we can "gain" some
+ // information during shortening of potential links but do not
+ // shorten all the links in a 200000 character long essay.
+ $tmp = substr($b['body'], 0, 2*$max_char);
+ // if [url=bla][img]blub.png[/img][/url] get blub.png
+ $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
+ // preserve links to images, videos and audios
+ $tmp = preg_replace( '/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism', '$3', $tmp);
+ $tmp = preg_replace( '/\[\\/?img(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?video(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp);
+ // if a #tag is linked, don't send the [url] over to SN
+ // this is commented out by default as it means backlinks
+ // to friendica, if you don't like this feel free to
+ // uncomment the following line
+// $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
+ // preserve links to webpages
+ $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
+ $tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp);
+ // find all http or https links in the body of the entry and
+ // apply the shortener if the link is longer then 20 characters
+ if (( strlen($tmp)>$max_char ) && ( $max_char > 0 )) {
+ preg_match_all ( '/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', $tmp, $allurls );
+ foreach ($allurls as $url) {
+ foreach ($url as $u) {
+ if (strlen($u)>20) {
+ $sl = short_link($u);
+ $tmp = str_replace( $u, $sl, $tmp );
+ }
+ }
+ }
+ }
+ // ok, all the links we want to send out are save, now strip
+ // away the remaining bbcode
+ $msg = strip_tags(bbcode($tmp));
// quotes not working - let's try this
$msg = html_entity_decode($msg);
if (( strlen($msg) > $max_char) && $max_char > 0) {
- $shortlink = "";
- require_once('library/slinky.php');
- $slinky = new Slinky( $b['plink'] );
- $yourls_url = get_config('yourls','url1');
- if ($yourls_url) {
- $yourls_username = get_config('yourls','username1');
- $yourls_password = get_config('yourls', 'password1');
- $yourls_ssl = get_config('yourls', 'ssl1');
- $yourls = new Slinky_YourLS();
- $yourls->set( 'username', $yourls_username );
- $yourls->set( 'password', $yourls_password );
- $yourls->set( 'ssl', $yourls_ssl );
- $yourls->set( 'yourls-url', $yourls_url );
- $slinky->set_cascade( array( $yourls, new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
- }
- else {
- // setup a cascade of shortening services
- // try to get a short link from these services
- // in the order ur1.ca, trim, id.gd, tinyurl
- $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
- }
- $shortlink = $slinky->short();
+ $shortlink = short_link( $b['plink'] );
// the new message will be shortened such that "... $shortlink"
// will fit into the character limit
$msg = substr($msg, 0, $max_char-strlen($shortlink)-4);
<?php
/**
* Name: Twitter Connector
- * Version: 1.0.1
+ * Description: Relay public postings to a connected StatusNet account
+ * Version: 1.0.2
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
*/
* Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin
*/
-/* __TODO__
- *
- * - what about multimedia content?
- * so far we just strip HTML tags from the message
- */
-
function twitter_install() {
// we need some hooks, for the configuration and for sending tweets
register_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
$details = $connection->get('account/verify_credentials');
$s .= '<div id="twitter-info" ><img id="twitter-avatar" src="'.$details->profile_image_url.'" /><p id="twitter-info-block">'. t('Currently connected to: ') .'<a href="https://twitter.com/'.$details->screen_name.'" target="_twitter">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
$s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
+ if ($a->user['hidewall']) {
+ $s .= '<p>'. t('<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') .'</p>';
+ }
$s .= '<div id="twitter-enable-wrapper">';
$s .= '<label id="twitter-enable-label" for="twitter-checkbox">'. t('Allow posting to Twitter'). '</label>';
$s .= '<input id="twitter-checkbox" type="checkbox" name="twitter-enable" value="1" ' . $checked . '/>';
}
}
+if (! function_exists('short_link')) {
+function short_link ($url) {
+ require_once('library/slinky.php');
+ $slinky = new Slinky( $url );
+ $yourls_url = get_config('yourls','url1');
+ if ($yourls_url) {
+ $yourls_username = get_config('yourls','username1');
+ $yourls_password = get_config('yourls', 'password1');
+ $yourls_ssl = get_config('yourls', 'ssl1');
+ $yourls = new Slinky_YourLS();
+ $yourls->set( 'username', $yourls_username );
+ $yourls->set( 'password', $yourls_password );
+ $yourls->set( 'ssl', $yourls_ssl );
+ $yourls->set( 'yourls-url', $yourls_url );
+ $slinky->set_cascade( array( $yourls, new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
+ }
+ else {
+ // setup a cascade of shortening services
+ // try to get a short link from these services
+ // in the order ur1.ca, trim, id.gd, tinyurl
+ $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
+ }
+ return $slinky->short();
+} };
function twitter_post_hook(&$a,&$b) {
require_once('library/twitteroauth.php');
require_once('include/bbcode.php');
$tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
- $max_char = 138; // max. length for a tweet
- $msg = strip_tags(bbcode($b['body']));
- if ( strlen($msg) > $max_char) {
- logger('Twitter: have to shorten the message to fit 140 chars', LOGGER_DEBUG);
- $shortlink = "";
- require_once('library/slinky.php');
- $slinky = new Slinky( $b['plink'] );
- $yourls_url = get_config('yourls','url1');
- if ($yourls_url) {
- $max_char = 135;
- $yourls_username = get_config('yourls','username1');
- $yourls_password = get_config('yourls', 'password1');
- $yourls_ssl = get_config('yourls', 'ssl1');
- $yourls = new Slinky_YourLS();
- $yourls->set( 'username', $yourls_username );
- $yourls->set( 'password', $yourls_password );
- $yourls->set( 'ssl', $yourls_ssl );
- $yourls->set( 'yourls-url', $yourls_url );
- $slinky->set_cascade( array( $yourls, new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
- }
- else {
- // setup a cascade of shortening services
- // try to get a short link from these services
- // in the order ur1.ca, trim, id.gd, tinyurl
- $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
- }
- $shortlink = $slinky->short();
+ // in theory max char is 140 but T. uses t.co to make links
+ // longer so we give them 10 characters extra
+ $max_char = 130; // max. length for a tweet
+ // we will only work with up to two times the length of the dent
+ // we can later send to StatusNet. This way we can "gain" some
+ // information during shortening of potential links but do not
+ // shorten all the links in a 200000 character long essay.
+ $tmp = substr($b['body'], 0, 2*$max_char);
+ // if [url=bla][img]blub.png[/img][/url] get blub.png
+ $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
+ // preserve links to images, videos and audios
+ $tmp = preg_replace( '/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism', '$3', $tmp);
+ $tmp = preg_replace( '/\[\\/?img(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?video(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp);
+ $tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp);
+ // if a #tag is linked, don't send the [url] over to SN
+ // this is commented out by default as it means backlinks
+ // to friendica, if you don't like this feel free to
+ // uncomment the following line
+// $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
+ // preserve links to webpages
+ $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
+ $tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp);
+ // find all http or https links in the body of the entry and
+ // apply the shortener if the link is longer then 20 characters
+ if (( strlen($tmp)>$max_char ) && ( $max_char > 0 )) {
+ preg_match_all ( '/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', $tmp, $allurls );
+ foreach ($allurls as $url) {
+ foreach ($url as $u) {
+ if (strlen($u)>20) {
+ $sl = short_link($u);
+ $tmp = str_replace( $u, $sl, $tmp );
+ }
+ }
+ }
+ }
+ // ok, all the links we want to send out are save, now strip
+ // away the remaining bbcode
+ $msg = strip_tags(bbcode($tmp));
+ // quotes not working - let's try this
+ $msg = html_entity_decode($msg);
+ if (( strlen($msg) > $max_char) && $max_char > 0) {
+ $shortlink = short_link( $b['plink'] );
// the new message will be shortened such that "... $shortlink"
// will fit into the character limit
$msg = substr($msg, 0, $max_char-strlen($shortlink)-4);
if(intval($wp_post) == 1) {
$wp_defpost = get_pconfig(local_user(),'wppost','post_by_default');
$selected = ((intval($wp_defpost) == 1) ? ' checked="checked" ' : '');
- $b .= '<div class="profile-jot-net"><input type="checkbox" name="wppost_enable"' . $selected . 'value="1" /> '
+ $b .= '<div class="profile-jot-net"><input type="checkbox" name="wppost_enable" ' . $selected . ' value="1" /> '
. t('Post to Wordpress') . '</div>';
}
}
return;
- $wp_username = get_pconfig($b['uid'],'wppost','wp_username');
- $wp_password = get_pconfig($b['uid'],'wppost','wp_password');
+ $wp_username = xmlify(get_pconfig($b['uid'],'wppost','wp_username'));
+ $wp_password = xmlify(get_pconfig($b['uid'],'wppost','wp_password'));
$wp_blog = get_pconfig($b['uid'],'wppost','wp_blog');
if($wp_username && $wp_password && $wp_blog) {
$post = xmlify($post);
$xml = <<< EOT
-
-<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>
+<?xml version=\"1.0\" encoding=\"utf-8\"?>
<methodCall>
<methodName>blogger.newPost</methodName>
<params>
if($wp_blog !== 'test')
$x = post_url($wp_blog,$xml);
- logger('posted to wordpress: ' . ($x) ? $x : '');
+ logger('posted to wordpress: ' . (($x) ? $x : ''), LOGGER_DEBUG);
}
}
$s .= '<div id="yourls-ssl-wrapper">';
$s .= '<label id="yourls-ssl-label" for="yourls-ssl">' . t('Use SSL ') . '</label>';
- $s .= '<input id="yourls-ssl" type="checkbox" name="yourls_ssl" value="1" ' . $ssl_checked . '"/>';
+ $s .= '<input id="yourls-ssl" type="checkbox" name="yourls_ssl" value="1" ' . $ssl_checked . ' />';
$s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="yourls-submit" name="yourls-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';