Merge remote-tracking branch 'upstream/master'
3
.gitignore
vendored
|
@ -21,3 +21,6 @@ report/
|
|||
.buildpath
|
||||
.externalToolBuilders
|
||||
.settings
|
||||
#ignore OSX .DS_Store files
|
||||
.DS_Store
|
||||
|
||||
|
|
10
.htaccess
|
@ -15,6 +15,16 @@ Deny from all
|
|||
# Also place auth information into REMOTE_USER for sites running
|
||||
# in CGI mode.
|
||||
|
||||
# If you have troubles or use VirtualDocumentRoot
|
||||
# uncomment this and set it to the path where your friendica installation is
|
||||
# i.e.:
|
||||
# Friendica url: http://some.example.com
|
||||
# RewriteBase /
|
||||
# Friendica url: http://some.example.com/friendica
|
||||
# RewriteBase /friendica/
|
||||
#
|
||||
#RewriteBase /
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteRule ^(.*)$ index.php?q=$1 [E=REMOTE_USER:%{HTTP:Authorization},L,QSA]
|
||||
|
|
|
@ -51,6 +51,10 @@ php.ini file [or see 'poormancron' in section 8]
|
|||
directory/path component in the URL) is preferred. This is REQUIRED if
|
||||
you wish to communicate with the Diaspora network.
|
||||
|
||||
|
||||
- For alternative server configurations (such as Nginx server and MariaDB
|
||||
database engine), refer to the wiki at https://github.com/friendica/friendica/wiki
|
||||
|
||||
2. Unpack the Friendica files into the root of your web server document area.
|
||||
|
||||
- If you copy the directory tree to your webserver, make sure
|
||||
|
|
2
README
|
@ -9,3 +9,5 @@ Welcome to the free social web.
|
|||
Friendica is a communications platform for integrated social communications utilising decentralised communications and linkage to several indie social projects - as well as popular mainstream providers.
|
||||
|
||||
Our mission is to free our friends and families from the clutches of data-harvesting corporations, and pave the way to a future where social communications are free and open and flow between alternate providers as easily as email does today.
|
||||
|
||||
Report issues at http://bugs.friendica.com/
|
189
boot.php
|
@ -8,11 +8,12 @@ require_once('include/datetime.php');
|
|||
require_once('include/pgettext.php');
|
||||
require_once('include/nav.php');
|
||||
require_once('include/cache.php');
|
||||
require_once('library/Mobile_Detect/Mobile_Detect.php');
|
||||
|
||||
define ( 'FRIENDICA_PLATFORM', 'Friendica');
|
||||
define ( 'FRIENDICA_VERSION', '3.0.1398' );
|
||||
define ( 'FRIENDICA_VERSION', '3.0.1516' );
|
||||
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
|
||||
define ( 'DB_UPDATE_VERSION', 1153 );
|
||||
define ( 'DB_UPDATE_VERSION', 1156 );
|
||||
|
||||
define ( 'EOL', "<br />\r\n" );
|
||||
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
|
||||
|
@ -191,6 +192,7 @@ define ( 'NOTIFY_SUGGEST', 0x0020 );
|
|||
define ( 'NOTIFY_PROFILE', 0x0040 );
|
||||
define ( 'NOTIFY_TAGSELF', 0x0080 );
|
||||
define ( 'NOTIFY_TAGSHARE', 0x0100 );
|
||||
define ( 'NOTIFY_POKE', 0x0200 );
|
||||
|
||||
define ( 'NOTIFY_SYSTEM', 0x8000 );
|
||||
|
||||
|
@ -215,7 +217,7 @@ define ( 'TERM_OBJ_PHOTO', 2 );
|
|||
* various namespaces we may need to parse
|
||||
*/
|
||||
|
||||
define ( 'NAMESPACE_ZOT', 'http://purl.org/macgirvin/zot' );
|
||||
define ( 'NAMESPACE_ZOT', 'http://purl.org/zot' );
|
||||
define ( 'NAMESPACE_DFRN' , 'http://purl.org/macgirvin/dfrn/1.0' );
|
||||
define ( 'NAMESPACE_THREAD' , 'http://purl.org/syndication/thread/1.0' );
|
||||
define ( 'NAMESPACE_TOMB' , 'http://purl.org/atompub/tombstones/1.0' );
|
||||
|
@ -250,6 +252,9 @@ define ( 'ACTIVITY_UPDATE', NAMESPACE_ACTIVITY_SCHEMA . 'update' );
|
|||
define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' );
|
||||
define ( 'ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite' );
|
||||
|
||||
define ( 'ACTIVITY_POKE', NAMESPACE_ZOT . '/activity/poke' );
|
||||
define ( 'ACTIVITY_MOOD', NAMESPACE_ZOT . '/activity/mood' );
|
||||
|
||||
define ( 'ACTIVITY_OBJ_COMMENT', NAMESPACE_ACTIVITY_SCHEMA . 'comment' );
|
||||
define ( 'ACTIVITY_OBJ_NOTE', NAMESPACE_ACTIVITY_SCHEMA . 'note' );
|
||||
define ( 'ACTIVITY_OBJ_PERSON', NAMESPACE_ACTIVITY_SCHEMA . 'person' );
|
||||
|
@ -278,7 +283,9 @@ define ( 'GRAVITY_COMMENT', 6);
|
|||
*/
|
||||
|
||||
function startup() {
|
||||
|
||||
error_reporting(E_ERROR | E_WARNING | E_PARSE);
|
||||
|
||||
set_time_limit(0);
|
||||
|
||||
// This has to be quite large to deal with embedded private photos
|
||||
|
@ -345,11 +352,26 @@ if(! class_exists('App')) {
|
|||
public $plugins;
|
||||
public $apps = array();
|
||||
public $identities;
|
||||
public $is_mobile;
|
||||
public $is_tablet;
|
||||
|
||||
public $nav_sel;
|
||||
|
||||
public $category;
|
||||
|
||||
// Allow themes to control internal parameters
|
||||
// by changing App values in theme.php
|
||||
//
|
||||
// Possibly should make these part of the plugin
|
||||
// system, but it seems like overkill to invoke
|
||||
// all the plugin machinery just to change a couple
|
||||
// of values
|
||||
public $sourcename = '';
|
||||
public $videowidth = 425;
|
||||
public $videoheight = 350;
|
||||
public $force_max_items = 0;
|
||||
public $theme_thread_allow = true;
|
||||
|
||||
private $scheme;
|
||||
private $hostname;
|
||||
private $baseurl;
|
||||
|
@ -383,7 +405,6 @@ if(! class_exists('App')) {
|
|||
elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
|
||||
$this->scheme = 'https';
|
||||
|
||||
|
||||
if(x($_SERVER,'SERVER_NAME')) {
|
||||
$this->hostname = $_SERVER['SERVER_NAME'];
|
||||
|
||||
|
@ -413,6 +434,7 @@ if(! class_exists('App')) {
|
|||
. 'include' . PATH_SEPARATOR
|
||||
. 'library' . PATH_SEPARATOR
|
||||
. 'library/phpsec' . PATH_SEPARATOR
|
||||
. 'library/langdet' . PATH_SEPARATOR
|
||||
. '.' );
|
||||
|
||||
if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
|
||||
|
@ -453,6 +475,7 @@ if(! class_exists('App')) {
|
|||
$this->argc = count($this->argv);
|
||||
if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
|
||||
$this->module = str_replace(".", "_", $this->argv[0]);
|
||||
$this->module = str_replace("-", "_", $this->module);
|
||||
}
|
||||
else {
|
||||
$this->argc = 1;
|
||||
|
@ -460,16 +483,6 @@ if(! class_exists('App')) {
|
|||
$this->module = 'home';
|
||||
}
|
||||
|
||||
/**
|
||||
* Special handling for the webfinger/lrdd host XRD file
|
||||
*/
|
||||
|
||||
if($this->cmd === '.well-known/host-meta') {
|
||||
$this->argc = 1;
|
||||
$this->argv = array('hostxrd');
|
||||
$this->module = 'hostxrd';
|
||||
}
|
||||
|
||||
/**
|
||||
* See if there is any page number information, and initialise
|
||||
* pagination
|
||||
|
@ -481,6 +494,14 @@ if(! class_exists('App')) {
|
|||
if($this->pager['start'] < 0)
|
||||
$this->pager['start'] = 0;
|
||||
$this->pager['total'] = 0;
|
||||
|
||||
/**
|
||||
* Detect mobile devices
|
||||
*/
|
||||
|
||||
$mobile_detect = new Mobile_Detect();
|
||||
$this->is_mobile = $mobile_detect->isMobile();
|
||||
$this->is_tablet = $mobile_detect->isTablet();
|
||||
}
|
||||
|
||||
function get_baseurl($ssl = false) {
|
||||
|
@ -555,7 +576,7 @@ if(! class_exists('App')) {
|
|||
$interval = 40000;
|
||||
|
||||
$this->page['title'] = $this->config['sitename'];
|
||||
$tpl = file_get_contents('view/head.tpl');
|
||||
$tpl = get_markup_template('head.tpl');
|
||||
$this->page['htmlhead'] = replace_macros($tpl,array(
|
||||
'$baseurl' => $this->get_baseurl(), // FIXME for z_path!!!!
|
||||
'$local_user' => local_user(),
|
||||
|
@ -568,6 +589,13 @@ if(! class_exists('App')) {
|
|||
));
|
||||
}
|
||||
|
||||
function init_page_end() {
|
||||
$tpl = get_markup_template('end.tpl');
|
||||
$this->page['end'] = replace_macros($tpl,array(
|
||||
'$baseurl' => $this->get_baseurl() // FIXME for z_path!!!!
|
||||
));
|
||||
}
|
||||
|
||||
function set_curl_code($code) {
|
||||
$this->curl_code = $code;
|
||||
}
|
||||
|
@ -710,9 +738,13 @@ if(! function_exists('check_config')) {
|
|||
// than the currently visited url, store the current value accordingly.
|
||||
// "Radically different" ignores common variations such as http vs https
|
||||
// and www.example.com vs example.com.
|
||||
// We will only change the url to an ip address if there is no existing setting
|
||||
|
||||
if((! x($url)) || (! link_compare($url,$a->get_baseurl())))
|
||||
if(! x($url))
|
||||
$url = set_config('system','url',$a->get_baseurl());
|
||||
if((! link_compare($url,$a->get_baseurl())) && (! preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$a->get_hostname)))
|
||||
$url = set_config('system','url',$a->get_baseurl());
|
||||
|
||||
|
||||
if($build != DB_UPDATE_VERSION) {
|
||||
$stored = intval($build);
|
||||
|
@ -743,9 +775,10 @@ if(! function_exists('check_config')) {
|
|||
// If the update fails or times-out completely you may need to
|
||||
// delete the config entry to try again.
|
||||
|
||||
if(get_config('database','update_' . $x))
|
||||
$t = get_config('database','update_' . $x);
|
||||
if($t !== false)
|
||||
break;
|
||||
set_config('database','update_' . $x, '1');
|
||||
set_config('database','update_' . $x, time());
|
||||
|
||||
// call the specific update
|
||||
|
||||
|
@ -768,13 +801,14 @@ if(! function_exists('check_config')) {
|
|||
. 'Content-transfer-encoding: 8bit' );
|
||||
//try the logger
|
||||
logger('CRITICAL: Update Failed: '. $x);
|
||||
break;
|
||||
}
|
||||
else
|
||||
else {
|
||||
set_config('database','update_' . $x, 'success');
|
||||
|
||||
set_config('system','build', $x + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
set_config('system','build', DB_UPDATE_VERSION);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -873,6 +907,10 @@ if(! function_exists('login')) {
|
|||
$tpl = get_markup_template("logout.tpl");
|
||||
}
|
||||
else {
|
||||
$a->page['htmlhead'] .= replace_macros(get_markup_template("login_head.tpl"),array(
|
||||
'$baseurl' => $a->get_baseurl(true)
|
||||
));
|
||||
|
||||
$tpl = get_markup_template("login.tpl");
|
||||
$_SESSION['return_url'] = $a->query_string;
|
||||
}
|
||||
|
@ -998,11 +1036,29 @@ if(! function_exists('get_max_import_size')) {
|
|||
|
||||
if(! function_exists('profile_load')) {
|
||||
function profile_load(&$a, $nickname, $profile = 0) {
|
||||
if(remote_user()) {
|
||||
|
||||
$user = q("select uid from user where nickname = '%s' limit 1",
|
||||
dbesc($nickname)
|
||||
);
|
||||
|
||||
if(! ($user && count($user))) {
|
||||
logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
|
||||
notice( t('Requested account is not available.') . EOL );
|
||||
$a->error = 404;
|
||||
return;
|
||||
}
|
||||
|
||||
if(remote_user() && count($_SESSION['remote'])) {
|
||||
foreach($_SESSION['remote'] as $visitor) {
|
||||
if($visitor['uid'] == $user[0]['uid']) {
|
||||
$r = q("SELECT `profile-id` FROM `contact` WHERE `id` = %d LIMIT 1",
|
||||
intval($_SESSION['visitor_id']));
|
||||
intval($visitor['cid'])
|
||||
);
|
||||
if(count($r))
|
||||
$profile = $r[0]['profile-id'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$r = null;
|
||||
|
@ -1043,9 +1099,12 @@ if(! function_exists('profile_load')) {
|
|||
|
||||
$a->profile = $r[0];
|
||||
|
||||
$a->profile['mobile-theme'] = get_pconfig($profile_uid, 'system', 'mobile_theme');
|
||||
|
||||
|
||||
$a->page['title'] = $a->profile['name'] . " @ " . $a->config['sitename'];
|
||||
$_SESSION['theme'] = $a->profile['theme'];
|
||||
$_SESSION['mobile-theme'] = $a->profile['mobile-theme'];
|
||||
|
||||
/**
|
||||
* load/reload current theme info
|
||||
|
@ -1117,8 +1176,14 @@ if(! function_exists('profile_sidebar')) {
|
|||
|
||||
// don't show connect link to authenticated visitors either
|
||||
|
||||
if((remote_user()) && ($_SESSION['visitor_visiting'] == $profile['uid']))
|
||||
$connect = False;
|
||||
if(remote_user() && count($_SESSION['remote'])) {
|
||||
foreach($_SESSION['remote'] as $visitor) {
|
||||
if($visitor['uid'] == $profile['uid']) {
|
||||
$connect = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(get_my_url() && $profile['unkmail'])
|
||||
$wallmessage = t('Message');
|
||||
|
@ -1234,9 +1299,15 @@ if(! function_exists('get_birthdays')) {
|
|||
$a = get_app();
|
||||
$o = '';
|
||||
|
||||
if(! local_user())
|
||||
if(! local_user() || $a->is_mobile || $a->is_tablet)
|
||||
return $o;
|
||||
|
||||
// $mobile_detect = new Mobile_Detect();
|
||||
// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
|
||||
|
||||
// if($is_mobile)
|
||||
// return $o;
|
||||
|
||||
$bd_format = t('g A l F d') ; // 8 AM Friday January 18
|
||||
$bd_short = t('F d');
|
||||
|
||||
|
@ -1313,9 +1384,16 @@ if(! function_exists('get_events')) {
|
|||
|
||||
$a = get_app();
|
||||
|
||||
if(! local_user())
|
||||
if(! local_user() || $a->is_mobile || $a->is_tablet)
|
||||
return $o;
|
||||
|
||||
|
||||
// $mobile_detect = new Mobile_Detect();
|
||||
// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
|
||||
|
||||
// if($is_mobile)
|
||||
// return $o;
|
||||
|
||||
$bd_format = t('g A l F d') ; // 8 AM Friday January 18
|
||||
$bd_short = t('F d');
|
||||
|
||||
|
@ -1427,7 +1505,10 @@ if(! function_exists('proc_run')) {
|
|||
$args[$x] = escapeshellarg($args[$x]);
|
||||
|
||||
$cmdline = implode($args," ");
|
||||
proc_close(proc_open($cmdline." &",array(),$foo));
|
||||
if(get_config('system','proc_windows'))
|
||||
proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo,dirname(__FILE__)));
|
||||
else
|
||||
proc_close(proc_open($cmdline." &",array(),$foo,dirname(__FILE__)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1437,8 +1518,30 @@ if(! function_exists('current_theme')) {
|
|||
|
||||
$a = get_app();
|
||||
|
||||
// $mobile_detect = new Mobile_Detect();
|
||||
// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
|
||||
$is_mobile = $a->is_mobile || $a->is_tablet;
|
||||
|
||||
if($is_mobile) {
|
||||
if(isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
|
||||
$system_theme = '';
|
||||
$theme_name = '';
|
||||
}
|
||||
else {
|
||||
$system_theme = ((isset($a->config['system']['mobile-theme'])) ? $a->config['system']['mobile-theme'] : '');
|
||||
$theme_name = ((isset($_SESSION) && x($_SESSION,'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme);
|
||||
|
||||
if($theme_name === '---') {
|
||||
// user has selected to have the mobile theme be the same as the normal one
|
||||
$system_theme = '';
|
||||
$theme_name = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!$is_mobile || ($system_theme === '' && $theme_name === '')) {
|
||||
$system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
|
||||
$theme_name = ((isset($_SESSION) && x($_SESSION,'theme')) ? $_SESSION['theme'] : $system_theme);
|
||||
}
|
||||
|
||||
if($theme_name &&
|
||||
(file_exists('view/theme/' . $theme_name . '/style.css') ||
|
||||
|
@ -1575,18 +1678,21 @@ if(! function_exists('profile_tabs')){
|
|||
'url' => $url,
|
||||
'sel' => ((!isset($tab)&&$a->argv[0]=='profile')?'active':''),
|
||||
'title' => t('Status Messages and Posts'),
|
||||
'id' => 'status-tab',
|
||||
),
|
||||
array(
|
||||
'label' => t('Profile'),
|
||||
'url' => $url.'/?tab=profile',
|
||||
'sel' => ((isset($tab) && $tab=='profile')?'active':''),
|
||||
'title' => t('Profile Details'),
|
||||
'id' => 'profile-tab',
|
||||
),
|
||||
array(
|
||||
'label' => t('Photos'),
|
||||
'url' => $a->get_baseurl() . '/photos/' . $nickname,
|
||||
'sel' => ((!isset($tab)&&$a->argv[0]=='photos')?'active':''),
|
||||
'title' => t('Photo Albums'),
|
||||
'id' => 'photo-tab',
|
||||
),
|
||||
);
|
||||
|
||||
|
@ -1596,12 +1702,14 @@ if(! function_exists('profile_tabs')){
|
|||
'url' => $a->get_baseurl() . '/events',
|
||||
'sel' =>((!isset($tab)&&$a->argv[0]=='events')?'active':''),
|
||||
'title' => t('Events and Calendar'),
|
||||
'id' => 'events-tab',
|
||||
);
|
||||
$tabs[] = array(
|
||||
'label' => t('Personal Notes'),
|
||||
'url' => $a->get_baseurl() . '/notes',
|
||||
'sel' =>((!isset($tab)&&$a->argv[0]=='notes')?'active':''),
|
||||
'title' => t('Only You Can See This'),
|
||||
'id' => 'notes-tab',
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1670,3 +1778,28 @@ function build_querystring($params, $name=null) {
|
|||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the complete URL of the current page, e.g.: http(s)://something.com/network
|
||||
*
|
||||
* Taken from http://webcheatsheet.com/php/get_current_page_url.php
|
||||
*/
|
||||
function curPageURL() {
|
||||
$pageURL = 'http';
|
||||
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
|
||||
$pageURL .= "://";
|
||||
if ($_SERVER["SERVER_PORT"] != "80" && $_SERVER["SERVER_PORT"] != "443") {
|
||||
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
|
||||
} else {
|
||||
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
|
||||
}
|
||||
return $pageURL;
|
||||
}
|
||||
|
||||
function random_digits($digits) {
|
||||
$rn = '';
|
||||
for($i = 0; $i < $digits; $i++) {
|
||||
$rn .= rand(0,9);
|
||||
}
|
||||
return $rn;
|
||||
}
|
||||
|
|
14
database.sql
|
@ -260,6 +260,7 @@ CREATE TABLE IF NOT EXISTS `event` (
|
|||
`type` char(255) NOT NULL,
|
||||
`nofinish` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`adjust` tinyint(1) NOT NULL DEFAULT '1',
|
||||
`ignore` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`allow_cid` mediumtext NOT NULL,
|
||||
`allow_gid` mediumtext NOT NULL,
|
||||
`deny_cid` mediumtext NOT NULL,
|
||||
|
@ -271,7 +272,8 @@ CREATE TABLE IF NOT EXISTS `event` (
|
|||
KEY `type` ( `type` ),
|
||||
KEY `start` ( `start` ),
|
||||
KEY `finish` ( `finish` ),
|
||||
KEY `adjust` ( `adjust` )
|
||||
KEY `adjust` ( `adjust` ),
|
||||
KEY `ignore` ( `ignore` )
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
@ -456,6 +458,7 @@ CREATE TABLE IF NOT EXISTS `hook` (
|
|||
`hook` char(255) NOT NULL,
|
||||
`file` char(255) NOT NULL,
|
||||
`function` char(255) NOT NULL,
|
||||
`priority` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
|
@ -569,6 +572,9 @@ CREATE TABLE IF NOT EXISTS `item` (
|
|||
KEY `moderated` (`moderated`),
|
||||
KEY `spam` (`spam`),
|
||||
KEY `author-name` (`author-name`),
|
||||
KEY `uid_commented` (`uid`, `commented`),
|
||||
KEY `uid_created` (`uid`, `created`),
|
||||
KEY `uid_unseen` (`uid`, `unseen`),
|
||||
FULLTEXT KEY `title` (`title`),
|
||||
FULLTEXT KEY `body` (`body`),
|
||||
FULLTEXT KEY `allow_cid` (`allow_cid`),
|
||||
|
@ -586,11 +592,13 @@ CREATE TABLE IF NOT EXISTS `item` (
|
|||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `item_id` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`iid` int(11) NOT NULL,
|
||||
`uid` int(11) NOT NULL,
|
||||
`sid` char(255) NOT NULL,
|
||||
`service` char(255) NOT NULL,
|
||||
PRIMARY KEY (`iid`),
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `iid` (`iid`),
|
||||
KEY `uid` (`uid`),
|
||||
KEY `sid` (`sid`),
|
||||
KEY `service` (`service`)
|
||||
|
@ -602,7 +610,7 @@ CREATE TABLE IF NOT EXISTS `item_id` (
|
|||
-- Table structure for table `locks`
|
||||
--
|
||||
|
||||
CREATE TABLE `locks` (
|
||||
CREATE TABLE IF NOT EXISTS `locks` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` char(128) NOT NULL,
|
||||
`locked` tinyint(1) NOT NULL DEFAULT '0',
|
||||
|
|
|
@ -6,6 +6,8 @@ Groups and Privacy
|
|||
|
||||
Groups are merely collections of friends. But Friendica uses these to unlock some very powerful features.
|
||||
|
||||
**Setting Up Groups**
|
||||
|
||||
To create a group, visit your Friendica "Contacts" page and select "Create a new group". Give the group a name.
|
||||
|
||||
This brings you to a page where you can select the group members.
|
||||
|
@ -14,6 +16,8 @@ You will have two boxes on this page. The top box is the roster of current group
|
|||
|
||||
If you click on a photo of a person who isn't in the group, they will be put into the group. If you click on a photo of a person who is in the group, they will be removed from it.
|
||||
|
||||
**Access Control**
|
||||
|
||||
Once you have created a group, you may use it in any access control list. This is the little lock icon beneath the status update box on your home page. If you click this you can select who can see and who can *not* see the post you are about to make. These can be individual people or groups.
|
||||
|
||||
On your "Network" page you will find posts and conversation from everybody in your network. You may select an individual group on this page to show conversations pertaining only to members of that group.
|
||||
|
@ -22,28 +26,40 @@ But wait, there's more...
|
|||
|
||||
If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles.
|
||||
|
||||
**Default Post Privacy**
|
||||
|
||||
By default, Friendica assumes that you want all of your posts to be private. Therefore, when you sign up, Friendica creates a group for you that it will automatically add all of your contacts to. All of your posts are restricted to that group by default.
|
||||
|
||||
Note that this behavior can be overridden by your site admin, in which case your posts will be "public" (i.e. visible to the entire Internet) by default.
|
||||
|
||||
If you want your posts to be "public" by default, you can change your default post permissions on your Settings page. You also have the option there to change which groups you post to by default, or to change which group your new contacts get placed into by default.
|
||||
|
||||
**Privacy Concerns To Be Aware Of**
|
||||
|
||||
These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others.
|
||||
|
||||
This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends.
|
||||
|
||||
But it isn't as clear cut when dealing with status.net, identi.ca and other network providers. You are encouraged to be **very** cautious when other network members are in a group because it's entirely possible for your private messages to end up in a public newsfeed. If you look at the Contact Edit page for any person, we will tell you whether or not they are members of an insecure network where you should exercise caution.
|
||||
|
||||
On your "Settings" page, you may create a set of default permissions which apply to every post that you create.
|
||||
|
||||
Once you have created a post, you can not change the permissions assigned. Within seconds it has been delivered to lots of people - and perhaps everybody it was addressed to. If you mistakenly created a message and wish you could take it back, the best you can do is to delete it. We will send out a delete notification to everybody who received the message - and this should wipe out the message with the same speed it was initially propagated. In most cases it will be completely wiped from the Internet - in under a minute. Again, this applies to Friendica networks. Once a message spreads to other networks, it may not be removed quickly and in some cases it may not be removed at all.
|
||||
|
||||
In case you haven't yet figured this out, we are encouraging you to encourage your friends to use Friendica - because all these privacy features work much better within a privacy-aware network. Many of the other social networks Friendica can connect to have no privacy controls.
|
||||
|
||||
|
||||
Profiles, Privacy, and Photos
|
||||
Profiles, Photos, and Privacy
|
||||
=============================
|
||||
|
||||
The decentralised nature of Friendica (many websites exchanging information rather than one website which controls everything) has some implications with privacy as it relates to people on other sites. There are things you should be aware of, so you can decide best how to interact privately.
|
||||
|
||||
**Photos**
|
||||
|
||||
Sharing photos privately is a problem. We can only share them __privately__ with Friendica members. In order to share with other people, we need to prove who they are. We can prove the identity of Friendica members, as we have a mechanism to do so. Your friends on other networks will be blocked from viewing these private photos because we cannot prove that they should be allowed to see them.
|
||||
|
||||
Our developers are working on solutions to allow access to your friends - no matter what network they are on. However we take privacy seriously and don't behave like some networks that __pretend__ your photos are private, but make them available to others without proof of identity.
|
||||
|
||||
**Profiles**
|
||||
|
||||
Your profile and "wall" may also be visited by your friends from other networks, and you can block access to these by web visitors that Friendica doesn't know. Be aware that this could include some of your friends on other networks.
|
||||
|
||||
This may produce undesired results when posting a long status message to (for instance) Twitter and even Facebook. When Friendica sends a post to these networks which exceeds the service length limit, we truncate it and provide a link to the original. The original is a link back to your Friendica profile. As Friendica cannot prove who they are, it may not be possible for these people to view your post in full.
|
||||
|
|
|
@ -6,6 +6,8 @@ Friendica Documentation and Resources
|
|||
|
||||
* [Account Basics](help/Account-Basics)
|
||||
* [New User Quick Start](help/guide)
|
||||
* [Creating posts](help/Text_editor)
|
||||
* [Comment, sort and delete posts](help/Text_comment)
|
||||
* [Profiles](help/Profiles)
|
||||
* [Connectors](help/Connectors)
|
||||
* [Making Friends](help/Making-Friends)
|
||||
|
|
|
@ -100,20 +100,17 @@ b. The url should be your site URL with a trailing slash.
|
|||
|
||||
You **may** be required to provide a privacy and/or terms of service URL.
|
||||
|
||||
c. Set the following values in your .htconfig.php file
|
||||
|
||||
```
|
||||
$a->config['facebook']['appid'] = 'xxxxxxxxxxx';
|
||||
$a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
|
||||
```
|
||||
|
||||
Replace with the settings Facebook gives you.
|
||||
|
||||
d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
|
||||
c. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
|
||||
to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com.
|
||||
|
||||
d. Install the Facebook plugin on your Friendica site at 'admin/plugins'. You should then see a link for Facebook under 'Plugin Features' on the sidebar of the admin panel. Select that.
|
||||
|
||||
On Friendica, visit the Facebook Settings section of the "Settings->Connector Settings" page. And click 'Install Facebook Connector'.
|
||||
e. Enter the App-ID and App Secret that Facebook gave you. Change any other settings as desired.
|
||||
|
||||
|
||||
On Friendica, each member who wishes to use the Facebook connector should visit the Facebook Settings section of their "Settings->Connector Settings" page, and click 'Install Facebook Connector'.
|
||||
|
||||
Choose the appropriate settings for your usage and privacy requirements.
|
||||
|
||||
This will ask you to login to Facebook and grant permission to the
|
||||
plugin to do its stuff. Allow it to do so.
|
||||
|
|
44
doc/Text_comment.md
Normal file
|
@ -0,0 +1,44 @@
|
|||
Comment, sort and delete posts
|
||||
==============
|
||||
|
||||
* [Home](help)
|
||||
|
||||
Here you can find an overview of the different ways to comment and sort existing posts. <span style="color: red;">Attention: we've used the <b>"diabook"</b> theme. If you're using another theme, some of the icons may be different.</span>
|
||||
|
||||
<img src="doc/img/diabook.png" width="308" height="42" alt="diabook" >
|
||||
|
||||
<i>The different icons</i>
|
||||
|
||||
<img src="doc/img/post_thumbs_up.png" width="27" height="32" alt="post_thumbs_up.png" align="left" style="padding-bottom: 10px;"> This symbol is used to indicate that you like the post. Click it twice to undo your choice.<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_thumbs_down.png" width="27" height="32" alt="post_thumbs_down.png" align="left" style="padding-bottom: 10px;"> This symbol is used to indicate that you <b>dislike</b> the post. Click it twice to undo your choice.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_share.png" width="27" height="32" alt="post_share.png" align="left" style="padding-bottom: 10px;"> This symbol is used to share a post. A copy of this post will automatically appear in your status editor and add a link to the original post.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_mark.png" width="27" height="32" alt="post_mark.png" align="left" style="padding-bottom: 10px;"> This symbol is used to mark a post. Marked posts will appear on your network page at the "starred" tab (from "star"). Click it twice to undo your choice.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_tag.png" width="27" height="41" alt="post_tag.png" align="left" style="padding-bottom: 10px;"> This symbol is used to tag a post with a self-chosen keyword. When you click at the word, you'll get a list of all posts with this tag. Attention: you can't delete the tag once you've set one.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_categorize.png" width="27" height="32" alt="post_categorize.png" align="left" style="padding-bottom: 20px;"> This symbol is used to categorize posts. Choose an existing folder or create a new one. You'll find the created folder on your network page under the "saved folders" tab.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_delete.png" width="27" height="32" alt="post_delete.png" align="left"> This symbol is used to delete your own post or to remove a post of another person from your stream.
|
||||
<P style="clear: both;"></p>
|
||||
|
||||
<img src="doc/img/post_choose.png" width="27" height="32" alt="post_choose.png" align="left"> This symbol is used to choose more than one post to delete in a single step. After selecting all posts, go to the end of the page and click "Delete Selected Items".<P style="clear: both;"></p>
|
||||
|
||||
**Symbols of other themes**
|
||||
|
||||
Darkbubble <img src="doc/img/darkbubble.png" alt="darkbubble.png" style="padding-left: 20px; vertical-align:middle;">
|
||||
|
||||
Darkzero <img src="doc/img/darkzero.png" alt="darkzero.png" style="padding-left: 35px; vertical-align:middle;">
|
||||
|
||||
<span style="padding-left: 10px; font-style:italic;">(incl. more "zero"-themes, slackr, comix, easterbunny, facepark)</span>
|
||||
|
||||
Dispy <img src="doc/img/dispy.png" alt="dispy.png" style="padding-left: 57px; vertical-align:middle;"> <i>(incl. smoothly, testbubble)</i>
|
||||
|
||||
Frost Mobile <img src="doc/img/frost.png" alt="frost.png" style="padding-left: 16px; vertical-align:middle;">
|
40
doc/Text_editor.md
Normal file
|
@ -0,0 +1,40 @@
|
|||
Creating posts
|
||||
=================
|
||||
|
||||
* [Home](help)
|
||||
|
||||
Here you can find an overview of the different ways to create and edit your post. <span style="color: red;">Attention: we've used the <b>"diabook"</b> theme. If you're using another theme, some of the icons may be different.</span>
|
||||
|
||||
<img src="doc/img/friendica_editor.png" width="538" height="218" alt="editor">
|
||||
|
||||
<i>The different iconss</i>
|
||||
|
||||
<img src="doc/img/camera.png" width="44" height="33" alt="editor" align="left" style="padding-bottom: 20px;"> This symbol is used to upload a picture from your computer. If you only want to add an adress (url), you can also use the "tree" icon at the upper part of the editor. After selecting an image, you'll see a thumbnail in the editor.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/paper_clip.png" width="44" height="33" alt="paper_clip" align="left"> This symbol is used to add files from your computer. There'll be no preview of the content.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/chain.png" width="44" height="33" alt="chain" align="left"> This symbol is used to add a web address (url). You'll see a short preview of the website.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/video.png" width="44" height="33" alt="video" align="left"> This symbol is used to add a web address (url) of a video file. You'll see a small preview of the video.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/mic.png" width="44" height="33" alt="mic" align="left"> This symbol is used to add a web address (url) of an audio file. You'll see a player in your completed post.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/globe.png" width="44" height="33" alt="globe" align="left"> This symbol is used to add your geographic location. This location will be added into a Google Maps search. That's why a note like "New York" or "10004" is already enough.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
**Symbols of other themes**
|
||||
|
||||
Cleanzero <img src="doc/img/editor_zero.png" alt="cleanzero.png" style="padding-left: 20px; vertical-align:middle;">
|
||||
|
||||
<span style="padding-left: 10px; font-style:italic;">(incl. more "zero"-themes, comix, easterbunny, facepark, slackr </span>
|
||||
|
||||
Darkbubble <img src="doc/img/editor_darkbubble.png" alt="darkbubble.png" style="padding-left: 14px; vertical-align:middle;"> <i>(inkl. smoothly, testbubble)</i>
|
||||
|
||||
Frost <img src="doc/img/editor_frost.png" alt="frost.png" style="padding-left: 42px; vertical-align:middle;">
|
||||
|
||||
Vier <img src="doc/img/editor_vier.png" alt="vier.png" style="padding-left: 44px; vertical-align:middle;"> <i>(inkl. dispy)</i>
|
77
doc/de/Account-Basics.md
Normal file
|
@ -0,0 +1,77 @@
|
|||
Account - Basics
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
|
||||
**Registrierung**
|
||||
|
||||
Nicht alle Friendica-Seiten bieten eine freie Registrierung. Wenn die Registrierung erlaubt ist, zeigt sich sofort ein "Registrieren"-Link unter dem Login-Feld auf der Startseite. Ein Klick auf diesen Link führt zur Registrierungsseite. Die Stärke unseres Netzwerks ist, dass viele verschiedene Seiten komplett kompatible zueinander sind. Wenn die Seite, die du besuchst, eine Registrierung nicht erlaubt oder wenn du glaubst, dass dir eine andere Seite möglicherweise besser gefällt, dann kannst du hier eine <a href="http://dir.friendica.com/siteinfo">Liste von öffentlichen Servern</a> finden und die Seite suchen, die zu deinen Anforderungen passt.
|
||||
|
||||
Wenn du deinen eigenen Server aufsetzen willst, kannst du das ebenfalls machen. Besuche <a href="http://friendica.com/download">die Friendica-Webseite</a>, um den Code mit den Installationsanleitungen herunterzuladen. Es ist ein einfacher Installationsprozess, den jeder mit ein wenig Erfahrungen im Webseiten-Hosting oder mit grundlegenden Linux-Erfahrungen einfach handhaben kann.
|
||||
|
||||
|
||||
*OpenID*
|
||||
|
||||
Das erste Feld auf der Registrierungsseite ist für eine OpenID-Adresse. Wenn du keine OpenID-Adresse hast oder nicht wünschst, diese zu nutzen, dann lasse das Feld frei. Wenn du einen OpenID-Account hast und diesen nutzen willst, gib die Adresse in das Feld ein und klicke auf "Registrieren". Friendica wird versuchen, so viele Informationen wie möglich von deinem OpenID-Provider zu übernehmen, um diese in dein Profil auf dieser Seite einzutragen.
|
||||
|
||||
|
||||
*Dein vollständiger Name*
|
||||
|
||||
Bitte trage deinen vollständigen Namen **so ein, wie du ihn im System anzeigen lassen willst**. Viele Leute nutzen ihren richtigen Namen hierfür, allerdings besteht für dich keine Pflicht, das auch so zu machen.
|
||||
|
||||
|
||||
*Email-Adresse*
|
||||
|
||||
Bitte trage eine richtige Email-Adresse ein. Deine Email-Adresse wird **niemals** veröffentlicht. Wir benötigen diese, um dir Account-Informationen und die Login-Daten zu schicken. Du erhältst zudem von Zeit zu Zeit Benachrichtigungen über eingegangene Nachrichten oder Punkte, die deine Aufmerksamkeit benötigen. Du hast aber auch die Möglichkeit, diese Nachrichten in deinen Account-Einstellungen komplett abzuschalten. Du musst nicht deine Haupt-Email-Adresse sein, jedoch wird eine funktionierende Adresse benötigt. Ohne dieses kannst du weder dein Initialpasswort erhalten, noch dein Passwort zurücksetzen. Dies ist die einzige persönliche Information, die korrekt sein muss.
|
||||
|
||||
|
||||
*Spitzname/Nickname*
|
||||
|
||||
Der Spitzname wird benötigt, um eine Webadresse für viele deiner persönlichen Seiten zu erstellen. Auch wird dieser wie eine Email-Adresse genutzt, wenn eine Verbindung zu anderen Personen hergestellt werden soll. Durch die Art, wie der Spitzname genutzt wird, gibt es bestimmte Einschränkungen. Er darf nur US-ASCII-Textzeichen und Nummern enthalten und er muss zudem mit einem Buchstaben beginnen. Er muss außerdem einzigartig im System sein. Dieser Spitzname wird an vielen Stellen genutzt, um deinen Account zu identifizieren, und kann daher später nicht mehr geändert werden.
|
||||
|
||||
|
||||
*Verzeichnis-Eintrag*
|
||||
|
||||
Das Registrierungsformular erlaubt es dir, direkt auszuwählen, ob du im Onlineverzeichnis aufgelistet wirst oder nicht. Das ist wie ein Telefonbuch und du kannst entscheiden, nicht aufgeführt zu werden. Wir bitten dich, "Ja" zu wählen, so dass dich andere Leute (Freunde, Familie etc.) finden können. Wenn du "Nein" wählst, wirst du hauptsächlich unsichtbar sein und nur wenige Möglichkeiten zur Interaktion haben. Was auch immer du wählst, kann jederzeit nach dem Login in deinen Account-Einstellungen geändert werden.
|
||||
|
||||
|
||||
*Registrierung*
|
||||
|
||||
Sobald du die nötigen Informationen eingegeben hast, klicke auf "Registrieren". Eine Email wird an die hinterlegte Email-Adresse geschickt. Bitte prüfe den Posteingang (inkl. dem Spam-Ordner) für die Registrierungsdetails und dein Initialpasswort.
|
||||
|
||||
|
||||
**Login-Seite**
|
||||
|
||||
Gib auf der "Login"-Seite die Informationen ein, die du während der Registrierung erhalten hast. Du kannst entweder deinen Spitznamen oder die Email-Adresse als Login-Namen nutzen.
|
||||
|
||||
Wenn du deinen Account nutzt, um mehrfache '[Seiten](help/Pages)' zu verwalten, die die gleiche Email-Adresse benutzen, dann nutze bitte den Spitznamen des Accounts, der verwaltet werden soll.
|
||||
|
||||
*Wenn* dein Account OpenID nutzt, dann kannst du deine OpenID-Adresse als Login-Name nutzen und das Passwort-Feld frei lassen. Du wirst zu deinem OpenID-Anbieter weitergeleitet, wo du deine Anmeldung abschließt.
|
||||
|
||||
Wenn OpenID nicht genutzt wird, gib dein Passwort ein. Dieses hast du zu Beginn in der Registrierungsmail erhalten. Dein Passwort ist zeichengenau; Groß- und Kleinschreibung wird beachtet. Prüfe bitte, ob deine Feststelltaste aktiv ist, falls du Schwierigkeiten beim Login hast.
|
||||
|
||||
|
||||
**Passwort ändern**
|
||||
|
||||
Besuche nach deinem ersten Login bitte die Einstellungsseite und wechsle das Passwort in eines, dass du dir merken kannst.
|
||||
|
||||
|
||||
**Der Anfang**
|
||||
|
||||
Ein ['Tipp für neue Mitglieder'](newmember)-Link zeigt sich in den ersten beiden Wochen auf deiner Startseite, um dir erste Informationen zum Start zu bieten.
|
||||
|
||||
|
||||
**Persönliche Daten exportieren**
|
||||
|
||||
Du kannst eine Kopie deiner persönlichen Daten in einer XML-Datei exportieren. Gehe hierzu in deinen Einstellungen auf "Persönliche Daten exportieren".
|
||||
|
||||
|
||||
**Schau dir ebenfalls folgende Seiten an**
|
||||
|
||||
* [Profile](help/Profiles)
|
||||
|
||||
* [Gruppen und Privatssphäre](help/Groups-and-Privacy)
|
||||
|
||||
* [Account löschen](help/Remove-Account)
|
||||
|
28
doc/de/Bugs-and-Issues.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
Bugs und Probleme
|
||||
===============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Wenn dein Server eine Supportseite hat, solltest du jeden Bug und jedes Problem, den/das du findest, zunächst dort melden. Die Fehler zunächst dort zu melden, statt auf der allgemeinen Bug-Seite, erleichtert es den Entwicklern, neue Features zu entwickeln, wenn sie sich nicht mit Fehlern beschäftigen müssen, mit denen sie nichts zu tun haben.
|
||||
|
||||
Wenn du ein technisch verantwortlicher Nutzer bist oder wenn deine Seite keine Support-Seite hat, dann kannst du den <a href="http://bugs.friendica.com/">Bug Tracker</a> nutzen. Bitte nutze zunächst die Suche, ob es bereits einen offenen Bug gibt, der deiner Anfrage entspricht.
|
||||
|
||||
Versuche, so viele Informationen wie möglich zum Bug zu bieten. Hierzu gehört auch die **komplette** Fehlermeldung oder Notiz und alle Schritte, die zu dem Fehler geführt haben. Es ist generell besser, zu viele Informationen zu liefern, als zu wenige.
|
||||
|
||||
Lies dir diesen <a href="http://www.chiark.greenend.org.uk/~sgtatham/bugs-de.html">Artikel (mehrsprachig)</a> durch, um mehr über **gute** Bug-Reports zu erfahren.
|
||||
|
||||
**Bug-Bearbeitung sponsern**
|
||||
|
||||
Wenn du einen Bug findest, der seine Ursache im Hauptsystem hat (also wenn es sich nicht nur um deine Seite handelt), dann kannst du diesen sponsern.
|
||||
|
||||
Die Bug/Fehler-Datenbank erlaubt es dir, Fehler zu sponsern. Das schafft einen Anreiz für die Entwickler, deinen Fehler zu bearbeiten. Das ist nicht zwingend notwendig, da wir keine Bugs mögen und versuchen, diese zu beheben. Wichtiger ist dieses für die zukünftige Projektentwicklung und für Feature-Anfragen.
|
||||
|
||||
Bug-Sponsoring arbeitet nach dem System der Anerkennung. Wenn du 10€ spendest, um einen Bug zu beheben, dann sende die Zahlung per PayPal an den Entwickler, der den Bug behoben hat. Und denke nie daran, für geleistete Arbeit nicht zu bezahlen. Einige dieser Leute könnten deine Kreditkarte hacken, falls du sie verärgern solltest.
|
||||
|
||||
Zur Zeit können nur Personen gesponserte Bugs bearbeiten, die als Entwickler bestätigt wurden. Hierfür muss der Entwickler bereits einige Friendica-Bugs bearbeitet haben. Das dient zur Absicherung, damit der behobene Bug auch gut mit Friendica läuft. Wenn du wünschst, als Entwickler bestätigt zu werden, dann arbeite dich ein und übernimm einige nicht-gesponserte Probleme oder dein eigenes Projekt und du wirst auf der Leiter nach oben klettern.
|
||||
|
||||
Wenn du sicher glaubst, dass du einen gesponserten Bug beheben kannst, aber nicht als Entwickler bestätigt bist, kann es passieren, dass ein gesponserter Entwickler den Bug bearbeiten, bevor du ihn dir sichern kannst. Wenn das nicht der Fall ist, dann trage einen kleinen Vermerk in die Anfrage ein. Wenn du unsere Code-Standards erfüllst, versuchen wir, dir einen Bonus zukommen zu lassen.
|
||||
|
||||
Wenn du ein Projekt mit mehr als 50€ sponserst, dann fragen dich die Entwickler gegebenenfalls, ob sie einen Teil der Zahlung vorab erhalten (normalerweise die Hälfte). Nochmals: es handelt sich um ein Anerkennungssystem - und hauptsächlich dient es dazu, Zahlungsprobleme und Streitigkeiten zu verhindern. Du solltest nach 1-2 Wochen einen gewissen Fortschritt oder Demonstrationen erwarten können. Wenn die Arbeit nicht in einer für dich annehmbaren Zeit gelöst ist, hast du das Recht, das Geld zurückzufordern.
|
||||
|
||||
Friendica ist nicht in diese Transaktionen involviert. Es handelt sich ausschließlich um ein persönliches Abkommen zwischen dem Sponsor und dem Entwickler. Wenn es irgendwelche Probleme gibt, müssen die Parteien es untereinander klären. Wir erstellen gerade einige Richtlinien, um potentielle Probleme zu vermeiden.
|
67
doc/de/Connectors.md
Normal file
|
@ -0,0 +1,67 @@
|
|||
Konnektoren (Connectors)
|
||||
==========
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Konnektoren erlauben es dir, dich mit anderen sozialen Netzwerken zu verbinden. Konnektoren werden nur bei bestehenden Facebook-, Twitter und StatusNet-Accounts benötigt. Außerdem gibt es einen Konnektor, um deinen Email-Posteingang zu nutzen.
|
||||
|
||||
Wenn die folgenden Netzwerk-Konnektoren auf deinem System installiert sind, kannst du mit den folgenden Links die Einstellungsseiten besuchen und für deinen Account konfigurieren:
|
||||
|
||||
* [Facebook](/settings/addon)
|
||||
* [Twitter](/settings/addon)
|
||||
* [StatusNet](/settings/addon)
|
||||
* [Email](/settings)
|
||||
|
||||
Anleitung, um sich mit Personen in bestimmten Netzwerken zu verbinden
|
||||
==========================================================
|
||||
|
||||
**Friendica**
|
||||
|
||||
Du kannst dich verbinden, indem du deine Identitäts-Adresse auf der "Verbinden"-Seite des Friendica-Nutzers eingibst. Ebenso kannst du deren Identitäts-Adresse in der "Verbinden"-Box auf deiner ["Kontakt"-Seite](contacts) eingeben.
|
||||
|
||||
|
||||
**Diaspora**
|
||||
|
||||
Füge die Diaspore-Identitäts-Adresse (z.B. name@diasporapod.com)auf deiner ["Kontakte"-Seite](contacts) in das Feld "Neuen Kontakt hinzufügen" ein.
|
||||
|
||||
|
||||
**Identi.ca/StatusNet/GNU-Social**
|
||||
|
||||
Diese Netzwerke werden als "federated social web" bzw. "OStatus"-Kontakte bezeichnet.
|
||||
|
||||
Bitte beachte, dass es **keine** Einstellungen zur Privatssphäre im OStatus-Netzwerk gibt. **Jede** Nachricht, die an eines dieser OStatus-Mitglieder verschickt wird, ist für jeden auf der Welt sichtbar; alle Privatssphäreneinstellungen verlieren ihre Wirkung. Diese Nachrichten erscheinen ebenfalls in öffentlichen Suchergebnissen.
|
||||
|
||||
Da die OStatus-Kommunikation keine Authentifizierung benutzt, können OStatus-Nutzer *keine* Nachrichten empfangen, wenn du in deinen Privatssphäreneinstellungen "Profil und Nachrichten vor Unbekannten verbergen" wählst.
|
||||
|
||||
Um dich mit einem OStatus-Mitglied zu verbinden, trage deren Profil-URL oder Identitäts-Adresse auf deiner ["Kontakte"-Seite](contacts) in das Feld "Neuen Kontakt hinzufügen" ein.
|
||||
|
||||
Der StatusNet-Konnektor kann genutzt werden, wenn du Beiträge schreiben willst, die auf einer OStatus-Seite über einen existierenden OStatus-Account erscheinen sollen.
|
||||
|
||||
Das ist nicht notwendig, wenn du OStatus-Mitgliedern von Friendica aus folgst und diese dir auch folgen, indem sie auf deiner Kontaktseite ihre eigene Identitäts-Adresse eingeben.
|
||||
|
||||
|
||||
**Blogger, Wordpress, RSS feeds, andere Webseiten**
|
||||
|
||||
Trage die URL auf deiner ["Kontakte"-Seite](contacts) in das Feld "Neuen Kontakt hinzufügen" ein. Du hast keine Möglichkeit, diesen Kontakten zu antworten.
|
||||
|
||||
Das erlaubt dir, dich mit Millionen von Seiten im Internet zu _verbinden_. Alles, was dafür nötig ist, ist dass die Seite einen Feed im RSS- oder Atom Syndication-Format nutzt und welches einen Autoren und ein Bild zur Seite liefert.
|
||||
|
||||
|
||||
**Twitter**
|
||||
|
||||
Um einem Twitter-Nutzer zu folgen, trage die URL der Hauptseite des Twitter-Accounts auf deiner ["Kontakte"-Seite](contacts) in das Feld "Neuen Kontakt hinzufügen" ein. Um zu antworten, musst du den Twitter-Konnektor installieren und über deinen eigenen Status-Editor antworten. Beginne deine Nachricht mit @twitternutzer, ersetze das aber durch den richtigen Twitter-Namen.
|
||||
|
||||
|
||||
**Email**
|
||||
|
||||
Konfiguriere den Email-Konnektor auf deiner [Einstellungsseite](settings). Wenn du das gemacht hast, kannst du auf deiner ["Kontakte"-Seite](contacts) die Email-Adresse in das Feld "Neuen Kontakt hinzufügen" eintragen. Diese Email-Adresse muss jedoch bereits mit einer Nachricht in deinem Email-Posteingang auf dem Server liegen. Du hast die Möglichkeit, Email-Kontakte in deine privaten Unterhaltungen einzubeziehen.
|
||||
|
||||
**Facebook**
|
||||
|
||||
Der Facebook-Konnektor ist ein Plugin/Addon, dass es dir erlaubt, von Friendica aus mit Freunden auf Facebook zu interagieren. Wenn er aktiviert ist, wird deine Facebook-Freundesliste importiert und du wirst Facebook-Beiträge sehen und kommentieren können. Facebook-Freunde können außerdem zu privaten Gesprächen hinzugefügt werden. Du hast nicht die Möglichkeit, einzelne Facebook-Accounts hinzuzufügen, sondern nur deine gesamte Freundesliste, die aktualisiert wird, wenn neue Freunde hinzugefügt werden.
|
||||
|
||||
Wenn das Facebook-Plugin/Addon installiert ist, kannst du diesen auf deiner Einstellungsseite unter ["Facebook Connector Settings"](settings/addon) einstellen. Dieser Eintrag erscheint nur, wenn das Plugin/Addon installiert ist. Folge den Vorgaben, um den Facebook-Konnektor zu installieren oder löschen.
|
||||
|
||||
Du kannst ebenfalls auswählen, ob deine öffentlichen Posts auch standardmäßig bei Facebook veröffentlicht werden sollen. Du kannst diese Einstellung jederzeit im aktuellen Beitrag beeinflussen, indem du auf das "Schloss"-Icon unter dem Beitragseditor gehst. Diese Einstellung hat keine Auswirkung auf private Unterhaltungen. Diese werden immer an Facebook-Freunde mit den entsprechenden Genehmigungen geschickt.
|
||||
|
||||
(Beachte: Aktuell können Facebook-Kontakte keine privaten Fotos sehen. Das wird zukünftig gelöst. Facebook-Kontakte können aber trotzdem öffentliche Fotos sehen, die du hochgeladen hast.)
|
22
doc/de/Developers.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
Friendica - Entwickler-Guide
|
||||
==========
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Hier erfährst du, wie du bei uns mitmachen kannst
|
||||
|
||||
Zunächst erstelle dir ein funktionierendes Git-Paket auf deinem System, auf dem du die Entwicklung durchführst.
|
||||
|
||||
Erstelle deinen eigenen Github-Account.
|
||||
|
||||
Du hast die Möglichkeit, die Friendica-Daten direkt über Github von der folgenden Seite laden: [https://github.com/friendica/friendica.git](https://github.com/friendica/friendica.git)
|
||||
|
||||
Befolge die Anleitung unter diesem Link [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/), um deine eigene Kopie (fork) der Ursprungsdaten auf Github zu erstellen und bearbeiten.
|
||||
|
||||
Gehe nun zu deiner Github-Seite und erstelle eine "Pull request", wenn du soweit bist, dein Projekt wieder in das Hauptprojekt einzugliedern.
|
||||
|
||||
**Wichtig**
|
||||
|
||||
Bitte hole dir alle Änderungen aus dem Projektverzeichnis und führe sie mit deiner Arbeit zusammen, **bevor** du deine "pull request" stellt. Wir behalten es uns vor, Patches abzulehnen, die eine große Anzahl an Fehlern hervorrufen. Dies gilt vor allem für Übersetzungen, da wir hier möglicherweise nicht alle feinen Unterschiede in konfliktären Versionen erkennen können.
|
||||
|
||||
Außerdem: **teste deine Änderungen!** Vergiss nicht, dass eine simple Fehlerlösung einen anderen Fehler auslösen kann. Lass deine Änderungen von einem erfahrenen Friendica-Entwickler gegenprüfen.
|
68
doc/de/Groups-and-Privacy.md
Normal file
|
@ -0,0 +1,68 @@
|
|||
Gruppen und Privatsphäre
|
||||
==================
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Gruppen sind nur eine Ansammlung von Freunden. Aber Friendica nutzt diese, um sehr mächtige Features zur Verfügung zu stellen.
|
||||
|
||||
**Gruppen erstellen**
|
||||
|
||||
Um eine Gruppe zu erstellen, besuche deine "Kontakte"-Seite und wähle "Neue Gruppe erstellen" (je nach Design nur als Pluszeichen angezeigt). Gib deiner Gruppe einen Namen.
|
||||
|
||||
Das führt dich zu einer Seite, auf der du die Gruppenmitglieder auswählen kannst.
|
||||
|
||||
Du hast zwei Boxen auf der Seite. Die obere Box ist die Übersicht der aktuellen Mitglieder. Die untere beinhaltet alle Freunde, die *nicht* Mitglied dieser Gruppe sind.
|
||||
|
||||
Wenn du auf das Foto einer Person klickst, die nicht in der Gruppe ist, wird diese in die Gruppe verschoben. Wenn du auf das Foto einer Person klickst, die bereits in der Gruppe ist, dann wird diese Person daraus entfernt.
|
||||
|
||||
**Zugriffskontrolle**
|
||||
|
||||
Sobald du eine Gruppe erstellt hast, kannst du diese auf jeder Zugriffsrechteliste nutzen. Damit ist das kleine Schloss neben deinem Statuseditor auf deiner Startseite gemeint. Wenn du darauf klickst, kannst du auswählen, wer deinen Beitrag sehen kann und wer *nicht*. Dabei kann es sich um eine einzelne Person oder eine ganze Gruppe handeln.
|
||||
|
||||
Auf deiner "Netzwerk"-Seite ("Unterhaltungen deiner Kontakte") findest du Beiträge und Gespräche aller deiner Kontakte in deinem Netzwerk. Du kannst aber auch eine einzelne Gruppe auswählen und nur Beiträge dieser Gruppenmitglieder anzeigen lassen.
|
||||
|
||||
Aber stopp, es gibt noch mehr...
|
||||
|
||||
Wenn du auf deiner "Netzwerk"-Seite eine bestimmte Gruppe ausgewählt hast, dann findest du im Statuseditor neben dem Schloss ein Ausrufezeichen. Dies dient dazu, deine Aufmerksamkeit auf das Schloss zu richten. Klicke auf das Schloss. Dort siehst du, dass dein Status-Update in dieser Ansicht standardmäßig nur für diese Gruppe freigegeben ist. Das hilft dir, deinen zukünftigen Mitarbeitern nicht das Gleiche zu schreiben wie deinen Trinkfreunden. Du kannst diese Einstellung natürlich auch überschreiben.
|
||||
|
||||
**Standardmäßige Zugriffsrechte von Beiträgen**
|
||||
|
||||
Standardmäßig geht Friendica davon aus, dass alle deine Beiträge privat sein sollen. Aus diesem Grund erstellt Friendica nach der Anmeldung eine Gruppe, in die automatisch alle deine Kontakte hinzugefügt werden. Alle deine Beiträge sind nur auf diese Gruppe beschränkt.
|
||||
|
||||
Beachte, dass diese Einstellung von deinem Seiten-Administrator überschrieben werden kann, was bedeutet, dass alle deine Beiträge standardmäßig "öffentlich" sind (bspw. für das gesamte Internet).
|
||||
|
||||
Wenn du deine Beiträge standardmäßig "öffentlich" haben willst, dann kannst du deine Standardzugriffsrechte auf deiner Einstellungseite ändern. Dort kannst du außerdem festlegen, welchen Gruppen standardmäßig deine Beiträge erhalten oder in welche Gruppe deine neuen Kontakte standardmäßig eingeordnet werden.
|
||||
|
||||
**Fragen der Privatssphäre, die zu beachten sind**
|
||||
|
||||
Diese privaten Gespräche funktionieren am besten, wenn deine Freunde Friendica-Mitglieder sind. So wissen wir, wer sonst noch deine Gespräche sehen kann - niemand, *solange* deine Freunde deine Nachrichten nicht kopieren und an andere verschicken.
|
||||
|
||||
Dies ist eine Vertrauensfrage, die du beachten musst. Keine Software der Welt kann deine Freunde davon abhalten, die privaten Unterhaltungen zu veröffentlichen. Nur eine gute Auswahl deiner Freunde.
|
||||
|
||||
Bei status.net, identi.ca und anderen Netzwerk-Anbietern ist es nicht so gesichert. Du musst **sehr** vorsichtig sein, wenn du Mitglieder anderer Netzwerke in einer deiner Gruppen hast, da es möglich ist, dass deine privaten Nachrichten in einem öffentlichen Stream enden. Wenn du auf die "Kontakt bearbeiten"-Seite einer Person gehst, zeigen wir dir, ob sie Mitglied eines unsicheren Netzwerks ist oder nicht.
|
||||
|
||||
Sobald du einen Post erstellt hast, kannst du die Zugriffsrechte nicht mehr ändern. Innerhalb von Sekunden ist dieser an viele verschiedene Personen verschickt worden - möglicherweise bereits an alle Addressierten. Wenn du versehentlich eine Nachricht erstellt hast und sie zurücknehmen willst, dann ist es das beste, diese zu löschen. Wir senden eine Löschmitteilung an jeden, der deine Nachricht erhalten hat - und das sollte die Nachricht genauso schnell löschen, wie sie zunächst erstellt wurde. In vielen Fällen wird sie in weniger als einer Minute aus dem Internet gelöscht. Nochmals: das gilt für Friendica-Netzwerke. Sobald eine Nachricht an ein anderes Netzwerk geschickt wurde, kann es nicht mehr so schnell gelöscht werden und in manchen Fällen auch gar nicht mehr.
|
||||
|
||||
Wenn du das bisher noch nicht wusstest, dann empfehlen wir dir, deine Freunde dazu zu ermutigen, auch Friendica zu nutzen, da alle diese Privatsphären-Einstellungen innerhalb eines privatsphärenbewussten Netzwerk viel besser funktionieren. Viele andere Netzwerke, mit denen sich Friendica verbinden kann, bieten keine Kontrolle über die Privatsphäre.
|
||||
|
||||
|
||||
Profile, Fotos und die Privatsphäre
|
||||
=============================
|
||||
|
||||
Die dezentralisierte Natur von Friendica (statt eine Webseite zu haben, die alles kontrolliert, gibt es viele Webseiten, die Information austauschen) hat in der Kommunikation mit anderen Seiten einige Konsequenzen. Du solltest dir über einige Dinge bewusst sein, um am besten entscheiden zu können, wie du mit deiner Privatsphäre umgehst.
|
||||
|
||||
**Fotos**
|
||||
|
||||
Fotos privat zu verteilen ist ein Problem. Wir können Fotos nur mit Friendica-Nutzern __privat__ austauschen. Um mit anderen Leuten Fotos zu teilen, müssen wir erkennen, wer sie sind. Wir können die Identität von Friendica-Nutzern prüfen, da es hierfür einen Mechanismus gibt. Deine Freunde anderer Netzwerke werden deine privaten Fotos nicht sehen können, da wir deren Identität nicht überprüfen können.
|
||||
|
||||
Unsere Entwickler arbeiten an einer Lösung, um deinen Freunden den Zugriff zu ermöglichen - unabhängig, zu welchem Netzwerk sie gehören. Wir nehmen hingegen Privatsphäre ernst und agieren nicht wie andere Netzwerke, die __nur so tun__ als ob deine Fotos privat sind, sie aber trotzdem anderen ohne Identitätsprüfung zeigen.
|
||||
|
||||
**Profile**
|
||||
|
||||
Dein Profil und deine "Wall" sollen vielleicht auch von Freunden anderer Netzwerke besucht werden können. Wenn du diese Seiten allerdings für Webbesucher sperrst, die Friendica nicht kennt, kann das auch Freunde anderer Netzwerke blockieren.
|
||||
|
||||
Das kann möglicherweise ungewollte Ergebnisse produzieren, wenn du lange Statusbeiträge z.B. für Twitter oder Facebook schreibst. Wenn Friendica einen Beitrag an diese Netzwerke schickt und nur eine bestimmte Nachrichtenlänge erlaubt ist, dann verkürzen wir diesen und erstellen einen Link, der zum Originalbeitrag führt. Der Originallink führt zurück zu deinem Friendica-Profil. Da Friendica nicht bestätigen kann, um wen es sich handelt, kann es passieren, dass diese Leute den Beitrag nicht komplett lesen können.
|
||||
|
||||
Für Leute, die davon betroffen sind, schlagen wir vor, eine Zusammenfassung in Twitter-Länge zu erstellen mit mehr Details für Freunde, die den ganzen Beitrag sehen können.
|
||||
|
||||
Dein Profil oder deine gesamte Friendica-Seite zu blockieren, hat außerdem ernsthafte Einflüsse auf deine Kommunikation mit StatusNet/identi.ca-Nutzern. Diese Netzwerke kommunizieren mit anderen über öffentliche Protokolle, die nicht authentifiziert werden. Um deine Beiträge zu sehen, müssen diese Netzwerke deine Beiträge als "unbekannte Webbesucher" ansehen. Wenn wir das erlauben, würde es dazu führen, das absolut jeder deine Beiträge sehen. Und du hast Friendica so eingestellt, das nicht zuzulassen. Beachte also, dass das Blockieren von unbekannten Besuchern auch dazu führen kann, dass öffentliche Netzwerke (wie identi.ca) und Newsfeed-Reader wie Google Reader auch geblockt werden.
|
39
doc/de/Home.md
Normal file
|
@ -0,0 +1,39 @@
|
|||
Friendica - Dokumentation und Ressourcen
|
||||
=====================================
|
||||
|
||||
**Inhalte**
|
||||
|
||||
* [Account - Basics](help/Account-Basics)
|
||||
* [Schnellstart für neue Benutzer](help/guide)
|
||||
* [Beiträge erstellen](help/Text_editor)
|
||||
* [Beiträge kommentieren, einordnen und löschen](help/Text_comment)
|
||||
* [Profile](help/Profiles)
|
||||
* [Konnektoren (Connectors)](help/Connectors)
|
||||
* [Freunde finden](help/Making-Friends)
|
||||
* [Gruppen und Privatsphäre](help/Groups-and-Privacy)
|
||||
* [Tags und Erwähnungen](help/Tags-and-Mentions)
|
||||
* [Seiten](help/Pages)
|
||||
* [Account löschen](help/Remove-Account)
|
||||
* [Bugs und Probleme](help/Bugs-and-Issues)
|
||||
|
||||
**Technische Dokumentation**
|
||||
|
||||
* [Installation](help/Install)
|
||||
* [Konfigurationen](help/Settings)
|
||||
* [Plugins](help/Plugins)
|
||||
* [Konnektoren (Connectors) installieren (Facebook/Twitter/StatusNet)](help/Installing-Connectors)
|
||||
* [Nachrichtenfluss](help/Message-Flow)
|
||||
* [Entwickler](help/Developers)
|
||||
|
||||
|
||||
**Externe Ressourcen**
|
||||
|
||||
* [Haupt-Webseite](http://friendica.com)
|
||||
* [Foren](http://groups.google.com/group/friendica)
|
||||
* [Entwickler-Foren](http://groups.google.com/group/friendica-dev)
|
||||
* [Deutsches Friendica-Wiki](http://wiki.toktan.org/doku.php)
|
||||
|
||||
**Über diese Seite**
|
||||
|
||||
* [Seite/Friendica-Version](friendica)
|
||||
|
89
doc/de/Install.md
Normal file
|
@ -0,0 +1,89 @@
|
|||
Friendica Installation
|
||||
==========
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Wir haben hart daran gearbeitet, um Friendica auf vorgefertigten Hosting-Plattformen zum Laufen zu bringen - solche, auf denen auch Wordpress Blogs und Drupal-Installationen laufen. Aber bedenke, dass Friendica mehr als eine einfache Webanwendung ist. Es handelt sich um ein komplexes Kommunikationssystem, das eher an einen Email-Server erinnert als an einen Webserver. Um die Verfügbarkeit und Performance zu gewährleisten, werden Nachrichten im Hintergrund verschickt und gespeichert, um sie später zu verschicken, wenn eine Webseite gerade nicht erreichbar ist. Diese Funktionalität benötigt ein wenig mehr als die normalen Blogs. Nicht jeder PHP/MySQL-Hosting-Anbieter kann Friendica unterstützen. Viele hingegen können es. Aber **bitte** prüfe die Voraussetzungen deines Servers vor der Installation.
|
||||
|
||||
Wenn dir Fehler während der Installation auffallen, sag uns bitte über das Forum auf http://groups.google.com/group/friendica oder über http://bugs.friendica.com Bescheid. Gib uns bitte so viele Infos zu deinem System, wie du kannst, und beschreibe den Fehler mit allen Details und Fehlermeldungen, so dass wir den Fehler zukünftig verhindern können. Aufgrund der großen Anzahl an verschiedenen Betriebssystemen und PHP-Plattformen haben wir nur geringe Kapazitäten, um deine PHP-Installation zu debuggen oder fehlende Module zu ersetzen, aber wir tun unser Bestes, um allgemeine Code-Fehler zu beheben.
|
||||
|
||||
Bevor du anfängst: suche dir einen Domain- oder Subdomainnamen für deinen Server. Denke ausreichend darüber nach, da ein Wechsel nach der Friendica-Installation derzeit nicht unterstützt wird. Dinge verändern sich und einige deiner Freunde haben möglicherweise Probleme, mit dir zu kommunizieren. Wir planen, diese Einschränkung in einer zukünftigen Version zu beheben.
|
||||
|
||||
|
||||
1. Voraussetzungen
|
||||
- Apache mit einer aktiverten mod-rewrite-Funktion und dem Eintrag "Options All", so dass du die lokale .htaccess-Datei nutzen kannst
|
||||
- PHP 5.2+. Je neuer, desto besser. Du benötigst 5.3 für die Authentifizierung untereinander. In einer Windows-Umgebung arbeitet die Version 5.2+ möglicherweise nicht, da die Funktion dns_get_record() erst ab Version 5.3 verfügbar ist.
|
||||
- PHP *Kommandozeilen*-Zugang mit register_argc_argv auf "true" gesetzt in der php.ini-Datei
|
||||
- curl, gd, mysql und openssl-Erweiterung
|
||||
- etwas in der Art eines Email-Servers oder eines Gateways wie PHP mail()
|
||||
- mcrypt (optional; wird für die Server-zu-Server Nachrichtenentschlüsselung benötigt)
|
||||
- Mysql 5.x
|
||||
- die Möglichkeit, wiederkehrende Aufgaben mit cron (Linux/Mac) oder "Scheduled Tasks" einzustellen (Windows) [Beachte: andere Optionen sind in Abschnitt 7 dieser Dokumentation zu finden]
|
||||
- Installation in einer Top-Level-Domain oder Subdomain (ohne eine Verzeichnis/Pfad-Komponente in der URL) wird bevorzugt. Verzeichnispfade sind für diesen Zweck nicht so günstig und wurden auch nicht ausführlich getestet.
|
||||
|
||||
|
||||
[Dreamhost.com bietet ein ausreichendes Hosting-Paket mit den nötigen Features zu einem annehmbaren Preis. Wenn dein Hosting-Anbieter keinen Unix-Zugriff erlaubt, kannst du Schwierigkeiten mit der Einrichtung der Webseite haben.
|
||||
|
||||
|
||||
2. Entpacke die Friendica-Daten in das Quellverzeichnis (root) des Dokumentenbereichs deines Webservers.
|
||||
|
||||
- Wenn du die Möglichkeit hierzu hast, empfehlen wir dir "git" zu nutzen, um die Daten direkt von der Quelle zu klonen, statt die gepackte .tar- oder .zip-Datei zu nutzen. Das macht die Aktualisierung wesentlich einfacher. Der Linux-Code, mit dem man die Dateien direkt in ein Verzeichnis wie "meinewebseite" kopiert, ist
|
||||
|
||||
`git clone https://github.com/friendica/friendica.git meinewebseite`
|
||||
|
||||
- und dann kannst du die letzten Änderungen immer mit dem folgenden Code holen
|
||||
|
||||
`git pull`
|
||||
|
||||
- Addons installieren
|
||||
- zunächst solltest du **in** deinem Webseitenordner sein
|
||||
|
||||
`cd meinewebseite`
|
||||
|
||||
- dann kannst du das Addon-Verzeichnis seperat kopieren
|
||||
|
||||
`git clone https://github.com/friendica/friendica-addons.git addon`
|
||||
|
||||
- Um das Addon-Verzeichnis aktuell zu halten, solltest du in diesem Pfad ein "git pull"-Befehl eintragen
|
||||
|
||||
`cd meinewebseite/addon`
|
||||
|
||||
`git pull`
|
||||
|
||||
- Wenn du den Verzeichnispfad auf deinen Webserver kopierst, dann stelle sicher, dass du auch die .htaccess kopierst, da "Punkt"-Dateien oft versteckt sind und normalerweise nicht direkt kopiert werden.
|
||||
|
||||
|
||||
3. Erstelle eine leere Datenbank und notiere alle Zugangsdaten (Adresse der Datenbank, Nutzername, Passwort, Datenbankname).
|
||||
|
||||
4. Besuche deine Webseite mit deinem Browser und befolge die Anleitung. Bitte beachte jeden Fehler und korrigiere diese, bevor du fortfährst.
|
||||
|
||||
5. *Wenn* die automatisierte Installation aus irgendeinem Grund fehlschlägt, dann prüfe das Folgende:
|
||||
|
||||
- ".htconfig.php" existiert ... wenn nicht, bearbeite die „htconfig.php“ und ändere die Systemeinstellungen. Benenne sie um in „.htconfig.php"
|
||||
“
|
||||
- die Datenbank beinhaltet Daten. ... wenn nicht, importiere den Inhalt der Datei "database.sql" mit phpmyadmin oder per mysql-Kommandozeile.
|
||||
|
||||
6. Besuche deine Seite an diesem Punkt wieder und registriere deinen persönlichen Account. Alle Registrierungsprobleme sollten automatisch behebbar sein.
|
||||
Wenn du irgendwelche **kritischen** Fehler zu diesen Zeitpunkt erhalten solltest, deutet das darauf hin, dass die Datenbank nicht korrekt installiert wurde. Du kannst bei Bedarf die Datei .htconfig.php verschieben/umbenennen und die Datenbank leeren (als „Dropping“ bezeichnet), so dass du mit einem sauberen System neu starten kannst.
|
||||
|
||||
7. Erstelle einen Cron job oder einen regelmäßigen Task, um den Poller alle 5-10 Minuten im Hintergrund ablaufen zu lassen. Beispiel:
|
||||
|
||||
`cd /base/directory; /path/to/php include/poller.php`
|
||||
|
||||
Ändere "/base/directory" und "/path/to/php" auf deine Systemvorgaben.
|
||||
|
||||
Wenn du einen Linux-Server nutzt, benutze den Befehl "crontab -e" und ergänze eine Zeile wie die Folgende; angepasst an dein System
|
||||
|
||||
`*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php`
|
||||
|
||||
Du kannst den PHP-Pfad finden, indem du den Befehl „which php“ ausführst. Wenn du Schwierigkeiten mit diesem Schritt hast, kannst du deinen Hosting-Anbieter kontaktieren. Friendica wird nicht korrekt laufen, wenn dieser Schritt nicht erfolgreich abgeschlossen werden kann.
|
||||
|
||||
Alternativ kannst du das Plugin 'poormancron' nutzen, um diesen Schritt durchzuführen, wenn du eine aktuelle Friendica-Version nutzt. Um dies zu machen, musst du die ".htconfig.php" an der Stelle anpassen, die dein Plugin beschreibt. In einer frischen Installation sieht es aus wie:
|
||||
|
||||
`$a->config['system']['addon'] = 'js_upload';`
|
||||
|
||||
Dies setzt voraus, dass das Addon-Modul "js_upload" aktiviert ist. Du kannst auch weitere Addons/Plugins ergänzen. Ändere den Eintrag folgendermaßen ab:
|
||||
|
||||
`$a->config['system']['addon'] = 'js_upload,poormancron';`
|
||||
|
||||
und speichere deine Änderungen.
|
110
doc/de/Installing-Connectors.md
Normal file
|
@ -0,0 +1,110 @@
|
|||
Konnektoren installieren (Facebook/Twitter/StatusNet)
|
||||
==================================================
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Friendica nutzt Plugins, um die Verbindung zu anderen Netzwerken wie Facebook und Twitter zu gewährleisten.
|
||||
|
||||
Es gibt außerdem ein Plugin, um über einen bestehenden Status.Net-Account diesen Service zu nutzen. Du brauchst dieses Plugin aber nicht, um mit Status.Net-Mitgliedern von Friendica aus zu kommunizieren - es sei denn, du wünschst es, über einen existierenden Account einen Beitrag zu schreiben.
|
||||
|
||||
Alle drei Plugins benötigen einen Account im gewünschten Netzwerk. Zusätzlich musst du (bzw. der Administrator der Seite) einen API-Schlüssel holen, um einen authentifizierten Zugriff zu deinem Friendica-Server herstellen zu lassen.
|
||||
|
||||
|
||||
**Seitenkonfiguration**
|
||||
|
||||
Plugins müssen vom Administrator installiert werden, bevor sie genutzt werden können. Dieses kann über das Administrationsmenü erstellt werden.
|
||||
|
||||
Jeder der Konnektoren benötigt zudem einen API-Schlüssel vom Service, der verbunden werden soll. Einige Plugins erlaube es, diese Informationen auf den Administrationsseiten einzustellen, wohingegen andere eine direkte Bearbeitung der Konfigurationsdatei ".htconfig.php" erfordern. Der Weg, um diese Schlüssel zu erhalten, variiert stark, jedoch brauchen fast alle einen bestehenden Account im gewünschten Service. Einmal installiert, können diese Schlüssel von allen Seitennutzern genutzt werden.
|
||||
|
||||
Im Folgenden findest du die Einstellungen für die verschiedenen Services (viele dieser Informationen kommen direkt aus den Quelldateien der Plugins):
|
||||
|
||||
|
||||
**Twitter Plugin für Friendica**
|
||||
|
||||
* Author: Tobias Diekershoff
|
||||
* tobias.diekershoff@gmx.net
|
||||
|
||||
* License:3-clause BSD license
|
||||
|
||||
Konfiguration:
|
||||
Um dieses Plugin zu nutzen, benötigst du einen OAuth Consumer-Schlüsselpaar (Schlüssel und Geheimnis), das du auf der Seite [https://twitter.com/apps](https://twitter.com/apps) erhalten kannst
|
||||
|
||||
Registriere deine Friendica-Seite als "Client"-Anwendung mit "Read&Write"-Zugriff. Wir benötigen "Twitter als Login" nicht. Sobald du deine Anwendung installiert hast, erhältst du das Schlüsselpaar für deine Seite.
|
||||
|
||||
Trage dieses Schlüsselpaar in deine globale ".htconfig.php"-Datei ein.
|
||||
|
||||
```
|
||||
$a->config['twitter']['consumerkey'] = 'your consumer_key here';
|
||||
$a->config['twitter']['consumersecret'] = 'your consumer_secret here';
|
||||
```
|
||||
|
||||
Anschließend kann der Nutzer deiner Seite die Twitter-Einstellungen selbst eintragen: "Einstellungen -> Connector Einstellungen".
|
||||
|
||||
Dokumentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin
|
||||
|
||||
|
||||
**StatusNet Plugin für Friendica**
|
||||
|
||||
* Author: Tobias Diekershoff
|
||||
* tobias.diekershoff@gmx.net
|
||||
|
||||
* License:3-clause BSD license
|
||||
|
||||
Konfiguration
|
||||
|
||||
Wenn das Addon aktiv ist, muss der Nutzer die folgenden Einstellungen vornehmen, um sich mit dem StatusNet-Account seiner Wahl zu verbinden.
|
||||
|
||||
* Die Basis-URL des StatusNet-API; für identi.ca ist es https://identi.ca/api/
|
||||
* OAuth Consumer key & Geheimnis
|
||||
|
||||
Um das OAuth-Schlüsselpaar zu erhalten, muss der Nutzer
|
||||
|
||||
(a) seinen Friendica-Admin fragen, ob bereits ein Schlüsselpaar existiert oder
|
||||
(b) einen Friendica-Server als Anwendung auf dem StatusNet-Server anmelden.
|
||||
|
||||
Dies kann über Einstellungen --> Connections --> "Register an OAuth client application" -> "Register a new application" auf dem StatusNet-Server durchgeführt werden.
|
||||
|
||||
Während der Registrierung des OAuth-Clients ist Folgendes zu beachten:
|
||||
|
||||
* Der Anwendungsname muss auf der StatusNet-Seite einzigartig sein, daher empfehlen wir einen Namen wie "friendica-nnnn", ersetze dabei "nnnn" mit einer frei gewählten Nummer oder deinem Webseitennamen.
|
||||
* es gibt keine Callback-URL
|
||||
* Registriere einen Desktop-Client
|
||||
* stelle Lese- und Schreibrechte ein
|
||||
* die Quell-URL sollte die URL deines Friendica-Servers sein
|
||||
|
||||
Sobald die benötigten Daten gespeichert sind, musst du deinen Friendica-Account mit StatusNet verbinden. Das kannst du über Einstellungen --> Connector-Einstellungen durchführen. Folge dem "Einloggen mit StatusNet"-Button, erlaube den Zugriff und kopiere den Sicherheitscode in die entsprechende Box. Friendica wird dann versuchen, die abschließende OAuth-Einstellungen über die API zu beziehen.
|
||||
|
||||
Wenn es geklappt hat, kannst du in den Einstellungen festlegen, ob deine öffentlichen Nachrichten automatisch in deinem StatusNet-Account erscheinen soll (achte hierbei auf das kleine Schloss-Symbol im Status-Editor)
|
||||
|
||||
Dokumentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin
|
||||
|
||||
|
||||
**Installiere den Friendica/Facebook-Konnektor**
|
||||
|
||||
* Registriere einen API-Schlüssel für deine Seite auf [developer.facebook.com](Facebook).
|
||||
|
||||
Hierfür benötigst du einen Facebook-Account und ggf. weitere Authentifizierungen über eine Kreditkarten- oder Mobilfunknummer.
|
||||
|
||||
a. Wir würden uns sehr darüber freuen, wenn du "Friendica" in dem Anwendungsnamen eintragen würdest, um die Bekanntheit des Namens zu erhöhen. Das Friendica-Icon ist im Bildverzeichnis enthalten und kann als Anwendungs-Icon für die Facebook-App genutzt werden. Nutze [images/friendica-16.jpg](images/friendica-16.jpg) für das Icon und [images/friendica-128.jpg](images/friendica-128.jpg) für das Logo.
|
||||
|
||||
b. Die URL sollte deine Seite mit dem abschließenden Schrägstrich sein
|
||||
|
||||
Es **kann** notwendig sein, dass du eine "Privacy"- oder "Terms of service"-URL angeben musst.
|
||||
|
||||
c. Setze nun noch unter "App Domains" die URL auf deineSubdomain.deineDomain.de und bei "Website with Facebook Login" die URL zu deineDomain.de.
|
||||
|
||||
d. Installiere nun das Facebook-Plugin auf deiner Friendica-Seite über "admin/plugins". Du solltest links in der Sidebar einen Facebook-Link unter "Plugin Features" finden. Klicke diesen an.
|
||||
|
||||
e. Gib nun die App-ID und das App-Secret ein, die Facebook dir gegeben hat. Ändere die anderen Daten, wie es gewünscht ist.
|
||||
|
||||
Auf Friendica kann nun jeder Nutzer, der eine Verbindung zu Facebook wünscht, die Seite "Einstellungen -> Connector-Einstellungen" aufrufen und dort "Installiere Facebook-Connector" auswählen.
|
||||
|
||||
Wähle die gewünschten Einstellungen für deine Nutzungs- und Privatsphäreansprüche.
|
||||
|
||||
Hier meldest du dich bei Facebook an und gibst dem Plugin die nötigen Zugriffsrechte, um richtig zu funktionieren. Erlaube dieses.
|
||||
|
||||
Und fertig. Um es abzustellen, gehe wieder auf die Einstellungsseite und auf "Remove Facebook posting".
|
||||
|
||||
Videos und eingebetteter Code werden nicht gepostet, wenn sonst kein anderer Inhalt enthalten ist. Links und Bilder werden in ein Format übertragen, das von der Facebook-API verstanden wird. Lange Texte werden verkürzt und mit einem Link zum Originalbeitrag versehen.
|
||||
|
||||
Facebook-Kontakte können außerdem keine privaten Fotos sehen, da diese nicht richtig authentifiziert werden können, wenn sie deine Seite besuchen. Dieser Fehler wird zukünftig bearbeitet.
|
47
doc/de/Making-Friends.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
Freunde finden
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Freundschaft kann in Friendica viele verschiedene Bedeutungen annehmen. Aber lasst es uns einfach halten, du willst einfach mit jemandem befreundet sein. Wie machst du das?
|
||||
|
||||
Der einfachste Weg, um das zu machen, ist es, der Gruppe <a href="http://kakste.com/profile/newhere">Neu hier</a> beizutreten. Diese Gruppe ist speziell für Leute, die neu im Friendica-Netzwerk sind. Verbinde dich einfach mit der Gruppe, schreibe auf die "Wall" und lerne neue Leute kennen. Du musst uns nicht einmal direkt "liken" - kommentiere einige Beiträge und andere Leute werden anfangen, dich hinzuzufügen.
|
||||
|
||||
Als Nächstes kannst du dir das Verzeichnis anschauen. Das Verzeichnis ist in zwei Teile aufgeteilt. Wenn du auf den "Verzeichnis"-Button klickst, wirst du zunächst alle Mitglieder deines Servers sehen, die sich dazu entschlossen haben, angezeigt zu werden. Außerdem siehst du dort einen Link zum globalen Verzeichnis. Wenn du dich durch das globale Verzeichnis klickst, siehst du alle Nutzer weltweit auf allen Servern, die sich entschlossen haben, im Verzeichnis zu erscheinen. Du wirst außerdem den Link "Show Community Forums" sehen, welcher dich zu Gruppen, Foren und Fan-Seiten führt. Du verbindest dich mit Personen, Gruppen und Foren auf die gleiche Art, wobei Gruppen und Foren deine Anfrage automatisch annehmen, wohingegen ein Mensch dich erst manuell bestätigen muss.
|
||||
|
||||
*Mit anderen Friendica-Nutzern verbinden*
|
||||
|
||||
Besuche ihr Profil. Direkt unter dem Profilfoto ist das Wort "Verbinden" (bzw. "Connect" in einem englischsprachigem Profil). Klicke drauf und du gelangst zur "Verbinden"-Seite. Dort wirst du nach deiner Identitätsadresse gefragt. Das ist nötig, damit die Seite dein Profil finden kann.
|
||||
|
||||
*Was kommt in die Box?*
|
||||
|
||||
Wenn deine Friendica-Seite "demo.friendica.com" heißt und dein Nutzername/Spitzname auf der Seite "bob" ist, dann wäre es "bob@demo.friendica.com". Wie du siehst, sieht es wie eine Email-Adresse aus. Das ist beabsichtigt, da sich die Leute das so leichter merken können. Du *kannst* auch die URL deiner Startseite eintragen, wie z.B. "http://demo.friendica.com/profile/bob", aber der Email-Adressen-Stil ist einfacher.
|
||||
|
||||
Wenn du die "Verbinden"-Seite bestätigt hast, kommst du zurück zu deiner Seite, um dort die Anfrage zu bestätigen. Wenn du das gemacht hast, können beide Seiten miteinander kommunizieren, um den Prozess abzuschließen (sobald dein neuer Freund die Anfrage bestätigt hat).
|
||||
|
||||
Wenn du bereits die Identitäts-Adresse einer Person kennst, kannst du diese auch direkt in das "Verbinden"-Feld auf deiner "Kontakte"-Seite eintragen. Dies wird dich durch einen ähnlichen Prozess leiten.
|
||||
|
||||
|
||||
**Alternative Netzwerke**
|
||||
|
||||
Du kannst deine oder andere Identitäts-Adressen ebenfalls nutzen, um über verschiedene Netzwerke hinweg Freundschaften aufzubauen. Die Liste möglicher Netzwerke steigt immer weiter. Wenn du z.B. "bob" auf identi.ca (eine Status.Net-Seite) kennst, dann kannst du bob@identi.ca auf deiner "Kontakt"-Seite verbinden. (Oder du kannst die URL von Bobs identi.ca-Seite eintragen, wenn du es wünscht). Du kannst auch "teilweise" mit Leuten auf Google Buzz befreundet sein, wenn du deren GMail-Adresse einträgst. Google Buzz unterstützt bisher noch nicht alle Protokolle, die wir für die direkte Kommunikation benötigen, aber es sollte möglich sein, Statusupdates von Friendica zu folgen. Das Gleiche gilt für Twitter- und Diaspora-Accounts. Tatsächlich kannst du jedem und jeder Website folgen, der/die einen Syndication-Feed (RSS/Atom etc.) zur Verfügung stellt. Wenn wir einen Informationsstrom und einen Namen dazu finden, können wir auch versuchen, uns damit zu verbinden.
|
||||
|
||||
Wenn du deine Email-Postfachverbindung auf deiner Einstellungsseite konfiguriert hast, dann kannst du die Email-Adresse jeder Person eintragen, die dir schon eine Nachricht an dein Postfach geschickt hat und bereits in deinem sozialen Stream erscheint. Du kannst diesen Personen außerdem von Friendica aus antworten.
|
||||
|
||||
Leute können sich ebenfalls von anderen Netzwerken aus mit dir befreunden. Ein Freund von dir hat einen identi.ca-Account und kann sich mit dir befreunden, indem er deine Identitäts-Adresse in seine identi.ca-Verbinden-Dialogbox einträgt. Ein ähnlicher Mechanismus ist für Diaspora-Nutzer vorhanden, indem deine Identitäts-Adresse in ihre Suchleiste eingegeben wird.
|
||||
|
||||
Beachte: Manche StatusNet-Versionen benötigen die volle URL deines Profils und funktionieren möglicherweise nicht mit der Identitäts-Adresse.
|
||||
|
||||
Wenn jemand eine Freundschaftsanfrage schickt, erhältst du eine Benachrichtigung. Du musst dann diese Anfrage bestätigen, um die Freundschaftsanfrage abzuschließen.
|
||||
|
||||
Einige Netzwerke erlauben es, Nachrichten zu schicken, ohne befreundet zu sein oder deine Bestätigung zu benötigen. Friendica erlaubt dies in der Standardeinstellung nicht, da es zu Spam führen kann.
|
||||
|
||||
Wenn du eine Freundschaftsanfrage von einem anderen Friendica-Nutzer erhältst, dann hast du die Möglichkeit, diesen als "Fan" oder "Freund" einzutragen. Ein Fan kann sehen, was du schreibst und auch private Kommunikation sehen, die du zu diesen sendest, aber nicht umgekehrt. Als Freund kannst du in beide Richtungen kommunizieren.
|
||||
|
||||
Diaspora nutzt eine andere Terminologie mit der Unterteilung in "mit dir teilen" und "Freund".
|
||||
|
||||
Sobald ihr Freunde geworden seid, dir die Person aber permanent Spam oder sinnlose Informationen schickt, dann kannst du diese "ignorieren" - ohne die Freundschaft komplett zu beenden oder denjenigen zu zeigen, dass du nicht daran interessiert bist, was diese Person sagt. In verschiedener Hinsicht sind diese Personen wie "Fans", aber sie wissen es nicht. Sie denken, sie sind als Freunde eingetragen.
|
||||
|
||||
Du kannst auch eine Person "blocken". Das blockt die komplette Kommunikation mit dieser Person. Sie können zwar weiterhin öffentliche Beiträge sehen, wie auch jeder andere in der Welt, allerdings können sie nicht direkt mit dir kommunizieren.
|
||||
|
||||
Du kannst Freunde löschen, egal wie der Freundschaftsstatus ist, was dazu führt, dass alles, was mit dieser Person verbunden ist, von deiner Webseite gelöscht wird.
|
43
doc/de/Message-Flow.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
Friendica Nachrichtenfluss
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Diese Seite soll einige Infos darüber dokumentieren, wie Nachrichten innerhalb von Friendica von einer Person zur anderen übertragen werden. Es gibt verschiedene Pfade, die verschiedene Protokolle und Nachrichtenformate nutzen.
|
||||
|
||||
Diejenigen, die den Nachrichtenfluss genauer verstehen wollen, sollten sich mindestens mit dem DFRN-Protokoll (http://dfrn.org/dfrn.pdf) und den Elementen zur Nachrichtenverarbeitung des OStatus Stack informieren (salmon und Pubsubhubbub).
|
||||
|
||||
Der Großteil der Nachrichtenverarbeitung nutzt die Datei include/items.php, welche Funktionen für verschiedene Feed-bezogene Import-/Exportaktivitäten liefert.
|
||||
|
||||
Wenn eine Nachricht veröffentlicht wird, werden alle Übermittlungen an alle Netzwerke mit include/notifier.php durchgeführt, welche entscheidet, wie und an wen die Nachricht geliefert wird. Diese Datei bindet dabei die lokale Bearbeitung aller Übertragungen ein inkl. dfrn-notify.
|
||||
|
||||
mod/dfrn_notify.php handhabt die Rückmeldung (remote side) von dfrn-notify.
|
||||
|
||||
Lokale Feeds werden durch mod/dfrn_poll.php generiert - was ebenfalls die Rückmeldung (remote side) von dfrn-notify handhabt.
|
||||
|
||||
Salmon-Benachrichtigungen kommen via mod/salmon.php an.
|
||||
|
||||
PuSh-Feeds (pubsubhubbub) kommen via mod/pubsub.php an.
|
||||
|
||||
DFRN-poll Feed-Imports kommen via include/poller.php als geplanter Task an, das implementiert die lokale Bearbeitung (local side) des DFRN-Protokolls.
|
||||
|
||||
|
||||
Szenario #1. Bob schreibt eine öffentliche Statusnachricht
|
||||
|
||||
Dies ist eine öffentliche Nachricht ohne begrenzte Nutzerfreigabe, so dass keine private Übertragung notwendig ist. Es gibt zwei Wege, die genutzt werden können - als bbcode an DFRN-Clients oder als durch den Server konvertierten HTML-Code (mit PuSH; pubsubhubbub). Wenn ein PuSH-Hub einsatzfähig ist, nutzen DFRN-Poll-Clients vorrangig die Informationen, die durch den PuSH-Kanal kommen. Sie fallen zurück auf eine tägliche Abfrage, wenn der Hub Übertragungsschwierigkeiten hat (das kann vorkommen, wenn der standardmäßige Google-Referenzhub genutzt wird). Wenn kein spezifizierter Hub oder Hubs ausgewählt sind, werden DFRN-Clients in einer pro Kontakt konfigurierbaren Rate mit bis zu 5-Minuten-Intervallen abfragen. Feeds, die via DFRN-Poll abgerufen werden, sind bbcode und können auch private Unterhaltungen enthalten, die vom Poller auf ihre Zugriffsrechte hin geprüft werden.
|
||||
|
||||
Szenario #2. Jack antwortet auf Bobs öffentliche Nachricht. Jack ist im Friendica/DFRN-Netzwerk.
|
||||
|
||||
Jack nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist und dfrn-notify nutzt. Die PuSH-Hubs werden darüber informiert, dass neuer Inhalt verfügbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und übertragen diese an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken gehören können).
|
||||
|
||||
Szenario #3. Mary antwortet auf Bobs öffentliche Nachricht. Mary ist im Friendica/DFRN-Netzwerk.
|
||||
|
||||
Mary nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist (mit Ausnahme von Bob selbst; die Unterhaltung wird nun an Jack und Mary geschickt). Die Nachrichten werden mit dfrn-notify übertragen. PuSH-Hubs werden darüber informiert, dass neuer Inhalt verfügbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und übertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken gehören können).
|
||||
|
||||
Szenario #4. William antwortet auf Bobs öffentliche Nachricht. William ist in einem OStatus-Netzwerk.
|
||||
|
||||
William nutzt salmon, um Bob über seine Antwort zu benachrichtigen. Der Inhalt ist HTML-Code, der in das Salmon Magic Envelope eingebettet ist. Bob erstellt dann einen Feed der Unterhaltung und sendet es an alle Friendica-Nutzer, die an der Unterhaltung beteiligt sind und dfrn-notify nutzen (mit Ausnahme von William selbst; die Unterhaltung wird an Jack und Mary weitergeleitet). PuSH-Hubs werden darüber informiert, dass neuer Inhalt verfügbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und übertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken gehören können).
|
||||
|
||||
Szenario #5. Bob schreibt eine private Nachricht an Mary und Jack.
|
||||
|
||||
Die Nachricht wird sofort an Mary und Jack mit Hilfe von dfrn_notify geschickt. Öffentliche Hubs werden nicht benachrichtigt. Im Falle eines Timeouts wird eine erneute Verarbeitung angestoßen. Antworten folgen dem gleichen Nachrichtenfluss wie öffentliche Antworten, allerdings werden die Hubs nicht darüber informiert, wodurch die Nachrichten niemals in öffentliche Feeds gelangen. Die komplette Unterhaltung ist nur für Mary und Jack in ihren durch dfrn-poll personalisierten Feeds verfügbar (und für niemanden sonst).
|
35
doc/de/Pages.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
Seiten
|
||||
=====
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
|
||||
Friendica lässt dich auch Foren und/oder Prominenten-Seiten erstellen.
|
||||
|
||||
Jede Seite in Friendica hat einen einzigartigen Spitznamen. Das gilt für alle Seiten, unabhängig davon, ob es sich um normale Profile oder Forenseite handelt.
|
||||
|
||||
Das Erste, was du machen musst, um eine neue Seite zu kreieren ist, einen neuen Account zu erstellen. Bitte beachte, dass der Seitenadministrator die Registrierung neuer Accounts sperren oder an Bedingungen knüpfen kann.
|
||||
|
||||
Wenn du einen zweiten Account in einem System erstellst und die gleiche Email-Adresse oder den gleichen OpenID-Account nutzt, kannst du dich zukünftig nur noch mit deinem Spitznamen anmelden.
|
||||
|
||||
Gehe im neuen Account auf die "Einstellungs"-Seite und dort am Ende der Seite auf "Erweiterte Konto-/Seitentyp-Einstellungen". Normalerweise nutzt du "Normales Konto" für einen normalen, persönlichen Account. Das ist die Standardeinstellung. Gruppenseiten bieten die Möglichkeit, Leute als Freund/Fan ohne Kontaktbestätigung zuzulassen.
|
||||
|
||||
Die Auswahl der Einstellung, die du wählst, hängt davon ab, wie du mit anderen Leuten auf deiner Seite interagieren willst. Die "Marktschreier"-Einstellung (Soapbox) lässt den Seitenbesitzer die gesamte Kommunikation kontrollieren. Alles was du schreibst, geht an alle Seitennutzer, aber es gibt keine Möglichkeit, zu interagieren. Diese Seite wird normalerweise für Ankündigungen oder die Kommunikation von Gemeinschaften genutzt.
|
||||
|
||||
Die normalste Einstellung ist das "Forum-/Promi-Konto". Diese erstellt eine Gruppenseite, in der alle Mitglieder frei miteinander interagieren können. Der "Automatische Freunde Seite"-Account ist typischerweise für persönliche Profile, bei denen du alle Freundschaftsanfragen automatisch bestätigen willst.
|
||||
|
||||
|
||||
**Multiple Seiten verwalten**
|
||||
|
||||
Wir schlagen vor, dass du eine Gruppenseite mit der gleichen Email-Adresse und dem gleichen Passwort wie bei deinem normalen Account nutzt. Wenn du das machst, findest du einen neuen "Verwalten"-Link im Hauptmenü, das dir hilft, einfach zwischen den Identitäten zu wechseln. Du musst das nicht machen, die Alternative ist allerdings, dich immer wieder aus- und wieder einzuloggen. Und das kann umständlich sein, wenn du mehrere verschiedene Seiten/Identitäten verwaltest.
|
||||
|
||||
Du kannst ebenso jemanden wählen, der deine Seite verwaltet. Mach das, indem du die [Delegierungs-Setup-Seite](delegate) besuchst. Dort wird dir eine Liste an "Potentiellen Bevollmächtigen" angezeigt. Die Auswahl einer oder mehrerer Personen gibt diesen die Möglichkeit, deine Seite zu verwalten. Sie können Kontakte, Profile und alle Inhalte deines Accounts/deiner Seite bearbeiten. Bitte nutze diese Einstellung mit Vorsicht. Delegierte haben jedoch keine Möglichkeit, grundlegende Account-Einstellungen wie das Passwort oder den Seitentypen zu ändern bzw. den Account zu löschen.
|
||||
|
||||
|
||||
**Beiträge auf Community-Seiten**
|
||||
|
||||
Wenn du Mitglied einer Community-Seite/-Forums bist, kannst du die Seite in einem Beitrag hinzufügen/erwähnen, wenn du den @-Tag nutzt. Zum Beispiel würde @Fahrrad deinen Beitrag neben den sonst ausgewählten Nutzern an alle Nutzer schicken, die in der Gruppe "Fahrrad" sind. Wenn dein Beitrag privat ist, musst du diese Gruppe explizit in den Zugriffsrechten des Beitrags auswählen **und** sie mit dem @-Tag erwähnen (was den Beitrag auf die Gruppenmitglieder erweitert).
|
||||
|
||||
Du kannst außerdem via "Wall zu Wall" einen Beitrag auf der Community-Seite bzw. in dem Community-Forum erstellen.
|
||||
|
||||
Kommentare, die du an eine Community-Seite schickst, werden an den Originalbeitrag weitergeleitet. Das Forum bzw. die Gruppe mit dem @-Tag zu erwähnen, leitet den Beitrag nicht weiter, da die Verteilung des Beitrages komplett vom Original-Beitragsschreiber kontrolliert wird.
|
343
doc/de/Plugins.md
Normal file
|
@ -0,0 +1,343 @@
|
|||
**Friendica Addon/Plugin-Entwicklung**
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Bitte schau dir das Beispiel-Addon "randplace" für ein funktionierendes Beispiel für manche der hier aufgeführten Funktionen an. Das Facebook-Addon bietet ein Beispiel dafür, die "addon"- und "module"-Funktion gemeinsam zu integrieren. Addons arbeiten, indem sie Event Hooks abfangen. Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden
|
||||
|
||||
Plugin-Namen können keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt. Du kannst einen lesbaren Namen im Kommentarblock eintragen. Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-/Plugin-Namen basieren; z.B. "plugin1name_install()". Diese beiden Funktionen haben keine Argumente und sind dafür verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Plugin benötigt. Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgeführt (z.B. neu installiert), wenn sich das Plugin nach der Installation ändert - somit sollte deine Deinstallationsfunktion keine Daten zerstört und deine Installationsfunktion sollte bestehende Daten berücksichtigen. Zukünftige Extensions werden möglicherweise "Setup" und "Entfernen" anbieten.
|
||||
|
||||
Plugins sollten einen Kommentarblock mit den folgenden vier Parametern enthalten:
|
||||
|
||||
/*
|
||||
* Name: My Great Plugin
|
||||
* Description: This is what my plugin does. It's really cool
|
||||
* Version: 1.0
|
||||
* Author: John Q. Public <john@myfriendicasite.com>
|
||||
*/
|
||||
|
||||
Registriere deine Plugin-Hooks während der Installation.
|
||||
|
||||
register_hook($hookname, $file, $function);
|
||||
|
||||
$hookname ist ein String und entspricht einem bekannten Friendica-Hook.
|
||||
|
||||
$file steht für den Pfadnamen, der relativ zum Top-Level-Friendicaverzeichnis liegt. Das *sollte* "addon/plugin_name/plugin_name.php' sein.
|
||||
|
||||
$function ist ein String und der Name der Funktion, die ausgeführt wird, wenn der Hook aufgerufen wird.
|
||||
|
||||
Deine Hook-Callback-Funktion wird mit mindestens einem und bis zu zwei Argumenten aufgerufen
|
||||
|
||||
function myhook_function(&$a, &$b) {
|
||||
|
||||
}
|
||||
|
||||
Wenn du Änderungen an den aufgerufenen Daten vornehmen willst, musst du diese als Referenzvariable (mit "&") während der Funktionsdeklaration deklarieren.
|
||||
|
||||
$a ist die Friendica "App"-Klasse, die eine Menge an Informationen über den aktuellen Friendica-Status beinhaltet, u.a. welche Module genutzt werden, Konfigurationsinformationen, Inhalte der Seite zum Zeitpunkt des Hook-Aufrufs. Es ist empfohlen, diese Funktion "$a" zu nennen, um seine Nutzung an den Gebrauch an anderer Stelle anzugleichen.
|
||||
|
||||
$b kann frei benannt werden. Diese Information ist speziell auf den Hook bezogen, der aktuell bearbeitet wird, und beinhaltet normalerweise Daten, die du sofort nutzen, anzeigen oder bearbeiten kannst. Achte darauf, diese mit "&" zu deklarieren, wenn du sie bearbeiten willst.
|
||||
|
||||
|
||||
**Module**
|
||||
|
||||
Plugins/Addons können auch als "Module" agieren und alle Seitenanfragen für eine bestimte URL abfangen. Um ein Plugin als Modul zu nutzen, ist es nötig, die Funktion "plugin_name_module()" zu definieren, die keine Argumente benötigt und nichts weiter machen muss.
|
||||
|
||||
Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen für "http://my.web.site/plugin_name" erhalten - mit allen URL-Komponenten als zusätzliche Argumente. Diese werden in ein Array $a->argv geparst und stimmen mit $a->argc überein, wobei sie die Anzahl der URL-Komponenten abbilden. So würde http://my.web.site/plugin/arg1/arg2 nach einem Modul "plugin" suchen und seiner Modulfunktion die $a-App-Strukur übergeben (dies ist für viele Komponenten verfügbar). Das umfasst:
|
||||
|
||||
$a->argc = 3
|
||||
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
|
||||
|
||||
Deine Modulfunktionen umfassen oft die Funktion plugin_name_content(&$a), welche den Seiteninhalt definiert und zurückgibt. Sie können auch plugin_name_post(&$a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt. Du kannst ebenso plugin_name_init(&$a) nutzen, was oft frühzeitig aufgerufen wird und das Modul initialisert.
|
||||
|
||||
|
||||
**Derzeitige Hooks:**
|
||||
|
||||
**'authenticate'** - wird aufgerufen, wenn sich der User einloggt.
|
||||
$b ist ein Array
|
||||
'username' => der übertragene Nutzername
|
||||
'password' => das übertragene Passwort
|
||||
'authenticated' => setze das auf einen anderen Wert als "0", damit der User sich authentifiziert
|
||||
'user_record' => die erfolgreiche Authentifizierung muss auch einen gültigen Nutzereintrag aus der Datenbank zurückgeben
|
||||
|
||||
**'logged_in'** - wird aufgerufen, sobald ein Nutzer sich erfolgreich angemeldet hat.
|
||||
$b beinhaltet den $a->Nutzer-Array
|
||||
|
||||
|
||||
**'display_item'** - wird aufgerufen, wenn ein Beitrag für die Anzeige formatiert wird.
|
||||
$b ist ein Array
|
||||
'item' => Die Item-Details (Array), die von der Datenbank ausgegeben werden
|
||||
'output' => Die HTML-Ausgabe (String) des Items, bevor es zur Seite hinzugefügt wird
|
||||
|
||||
**'post_local'** - wird aufgerufen, wenn der Statusbeitrag oder ein Kommentar im lokalen System eingetragen wird.
|
||||
$b ist das Item-Array der Information, die in der Datenbank hinterlegt wird.
|
||||
{Bitte beachte: der Seiteninhalt ist bbcode - nicht HTML)
|
||||
|
||||
**'post_local_end'** - wird aufgerufen, wenn ein lokaler Statusbeitrag oder Kommentar im lokalen System gespeichert wird.
|
||||
$b ist das Item-Array einer Information, die gerade in der Datenbank gespeichert wurden.
|
||||
{Bitte beachte: der Seiteninhalt ist bbcode - nicht HTML)
|
||||
|
||||
**'post_remote'** - wird aufgerufen, wenn ein Beitrag aus einer anderen Quelle empfangen wird. Dies kann auch genutzt werden, um lokale Aktivitäten oder systemgenerierte Nachrichten zu veröffentlichen/posten.
|
||||
$b ist das Item-Array einer Information, die in der Datenbank und im Item gespeichert ist.
|
||||
{Bitte beachte: der Seiteninhalt ist bbcode - nicht HTML)
|
||||
|
||||
**'settings_form'** - wird aufgerufen, wenn die HTML-Ausgabe für die Einstellungsseite generiert wird.
|
||||
$b ist die HTML-Ausgabe (String) der Einstellungsseite vor dem finalen "</form>"-Tag.
|
||||
|
||||
**'settings_post'** - wird aufgerufen, wenn die Einstellungsseiten geladen werden.
|
||||
$b ist der $_POST-Array
|
||||
|
||||
**'plugin_settings'** - wird aufgerufen, wenn die HTML-Ausgabe der Addon-Einstellungsseite generiert wird.
|
||||
$b ist die HTML-Ausgabe (String) der Addon-Einstellungsseite vor dem finalen "</form>"-Tag.
|
||||
|
||||
**'plugin_settings_post'** - wird aufgerufen, wenn die Addon-Einstellungsseite geladen wird.
|
||||
$b ist der $_POST-Array
|
||||
|
||||
**'profile_post'** - wird aufgerufen, wenn die Profilseite angezeigt wird.
|
||||
$b ist der $_POST-Array
|
||||
|
||||
**'profile_edit'** - wird aufgerufen, bevor die Profil-Bearbeitungsseite angezeigt wird.
|
||||
$b ist ein Array
|
||||
'profile' => Profileintrag (Array) aus der Datenbank
|
||||
'entry' => die HTML-Ausgabe (string) des generierten Eintrags
|
||||
|
||||
**'profile_advanced'** - wird aufgerufen, wenn die HTML-Ausgabe für das "Advanced profile" generiert wird; stimmt mit dem "Profil"-Tab auf der Profilseite der Nutzer überein.
|
||||
$b ist die HTML-Ausgabe (String) des erstellten Profils
|
||||
(Die Details des Profil-Arrays sind in $a->profile)
|
||||
|
||||
**'directory_item'** - wird von der Verzeichnisseite aufgerufen, wenn ein Item für die Anzeige formatiert wird.
|
||||
$b ist ein Array
|
||||
'contact' => Kontakteintrag (Array) einer Person aus der Datenbank
|
||||
'entry' => die HTML-Ausgabe (String) des generierten Eintrags
|
||||
|
||||
**'profile_sidebar_enter'** - wird aufgerufen, bevor die Sidebar "Kurzprofil" einer Seite erstellt wird.
|
||||
$b ist der Profil-Array einer Person
|
||||
|
||||
**'profile_sidebar'** - wird aufgerufen, wenn die Sidebar "Kurzprofil" einer Seite erstellt wird.
|
||||
$b ist ein Array
|
||||
'profile' => Kontakteintrag (Array) einer Person aus der Datenbank
|
||||
'entry' => die HTML-Ausgabe (String) des generierten Eintrags
|
||||
|
||||
**'contact_block_end'** - wird aufgerufen, wenn der Block "Kontakte/Freunde" der Profil-Sidebar komplett formatiert wurde.
|
||||
$b ist ein Array
|
||||
'contacts' => Array von "contacts"
|
||||
'output' => die HTML-Ausgabe (String) des Kontaktblocks
|
||||
|
||||
**'bbcode'** - wird während der Umwandlung von bbcode auf HTML aufgerufen.
|
||||
$b ist der konvertierte Text (String)
|
||||
|
||||
**'html2bbcode'** - wird während der Umwandlung von HTML zu bbcode aufgerufen (z.B. bei Nachrichtenbeiträgen).
|
||||
$b ist der konvertierte Text (String)
|
||||
|
||||
**'page_header'** - wird aufgerufen, nachdem der Bereich der Seitennavigation geladen wurde.
|
||||
$b ist die HTML-Ausgabe (String) der "nav"-Region
|
||||
|
||||
**'personal_xrd'** - wird aufgerufen, bevor die Ausgabe der persönlichen XRD-Datei erzeugt wird.
|
||||
$b ist ein Array
|
||||
'user' => die hinterlegten Einträge der Person
|
||||
'xml' => die komplette XML-Datei die ausgegeben wird
|
||||
|
||||
**'home_content'** - wird aufgerufen, bevor die Ausgabe des Homepage-Inhalts erstellt wird; wird nicht eingeloggten Nutzern angezeigt.
|
||||
$b ist die HTML-Ausgabe (String) der Auswahlregion
|
||||
|
||||
**'contact_edit'** - wird aufgerufen, wenn die Kontaktdetails vom Nutzer auf der "Kontakte"-Seite bearbeitet werden.
|
||||
$b ist ein Array
|
||||
'contact' => Kontakteintrag (Array) des abgezielten Kontakts
|
||||
'output' => die HTML-Ausgabe (String) der "Kontakt bearbeiten"-Seite
|
||||
|
||||
**'contact_edit_post'** - wird aufgerufen, wenn die "Kontakt bearbeiten"-Seite ausgegeben wird.
|
||||
$b ist der $_POST-Array
|
||||
|
||||
**'init_1'** - wird aufgerufen, kurz nachdem die Datenbank vor Beginn der Sitzung geöffnet wird.
|
||||
$b wird nicht genutzt
|
||||
|
||||
**'page_end'** - wird aufgerufen, nachdem die Funktion des HTML-Inhalts komplett abgeschlossen ist.
|
||||
$b ist die HTML-Ausgabe (String) vom Inhalt-"div"
|
||||
|
||||
**'avatar_lookup'** - wird aufgerufen, wenn der Avatar geladen wird.
|
||||
$b ist ein Array
|
||||
'size' => Größe des Avatars, der geladen wird
|
||||
'email' => Email-Adresse, um nach dem Avatar zu suchen
|
||||
'url' => generierte URL (String) des Avatars
|
||||
|
||||
|
||||
Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 14-Feb-2012 generiert): Bitte schau in die Quellcodes für Details zu Hooks, die oben nicht dokumentiert sind.
|
||||
|
||||
boot.php: call_hooks('login_hook',$o);
|
||||
|
||||
boot.php: call_hooks('profile_sidebar_enter', $profile);
|
||||
|
||||
boot.php: call_hooks('profile_sidebar', $arr);
|
||||
|
||||
boot.php: call_hooks("proc_run", $arr);
|
||||
|
||||
include/contact_selectors.php: call_hooks('network_to_name', $nets);
|
||||
|
||||
include/api.php: call_hooks('logged_in', $a->user);
|
||||
|
||||
include/api.php: call_hooks('logged_in', $a->user);
|
||||
|
||||
include/queue.php: call_hooks('queue_predeliver', $a, $r);
|
||||
|
||||
include/queue.php: call_hooks('queue_deliver', $a, $params);
|
||||
|
||||
include/text.php: call_hooks('contact_block_end', $arr);
|
||||
|
||||
include/text.php: call_hooks('smilie', $s);
|
||||
|
||||
include/text.php: call_hooks('prepare_body_init', $item);
|
||||
|
||||
include/text.php: call_hooks('prepare_body', $prep_arr);
|
||||
|
||||
include/text.php: call_hooks('prepare_body_final', $prep_arr);
|
||||
|
||||
include/nav.php: call_hooks('page_header', $a->page['nav']);
|
||||
|
||||
include/auth.php: call_hooks('authenticate', $addon_auth);
|
||||
|
||||
include/bbcode.php: call_hooks('bbcode',$Text);
|
||||
|
||||
include/oauth.php: call_hooks('logged_in', $a->user);
|
||||
|
||||
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
|
||||
|
||||
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
|
||||
|
||||
include/acl_selectors.php: call_hooks('contact_select_options', $x);
|
||||
|
||||
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
|
||||
|
||||
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
|
||||
|
||||
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
|
||||
|
||||
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
|
||||
|
||||
include/notifier.php: call_hooks('notifier_normal',$target_item);
|
||||
|
||||
include/notifier.php: call_hooks('notifier_end',$target_item);
|
||||
|
||||
include/items.php: call_hooks('atom_feed', $atom);
|
||||
|
||||
include/items.php: call_hooks('atom_feed_end', $atom);
|
||||
|
||||
include/items.php: call_hooks('atom_feed_end', $atom);
|
||||
|
||||
include/items.php: call_hooks('parse_atom', $arr);
|
||||
|
||||
include/items.php: call_hooks('post_remote',$arr);
|
||||
|
||||
include/items.php: call_hooks('atom_author', $o);
|
||||
|
||||
include/items.php: call_hooks('atom_entry', $o);
|
||||
|
||||
include/bb2diaspora.php: call_hooks('bb2diaspora',$Text);
|
||||
|
||||
include/cronhooks.php: call_hooks('cron', $d);
|
||||
|
||||
include/security.php: call_hooks('logged_in', $a->user);
|
||||
|
||||
include/html2bbcode.php: call_hooks('html2bbcode', $text);
|
||||
|
||||
include/Contact.php: call_hooks('remove_user',$r[0]);
|
||||
|
||||
include/Contact.php: call_hooks('contact_photo_menu', $args);
|
||||
|
||||
include/conversation.php: call_hooks('conversation_start',$cb);
|
||||
|
||||
include/conversation.php: call_hooks('render_location',$locate);
|
||||
|
||||
include/conversation.php: call_hooks('display_item', $arr);
|
||||
|
||||
include/conversation.php: call_hooks('render_location',$locate);
|
||||
|
||||
include/conversation.php: call_hooks('display_item', $arr);
|
||||
|
||||
include/conversation.php: call_hooks('item_photo_menu', $args);
|
||||
|
||||
include/conversation.php: call_hooks('jot_tool', $jotplugins);
|
||||
|
||||
include/conversation.php: call_hooks('jot_networks', $jotnets);
|
||||
|
||||
include/plugin.php: if(! function_exists('call_hooks')) {
|
||||
|
||||
include/plugin.php:function call_hooks($name, &$data = null) {
|
||||
|
||||
index.php: call_hooks('init_1');
|
||||
|
||||
index.php: call_hooks('app_menu', $arr);
|
||||
|
||||
index.php: call_hooks('page_end', $a->page['content']);
|
||||
|
||||
mod/photos.php: call_hooks('photo_post_init', $_POST);
|
||||
|
||||
mod/photos.php: call_hooks('photo_post_file',$ret);
|
||||
|
||||
mod/photos.php: call_hooks('photo_post_end',$foo);
|
||||
|
||||
mod/photos.php: call_hooks('photo_post_end',$foo);
|
||||
|
||||
mod/photos.php: call_hooks('photo_post_end',$foo);
|
||||
|
||||
mod/photos.php: call_hooks('photo_post_end',intval($item_id));
|
||||
|
||||
mod/photos.php: call_hooks('photo_upload_form',$ret);
|
||||
|
||||
mod/friendica.php: call_hooks('about_hook', $o);
|
||||
|
||||
mod/editpost.php: call_hooks('jot_tool', $jotplugins);
|
||||
|
||||
mod/editpost.php: call_hooks('jot_networks', $jotnets);
|
||||
|
||||
mod/parse_url.php: call_hooks('parse_link', $arr);
|
||||
|
||||
mod/home.php: call_hooks('home_init',$ret);
|
||||
|
||||
mod/home.php: call_hooks("home_content",$o);
|
||||
|
||||
mod/contacts.php: call_hooks('contact_edit_post', $_POST);
|
||||
|
||||
mod/contacts.php: call_hooks('contact_edit', $arr);
|
||||
|
||||
mod/settings.php: call_hooks('plugin_settings_post', $_POST);
|
||||
|
||||
mod/settings.php: call_hooks('connector_settings_post', $_POST);
|
||||
|
||||
mod/settings.php: call_hooks('settings_post', $_POST);
|
||||
|
||||
mod/settings.php: call_hooks('plugin_settings', $settings_addons);
|
||||
|
||||
mod/settings.php: call_hooks('connector_settings', $settings_connectors);
|
||||
|
||||
mod/settings.php: call_hooks('settings_form',$o);
|
||||
|
||||
mod/register.php: call_hooks('register_account', $newuid);
|
||||
|
||||
mod/like.php: call_hooks('post_local_end', $arr);
|
||||
|
||||
mod/xrd.php: call_hooks('personal_xrd', $arr);
|
||||
|
||||
mod/item.php: call_hooks('post_local_start', $_REQUEST);
|
||||
|
||||
mod/item.php: call_hooks('post_local',$datarray);
|
||||
|
||||
mod/item.php: call_hooks('post_local_end', $datarray);
|
||||
|
||||
mod/profile.php: call_hooks('profile_advanced',$o);
|
||||
|
||||
mod/profiles.php: call_hooks('profile_post', $_POST);
|
||||
|
||||
mod/profiles.php: call_hooks('profile_edit', $arr);
|
||||
|
||||
mod/tagger.php: call_hooks('post_local_end', $arr);
|
||||
|
||||
mod/cb.php: call_hooks('cb_init');
|
||||
|
||||
mod/cb.php: call_hooks('cb_post', $_POST);
|
||||
|
||||
mod/cb.php: call_hooks('cb_afterpost');
|
||||
|
||||
mod/cb.php: call_hooks('cb_content', $o);
|
||||
|
||||
mod/directory.php: call_hooks('directory_item', $arr);
|
||||
|
47
doc/de/Profiles.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
Profile
|
||||
========
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Mit Friendica kann eine unbegrenzte Anzahl an Profilen angelegt werden. Du kannst verschiedene Profile nutzen, um verschiedenen Gruppen verschiedene Seiten von dir zu zeigen.
|
||||
|
||||
Du hast immer ein Profil, das als dein "Standard"- (default) oder "öffentliches" (public) Profil angelegt ist. Dieses Profil ist immer für die Öffentlichkeit zugänglich und kann nicht versteckt werden (hier mag es einige wenige Ausnahmen auf privaten oder getrennten Seiten geben). Du kannst und solltest die Informationen, die du in deinem öffentlichen Profil veröffentlichst, begrenzen.
|
||||
|
||||
Das bedeutet, dass du folgende Informationen in dein öffentlichen Profil eintragen solltest, wenn du willst, dass Freunde dich finden können ...
|
||||
|
||||
* Dein richtiger Name
|
||||
* Ein Foto von **dir**
|
||||
* Dein geographischer Standort; zumindest das Land, in dem du lebst.
|
||||
|
||||
Ohne diese Basisinformationen kannst du hier sehr einsam sein. Die meisten Leute, auch deine besten Freunde, werden nicht versuchen, einen Account mit Spitznamen und ohne Foto zu verbinden.
|
||||
|
||||
Wenn du außerdem Leute mit gleichen Interessen treffen willst, dann nimm dir etwas Zeit und trage einige Stichworte ein. Zum Beispiel etwas wie "Musik, Linux, Photographie" oder andere Dinge. Du kannst so viele Stichworte eintragen, wie du willst.
|
||||
|
||||
Dein "Standard-" oder "öffentliches" Profil wird außerdem Kontakten in anderen Netzwerken gezeigt, auch wenn sie nicht die Möglichkeit haben, die privaten Profile einzusehen. Nur Mitglieder des Friendica-Netzwerks können alternative oder private Profile sehen.
|
||||
|
||||
Um ein alternatives Profil zu erstellen, gehe auf "Profil verwalten/editieren". Du kannst entweder ein bestehendes Profil bearbeiten, das Foto ändern, oder ein neues Profil erstellen. Du kannst ebenfalls einen Klon eines bestehenden Profils erstellen, falls du nur einige wenige Einstellungen ändern, aber nicht alle Daten noch mal eingeben willst.
|
||||
|
||||
Um bestimmten Personen ein Profil zuzuweisen, wähle die Person über "Kontakte" und klicke auf das Bearbeiten-Symbol (Stift). Du wirst ein Auswahlmenü mit verschiedenen vorhandenen Profilen angezeigt bekommen. Wenn diese Auswahl nicht angezeigt wird, dann ist die Person in einem nicht unterstützten Netzwerk und kann dadurch auch kein Profil zugewiesen bekommen.
|
||||
|
||||
Wenn eine befreundete Person auf den "magischen Profillink" klickt, sieht sie das private Profil, das du dieser Person zugewiesen hast. Wenn sie nicht eingeloggt ist oder das Profil von woanders angeschaut wird, wird nur das öffentliche Profil angezeigt.
|
||||
|
||||
Ein "magischer Profillink" erscheint, wenn man mit der Maus über den Kontaktnamen oder das Foto geht. Der Cursor wird zur Hand und auf dem Bild erscheint ein Pfeil, der nach unten zeigt. Dieser "magische Cursor" zeigt an, dass du ein spezielles Profil angezeigt bekommst, das nur für Freunde, aber nicht für die Öffentlichkeit sichtbar ist.
|
||||
|
||||
Du wirst außerdem möglicherweise entdecken (vorausgesetzt, du hast die nötigen Zugriffsrechte), dass du direkt auf die Seite einer anderen Person schreiben kannst (oft wird diese Beitragsart "wall-to-wall" genannt). Ebenso kannst du die Möglichkeit haben, direkt Beiträge zu kommentieren, während du die Seite der anderen Person besuchst.
|
||||
|
||||
Es gibt zwei Einstellungen, welche erlauben, dein Profil ins Verzeichnis einzutragen, so dass du von anderen Personen gefunden werden kannst. Du kannst diese Einstellungen auf deiner "Einstellungen"-Seite ändern. Die eine Einstellung erlaubt dir, dein Profil im Verzeichnis dieses Servers zu veröffentlichen. Die zweite Option erlaubt es dir, dich in das globale Friendica-Verzeichnis einzutragen. Dies ist ein riesiges Verzeichnis, dass alle Personen von vielen Friendica-Installationen weltweit umfasst.
|
||||
|
||||
Wenn du für andere nicht sichtbar sein willst, dann kannst du dein Profil einfach unveröffentlicht lassen.
|
||||
|
||||
Außerdem hast du möglicherweise mehrere Profile, aber nur ein Profilfoto. Dies ist beabsichtigt. In frühen Tests haben wir mit verschiedenen Fotos für jedes Profil experimentiert und herausgefunden, dass es sehr verwirrend für die Nutzer ist. Sie sehen möglicherweise je nach Profil, Seite oder Unterhaltung verschiedene Fotos und merken, dass es unterschiedliche Profile gibt, die sie nicht einsehen können.
|
||||
|
||||
(Du kannst aber die Rich-Text-Infoboxen in deinem Profil nutzen und dort weitere Bilder in das Feld "Erzähle uns ein bisschen von dir …" einfügen.)
|
||||
|
||||
|
||||
**Schlüsselwörter und Verzeichnissuche**
|
||||
|
||||
Auf der Verzeichnisseite willst du vielleicht nach Personen deines Servers suchen, die ihre Profile veröffentlicht haben. Die Suche richtet sich normalerweise nach deinem Spitznamen oder Teilen deines richtigen Namens. Darüber hinaus wird dieses Feld auch andere Felder deines Profils wie Geschlecht, Ort, "über mich", Arbeit und Bildung finden. Du kannst zudem auch "Schlüsselwörter" in dein Standardprofil eintragen, so dass dich andere Personen über deine Interessen finden können. Du hast zwei Schlüsselwortarten zur Auswahl - öffentlich und privat. Private Schlüsselwörter werden *nicht* jedem angezeigt. Du kannst diese Schlüsselwörter nutzen, um andere Personen zu finden, die ebenfalls in einer bestimmten Gruppe sind oder z.B. das Fischen mögen, ohne dass es jeder in einem öffentlichen Profil sieht. Öffentliche Schlüsselwörter werden auf der "Kontaktvorschläge"-Seite genutzt. Auch wenn die Schlüsselwörter hier nicht direkt angezeigt werden, kann es trotzdem sein, dass diese im HTML-Code der Seite gesehen werden könnten.
|
||||
|
||||
In der Verzeichnis-Suche kannst du ebenfalls die "booleasche"-Logik zu nutzen. Mit "+lesbisch +Florida" kannst du Leute finden, deren sexuelle Einstellung (oder andere Schlüsselwörter) das Wort "lesbisch" enthält und die in Florida leben. Schau dir den Bereich über "Thematische Tags" auf der "[Tags und Erwähnungen-Seite](help/Tags-and-Mentions) für weitere Informationen, um booleansche Suchen durchzuführen.
|
||||
|
||||
Auf deiner Kontaktseite ist der Link "Ähnliche Interessen", um damit andere Leute zu finden (falls dein Seitenadministrator das globale Verzeichnis nicht ausgeschaltet hat). Hierfür werden die Schlüsselwörter aus deinen öffentlichen und privaten Profilen genutzt, um Personen im globalen Verzeichnis zu finden, die gleiche oder ähnliche Schlüsselwörter haben (deine privaten Schlüsselwörter werden nicht in das globale Verzeichnis übertragen oder gespeichert). Je mehr Schlüsselwörter du einträgst, umso genauer ist die Suche. Das Suchergebnis ist nach Relevanz sortiert. Gegebenenfalls stehst du ganz oben auf der Liste - schließlich bist du die Person, die am besten zu deinen Schlüsselwörtern passt.
|
8
doc/de/README.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
Friendica-doc-german
|
||||
====================
|
||||
|
||||
Friendica - doc - german
|
||||
|
||||
Hier findest du die deutsche Version der Friendica-Hilfedateien. Es handelt sich um eine selbst erstellte, öffentlich freigegebene Arbeit mit dem Ziel, Friendica durch deutsche Hilfedateien für weitere Personen zugänglich zu machen, die dem Englischen nicht ausreichend mächtig sind.
|
||||
|
||||
Die Daten basieren auf dem offiziellen Friendica-Github https://github.com/friendica/friendica (Stand: 03.11.12)
|
24
doc/de/Remove-Account.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
Accounts löschen
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Wir freuen uns nicht, wenn Leute Friendica verlassen, aber wenn du deinen Account löschen willst, dann besuche die folgende URL
|
||||
|
||||
[Lösche mich (http://NamederSeite/removeme)](../removeme)
|
||||
|
||||
in deinem Webbrowser. Du musst dabei eingeloggt sein.
|
||||
|
||||
Du wirst nach deinem Passwort gefragt, um die Anfrage zu bestätigen. Wenn dieses mit deinem gespeichertem Passwort übereinstimmt, dann wird dein Account sofort gelöscht. Anders als andere Netzwerke, behalten wir die Daten **nicht** für eine gewisse Zeit, falls du deine Meinung noch änderst. Deine Nutzerdetails, deine Unterhaltungen, deine Photos, deine Freunde - alles; wird sofort gelöscht und du wirst ausgeloggt.
|
||||
|
||||
Wenn Beiträge ablaufen, schicken wir Mitteilungen an Friendica, um diese zu löschen. Diaspora hat keine automatische Löschfunktion, so dass diese Funktion in dem Netzwerk deaktiviert ist. Und hoffentlich ist klar, dass das Löschen auch in anderen Netzwerken nicht funktioniert. Wenn du manuell einen Beitrag bzw. eine Reihe von Beiträgen löschst, dann senden wir individuelle Mitteilungen zu Friendica und Diaspora für jeden gelöschten Post.
|
||||
|
||||
Diaspora versäumt dieses oft.
|
||||
|
||||
Wenn du einen Beitrag löscht, aber jemand diesem Beitrag folgt, wird es trotzdem gelöscht. Dein Wunsch hat Priorität.
|
||||
|
||||
Wenn du deinen Account löscht, dann löschen wir alle Beiträge, dein Profil, die Nutzerdaten etc. sofort.
|
||||
|
||||
Um einen Gesamtlöschauftrag zu versenden, bräuchten wir zunächst noch deinen Account; auch, um deinen Freunden zu zeigen, wer diese Anfrage stellt. Das können wir nicht tun, wenn du keinen Account mehr hast.
|
||||
|
||||
Deine Freunde können möglicherweise noch deine Beiträge sehen, wenn dein Account gelöscht wurde, aber es gibt keinen öffentlichen Ort in Friendica mehr, wo diese angeschaut werden können. Wenn du Freunde bei Diaspora hast, kann es sein, dass deine Beiträge weiterhin vorhanden und für andere aus diesem Netzwerk sichtbar sind.
|
226
doc/de/Settings.md
Normal file
|
@ -0,0 +1,226 @@
|
|||
Konfigurationen
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Hier findest du einige eingebaute Features, welche kein graphisches Interface haben oder nicht dokumentiert sind. Konfigurationseinstellungen sind in der Datei ".htconfig.php" gespeichert. Bearbeite diese Datei, indem du sie z.B. mit einem Texteditor öffnest. Verschiedene Systemeinstellungen sind bereits in dieser Datei dokumentiert und werden hier nicht weiter erklärt.
|
||||
|
||||
**Tastaturbefehle**
|
||||
|
||||
Friendica erfasst die folgenden Tastaturbefehle:
|
||||
|
||||
* [Pause] - Pausiert die Update-Aktivität via "Ajax". Das ist ein Prozess, der Updates durchführt, ohne die Seite neu zu laden. Du kannst diesen Prozess pausieren, um deine Netzwerkauslastung zu reduzieren und/oder um es in der Javascript-Programmierung zum Debuggen zu nutzen. Ein Pausenzeichen erscheint unten links im Fenster. Klicke die [Pause]-Taste ein weiteres Mal, um die Pause zu beenden.
|
||||
|
||||
* [F8] - Zeigt eine Sprachauswahl an
|
||||
|
||||
|
||||
**Geburtstagsbenachrichtigung**
|
||||
|
||||
Geburtstage erscheinen auf deiner Startseite für alle Freunde, die in den nächsten 6 Tagen Geburtstag haben. Um deinen Geburtstag für alle sichtbar zu machen, musst du deinen Geburtstag (zumindest Tag und Monat) in dein Standardprofil eintragen. Es ist nicht notwendig, das Jahr einzutragen.
|
||||
|
||||
**Konfigurationseinstellungen**
|
||||
|
||||
|
||||
**Sprache**
|
||||
|
||||
Systemeinstellung
|
||||
|
||||
Bitte schau dir die Datei util/README an, um Informationen zur Erstellung einer Übersetzung zu erhalten.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['language'] = 'name';
|
||||
```
|
||||
|
||||
|
||||
**System-Thema (Design)**
|
||||
|
||||
Systemeinstellung
|
||||
|
||||
Wähle ein Thema als Standardsystemdesign (welches vom Nutzer überschrieben werden kann). Das Standarddesign ist "default".
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['theme'] = 'theme-name';
|
||||
```
|
||||
|
||||
|
||||
**Verifiziere SSL-Zertifikate**
|
||||
|
||||
Sicherheitseinstellungen
|
||||
|
||||
Standardmäßig erlaubt Friendica SSL-Kommunikation von Seiten, die "selbstunterzeichnete" SSL-Zertifikate nutzen. Um eine weitreichende Kompatibilität mit anderen Netzwerken und Browsern zu gewährleisten, empfehlen wir, selbstunterzeichnete Zertifikate **nicht** zu nutzen. Aber wir halten dich nicht davon ab, solche zu nutzen. SSL verschlüsselt alle Daten zwischen den Webseiten (und für deinen Browser), was dir eine komplett verschlüsselte Kommunikation erlaubt. Auch schützt es deine Login-Daten vor Datendiebstahl. Selbstunterzeichnete Zertifikate können kostenlos erstellt werden. Diese Zertifikate können allerdings Opfer eines sogenannten ["man-in-the-middle"-Angriffs](http://de.wikipedia.org/wiki/Man-in-the-middle-Angriff) werden, und sind daher weniger bevorzugt. Wenn du es wünscht, kannst du eine strikte Zertifikatabfrage einstellen. Das führt dazu, dass du keinerlei Verbindung zu einer selbstunterzeichneten SSL-Seite erstellen kannst
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['verifyssl'] = true;
|
||||
```
|
||||
|
||||
|
||||
**Erlaubte Freunde-Domains**
|
||||
|
||||
Kooperationen/Gemeinschaften/Bildung Erweiterung
|
||||
|
||||
Kommagetrennte Liste von Domains, welche eine Freundschaft mit dieser Seite eingehen dürfen. Wildcards werden akzeptiert (Wildcard-Unterstützung unter Windows benötigt PHP5.3) Standardmäßig sind alle gültigen Domains erlaubt.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['allowed_sites'] = "sitea.com, *siteb.com";
|
||||
```
|
||||
|
||||
|
||||
**Erlaubte Email-Domains**
|
||||
|
||||
Kooperationen/Gemeinschaften/Bildung Erweiterung
|
||||
|
||||
Kommagetrennte Liste von Domains, welche bei der Registrierung als Part der Email-Adresse erlaubt sind. Das grenzt Leute aus, die nicht Teil der Gruppe oder Organisation sind. Wildcards werden akzeptiert (Wildcard-Unterstützung unter Windows benötigt PHP5.3) Standardmäßig sind alle gültigen Email-Adressen erlaubt.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['allowed_email'] = "sitea.com, *siteb.com";
|
||||
```
|
||||
|
||||
**Öffentlichkeit blockieren**
|
||||
|
||||
Kooperationen/Gemeinschaften/Bildung Erweiterung
|
||||
|
||||
Setze diese Einstellung auf "true" und sperre den öffentlichen Zugriff auf alle Seiten, solange man nicht eingeloggt ist. Das blockiert die Ansicht von Profilen, Freunden, Fotos, vom Verzeichnis und den Suchseiten. Ein Nebeneffekt ist, dass Einträge dieser Seite nicht im globalen Verzeichnis erscheinen. Wir empfehlen, speziell diese Einstellung auszuschalten (die Einstellung ist an anderer Stelle auf dieser Seite erklärt). Beachte: das ist speziell für Seiten, die beabsichtigen, von anderen Friendica-Netzwerken abgeschottet zu sein. Unautorisierte Personen haben ebenfalls nicht die Möglichkeit, Freundschaftsanfragen von Seitennutzern zu beantworten. Die Standardeinstellung steht auf "false". Verfügbar in Version 2.2 und höher.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['block_public'] = true;
|
||||
```
|
||||
|
||||
|
||||
**Veröffentlichung erzwingen**
|
||||
|
||||
Kooperationen/Gemeinschaften/Bildung Erweiterung
|
||||
|
||||
Standardmäßig können Nutzer selbst auswählen, ob ihr Profil im Seitenverzeichnis erscheint. Diese Einstellung zwingt alle Nutzer dazu, im Verzeichnis zu erscheinen. Diese Einstellung kann vom Nutzer nicht deaktiviert werden. Die Standardeinstellung steht auf "false".
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['publish_all'] = true;
|
||||
```
|
||||
|
||||
|
||||
**Globales Verzeichnis**
|
||||
|
||||
Kooperationen/Gemeinschaften/Bildung Erweiterung
|
||||
|
||||
Mit diesem Befehl wird die URL eingestellt, die zum Update des globalen Verzeichnisses genutzt wird. Dieser Befehl ist in der Standardkonfiguration enthalten. Der nichtdokumentierte Teil dieser Einstellung ist, dass das globale Verzeichnis gar nicht verfügbar ist, wenn diese Einstellung nicht gesetzt wird. Dies erlaubt eine private Kommunikation, die komplett vom globalen Verzeichnis isoliert ist.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['directory_submit_url'] = 'http://dir.friendica.com/submit';
|
||||
```
|
||||
|
||||
|
||||
**Proxy Konfigurationseinstellung**
|
||||
|
||||
Wenn deine Seite eine Proxy-Einstellung nutzt, musst du diese Einstellungen vornehmen, um mit anderen Seiten im Internet zu kommunizieren.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['proxy'] = "http://proxyserver.domain:port";
|
||||
$a->config['system']['proxyuser'] = "username:password";
|
||||
```
|
||||
|
||||
|
||||
**Netzwerk-Timeout**
|
||||
|
||||
Legt fest, wie lange das Netzwerk warten soll, bevor ein Timeout eintritt. Der Wert wird in Sekunden angegeben. Standardmäßig ist 60 eingestellt; 0 steht für "unbegrenzt" (nicht empfohlen).
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['curl_timeout'] = 60;
|
||||
```
|
||||
|
||||
|
||||
**Banner/Logo**
|
||||
|
||||
Hiermit legst du das Banner der Seite fest. Standardmäßig ist das Friendica-Logo und der Name festgelegt. Du kannst hierfür HTML/CSS nutzen, um den Inhalt zu gestalten und/oder die Position zu ändern, wenn es nicht bereits voreingestellt ist.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['banner'] = '<span id="logo-text">Meine tolle Webseite</span>';
|
||||
```
|
||||
|
||||
|
||||
**Maximale Bildgröße**
|
||||
|
||||
Maximale Bild-Dateigröße in Byte. Standardmäßig ist 0 gesetzt, was bedeutet, dass kein Limit gesetzt ist.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['maximagesize'] = 1000000;
|
||||
```
|
||||
|
||||
|
||||
**UTF-8 Reguläre Ausdrücke**
|
||||
|
||||
Während der Registrierung werden die Namen daraufhin geprüft, ob sie reguläre UTF-8-Ausdrücke nutzen. Hierfür wird PHP benötigt, um mit einer speziellen Einstellung kompiliert zu werden, die UTF-8-Ausdrücke benutzt. Wenn du absolut keine Möglichkeit hast, Accounts zu registrieren, setze den Wert von "no_utf" auf "true". Standardmäßig ist "false" eingestellt (das bedeutet, dass UTF-8-Ausdrücke unterstützt werden und funktionieren).
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['no_utf'] = true;
|
||||
```
|
||||
|
||||
|
||||
**Prüfe vollständigen Namen**
|
||||
|
||||
Es kann vorkommen, dass viele Spammer versuchen, sich auf deiner Seite zu registrieren. In Testphasen haben wir festgestellt, dass diese automatischen Registrierungen das Feld "Vollständiger Name" oft nur mit Namen ausfüllen, die kein Leerzeichen beinhalten. Wenn du Leuten erlauben willst, sich nur mit einem Namen anzumelden, dann setze die Einstellung auf "true". Die Standardeinstellung ist auf "false" gesetzt.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['no_regfullname'] = true;
|
||||
```
|
||||
|
||||
|
||||
**OpenID**
|
||||
|
||||
Standardmäßig wird OpenID für die Registrierung und für Logins genutzt. Wenn du nicht willst, dass OpenID-Strukturen für dein System übernommen werden, dann setze "no_openid" auf "true". Standardmäßig ist hier "false" gesetzt.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['no_openid'] = true;
|
||||
```
|
||||
|
||||
|
||||
**Multiple Registrierungen**
|
||||
|
||||
Um mehrfache Seiten zu erstellen, muss sich eine Person mehrfach registrieren können. Deine Seiteneinstellung kann Registrierungen komplett blockieren oder an Bedingungen knüpfen. Standardmäßig können eingeloggte Nutzer weitere Accounts für die Seitenerstellung registrieren. Hier ist weiterhin eine Bestätigung notwendig, wenn "REGISTER_APPROVE" ausgewählt ist. Wenn du die Erstellung weiterer Accounts blockieren willst, dann setze die Einstellung "block_extended_register" auf "true". Standardmäßig ist hier "false" gesetzt.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['block_extended_register'] = true;
|
||||
```
|
||||
|
||||
|
||||
**Entwicklereinstellungen**
|
||||
|
||||
Diese sind am nützlichsten, um Protokollprozesse zu debuggen oder andere Kommunikationsfehler einzugrenzen.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
$a->config['system']['debugging'] = true;
|
||||
$a->config['system']['logfile'] = 'logfile.out';
|
||||
$a->config['system']['loglevel'] = LOGGER_DEBUG;
|
||||
```
|
||||
Erstellt detaillierte Debugging-Logfiles, die in der Datei "logfile.out" gespeichert werden (Datei muss auf dem Server mit Schreibrechten versehen sein). "LOGGER_DEBUG" zeigt eine Menge an Systeminformationen, enthält aber keine detaillierten Daten. Du kannst ebenfalls "LOGGER_ALL" auswählen, allerdings empfehlen wir dieses nur, wenn ein spezifisches Problem eingegrenzt werden soll. Andere Log-Level sind möglich, werden aber derzeit noch nicht genutzt.
|
||||
|
||||
|
||||
**PHP-Fehler-Logging**
|
||||
|
||||
Nutze die folgenden Einstellungen, um PHP-Fehler direkt in einer Datei zu erfassen.
|
||||
|
||||
Konfiguriere:
|
||||
```
|
||||
error_reporting(E_ERROR | E_WARNING | E_PARSE );
|
||||
ini_set('error_log','php.out');
|
||||
ini_set('log_errors','1');
|
||||
ini_set('display_errors', '0');
|
||||
```
|
||||
|
||||
Diese Befehle erfassen alle PHP-Fehler in der Datei "php.out" (Datei muss auf dem Server mit Schreibrechten versehen sein). Nicht deklarierte Variablen werden manchmal mit einem Verweis versehen, weshalb wir empfehlen, "E_NOTICE" und "E_ALL" nicht zu nutzen. Die Menge an Fehlern, die auf diesem Level gemeldet werden, ist komplett harmlos. Bitte informiere die Entwickler über alle Fehler, die du in deinen Log-Dateien mit den oben genannten Einstellungen erhältst. Sie weisen generell auf Fehler in, die bearbeitet werden müssen.
|
||||
Wenn du eine leere (weiße) Seite erhältst, schau in die PHP-Log-Datei - dies deutet fast immer darauf hin, dass ein Fehler aufgetreten ist.
|
31
doc/de/Tags-and-Mentions.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
Tags und Erwähnungen
|
||||
=================
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Wie viele andere soziale Netzwerke benutzt auch Friendica eine spezielle Schreibweise in seinen Nachrichten, um Tags oder kontextbezogene Links zu anderen Beiträgen hervorzuheben.
|
||||
|
||||
**Erwähnungen**
|
||||
|
||||
Personen werden "getagged", indem du das "@"-Zeichen vor den Namen schreibst.
|
||||
|
||||
Im Folgenden findest du verschiedene Möglichkeiten, um eine Person zu erwähnen:
|
||||
|
||||
* @mike - deutet auf eine Person hin, die im Netzwerk den Namen "mike" nutzt
|
||||
* @mike_macgirvin - deutet auf eine Person hin, die sich im Netzwerk "Mike Macgirvin" nennt. Beachte, dass Leerzeichen in Tags nicht genutzt werden können.
|
||||
* @mike+151 - diese Schreibweise deutet auf eine Person hin, die "mike" heißt und deren Kontakt-Identitäts-Nummer 151 ist. Bei der Eingabe erscheint direkt ein Auswahlmenü, sodass du diese Nummer nicht selbst kennen musst.
|
||||
* @mike@macgirvin.com - diese Schreibweise deutet auf die Profiladresse eines Nutzers in einem anderen Netzwerk oder auf jemanden, der *nicht* in deiner Kontaktliste ist. Diese Schreibweise wird "Fernerwähnung" (remote mention)genannt und kann nur im Email-Stil geschrieben werden, nicht als Internetadresse/URL.
|
||||
|
||||
|
||||
Wenn das System ungewollte Erwähnungen nicht blockiert, erhält diese Person eine Mitteilung oder nimmt direkt an der Diskussion teil, wenn es sich um einen öffentlichen Beitrag handelt. Bitte beachte, dass Friendica eingehende "Erwähnungs"-Nachrichten von Personen blockt, die du nicht zu deinem Profil hinzugefügt hast. Diese Maßnahme dient dazu, Spam zu vermeiden.
|
||||
|
||||
"Fernerwähnungen" werden durch das OStatus-Protokoll übermittelt. Dieses Protokoll wird von Friendica, StatusNet und anderen Systemen genutzt, ist allerdings derzeit nicht in Diaspora eingebaut.
|
||||
|
||||
Friendica unterscheidet bei Tags nicht zwischen Personen und Gruppen (einige andere Netzwerke nutzen "!gruppe", um solche zu markieren).
|
||||
|
||||
|
||||
**Thematische Tags**
|
||||
|
||||
Thematische Tags werden durch eine "#" gekennzeichnet. Dieses Zeichen erstellen einen Link zur allgemeinen Seitensuche mit dem ausgewählten Begriff. So wird z.B. #Autos zu einer Suche führen, die alle Beiträge deiner Seite umfasst, die dieses Wort erwähnen. Thematische Tags haben generell eine Mindestlänge von 3 Stellen. Kürzere Suchbegriffe finden meist keine Suchergebnisse, wobei dieses abhängig von der Datenbankeinstellung ist. Tags mit einem Leerzeichen werden, wie es auch bei Namen der Fall ist, durch einen Unterstrich gekennzeichnet. Es ist hingegen nicht möglich, Tags zu erstellen, deren gesuchtes Wort einen Unterstrich enthält.
|
||||
|
||||
Thematische Tags werden auch dann nicht verlinkt, wenn sie nur aus Nummern bestehen, wie z.B. #1. Wenn du einen numerischen Tag nutzen willst, füge bitte einen Beschreibungstext hinzu wie z.B. #2012_Wahl.
|
47
doc/de/Text_comment.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
Beiträge kommentieren, einordnen und löschen
|
||||
==========================================================
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Hier findest du eine Übersicht über die verschiedenen Möglichkeiten, bestehende Beiträge einzuordnen und zu kommentieren. <span style="color: red;">Achtung: für dieses Beispiel wurde das Thema <b>"Diabook"</b> genutzt. Wenn du ein anderes Design benutzt, wirst du manche dieser Symbole gar nicht oder in anderer Form vorfinden.
|
||||
</span>
|
||||
|
||||
<img src="doc/img/diabook.png" width="308" height="42" alt="diabook" >
|
||||
|
||||
<i>Die einzelnen Symbole</i>
|
||||
|
||||
<img src="doc/img/post_thumbs_up.png" width="27" height="32" alt="post_thumbs_up.png" align="left" style="padding-bottom: 10px;"> Mit diesem Symbol kannst du zeigen, dass dir ein Beitrag gefällt. Falls du diese Eingabe zurücknehmen willst, klicke einfach ein zweites Mal auf das Symbol.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_thumbs_down.png" width="27" height="32" alt="post_thumbs_down.png" align="left" style="padding-bottom: 10px;"> Mit diesem Symbol kannst du zeigen, dass dir ein Beitrag <b>nicht</b> gefällt. Falls du diese Eingabe zurücknehmen willst, klicke einfach ein zweites Mal auf das Symbol.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_share.png" width="27" height="32" alt="post_share.png" align="left" style="padding-bottom: 10px;"> Mit diesem Symbol kannst du einen Beitrag weiter verteilen. Einfach anklicken und sofort erscheint der Beitrag in deinem Beitragseditor. Am Ende des eingefügten Beitrags erscheint ein Link zum Originalbeitrag.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_mark.png" width="27" height="32" alt="post_mark.png" align="left" style="padding-bottom: 10px;"> Mit diesem Symbol kannst du einen Beitrag für dich markieren. Markierte Beiträge erscheinen in deiner Netzwerk-Seite unter "Markierte". Wenn du die Markierung entfernen willst, klicke einfach ein zweites Mal auf das Symbol.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_tag.png" width="27" height="41" alt="post_tag.png" align="left" style="padding-bottom: 10px;"> Mit diesem Symbol kannst du einen tag zum Beitrag hinzufügen und diesen so einem bestimmten Schlagwort zuzuordnen. Anschließend kannst du auf diesen tag klicken und alle Beiträge mit diesem tag ansehen. ACHTUNG: tags können nicht mehr entfernt werden.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_categorize.png" width="27" height="32" alt="post_categorize.png" align="left" style="padding-bottom: 20px;"> Mit diesem Symbol ist es möglich, die Beiträge in bestimmte Gruppen einzuordnen. Dies dient dazu, gewählte Beiträge nach eigenen Vorstellungen zu sortieren und wieder zu finden. Wähle eine vorhandene Gruppe oder gib einen neuen Namen ein. Die erstellten Gruppen findest du unter "Gespeicherte Ordner" in der Netzwerk-Ansicht.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/post_delete.png" width="27" height="32" alt="post_delete.png" align="left"> Mit diesem Symbol löschst du deinen eigenen Beitrag bzw. entfernst einen Beitrag einer anderen Person aus deinem Stream.
|
||||
<P style="clear: both;"></p>
|
||||
|
||||
<img src="doc/img/post_choose.png" width="27" height="32" alt="post_choose.png" align="left"> Mit diesem Symbol kannst du mehrere Beiträge auswählen und gesammelt löschen. Hierfür gehst du nach dem Markieren aller gewünschten Beiträge auf "Lösche die markierten Beiträge" am Ende der Seite mit allen Beiträgen.
|
||||
<P style="clear: both;"></p>
|
||||
|
||||
**Im Folgenden findest du Symbole weiterer Themen**
|
||||
|
||||
Darkbubble <img src="doc/img/darkbubble.png" alt="darkbubble.png" style="padding-left: 20px; vertical-align:middle;">
|
||||
|
||||
Darkzero <img src="doc/img/darkzero.png" alt="darkzero.png" style="padding-left: 35px; vertical-align:middle;">
|
||||
|
||||
<span style="padding-left: 10px; font-style:italic;">(inkl. weiterer "zero"-Themen, slackr, comix, easterbunny, facepark)</span>
|
||||
|
||||
Dispy <img src="doc/img/dispy.png" alt="dispy.png" style="padding-left: 57px; vertical-align:middle;"> <i>(inkl. smoothly, testbubble)</i>
|
||||
|
||||
Frost Mobile <img src="doc/img/frost.png" alt="frost.png" style="padding-left: 16px; vertical-align:middle;">
|
41
doc/de/Text_editor.md
Normal file
|
@ -0,0 +1,41 @@
|
|||
Beiträge erstellen
|
||||
=================
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Hier findest du eine Übersicht über die verschiedenen Möglichkeiten, deinen Beitrag zu bearbeiten. <span style="color: red;">Achtung: für dieses Beispiel wurde das Thema <b>"Diabook"</b> genutzt. Wenn du ein anderes Design benutzt, wird du manche dieser Symbole gar nicht oder in anderer Form vorfinden.
|
||||
</span>
|
||||
|
||||
<img src="doc/img/friendica_editor.png" width="538" height="218" alt="editor">
|
||||
|
||||
<i>Die einzelnen Symbole</i>
|
||||
|
||||
<img src="doc/img/camera.png" width="44" height="33" alt="editor" align="left" style="padding-bottom: 20px;"> Wenn du auf dieses Symbol klickst, dann kannst du ein Bild von deinem Computer hinzufügen. Wenn du eine Internetadresse (URL) eingeben willst, dann kannst du das "Baum"-Symbol im oberen Teil des Editors nutzen. Wenn du ein Bild ausgewählt hast, dann erscheint eine Miniaturdarstellung des Bildes im Editor.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/paper_clip.png" width="44" height="33" alt="paper_clip" align="left"> Wenn du dieses Symbol anklickst, dann kannst du weitere Dateien von deinem Computer einfügen. Eine Vorschau des Dateiinhalts erfolgt nicht.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/chain.png" width="44" height="33" alt="chain" align="left"> Wenn du die Kette anklickst, dann kannst du eine Internetadresse (URL) einfügen. Im Editor erscheint automatisch eine kurze Information zum eingefügten Link.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/video.png" width="44" height="33" alt="video" align="left"> Wenn du dieses Symbol wählst, dann kannst du eine Internetadresse (URL) zu einem Video einfügen. Eine Miniaturansicht des Videos erscheint in der Vorschau bzw. im fertigen Beitrag.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/mic.png" width="44" height="33" alt="mic" align="left"> Wenn du dieses Symbol wählst, dann kannst du eine Internetadresse (URL) zu einer Sound-Datei einfügen. Ein Player erscheint in der Vorschau bzw. im fertigen Beitrag.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
<img src="doc/img/globe.png" width="44" height="33" alt="globe" align="left"> Wenn du dieses Symbol wählst, dann kannst du deinen Standort festlegen. Hier reicht schon eine Angabe wie "Berlin" oder "10775". Dieser Eintrag führt anschließend zu einer Suchanfrage bei Google Maps.
|
||||
<p style="clear:both;"></p>
|
||||
|
||||
**Im Folgenden findest du Symbole weiterer Themen**
|
||||
|
||||
Cleanzero <img src="doc/img/editor_zero.png" alt="cleanzero.png" style="padding-left: 20px; vertical-align:middle;">
|
||||
|
||||
<span style="padding-left: 10px; font-style:italic;">(inkl. weiterer "zero"-Themen, comix, easterbunny, facepark, slackr </span>
|
||||
|
||||
Darkbubble <img src="doc/img/editor_darkbubble.png" alt="darkbubble.png" style="padding-left: 14px; vertical-align:middle;"> <i>(inkl. smoothly, testbubble)</i>
|
||||
|
||||
Frost <img src="doc/img/editor_frost.png" alt="frost.png" style="padding-left: 42px; vertical-align:middle;">
|
||||
|
||||
Vier <img src="doc/img/editor_vier.png" alt="vier.png" style="padding-left: 44px; vertical-align:middle;"> <i>(inkl. dispy)</i>
|
27
doc/de/andfinally.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
... und zuletzt
|
||||
===============
|
||||
|
||||
Und damit sind wir auch schon am Ende der Schnellstartanleitung.
|
||||
|
||||
Hier sind noch einige weitere Dinge, die dir den Start vereinfachen können.
|
||||
|
||||
**Gruppen**
|
||||
|
||||
|
||||
- <a href="https://kakste.com/profile/newhere">Neu hier?</a> - eine Gruppe für Leute, die neu bei Friendica sind
|
||||
|
||||
- <a href="http://helpers.pyxis.uberspace.de/profile/helpers">Friendica Support</a> - Probleme? Dann ist das der Platz, um zu fragen!
|
||||
|
||||
- <a href="https://kakste.com/profile/public_stream">Öffentlicher Stream</a> - ein Platz, um über alles mit jedem zu reden.
|
||||
|
||||
- <a href="https://letstalk.pyxis.uberspace.de/profile/letstalk">Let's Talk</a> eine Gruppe, um Leute und Gruppen mit gleichen Interessen zu finden
|
||||
|
||||
- <a href="http://newzot.hydra.uberspace.de/profile/newzot">Local Friendica</a> eine Seite für lokale Friendica-Gruppen</a>
|
||||
|
||||
|
||||
**Dokumentation**
|
||||
|
||||
- <a href="help/Connectors">Zu weiteren Netzwerken verbinden</a>
|
||||
- <a href="help">Zur Startseite der Hilfe</a>
|
||||
|
||||
|
16
doc/de/groupsandpages.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
Gruppen und Seiten
|
||||
==========
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Hier siehst du das globale Verzeichnis. Wenn du dich mal verirrt hast, kannst du <a href = "help/groupsandpages">diesen Link klicken</a> und wieder hierher kommen.
|
||||
|
||||
Auf dieser Seite findest du eine Zusammenstellung von Gruppen, Foren und bekannten Seiten. Gruppen sind keine realen Personen. Sich mit diesen zu verbinden ist, als wenn man jemanden auf Facebook "liked" ("gefällt mir") oder wenn man sich in einem Forum anmeldet. Habe keine Sorge, falls du dich unbehaglich fühlst, wenn du dich einer neuen Person vorstellen sollst, da es sich nicht um Personen handelt.
|
||||
|
||||
Wenn du dich mit einer Gruppe verbindest, erscheinen alle Nachrichten der Gruppe in deinem "Netzwerk"-Tab. Du kannst diese Beiträge kommentieren oder selbst in der Gruppe schreiben, ohne eine der Gruppenmitglieder persönlich hinzuzufügen. Das ist ein großartiger Weg, dynamisch neue Freunde zu gewinnen. Du findest Personen, die du magst, anstatt Fremde hinzuzufügen. Suche dir einfach eine Gruppe und füge sie so hinzu, wie du auch normale Freunde hinzufügst. Es gibt eine Menge Gruppen und möglicherweise findest du nicht wieder zu dieser Seite zurück. In diesem Fall nutze einfach den Link oben auf dieser Seite.
|
||||
|
||||
Wenn du einige Gruppen hinzugefügt hast, gehe <a href="help/andfinally">weiter zum nächsten Schritt</a>.
|
||||
|
||||
<iframe src="http://dir.friendica.com/directory/forum" width="950" height="600"></iframe>
|
||||
|
||||
|
17
doc/de/guide.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
Erste Schritte...
|
||||
==========
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Das Erste zum Anfang: geh sicher, dass du schon eingeloggt bist. Wenn du noch nicht eingeloggt bist, kannst du das in dem Fenster unten machen.
|
||||
|
||||
Sobald du eingeloggt bist (oder wenn du bereits eingeloggt bist), kannst du unten nun auf deine Profilseite schauen.
|
||||
|
||||
Hier sieht es ein wenig wie auf deiner Facebook-Seite aus. Hier findest du alle deine Statusmeldungen und Nachrichten deiner Freunde, die direkt auf deine Seite ("Wall") geschrieben haben. Um deinen Status einzutragen, klicke einfach auf die Box oben, in der "Teilen" steht. Wenn du das machst, vergrößert sich die Box. Nun kannst du einige Formatierungsoptionen wie Fett, kursiv, unterstrichen auswählen und ebenfalls Bilder und Links hinzufügen. Unten findest du in diesem Feld weitere Links, mit denen du Bilder und Dateien von deinem Computer hochladen, Webseiten mit einem Kurztext teilen und Video- und Audiodateien aus dem Internet einfügen kannst. Außerdem kannst du hier eintragen, wo du gerade bist.
|
||||
|
||||
Wenn du deinen Beitrag ("Post") geschrieben hast, kannst du auf das "Schloss"-Symbol klicken und festlegen, wer deinen Beitrag sehen kann. Wenn du dieses Symbol nicht anklickst, ist dein Beitrag öffentlich. Das bedeutet, dass jeder, der dein Profil ansieht, der auf dem "Community"-Tab deines Servers oder auf dem "Netzwerk"-Tab ("Beiträge deiner Kontakte") eines befreundeten Kontakts ist, den Beitrag sehen kann.
|
||||
|
||||
Probiere es doch einfach mal aus. Wenn du fertg bist, schauen wir uns den <a href="help/network">"Netzwerk"-Tab</a> an.
|
||||
|
||||
<iframe src="login" width="950" height="600"></iframe>
|
||||
|
16
doc/de/makingnewfriends.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
Neue Freunde finden
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Hier siehst du die Kontaktvorschläge. Wenn du dich mal verirrt hast, kannst du <a href="help/makenewfriends">diesen Link klicken</a> und wieder hierher kommen.
|
||||
|
||||
Diese Seite ist ein wenig wie die Kontaktvorschläge in Facebook. Jeder auf dieser Liste hat zugestimmt, als Kontaktvorschlag zu erscheinen. Das bedeutet, das sie Anfragen meist nicht ablehnen, da sie neue Leute kennenlernen wollen.
|
||||
|
||||
Siehst du jemanden, dessen Aussehen du magst? Klicke auf den "Verbinden"-Button beim Foto. Als nächstes kommst du zur Seite "Freundschafts-/Kontaktanfrage". Fülle das Formular wie vorgegeben aus und trage optional eine kleine Notiz ein. Nun musst du nur noch auf die Bestätigung warten. Beachte dabei, dass es sich um reale Personen handelt und es somit etwas dauern kann. Jetzt, nachdem du jemanden hinzugefügt hast, weißt du vielleicht nicht mehr, wie du zurückkommst. Klicke einfach auf den Link oben auf dieser Seite und du kommst zurück zur Seite mit den Kontaktvorschlägen, um weitere Personen hinzuzufügen.
|
||||
|
||||
Du willst nicht einfach Personen hinzufügen, die du nicht kennst? Kein Problem - an dieser Stelle kommen wir zu den <a href="help/groupsandpages">Gruppen und Seiten</a>.
|
||||
|
||||
<iframe src="suggest" width="950" height="600"></iframe>
|
||||
|
||||
|
14
doc/de/network.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
Deine "Netzwerk"-Seite
|
||||
==============
|
||||
|
||||
* [Zur Startseite der Hilfe](help)
|
||||
|
||||
Das ist dein "Netzwerk"-Tab. Wenn du dich mal verirrt hast, kannst du <a href="help/network">diesen Link klicken</a>, um wieder hierher zu kommen.
|
||||
|
||||
Diese Seite ist ein wenig wie die News-Seite in Facebook oder der Stream in Diaspora. Hier findest du alle Beiträge deiner Kontakte, Gruppen und Feeds, die du eingetragen hast. Wenn du neu bist, siehst du hier noch nichts, falls du deinen Status im letzten Schritt noch nicht eingetragen hast. Wenn du bereits ein paar Freunde eingetragen hast, findest du hier ihre Beiträge. Hier kannst du Beiträge kommentieren, eintragen, dass du den Beitrag magst oder ablehnst oder die Profile durch einen Klick auf deren Namen anschauen und auf deren Seite ("Wall") Nachrichten schreiben.
|
||||
|
||||
Nun wollen wir diese Seite mit Inhalt füllen. Der erste Schritt ist es, Leute <a href="help/makingnewfriends">zu deinem Account hinzuzufügen</a>.
|
||||
|
||||
<iframe src="network" width="950" height="600"></iframe>
|
||||
|
||||
|
BIN
doc/img/camera.png
Normal file
After Width: | Height: | Size: 828 B |
BIN
doc/img/chain.png
Normal file
After Width: | Height: | Size: 709 B |
BIN
doc/img/darkbubble.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
doc/img/darkzero.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
doc/img/diabook.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
doc/img/dispy.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
doc/img/editor_darkbubble.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
doc/img/editor_frost.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
doc/img/editor_vier.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
doc/img/editor_zero.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
doc/img/friendica_editor.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
doc/img/frost.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
doc/img/globe.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
doc/img/mic.png
Normal file
After Width: | Height: | Size: 1,017 B |
BIN
doc/img/padlock.png
Normal file
After Width: | Height: | Size: 393 B |
BIN
doc/img/paper_clip.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
doc/img/post_categorize.png
Normal file
After Width: | Height: | Size: 488 B |
BIN
doc/img/post_choose.png
Normal file
After Width: | Height: | Size: 321 B |
BIN
doc/img/post_delete.png
Normal file
After Width: | Height: | Size: 378 B |
BIN
doc/img/post_link.png
Normal file
After Width: | Height: | Size: 572 B |
BIN
doc/img/post_mark.png
Normal file
After Width: | Height: | Size: 739 B |
BIN
doc/img/post_share.png
Normal file
After Width: | Height: | Size: 444 B |
BIN
doc/img/post_tag.png
Normal file
After Width: | Height: | Size: 612 B |
BIN
doc/img/post_thumbs_down.png
Normal file
After Width: | Height: | Size: 521 B |
BIN
doc/img/post_thumbs_up.png
Normal file
After Width: | Height: | Size: 508 B |
BIN
doc/img/posts_define.png
Normal file
After Width: | Height: | Size: 3 KiB |
BIN
doc/img/video.png
Normal file
After Width: | Height: | Size: 547 B |
|
@ -2,7 +2,7 @@ This is your Network Tab. If you get lost, you can <a href="help/network">click
|
|||
|
||||
This is a bit like the Newsfeed at Facebook or the Stream at Diaspora. It's where all the posts from your contacts, groups, and feeds will appear. If you're new, you won't see anything in this page, unless you posted your status in the last step. If you've already added a few friends, you'll be able to see their posts. Here, you can comment, like, or dislike posts, or click on somebody's name to visit their profile page where you can write on their wall.
|
||||
|
||||
Now we need to fill it up, the first step, is to <a href="help/peopleyouknow"> add people you already know from Facebook</a>.
|
||||
Now we need to fill it up, the first step, is to <a href="help/makingnewfriends"> make some new friends</a>.
|
||||
|
||||
<iframe src="network" width="950" height="600"></iframe>
|
||||
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
This is your connector settings page. If you get lost, you can <a href="help/network">click this link</a> to bring yourself back here.
|
||||
|
||||
This is the bit that makes Friendica unique. You can connect to <i>anybody on the internet</i> from your Friendica account using this page! The available connectors varies depending on which plugins you have installed, but for now, we'll walk you through Facebook. Note that not all servers have the Facebook connector installed. If you can't find it in the list below, don't worry, we'll look at ways of connecting to more people in the following pages.
|
||||
|
||||
The biggest of all social networks is Facebook. Fortunately, this connector is really easy. Scroll down the page, and click Facebook Connector Settings. Enter your Facebook user name and password and let the application (the connector) do everything the options suggest. You can <a href="https://github.com/friendica/friendica/wiki/How-to:-Friendica%E2%80%99s-Facebook-connector" target="_blank">fine tune this</a> or experiment with the other connectors too. If you need help, you can always ask at <a href="http://helpers.pyxis.uberspace.de/profile/helpers" target="_blank">Friendica Support</a> or <a href="help/Connectors" target="_blank">see the instructions here</a>.
|
||||
|
||||
When you're ready, we can move on to <a href="help/makingnewfriends">making new friends</a>.
|
||||
|
||||
|
||||
|
||||
<iframe src="settings/connectors" width="950" height="600"></iframe>
|
||||
|
||||
|
|
@ -54,8 +54,8 @@ $a->config['php_path'] = 'php';
|
|||
// You shouldn't need to change anything else.
|
||||
// Location of global directory submission page.
|
||||
|
||||
$a->config['system']['directory_submit_url'] = 'http://dir.friendika.com/submit';
|
||||
$a->config['system']['directory_search_url'] = 'http://dir.friendika.com/directory?search=';
|
||||
$a->config['system']['directory_submit_url'] = 'http://dir.friendica.com/submit';
|
||||
$a->config['system']['directory_search_url'] = 'http://dir.friendica.com/directory?search=';
|
||||
|
||||
// PuSH - aka pubsubhubbub URL. This makes delivery of public posts as fast as private posts
|
||||
|
||||
|
|
Before Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 659 B |
Before Width: | Height: | Size: 756 B |
Before Width: | Height: | Size: 280 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 5.4 KiB |
|
@ -1,240 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="96"
|
||||
height="96"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.0 r9654"
|
||||
sodipodi:docname="friendika.svg"
|
||||
inkscape:export-filename="/home/meta/Documents/My random images/friendika.png"
|
||||
inkscape:export-xdpi="80.552788"
|
||||
inkscape:export-ydpi="80.552788">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
id="highlightgradient">
|
||||
<stop
|
||||
id="stop3833"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:0.74374998;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3829" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="shadowgradient">
|
||||
<stop
|
||||
id="stop3833-5"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:0.5;" />
|
||||
<stop
|
||||
style="stop-color:#818080;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3829-9" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#highlightgradient"
|
||||
id="linearGradient4011"
|
||||
x1="44.948269"
|
||||
y1="0"
|
||||
x2="54.103466"
|
||||
y2="46.797421"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1,0.54545455)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#shadowgradient"
|
||||
id="linearGradient4021"
|
||||
x1="52.016712"
|
||||
y1="96"
|
||||
x2="42.867535"
|
||||
y2="41.837971"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,0.5,0,48)" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter4055"
|
||||
x="-0.03"
|
||||
width="1.06"
|
||||
y="-0.12"
|
||||
height="1.24">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="1.2"
|
||||
id="feGaussianBlur4057" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter4059"
|
||||
x="-0.029877551"
|
||||
width="1.0597551"
|
||||
y="-0.122"
|
||||
height="1.244">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="1.22"
|
||||
id="feGaussianBlur4061" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="2.9132799"
|
||||
inkscape:cx="53.033009"
|
||||
inkscape:cy="2.8284271"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
width="256px"
|
||||
inkscape:snap-global="true"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="1010"
|
||||
inkscape:window-x="194"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
empspacing="3"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
spacingx="2px"
|
||||
spacingy="2px" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Colors"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-956.3622)"
|
||||
style="display:inline">
|
||||
<path
|
||||
style="fill:#ffc019;fill-opacity:1;stroke:none"
|
||||
d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
|
||||
transform="translate(0,956.3622)"
|
||||
id="rect2993"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccsccccccccc" />
|
||||
<path
|
||||
style="fill:#1872a2;fill-opacity:1;stroke:none"
|
||||
d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
|
||||
id="rect2993-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccsccccccccc" />
|
||||
</g>
|
||||
<g
|
||||
style="display:inline"
|
||||
inkscape:label="Lines as original logo"
|
||||
id="g3997"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3999"
|
||||
d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
|
||||
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<rect
|
||||
ry="16"
|
||||
rx="16"
|
||||
y="0"
|
||||
x="0"
|
||||
height="96"
|
||||
width="96"
|
||||
id="rect4001"
|
||||
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Lines with center break"
|
||||
style="display:none">
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
|
||||
id="path3926"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
id="rect3928"
|
||||
width="96"
|
||||
height="96"
|
||||
x="0"
|
||||
y="0"
|
||||
rx="16"
|
||||
ry="16" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Effects"
|
||||
style="display:inline">
|
||||
<rect
|
||||
style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
|
||||
id="rect3823"
|
||||
width="96"
|
||||
height="48.04369"
|
||||
x="-3.1086245e-15"
|
||||
y="1.8024861e-14"
|
||||
ry="15.215644"
|
||||
rx="15.214664" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
|
||||
id="rect3823-8"
|
||||
width="96"
|
||||
height="47.86721"
|
||||
x="1.5376101e-14"
|
||||
y="-96"
|
||||
ry="15.159752"
|
||||
rx="15.214664"
|
||||
transform="scale(1,-1)" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
|
||||
id="rect4003"
|
||||
width="98"
|
||||
height="24"
|
||||
x="0"
|
||||
y="0"
|
||||
rx="15.214664"
|
||||
ry="8.2994423"
|
||||
transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
|
||||
<rect
|
||||
style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
|
||||
id="rect4013"
|
||||
width="96"
|
||||
height="24"
|
||||
x="0"
|
||||
y="72"
|
||||
rx="14.008356"
|
||||
ry="12"
|
||||
transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1 KiB |
BIN
images/tag.png
Before Width: | Height: | Size: 528 B |
BIN
images/tag_b.png
Before Width: | Height: | Size: 346 B |
|
@ -192,6 +192,7 @@ function contact_photo_menu($contact) {
|
|||
$status_link="";
|
||||
$photos_link="";
|
||||
$posts_link="";
|
||||
$poke_link="";
|
||||
|
||||
$sparkle = false;
|
||||
if($contact['network'] === NETWORK_DFRN) {
|
||||
|
@ -211,10 +212,12 @@ function contact_photo_menu($contact) {
|
|||
$pm_url = $a->get_baseurl() . '/message/new/' . $contact['id'];
|
||||
}
|
||||
|
||||
$poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['id'];
|
||||
$contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
|
||||
$posts_link = $a->get_baseurl() . '/network/?cid=' . $contact['id'];
|
||||
|
||||
$menu = Array(
|
||||
t("Poke") => $poke_link,
|
||||
t("View Status") => $status_link,
|
||||
t("View Profile") => $profile_link,
|
||||
t("View Photos") => $photos_link,
|
||||
|
|
|
@ -4,6 +4,11 @@ if(! class_exists("Photo")) {
|
|||
class Photo {
|
||||
|
||||
private $image;
|
||||
|
||||
/**
|
||||
* Put back gd stuff, not everybody have Imagick
|
||||
*/
|
||||
private $imagick;
|
||||
private $width;
|
||||
private $height;
|
||||
private $valid;
|
||||
|
@ -14,20 +19,125 @@ class Photo {
|
|||
* supported mimetypes and corresponding file extensions
|
||||
*/
|
||||
static function supportedTypes() {
|
||||
if(class_exists('Imagick')) {
|
||||
/**
|
||||
* Imagick::queryFormats won't help us a lot there...
|
||||
* At least, not yet, other parts of friendica uses this array
|
||||
*/
|
||||
$t = array(
|
||||
'image/jpeg' => 'jpg',
|
||||
'image/png' => 'png',
|
||||
'image/gif' => 'gif'
|
||||
);
|
||||
} else {
|
||||
$t = array();
|
||||
$t['image/jpeg'] ='jpg';
|
||||
if (imagetypes() & IMG_PNG) $t['image/png'] = 'png';
|
||||
}
|
||||
|
||||
return $t;
|
||||
}
|
||||
|
||||
public function __construct($data, $type="image/jpeg") {
|
||||
|
||||
public function __construct($data, $type=null) {
|
||||
$this->imagick = class_exists('Imagick');
|
||||
$this->types = $this->supportedTypes();
|
||||
if (!array_key_exists($type,$this->types)){
|
||||
$type='image/jpeg';
|
||||
}
|
||||
$this->valid = false;
|
||||
$this->type = $type;
|
||||
|
||||
if($this->is_imagick() && $this->load_data($data)) {
|
||||
return true;
|
||||
} else {
|
||||
// Failed to load with Imagick, fallback
|
||||
$this->imagick = false;
|
||||
}
|
||||
return $this->load_data($data);
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
if($this->image) {
|
||||
if($this->is_imagick()) {
|
||||
$this->image->clear();
|
||||
$this->image->destroy();
|
||||
return;
|
||||
}
|
||||
imagedestroy($this->image);
|
||||
}
|
||||
}
|
||||
|
||||
public function is_imagick() {
|
||||
return $this->imagick;
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps Mime types to Imagick formats
|
||||
*/
|
||||
public function get_FormatsMap() {
|
||||
$m = array(
|
||||
'image/jpeg' => 'JPG',
|
||||
'image/png' => 'PNG',
|
||||
'image/gif' => 'GIF'
|
||||
);
|
||||
return $m;
|
||||
}
|
||||
|
||||
private function load_data($data) {
|
||||
if($this->is_imagick()) {
|
||||
$this->image = new Imagick();
|
||||
try {
|
||||
$this->image->readImageBlob($data);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
// Imagick couldn't use the data
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup the image to the format it will be saved to
|
||||
*/
|
||||
$map = $this->get_FormatsMap();
|
||||
$format = $map[$type];
|
||||
$this->image->setFormat($format);
|
||||
|
||||
// Always coalesce, if it is not a multi-frame image it won't hurt anyway
|
||||
$this->image = $this->image->coalesceImages();
|
||||
|
||||
/**
|
||||
* setup the compression here, so we'll do it only once
|
||||
*/
|
||||
switch($this->getType()){
|
||||
case "image/png":
|
||||
$quality = get_config('system','png_quality');
|
||||
if((! $quality) || ($quality > 9))
|
||||
$quality = PNG_QUALITY;
|
||||
/**
|
||||
* From http://www.imagemagick.org/script/command-line-options.php#quality:
|
||||
*
|
||||
* 'For the MNG and PNG image formats, the quality value sets
|
||||
* the zlib compression level (quality / 10) and filter-type (quality % 10).
|
||||
* The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering,
|
||||
* unless the image has a color map, in which case it means compression level 7 with no PNG filtering'
|
||||
*/
|
||||
$quality = $quality * 10;
|
||||
$this->image->setCompressionQuality($quality);
|
||||
break;
|
||||
case "image/jpeg":
|
||||
$quality = get_config('system','jpeg_quality');
|
||||
if((! $quality) || ($quality > 100))
|
||||
$quality = JPEG_QUALITY;
|
||||
$this->image->setCompressionQuality($quality);
|
||||
}
|
||||
|
||||
// The 'width' and 'height' properties are only used by non-Imagick routines.
|
||||
$this->width = $this->image->getImageWidth();
|
||||
$this->height = $this->image->getImageHeight();
|
||||
$this->valid = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->valid = false;
|
||||
$this->image = @imagecreatefromstring($data);
|
||||
if($this->image !== FALSE) {
|
||||
$this->width = imagesx($this->image);
|
||||
|
@ -35,41 +145,69 @@ class Photo {
|
|||
$this->valid = true;
|
||||
imagealphablending($this->image, false);
|
||||
imagesavealpha($this->image, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
if($this->image)
|
||||
imagedestroy($this->image);
|
||||
return false;
|
||||
}
|
||||
|
||||
public function is_valid() {
|
||||
if($this->is_imagick())
|
||||
return ($this->image !== FALSE);
|
||||
return $this->valid;
|
||||
}
|
||||
|
||||
public function getWidth() {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick())
|
||||
return $this->image->getImageWidth();
|
||||
return $this->width;
|
||||
}
|
||||
|
||||
public function getHeight() {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick())
|
||||
return $this->image->getImageHeight();
|
||||
return $this->height;
|
||||
}
|
||||
|
||||
public function getImage() {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick()) {
|
||||
/* Clean it */
|
||||
$this->image = $this->image->deconstructImages();
|
||||
return $this->image;
|
||||
}
|
||||
return $this->image;
|
||||
}
|
||||
|
||||
public function getType() {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
public function getExt() {
|
||||
return $this->types[$this->type];
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
return $this->types[$this->getType()];
|
||||
}
|
||||
|
||||
public function scaleImage($max) {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
$width = $this->width;
|
||||
$height = $this->height;
|
||||
$width = $this->getWidth();
|
||||
$height = $this->getHeight();
|
||||
|
||||
$dest_width = $dest_height = 0;
|
||||
|
||||
|
@ -77,7 +215,18 @@ class Photo {
|
|||
return FALSE;
|
||||
|
||||
if($width > $max && $height > $max) {
|
||||
if($width > $height) {
|
||||
|
||||
// very tall image (greater than 16:9)
|
||||
// constrain the width - let the height float.
|
||||
|
||||
if((($height * 9) / 16) > $width) {
|
||||
$dest_width = $max;
|
||||
$dest_height = intval(( $height * $max ) / $width);
|
||||
}
|
||||
|
||||
// else constrain both dimensions
|
||||
|
||||
elseif($width > $height) {
|
||||
$dest_width = $max;
|
||||
$dest_height = intval(( $height * $max ) / $width);
|
||||
}
|
||||
|
@ -93,9 +242,19 @@ class Photo {
|
|||
}
|
||||
else {
|
||||
if( $height > $max ) {
|
||||
|
||||
// very tall image (greater than 16:9)
|
||||
// but width is OK - don't do anything
|
||||
|
||||
if((($height * 9) / 16) > $width) {
|
||||
$dest_width = $width;
|
||||
$dest_height = $height;
|
||||
}
|
||||
else {
|
||||
$dest_width = intval(( $width * $max ) / $height);
|
||||
$dest_height = $max;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$dest_width = $width;
|
||||
$dest_height = $height;
|
||||
|
@ -104,6 +263,29 @@ class Photo {
|
|||
}
|
||||
|
||||
|
||||
if($this->is_imagick()) {
|
||||
/**
|
||||
* If it is not animated, there will be only one iteration here,
|
||||
* so don't bother checking
|
||||
*/
|
||||
// Don't forget to go back to the first frame
|
||||
$this->image->setFirstIterator();
|
||||
do {
|
||||
|
||||
// FIXME - implement horizantal bias for scaling as in followin GD functions
|
||||
// to allow very tall images to be constrained only horizontally.
|
||||
|
||||
$this->image->scaleImage($dest_width, $dest_height);
|
||||
} while ($this->image->nextImage());
|
||||
|
||||
// These may not be necessary any more
|
||||
$this->width = $this->image->getImageWidth();
|
||||
$this->height = $this->image->getImageHeight();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$dest = imagecreatetruecolor( $dest_width, $dest_height );
|
||||
imagealphablending($dest, false);
|
||||
imagesavealpha($dest, true);
|
||||
|
@ -114,16 +296,38 @@ class Photo {
|
|||
$this->image = $dest;
|
||||
$this->width = imagesx($this->image);
|
||||
$this->height = imagesy($this->image);
|
||||
|
||||
}
|
||||
|
||||
public function rotate($degrees) {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick()) {
|
||||
$this->image->setFirstIterator();
|
||||
do {
|
||||
$this->image->rotateImage(new ImagickPixel(), -$degrees); // ImageMagick rotates in the opposite direction of imagerotate()
|
||||
} while ($this->image->nextImage());
|
||||
return;
|
||||
}
|
||||
|
||||
$this->image = imagerotate($this->image,$degrees,0);
|
||||
$this->width = imagesx($this->image);
|
||||
$this->height = imagesy($this->image);
|
||||
}
|
||||
|
||||
public function flip($horiz = true, $vert = false) {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick()) {
|
||||
$this->image->setFirstIterator();
|
||||
do {
|
||||
if($horiz) $this->image->flipImage();
|
||||
if($vert) $this->image->flopImage();
|
||||
} while ($this->image->nextImage());
|
||||
return;
|
||||
}
|
||||
|
||||
$w = imagesx($this->image);
|
||||
$h = imagesy($this->image);
|
||||
$flipped = imagecreate($w, $h);
|
||||
|
@ -143,10 +347,17 @@ class Photo {
|
|||
public function orient($filename) {
|
||||
// based off comment on http://php.net/manual/en/function.imagerotate.php
|
||||
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
|
||||
return;
|
||||
|
||||
$exif = exif_read_data($filename);
|
||||
$exif = @exif_read_data($filename);
|
||||
|
||||
if(! $exif)
|
||||
return;
|
||||
|
||||
$ort = $exif['Orientation'];
|
||||
|
||||
switch($ort)
|
||||
|
@ -189,9 +400,12 @@ class Photo {
|
|||
|
||||
|
||||
public function scaleImageUp($min) {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
$width = $this->width;
|
||||
$height = $this->height;
|
||||
|
||||
$width = $this->getWidth();
|
||||
$height = $this->getHeight();
|
||||
|
||||
$dest_width = $dest_height = 0;
|
||||
|
||||
|
@ -225,6 +439,8 @@ class Photo {
|
|||
}
|
||||
}
|
||||
|
||||
if($this->is_imagick())
|
||||
return $this->scaleImage($dest_width,$dest_height);
|
||||
|
||||
$dest = imagecreatetruecolor( $dest_width, $dest_height );
|
||||
imagealphablending($dest, false);
|
||||
|
@ -236,12 +452,21 @@ class Photo {
|
|||
$this->image = $dest;
|
||||
$this->width = imagesx($this->image);
|
||||
$this->height = imagesy($this->image);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function scaleImageSquare($dim) {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick()) {
|
||||
$this->image->setFirstIterator();
|
||||
do {
|
||||
$this->image->scaleImage($dim, $dim);
|
||||
} while ($this->image->nextImage());
|
||||
return;
|
||||
}
|
||||
|
||||
$dest = imagecreatetruecolor( $dim, $dim );
|
||||
imagealphablending($dest, false);
|
||||
|
@ -257,6 +482,23 @@ class Photo {
|
|||
|
||||
|
||||
public function cropImage($max,$x,$y,$w,$h) {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick()) {
|
||||
$this->image->setFirstIterator();
|
||||
do {
|
||||
$this->image->cropImage($w, $h, $x, $y);
|
||||
/**
|
||||
* We need to remove the canva,
|
||||
* or the image is not resized to the crop:
|
||||
* http://php.net/manual/en/imagick.cropimage.php#97232
|
||||
*/
|
||||
$this->image->setImagePage(0, 0, 0, 0);
|
||||
} while ($this->image->nextImage());
|
||||
return $this->scaleImage($max);
|
||||
}
|
||||
|
||||
$dest = imagecreatetruecolor( $max, $max );
|
||||
imagealphablending($dest, false);
|
||||
imagesavealpha($dest, true);
|
||||
|
@ -270,41 +512,45 @@ class Photo {
|
|||
}
|
||||
|
||||
public function saveImage($path) {
|
||||
switch($this->type){
|
||||
case "image/png":
|
||||
$quality = get_config('system','png_quality');
|
||||
if((! $quality) || ($quality > 9))
|
||||
$quality = PNG_QUALITY;
|
||||
imagepng($this->image, $path, $quality);
|
||||
break;
|
||||
default:
|
||||
$quality = get_config('system','jpeg_quality');
|
||||
if((! $quality) || ($quality > 100))
|
||||
$quality = JPEG_QUALITY;
|
||||
imagejpeg($this->image,$path,$quality);
|
||||
}
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
$string = $this->imageString();
|
||||
file_put_contents($path, $string);
|
||||
}
|
||||
|
||||
public function imageString() {
|
||||
if(!$this->is_valid())
|
||||
return FALSE;
|
||||
|
||||
if($this->is_imagick()) {
|
||||
/* Clean it */
|
||||
$this->image = $this->image->deconstructImages();
|
||||
$string = $this->image->getImagesBlob();
|
||||
return $string;
|
||||
}
|
||||
|
||||
$quality = FALSE;
|
||||
|
||||
ob_start();
|
||||
switch($this->type){
|
||||
|
||||
switch($this->getType()){
|
||||
case "image/png":
|
||||
$quality = get_config('system','png_quality');
|
||||
if((! $quality) || ($quality > 9))
|
||||
$quality = PNG_QUALITY;
|
||||
imagepng($this->image,NULL, $quality);
|
||||
break;
|
||||
default:
|
||||
case "image/jpeg":
|
||||
$quality = get_config('system','jpeg_quality');
|
||||
if((! $quality) || ($quality > 100))
|
||||
$quality = JPEG_QUALITY;
|
||||
|
||||
imagejpeg($this->image,NULL,$quality);
|
||||
}
|
||||
$s = ob_get_contents();
|
||||
$string = ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $s;
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
|
||||
|
@ -354,10 +600,10 @@ class Photo {
|
|||
dbesc(datetime_convert()),
|
||||
dbesc(datetime_convert()),
|
||||
dbesc(basename($filename)),
|
||||
dbesc($this->type),
|
||||
dbesc($this->getType()),
|
||||
dbesc($album),
|
||||
intval($this->height),
|
||||
intval($this->width),
|
||||
intval($this->getHeight()),
|
||||
intval($this->getWidth()),
|
||||
dbesc($this->imageString()),
|
||||
intval($scale),
|
||||
intval($profile),
|
||||
|
@ -379,10 +625,10 @@ class Photo {
|
|||
dbesc(datetime_convert()),
|
||||
dbesc(datetime_convert()),
|
||||
dbesc(basename($filename)),
|
||||
dbesc($this->type),
|
||||
dbesc($this->getType()),
|
||||
dbesc($album),
|
||||
intval($this->height),
|
||||
intval($this->width),
|
||||
intval($this->getHeight()),
|
||||
intval($this->getWidth()),
|
||||
dbesc($this->imageString()),
|
||||
intval($scale),
|
||||
intval($profile),
|
||||
|
@ -418,13 +664,23 @@ function guess_image_type($filename, $fromcurl=false) {
|
|||
$type = $headers['Content-Type'];
|
||||
}
|
||||
if (is_null($type)){
|
||||
// Guessing from extension? Isn't that... dangerous?
|
||||
if(class_exists('Imagick') && file_exists($filename) && is_readable($filename)) {
|
||||
/**
|
||||
* Well, this not much better,
|
||||
* but at least it comes from the data inside the image,
|
||||
* we won't be tricked by a manipulated extension
|
||||
*/
|
||||
$image = new Imagick($filename);
|
||||
$type = $image->getImageMimeType();
|
||||
} else {
|
||||
$ext = pathinfo($filename, PATHINFO_EXTENSION);
|
||||
$types = Photo::supportedTypes();
|
||||
$type = "image/jpeg";
|
||||
foreach ($types as $m=>$e){
|
||||
if ($ext==$e) $type = $m;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG);
|
||||
return $type;
|
||||
|
@ -439,7 +695,7 @@ function import_profile_photo($photo,$uid,$cid) {
|
|||
intval($uid),
|
||||
intval($cid)
|
||||
);
|
||||
if(count($r)) {
|
||||
if(count($r) && strlen($r[0]['resource-id'])) {
|
||||
$hash = $r[0]['resource-id'];
|
||||
}
|
||||
else {
|
||||
|
@ -451,10 +707,7 @@ function import_profile_photo($photo,$uid,$cid) {
|
|||
$filename = basename($photo);
|
||||
$img_str = fetch_url($photo,true);
|
||||
|
||||
// guess mimetype from headers or filename
|
||||
$type = guess_image_type($photo,true);
|
||||
|
||||
|
||||
$img = new Photo($img_str, $type);
|
||||
if($img->is_valid()) {
|
||||
|
||||
|
|
|
@ -394,7 +394,10 @@ function probe_url($url, $mode = PROBE_NORMAL) {
|
|||
}
|
||||
if($link['@attributes']['rel'] === 'diaspora-public-key') {
|
||||
$diaspora_key = base64_decode(unamp($link['@attributes']['href']));
|
||||
if(strstr($diaspora_key,'RSA '))
|
||||
$pubkey = rsatopem($diaspora_key);
|
||||
else
|
||||
$pubkey = $diaspora_key;
|
||||
$diaspora = true;
|
||||
}
|
||||
}
|
||||
|
@ -455,10 +458,10 @@ function probe_url($url, $mode = PROBE_NORMAL) {
|
|||
$poll = 'email ' . random_string();
|
||||
$priority = 0;
|
||||
$x = email_msg_meta($mbox,$msgs[0]);
|
||||
if(stristr($x->from,$orig_url))
|
||||
$adr = imap_rfc822_parse_adrlist($x->from,'');
|
||||
elseif(stristr($x->to,$orig_url))
|
||||
$adr = imap_rfc822_parse_adrlist($x->to,'');
|
||||
if(stristr($x[0]->from,$orig_url))
|
||||
$adr = imap_rfc822_parse_adrlist($x[0]->from,'');
|
||||
elseif(stristr($x[0]->to,$orig_url))
|
||||
$adr = imap_rfc822_parse_adrlist($x[0]->to,'');
|
||||
if(isset($adr)) {
|
||||
foreach($adr as $feadr) {
|
||||
if((strcasecmp($feadr->mailbox,$name) == 0)
|
||||
|
@ -551,6 +554,13 @@ function probe_url($url, $mode = PROBE_NORMAL) {
|
|||
logger('probe_url: scrape_vcard: ' . print_r($vcard,true), LOGGER_DATA);
|
||||
}
|
||||
|
||||
if($diaspora && $addr) {
|
||||
// Diaspora returns the name as the nick. As the nick will never be updated,
|
||||
// let's use the Diaspora nickname (the first part of the handle) as the nick instead
|
||||
$addr_parts = explode('@', $addr);
|
||||
$vcard['nick'] = $addr_parts[0];
|
||||
}
|
||||
|
||||
if($twitter) {
|
||||
logger('twitter: setup');
|
||||
$tid = basename($url);
|
||||
|
@ -560,9 +570,10 @@ function probe_url($url, $mode = PROBE_NORMAL) {
|
|||
else
|
||||
$poll = $tapi . '?screen_name=' . $tid;
|
||||
$profile = 'http://twitter.com/#!/' . $tid;
|
||||
$vcard['photo'] = 'https://api.twitter.com/1/users/profile_image/' . $tid;
|
||||
//$vcard['photo'] = 'https://api.twitter.com/1/users/profile_image/' . $tid;
|
||||
$vcard['photo'] = 'https://api.twitter.com/1/users/profile_image?screen_name=' . $tid . '&size=bigger';
|
||||
$vcard['nick'] = $tid;
|
||||
$vcard['fn'] = $tid . '@twitter';
|
||||
$vcard['fn'] = $tid;
|
||||
}
|
||||
|
||||
if($lastfm) {
|
||||
|
|
|
@ -156,6 +156,7 @@
|
|||
//echo "<pre>"; var_dump($r); die();
|
||||
}
|
||||
}
|
||||
header("HTTP/1.1 404 Not Found");
|
||||
logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true));
|
||||
$r = '<status><error>not implemented</error></status>';
|
||||
switch($type){
|
||||
|
@ -490,7 +491,8 @@
|
|||
$_REQUEST['type'] = 'wall';
|
||||
$_REQUEST['profile_uid'] = local_user();
|
||||
$_REQUEST['api_source'] = true;
|
||||
$txt = urldecode(requestdata('status'));
|
||||
$txt = requestdata('status');
|
||||
//$txt = urldecode(requestdata('status'));
|
||||
|
||||
require_once('library/HTMLPurifier.auto.php');
|
||||
require_once('include/html2bbcode.php');
|
||||
|
@ -554,7 +556,8 @@
|
|||
|
||||
}
|
||||
else
|
||||
$_REQUEST['body'] = urldecode(requestdata('status'));
|
||||
$_REQUEST['body'] = requestdata('status');
|
||||
//$_REQUEST['body'] = urldecode(requestdata('status'));
|
||||
|
||||
$parent = requestdata('in_reply_to_status_id');
|
||||
if(ctype_digit($parent))
|
||||
|
@ -752,6 +755,15 @@
|
|||
|
||||
$ret = api_format_items($r,$user_info);
|
||||
|
||||
// We aren't going to try to figure out at the item, group, and page
|
||||
// level which items you've seen and which you haven't. If you're looking
|
||||
// at the network timeline just mark everything seen.
|
||||
|
||||
$r = q("UPDATE `item` SET `unseen` = 0
|
||||
WHERE `unseen` = 1 AND `uid` = %d",
|
||||
intval($user_info['uid'])
|
||||
);
|
||||
|
||||
|
||||
$data = array('$statuses' => $ret);
|
||||
switch($type){
|
||||
|
@ -1725,4 +1737,6 @@ notifications/follow
|
|||
notifications/leave
|
||||
blocks/exists
|
||||
blocks/blocking
|
||||
lists
|
||||
*/
|
||||
|
||||
|
|
|
@ -10,14 +10,13 @@ function nuke_session() {
|
|||
unset($_SESSION['administrator']);
|
||||
unset($_SESSION['cid']);
|
||||
unset($_SESSION['theme']);
|
||||
unset($_SESSION['mobile-theme']);
|
||||
unset($_SESSION['page_flags']);
|
||||
unset($_SESSION['submanage']);
|
||||
unset($_SESSION['my_url']);
|
||||
unset($_SESSION['my_address']);
|
||||
unset($_SESSION['addr']);
|
||||
unset($_SESSION['return_url']);
|
||||
unset($_SESSION['theme']);
|
||||
unset($_SESSION['page_flags']);
|
||||
}
|
||||
|
||||
|
||||
|
@ -169,23 +168,4 @@ else {
|
|||
}
|
||||
}
|
||||
|
||||
// Returns an array of group id's this contact is a member of.
|
||||
// This array will only contain group id's related to the uid of this
|
||||
// DFRN contact. They are *not* neccessarily unique across the entire site.
|
||||
|
||||
|
||||
if(! function_exists('init_groups_visitor')) {
|
||||
function init_groups_visitor($contact_id) {
|
||||
$groups = array();
|
||||
$r = q("SELECT `gid` FROM `group_member`
|
||||
WHERE `contact-id` = %d ",
|
||||
intval($contact_id)
|
||||
);
|
||||
if(count($r)) {
|
||||
foreach($r as $rr)
|
||||
$groups[] = $rr['gid'];
|
||||
}
|
||||
return $groups;
|
||||
}}
|
||||
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ require_once("include/html2bbcode.php");
|
|||
require_once("include/bbcode.php");
|
||||
require_once("include/markdownify/markdownify.php");
|
||||
|
||||
|
||||
// we don't want to support a bbcode specific markdown interpreter
|
||||
// and the markdown library we have is pretty good, but provides HTML output.
|
||||
// So we'll use that to convert to HTML, then convert the HTML back to bbcode,
|
||||
|
@ -51,10 +52,10 @@ function diaspora2bb($s) {
|
|||
$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3]$2$3[/url]',$s);
|
||||
|
||||
//$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s);
|
||||
$s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$s);
|
||||
$s = preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]',$s);
|
||||
$s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s);
|
||||
$s = preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]',$s);
|
||||
$s = bb_tag_preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]','url',$s);
|
||||
$s = bb_tag_preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]','url',$s);
|
||||
$s = bb_tag_preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]','url',$s);
|
||||
$s = bb_tag_preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]','url',$s);
|
||||
// remove duplicate adjacent code tags
|
||||
$s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
|
||||
|
||||
|
@ -130,63 +131,64 @@ function diaspora_ol($s) {
|
|||
}
|
||||
|
||||
|
||||
function bb2diaspora($Text,$preserve_nl = false) {
|
||||
function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
|
||||
|
||||
//////////////////////
|
||||
// An attempt was made to convert bbcode to html and then to markdown
|
||||
// consisting of the following lines.
|
||||
// I'm undoing this as we have a lot of bbcode constructs which
|
||||
// were simply getting lost, for instance bookmark, vimeo, video, youtube, events, etc.
|
||||
// We can try this again, but need a very good test sequence to verify
|
||||
// all the major bbcode constructs that we use are getting through.
|
||||
//////////////////////
|
||||
/*
|
||||
// bbcode() will convert "[*]" into "<li>" with no closing "</li>"
|
||||
// Markdownify() is unable to handle these, as it makes each new
|
||||
// "<li>" into a deeper nested element until it crashes. So pre-format
|
||||
// the lists as Diaspora lists before sending the $Text to bbcode()
|
||||
//
|
||||
// Note that to get nested lists to work for Diaspora, we would need
|
||||
// to define the closing tag for the list elements. So nested lists
|
||||
// are going to be flattened out in Diaspora for now
|
||||
// Re-enabling the converter again.
|
||||
// The bbcode parser now handles youtube-links (and the other stuff) correctly.
|
||||
// Additionally the html code is now fixed so that lists are now working.
|
||||
|
||||
$endlessloop = 0;
|
||||
while ((((strpos($Text, "[/list]") !== false) && (strpos($Text, "[list") !== false)) ||
|
||||
((strpos($Text, "[/ol]") !== false) && (strpos($Text, "[ol]") !== false)) ||
|
||||
((strpos($Text, "[/ul]") !== false) && (strpos($Text, "[ul]") !== false))) && (++$endlessloop < 20)) {
|
||||
$Text = preg_replace_callback("/\[list\](.*?)\[\/list\]/is", 'diaspora_ul', $Text);
|
||||
$Text = preg_replace_callback("/\[list=1\](.*?)\[\/list\]/is", 'diaspora_ol', $Text);
|
||||
$Text = preg_replace_callback("/\[list=i\](.*?)\[\/list\]/s",'diaspora_ol', $Text);
|
||||
$Text = preg_replace_callback("/\[list=I\](.*?)\[\/list\]/s", 'diaspora_ol', $Text);
|
||||
$Text = preg_replace_callback("/\[list=a\](.*?)\[\/list\]/s", 'diaspora_ol', $Text);
|
||||
$Text = preg_replace_callback("/\[list=A\](.*?)\[\/list\]/s", 'diaspora_ol', $Text);
|
||||
$Text = preg_replace_callback("/\[ul\](.*?)\[\/ul\]/is", 'diaspora_ul', $Text);
|
||||
$Text = preg_replace_callback("/\[ol\](.*?)\[\/ol\]/is", 'diaspora_ol', $Text);
|
||||
}
|
||||
/**
|
||||
* Transform #tags, strip off the [url] and replace spaces with underscore
|
||||
*/
|
||||
$Text = preg_replace_callback('/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', create_function('$match',
|
||||
'return \'#\'. str_replace(\' \', \'_\', $match[2]);'
|
||||
), $Text);
|
||||
|
||||
*/
|
||||
|
||||
// Converting images with size parameters to simple images. Markdown doesn't know it.
|
||||
$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $Text);
|
||||
|
||||
// the following was added on 10-January-2012 due to an inability of Diaspora's
|
||||
// new javascript markdown processor to handle links with images as the link "text"
|
||||
// It is not optimal and may be removed if this ability is restored in the future
|
||||
//if ($fordiaspora)
|
||||
// $Text = preg_replace("/\[url\=([^\[\]]*)\]\s*\[img\](.*?)\[\/img\]\s*\[\/url\]/ism",
|
||||
// "[url]$1[/url]\n[img]$2[/img]", $Text);
|
||||
|
||||
// Convert it to HTML - don't try oembed
|
||||
// $Text = bbcode($Text, $preserve_nl, false);
|
||||
$Text = bbcode($Text, $preserve_nl, false);
|
||||
|
||||
// Now convert HTML to Markdown
|
||||
// $md = new Markdownify(false, false, false);
|
||||
// $Text = $md->parseString($Text);
|
||||
$md = new Markdownify(false, false, false);
|
||||
$Text = $md->parseString($Text);
|
||||
|
||||
// The Markdownify converter converts underscores '_' in URLs to '\_', which
|
||||
// messes up the URL. Manually fix these
|
||||
$count = 1;
|
||||
$pos = bb_find_open_close($Text, '[', ']', $count);
|
||||
while($pos !== false) {
|
||||
$start = substr($Text, 0, $pos['start']);
|
||||
$subject = substr($Text, $pos['start'], $pos['end'] - $pos['start'] + 1);
|
||||
$end = substr($Text, $pos['end'] + 1);
|
||||
|
||||
$subject = str_replace('\_', '_', $subject);
|
||||
$Text = $start . $subject . $end;
|
||||
|
||||
$count++;
|
||||
$pos = bb_find_open_close($Text, '[', ']', $count);
|
||||
}
|
||||
|
||||
// If the text going into bbcode() has a plain URL in it, i.e.
|
||||
// with no [url] tags around it, it will come out of parseString()
|
||||
// looking like: <http://url.com>, which gets removed by strip_tags().
|
||||
// So take off the angle brackets of any such URL
|
||||
// $Text = preg_replace("/<http(.*?)>/is", "http$1", $Text);
|
||||
$Text = preg_replace("/<http(.*?)>/is", "http$1", $Text);
|
||||
|
||||
// Remove all unconverted tags
|
||||
// $Text = strip_tags($Text);
|
||||
|
||||
//////
|
||||
// end of bb->html->md conversion attempt
|
||||
//////
|
||||
$Text = strip_tags($Text);
|
||||
|
||||
|
||||
/* Old routine
|
||||
|
||||
$ev = bbtoevent($Text);
|
||||
|
||||
|
@ -362,6 +364,7 @@ function bb2diaspora($Text,$preserve_nl = false) {
|
|||
|
||||
$Text = preg_replace_callback('/\[(.*?)\]\((.*?)\)/ism','unescape_underscores_in_links',$Text);
|
||||
|
||||
*/
|
||||
|
||||
// Remove any leading or trailing whitespace, as this will mess up
|
||||
// the Diaspora signature verification and cause the item to disappear
|
||||
|
|
|
@ -47,6 +47,89 @@ function bb_unspacefy_and_trim($st) {
|
|||
return $unspacefied;
|
||||
}
|
||||
|
||||
function bb_find_open_close($s, $open, $close, $occurance = 1) {
|
||||
|
||||
if($occurance < 1)
|
||||
$occurance = 1;
|
||||
|
||||
$start_pos = -1;
|
||||
for($i = 1; $i <= $occurance; $i++) {
|
||||
if( $start_pos !== false)
|
||||
$start_pos = strpos($s, $open, $start_pos + 1);
|
||||
}
|
||||
|
||||
if( $start_pos === false)
|
||||
return false;
|
||||
|
||||
$end_pos = strpos($s, $close, $start_pos);
|
||||
|
||||
if( $end_pos === false)
|
||||
return false;
|
||||
|
||||
$res = array( 'start' => $start_pos, 'end' => $end_pos );
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
function get_bb_tag_pos($s, $name, $occurance = 1) {
|
||||
|
||||
if($occurance < 1)
|
||||
$occurance = 1;
|
||||
|
||||
$start_open = -1;
|
||||
for($i = 1; $i <= $occurance; $i++) {
|
||||
if( $start_open !== false)
|
||||
$start_open = strpos($s, '[' . $name, $start_open + 1); // allow [name= type tags
|
||||
}
|
||||
|
||||
if( $start_open === false)
|
||||
return false;
|
||||
|
||||
$start_equal = strpos($s, '=', $start_open);
|
||||
$start_close = strpos($s, ']', $start_open);
|
||||
|
||||
if( $start_close === false)
|
||||
return false;
|
||||
|
||||
$start_close++;
|
||||
|
||||
$end_open = strpos($s, '[/' . $name . ']', $start_close);
|
||||
|
||||
if( $end_open === false)
|
||||
return false;
|
||||
|
||||
$res = array( 'start' => array('open' => $start_open, 'close' => $start_close),
|
||||
'end' => array('open' => $end_open, 'close' => $end_open + strlen('[/' . $name . ']')) );
|
||||
if( $start_equal !== false)
|
||||
$res['start']['equal'] = $start_equal + 1;
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
function bb_tag_preg_replace($pattern, $replace, $name, $s) {
|
||||
|
||||
$string = $s;
|
||||
|
||||
$occurance = 1;
|
||||
$pos = get_bb_tag_pos($string, $name, $occurance);
|
||||
while($pos !== false && $occurance < 1000) {
|
||||
|
||||
$start = substr($string, 0, $pos['start']['open']);
|
||||
$subject = substr($string, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
|
||||
$end = substr($string, $pos['end']['close']);
|
||||
if($end === false)
|
||||
$end = '';
|
||||
|
||||
$subject = preg_replace($pattern, $replace, $subject);
|
||||
$string = $start . $subject . $end;
|
||||
|
||||
$occurance++;
|
||||
$pos = get_bb_tag_pos($string, $name, $occurance);
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
if(! function_exists('bb_extract_images')) {
|
||||
function bb_extract_images($body) {
|
||||
|
||||
|
@ -123,6 +206,10 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
|
|||
$Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
|
||||
|
||||
|
||||
// Move all spaces out of the tags
|
||||
$Text = preg_replace("/\[(\w*)\](\s*)/ism", '$2[$1]', $Text);
|
||||
$Text = preg_replace("/(\s*)\[\/(\w*)\]/ism", '[/$2]$1', $Text);
|
||||
|
||||
// Extract the private images which use data url's since preg has issues with
|
||||
// large data sizes. Stash them away while we do bbcode conversion, and then put them back
|
||||
// in after we've done all the regex matching. We cannot use any preg functions to do this.
|
||||
|
@ -220,6 +307,12 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
|
|||
// Check for list text
|
||||
$Text = str_replace("[*]", "<li>", $Text);
|
||||
|
||||
// Check for style sheet commands
|
||||
$Text = preg_replace("(\[style=(.*?)\](.*?)\[\/style\])ism","<span style=\"$1;\">$2</span>",$Text);
|
||||
|
||||
// Check for CSS classes
|
||||
$Text = preg_replace("(\[class=(.*?)\](.*?)\[\/class\])ism","<span class=\"$1\">$2</span>",$Text);
|
||||
|
||||
// handle nested lists
|
||||
$endlessloop = 0;
|
||||
|
||||
|
@ -313,21 +406,30 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
|
|||
$Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
|
||||
|
||||
|
||||
$Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '<video src="$1" controls="controls" width="425" height="350"><a href="$1">$1</a></video>', $Text);
|
||||
|
||||
$Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
|
||||
$Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br />', $Text);
|
||||
$Text = preg_replace("/\[crypt=(.*?)\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . '$1' . ' ' . t('Encrypted content') . '" /><br />', $Text);
|
||||
|
||||
|
||||
// Try to Oembed
|
||||
if ($tryoembed) {
|
||||
$Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '<video src="$1" controls="controls" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></video>', $Text);
|
||||
$Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
|
||||
|
||||
$Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", 'tryoembed', $Text);
|
||||
$Text = preg_replace_callback("/\[audio\](.*?)\[\/audio\]/ism", 'tryoembed', $Text);
|
||||
} else {
|
||||
$Text = preg_replace("/\[video\](.*?)\[\/video\]/", '$1', $Text);
|
||||
$Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '$1', $Text);
|
||||
}
|
||||
|
||||
// html5 video and audio
|
||||
|
||||
|
||||
$Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<iframe src="$1" width="425" height="350"><a href="$1">$1</a></iframe>', $Text);
|
||||
|
||||
if ($tryoembed)
|
||||
$Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<iframe src="$1" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></iframe>', $Text);
|
||||
else
|
||||
$Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1">$1</a>', $Text);
|
||||
|
||||
// Youtube extensions
|
||||
if ($tryoembed) {
|
||||
|
@ -340,7 +442,10 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
|
|||
$Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
|
||||
$Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
|
||||
|
||||
$Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '<iframe width="425" height="350" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
|
||||
if ($tryoembed)
|
||||
$Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
|
||||
else
|
||||
$Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", "http://www.youtube.com/watch?v=$1", $Text);
|
||||
|
||||
|
||||
if ($tryoembed) {
|
||||
|
@ -350,7 +455,11 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
|
|||
|
||||
$Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
|
||||
$Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
|
||||
$Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '<iframe width="425" height="350" src="http://player.vimeo.com/video/$1" frameborder="0" ></iframe>', $Text);
|
||||
|
||||
if ($tryoembed)
|
||||
$Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://player.vimeo.com/video/$1" frameborder="0" ></iframe>', $Text);
|
||||
else
|
||||
$Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", "http://vimeo.com/$1", $Text);
|
||||
|
||||
// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
|
||||
|
||||
|
@ -358,6 +467,9 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
|
|||
// oembed tag
|
||||
$Text = oembed_bbcode2html($Text);
|
||||
|
||||
// Avoid triple linefeeds through oembed
|
||||
$Text = str_replace("<br style='clear:left'></span><br /><br />", "<br style='clear:left'></span><br />", $Text);
|
||||
|
||||
// If we found an event earlier, strip out all the event code and replace with a reformatted version.
|
||||
// Replace the event-start section with the entire formatted event. The other bbcode is stripped.
|
||||
// Summary (e.g. title) is required, earlier revisions only required description (in addition to
|
||||
|
@ -383,13 +495,35 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
|
|||
|
||||
|
||||
$Text = preg_replace('/\[\&\;([#a-z0-9]+)\;\]/','&$1;',$Text);
|
||||
$Text = preg_replace('/\&\#039\;/','\'',$Text);
|
||||
$Text = preg_replace('/\"\;/','"',$Text);
|
||||
|
||||
// fix any escaped ampersands that may have been converted into links
|
||||
$Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text);
|
||||
$Text = preg_replace("/\<(.*?)(src|href)=\"[^hfm](.*?)\>/ism",'<$1$2="">',$Text);
|
||||
|
||||
if($saved_image)
|
||||
$Text = bb_replace_images($Text, $saved_image);
|
||||
|
||||
// Clean up the HTML by loading and saving the HTML with the DOM
|
||||
// Only do it when it has to be done - for performance reasons
|
||||
if (!$tryoembed) {
|
||||
$doc = new DOMDocument();
|
||||
$doc->preserveWhiteSpace = false;
|
||||
|
||||
$Text = mb_convert_encoding($Text, 'HTML-ENTITIES', "UTF-8");
|
||||
|
||||
$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);
|
||||
|
||||
$Text = str_replace('<br></li>','</li>', $Text);
|
||||
|
||||
$Text = mb_convert_encoding($Text, "UTF-8", 'HTML-ENTITIES');
|
||||
}
|
||||
|
||||
call_hooks('bbcode',$Text);
|
||||
|
||||
return $Text;
|
||||
|
|
|
@ -68,7 +68,7 @@ function get_config($family, $key, $instore = false) {
|
|||
);
|
||||
if(count($ret)) {
|
||||
// manage array value
|
||||
$val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
|
||||
$val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
|
||||
$a->config[$family][$key] = $val;
|
||||
return $val;
|
||||
}
|
||||
|
@ -162,7 +162,7 @@ function get_pconfig($uid,$family, $key, $instore = false) {
|
|||
);
|
||||
|
||||
if(count($ret)) {
|
||||
$val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
|
||||
$val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
|
||||
$a->config[$uid][$family][$key] = $val;
|
||||
return $val;
|
||||
}
|
||||
|
|
|
@ -142,9 +142,16 @@ function common_friends_visitor_widget($profile_uid) {
|
|||
|
||||
$cid = $zcid = 0;
|
||||
|
||||
if(can_write_wall($a,$profile_uid))
|
||||
$cid = remote_user();
|
||||
else {
|
||||
if(is_array($_SESSION['remote'])) {
|
||||
foreach($_SESSION['remote'] as $visitor) {
|
||||
if($visitor['uid'] == $profile_uid) {
|
||||
$cid = $visitor['cid'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(! $cid) {
|
||||
if(get_my_url()) {
|
||||
$r = q("select id from contact where nurl = '%s' and uid = %d limit 1",
|
||||
dbesc(normalise_link(get_my_url())),
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<?php
|
||||
|
||||
require_once("include/bbcode.php");
|
||||
|
||||
|
||||
// Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
|
||||
// is identical to the code in mod/message.php for 'item_extract_images' and
|
||||
// 'item_redir_and_replace_images'
|
||||
|
@ -51,19 +54,27 @@ function item_redir_and_replace_images($body, $images, $cid) {
|
|||
$origbody = $body;
|
||||
$newbody = '';
|
||||
|
||||
for($i = 0; $i < count($images); $i++) {
|
||||
$search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is';
|
||||
$cnt = 1;
|
||||
$pos = get_bb_tag_pos($origbody, 'url', 1);
|
||||
while($pos !== false && $cnt < 1000) {
|
||||
|
||||
$search = '/\[url\=(.*?)\]\[!#saved_image([0-9]*)#!\]\[\/url\]' . '/is';
|
||||
$replace = '[url=' . z_path() . '/redir/' . $cid
|
||||
. '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ;
|
||||
. '?f=1&url=' . '$1' . '][!#saved_image' . '$2' .'#!][/url]';
|
||||
|
||||
$img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]');
|
||||
$process_part = substr($origbody, 0, $img_end);
|
||||
$origbody = substr($origbody, $img_end);
|
||||
$newbody .= substr($origbody, 0, $pos['start']['open']);
|
||||
$subject = substr($origbody, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
|
||||
$origbody = substr($origbody, $pos['end']['close']);
|
||||
if($origbody === false)
|
||||
$origbody = '';
|
||||
|
||||
$process_part = preg_replace($search, $replace, $process_part);
|
||||
$newbody = $newbody . $process_part;
|
||||
$subject = preg_replace($search, $replace, $subject);
|
||||
$newbody .= $subject;
|
||||
|
||||
$cnt++;
|
||||
$pos = get_bb_tag_pos($origbody, 'url', 1);
|
||||
}
|
||||
$newbody = $newbody . $origbody;
|
||||
$newbody .= $origbody;
|
||||
|
||||
$cnt = 0;
|
||||
foreach($images as $image) {
|
||||
|
@ -73,7 +84,6 @@ function item_redir_and_replace_images($body, $images, $cid) {
|
|||
$newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody);
|
||||
$cnt++;
|
||||
}
|
||||
|
||||
return $newbody;
|
||||
}}
|
||||
|
||||
|
@ -89,7 +99,7 @@ function localize_item(&$item){
|
|||
$item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
|
||||
|
||||
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
||||
if ($item['verb']=== ACTIVITY_LIKE || $item['verb']=== ACTIVITY_DISLIKE){
|
||||
if (activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE)){
|
||||
|
||||
$r = q("SELECT * from `item`,`contact` WHERE
|
||||
`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
|
||||
|
@ -122,18 +132,16 @@ function localize_item(&$item){
|
|||
|
||||
$plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
|
||||
|
||||
switch($item['verb']){
|
||||
case ACTIVITY_LIKE :
|
||||
if(activity_match($item['verb'],ACTIVITY_LIKE)) {
|
||||
$bodyverb = t('%1$s likes %2$s\'s %3$s');
|
||||
break;
|
||||
case ACTIVITY_DISLIKE:
|
||||
}
|
||||
elseif(activity_match($item['verb'],ACTIVITY_DISLIKE)) {
|
||||
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
|
||||
break;
|
||||
}
|
||||
$item['body'] = sprintf($bodyverb, $author, $objauthor, $plink);
|
||||
|
||||
}
|
||||
if ($item['verb']=== ACTIVITY_FRIEND){
|
||||
if (activity_match($item['verb'],ACTIVITY_FRIEND)) {
|
||||
|
||||
if ($item['object-type']=="" || $item['object-type']!== ACTIVITY_OBJ_PERSON) return;
|
||||
|
||||
|
@ -163,7 +171,64 @@ function localize_item(&$item){
|
|||
$item['body'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$Bphoto;
|
||||
|
||||
}
|
||||
if ($item['verb']===ACTIVITY_TAG){
|
||||
if (stristr($item['verb'],ACTIVITY_POKE)) {
|
||||
$verb = urldecode(substr($item['verb'],strpos($item['verb'],'#')+1));
|
||||
if(! $verb)
|
||||
return;
|
||||
if ($item['object-type']=="" || $item['object-type']!== ACTIVITY_OBJ_PERSON) return;
|
||||
|
||||
$Aname = $item['author-name'];
|
||||
$Alink = $item['author-link'];
|
||||
|
||||
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
||||
|
||||
$obj = parse_xml_string($xmlhead.$item['object']);
|
||||
$links = parse_xml_string($xmlhead."<links>".unxmlify($obj->link)."</links>");
|
||||
|
||||
$Bname = $obj->title;
|
||||
$Blink = ""; $Bphoto = "";
|
||||
foreach ($links->link as $l){
|
||||
$atts = $l->attributes();
|
||||
switch($atts['rel']){
|
||||
case "alternate": $Blink = $atts['href'];
|
||||
case "photo": $Bphoto = $atts['href'];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
|
||||
$B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
|
||||
if ($Bphoto!="") $Bphoto = '[url=' . zrl($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
|
||||
|
||||
// we can't have a translation string with three positions but no distinguishable text
|
||||
// So here is the translate string.
|
||||
|
||||
$txt = t('%1$s poked %2$s');
|
||||
|
||||
// now translate the verb
|
||||
|
||||
$txt = str_replace( t('poked'), t($verb), $txt);
|
||||
|
||||
// then do the sprintf on the translation string
|
||||
|
||||
$item['body'] = sprintf($txt, $A, $B). "\n\n\n" . $Bphoto;
|
||||
|
||||
}
|
||||
if (stristr($item['verb'],ACTIVITY_MOOD)) {
|
||||
$verb = urldecode(substr($item['verb'],strpos($item['verb'],'#')+1));
|
||||
if(! $verb)
|
||||
return;
|
||||
|
||||
$Aname = $item['author-name'];
|
||||
$Alink = $item['author-link'];
|
||||
$A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
|
||||
|
||||
$txt = t('%1$s is currently %2$s');
|
||||
|
||||
$item['body'] = sprintf($txt, $A, t($verb));
|
||||
}
|
||||
|
||||
if (activity_match($item['verb'],ACTIVITY_TAG)) {
|
||||
$r = q("SELECT * from `item`,`contact` WHERE
|
||||
`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
|
||||
dbesc($item['parent-uri']));
|
||||
|
@ -200,7 +265,7 @@ function localize_item(&$item){
|
|||
$item['body'] = sprintf( t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag );
|
||||
|
||||
}
|
||||
if ($item['verb']=== ACTIVITY_FAVORITE){
|
||||
if (activity_match($item['verb'],ACTIVITY_FAVORITE)){
|
||||
|
||||
if ($item['object-type']== "")
|
||||
return;
|
||||
|
@ -235,16 +300,60 @@ function localize_item(&$item){
|
|||
$item['body'] = str_replace($mtch[0],'@[url=' . zrl($mtch[1]). ']',$item['body']);
|
||||
}
|
||||
}
|
||||
|
||||
// add zrl's to public images
|
||||
if(preg_match_all('/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
|
||||
foreach($matches as $mtch) {
|
||||
$item['body'] = str_replace($mtch[0],'[url=' . zrl($mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3] ,true) . '][img' . $mtch[4] . ']h' . $mtch[5] . '[/img][/url]',$item['body']);
|
||||
$photo_pattern = "/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is";
|
||||
if(preg_match($photo_pattern,$item['body'])) {
|
||||
$photo_replace = '[url=' . zrl('$1' . '/photos/' . '$2' . '/image/' . '$3' ,true) . '][img' . '$4' . ']h' . '$5' . '[/img][/url]';
|
||||
$item['body'] = bb_tag_preg_replace($photo_pattern, $photo_replace, 'url', $item['body']);
|
||||
}
|
||||
|
||||
// add sparkle links to appropriate permalinks
|
||||
|
||||
$x = stristr($item['plink'],'/display/');
|
||||
if($x) {
|
||||
$sparkle = false;
|
||||
$y = best_link_url($item,$sparkle,true);
|
||||
if(strstr($y,'/redir/'))
|
||||
$item['plink'] = $y . '?f=&url=' . $item['plink'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the total of comments on this item and its desendants
|
||||
*/
|
||||
function count_descendants($item) {
|
||||
$total = count($item['children']);
|
||||
|
||||
if($total > 0) {
|
||||
foreach($item['children'] as $child) {
|
||||
if(! visible_activity($child))
|
||||
$total --;
|
||||
$total += count_descendants($child);
|
||||
}
|
||||
}
|
||||
|
||||
return $total;
|
||||
}
|
||||
|
||||
function visible_activity($item) {
|
||||
|
||||
if(activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE))
|
||||
return false;
|
||||
|
||||
if(activity_match($item['verb'],ACTIVITY_FOLLOW) && $item['object-type'] === ACTIVITY_OBJ_NOTE) {
|
||||
if(! (($item['self']) && ($item['uid'] == local_user()))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* "Render" a conversation or list of items for HTML display.
|
||||
* There are two major forms of display:
|
||||
|
@ -266,33 +375,87 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
|
||||
$profile_owner = 0;
|
||||
$page_writeable = false;
|
||||
$live_update_div = '';
|
||||
|
||||
$previewing = (($preview) ? ' preview ' : '');
|
||||
|
||||
if($mode === 'network') {
|
||||
$profile_owner = local_user();
|
||||
$page_writeable = true;
|
||||
}
|
||||
if(!$update) {
|
||||
// The special div is needed for liveUpdate to kick in for this page.
|
||||
// We only launch liveUpdate if you aren't filtering in some incompatible
|
||||
// way and also you aren't writing a comment (discovered in javascript).
|
||||
|
||||
if($mode === 'profile') {
|
||||
$live_update_div = '<div id="live-network"></div>' . "\r\n"
|
||||
. "<script> var profile_uid = " . $_SESSION['uid']
|
||||
. "; var netargs = '" . substr($a->cmd,8)
|
||||
. '?f='
|
||||
. ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '')
|
||||
. ((x($_GET,'search')) ? '&search=' . $_GET['search'] : '')
|
||||
. ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '')
|
||||
. ((x($_GET,'order')) ? '&order=' . $_GET['order'] : '')
|
||||
. ((x($_GET,'bmark')) ? '&bmark=' . $_GET['bmark'] : '')
|
||||
. ((x($_GET,'liked')) ? '&liked=' . $_GET['liked'] : '')
|
||||
. ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '')
|
||||
. ((x($_GET,'spam')) ? '&spam=' . $_GET['spam'] : '')
|
||||
. ((x($_GET,'nets')) ? '&nets=' . $_GET['nets'] : '')
|
||||
. ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '')
|
||||
. ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '')
|
||||
. ((x($_GET,'file')) ? '&file=' . $_GET['file'] : '')
|
||||
|
||||
. "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
|
||||
}
|
||||
}
|
||||
else if($mode === 'profile') {
|
||||
$profile_owner = $a->profile['profile_uid'];
|
||||
$page_writeable = can_write_wall($a,$profile_owner);
|
||||
}
|
||||
|
||||
if($mode === 'notes') {
|
||||
if(!$update) {
|
||||
$tab = notags(trim($_GET['tab']));
|
||||
$tab = ( $tab ? $tab : 'posts' );
|
||||
if($tab === 'posts') {
|
||||
// This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
|
||||
// because browser prefetching might change it on us. We have to deliver it with the page.
|
||||
|
||||
$live_update_div = '<div id="live-profile"></div>' . "\r\n"
|
||||
. "<script> var profile_uid = " . $a->profile['profile_uid']
|
||||
. "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
else if($mode === 'notes') {
|
||||
$profile_owner = local_user();
|
||||
$page_writeable = true;
|
||||
if(!$update) {
|
||||
$live_update_div = '<div id="live-notes"></div>' . "\r\n"
|
||||
. "<script> var profile_uid = " . local_user()
|
||||
. "; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
|
||||
}
|
||||
|
||||
if($mode === 'display') {
|
||||
}
|
||||
else if($mode === 'display') {
|
||||
$profile_owner = $a->profile['uid'];
|
||||
$page_writeable = can_write_wall($a,$profile_owner);
|
||||
if(!$update) {
|
||||
$live_update_div = '<div id="live-display"></div>' . "\r\n"
|
||||
. "<script> var profile_uid = " . $_SESSION['uid'] . ";"
|
||||
. " var profile_page = 1; </script>";
|
||||
}
|
||||
|
||||
if($mode === 'community') {
|
||||
}
|
||||
else if($mode === 'community') {
|
||||
$profile_owner = 0;
|
||||
$page_writeable = false;
|
||||
if(!$update) {
|
||||
$live_update_div = '<div id="live-community"></div>' . "\r\n"
|
||||
. "<script> var profile_uid = -1; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
|
||||
}
|
||||
}
|
||||
else if($mode === 'search') {
|
||||
$live_update_div = '<div id="live-search"></div>' . "\r\n";
|
||||
}
|
||||
|
||||
$page_dropping = ((local_user() && local_user() == $profile_owner) ? true : false);
|
||||
|
||||
|
||||
if($update)
|
||||
$return_url = $_SESSION['return_url'];
|
||||
|
@ -307,8 +470,6 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
$items = $cb['items'];
|
||||
|
||||
$cmnt_tpl = get_markup_template('comment_item.tpl');
|
||||
$tpl = 'wall_item.tpl';
|
||||
$wallwall = 'wallwall_item.tpl';
|
||||
$hide_comments_tpl = get_markup_template('hide_comments.tpl');
|
||||
|
||||
$alike = array();
|
||||
|
@ -319,6 +480,8 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
$threads = array();
|
||||
$threadsid = -1;
|
||||
|
||||
$page_template = get_markup_template("conversation.tpl");
|
||||
|
||||
if($items && count($items)) {
|
||||
|
||||
if($mode === 'network-new' || $mode === 'search' || $mode === 'community') {
|
||||
|
@ -326,7 +489,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
// "New Item View" on network page or search page results
|
||||
// - just loop through the items and format them minimally for display
|
||||
|
||||
//$tpl = get_markup_template('search_item.tpl');
|
||||
// $tpl = get_markup_template('search_item.tpl');
|
||||
$tpl = 'search_item.tpl';
|
||||
|
||||
foreach($items as $item) {
|
||||
|
@ -357,6 +520,21 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
|
||||
|
||||
|
||||
$tags=array();
|
||||
$hashtags = array();
|
||||
$mentions = array();
|
||||
foreach(explode(',',$item['tag']) as $tag){
|
||||
$tag = trim($tag);
|
||||
if ($tag!="") {
|
||||
$t = bbcode($tag);
|
||||
$tags[] = $t;
|
||||
if($t[0] == '#')
|
||||
$hashtags[] = $t;
|
||||
elseif($t[0] == '@')
|
||||
$mentions[] = $t;
|
||||
}
|
||||
}
|
||||
|
||||
$sp = false;
|
||||
$profile_link = best_link_url($item,$sp);
|
||||
if($profile_link === 'mailbox')
|
||||
|
@ -386,6 +564,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
|
||||
$drop = array(
|
||||
'dropping' => $dropping,
|
||||
'pagedrop' => $page_dropping,
|
||||
'select' => t('Select'),
|
||||
'delete' => t('Delete'),
|
||||
);
|
||||
|
@ -399,7 +578,9 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
|
||||
$body = prepare_body($item,true);
|
||||
|
||||
//$tmp_item = replace_macros($tpl,array(
|
||||
|
||||
list($categories, $folders) = get_cats_and_terms($item);
|
||||
|
||||
$tmp_item = array(
|
||||
'template' => $tpl,
|
||||
'id' => (($preview) ? 'P0' : $item['item_id']),
|
||||
|
@ -412,7 +593,17 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
'thumb' => $profile_avatar,
|
||||
'title' => template_escape($item['title']),
|
||||
'body' => template_escape($body),
|
||||
'tags' => template_escape($tags),
|
||||
'hashtags' => template_escape($hashtags),
|
||||
'mentions' => template_escape($mentions),
|
||||
'txt_cats' => t('Categories:'),
|
||||
'txt_folders' => t('Filed under:'),
|
||||
'has_cats' => ((count($categories)) ? 'true' : ''),
|
||||
'has_folders' => ((count($folders)) ? 'true' : ''),
|
||||
'categories' => $categories,
|
||||
'folders' => $folders,
|
||||
'text' => strip_tags(template_escape($body)),
|
||||
'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
|
||||
'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
|
||||
'location' => template_escape($location),
|
||||
'indent' => '',
|
||||
|
@ -431,6 +622,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
'conv' => (($preview) ? '' : array('href'=> $a->get_baseurl($ssl_state) . '/display/' . $nickname . '/' . $item['id'], 'title'=> t('View in context'))),
|
||||
'previewing' => $previewing,
|
||||
'wait' => t('Please wait'),
|
||||
'thread_level' => 1,
|
||||
);
|
||||
|
||||
$arr = array('item' => $item, 'output' => $tmp_item);
|
||||
|
@ -445,371 +637,56 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
|||
else
|
||||
{
|
||||
// Normal View
|
||||
$page_template = get_markup_template("threaded_conversation.tpl");
|
||||
|
||||
require_once('object/Conversation.php');
|
||||
require_once('object/Item.php');
|
||||
|
||||
// Figure out how many comments each parent has
|
||||
// (Comments all have gravity of 6)
|
||||
// Store the result in the $comments array
|
||||
$conv = new Conversation($mode, $preview);
|
||||
|
||||
$comments = array();
|
||||
// get all the topmost parents
|
||||
// this shouldn't be needed, as we should have only them in our array
|
||||
// But for now, this array respects the old style, just in case
|
||||
|
||||
$threads = array();
|
||||
foreach($items as $item) {
|
||||
if((intval($item['gravity']) == 6) && ($item['id'] != $item['parent'])) {
|
||||
if(! x($comments,$item['parent']))
|
||||
$comments[$item['parent']] = 1;
|
||||
else
|
||||
$comments[$item['parent']] += 1;
|
||||
} elseif(! x($comments,$item['parent']))
|
||||
$comments[$item['parent']] = 0; // avoid notices later on
|
||||
}
|
||||
|
||||
// map all the like/dislike activities for each parent item
|
||||
// Store these in the $alike and $dlike arrays
|
||||
|
||||
foreach($items as $item) {
|
||||
// Can we put this after the visibility check?
|
||||
like_puller($a,$item,$alike,'like');
|
||||
like_puller($a,$item,$dlike,'dislike');
|
||||
}
|
||||
|
||||
$comments_collapsed = false;
|
||||
$comments_seen = 0;
|
||||
$comment_lastcollapsed = false;
|
||||
$comment_firstcollapsed = false;
|
||||
$blowhard = 0;
|
||||
$blowhard_count = 0;
|
||||
|
||||
|
||||
foreach($items as $item) {
|
||||
|
||||
$comment = '';
|
||||
$template = $tpl;
|
||||
$commentww = '';
|
||||
$sparkle = '';
|
||||
$owner_url = $owner_photo = $owner_name = '';
|
||||
|
||||
// We've already parsed out like/dislike for special treatment. We can ignore them now
|
||||
|
||||
if(((activity_match($item['verb'],ACTIVITY_LIKE))
|
||||
|| (activity_match($item['verb'],ACTIVITY_DISLIKE)))
|
||||
&& ($item['id'] != $item['parent']))
|
||||
// Only add what is visible
|
||||
if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
|
||||
continue;
|
||||
|
||||
$toplevelpost = (($item['id'] == $item['parent']) ? true : false);
|
||||
|
||||
|
||||
// Take care of author collapsing and comment collapsing
|
||||
// (author collapsing is currently disabled)
|
||||
// If a single author has more than 3 consecutive top-level posts, squash the remaining ones.
|
||||
// If there are more than two comments, squash all but the last 2.
|
||||
|
||||
if($toplevelpost) {
|
||||
|
||||
$item_writeable = (($item['writable'] || $item['self']) ? true : false);
|
||||
|
||||
$comments_seen = 0;
|
||||
$comments_collapsed = false;
|
||||
$comment_lastcollapsed = false;
|
||||
$comment_firstcollapsed = false;
|
||||
|
||||
$threadsid++;
|
||||
$threads[$threadsid]['id'] = $item['item_id'];
|
||||
$threads[$threadsid]['private'] = $item['private'];
|
||||
$threads[$threadsid]['items'] = array();
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
// prevent private email reply to public conversation from leaking.
|
||||
if($item['network'] === NETWORK_MAIL && local_user() != $item['uid'])
|
||||
if(! visible_activity($item)) {
|
||||
continue;
|
||||
|
||||
$comments_seen ++;
|
||||
$comment_lastcollapsed = false;
|
||||
$comment_firstcollapsed = false;
|
||||
}
|
||||
|
||||
$override_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false);
|
||||
$show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false);
|
||||
$item['pagedrop'] = $page_dropping;
|
||||
|
||||
|
||||
if(($comments[$item['parent']] > 2) && ($comments_seen <= ($comments[$item['parent']] - 2)) && ($item['gravity'] == 6)) {
|
||||
|
||||
if (!$comments_collapsed){
|
||||
$threads[$threadsid]['num_comments'] = sprintf( tt('%d comment','%d comments',$comments[$item['parent']]),$comments[$item['parent']] );
|
||||
$threads[$threadsid]['hide_text'] = t('show more');
|
||||
$comments_collapsed = true;
|
||||
$comment_firstcollapsed = true;
|
||||
if($item['id'] == $item['parent']) {
|
||||
$item_object = new Item($item);
|
||||
$conv->add_thread($item_object);
|
||||
}
|
||||
}
|
||||
if(($comments[$item['parent']] > 2) && ($comments_seen == ($comments[$item['parent']] - 1))) {
|
||||
|
||||
$comment_lastcollapsed = true;
|
||||
}
|
||||
|
||||
$redirect_url = $a->get_baseurl($ssl_state) . '/redir/' . $item['cid'] ;
|
||||
|
||||
$lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
|
||||
|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
|
||||
? t('Private Message')
|
||||
: false);
|
||||
|
||||
|
||||
// Top-level wall post not written by the wall owner (wall-to-wall)
|
||||
// First figure out who owns it.
|
||||
|
||||
$osparkle = '';
|
||||
|
||||
if(($toplevelpost) && (! $item['self']) && ($mode !== 'profile')) {
|
||||
|
||||
if($item['wall']) {
|
||||
|
||||
// On the network page, I am the owner. On the display page it will be the profile owner.
|
||||
// This will have been stored in $a->page_contact by our calling page.
|
||||
// Put this person as the wall owner of the wall-to-wall notice.
|
||||
|
||||
$owner_url = zrl($a->page_contact['url']);
|
||||
$owner_photo = $a->page_contact['thumb'];
|
||||
$owner_name = $a->page_contact['name'];
|
||||
$template = $wallwall;
|
||||
$commentww = 'ww';
|
||||
}
|
||||
|
||||
if((! $item['wall']) && $item['owner-link']) {
|
||||
|
||||
$owner_linkmatch = (($item['owner-link']) && link_compare($item['owner-link'],$item['author-link']));
|
||||
$alias_linkmatch = (($item['alias']) && link_compare($item['alias'],$item['author-link']));
|
||||
$owner_namematch = (($item['owner-name']) && $item['owner-name'] == $item['author-name']);
|
||||
if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
|
||||
|
||||
// The author url doesn't match the owner (typically the contact)
|
||||
// and also doesn't match the contact alias.
|
||||
// The name match is a hack to catch several weird cases where URLs are
|
||||
// all over the park. It can be tricked, but this prevents you from
|
||||
// seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
|
||||
// well that it's the same Bob Smith.
|
||||
|
||||
// But it could be somebody else with the same name. It just isn't highly likely.
|
||||
|
||||
|
||||
$owner_url = $item['owner-link'];
|
||||
$owner_photo = $item['owner-avatar'];
|
||||
$owner_name = $item['owner-name'];
|
||||
$template = $wallwall;
|
||||
$commentww = 'ww';
|
||||
// If it is our contact, use a friendly redirect link
|
||||
if((link_compare($item['owner-link'],$item['url']))
|
||||
&& ($item['network'] === NETWORK_DFRN)) {
|
||||
$owner_url = $redirect_url;
|
||||
$osparkle = ' sparkle';
|
||||
}
|
||||
else
|
||||
$owner_url = zrl($owner_url);
|
||||
$threads = $conv->get_template_data($alike, $dlike);
|
||||
if(!$threads) {
|
||||
logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
|
||||
$threads = array();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$likebuttons = '';
|
||||
$shareable = ((($profile_owner == local_user()) && ($item['private'] != 1)) ? true : false);
|
||||
|
||||
if($page_writeable) {
|
||||
/* if($toplevelpost) { */
|
||||
$likebuttons = array(
|
||||
'like' => array( t("I like this \x28toggle\x29"), t("like")),
|
||||
'dislike' => array( t("I don't like this \x28toggle\x29"), t("dislike")),
|
||||
);
|
||||
if ($shareable) $likebuttons['share'] = array( t('Share this'), t('share'));
|
||||
/* } */
|
||||
|
||||
$qc = $qcomment = null;
|
||||
|
||||
if(in_array('qcomment',$a->plugins)) {
|
||||
$qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null);
|
||||
$qcomment = (($qc) ? explode("\n",$qc) : null);
|
||||
}
|
||||
|
||||
if(($show_comment_box) || (($show_comment_box == false) && ($override_comment_box == false) && ($item['last-child']))) {
|
||||
$comment = replace_macros($cmnt_tpl,array(
|
||||
'$return_path' => '',
|
||||
'$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''),
|
||||
'$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'),
|
||||
'$id' => $item['item_id'],
|
||||
'$parent' => $item['parent'],
|
||||
'$qcomment' => $qcomment,
|
||||
'$profile_uid' => $profile_owner,
|
||||
'$mylink' => $a->contact['url'],
|
||||
'$mytitle' => t('This is you'),
|
||||
'$myphoto' => $a->contact['thumb'],
|
||||
'$comment' => t('Comment'),
|
||||
'$submit' => t('Submit'),
|
||||
'$edbold' => t('Bold'),
|
||||
'$editalic' => t('Italic'),
|
||||
'$eduline' => t('Underline'),
|
||||
'$edquote' => t('Quote'),
|
||||
'$edcode' => t('Code'),
|
||||
'$edimg' => t('Image'),
|
||||
'$edurl' => t('Link'),
|
||||
'$edvideo' => t('Video'),
|
||||
'$preview' => t('Preview'),
|
||||
'$ww' => (($mode === 'network') ? $commentww : '')
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
if(local_user() && link_compare($a->contact['url'],$item['author-link']))
|
||||
$edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit"));
|
||||
else
|
||||
$edpost = false;
|
||||
|
||||
$drop = '';
|
||||
$dropping = false;
|
||||
|
||||
if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user()))
|
||||
$dropping = true;
|
||||
|
||||
$drop = array(
|
||||
'dropping' => $dropping,
|
||||
'select' => t('Select'),
|
||||
'delete' => t('Delete'),
|
||||
);
|
||||
|
||||
$star = false;
|
||||
$filer = false;
|
||||
|
||||
$isstarred = "unstarred";
|
||||
if ($profile_owner == local_user()) {
|
||||
if($toplevelpost) {
|
||||
$isstarred = (($item['starred']) ? "starred" : "unstarred");
|
||||
|
||||
$star = array(
|
||||
'do' => t("add star"),
|
||||
'undo' => t("remove star"),
|
||||
'toggle' => t("toggle star status"),
|
||||
'classdo' => (($item['starred']) ? "hidden" : ""),
|
||||
'classundo' => (($item['starred']) ? "" : "hidden"),
|
||||
'starred' => t('starred'),
|
||||
'tagger' => t("add tag"),
|
||||
'classtagger' => "",
|
||||
);
|
||||
}
|
||||
$filer = t("save to folder");
|
||||
}
|
||||
|
||||
|
||||
$photo = $item['photo'];
|
||||
$thumb = $item['thumb'];
|
||||
|
||||
// Post was remotely authored.
|
||||
|
||||
$diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true);
|
||||
|
||||
$profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
|
||||
|
||||
if($item['author-link'] && (! $item['author-name']))
|
||||
$profile_name = $item['author-link'];
|
||||
|
||||
$sp = false;
|
||||
$profile_link = best_link_url($item,$sp);
|
||||
if($profile_link === 'mailbox')
|
||||
$profile_link = '';
|
||||
if($sp)
|
||||
$sparkle = ' sparkle';
|
||||
else
|
||||
$profile_link = zrl($profile_link);
|
||||
|
||||
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
|
||||
if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
|
||||
$profile_avatar = $a->contacts[$normalised]['thumb'];
|
||||
else
|
||||
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->get_cached_avatar_image($thumb));
|
||||
|
||||
$like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
|
||||
$dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : '');
|
||||
|
||||
$locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
|
||||
call_hooks('render_location',$locate);
|
||||
|
||||
$location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
|
||||
|
||||
$indent = (($toplevelpost) ? '' : ' comment');
|
||||
|
||||
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
|
||||
$indent .= ' shiny';
|
||||
|
||||
//
|
||||
localize_item($item);
|
||||
|
||||
|
||||
$tags=array();
|
||||
foreach(explode(',',$item['tag']) as $tag){
|
||||
$tag = trim($tag);
|
||||
if ($tag!="") $tags[] = bbcode($tag);
|
||||
}
|
||||
|
||||
// Build the HTML
|
||||
|
||||
$body = prepare_body($item,true);
|
||||
//$tmp_item = replace_macros($template,
|
||||
$tmp_item = array(
|
||||
// collapse comments in template. I don't like this much...
|
||||
'comment_firstcollapsed' => $comment_firstcollapsed,
|
||||
'comment_lastcollapsed' => $comment_lastcollapsed,
|
||||
// template to use to render item (wall, walltowall, search)
|
||||
'template' => $template,
|
||||
|
||||
'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
|
||||
'tags' => $tags,
|
||||
'body' => template_escape($body),
|
||||
'text' => strip_tags(template_escape($body)),
|
||||
'id' => $item['item_id'],
|
||||
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
|
||||
'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
|
||||
'to' => t('to'),
|
||||
'wall' => t('Wall-to-Wall'),
|
||||
'vwall' => t('via Wall-To-Wall:'),
|
||||
'profile_url' => $profile_link,
|
||||
'item_photo_menu' => item_photo_menu($item),
|
||||
'name' => template_escape($profile_name),
|
||||
'thumb' => $profile_avatar,
|
||||
'osparkle' => $osparkle,
|
||||
'sparkle' => $sparkle,
|
||||
'title' => template_escape($item['title']),
|
||||
'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
|
||||
'lock' => $lock,
|
||||
'location' => template_escape($location),
|
||||
'indent' => $indent,
|
||||
'owner_url' => $owner_url,
|
||||
'owner_photo' => $owner_photo,
|
||||
'owner_name' => template_escape($owner_name),
|
||||
'plink' => get_plink($item),
|
||||
'edpost' => $edpost,
|
||||
'isstarred' => $isstarred,
|
||||
'star' => $star,
|
||||
'filer' => $filer,
|
||||
'drop' => $drop,
|
||||
'vote' => $likebuttons,
|
||||
'like' => $like,
|
||||
'dislike' => $dislike,
|
||||
'comment' => $comment,
|
||||
'previewing' => $previewing,
|
||||
'wait' => t('Please wait'),
|
||||
|
||||
);
|
||||
|
||||
|
||||
$arr = array('item' => $item, 'output' => $tmp_item);
|
||||
call_hooks('display_item', $arr);
|
||||
|
||||
$threads[$threadsid]['items'][] = $arr['output'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$page_template = get_markup_template("conversation.tpl");
|
||||
$o = replace_macros($page_template, array(
|
||||
'$baseurl' => $a->get_baseurl($ssl_state),
|
||||
'$live_update' => $live_update_div,
|
||||
'$remove' => t('remove'),
|
||||
'$mode' => $mode,
|
||||
'$user' => $a->user,
|
||||
'$threads' => $threads,
|
||||
'$dropping' => ($dropping?t('Delete Selected Items'):False),
|
||||
'$dropping' => ($page_dropping?t('Delete Selected Items'):False),
|
||||
));
|
||||
|
||||
return $o;
|
||||
|
@ -856,12 +733,18 @@ function item_photo_menu($item){
|
|||
if(! count($a->contacts))
|
||||
load_contact_links(local_user());
|
||||
}
|
||||
$sub_link="";
|
||||
$poke_link="";
|
||||
$contact_url="";
|
||||
$pm_url="";
|
||||
$status_link="";
|
||||
$photos_link="";
|
||||
$posts_link="";
|
||||
|
||||
if((local_user()) && local_user() == $item['uid'] && $item['parent'] == $item['id'] && (! $item['self'])) {
|
||||
$sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
|
||||
}
|
||||
|
||||
$sparkle = false;
|
||||
$profile_link = best_link_url($item,$sparkle,$ssl_state);
|
||||
if($profile_link === 'mailbox')
|
||||
|
@ -885,6 +768,7 @@ function item_photo_menu($item){
|
|||
}
|
||||
}
|
||||
if(($cid) && (! $item['self'])) {
|
||||
$poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $cid;
|
||||
$contact_url = $a->get_baseurl($ssl_state) . '/contacts/' . $cid;
|
||||
$posts_link = $a->get_baseurl($ssl_state) . '/network/?cid=' . $cid;
|
||||
|
||||
|
@ -901,12 +785,14 @@ function item_photo_menu($item){
|
|||
}
|
||||
|
||||
$menu = Array(
|
||||
t("Follow Thread") => $sub_link,
|
||||
t("View Status") => $status_link,
|
||||
t("View Profile") => $profile_link,
|
||||
t("View Photos") => $photos_link,
|
||||
t("Network Posts") => $posts_link,
|
||||
t("Edit Contact") => $contact_url,
|
||||
t("Send PM") => $pm_url,
|
||||
t("Poke") => $poke_link
|
||||
);
|
||||
|
||||
|
||||
|
@ -918,7 +804,11 @@ function item_photo_menu($item){
|
|||
|
||||
$o = "";
|
||||
foreach($menu as $k=>$v){
|
||||
if ($v!="") $o .= "<li><a href='$v'>$k</a></li>\n";
|
||||
if(strpos($v,'javascript:') === 0) {
|
||||
$v = substr($v,11);
|
||||
$o .= "<li><a href=\"#\" onclick=\"$v\">$k</a></li>\n";
|
||||
}
|
||||
elseif ($v!="") $o .= "<li><a href=\"$v\">$k</a></li>\n";
|
||||
}
|
||||
return $o;
|
||||
}}
|
||||
|
@ -998,8 +888,25 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
|
|||
$plaintext = true;
|
||||
|
||||
$tpl = get_markup_template('jot-header.tpl');
|
||||
|
||||
$a->page['htmlhead'] .= replace_macros($tpl, array(
|
||||
'$newpost' => 'true',
|
||||
'$baseurl' => $a->get_baseurl(true),
|
||||
'$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
|
||||
'$geotag' => $geotag,
|
||||
'$nickname' => $x['nickname'],
|
||||
'$ispublic' => t('Visible to <strong>everybody</strong>'),
|
||||
'$linkurl' => t('Please enter a link URL:'),
|
||||
'$vidurl' => t("Please enter a video link/URL:"),
|
||||
'$audurl' => t("Please enter an audio link/URL:"),
|
||||
'$term' => t('Tag term:'),
|
||||
'$fileas' => t('Save to Folder:'),
|
||||
'$whereareu' => t('Where are you right now?'),
|
||||
'$delitems' => t('Delete item(s)?')
|
||||
));
|
||||
|
||||
|
||||
$tpl = get_markup_template('jot-end.tpl');
|
||||
$a->page['end'] .= replace_macros($tpl, array(
|
||||
'$newpost' => 'true',
|
||||
'$baseurl' => $a->get_baseurl(true),
|
||||
'$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
|
||||
|
@ -1090,6 +997,9 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
|
|||
'$bang' => $x['bang'],
|
||||
'$profile_uid' => $x['profile_uid'],
|
||||
'$preview' => t('Preview'),
|
||||
'$sourceapp' => t($a->sourcename),
|
||||
'$cancel' => t('Cancel'),
|
||||
'$rand_num' => random_digits(12)
|
||||
));
|
||||
|
||||
|
||||
|
@ -1102,12 +1012,56 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
|
|||
}
|
||||
|
||||
|
||||
function get_item_children($arr, $parent) {
|
||||
$children = array();
|
||||
$a = get_app();
|
||||
foreach($arr as $item) {
|
||||
if($item['id'] != $item['parent']) {
|
||||
if(get_config('system','thread_allow') && $a->theme_thread_allow) {
|
||||
// Fallback to parent-uri if thr-parent is not set
|
||||
$thr_parent = $item['thr-parent'];
|
||||
if($thr_parent == '')
|
||||
$thr_parent = $item['parent-uri'];
|
||||
|
||||
if($thr_parent == $parent['uri']) {
|
||||
$item['children'] = get_item_children($arr, $item);
|
||||
$children[] = $item;
|
||||
}
|
||||
}
|
||||
else if($item['parent'] == $parent['id']) {
|
||||
$children[] = $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $children;
|
||||
}
|
||||
|
||||
function sort_item_children($items) {
|
||||
$result = $items;
|
||||
usort($result,'sort_thr_created_rev');
|
||||
foreach($result as $k => $i) {
|
||||
if(count($result[$k]['children'])) {
|
||||
$result[$k]['children'] = sort_item_children($result[$k]['children']);
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
function add_children_to_list($children, &$arr) {
|
||||
foreach($children as $y) {
|
||||
$arr[] = $y;
|
||||
if(count($y['children']))
|
||||
add_children_to_list($y['children'], $arr);
|
||||
}
|
||||
}
|
||||
|
||||
function conv_sort($arr,$order) {
|
||||
|
||||
if((!(is_array($arr) && count($arr))))
|
||||
return array();
|
||||
|
||||
$parents = array();
|
||||
$children = array();
|
||||
|
||||
foreach($arr as $x)
|
||||
if($x['id'] == $x['parent'])
|
||||
|
@ -1120,21 +1074,22 @@ function conv_sort($arr,$order) {
|
|||
|
||||
if(count($parents))
|
||||
foreach($parents as $i=>$_x)
|
||||
$parents[$i]['children'] = array();
|
||||
$parents[$i]['children'] = get_item_children($arr, $_x);
|
||||
|
||||
foreach($arr as $x) {
|
||||
/*foreach($arr as $x) {
|
||||
if($x['id'] != $x['parent']) {
|
||||
$p = find_thread_parent_index($parents,$x);
|
||||
if($p !== false)
|
||||
$parents[$p]['children'][] = $x;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
if(count($parents)) {
|
||||
foreach($parents as $k => $v) {
|
||||
if(count($parents[$k]['children'])) {
|
||||
$y = $parents[$k]['children'];
|
||||
$parents[$k]['children'] = sort_item_children($parents[$k]['children']);
|
||||
/*$y = $parents[$k]['children'];
|
||||
usort($y,'sort_thr_created_rev');
|
||||
$parents[$k]['children'] = $y;
|
||||
$parents[$k]['children'] = $y;*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1144,8 +1099,9 @@ function conv_sort($arr,$order) {
|
|||
foreach($parents as $x) {
|
||||
$ret[] = $x;
|
||||
if(count($x['children']))
|
||||
foreach($x['children'] as $y)
|
||||
$ret[] = $y;
|
||||
add_children_to_list($x['children'], $ret);
|
||||
/*foreach($x['children'] as $y)
|
||||
$ret[] = $y;*/
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -100,11 +100,33 @@ function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d
|
|||
return str_replace('1','0',$d->format($fmt));
|
||||
}
|
||||
|
||||
$d = new DateTime($s, new DateTimeZone($from));
|
||||
$d->setTimeZone(new DateTimeZone($to));
|
||||
try {
|
||||
$from_obj = new DateTimeZone($from);
|
||||
}
|
||||
catch(Exception $e) {
|
||||
$from_obj = new DateTimeZone('UTC');
|
||||
}
|
||||
|
||||
try {
|
||||
$d = new DateTime($s, $from_obj);
|
||||
}
|
||||
catch(Exception $e) {
|
||||
logger('datetime_convert: exception: ' . $e->getMessage());
|
||||
$d = new DateTime('now', $from_obj);
|
||||
}
|
||||
|
||||
try {
|
||||
$to_obj = new DateTimeZone($to);
|
||||
}
|
||||
catch(Exception $e) {
|
||||
$to_obj = new DateTimeZone('UTC');
|
||||
}
|
||||
|
||||
$d->setTimeZone($to_obj);
|
||||
return($d->format($fmt));
|
||||
}}
|
||||
|
||||
|
||||
// wrapper for date selector, tailored for use in birthday fields
|
||||
|
||||
function dob($dob) {
|
||||
|
|
|
@ -71,22 +71,32 @@ class dba {
|
|||
}
|
||||
|
||||
public function q($sql) {
|
||||
global $a;
|
||||
|
||||
if((! $this->db) || (! $this->connected))
|
||||
return false;
|
||||
|
||||
$this->error = '';
|
||||
|
||||
//if (get_config("system", "db_log") != "")
|
||||
// @file_put_contents(get_config("system", "db_log"), datetime_convert().':'.session_id(). ' Start '.$sql."\n", FILE_APPEND);
|
||||
if(x($a->config,'system') && x($a->config['system'],'db_log'))
|
||||
$stamp1 = microtime(true);
|
||||
|
||||
if($this->mysqli)
|
||||
$result = @$this->db->query($sql);
|
||||
else
|
||||
$result = @mysql_query($sql,$this->db);
|
||||
|
||||
//if (get_config("system", "db_log") != "")
|
||||
// @file_put_contents(get_config("system", "db_log"), datetime_convert().':'.session_id(). ' Stop '."\n", FILE_APPEND);
|
||||
if(x($a->config,'system') && x($a->config['system'],'db_log')) {
|
||||
$stamp2 = microtime(true);
|
||||
$duration = round($stamp2-$stamp1, 3);
|
||||
if ($duration > $a->config["system"]["db_loglimit"]) {
|
||||
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
||||
@file_put_contents($a->config["system"]["db_log"], $duration."\t".
|
||||
basename($backtrace[1]["file"])."\t".
|
||||
$backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
|
||||
substr($sql, 0, 2000)."\n", FILE_APPEND);
|
||||
}
|
||||
}
|
||||
|
||||
if($this->mysqli) {
|
||||
if($this->db->errno)
|
||||
|
|
|
@ -328,8 +328,9 @@ function delivery_run($argv, $argc){
|
|||
dbesc($nickname)
|
||||
);
|
||||
|
||||
if(count($x)) {
|
||||
if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) {
|
||||
if($x && count($x)) {
|
||||
$write_flag = ((($x[0]['rel']) && ($x[0]['rel'] != CONTACT_IS_SHARING)) ? true : false);
|
||||
if((($owner['page-flags'] == PAGE_COMMUNITY) || ($write_flag)) && (! $x[0]['writable'])) {
|
||||
q("update contact set writable = 1 where id = %d limit 1",
|
||||
intval($x[0]['id'])
|
||||
);
|
||||
|
|
|
@ -102,6 +102,37 @@ function diaspora_dispatch($importer,$msg) {
|
|||
return $ret;
|
||||
}
|
||||
|
||||
function diaspora_handle_from_contact($contact_id) {
|
||||
$handle = False;
|
||||
|
||||
logger("diaspora_handle_from_contact: contact id is " . $contact_id, LOGGER_DEBUG);
|
||||
|
||||
$r = q("SELECT network, addr, self, url, nick FROM contact WHERE id = %d",
|
||||
intval($contact_id)
|
||||
);
|
||||
if($r) {
|
||||
$contact = $r[0];
|
||||
|
||||
logger("diaspora_handle_from_contact: contact 'self' = " . $contact['self'] . " 'url' = " . $contact['url'], LOGGER_DEBUG);
|
||||
|
||||
if($contact['network'] === NETWORK_DIASPORA) {
|
||||
$handle = $contact['addr'];
|
||||
|
||||
// logger("diaspora_handle_from_contact: contact id is a Diaspora person, handle = " . $handle, LOGGER_DEBUG);
|
||||
}
|
||||
elseif(($contact['network'] === NETWORK_DFRN) || ($contact['self'] == 1)) {
|
||||
$baseurl_start = strpos($contact['url'],'://') + 3;
|
||||
$baseurl_length = strpos($contact['url'],'/profile') - $baseurl_start; // allows installations in a subdirectory--not sure how Diaspora will handle
|
||||
$baseurl = substr($contact['url'], $baseurl_start, $baseurl_length);
|
||||
$handle = $contact['nick'] . '@' . $baseurl;
|
||||
|
||||
// logger("diaspora_handle_from_contact: contact id is a DFRN person, handle = " . $handle, LOGGER_DEBUG);
|
||||
}
|
||||
}
|
||||
|
||||
return $handle;
|
||||
}
|
||||
|
||||
function diaspora_get_contact_by_handle($uid,$handle) {
|
||||
$r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1",
|
||||
dbesc(NETWORK_DIASPORA),
|
||||
|
@ -110,6 +141,17 @@ function diaspora_get_contact_by_handle($uid,$handle) {
|
|||
);
|
||||
if($r && count($r))
|
||||
return $r[0];
|
||||
|
||||
$handle_parts = explode("@", $handle);
|
||||
$nurl_sql = '%%://' . $handle_parts[1] . '%%/profile/' . $handle_parts[0];
|
||||
$r = q("SELECT * FROM contact WHERE network = '%s' AND uid = %d AND nurl LIKE '%s' LIMIT 1",
|
||||
dbesc(NETWORK_DFRN),
|
||||
intval($uid),
|
||||
dbesc($nurl_sql)
|
||||
);
|
||||
if($r && count($r))
|
||||
return $r[0];
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1236,6 +1278,7 @@ function diaspora_comment($importer,$xml,$msg) {
|
|||
|
||||
$datarray['uid'] = $importer['uid'];
|
||||
$datarray['contact-id'] = $contact['id'];
|
||||
$datarray['type'] = 'remote-comment';
|
||||
$datarray['wall'] = $parent_item['wall'];
|
||||
$datarray['gravity'] = GRAVITY_COMMENT;
|
||||
$datarray['guid'] = $guid;
|
||||
|
@ -1272,7 +1315,7 @@ function diaspora_comment($importer,$xml,$msg) {
|
|||
if(($parent_item['origin']) && (! $parent_author_signature)) {
|
||||
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
intval($message_id),
|
||||
dbesc($author_signed_data),
|
||||
dbesc($signed_data),
|
||||
dbesc(base64_encode($author_signature)),
|
||||
dbesc($diaspora_handle)
|
||||
);
|
||||
|
@ -1281,7 +1324,7 @@ function diaspora_comment($importer,$xml,$msg) {
|
|||
// the existence of parent_author_signature means the parent_author or owner
|
||||
// is already relaying.
|
||||
|
||||
proc_run('php','include/notifier.php','comment',$message_id);
|
||||
proc_run('php','include/notifier.php','comment-import',$message_id);
|
||||
}
|
||||
|
||||
$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0 ",
|
||||
|
@ -1318,7 +1361,7 @@ function diaspora_comment($importer,$xml,$msg) {
|
|||
'verb' => ACTIVITY_POST,
|
||||
'otype' => 'item',
|
||||
'parent' => $conv_parent,
|
||||
|
||||
'parent_uri' => $parent_uri
|
||||
));
|
||||
|
||||
// only send one notification
|
||||
|
@ -1673,8 +1716,8 @@ function diaspora_like($importer,$xml,$msg) {
|
|||
|
||||
// likes on comments not supported here and likes on photos not supported by Diaspora
|
||||
|
||||
if($target_type !== 'Post')
|
||||
return;
|
||||
// if($target_type !== 'Post')
|
||||
// return;
|
||||
|
||||
$contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
|
||||
if(! $contact) {
|
||||
|
@ -1855,7 +1898,7 @@ EOT;
|
|||
if(! $parent_author_signature) {
|
||||
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
intval($message_id),
|
||||
dbesc($author_signed_data),
|
||||
dbesc($signed_data),
|
||||
dbesc(base64_encode($author_signature)),
|
||||
dbesc($diaspora_handle)
|
||||
);
|
||||
|
@ -1866,7 +1909,7 @@ EOT;
|
|||
// is already relaying. The parent_item['origin'] indicates the message was created on our system
|
||||
|
||||
if(($parent_item['origin']) && (! $parent_author_signature))
|
||||
proc_run('php','include/notifier.php','comment',$message_id);
|
||||
proc_run('php','include/notifier.php','comment-import',$message_id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -1917,7 +1960,7 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
|
|||
|
||||
$contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
|
||||
if(! $contact) {
|
||||
logger('diaspora_signed_retraction: no contact');
|
||||
logger('diaspora_signed_retraction: no contact ' . $diaspora_handle . ' for ' . $importer['uid']);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1992,7 +2035,7 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
|
|||
// is already relaying.
|
||||
logger('diaspora_signed_retraction: relaying relayable_retraction');
|
||||
|
||||
proc_run('php','include/notifier.php','relayable_retraction',$r[0]['id']);
|
||||
proc_run('php','include/notifier.php','drop',$r[0]['id']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2029,11 +2072,20 @@ function diaspora_profile($importer,$xml,$msg) {
|
|||
$image_url = unxmlify($xml->image_url);
|
||||
$birthday = unxmlify($xml->birthday);
|
||||
|
||||
$r = q("SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' ",
|
||||
|
||||
$handle_parts = explode("@", $diaspora_handle);
|
||||
if($name === '') {
|
||||
$name = $handle_parts[0];
|
||||
}
|
||||
if(strpos($image_url, $handle_parts[1]) === false) {
|
||||
$image_url = "http://" . $handle_parts[1] . $image_url;
|
||||
}
|
||||
|
||||
/* $r = q("SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' ",
|
||||
intval($importer['uid']),
|
||||
intval($contact['id'])
|
||||
);
|
||||
$oldphotos = ((count($r)) ? $r : null);
|
||||
$oldphotos = ((count($r)) ? $r : null);*/
|
||||
|
||||
require_once('include/Photo.php');
|
||||
|
||||
|
@ -2066,7 +2118,7 @@ function diaspora_profile($importer,$xml,$msg) {
|
|||
intval($importer['uid'])
|
||||
);
|
||||
|
||||
if($r) {
|
||||
/* if($r) {
|
||||
if($oldphotos) {
|
||||
foreach($oldphotos as $ph) {
|
||||
q("DELETE FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' AND `resource-id` = '%s' ",
|
||||
|
@ -2076,7 +2128,7 @@ function diaspora_profile($importer,$xml,$msg) {
|
|||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} */
|
||||
|
||||
return;
|
||||
|
||||
|
@ -2119,7 +2171,6 @@ function diaspora_unshare($me,$contact) {
|
|||
}
|
||||
|
||||
|
||||
|
||||
function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
|
||||
|
||||
$a = get_app();
|
||||
|
@ -2153,8 +2204,6 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
|
|||
}
|
||||
}
|
||||
*/
|
||||
// Removal of tags
|
||||
$body = preg_replace('/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $body);
|
||||
|
||||
//if(strlen($title))
|
||||
// $body = "[b]".html_entity_decode($title)."[/b]\n\n".$body;
|
||||
|
@ -2253,22 +2302,31 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
|
|||
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
|
||||
// $theiraddr = $contact['addr'];
|
||||
|
||||
// Diaspora doesn't support threaded comments
|
||||
/*if($item['thr-parent']) {
|
||||
$p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
|
||||
dbesc($item['thr-parent'])
|
||||
);
|
||||
}
|
||||
else {*/
|
||||
// The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always
|
||||
// return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent.
|
||||
// The only item with `parent` and `id` as the parent id is the parent item.
|
||||
$p = q("select guid from item where parent = %d and id = %d limit 1",
|
||||
$p = q("select guid, type, uri, `parent-uri` from item where parent = %d and id = %d limit 1",
|
||||
intval($item['parent']),
|
||||
intval($item['parent'])
|
||||
);
|
||||
//}
|
||||
if(count($p))
|
||||
$parent_guid = $p[0]['guid'];
|
||||
$parent = $p[0];
|
||||
else
|
||||
return;
|
||||
|
||||
if($item['verb'] === ACTIVITY_LIKE) {
|
||||
$tpl = get_markup_template('diaspora_like.tpl');
|
||||
$like = true;
|
||||
$target_type = 'Post';
|
||||
$target_type = ( $parent['uri'] === $parent['parent-uri'] ? 'Post' : 'Comment');
|
||||
// $target_type = (strpos($parent['type'], 'comment') ? 'Comment' : 'Post');
|
||||
// $positive = (($item['deleted']) ? 'false' : 'true');
|
||||
$positive = 'true';
|
||||
|
||||
|
@ -2285,15 +2343,15 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
|
|||
// sign it
|
||||
|
||||
if($like)
|
||||
$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr;
|
||||
$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent['guid'] . ';' . $positive . ';' . $myaddr;
|
||||
else
|
||||
$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
|
||||
$signed_text = $item['guid'] . ';' . $parent['guid'] . ';' . $text . ';' . $myaddr;
|
||||
|
||||
$authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
|
||||
|
||||
$msg = replace_macros($tpl,array(
|
||||
'$guid' => xmlify($item['guid']),
|
||||
'$parent_guid' => xmlify($parent_guid),
|
||||
'$parent_guid' => xmlify($parent['guid']),
|
||||
'$target_type' =>xmlify($target_type),
|
||||
'$authorsig' => xmlify($authorsig),
|
||||
'$body' => xmlify($text),
|
||||
|
@ -2320,16 +2378,23 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
$body = $item['body'];
|
||||
$text = html_entity_decode(bb2diaspora($body));
|
||||
|
||||
|
||||
// Diaspora doesn't support threaded comments
|
||||
/*if($item['thr-parent']) {
|
||||
$p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
|
||||
dbesc($item['thr-parent'])
|
||||
);
|
||||
}
|
||||
else {*/
|
||||
// The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always
|
||||
// return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent.
|
||||
// The only item with `parent` and `id` as the parent id is the parent item.
|
||||
$p = q("select guid from item where parent = %d and id = %d limit 1",
|
||||
$p = q("select guid, type, uri, `parent-uri` from item where parent = %d and id = %d limit 1",
|
||||
intval($item['parent']),
|
||||
intval($item['parent'])
|
||||
);
|
||||
//}
|
||||
if(count($p))
|
||||
$parent_guid = $p[0]['guid'];
|
||||
$parent = $p[0];
|
||||
else
|
||||
return;
|
||||
|
||||
|
@ -2347,7 +2412,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
elseif($item['verb'] === ACTIVITY_LIKE) {
|
||||
$like = true;
|
||||
|
||||
$target_type = 'Post';
|
||||
$target_type = ( $parent['uri'] === $parent['parent-uri'] ? 'Post' : 'Comment');
|
||||
// $positive = (($item['deleted']) ? 'false' : 'true');
|
||||
$positive = 'true';
|
||||
|
||||
|
@ -2361,7 +2426,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
// fetch the original signature if the relayable was created by a Diaspora
|
||||
// or DFRN user. Relayables for other networks are not supported.
|
||||
|
||||
$r = q("select * from sign where " . $sql_sign_id . " = %d limit 1",
|
||||
/* $r = q("select * from sign where " . $sql_sign_id . " = %d limit 1",
|
||||
intval($item['id'])
|
||||
);
|
||||
if(count($r)) {
|
||||
|
@ -2377,14 +2442,32 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
// function is called
|
||||
logger('diaspora_send_relay: original author signature not found, cannot send relayable');
|
||||
return;
|
||||
}
|
||||
}*/
|
||||
|
||||
/* Since the author signature is only checked by the parent, not by the relay recipients,
|
||||
* I think it may not be necessary for us to do so much work to preserve all the original
|
||||
* signatures. The important thing that Diaspora DOES need is the original creator's handle.
|
||||
* Let's just generate that and forget about all the original author signature stuff.
|
||||
*
|
||||
* Note: this might be more of an problem if we want to support likes on comments for older
|
||||
* versions of Diaspora (diaspora-pistos), but since there are a number of problems with
|
||||
* doing that, let's ignore it for now.
|
||||
*
|
||||
* Currently, only DFRN contacts are supported. StatusNet shouldn't be hard, but it hasn't
|
||||
* been done yet
|
||||
*/
|
||||
|
||||
$handle = diaspora_handle_from_contact($item['contact-id']);
|
||||
if(! $handle)
|
||||
return;
|
||||
|
||||
|
||||
if($relay_retract)
|
||||
$sender_signed_text = $item['guid'] . ';' . $target_type;
|
||||
elseif($like)
|
||||
$sender_signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $handle;
|
||||
$sender_signed_text = $item['guid'] . ';' . $target_type . ';' . $parent['guid'] . ';' . $positive . ';' . $handle;
|
||||
else
|
||||
$sender_signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $handle;
|
||||
$sender_signed_text = $item['guid'] . ';' . $parent['guid'] . ';' . $text . ';' . $handle;
|
||||
|
||||
// Sign the relayable with the top-level owner's signature
|
||||
//
|
||||
|
@ -2401,7 +2484,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
|
||||
$msg = replace_macros($tpl,array(
|
||||
'$guid' => xmlify($item['guid']),
|
||||
'$parent_guid' => xmlify($parent_guid),
|
||||
'$parent_guid' => xmlify($parent['guid']),
|
||||
'$target_type' =>xmlify($target_type),
|
||||
'$authorsig' => xmlify($authorsig),
|
||||
'$parentsig' => xmlify($parentauthorsig),
|
||||
|
@ -2517,7 +2600,7 @@ function diaspora_send_mail($item,$owner,$contact) {
|
|||
|
||||
}
|
||||
|
||||
function diaspora_transmit($owner,$contact,$slap,$public_batch) {
|
||||
function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false) {
|
||||
|
||||
$enabled = intval(get_config('system','diaspora_enabled'));
|
||||
if(! $enabled) {
|
||||
|
@ -2534,7 +2617,7 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch) {
|
|||
|
||||
logger('diaspora_transmit: ' . $logid . ' ' . $dest_url);
|
||||
|
||||
if(was_recently_delayed($contact['id'])) {
|
||||
if( (! $queue_run) && (was_recently_delayed($contact['id'])) ) {
|
||||
$return_code = 0;
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -48,8 +48,8 @@ function construct_mailbox_name($mailacct) {
|
|||
|
||||
|
||||
function email_msg_meta($mbox,$uid) {
|
||||
$ret = (($mbox && $uid) ? @imap_fetch_overview($mbox,$uid,FT_UID) : array(array()));
|
||||
return ((count($ret)) ? $ret[0] : array());
|
||||
$ret = (($mbox && $uid) ? @imap_fetch_overview($mbox,$uid,FT_UID) : array(array())); // POSSIBLE CLEANUP --> array(array()) is probably redundant now
|
||||
return ((count($ret)) ? $ret : array());
|
||||
}
|
||||
|
||||
function email_msg_headers($mbox,$uid) {
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once('include/email.php');
|
||||
|
||||
function notification($params) {
|
||||
|
||||
logger('notification: entry', LOGGER_DEBUG);
|
||||
|
@ -124,9 +126,9 @@ function notification($params) {
|
|||
|
||||
$preamble = sprintf( t('%1$s posted to your profile wall at %2$s') , $params['source_name'], $sitename);
|
||||
|
||||
$epreamble = sprintf( t('%1$s posted to [url=%2s]your wall[/url]') ,
|
||||
$epreamble = sprintf( t('%1$s posted to [url=%2$s]your wall[/url]') ,
|
||||
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
|
||||
$itemlink);
|
||||
$params['link']);
|
||||
|
||||
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
|
||||
$tsitelink = sprintf( $sitelink, $siteurl );
|
||||
|
@ -147,6 +149,24 @@ function notification($params) {
|
|||
$itemlink = $params['link'];
|
||||
}
|
||||
|
||||
if($params['type'] == NOTIFY_POKE) {
|
||||
|
||||
$subject = sprintf( t('[Friendica:Notify] %1$s poked you') , $params['source_name']);
|
||||
$preamble = sprintf( t('%1$s poked you at %2$s') , $params['source_name'], $sitename);
|
||||
$epreamble = sprintf( t('%1$s [url=%2$s]poked you[/url].') ,
|
||||
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
|
||||
$params['link']);
|
||||
|
||||
$subject = str_replace('poked', t($params['activity']), $subject);
|
||||
$preamble = str_replace('poked', t($params['activity']), $preamble);
|
||||
$epreamble = str_replace('poked', t($params['activity']), $epreamble);
|
||||
|
||||
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
|
||||
$tsitelink = sprintf( $sitelink, $siteurl );
|
||||
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
|
||||
$itemlink = $params['link'];
|
||||
}
|
||||
|
||||
if($params['type'] == NOTIFY_TAGSHARE) {
|
||||
$subject = sprintf( t('[Friendica:Notify] %s tagged your post') , $params['source_name']);
|
||||
$preamble = sprintf( t('%1$s tagged your post at %2$s') , $params['source_name'], $sitename);
|
||||
|
@ -306,7 +326,7 @@ function notification($params) {
|
|||
// If so, create the record of it and use a message-id smtp header.
|
||||
|
||||
if(!$r) {
|
||||
logger("norify_id:" . intval($notify_id). ", parent: " . intval($params['parent']) . "uid: " .
|
||||
logger("notify_id:" . intval($notify_id). ", parent: " . intval($params['parent']) . "uid: " .
|
||||
intval($params['uid']), LOGGER_DEBUG);
|
||||
$r = q("insert into `notify-threads` (`notify-id`, `master-parent-item`, `receiver-uid`, `parent-item`)
|
||||
values(%d,%d,%d,%d)",
|
||||
|
@ -477,6 +497,7 @@ class enotify {
|
|||
$multipartMessageBody, // message body
|
||||
$messageHeader // message headers
|
||||
);
|
||||
logger("notification: enotify::send header " . 'To: ' . $params['toEmail'] . "\n" . $messageHeader, LOGGER_DEBUG);
|
||||
logger("notification: enotify::send returns " . $res, LOGGER_DEBUG);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ function group_add($uid,$name) {
|
|||
function group_rmv($uid,$name) {
|
||||
$ret = false;
|
||||
if(x($uid) && x($name)) {
|
||||
$r = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
|
||||
$r = q("SELECT id FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
|
||||
intval($uid),
|
||||
dbesc($name)
|
||||
);
|
||||
|
@ -49,6 +49,37 @@ function group_rmv($uid,$name) {
|
|||
if(! $group_id)
|
||||
return false;
|
||||
|
||||
// remove group from default posting lists
|
||||
$r = q("SELECT def_gid, allow_gid, deny_gid FROM user WHERE uid = %d LIMIT 1",
|
||||
intval($uid)
|
||||
);
|
||||
if($r) {
|
||||
$user_info = $r[0];
|
||||
$change = false;
|
||||
|
||||
if($user_info['def_gid'] == $group_id) {
|
||||
$user_info['def_gid'] = 0;
|
||||
$change = true;
|
||||
}
|
||||
if(strpos($user_info['allow_gid'], '<' . $group_id . '>') !== false) {
|
||||
$user_info['allow_gid'] = str_replace('<' . $group_id . '>', '', $user_info['allow_gid']);
|
||||
$change = true;
|
||||
}
|
||||
if(strpos($user_info['deny_gid'], '<' . $group_id . '>') !== false) {
|
||||
$user_info['deny_gid'] = str_replace('<' . $group_id . '>', '', $user_info['deny_gid']);
|
||||
$change = true;
|
||||
}
|
||||
|
||||
if($change) {
|
||||
q("UPDATE user SET def_gid = %d, allow_gid = '%s', deny_gid = '%s' WHERE uid = %d",
|
||||
intval($user_info['def_gid']),
|
||||
dbesc($user_info['allow_gid']),
|
||||
dbesc($user_info['deny_gid']),
|
||||
intval($uid)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// remove all members
|
||||
$r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d ",
|
||||
intval($uid),
|
||||
|
@ -103,7 +134,7 @@ function group_add_member($uid,$name,$member,$gid = 0) {
|
|||
if((! $gid) || (! $uid) || (! $member))
|
||||
return false;
|
||||
|
||||
$r = q("SELECT * FROM `group_member` WHERE `uid` = %d AND `id` = %d AND `contact-id` = %d LIMIT 1",
|
||||
$r = q("SELECT * FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d LIMIT 1",
|
||||
intval($uid),
|
||||
intval($gid),
|
||||
intval($member)
|
||||
|
|