Merge branch 'develop' into rewrites/coding-convention-split2-1-2
Signed-off-by: Roland Haeder <roland@mxchange.org>
This commit is contained in:
commit
9423db628f
3
boot.php
3
boot.php
|
@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica');
|
||||||
define ( 'FRIENDICA_CODENAME', 'Asparagus');
|
define ( 'FRIENDICA_CODENAME', 'Asparagus');
|
||||||
define ( 'FRIENDICA_VERSION', '3.5.2-dev' );
|
define ( 'FRIENDICA_VERSION', '3.5.2-dev' );
|
||||||
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
|
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
|
||||||
define ( 'DB_UPDATE_VERSION', 1216 );
|
define ( 'DB_UPDATE_VERSION', 1217 );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Constant with a HTML line break.
|
* @brief Constant with a HTML line break.
|
||||||
|
@ -382,6 +382,7 @@ define ( 'ACTIVITY_UPDATE', NAMESPACE_ACTIVITY_SCHEMA . 'update' );
|
||||||
define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' );
|
define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' );
|
||||||
define ( 'ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite' );
|
define ( 'ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite' );
|
||||||
define ( 'ACTIVITY_SHARE', NAMESPACE_ACTIVITY_SCHEMA . 'share' );
|
define ( 'ACTIVITY_SHARE', NAMESPACE_ACTIVITY_SCHEMA . 'share' );
|
||||||
|
define ( 'ACTIVITY_DELETE', NAMESPACE_ACTIVITY_SCHEMA . 'delete' );
|
||||||
|
|
||||||
define ( 'ACTIVITY_POKE', NAMESPACE_ZOT . '/activity/poke' );
|
define ( 'ACTIVITY_POKE', NAMESPACE_ZOT . '/activity/poke' );
|
||||||
define ( 'ACTIVITY_MOOD', NAMESPACE_ZOT . '/activity/mood' );
|
define ( 'ACTIVITY_MOOD', NAMESPACE_ZOT . '/activity/mood' );
|
||||||
|
|
|
@ -159,7 +159,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
|
||||||
`writable` tinyint(1) NOT NULL DEFAULT 0,
|
`writable` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`forum` tinyint(1) NOT NULL DEFAULT 0,
|
`forum` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`prv` tinyint(1) NOT NULL DEFAULT 0,
|
`prv` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`contact-type` int(11) unsigned NOT NULL DEFAULT 0,
|
`contact-type` int(11) NOT NULL DEFAULT 0,
|
||||||
`hidden` tinyint(1) NOT NULL DEFAULT 0,
|
`hidden` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`archive` tinyint(1) NOT NULL DEFAULT 0,
|
`archive` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`pending` tinyint(1) NOT NULL DEFAULT 1,
|
`pending` tinyint(1) NOT NULL DEFAULT 1,
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
Keyboard shortcuts in Friendica
|
||||||
|
=======================
|
||||||
|
|
||||||
|
* [Home](help)
|
||||||
|
|
||||||
|
General
|
||||||
|
-------
|
||||||
|
|
||||||
|
* j: Scroll to next thread
|
||||||
|
* k: Scroll to previous thread
|
|
@ -6,12 +6,10 @@ If you are the admin of a Friendica node, you have access to the so called **Adm
|
||||||
|
|
||||||
On the front page of the admin panel you will see a summary of information about your node.
|
On the front page of the admin panel you will see a summary of information about your node.
|
||||||
These information include the amount of messages currently being processed in the queues.
|
These information include the amount of messages currently being processed in the queues.
|
||||||
The first number is the number of messages being actively sent.
|
The first number is the number of messages which could not been delivered for various reasons.
|
||||||
This number should decrease quickly.
|
|
||||||
The second is the messages which could for various reasons not being delivered.
|
|
||||||
They will be resend later.
|
They will be resend later.
|
||||||
You can have a quick glance into that second queus in the "Inspect Queue" section of the admin panel.
|
You can have a quick glance into that second queus in the "Inspect Queue" section of the admin panel.
|
||||||
If you have activated the background workers, there is a third number representing the count of jobs queued for the workers.
|
The second number represents the current number of jobs for the background workers.
|
||||||
These worker tasks are prioritised and are done accordingly.
|
These worker tasks are prioritised and are done accordingly.
|
||||||
|
|
||||||
Then you get an overview of the accounts on your node, which can be moderated in the "Users" section of the panel.
|
Then you get an overview of the accounts on your node, which can be moderated in the "Users" section of the panel.
|
||||||
|
|
|
@ -14,7 +14,6 @@ Database Tables
|
||||||
| [config](help/database/db_config) | main configuration storage |
|
| [config](help/database/db_config) | main configuration storage |
|
||||||
| [contact](help/database/db_contact) | contact table |
|
| [contact](help/database/db_contact) | contact table |
|
||||||
| [conv](help/database/db_conv) | private messages |
|
| [conv](help/database/db_conv) | private messages |
|
||||||
| [deliverq](help/database/db_deliverq) | |
|
|
||||||
| [event](help/database/db_event) | Events |
|
| [event](help/database/db_event) | Events |
|
||||||
| [fcontact](help/database/db_fcontact) | friend suggestion stuff |
|
| [fcontact](help/database/db_fcontact) | friend suggestion stuff |
|
||||||
| [ffinder](help/database/db_ffinder) | friend suggestion stuff |
|
| [ffinder](help/database/db_ffinder) | friend suggestion stuff |
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
Table deliverq
|
|
||||||
==============
|
|
||||||
|
|
||||||
| Field | Description | Type | Null | Key | Default | Extra |
|
|
||||||
|---------|------------------|------------------|------|-----|---------|----------------|
|
|
||||||
| id | sequential ID | int(10) unsigned | NO | PRI | NULL | auto_increment |
|
|
||||||
| cmd | | varchar(32) | NO | | | |
|
|
||||||
| item | | int(11) | NO | | 0 | |
|
|
||||||
| contact | | int(11) | NO | | 0 | |
|
|
||||||
|
|
||||||
|
|
||||||
Return to [database documentation](help/database)
|
|
|
@ -5,17 +5,14 @@
|
||||||
Wenn du der Administrator einer Friendica Instanz bist, hast du Zugriff auf das so genannte **Admin Panel** in dem du die Friendica Instanz konfigurieren kannst,
|
Wenn du der Administrator einer Friendica Instanz bist, hast du Zugriff auf das so genannte **Admin Panel** in dem du die Friendica Instanz konfigurieren kannst,
|
||||||
|
|
||||||
Auf der Startseite des Admin Panels werden die Informationen zu der Instanz zusammengefasst.
|
Auf der Startseite des Admin Panels werden die Informationen zu der Instanz zusammengefasst.
|
||||||
Diese Informationen beinhalten die Anzahl der Nachrichten, die sich aktuell in den Warteschlangen befinden.
|
Die erste Zahl gibt die Anzahl von Nachrichten an, die nicht zugestellt werden konnten.
|
||||||
Hierbei ist die erste Zahl die Zahl der Nachrichten die gerade aktiv verteilt werden.
|
|
||||||
Diese Zahl sollte sich relativ schnell sinken.
|
|
||||||
Die zweite Zahl gibt die Anzahl von Nachrichten an, die nicht zugestellt werden konnten.
|
|
||||||
Die Zustellung wird zu einem späteren Zeitpunkt noch einmal versucht.
|
Die Zustellung wird zu einem späteren Zeitpunkt noch einmal versucht.
|
||||||
Unter dem Punkt "Warteschlange Inspizieren" kannst du einen schnellen Blick auf die zweite Warteschlange werfen.
|
Unter dem Punkt "Warteschlange Inspizieren" kannst du einen schnellen Blick auf die zweite Warteschlange werfen.
|
||||||
Solltest du für die Hintergrundprozesse die Worker aktiviert haben, wird eine dritte Zahl angezeigt.
|
Die zweite Zahl steht für die Anzahl der Aufgaben, die die Worker noch vor sich haben.
|
||||||
Diese repräsentiert die Anzahl der Aufgaben, die die Worker noch vor sich haben.
|
Die Worker arbeiten Hintergrundprozesse ab.
|
||||||
Die Aufgaben der Worker sind priorisiert und werden anhand dieser Prioritäten abgearbeitet.
|
Die Aufgaben der Worker sind priorisiert und werden anhand dieser Prioritäten abgearbeitet.
|
||||||
|
|
||||||
Des weiteren findest du eine Übersicht über die Accounts auf dem Friendica Knoten, die unter dem Punkt "Nutzer" moderiert werden können.
|
Desweiteren findest du eine Übersicht über die Accounts auf dem Friendica Knoten, die unter dem Punkt "Nutzer" moderiert werden können.
|
||||||
Sowie eine Liste der derzeit aktivierten Addons.
|
Sowie eine Liste der derzeit aktivierten Addons.
|
||||||
Diese Liste ist verlinkt, so dass du schnellen Zugriff auf die Informationsseiten der einzelnen Addons hast.
|
Diese Liste ist verlinkt, so dass du schnellen Zugriff auf die Informationsseiten der einzelnen Addons hast.
|
||||||
Abschließend findest du auf der Startseite des Admin Panels die installierte Version von Friendica.
|
Abschließend findest du auf der Startseite des Admin Panels die installierte Version von Friendica.
|
||||||
|
|
|
@ -364,9 +364,9 @@ class Probe {
|
||||||
return self::mail($uri, $uid);
|
return self::mail($uri, $uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($network == NETWORK_MAIL)
|
if ($network == NETWORK_MAIL) {
|
||||||
return self::mail($uri, $uid);
|
return self::mail($uri, $uid);
|
||||||
|
}
|
||||||
// Remove "acct:" from the URI
|
// Remove "acct:" from the URI
|
||||||
$uri = str_replace('acct:', '', $uri);
|
$uri = str_replace('acct:', '', $uri);
|
||||||
|
|
||||||
|
@ -391,37 +391,37 @@ class Probe {
|
||||||
/// @todo Do we need the prefix "acct:" or "acct://"?
|
/// @todo Do we need the prefix "acct:" or "acct://"?
|
||||||
|
|
||||||
foreach ($lrdd AS $key => $link) {
|
foreach ($lrdd AS $key => $link) {
|
||||||
if ($webfinger)
|
if ($webfinger) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
if (!in_array($key, array("lrdd", "lrdd-xml", "lrdd-json"))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// At first try it with the given uri
|
||||||
|
$path = str_replace('{uri}', urlencode($uri), $link);
|
||||||
|
$webfinger = self::webfinger($path);
|
||||||
|
|
||||||
if (!in_array($key, array("lrdd", "lrdd-xml", "lrdd-json")))
|
// We cannot be sure that the detected address was correct, so we don't use the values
|
||||||
continue;
|
if ($webfinger AND ($uri != $addr)) {
|
||||||
|
$nick = "";
|
||||||
|
$addr = "";
|
||||||
|
}
|
||||||
|
|
||||||
// Try webfinger with the address (user@domain.tld)
|
// Try webfinger with the address (user@domain.tld)
|
||||||
$path = str_replace('{uri}', urlencode($addr), $link);
|
if (!$webfinger) {
|
||||||
$webfinger = self::webfinger($path);
|
$path = str_replace('{uri}', urlencode($addr), $link);
|
||||||
|
$webfinger = self::webfinger($path);
|
||||||
|
}
|
||||||
|
|
||||||
// Mastodon needs to have it with "acct:"
|
// Mastodon needs to have it with "acct:"
|
||||||
if (!$webfinger) {
|
if (!$webfinger) {
|
||||||
$path = str_replace('{uri}', urlencode("acct:".$addr), $link);
|
$path = str_replace('{uri}', urlencode("acct:".$addr), $link);
|
||||||
$webfinger = self::webfinger($path);
|
$webfinger = self::webfinger($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If webfinger wasn't successful then try it with the URL - possibly in the format https://...
|
|
||||||
if (!$webfinger AND ($uri != $addr)) {
|
|
||||||
$path = str_replace('{uri}', urlencode($uri), $link);
|
|
||||||
$webfinger = self::webfinger($path);
|
|
||||||
|
|
||||||
// Since the detection with the address wasn't successful, we delete it.
|
|
||||||
if ($webfinger) {
|
|
||||||
$nick = "";
|
|
||||||
$addr = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!$webfinger)
|
if (!$webfinger) {
|
||||||
return self::feed($uri);
|
return self::feed($uri);
|
||||||
|
}
|
||||||
|
|
||||||
$result = false;
|
$result = false;
|
||||||
|
|
||||||
|
|
|
@ -626,14 +626,17 @@ function acl_lookup(App $a, $out_type = 'json') {
|
||||||
|
|
||||||
if ($conv_id) {
|
if ($conv_id) {
|
||||||
/*
|
/*
|
||||||
* if $conv_id is set, get unknow contacts in thread
|
* if $conv_id is set, get unknown contacts in thread
|
||||||
* but first get know contacts url to filter them out
|
* but first get known contacts url to filter them out
|
||||||
* @TODO rewrite below function to closure
|
|
||||||
*/
|
*/
|
||||||
function _contact_link($i) { return dbesc($i['link']); }
|
$known_contacts = array_map(
|
||||||
$known_contacts = array_map('_contact_link', $contacts);
|
function ($i) {
|
||||||
$unknow_contacts = array();
|
return dbesc($i['link']);
|
||||||
$r = q("SELECT `author-avatar`,`author-name`,`author-link`
|
}
|
||||||
|
, $contacts);
|
||||||
|
|
||||||
|
$unknown_contacts = array();
|
||||||
|
$r = q("SELECT `author-link`
|
||||||
FROM `item` WHERE `parent` = %d
|
FROM `item` WHERE `parent` = %d
|
||||||
AND (`author-name` LIKE '%%%s%%' OR `author-link` LIKE '%%%s%%')
|
AND (`author-name` LIKE '%%%s%%' OR `author-link` LIKE '%%%s%%')
|
||||||
AND `author-link` NOT IN ('%s')
|
AND `author-link` NOT IN ('%s')
|
||||||
|
@ -643,31 +646,29 @@ function acl_lookup(App $a, $out_type = 'json') {
|
||||||
intval($conv_id),
|
intval($conv_id),
|
||||||
dbesc($search),
|
dbesc($search),
|
||||||
dbesc($search),
|
dbesc($search),
|
||||||
implode("','", $known_contacts)
|
implode("', '", $known_contacts)
|
||||||
);
|
);
|
||||||
if (dbm::is_result($r)) {
|
if (dbm::is_result($r)) {
|
||||||
foreach ($r as $row) {
|
foreach ($r as $row) {
|
||||||
// nickname..
|
$contact = get_contact_details_by_url($row['author-link']);
|
||||||
$up = parse_url($row['author-link']);
|
|
||||||
$nick = explode("/", $up['path']);
|
if (count($contact) > 0) {
|
||||||
$nick = $nick[count($nick) - 1];
|
$unknown_contacts[] = array(
|
||||||
$nick .= "@" . $up['host'];
|
'type' => 'c',
|
||||||
// /nickname
|
'photo' => proxy_url($contact['micro'], false, PROXY_SIZE_MICRO),
|
||||||
$unknow_contacts[] = array(
|
'name' => htmlentities($contact['name']),
|
||||||
'type' => 'c',
|
'id' => intval($contact['cid']),
|
||||||
'photo' => proxy_url($row['author-avatar'], false, PROXY_SIZE_MICRO),
|
'network' => $contact['network'],
|
||||||
'name' => htmlentities($row['author-name']),
|
'link' => $contact['url'],
|
||||||
'id' => '',
|
'nick' => htmlentities($contact['nick'] ? : $contact['addr']),
|
||||||
'network' => 'unknown',
|
'forum' => $contact['forum']
|
||||||
'link' => $row['author-link'],
|
);
|
||||||
'nick' => htmlentities($nick),
|
}
|
||||||
'forum' => false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$items = array_merge($items, $unknow_contacts);
|
$items = array_merge($items, $unknown_contacts);
|
||||||
$tot += count($unknow_contacts);
|
$tot += count($unknown_contacts);
|
||||||
}
|
}
|
||||||
|
|
||||||
$results = array(
|
$results = array(
|
||||||
|
|
|
@ -671,7 +671,7 @@ function db_definition($charset) {
|
||||||
"writable" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
"writable" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
||||||
"forum" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
"forum" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
||||||
"prv" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
"prv" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
||||||
"contact-type" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
|
"contact-type" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
|
||||||
"hidden" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
"hidden" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
||||||
"archive" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
"archive" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
||||||
"pending" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"),
|
"pending" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"),
|
||||||
|
|
|
@ -355,6 +355,14 @@ class ostatus {
|
||||||
|
|
||||||
$item["body"] = add_page_info_to_body(html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue));
|
$item["body"] = add_page_info_to_body(html2bbcode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue));
|
||||||
$item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue;
|
$item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue;
|
||||||
|
$item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
// Mastodon Content Warning
|
||||||
|
if (($item["verb"] == ACTIVITY_POST) AND $xpath->evaluate('boolean(atom:summary)', $entry)) {
|
||||||
|
$clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]';
|
||||||
|
}
|
||||||
|
|
||||||
if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) OR ($item["object-type"] == ACTIVITY_OBJ_EVENT)) {
|
if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) OR ($item["object-type"] == ACTIVITY_OBJ_EVENT)) {
|
||||||
$item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue;
|
$item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue;
|
||||||
|
@ -363,11 +371,10 @@ class ostatus {
|
||||||
$item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue;
|
$item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue;
|
||||||
}
|
}
|
||||||
$item["object"] = $xml;
|
$item["object"] = $xml;
|
||||||
$item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue;
|
|
||||||
|
|
||||||
/// @TODO
|
/// @TODO
|
||||||
/// Delete a message
|
/// Delete a message
|
||||||
if ($item["verb"] == "qvitter-delete-notice") {
|
if ($item["verb"] == "qvitter-delete-notice" || $item["verb"] == ACTIVITY_DELETE) {
|
||||||
// ignore "Delete" messages (by now)
|
// ignore "Delete" messages (by now)
|
||||||
logger("Ignore delete message ".print_r($item, true));
|
logger("Ignore delete message ".print_r($item, true));
|
||||||
continue;
|
continue;
|
||||||
|
@ -2052,7 +2059,7 @@ class ostatus {
|
||||||
|
|
||||||
$mentioned = array();
|
$mentioned = array();
|
||||||
|
|
||||||
if (($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) {
|
if (($item['parent'] != $item['id']) OR ($item['parent-uri'] !== $item['uri']) OR (($item['thr-parent'] !== '') AND ($item['thr-parent'] !== $item['uri']))) {
|
||||||
$parent = q("SELECT `guid`, `author-link`, `owner-link` FROM `item` WHERE `id` = %d", intval($item["parent"]));
|
$parent = q("SELECT `guid`, `author-link`, `owner-link` FROM `item` WHERE `id` = %d", intval($item["parent"]));
|
||||||
$parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']);
|
$parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']);
|
||||||
|
|
||||||
|
|
|
@ -59,9 +59,8 @@ function photo_albums($uid, $update = false) {
|
||||||
} else {
|
} else {
|
||||||
// This query doesn't do the count and is much faster
|
// This query doesn't do the count and is much faster
|
||||||
$albums = qu("SELECT DISTINCT(`album`), '' AS `total`
|
$albums = qu("SELECT DISTINCT(`album`), '' AS `total`
|
||||||
FROM `photo`
|
FROM `photo` USE INDEX (`uid_album_scale_created`)
|
||||||
WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra
|
WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra",
|
||||||
GROUP BY `album` ORDER BY `created` DESC",
|
|
||||||
intval($uid),
|
intval($uid),
|
||||||
dbesc('Contact Photos'),
|
dbesc('Contact Photos'),
|
||||||
dbesc(t('Contact Photos'))
|
dbesc(t('Contact Photos'))
|
||||||
|
|
|
@ -2096,7 +2096,7 @@ function update_gcontact($contact) {
|
||||||
fix_alternate_contact_address($contact);
|
fix_alternate_contact_address($contact);
|
||||||
|
|
||||||
if (!isset($contact["updated"]))
|
if (!isset($contact["updated"]))
|
||||||
$contact["updated"] = datetime_convert();
|
$contact["updated"] = dbm::date();
|
||||||
|
|
||||||
if ($contact["server_url"] == "") {
|
if ($contact["server_url"] == "") {
|
||||||
$server_url = $contact["url"];
|
$server_url = $contact["url"];
|
||||||
|
@ -2151,7 +2151,7 @@ function update_gcontact($contact) {
|
||||||
dbesc($contact["gender"]), dbesc($contact["keywords"]), intval($contact["hide"]),
|
dbesc($contact["gender"]), dbesc($contact["keywords"]), intval($contact["hide"]),
|
||||||
intval($contact["nsfw"]), intval($contact["contact-type"]), dbesc($contact["alias"]),
|
intval($contact["nsfw"]), intval($contact["contact-type"]), dbesc($contact["alias"]),
|
||||||
dbesc($contact["notify"]), dbesc($contact["url"]), dbesc($contact["location"]),
|
dbesc($contact["notify"]), dbesc($contact["url"]), dbesc($contact["location"]),
|
||||||
dbesc($contact["about"]), intval($contact["generation"]), dbesc($contact["updated"]),
|
dbesc($contact["about"]), intval($contact["generation"]), dbesc(dbm::date($contact["updated"])),
|
||||||
dbesc($contact["server_url"]), dbesc($contact["connect"]),
|
dbesc($contact["server_url"]), dbesc($contact["connect"]),
|
||||||
dbesc(normalise_link($contact["url"])), intval($contact["generation"]));
|
dbesc(normalise_link($contact["url"])), intval($contact["generation"]));
|
||||||
|
|
||||||
|
|
43
js/main.js
43
js/main.js
|
@ -223,8 +223,11 @@
|
||||||
var nnm = $("#nav-notifications-menu");
|
var nnm = $("#nav-notifications-menu");
|
||||||
nnm.html(notifications_all + notifications_mark);
|
nnm.html(notifications_all + notifications_mark);
|
||||||
|
|
||||||
var notification_lastitem = parseInt(localStorage.getItem("notification-lastitem"));
|
var lastItemStorageKey = "notification-lastitem:" + localUser;
|
||||||
|
var notification_lastitem = parseInt(localStorage.getItem(lastItemStorageKey));
|
||||||
var notification_id = 0;
|
var notification_id = 0;
|
||||||
|
|
||||||
|
// Insert notifs into the notifications-menu
|
||||||
$(data.notifications).each(function(key, notif){
|
$(data.notifications).each(function(key, notif){
|
||||||
var text = notif.message.format('<span class="contactname">' + notif.name + '</span>');
|
var text = notif.message.format('<span class="contactname">' + notif.name + '</span>');
|
||||||
var contact = ('<a href="' + notif.url + '"><span class="contactname">' + notif.name + '</span></a>');
|
var contact = ('<a href="' + notif.url + '"><span class="contactname">' + notif.name + '</span></a>');
|
||||||
|
@ -232,19 +235,21 @@
|
||||||
var html = notifications_tpl.format(
|
var html = notifications_tpl.format(
|
||||||
notif.href, // {0} // link to the source
|
notif.href, // {0} // link to the source
|
||||||
notif.photo, // {1} // photo of the contact
|
notif.photo, // {1} // photo of the contact
|
||||||
text, // {2} // preformatted text (autor + text)
|
text, // {2} // preformatted text (autor + text)
|
||||||
notif.date, // {3} // date of notification (time ago)
|
notif.date, // {3} // date of notification (time ago)
|
||||||
seenclass, // {4} // visited status of the notification
|
seenclass, // {4} // visited status of the notification
|
||||||
new Date(notif.timestamp*1000), // {5} // date of notification
|
new Date(notif.timestamp*1000), // {5} // date of notification
|
||||||
notif.url, // {6} // profile url of the contact
|
notif.url, // {6} // profile url of the contact
|
||||||
notif.message.format(contact), // {7} // preformatted html (text including author profile url)
|
notif.message.format(contact), // {7} // preformatted html (text including author profile url)
|
||||||
'' // {8} // Deprecated
|
'' // {8} // Deprecated
|
||||||
);
|
);
|
||||||
nnm.append(html);
|
nnm.append(html);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Desktop Notifications
|
||||||
$(data.notifications.reverse()).each(function(key, e){
|
$(data.notifications.reverse()).each(function(key, e){
|
||||||
notification_id = parseInt(e.timestamp);
|
notification_id = parseInt(e.timestamp);
|
||||||
if (notification_lastitem !== null && notification_id > notification_lastitem) {
|
if (notification_lastitem !== null && notification_id > notification_lastitem && Number(e.seen) === 0) {
|
||||||
if (getNotificationPermission() === "granted") {
|
if (getNotificationPermission() === "granted") {
|
||||||
var notification = new Notification(document.title, {
|
var notification = new Notification(document.title, {
|
||||||
body: decodeHtml(e.message.replace('→ ', '').format(e.name)),
|
body: decodeHtml(e.message.replace('→ ', '').format(e.name)),
|
||||||
|
@ -259,7 +264,7 @@
|
||||||
|
|
||||||
});
|
});
|
||||||
notification_lastitem = notification_id;
|
notification_lastitem = notification_id;
|
||||||
localStorage.setItem("notification-lastitem", notification_lastitem)
|
localStorage.setItem(lastItemStorageKey, notification_lastitem)
|
||||||
|
|
||||||
$("img[data-src]", nnm).each(function(i, el){
|
$("img[data-src]", nnm).each(function(i, el){
|
||||||
// Add src attribute for images with a data-src attribute
|
// Add src attribute for images with a data-src attribute
|
||||||
|
@ -285,7 +290,7 @@
|
||||||
$.jGrowl(message, {sticky: false, theme: 'info', life: 5000});
|
$.jGrowl(message, {sticky: false, theme: 'info', life: 5000});
|
||||||
});
|
});
|
||||||
|
|
||||||
/* update the js scrollbars */
|
// Update the js scrollbars
|
||||||
$('#nav-notifications-menu').perfectScrollbar('update');
|
$('#nav-notifications-menu').perfectScrollbar('update');
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -317,6 +322,30 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Scroll to the next/previous thread when pressing J and K
|
||||||
|
$(document).keydown(function (event) {
|
||||||
|
var threads = $('.thread_level_1');
|
||||||
|
if ((event.keyCode === 74 || event.keyCode === 75) && !$(event.target).is('textarea, input')) {
|
||||||
|
var scrollTop = $(window).scrollTop();
|
||||||
|
if (event.keyCode === 75) {
|
||||||
|
threads = $(threads.get().reverse());
|
||||||
|
}
|
||||||
|
threads.each(function(key, item) {
|
||||||
|
var comparison;
|
||||||
|
var top = $(item).offset().top - 100;
|
||||||
|
if (event.keyCode === 74) {
|
||||||
|
comparison = top > scrollTop + 1;
|
||||||
|
} else if (event.keyCode === 75) {
|
||||||
|
comparison = top < scrollTop - 1;
|
||||||
|
}
|
||||||
|
if (comparison) {
|
||||||
|
$('html, body').animate({ scrollTop: top }, 200);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Set an event listener for infinite scroll
|
// Set an event listener for infinite scroll
|
||||||
if(typeof infinite_scroll !== 'undefined') {
|
if(typeof infinite_scroll !== 'undefined') {
|
||||||
$(window).scroll(function(e){
|
$(window).scroll(function(e){
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
/* ACL selector json backend */
|
/* ACL selector json backend */
|
||||||
|
|
||||||
require_once("include/acl_selectors.php");
|
require_once 'include/acl_selectors.php';
|
||||||
|
|
||||||
function acl_init(App $a) {
|
function acl_init(App $a) {
|
||||||
acl_lookup($a);
|
acl_lookup($a);
|
||||||
|
|
|
@ -474,9 +474,6 @@ function admin_page_summary(App $a) {
|
||||||
$r = qu("SELECT COUNT(`id`) AS `count` FROM `register`");
|
$r = qu("SELECT COUNT(`id`) AS `count` FROM `register`");
|
||||||
$pending = $r[0]['count'];
|
$pending = $r[0]['count'];
|
||||||
|
|
||||||
$r = qu("SELECT COUNT(*) AS `total` FROM `deliverq` WHERE 1");
|
|
||||||
$deliverq = (($r) ? $r[0]['total'] : 0);
|
|
||||||
|
|
||||||
$r = qu("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1");
|
$r = qu("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1");
|
||||||
$queue = (($r) ? $r[0]['total'] : 0);
|
$queue = (($r) ? $r[0]['total'] : 0);
|
||||||
|
|
||||||
|
@ -485,7 +482,7 @@ function admin_page_summary(App $a) {
|
||||||
|
|
||||||
// We can do better, but this is a quick queue status
|
// We can do better, but this is a quick queue status
|
||||||
|
|
||||||
$queues = array('label' => t('Message queues'), 'deliverq' => $deliverq, 'queue' => $queue, 'workerq' => $workerqueue);
|
$queues = array('label' => t('Message queues'), 'queue' => $queue, 'workerq' => $workerqueue);
|
||||||
|
|
||||||
|
|
||||||
$t = get_markup_template("admin_summary.tpl");
|
$t = get_markup_template("admin_summary.tpl");
|
||||||
|
@ -971,7 +968,7 @@ function admin_page_site(App $a) {
|
||||||
'$banner' => array('banner', t("Banner/Logo"), $banner, ""),
|
'$banner' => array('banner', t("Banner/Logo"), $banner, ""),
|
||||||
'$shortcut_icon' => array('shortcut_icon', t("Shortcut icon"), get_config('system','shortcut_icon'), t("Link to an icon that will be used for browsers.")),
|
'$shortcut_icon' => array('shortcut_icon', t("Shortcut icon"), get_config('system','shortcut_icon'), t("Link to an icon that will be used for browsers.")),
|
||||||
'$touch_icon' => array('touch_icon', t("Touch icon"), get_config('system','touch_icon'), t("Link to an icon that will be used for tablets and mobiles.")),
|
'$touch_icon' => array('touch_icon', t("Touch icon"), get_config('system','touch_icon'), t("Link to an icon that will be used for tablets and mobiles.")),
|
||||||
'$info' => array('info',t('Additional Info'), $info, sprintf(t('For public servers: you can add additional information here that will be listed at %s/siteinfo.'), get_server())),
|
'$info' => array('info', t('Additional Info'), $info, sprintf(t('For public servers: you can add additional information here that will be listed at %s/siteinfo.'), get_server())),
|
||||||
'$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
|
'$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
|
||||||
'$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
|
'$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
|
||||||
'$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile-theme'), t("Theme for mobile devices"), $theme_choices_mobile),
|
'$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile-theme'), t("Theme for mobile devices"), $theme_choices_mobile),
|
||||||
|
@ -2058,8 +2055,8 @@ function admin_page_features(App $a) {
|
||||||
$set = $f[3];
|
$set = $f[3];
|
||||||
}
|
}
|
||||||
$arr[$fname][1][] = array(
|
$arr[$fname][1][] = array(
|
||||||
array('feature_' .$f[0],$f[1],$set,$f[2],array(t('Off'),t('On'))),
|
array('feature_' .$f[0],$f[1],$set,$f[2],array(t('Off'), t('On'))),
|
||||||
array('featurelock_' .$f[0],sprintf(t('Lock feature %s'),$f[1]),(($f[4] !== false) ? "1" : ''),'',array(t('Off'),t('On')))
|
array('featurelock_' .$f[0],sprintf(t('Lock feature %s'),$f[1]),(($f[4] !== false) ? "1" : ''),'',array(t('Off'), t('On')))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,8 +269,8 @@ function cal_content(App $a) {
|
||||||
'$tabs' => $tabs,
|
'$tabs' => $tabs,
|
||||||
'$title' => t('Events'),
|
'$title' => t('Events'),
|
||||||
'$view' => t('View'),
|
'$view' => t('View'),
|
||||||
'$previous' => array(App::get_baseurl()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
|
'$previous' => array(App::get_baseurl()."/events/$prevyear/$prevmonth", t('Previous'),'',''),
|
||||||
'$next' => array(App::get_baseurl()."/events/$nextyear/$nextmonth",t('Next'),'',''),
|
'$next' => array(App::get_baseurl()."/events/$nextyear/$nextmonth", t('Next'),'',''),
|
||||||
'$calendar' => cal($y,$m,$links, ' eventcal'),
|
'$calendar' => cal($y,$m,$links, ' eventcal'),
|
||||||
|
|
||||||
'$events' => $events,
|
'$events' => $events,
|
||||||
|
|
|
@ -872,7 +872,7 @@ function dfrn_request_content(App $a) {
|
||||||
'$header' => t('Friend/Connection Request'),
|
'$header' => t('Friend/Connection Request'),
|
||||||
'$desc' => t('Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca'),
|
'$desc' => t('Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca'),
|
||||||
'$pls_answer' => t('Please answer the following:'),
|
'$pls_answer' => t('Please answer the following:'),
|
||||||
'$does_know_you' => array('knowyou', sprintf(t('Does %s know you?'),$a->profile['name']), false, '', array(t('No'),t('Yes'))),
|
'$does_know_you' => array('knowyou', sprintf(t('Does %s know you?'),$a->profile['name']), false, '', array(t('No'), t('Yes'))),
|
||||||
/*'$does_know' => sprintf( t('Does %s know you?'),$a->profile['name']),
|
/*'$does_know' => sprintf( t('Does %s know you?'),$a->profile['name']),
|
||||||
'$yes' => t('Yes'),
|
'$yes' => t('Yes'),
|
||||||
'$no' => t('No'), */
|
'$no' => t('No'), */
|
||||||
|
|
|
@ -110,7 +110,7 @@ function follow_content(App $a) {
|
||||||
//'$photo' => proxy_url($ret["photo"], false, PROXY_SIZE_SMALL),
|
//'$photo' => proxy_url($ret["photo"], false, PROXY_SIZE_SMALL),
|
||||||
'$desc' => "",
|
'$desc' => "",
|
||||||
'$pls_answer' => t('Please answer the following:'),
|
'$pls_answer' => t('Please answer the following:'),
|
||||||
'$does_know_you' => array('knowyou', sprintf(t('Does %s know you?'),$ret["name"]), false, '', array(t('No'),t('Yes'))),
|
'$does_know_you' => array('knowyou', sprintf(t('Does %s know you?'),$ret["name"]), false, '', array(t('No'), t('Yes'))),
|
||||||
'$add_note' => t('Add a personal note:'),
|
'$add_note' => t('Add a personal note:'),
|
||||||
'$page_desc' => "",
|
'$page_desc' => "",
|
||||||
'$friendica' => "",
|
'$friendica' => "",
|
||||||
|
|
|
@ -95,7 +95,7 @@ function group_content(App $a) {
|
||||||
|
|
||||||
return replace_macros($tpl, $context + array(
|
return replace_macros($tpl, $context + array(
|
||||||
'$title' => t('Create a group of contacts/friends.'),
|
'$title' => t('Create a group of contacts/friends.'),
|
||||||
'$gname' => array('groupname',t('Group Name: '), '', ''),
|
'$gname' => array('groupname', t('Group Name: '), '', ''),
|
||||||
'$gid' => 'new',
|
'$gid' => 'new',
|
||||||
'$form_security_token' => get_form_security_token("group_edit"),
|
'$form_security_token' => get_form_security_token("group_edit"),
|
||||||
));
|
));
|
||||||
|
@ -185,7 +185,7 @@ function group_content(App $a) {
|
||||||
|
|
||||||
$context = $context + array(
|
$context = $context + array(
|
||||||
'$title' => t('Group Editor'),
|
'$title' => t('Group Editor'),
|
||||||
'$gname' => array('groupname',t('Group Name: '),$group['name'], ''),
|
'$gname' => array('groupname', t('Group Name: '),$group['name'], ''),
|
||||||
'$gid' => $group['id'],
|
'$gid' => $group['id'],
|
||||||
'$drop' => $drop_txt,
|
'$drop' => $drop_txt,
|
||||||
'$form_security_token' => get_form_security_token('group_edit'),
|
'$form_security_token' => get_form_security_token('group_edit'),
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
use Friendica\Core\Config;
|
||||||
|
|
||||||
|
function manifest_content(App $a) {
|
||||||
|
|
||||||
|
$tpl = get_markup_template('manifest.tpl');
|
||||||
|
|
||||||
|
header('Content-type: application/manifest+json');
|
||||||
|
|
||||||
|
$touch_icon = Config::get('system', 'touch_icon', 'images/friendica-128.png');
|
||||||
|
if ($touch_icon == '') {
|
||||||
|
$touch_icon = 'images/friendica-128.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
$o = replace_macros($tpl, array(
|
||||||
|
'$baseurl' => App::get_baseurl(),
|
||||||
|
'$touch_icon' => $touch_icon,
|
||||||
|
'$title' => Config::get('config', 'sitename', 'Friendica'),
|
||||||
|
));
|
||||||
|
|
||||||
|
echo $o;
|
||||||
|
|
||||||
|
killme();
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
|
@ -1581,9 +1581,9 @@ function photos_content(App $a) {
|
||||||
'$album' => array('albname', t('New album name'), $album_e,''),
|
'$album' => array('albname', t('New album name'), $album_e,''),
|
||||||
'$caption' => array('desc', t('Caption'), $caption_e, ''),
|
'$caption' => array('desc', t('Caption'), $caption_e, ''),
|
||||||
'$tags' => array('newtag', t('Add a Tag'), "", t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping')),
|
'$tags' => array('newtag', t('Add a Tag'), "", t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping')),
|
||||||
'$rotate_none' => array('rotate',t('Do not rotate'),0,'', true),
|
'$rotate_none' => array('rotate', t('Do not rotate'),0,'', true),
|
||||||
'$rotate_cw' => array('rotate',t('Rotate CW (right)'),1,''),
|
'$rotate_cw' => array('rotate', t('Rotate CW (right)'),1,''),
|
||||||
'$rotate_ccw' => array('rotate',t('Rotate CCW (left)'),2,''),
|
'$rotate_ccw' => array('rotate', t('Rotate CCW (left)'),2,''),
|
||||||
|
|
||||||
'$nickname' => $a->data['user']['nickname'],
|
'$nickname' => $a->data['user']['nickname'],
|
||||||
'$resource_id' => $ph[0]['resource-id'],
|
'$resource_id' => $ph[0]['resource-id'],
|
||||||
|
|
|
@ -4,6 +4,13 @@ require_once('include/Scrape.php');
|
||||||
|
|
||||||
function probe_content(App $a) {
|
function probe_content(App $a) {
|
||||||
|
|
||||||
|
if (!local_user()) {
|
||||||
|
http_status_exit(403,
|
||||||
|
array("title" => t("Public access denied."),
|
||||||
|
"description" => t("Only logged in users are permitted to perform a probing.")));
|
||||||
|
killme();
|
||||||
|
}
|
||||||
|
|
||||||
$o .= '<h3>Probe Diagnostic</h3>';
|
$o .= '<h3>Probe Diagnostic</h3>';
|
||||||
|
|
||||||
$o .= '<form action="probe" method="get">';
|
$o .= '<form action="probe" method="get">';
|
||||||
|
|
|
@ -637,7 +637,7 @@ function profiles_content(App $a) {
|
||||||
t('Hide contacts and friends:'), //Label
|
t('Hide contacts and friends:'), //Label
|
||||||
!!$r[0]['hide-friends'], //Value
|
!!$r[0]['hide-friends'], //Value
|
||||||
'', //Help string
|
'', //Help string
|
||||||
array(t('No'),t('Yes')) //Off - On strings
|
array(t('No'), t('Yes')) //Off - On strings
|
||||||
),
|
),
|
||||||
'$desc' => t('Hide your contact/friend list from viewers of this profile?'),
|
'$desc' => t('Hide your contact/friend list from viewers of this profile?'),
|
||||||
'$yes_str' => t('Yes'),
|
'$yes_str' => t('Yes'),
|
||||||
|
@ -739,7 +739,7 @@ function profiles_content(App $a) {
|
||||||
'$tv' => array('tv', t('Television'), $r[0]['tv']),
|
'$tv' => array('tv', t('Television'), $r[0]['tv']),
|
||||||
'$film' => array('film', t('Film/dance/culture/entertainment'), $r[0]['film']),
|
'$film' => array('film', t('Film/dance/culture/entertainment'), $r[0]['film']),
|
||||||
'$interest' => array('interest', t('Hobbies/Interests'), $r[0]['interest']),
|
'$interest' => array('interest', t('Hobbies/Interests'), $r[0]['interest']),
|
||||||
'$romance' => array('romance',t('Love/romance'), $r[0]['romance']),
|
'$romance' => array('romance', t('Love/romance'), $r[0]['romance']),
|
||||||
'$work' => array('work', t('Work/employment'), $r[0]['work']),
|
'$work' => array('work', t('Work/employment'), $r[0]['work']),
|
||||||
'$education' => array('education', t('School/education'), $r[0]['education']),
|
'$education' => array('education', t('School/education'), $r[0]['education']),
|
||||||
'$contact' => array('contact', t('Contact information and Social Networks'), $r[0]['contact']),
|
'$contact' => array('contact', t('Contact information and Social Networks'), $r[0]['contact']),
|
||||||
|
|
|
@ -282,7 +282,7 @@ function register_content(App $a) {
|
||||||
'$passwords' => $passwords,
|
'$passwords' => $passwords,
|
||||||
'$password1' => array('password1', t('New Password:'), '', t('Leave empty for an auto generated password.')),
|
'$password1' => array('password1', t('New Password:'), '', t('Leave empty for an auto generated password.')),
|
||||||
'$password2' => array('confirm', t('Confirm:'), '', ''),
|
'$password2' => array('confirm', t('Confirm:'), '', ''),
|
||||||
'$nickdesc' => str_replace('$sitename',$a->get_hostname(),t('Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \'<strong>nickname@$sitename</strong>\'.')),
|
'$nickdesc' => str_replace('$sitename',$a->get_hostname(), t('Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \'<strong>nickname@$sitename</strong>\'.')),
|
||||||
'$nicklabel' => t('Choose a nickname: '),
|
'$nicklabel' => t('Choose a nickname: '),
|
||||||
'$photo' => $photo,
|
'$photo' => $photo,
|
||||||
'$publish' => $profile_publish,
|
'$publish' => $profile_publish,
|
||||||
|
|
|
@ -779,7 +779,7 @@ function settings_content(App $a) {
|
||||||
$arr[$fname] = array();
|
$arr[$fname] = array();
|
||||||
$arr[$fname][0] = $fdata[0];
|
$arr[$fname][0] = $fdata[0];
|
||||||
foreach (array_slice($fdata,1) as $f) {
|
foreach (array_slice($fdata,1) as $f) {
|
||||||
$arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_user(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
|
$arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_user(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'), t('On')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1164,48 +1164,48 @@ function settings_content(App $a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$opt_tpl = get_markup_template("field_yesno.tpl");
|
$opt_tpl = get_markup_template("field_yesno.tpl");
|
||||||
if(get_config('system','publish_all')) {
|
if (get_config('system','publish_all')) {
|
||||||
$profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
|
$profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
|
||||||
} else {
|
} else {
|
||||||
$profile_in_dir = replace_macros($opt_tpl,array(
|
$profile_in_dir = replace_macros($opt_tpl, array(
|
||||||
'$field' => array('profile_in_directory', t('Publish your default profile in your local site directory?'), $profile['publish'], '', array(t('No'),t('Yes'))),
|
'$field' => array('profile_in_directory', t('Publish your default profile in your local site directory?'), $profile['publish'], t("Your profile may be visible in public."), array(t('No'), t('Yes')))
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(get_config('system','directory'))) {
|
if (strlen(get_config('system','directory'))) {
|
||||||
$profile_in_net_dir = replace_macros($opt_tpl,array(
|
$profile_in_net_dir = replace_macros($opt_tpl, array(
|
||||||
'$field' => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'),t('Yes'))),
|
'$field' => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'), t('Yes')))
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
$profile_in_net_dir = '';
|
$profile_in_net_dir = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$hide_friends = replace_macros($opt_tpl,array(
|
$hide_friends = replace_macros($opt_tpl,array(
|
||||||
'$field' => array('hide-friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide-friends'], '', array(t('No'),t('Yes'))),
|
'$field' => array('hide-friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide-friends'], '', array(t('No'), t('Yes'))),
|
||||||
));
|
));
|
||||||
|
|
||||||
$hide_wall = replace_macros($opt_tpl,array(
|
$hide_wall = replace_macros($opt_tpl,array(
|
||||||
'$field' => array('hidewall', t('Hide your profile details from unknown viewers?'), $a->user['hidewall'], t("If enabled, posting public messages to Diaspora and other networks isn't possible."), array(t('No'),t('Yes'))),
|
'$field' => array('hidewall', t('Hide your profile details from unknown viewers?'), $a->user['hidewall'], t("If enabled, posting public messages to Diaspora and other networks isn't possible."), array(t('No'), t('Yes'))),
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
||||||
$blockwall = replace_macros($opt_tpl,array(
|
$blockwall = replace_macros($opt_tpl,array(
|
||||||
'$field' => array('blockwall', t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
|
'$field' => array('blockwall', t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
||||||
$blocktags = replace_macros($opt_tpl,array(
|
$blocktags = replace_macros($opt_tpl,array(
|
||||||
'$field' => array('blocktags', t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
|
'$field' => array('blocktags', t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
||||||
$suggestme = replace_macros($opt_tpl,array(
|
$suggestme = replace_macros($opt_tpl,array(
|
||||||
'$field' => array('suggestme', t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'),t('Yes'))),
|
'$field' => array('suggestme', t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'), t('Yes'))),
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
||||||
$unkmail = replace_macros($opt_tpl,array(
|
$unkmail = replace_macros($opt_tpl,array(
|
||||||
'$field' => array('unkmail', t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'),t('Yes'))),
|
'$field' => array('unkmail', t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'), t('Yes'))),
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -1231,11 +1231,11 @@ function settings_content(App $a) {
|
||||||
'days' => array('expire', t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
|
'days' => array('expire', t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
|
||||||
'advanced' => t('Advanced expiration settings'),
|
'advanced' => t('Advanced expiration settings'),
|
||||||
'label' => t('Advanced Expiration'),
|
'label' => t('Advanced Expiration'),
|
||||||
'items' => array('expire_items', t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
|
'items' => array('expire_items', t("Expire posts:"), $expire_items, '', array(t('No'), t('Yes'))),
|
||||||
'notes' => array('expire_notes', t("Expire personal notes:"), $expire_notes, '', array(t('No'),t('Yes'))),
|
'notes' => array('expire_notes', t("Expire personal notes:"), $expire_notes, '', array(t('No'), t('Yes'))),
|
||||||
'starred' => array('expire_starred', t("Expire starred posts:"), $expire_starred, '', array(t('No'),t('Yes'))),
|
'starred' => array('expire_starred', t("Expire starred posts:"), $expire_starred, '', array(t('No'), t('Yes'))),
|
||||||
'photos' => array('expire_photos', t("Expire photos:"), $expire_photos, '', array(t('No'),t('Yes'))),
|
'photos' => array('expire_photos', t("Expire photos:"), $expire_photos, '', array(t('No'), t('Yes'))),
|
||||||
'network_only' => array('expire_network_only', t("Only expire posts by others:"), $expire_network_only, '', array(t('No'),t('Yes'))),
|
'network_only' => array('expire_network_only', t("Only expire posts by others:"), $expire_network_only, '', array(t('No'), t('Yes'))),
|
||||||
);
|
);
|
||||||
|
|
||||||
require_once('include/group.php');
|
require_once('include/group.php');
|
||||||
|
@ -1293,7 +1293,7 @@ function settings_content(App $a) {
|
||||||
|
|
||||||
'$h_prv' => t('Security and Privacy Settings'),
|
'$h_prv' => t('Security and Privacy Settings'),
|
||||||
|
|
||||||
'$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq ,t("\x28to prevent spam abuse\x29")),
|
'$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq , t("\x28to prevent spam abuse\x29")),
|
||||||
'$permissions' => t('Default Post Permissions'),
|
'$permissions' => t('Default Post Permissions'),
|
||||||
'$permdesc' => t("\x28click to open/close\x29"),
|
'$permdesc' => t("\x28click to open/close\x29"),
|
||||||
'$visibility' => $profile['net-publish'],
|
'$visibility' => $profile['net-publish'],
|
||||||
|
@ -1323,7 +1323,7 @@ function settings_content(App $a) {
|
||||||
'$hide_friends' => $hide_friends,
|
'$hide_friends' => $hide_friends,
|
||||||
'$hide_wall' => $hide_wall,
|
'$hide_wall' => $hide_wall,
|
||||||
'$unkmail' => $unkmail,
|
'$unkmail' => $unkmail,
|
||||||
'$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail ,t("\x28to prevent spam abuse\x29")),
|
'$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail , t("\x28to prevent spam abuse\x29")),
|
||||||
|
|
||||||
|
|
||||||
'$h_not' => t('Notification Settings'),
|
'$h_not' => t('Notification Settings'),
|
||||||
|
|
|
@ -34,8 +34,8 @@ function uexport_content(App $a) {
|
||||||
* list of array( 'link url', 'link text', 'help text' )
|
* list of array( 'link url', 'link text', 'help text' )
|
||||||
*/
|
*/
|
||||||
$options = array(
|
$options = array(
|
||||||
array('uexport/account',t('Export account'),t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')),
|
array('uexport/account', t('Export account'), t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')),
|
||||||
array('uexport/backup',t('Export all'),t('Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)')),
|
array('uexport/backup', t('Export all'), t('Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)')),
|
||||||
);
|
);
|
||||||
call_hooks('uexport_options', $options);
|
call_hooks('uexport_options', $options);
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,13 @@ require_once("include/Probe.php");
|
||||||
|
|
||||||
function webfinger_content(App $a) {
|
function webfinger_content(App $a) {
|
||||||
|
|
||||||
|
if (!local_user()) {
|
||||||
|
http_status_exit(403,
|
||||||
|
array("title" => t("Public access denied."),
|
||||||
|
"description" => t("Only logged in users are permitted to perform a probing.")));
|
||||||
|
killme();
|
||||||
|
}
|
||||||
|
|
||||||
$o .= '<h3>Webfinger Diagnostic</h3>';
|
$o .= '<h3>Webfinger Diagnostic</h3>';
|
||||||
|
|
||||||
$o .= '<form action="webfinger" method="get">';
|
$o .= '<form action="webfinger" method="get">';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
define('UPDATE_VERSION' , 1216);
|
define('UPDATE_VERSION' , 1217);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
13895
view/lang/ru/messages.po
13895
view/lang/ru/messages.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt>{{$queues.label}}</dt>
|
<dt>{{$queues.label}}</dt>
|
||||||
<dd>{{$queues.deliverq}} - <a href="{{$baseurl}}/admin/queue">{{$queues.queue}}</a> - {{$queues.workerq}}</dd>
|
<dd><a href="{{$baseurl}}/admin/queue">{{$queues.queue}}</a> - {{$queues.workerq}}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>{{$pending.0}}</dt>
|
<dt>{{$pending.0}}</dt>
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
<link rel="apple-touch-icon" href="{{$touch_icon}}"/>
|
<link rel="apple-touch-icon" href="{{$touch_icon}}"/>
|
||||||
|
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<link rel="manifest" href="{{$baseurl}}/manifest" />
|
||||||
<script>
|
<script>
|
||||||
// Prevents links to switch to Safari in a home screen app - see https://gist.github.com/irae/1042167
|
// Prevents links to switch to Safari in a home screen app - see https://gist.github.com/irae/1042167
|
||||||
(function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(chref=d.href).replace(e.href,"").indexOf("#")&&(!/^[a-z\+\.\-]+:/i.test(chref)||chref.indexOf(e.protocol+"//"+e.host)===0)&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone");
|
(function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(chref=d.href).replace(e.href,"").indexOf("#")&&(!/^[a-z\+\.\-]+:/i.test(chref)||chref.indexOf(e.protocol+"//"+e.host)===0)&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone");
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="hover-card-actions-connection">
|
<div class="hover-card-actions-connection">
|
||||||
{{if $profile.actions.network}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.network.1}}" title="{{$profile.actions.network.0}}"><i class="fa fa-cloud" aria-hidden="true"></i></a>{{/if}}
|
{{if $profile.actions.network}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.network.1}}" title="{{$profile.actions.network.0}}"><i class="fa fa-cloud" aria-hidden="true"></i></a>{{/if}}
|
||||||
{{if $profile.actions.edit}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.edit.1}}" title="{{$profile.actions.edit.0}}"><i class="fa fa-pencil" aria-hidden="true"></i></a>{{/if}}
|
{{if $profile.actions.edit}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.edit.1}}" title="{{$profile.actions.edit.0}}"><i class="fa fa-user" aria-hidden="true"></i></a>{{/if}}
|
||||||
{{if $profile.actions.follow}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.follow.1}}" title="{{$profile.actions.follow.0}}"><i class="fa fa-user-plus" aria-hidden="true"></i></a>{{/if}}
|
{{if $profile.actions.follow}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.follow.1}}" title="{{$profile.actions.follow.0}}"><i class="fa fa-user-plus" aria-hidden="true"></i></a>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"name": "{{$title}}",
|
||||||
|
"start_url": "{{$baseurl}}",
|
||||||
|
"display": "standalone",
|
||||||
|
"description": "A Decentralized Social Network",
|
||||||
|
"icons": [{
|
||||||
|
"src": "{{$baseurl}}/{{$touch_icon}}"
|
||||||
|
}]
|
||||||
|
}
|
|
@ -42,7 +42,6 @@
|
||||||
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="media-body">
|
<div class="media-body">
|
||||||
|
@ -51,7 +50,7 @@
|
||||||
{{if $contact.photo_menu.pm }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.pm.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.pm.0}}"><i class="fa fa-envelope" aria-hidden="true"></i></button>{{/if}}
|
{{if $contact.photo_menu.pm }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.pm.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.pm.0}}"><i class="fa fa-envelope" aria-hidden="true"></i></button>{{/if}}
|
||||||
{{if $contact.photo_menu.poke }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.poke.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.poke.0}}"><i class="fa fa-heartbeat" aria-hidden="true"></i></button>{{/if}}
|
{{if $contact.photo_menu.poke }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.poke.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.poke.0}}"><i class="fa fa-heartbeat" aria-hidden="true"></i></button>{{/if}}
|
||||||
{{if $contact.photo_menu.network}}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.network.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.network.0}}"><i class="fa fa-cloud" aria-hidden="true"></i></a>{{/if}}
|
{{if $contact.photo_menu.network}}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.network.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.network.0}}"><i class="fa fa-cloud" aria-hidden="true"></i></a>{{/if}}
|
||||||
{{if $contact.photo_menu.edit }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.edit.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.edit.0}}"><i class="fa fa-pencil" aria-hidden="true"></i></a>{{/if}}
|
{{if $contact.photo_menu.edit }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.edit.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.edit.0}}"><i class="fa fa-user" aria-hidden="true"></i></a>{{/if}}
|
||||||
{{if $contact.photo_menu.drop }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.drop.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.drop.0}}"><i class="fa fa-user-times" aria-hidden="true"></i></button>{{/if}}
|
{{if $contact.photo_menu.drop }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.drop.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.drop.0}}"><i class="fa fa-user-times" aria-hidden="true"></i></button>{{/if}}
|
||||||
{{if $contact.photo_menu.follow }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.follow.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.follow.0}}"><i class="fa fa-user-plus" aria-hidden="true"></i></a>{{/if}}
|
{{if $contact.photo_menu.follow }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.follow.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.follow.0}}"><i class="fa fa-user-plus" aria-hidden="true"></i></a>{{/if}}
|
||||||
{{if $contact.photo_menu.hide }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.hide.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.hide.0}}"><i class="fa fa-times" aria-hidden="true"></i></a>{{/if}}
|
{{if $contact.photo_menu.hide }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.hide.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.hide.0}}"><i class="fa fa-times" aria-hidden="true"></i></a>{{/if}}
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
<link rel="apple-touch-icon" href="{{$touch_icon}}"/>
|
<link rel="apple-touch-icon" href="{{$touch_icon}}"/>
|
||||||
|
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<link rel="manifest" href="{{$baseurl}}/manifest" />
|
||||||
<script>
|
<script>
|
||||||
// Prevents links to switch to Safari in a home screen app - see https://gist.github.com/irae/1042167
|
// Prevents links to switch to Safari in a home screen app - see https://gist.github.com/irae/1042167
|
||||||
(function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(chref=d.href).replace(e.href,"").indexOf("#")&&(!/^[a-z\+\.\-]+:/i.test(chref)||chref.indexOf(e.protocol+"//"+e.host)===0)&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone");
|
(function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(chref=d.href).replace(e.href,"").indexOf("#")&&(!/^[a-z\+\.\-]+:/i.test(chref)||chref.indexOf(e.protocol+"//"+e.host)===0)&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone");
|
||||||
|
|
|
@ -240,7 +240,7 @@ function frio_remote_nav($a,&$nav) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!local_user() && !empty($server_url)) {
|
if(!local_user() && !empty($server_url)) {
|
||||||
$nav['logout'] = Array($server_url . '/logout',t('Logout'), "", t('End this session'));
|
$nav['logout'] = Array($server_url . '/logout', t('Logout'), "", t('End this session'));
|
||||||
|
|
||||||
// user menu
|
// user menu
|
||||||
$nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname'], t('Status'), "", t('Your posts and conversations'));
|
$nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname'], t('Status'), "", t('Your posts and conversations'));
|
||||||
|
|
|
@ -70,7 +70,7 @@ function quattro_form(App $a, $align, $color, $tfs, $pfs) {
|
||||||
'$align' => array('quattro_align', t('Alignment'), $align, '', array('left'=>t('Left'), 'center'=>t('Center'))),
|
'$align' => array('quattro_align', t('Alignment'), $align, '', array('left'=>t('Left'), 'center'=>t('Center'))),
|
||||||
'$color' => array('quattro_color', t('Color scheme'), $color, '', $colors),
|
'$color' => array('quattro_color', t('Color scheme'), $color, '', $colors),
|
||||||
'$pfs' => array('quattro_pfs', t('Posts font size'), $pfs),
|
'$pfs' => array('quattro_pfs', t('Posts font size'), $pfs),
|
||||||
'$tfs' => array('quattro_tfs',t('Textareas font size'), $tfs),
|
'$tfs' => array('quattro_tfs', t('Textareas font size'), $tfs),
|
||||||
));
|
));
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user