diff --git a/README b/README
index 6be485eab..a930d0910 100644
--- a/README
+++ b/README
@@ -3,8 +3,9 @@ Friendica RED Interaction Engine
Red is a new concept in electronic communications which is based on our earlier work with Friendica and our pioneering developments in decentralised, federated social networking.
-Red is prototype code and does not currently function. This message will be changed when it approaches stability.
+Red is prototype code and has limited functionality at the present time. This message will be changed when it approaches stability.
-At its heart, Red is a decentralised collection of location agnostic info streams (e.g. "channels") which are attached to permission controlled web resources, and which have the ability to discover each other and interact.
+At its heart, Red is a decentralised collection of location agnostic info streams (e.g. "channels") which are attached to permission controlled web resources, and which have the ability to discover each other and interact. You could call it a type of social network, but that would be degrading. This is a different concept in online communications, starting where social networks leave off and extending those somewhat primitive types of interactions in new ways - particularly when it comes to privacy.
+
Social networking emulation is one form that these streams can take, but they can take many other forms - limited only by your imagination.
diff --git a/boot.php b/boot.php
index 0736502b0..2bff1b799 100644
--- a/boot.php
+++ b/boot.php
@@ -17,7 +17,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica Red');
define ( 'FRIENDICA_VERSION', trim(file_get_contents('version.inc')) . 'R');
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'ZOT_REVISION', 1 );
-define ( 'DB_UPDATE_VERSION', 1003 );
+define ( 'DB_UPDATE_VERSION', 1005 );
define ( 'EOL', " \r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@@ -143,12 +143,13 @@ define ( 'UPDATE_FAILED', 1);
*
*/
-define ( 'PAGE_NORMAL', 0 );
-define ( 'PAGE_SOAPBOX', 1 );
-define ( 'PAGE_COMMUNITY', 2 );
-define ( 'PAGE_FREELOVE', 3 );
-define ( 'PAGE_BLOG', 4 );
-define ( 'PAGE_PRVGROUP', 5 );
+define ( 'PAGE_NORMAL', 0x0000 );
+define ( 'PAGE_HIDDEN', 0x0001 );
+define ( 'PAGE_AUTOCONNECT', 0x0002 );
+
+//define ( 'PAGE_FREELOVE', 3 );
+//define ( 'PAGE_BLOG', 4 );
+//define ( 'PAGE_PRVGROUP', 5 );
/**
* Network and protocol family types
@@ -638,7 +639,7 @@ if(! class_exists('App')) {
$scheme = 'http';
}
}
-
+
$this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
return $this->baseurl;
}
@@ -647,7 +648,7 @@ if(! class_exists('App')) {
if(is_array($this->config) && array_key_exists('system',$this->config) &&
array_key_exists('baseurl',$this->config['system']) && strlen($this->config['system']['baseurl'])) {
- $url = $a->config['system']['baseurl'];
+ $url = $this->config['system']['baseurl'];
}
$parsed = @parse_url($url);
diff --git a/images/red.png b/images/red.png
index 803fd00f8..1d0a2950e 100644
Binary files a/images/red.png and b/images/red.png differ
diff --git a/include/dir_fns.php b/include/dir_fns.php
new file mode 100644
index 000000000..683ed9e5b
--- /dev/null
+++ b/include/dir_fns.php
@@ -0,0 +1,6 @@
+set_pager_itemspage(60);
- if(local_user()) {
- require_once('include/contact_widgets.php');
-
- $a->page['aside'] .= findpeople_widget();
-
- }
}
function directory_aside(&$a) {
@@ -35,144 +32,158 @@ function directory_content(&$a) {
else
$search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+
$tpl = get_markup_template('directory_header.tpl');
- $globaldir = '';
- $gdirpath = dirname(get_config('system','directory_submit_url'));
- if(strlen($gdirpath)) {
- $globaldir = '
';
+
+ $dirmode = get_config('system','directory_mode');
+ if($dirmode === false)
+ $dirmode = DIRECTORY_MODE_NORMAL;
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $localdir = true;
+ return;
}
- $admin = '';
-
- $o .= replace_macros($tpl, array(
- '$search' => $search,
- '$globaldir' => $globaldir,
- '$desc' => t('Find on this site'),
- '$admin' => $admin,
- '$finding' => (strlen($search) ? '' . t('Finding: ') . "'" . $search . "'" . ' ' : ""),
- '$sitedir' => t('Site Directory'),
- '$submit' => t('Find')
- ));
-
- if($search)
- $search = dbesc($search);
- $sql_extra = ((strlen($search)) ? " AND MATCH (`profile`.`name`, `user`.`nickname`, `pdesc`, `locality`,`region`,`country_name`,`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`pub_keywords`,`prv_keywords` ) AGAINST ('$search' IN BOOLEAN MODE) " : "");
-
- $publish = ((get_config('system','publish_all')) ? '' : " AND `publish` = 1 " );
+// FIXME
+$localdir = true;
- $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is_default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra ");
- if(count($r))
- $a->set_pager_total($r[0]['total']);
+ if(! $localdir) {
+ $directory = find_upstream_directory($dirmode);
- $order = " ORDER BY `name` ASC ";
+ if($directory) {
+ $url = $directory['url'];
+ }
+ else {
+ $url = DIRECTORY_FALLBACK_MASTER . '/post';
+ }
+ }
- $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags` 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 ",
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
- if(count($r)) {
- if(in_array('small', $a->argv))
+ if($localdir) {
+ if($search)
+ $search = dbesc($search);
+ $sql_extra = ((strlen($search)) ? " AND MATCH (`profile`.`name`, channel.channel_address, `pdesc`, `locality`,`region`,`country_name`,`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`pub_keywords`,`prv_keywords` ) AGAINST ('$search' IN BOOLEAN MODE) " : "");
+
+
+ $r = q("SELECT COUNT(channel_id) AS `total` FROM channel left join profile on channel.channel_id = profile.uid WHERE `is_default` = 1 and not ( channel_pageflags & %d ) $sql_extra ",
+ intval(PAGE_HIDDEN)
+ );
+ if($r)
+ $a->set_pager_total($r[0]['total']);
+
+ $order = " ORDER BY `name` ASC ";
+
+
+ $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, channel_name, channel_address, channel_hash, channel_timezone, channel_pageflags FROM `profile` LEFT JOIN channel ON channel_id = `profile`.`uid` WHERE `is_default` = 1 and not ( channel_pageflags & %d ) $sql_extra $order LIMIT %d , %d ",
+ intval(PAGE_HIDDEN),
+ intval($a->pager['start']),
+ intval($a->pager['itemspage'])
+ );
+ if($r) {
+
+ $entries = array();
+
$photo = 'thumb';
- else
- $photo = 'photo';
- foreach($r as $rr) {
+ foreach($r as $rr) {
-
- $profile_link = $a->get_baseurl() . '/channel/' . $rr['nickname'];
+ $profile_link = chanlink_hash($rr['channel_hash']);
- $pdesc = (($rr['pdesc']) ? $rr['pdesc'] . ' ' : '');
+ $pdesc = (($rr['pdesc']) ? $rr['pdesc'] . ' ' : '');
- $details = '';
- if(strlen($rr['locality']))
- $details .= $rr['locality'];
- if(strlen($rr['region'])) {
+ $details = '';
if(strlen($rr['locality']))
- $details .= ', ';
- $details .= $rr['region'];
- }
- if(strlen($rr['country_name'])) {
- if(strlen($details))
- $details .= ', ';
- $details .= $rr['country_name'];
- }
- if(strlen($rr['dob'])) {
- if(($years = age($rr['dob'],$rr['timezone'],'')) != 0)
- $details .= ' ' . t('Age: ') . $years ;
- }
- if(strlen($rr['gender']))
- $details .= ' ' . t('Gender: ') . $rr['gender'];
+ $details .= $rr['locality'];
+ if(strlen($rr['region'])) {
+ if(strlen($rr['locality']))
+ $details .= ', ';
+ $details .= $rr['region'];
+ }
+ if(strlen($rr['country_name'])) {
+ if(strlen($details))
+ $details .= ', ';
+ $details .= $rr['country_name'];
+ }
+ if(strlen($rr['dob'])) {
+ if(($years = age($rr['dob'],$rr['timezone'],'')) != 0)
+ $details .= ' ' . t('Age: ') . $years ;
+ }
+ if(strlen($rr['gender']))
+ $details .= ' ' . t('Gender: ') . $rr['gender'];
- if($rr['page-flags'] == PAGE_NORMAL)
- $page_type = "Personal Profile";
- if($rr['page-flags'] == PAGE_SOAPBOX)
- $page_type = "Fan Page";
- if($rr['page-flags'] == PAGE_COMMUNITY)
- $page_type = "Community Forum";
- if($rr['page-flags'] == PAGE_FREELOVE)
- $page_type = "Open Forum";
- if($rr['page-flags'] == PAGE_PRVGROUP)
- $page_type = "Private Group";
+ $page_type = '';
- $profile = $rr;
+ $profile = $rr;
- if((x($profile,'address') == 1)
- || (x($profile,'locality') == 1)
- || (x($profile,'region') == 1)
- || (x($profile,'postal_code') == 1)
- || (x($profile,'country_name') == 1))
- $location = t('Location:');
+ if((x($profile,'address') == 1)
+ || (x($profile,'locality') == 1)
+ || (x($profile,'region') == 1)
+ || (x($profile,'postal_code') == 1)
+ || (x($profile,'country_name') == 1))
+ $location = t('Location:');
- $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
+ $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
- $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+ $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
- $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
-
- $about = ((x($profile,'about') == 1) ? t('About:') : False);
+ $about = ((x($profile,'about') == 1) ? t('About:') : False);
- $tpl = get_markup_template('directory_item.tpl');
- $entry = replace_macros($tpl,array(
- '$id' => $rr['id'],
- '$profile-link' => $profile_link,
- '$photo' => $a->get_cached_avatar_image($rr[$photo]),
- '$alt-text' => $rr['name'],
- '$name' => $rr['name'],
- '$details' => $pdesc . $details,
- '$page-type' => $page_type,
- '$profile' => $profile,
- '$location' => template_escape($location),
- '$gender' => $gender,
- '$pdesc' => $pdesc,
- '$marital' => $marital,
- '$homepage' => $homepage,
- '$about' => $about,
+ $entry = array(
+ 'id' => $rr['id'],
+ 'profile_link' => $profile_link,
+ 'photo' => $rr[$photo],
+ 'alttext' => $rr['channel_name'],
+ 'name' => $rr['channel_name'],
+ 'details' => $pdesc . $details,
+ 'profile' => $profile,
+ 'location' => $location,
+ 'gender' => $gender,
+ 'pdesc' => $pdesc,
+ 'marital' => $marital,
+ 'homepage' => $homepage,
+ 'about' => $about,
+
+ );
+
+ $arr = array('contact' => $rr, 'entry' => $entry);
+
+ call_hooks('directory_item', $arr);
+
+ unset($profile);
+ unset($location);
+
+ $entries[] = $entry;
+
+ }
+
+ logger('entries: ' . print_r($entries,true));
+
+ $o .= replace_macros($tpl, array(
+ '$search' => $search,
+ '$desc' => t('Find'),
+ '$finddsc' => t('Finding:'),
+ '$safetxt' => htmlspecialchars($search,ENT_QUOTES,'UTF-8'),
+ '$entries' => $entries,
+ '$dirlbl' => t('Directory'),
+ '$submit' => t('Find')
));
- $arr = array('contact' => $rr, 'entry' => $entry);
- call_hooks('directory_item', $arr);
-
- unset($profile);
- unset($location);
-
- $o .= $entry;
+ $o .= paginate($a);
}
- $o .= "
\r\n";
- $o .= paginate($a);
+ else
+ info( t("No entries (some entries may be hidden).") . EOL);
}
- else
- info( t("No entries \x28some entries may be hidden\x29.") . EOL);
return $o;
}
diff --git a/mod/ping.php b/mod/ping.php
index f32384952..b135ac6e3 100644
--- a/mod/ping.php
+++ b/mod/ping.php
@@ -158,7 +158,7 @@ function ping_init(&$a) {
$t1 = dba_timer();
$r = q("SELECT id, item_restrict, item_flags FROM item
- WHERE item_restrict = %d and ( item_flags & %d ) and uid = %d",
+ WHERE (item_restrict = %d) and ( item_flags & %d ) and uid = %d",
intval(ITEM_VISIBLE),
intval(ITEM_UNSEEN),
intval(local_user())
@@ -180,24 +180,15 @@ function ping_init(&$a) {
$t2 = dba_timer();
- $intros1 = q("SELECT `intro`.`id`, `intro`.`datetime`,
- `fcontact`.`name`, `fcontact`.`url`, `fcontact`.`photo`
- FROM `intro` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id`
- WHERE `intro`.`uid` = %d AND `intro`.`blocked` = 0 AND `intro`.`ignore` = 0 AND `intro`.`fid`!=0",
+ $intr = q("select count(abook_id) as total from abook where (abook_flags & %d) and abook_channel = %d",
+ intval(ABOOK_FLAG_PENDING),
intval(local_user())
);
$t3 = dba_timer();
- $intros2 = q("SELECT `intro`.`id`, `intro`.`datetime`,
- `contact`.`name`, `contact`.`url`, `contact`.`photo`
- FROM `intro` LEFT JOIN `contact` ON `intro`.`contact-id` = `contact`.`id`
- WHERE `intro`.`uid` = %d AND `intro`.`blocked` = 0 AND `intro`.`ignore` = 0 AND `intro`.`contact-id`!=0",
- intval(local_user())
- );
-
- $intros = count($intros1) + count($intros2);
- $result['intros'] = intval($intros);
+ if($intr)
+ $result['intros'] = intval($intr[0]['total']);
$t4 = dba_timer();
$channel = get_app()->get_channel();
diff --git a/mod/zfinger.php b/mod/zfinger.php
index e1afdeba4..b51bf7900 100644
--- a/mod/zfinger.php
+++ b/mod/zfinger.php
@@ -58,6 +58,9 @@ function zfinger_init(&$a) {
$id = $e['channel_id'];
+ $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true);
+
+
// This is for birthdays and keywords, but must check access permissions
// $r = q("select contact.*, profile.*
// from contact left join profile on contact.uid = profile.uid
@@ -86,6 +89,7 @@ function zfinger_init(&$a) {
$ret['name_updated'] = $e['xchan_name_date'];
$ret['target'] = $ztarget;
$ret['target_sig'] = $zsig;
+ $ret['searchable'] = $searchable;
// FIXME encrypt permissions when targeted so that only the target can view them, requires sending the pubkey and also checking that the target_sig is signed with that pubkey and isn't a forgery.
@@ -119,6 +123,20 @@ function zfinger_init(&$a) {
}
}
+ $ret['site'] = array();
+ $ret['site']['url'] = z_root();
+ $dirmode = get_config('system','directory_mode');
+ if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL))
+ $ret['site']['directory_mode'] = 'normal';
+ if($dirmode == DIRECTORY_MODE_PRIMARY)
+ $ret['site']['directory_mode'] = 'primary';
+ elseif($dirmode == DIRECTORY_MODE_SECONDARY)
+ $ret['site']['directory_mode'] = 'secondary';
+ elseif($dirmode == DIRECTORY_MODE_STANDALONE)
+ $ret['site']['directory_mode'] = 'standalone';
+ if($dirmode != DIRECTORY_MODE_NORMAL)
+ $ret['site']['directory_url'] = z_root() . '/dir';
+
json_return_and_die($ret);
}
\ No newline at end of file
diff --git a/version.inc b/version.inc
index bdbdd882b..94a1bafa8 100644
--- a/version.inc
+++ b/version.inc
@@ -1 +1 @@
-2012-12-18.173
+2012-12-19.174
diff --git a/view/css/mod_profile_photo.css b/view/css/mod_profile_photo.css
new file mode 100644
index 000000000..5540b5fae
--- /dev/null
+++ b/view/css/mod_profile_photo.css
@@ -0,0 +1,12 @@
+.form-label {
+ margin-bottom: 15px;
+ float: left;
+ width: 150px;
+}
+.form-input {
+ margin-bottom: 15px;
+}
+
+#profile-photo-submit-wrapper {
+ clear: both;
+}
\ No newline at end of file
diff --git a/view/tpl/directory_header.tpl b/view/tpl/directory_header.tpl
index 1f03540f2..e1def851b 100644
--- a/view/tpl/directory_header.tpl
+++ b/view/tpl/directory_header.tpl
@@ -1,16 +1,16 @@
-$sitedir
+$dirlbl
-$globaldir
-$admin
+{{ if $search }}
+$finddsc $safetxt
+{{ endif }}
-$finding
+{{for $entries as $entry}}
-
-
-
-
+{{ inc direntry.tpl }}{{ endinc }}
+
+{{ endfor }}
+
+
+
+
diff --git a/view/tpl/direntry.tpl b/view/tpl/direntry.tpl
new file mode 100644
index 000000000..e860da41c
--- /dev/null
+++ b/view/tpl/direntry.tpl
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
$entry.name
+
$entry.details
+
diff --git a/view/tpl/profile_photo.tpl b/view/tpl/profile_photo.tpl
index 04ee8f916..282e890c8 100644
--- a/view/tpl/profile_photo.tpl
+++ b/view/tpl/profile_photo.tpl
@@ -4,20 +4,23 @@
-$lbl_upfile
-
-
-$lbl_profiles
-
+$lbl_upfile
+
+
+
+$lbl_profiles
+
{{ for $profiles as $p }}
$p.name
{{ endfor }}
+
+