Merge pull request #13442 from annando/channel-contac-visibility

Channel frequency rules can now be set for each contact
This commit is contained in:
Hypolite Petovan 2023-09-17 13:55:36 -04:00 committed by GitHub
commit 75ca10896c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 441 additions and 164 deletions

View file

@ -1,6 +1,6 @@
-- ------------------------------------------
-- Friendica 2023.09-dev (Giant Rhubarb)
-- DB_UPDATE_VERSION 1532
-- DB_UPDATE_VERSION 1533
-- ------------------------------------------
@ -1572,6 +1572,7 @@ CREATE TABLE IF NOT EXISTS `post-thread-user` (
INDEX `psid` (`psid`),
INDEX `post-user-id` (`post-user-id`),
INDEX `commented` (`commented`),
INDEX `received` (`received`),
INDEX `uid_received` (`uid`,`received`),
INDEX `uid_wall_received` (`uid`,`wall`,`received`),
INDEX `uid_commented` (`uid`,`commented`),
@ -1733,14 +1734,14 @@ CREATE TABLE IF NOT EXISTS `report` (
`cid` int unsigned NOT NULL COMMENT 'Reported contact',
`gsid` int unsigned COMMENT 'Reported contact server',
`comment` text COMMENT 'Report',
`category-id` int unsigned NOT NULL DEFAULT 1 COMMENT 'Report category, one of Entity\Report::CATEGORY_*',
`category-id` int unsigned NOT NULL DEFAULT 1 COMMENT 'Report category, one of Entity Report::CATEGORY_*',
`forward` boolean COMMENT 'Forward the report to the remote server',
`public-remarks` text COMMENT 'Remarks shared with the reporter',
`private-remarks` text COMMENT 'Remarks shared with the moderation team',
`last-editor-uid` mediumint unsigned COMMENT 'Last editor user',
`assigned-uid` mediumint unsigned COMMENT 'Assigned moderator user',
`status` tinyint unsigned NOT NULL COMMENT 'Status of the report, one of Entity\Report::STATUS_*',
`resolution` tinyint unsigned COMMENT 'Resolution of the report, one of Entity\Report::RESOLUTION_*',
`status` tinyint unsigned NOT NULL COMMENT 'Status of the report, one of Entity Report::STATUS_*',
`resolution` tinyint unsigned COMMENT 'Resolution of the report, one of Entity Report::RESOLUTION_*',
`created` datetime(6) NOT NULL DEFAULT '0001-01-01 00:00:00.000000' COMMENT '',
`edited` datetime(6) COMMENT 'Last time the report has been edited',
PRIMARY KEY(`id`),
@ -1866,6 +1867,7 @@ CREATE TABLE IF NOT EXISTS `user-contact` (
`collapsed` boolean COMMENT 'Posts from this contact are collapsed',
`hidden` boolean COMMENT 'This contact is hidden from the others',
`is-blocked` boolean COMMENT 'User is blocked by this contact',
`channel-frequency` tinyint unsigned COMMENT 'Controls the frequency of the appearance of this contact in channels',
`pending` boolean COMMENT '',
`rel` tinyint unsigned COMMENT 'The kind of the relation between the user and the contact',
`info` mediumtext COMMENT '',

View file

@ -49,6 +49,7 @@ Indexes
| psid | psid |
| post-user-id | post-user-id |
| commented | commented |
| received | received |
| uid_received | uid, received |
| uid_wall_received | uid, wall, received |
| uid_commented | uid, commented |

View file

@ -14,14 +14,14 @@ Fields
| cid | Reported contact | int unsigned | NO | | NULL | |
| gsid | Reported contact server | int unsigned | YES | | NULL | |
| comment | Report | text | YES | | NULL | |
| category-id | Report category, one of Entity\Report::CATEGORY_* | int unsigned | NO | | 1 | |
| category-id | Report category, one of Entity Report::CATEGORY_* | int unsigned | NO | | 1 | |
| forward | Forward the report to the remote server | boolean | YES | | NULL | |
| public-remarks | Remarks shared with the reporter | text | YES | | NULL | |
| private-remarks | Remarks shared with the moderation team | text | YES | | NULL | |
| last-editor-uid | Last editor user | mediumint unsigned | YES | | NULL | |
| assigned-uid | Assigned moderator user | mediumint unsigned | YES | | NULL | |
| status | Status of the report, one of Entity\Report::STATUS_* | tinyint unsigned | NO | | NULL | |
| resolution | Resolution of the report, one of Entity\Report::RESOLUTION_* | tinyint unsigned | YES | | NULL | |
| status | Status of the report, one of Entity Report::STATUS_* | tinyint unsigned | NO | | NULL | |
| resolution | Resolution of the report, one of Entity Report::RESOLUTION_* | tinyint unsigned | YES | | NULL | |
| created | | datetime(6) | NO | | 0001-01-01 00:00:00.000000 | |
| edited | Last time the report has been edited | datetime(6) | YES | | NULL | |

View file

@ -16,6 +16,7 @@ Fields
| collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | |
| hidden | This contact is hidden from the others | boolean | YES | | NULL | |
| is-blocked | User is blocked by this contact | boolean | YES | | NULL | |
| channel-frequency | Controls the frequency of the appearance of this contact in channels | tinyint unsigned | YES | | NULL | |
| pending | | boolean | YES | | NULL | |
| rel | The kind of the relation between the user and the contact | tinyint unsigned | YES | | NULL | |
| info | | mediumtext | YES | | NULL | |

View file

@ -284,7 +284,7 @@ class DBStructure
echo $sql;
}
if ($action) {
$r = DBA::e(str_replace('\\', '\\\\', $sql));
$r = DBA::e($sql);
if (!DBA::isResult($r)) {
$errors .= self::printUpdateError($name);
}
@ -493,7 +493,7 @@ class DBStructure
DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: updating %s table.', DateTimeFormat::utcNow() . ' ' . date('e'), $name));
}
$r = DBA::e(str_replace('\\', '\\\\', $sql3));
$r = DBA::e($sql3);
if (!DBA::isResult($r)) {
$errors .= self::printUpdateError($sql3);
}

View file

@ -37,6 +37,10 @@ use PDOException;
*/
class User
{
const FREQUENCY_DEFAULT = 0;
const FREQUENCY_NEVER = 1;
const FREQUENCY_ALWAYS = 2;
const FREQUENCY_REDUCED = 3;
/**
* Insert a user-contact for a given contact array
*
@ -314,6 +318,53 @@ class User
return $collapsed;
}
/**
* Set the channel post frequency for contact id and user id
*
* @param int $cid Either public contact id or user's contact id
* @param int $uid User ID
* @param int $frequency Type of post frequency in channels
* @return void
* @throws \Exception
*/
public static function setChannelFrequency(int $cid, int $uid, int $frequency)
{
$cdata = Contact::getPublicAndUserContactID($cid, $uid);
if (empty($cdata)) {
return;
}
DBA::update('user-contact', ['channel-frequency' => $frequency], ['cid' => $cdata['public'], 'uid' => $uid], true);
}
/**
* Returns the channel frequency state for contact id and user id
*
* @param int $cid Either public contact id or user's contact id
* @param int $uid User ID
* @return int Type of post frequency in channels
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getChannelFrequency(int $cid, int $uid): int
{
$cdata = Contact::getPublicAndUserContactID($cid, $uid);
if (empty($cdata)) {
return false;
}
$frequency = self::FREQUENCY_DEFAULT;
if (!empty($cdata['public'])) {
$public_contact = DBA::selectFirst('user-contact', ['channel-frequency'], ['cid' => $cdata['public'], 'uid' => $uid]);
if (DBA::isResult($public_contact)) {
$frequency = $public_contact['channel-frequency'] ?? self::FREQUENCY_DEFAULT;
}
}
return $frequency;
}
/**
* Set/Release that the user is blocked by the contact
*

View file

@ -132,6 +132,10 @@ class Profile extends BaseModule
$fields['info'] = $_POST['info'];
}
if (isset($_POST['channel_frequency'])) {
Contact\User::setChannelFrequency($cdata['user'], $this->session->getLocalUserId(), $_POST['channel_frequency']);
}
if (!Contact::update($fields, ['id' => $cdata['user'], 'uid' => $this->session->getLocalUserId()])) {
$this->systemMessages->addNotice($this->t('Failed to update contact record.'));
}
@ -336,6 +340,14 @@ class Profile extends BaseModule
];
}
if (in_array($contact['network'], Protocol::FEDERATED)) {
$channel_settings_label = $this->t('Channel Settings');
$channel_frequency = Contact\User::getChannelFrequency($contact['id'], $this->session->getLocalUserId());
} else {
$channel_settings_label = null;
$channel_frequency = null;
}
$poll_interval = null;
if ((($contact['network'] == Protocol::FEED) && !$this->config->get('system', 'adjust_poll_frequency')) || ($contact['network'] == Protocol::MAIL)) {
$poll_interval = ContactSelector::pollInterval($localRelationship->priority, !$poll_enabled);
@ -419,6 +431,13 @@ class Profile extends BaseModule
$this->t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'),
$remote_self_options
],
'$channel_settings_label' => $channel_settings_label,
'$frequency_label' => $this->t('Frequency of this contact in relevant channels'),
'$frequency_description' => $this->t("Depending on the type of the channel not all posts from this contact are displayed. By default, posts need to have a minimum amount of interactions (comments, likes) to show in your channels. On the other hand there can be contacts who flood the channel, so you might want to see only some of their posts. Or you don't want to see their content at all, but you don't want to block or hide the contact completely."),
'$frequency_default' => ['channel_frequency', $this->t('Default frequency'), Contact\User::FREQUENCY_DEFAULT, $this->t('Posts by this contact are displayed in the "for you" channel if you interact often with this contact or if a post reached some level of interaction.'), $channel_frequency == Contact\User::FREQUENCY_DEFAULT],
'$frequency_always' => ['channel_frequency', $this->t('Display all posts of this contact'), Contact\User::FREQUENCY_ALWAYS, $this->t('All posts from this contact will appear on the "for you" channel'), $channel_frequency == Contact\User::FREQUENCY_ALWAYS],
'$frequency_reduced' => ['channel_frequency', $this->t('Display only few posts'), Contact\User::FREQUENCY_REDUCED, $this->t('When a contact creates a lot of posts in a short period, this setting reduces the number of displayed posts in every channel.'), $channel_frequency == Contact\User::FREQUENCY_REDUCED],
'$frequency_never' => ['channel_frequency', $this->t('Never display posts'), Contact\User::FREQUENCY_NEVER, $this->t('Posts from this contact will never be displayed in any channel'), $channel_frequency == Contact\User::FREQUENCY_NEVER],
]);
$arr = ['contact' => $contact, 'output' => $o];

View file

@ -160,5 +160,6 @@ class Channel extends Timeline
}
$this->maxId = $request['last_created'] ?? $this->maxId;
$this->minId = $request['first_created'] ?? $this->minId;
}
}

View file

@ -126,13 +126,13 @@ class Community extends Timeline
return $o;
}
$o .= $this->conversation->render($items, Conversation::MODE_COMMUNITY, false, false, 'commented', $this->session->getLocalUserId());
$o .= $this->conversation->render($items, Conversation::MODE_COMMUNITY, false, false, 'received', $this->session->getLocalUserId());
$pager = new BoundariesPager(
$this->l10n,
$this->args->getQueryString(),
$items[0]['commented'],
$items[count($items) - 1]['commented'],
$items[0]['received'],
$items[count($items) - 1]['received'],
$this->itemsPerPage
);
@ -196,6 +196,7 @@ class Community extends Timeline
}
}
$this->maxId = $request['last_commented'] ?? $this->maxId;
$this->maxId = $request['last_received'] ?? $this->maxId;
$this->minId = $request['first_received'] ?? $this->minId;
}
}

View file

@ -130,22 +130,17 @@ class Network extends Timeline
$this->page['aside'] .= $this->getNoSharerWidget($module);
}
if (Feature::isEnabled($this->session->getLocalUserId(), 'trending_tags')) {
$this->page['aside'] .= TrendingTags::getHTML($this->selectedTab);
}
$items = $this->getChannelItems();
} elseif ($this->timeline->isCommunity($this->selectedTab)) {
if ($this->session->getLocalUserId() && $this->config->get('system', 'community_no_sharer')) {
$this->page['aside'] .= $this->getNoSharerWidget($module);
}
if (Feature::isEnabled($this->session->getLocalUserId(), 'trending_tags')) {
$this->page['aside'] .= TrendingTags::getHTML($this->selectedTab);
}
$items = $this->getCommunityItems();
} else {
$items = $this->getItems();
}
$this->page['aside'] .= Circle::sidebarWidget($module, $module . '/circle', 'standard', $this->circleId);
$this->page['aside'] .= GroupManager::widget($module . '/group', $this->session->getLocalUserId(), $this->groupContactId);
$this->page['aside'] .= Widget::postedByYear($module . '/archive', $this->session->getLocalUserId(), false);
@ -153,7 +148,8 @@ class Network extends Timeline
$this->page['aside'] .= Widget\SavedSearches::getHTML($this->args->getQueryString());
$this->page['aside'] .= Widget::fileAs('filed', '');
$items = $this->getItems();
if (Feature::isEnabled($this->session->getLocalUserId(), 'trending_tags')) {
$this->page['aside'] .= TrendingTags::getHTML($this->selectedTab);
}
if ($this->pConfig->get($this->session->getLocalUserId(), 'system', 'infinite_scroll') && ($_GET['mode'] ?? '') != 'minimal') {
@ -321,6 +317,10 @@ class Network extends Timeline
throw new HTTPException\BadRequestException($this->l10n->t('Network feed not available.'));
}
if (($this->network || $this->circleId || $this->groupContactId) && ($this->timeline->isChannel($this->selectedTab) || $this->timeline->isCommunity($this->selectedTab))) {
$this->selectedTab = TimelineEntity::RECEIVED;
}
if (!empty($request['star'])) {
$this->selectedTab = TimelineEntity::STAR;
$this->star = true;
@ -340,7 +340,7 @@ class Network extends Timeline
$this->order = $request['order'];
$this->star = false;
$this->mention = false;
} elseif (in_array($this->selectedTab, [TimelineEntity::RECEIVED, TimelineEntity::STAR])) {
} elseif (in_array($this->selectedTab, [TimelineEntity::RECEIVED, TimelineEntity::STAR]) || $this->timeline->isCommunity($this->selectedTab)) {
$this->order = 'received';
} elseif (($this->selectedTab == TimelineEntity::CREATED) || $this->timeline->isChannel($this->selectedTab)) {
$this->order = 'created';
@ -348,6 +348,12 @@ class Network extends Timeline
$this->order = 'commented';
}
// Upon updates in the background and order by last comment we order by received date,
// since otherwise the feed will optically jump, when some already visible thread has been updated.
if ($this->update && ($this->selectedTab == TimelineEntity::COMMENTED)) {
$this->order = 'received';
}
$this->selectedTab = $this->selectedTab ?? $this->order;
// Prohibit combined usage of "star" and "mention"
@ -368,16 +374,20 @@ class Network extends Timeline
switch ($this->order) {
case 'received':
$this->maxId = $request['last_received'] ?? $this->maxId;
$this->minId = $request['first_received'] ?? $this->minId;
break;
case 'created':
$this->maxId = $request['last_created'] ?? $this->maxId;
$this->minId = $request['first_created'] ?? $this->minId;
break;
case 'uriid':
$this->maxId = $request['last_uriid'] ?? $this->maxId;
$this->minId = $request['first_uriid'] ?? $this->minId;
break;
default:
$this->order = 'commented';
$this->maxId = $request['last_commented'] ?? $this->maxId;
$this->minId = $request['first_commented'] ?? $this->minId;
}
}

View file

@ -62,6 +62,10 @@ class Timeline extends BaseModule
protected $itemsPerPage;
/** @var bool */
protected $noSharer;
/** @var bool */
protected $force;
/** @var bool */
protected $update;
/** @var App\Mode $mode */
protected $mode;
@ -129,6 +133,8 @@ class Timeline extends BaseModule
$this->maxId = $request['max_id'] ?? null;
$this->noSharer = !empty($request['no_sharer']);
$this->force = !empty($request['force']) && !empty($request['item']);
$this->update = !empty($request['force']) && !empty($request['first_received']) && !empty($request['first_created']) && !empty($request['first_uriid']) && !empty($request['first_commented']);
}
protected function getNoSharerWidget(string $base): string
@ -188,14 +194,81 @@ class Timeline extends BaseModule
* @throws \Exception
*/
protected function getChannelItems()
{
$items = $this->getRawChannelItems();
$contacts = $this->database->selectToArray('user-contact', ['cid'], ['channel-frequency' => Contact\User::FREQUENCY_REDUCED, 'cid' => array_column($items, 'owner-id')]);
$reduced = array_column($contacts, 'cid');
$maxpostperauthor = $this->config->get('channel', 'max_posts_per_author');
if ($maxpostperauthor != 0) {
$count = 1;
$owner_posts = [];
$selected_items = [];
while (count($selected_items) < $this->itemsPerPage && ++$count < 50 && count($items) > 0) {
$maxposts = round((count($items) / $this->itemsPerPage) * $maxpostperauthor);
$minId = $items[array_key_first($items)]['created'];
$maxId = $items[array_key_last($items)]['created'];
foreach ($items as $item) {
if (!in_array($item['owner-id'], $reduced)) {
continue;
}
$owner_posts[$item['owner-id']][$item['uri-id']] = (($item['comments'] * 100) + $item['activities']);
}
foreach ($owner_posts as $posts) {
if (count($posts) <= $maxposts) {
continue;
}
asort($posts);
while (count($posts) > $maxposts) {
$uri_id = array_key_first($posts);
unset($posts[$uri_id]);
unset($items[$uri_id]);
}
}
$selected_items = array_merge($selected_items, $items);
// If we're looking at a "previous page", the lookup continues forward in time because the list is
// sorted in chronologically decreasing order
if (!empty($this->minId)) {
$this->minId = $minId;
} else {
// In any other case, the lookup continues backwards in time
$this->maxId = $maxId;
}
if (count($selected_items) < $this->itemsPerPage) {
$items = $this->getRawChannelItems();
}
}
} else {
$selected_items = $items;
}
$condition = ['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'parent-uri-id' => array_column($selected_items, 'uri-id')];
$this->setItemsSeenByCondition($condition);
return $selected_items;
}
/**
* Database query for the channel page
*
* @return array
* @throws \Exception
*/
private function getRawChannelItems()
{
$uid = $this->session->getLocalUserId();
if ($this->selectedTab == TimelineEntity::WHATSHOT) {
if (!is_null($this->accountType)) {
$condition = ["(`comments` >= ? OR `activities` >= ?) AND `contact-type` = ?", $this->getMedianComments($uid, 4), $this->getMedianActivities($uid, 4), $this->accountType];
$condition = ["(`comments` > ? OR `activities` > ?) AND `contact-type` = ?", $this->getMedianComments($uid, 4), $this->getMedianActivities($uid, 4), $this->accountType];
} else {
$condition = ["(`comments` >= ? OR `activities` >= ?) AND `contact-type` != ?", $this->getMedianComments($uid, 4), $this->getMedianActivities($uid, 4), Contact::TYPE_COMMUNITY];
$condition = ["(`comments` > ? OR `activities` > ?) AND `contact-type` != ?", $this->getMedianComments($uid, 4), $this->getMedianActivities($uid, 4), Contact::TYPE_COMMUNITY];
}
} elseif ($this->selectedTab == TimelineEntity::FORYOU) {
$cid = Contact::getPublicIdByUserId($uid);
@ -203,9 +276,9 @@ class Timeline extends BaseModule
$condition = [
"(`owner-id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ? AND `relation-thread-score` > ?) OR
((`comments` >= ? OR `activities` >= ?) AND `owner-id` IN (SELECT `cid` FROM `contact-relation` WHERE `follows` AND `relation-cid` = ?)) OR
(`owner-id` IN (SELECT `pid` FROM `account-user-view` WHERE `uid` = ? AND `rel` IN (?, ?) AND `notify_new_posts`)))",
(`owner-id` IN (SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND (`notify_new_posts` OR `channel-frequency` = ?))))",
$cid, $this->getMedianRelationThreadScore($cid, 4), $this->getMedianComments($uid, 4), $this->getMedianActivities($uid, 4), $cid,
$uid, Contact::FRIEND, Contact::SHARING
$uid, Contact\User::FREQUENCY_ALWAYS
];
} elseif ($this->selectedTab == TimelineEntity::FOLLOWERS) {
$condition = ["`owner-id` IN (SELECT `pid` FROM `account-user-view` WHERE `uid` = ? AND `rel` = ?)", $uid, Contact::FOLLOWER];
@ -233,7 +306,7 @@ class Timeline extends BaseModule
$condition = $this->addLanguageCondition($uid, $condition);
}
$condition = DBA::mergeConditions($condition, ["NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND `cid` = `post-engagement`.`owner-id` AND (`ignored` OR `blocked` OR `collapsed`))", $uid]);
$condition = DBA::mergeConditions($condition, ["NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND `cid` = `post-engagement`.`owner-id` AND (`ignored` OR `blocked` OR `collapsed` OR `is-blocked` OR `channel-frequency` = ?))", $uid, Contact\User::FREQUENCY_NEVER]);
if (($this->selectedTab != TimelineEntity::WHATSHOT) && !is_null($this->accountType)) {
$condition = DBA::mergeConditions($condition, ['contact-type' => $this->accountType]);
@ -262,14 +335,20 @@ class Timeline extends BaseModule
}
}
$items = $this->database->selectToArray('post-engagement', ['uri-id', 'created'], $condition, $params);
$items = [];
$result = $this->database->select('post-engagement', ['uri-id', 'created', 'owner-id', 'comments', 'activities'], $condition, $params);
while ($item = $this->database->fetch($result)) {
$items[$item['uri-id']] = $item;
}
$this->database->close($result);
if (empty($items)) {
return [];
}
// Previous page case: once we get the relevant items closest to min_id, we need to restore the expected display order
if (empty($this->itemUriId) && isset($this->minId) && !isset($this->maxId)) {
$items = array_reverse($items);
$items = array_reverse($items, true);
}
$condition = ['unseen' => true, 'uid' => $uid, 'parent-uri-id' => array_column($items, 'uri-id')];
@ -400,10 +479,10 @@ class Timeline extends BaseModule
// If we're looking at a "previous page", the lookup continues forward in time because the list is
// sorted in chronologically decreasing order
if (isset($this->minId)) {
$this->minId = $items[0]['commented'];
$this->minId = $items[0]['received'];
} else {
// In any other case, the lookup continues backwards in time
$this->maxId = $items[count($items) - 1]['commented'];
$this->maxId = $items[count($items) - 1]['received'];
}
$items = $this->selectItems();
@ -428,22 +507,18 @@ class Timeline extends BaseModule
private function selectItems()
{
if ($this->selectedTab == 'local') {
if (!is_null($this->accountType)) {
$condition = ["`wall` AND `origin` AND `private` = ? AND `owner-contact-type` = ?", Item::PUBLIC, $this->accountType];
} else {
$condition = ["`wall` AND `origin` AND `private` = ?", Item::PUBLIC];
}
} elseif ($this->selectedTab == 'global') {
if (!is_null($this->accountType)) {
$condition = ["`uid` = ? AND `private` = ? AND `owner-contact-type` = ?", 0, Item::PUBLIC, $this->accountType];
} else {
$condition = ["`uid` = ? AND `private` = ?", 0, Item::PUBLIC];
}
} else {
return [];
}
$params = ['order' => ['commented' => true], 'limit' => $this->itemsPerPage];
if (!is_null($this->accountType)) {
$condition = DBA::mergeConditions($condition, ['owner-contact-type' => $this->accountType]);
}
$params = ['order' => ['received' => true], 'limit' => $this->itemsPerPage];
if (!empty($this->itemUriId)) {
$condition = DBA::mergeConditions($condition, ['uri-id' => $this->itemUriId]);
@ -453,20 +528,20 @@ class Timeline extends BaseModule
}
if (isset($this->maxId)) {
$condition = DBA::mergeConditions($condition, ["`commented` < ?", $this->maxId]);
$condition = DBA::mergeConditions($condition, ["`received` < ?", $this->maxId]);
}
if (isset($this->minId)) {
$condition = DBA::mergeConditions($condition, ["`commented` > ?", $this->minId]);
$condition = DBA::mergeConditions($condition, ["`received` > ?", $this->minId]);
// Previous page case: we want the items closest to min_id but for that we need to reverse the query order
if (!isset($this->maxId)) {
$params['order']['commented'] = false;
$params['order']['received'] = false;
}
}
}
$r = Post::selectThreadForUser($this->session->getLocalUserId() ?: 0, ['uri-id', 'commented', 'author-link'], $condition, $params);
$r = Post::selectThreadForUser($this->session->getLocalUserId() ?: 0, ['uri-id', 'received', 'author-link'], $condition, $params);
$items = Post::toArray($r);
if (empty($items)) {

View file

@ -37,7 +37,7 @@ class Channel extends ChannelModule
$this->parseRequest($request);
$o = '';
if (!empty($request['force'])) {
if ($this->update || $this->force) {
if ($this->timeline->isChannel($this->selectedTab)) {
$items = $this->getChannelItems();
} else {

View file

@ -39,7 +39,7 @@ class Community extends CommunityModule
$this->parseRequest($request);
$o = '';
if (!empty($request['force'])) {
if ($this->update || $this->force) {
$o = DI::conversation()->render($this->getCommunityItems(), Conversation::MODE_COMMUNITY, true, false, 'commented', DI::userSession()->getLocalUserId());
}

View file

@ -35,11 +35,9 @@ class Network extends NetworkModule
$this->parseRequest($request);
$profile_uid = intval($request['p']);
$o = '';
if (empty($request['force'])) {
if (!$this->update && !$this->force) {
System::htmlUpdateExit($o);
}
@ -51,7 +49,7 @@ class Network extends NetworkModule
$items = $this->getItems();
}
$o = $this->conversation->render($items, Conversation::MODE_NETWORK, $profile_uid, false, $this->getOrder(), $this->session->getLocalUserId());
$o = $this->conversation->render($items, Conversation::MODE_NETWORK, true, false, $this->getOrder(), $this->session->getLocalUserId());
System::htmlUpdateExit($o);
}

View file

@ -56,7 +56,7 @@ use Friendica\Database\DBA;
// This file is required several times during the test in DbaDefinition which justifies this condition
if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1532);
define('DB_UPDATE_VERSION', 1533);
}
return [
@ -1578,6 +1578,7 @@ return [
"psid" => ["psid"],
"post-user-id" => ["post-user-id"],
"commented" => ["commented"],
"received" => ["received"],
"uid_received" => ["uid", "received"],
"uid_wall_received" => ["uid", "wall", "received"],
"uid_commented" => ["uid", "commented"],
@ -1728,14 +1729,14 @@ return [
"cid" => ["type" => "int unsigned", "not null" => "1", "foreign" => ["contact" => "id"], "comment" => "Reported contact"],
"gsid" => ["type" => "int unsigned", "foreign" => ["gserver" => "id"], "comment" => "Reported contact server"],
"comment" => ["type" => "text", "comment" => "Report"],
"category-id" => ["type" => "int unsigned", "not null" => 1, "default" => \Friendica\Moderation\Entity\Report::CATEGORY_OTHER, "comment" => "Report category, one of Entity\Report::CATEGORY_*"],
"category-id" => ["type" => "int unsigned", "not null" => 1, "default" => \Friendica\Moderation\Entity\Report::CATEGORY_OTHER, "comment" => "Report category, one of Entity Report::CATEGORY_*"],
"forward" => ["type" => "boolean", "comment" => "Forward the report to the remote server"],
"public-remarks" => ["type" => "text", "comment" => "Remarks shared with the reporter"],
"private-remarks" => ["type" => "text", "comment" => "Remarks shared with the moderation team"],
"last-editor-uid" => ["type" => "mediumint unsigned", "foreign" => ["user" => "uid"], "comment" => "Last editor user"],
"assigned-uid" => ["type" => "mediumint unsigned", "foreign" => ["user" => "uid"], "comment" => "Assigned moderator user"],
"status" => ["type" => "tinyint unsigned", "not null" => "1", "comment" => "Status of the report, one of Entity\Report::STATUS_*"],
"resolution" => ["type" => "tinyint unsigned", "comment" => "Resolution of the report, one of Entity\Report::RESOLUTION_*"],
"status" => ["type" => "tinyint unsigned", "not null" => "1", "comment" => "Status of the report, one of Entity Report::STATUS_*"],
"resolution" => ["type" => "tinyint unsigned", "comment" => "Resolution of the report, one of Entity Report::RESOLUTION_*"],
"created" => ["type" => "datetime(6)", "not null" => "1", "default" => DBA::NULL_DATETIME6, "comment" => ""],
"edited" => ["type" => "datetime(6)", "comment" => "Last time the report has been edited"],
],
@ -1857,6 +1858,7 @@ return [
"collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"],
"hidden" => ["type" => "boolean", "comment" => "This contact is hidden from the others"],
"is-blocked" => ["type" => "boolean", "comment" => "User is blocked by this contact"],
"channel-frequency" => ["type" => "tinyint unsigned", "comment" => "Controls the frequency of the appearance of this contact in channels"],
"pending" => ["type" => "boolean", "comment" => ""],
"rel" => ["type" => "tinyint unsigned", "comment" => "The kind of the relation between the user and the contact"],
"info" => ["type" => "mediumtext", "comment" => ""],

View file

@ -805,6 +805,10 @@ return [
// Number of days that are used to calculate the interaction score.
'interaction_score_days' => 30,
// max_posts_per_author (Integer)
// Maixmum number of posts per page by author
'max_posts_per_author' => 2,
// sharer_interaction_days (Integer)
// Number of days of the last interaction that are used to define which sharers are used for the "sharers of sharers" channel.
'sharer_interaction_days' => 90,

View file

@ -608,6 +608,26 @@ function liveUpdate(src) {
update_url += '&max_id=' + getUrlParameter('max_id');
}
match = $("span.received").first();
if (match.length > 0) {
update_url += '&first_received=' + match[0].innerHTML;
}
match = $("span.created").first();
if (match.length > 0) {
update_url += '&first_created=' + match[0].innerHTML;
}
match = $("span.commented").first();
if (match.length > 0) {
update_url += '&first_commented=' + match[0].innerHTML;
}
match = $("span.uriid").first();
if (match.length > 0) {
update_url += '&first_uriid=' + match[0].innerHTML;
}
$.get(update_url, function(data) {
in_progress = false;
update_item = 0;

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2023.09-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-09-10 07:51+0000\n"
"POT-Creation-Date: 2023-09-16 04:28+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -302,7 +302,7 @@ msgstr ""
#: mod/photos.php:824 mod/photos.php:1101 mod/photos.php:1142
#: mod/photos.php:1198 mod/photos.php:1278
#: src/Module/Calendar/Event/Form.php:250 src/Module/Contact/Advanced.php:132
#: src/Module/Contact/Profile.php:358
#: src/Module/Contact/Profile.php:370
#: src/Module/Debug/ActivityPubConversion.php:140
#: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64
#: src/Module/Debug/Probe.php:54 src/Module/Debug/WebFinger.php:51
@ -606,7 +606,7 @@ msgid "This is you"
msgstr ""
#: mod/photos.php:1141 mod/photos.php:1197 mod/photos.php:1277
#: src/Module/Moderation/Reports.php:96 src/Object/Post.php:572
#: src/Module/Moderation/Reports.php:95 src/Object/Post.php:572
#: src/Object/Post.php:1094
msgid "Comment"
msgstr ""
@ -661,7 +661,7 @@ msgstr ""
msgid "No system theme config value set."
msgstr ""
#: src/App.php:577
#: src/App.php:580
msgid "Apologies but the website is unavailable at the moment."
msgstr ""
@ -1813,7 +1813,7 @@ msgid "Send PM"
msgstr ""
#: src/Content/Item.php:435 src/Module/Contact.php:468
#: src/Module/Contact/Profile.php:498
#: src/Module/Contact/Profile.php:517
#: src/Module/Moderation/Blocklist/Contact.php:116
#: src/Module/Moderation/Users/Active.php:137
#: src/Module/Moderation/Users/Index.php:152
@ -1821,7 +1821,7 @@ msgid "Block"
msgstr ""
#: src/Content/Item.php:436 src/Module/Contact.php:469
#: src/Module/Contact/Profile.php:506
#: src/Module/Contact/Profile.php:525
#: src/Module/Notifications/Introductions.php:134
#: src/Module/Notifications/Introductions.php:206
#: src/Module/Notifications/Notification.php:89
@ -1829,7 +1829,7 @@ msgid "Ignore"
msgstr ""
#: src/Content/Item.php:437 src/Module/Contact.php:470
#: src/Module/Contact/Profile.php:514
#: src/Module/Contact/Profile.php:533
msgid "Collapse"
msgstr ""
@ -1896,7 +1896,7 @@ msgstr ""
#: src/Content/Nav.php:230 src/Module/BaseProfile.php:49
#: src/Module/BaseSettings.php:98 src/Module/Contact.php:504
#: src/Module/Contact/Profile.php:413 src/Module/Profile/Profile.php:268
#: src/Module/Contact/Profile.php:425 src/Module/Profile/Profile.php:268
#: src/Module/Welcome.php:57 view/theme/frio/theme.php:230
msgid "Profile"
msgstr ""
@ -2126,7 +2126,7 @@ msgstr ""
#: src/Module/Moderation/Blocklist/Server/Import.php:118
#: src/Module/Moderation/Blocklist/Server/Index.php:95
#: src/Module/Moderation/Item/Delete.php:61
#: src/Module/Moderation/Reports.php:90 src/Module/Moderation/Summary.php:76
#: src/Module/Moderation/Reports.php:89 src/Module/Moderation/Summary.php:76
#: src/Module/Moderation/Users/Active.php:133
#: src/Module/Moderation/Users/Blocked.php:133
#: src/Module/Moderation/Users/Deleted.php:80
@ -2215,7 +2215,7 @@ msgid "The end"
msgstr ""
#: src/Content/Text/HTML.php:859 src/Content/Widget/VCard.php:116
#: src/Model/Profile.php:461 src/Module/Contact/Profile.php:458
#: src/Model/Profile.php:461 src/Module/Contact/Profile.php:477
msgid "Follow"
msgstr ""
@ -2413,18 +2413,18 @@ msgid "More Trending Tags"
msgstr ""
#: src/Content/Widget/VCard.php:109 src/Model/Profile.php:376
#: src/Module/Contact/Profile.php:402 src/Module/Profile/Profile.php:199
#: src/Module/Contact/Profile.php:414 src/Module/Profile/Profile.php:199
msgid "XMPP:"
msgstr ""
#: src/Content/Widget/VCard.php:110 src/Model/Profile.php:377
#: src/Module/Contact/Profile.php:404 src/Module/Profile/Profile.php:203
#: src/Module/Contact/Profile.php:416 src/Module/Profile/Profile.php:203
msgid "Matrix:"
msgstr ""
#: src/Content/Widget/VCard.php:111 src/Model/Event.php:82
#: src/Model/Event.php:109 src/Model/Event.php:471 src/Model/Event.php:963
#: src/Model/Profile.php:371 src/Module/Contact/Profile.php:400
#: src/Model/Profile.php:371 src/Module/Contact/Profile.php:412
#: src/Module/Directory.php:147 src/Module/Notifications/Introductions.php:187
#: src/Module/Profile/Profile.php:221
msgid "Location:"
@ -2437,7 +2437,7 @@ msgstr ""
#: src/Content/Widget/VCard.php:118 src/Model/Contact.php:1223
#: src/Model/Contact.php:1234 src/Model/Profile.php:463
#: src/Module/Contact/Profile.php:450
#: src/Module/Contact/Profile.php:469
msgid "Unfollow"
msgstr ""
@ -3469,7 +3469,7 @@ msgstr ""
msgid "Homepage:"
msgstr ""
#: src/Model/Profile.php:375 src/Module/Contact/Profile.php:406
#: src/Model/Profile.php:375 src/Module/Contact/Profile.php:418
#: src/Module/Notifications/Introductions.php:189
msgid "About:"
msgstr ""
@ -4276,7 +4276,7 @@ msgstr ""
msgid "Job Parameters"
msgstr ""
#: src/Module/Admin/Queue.php:78 src/Module/Moderation/Reports.php:96
#: src/Module/Admin/Queue.php:78 src/Module/Moderation/Reports.php:95
#: src/Module/Settings/OAuth.php:74
msgid "Created"
msgstr ""
@ -5182,7 +5182,7 @@ msgid ""
"received."
msgstr ""
#: src/Module/Admin/Site.php:513 src/Module/Contact/Profile.php:305
#: src/Module/Admin/Site.php:513 src/Module/Contact/Profile.php:309
#: src/Module/Settings/TwoFactor/Index.php:125
msgid "Disabled"
msgstr ""
@ -5670,7 +5670,7 @@ msgid ""
"the main account."
msgstr ""
#: src/Module/BaseModeration.php:110 src/Module/Moderation/Reports.php:95
#: src/Module/BaseModeration.php:110 src/Module/Moderation/Reports.php:94
msgid "Reports"
msgstr ""
@ -5929,8 +5929,8 @@ msgstr ""
#: src/Module/Contact/Conversations.php:89
#: src/Module/Contact/Conversations.php:94 src/Module/Contact/Media.php:43
#: src/Module/Contact/Posts.php:78 src/Module/Contact/Posts.php:83
#: src/Module/Contact/Posts.php:88 src/Module/Contact/Profile.php:150
#: src/Module/Contact/Profile.php:155 src/Module/Contact/Profile.php:160
#: src/Module/Contact/Posts.php:88 src/Module/Contact/Profile.php:154
#: src/Module/Contact/Profile.php:159 src/Module/Contact/Profile.php:164
#: src/Module/Contact/Redir.php:94 src/Module/Contact/Redir.php:140
#: src/Module/FriendSuggest.php:71 src/Module/FriendSuggest.php:109
msgid "Contact not found."
@ -6088,18 +6088,18 @@ msgstr ""
msgid "Update"
msgstr ""
#: src/Module/Contact.php:468 src/Module/Contact/Profile.php:498
#: src/Module/Contact.php:468 src/Module/Contact/Profile.php:517
#: src/Module/Moderation/Blocklist/Contact.php:117
#: src/Module/Moderation/Users/Blocked.php:138
#: src/Module/Moderation/Users/Index.php:154
msgid "Unblock"
msgstr ""
#: src/Module/Contact.php:469 src/Module/Contact/Profile.php:506
#: src/Module/Contact.php:469 src/Module/Contact/Profile.php:525
msgid "Unignore"
msgstr ""
#: src/Module/Contact.php:470 src/Module/Contact/Profile.php:514
#: src/Module/Contact.php:470 src/Module/Contact/Profile.php:533
msgid "Uncollapse"
msgstr ""
@ -6151,7 +6151,7 @@ msgstr ""
msgid "Pending incoming contact request"
msgstr ""
#: src/Module/Contact.php:627 src/Module/Contact/Profile.php:365
#: src/Module/Contact.php:627 src/Module/Contact/Profile.php:377
#, php-format
msgid "Visit %s's profile [%s]"
msgstr ""
@ -6166,7 +6166,7 @@ msgstr ""
#: src/Module/Contact/Advanced.php:134
#: src/Module/Moderation/Blocklist/Contact.php:122
#: src/Module/Moderation/Reports.php:96
#: src/Module/Moderation/Reports.php:95
#: src/Module/Moderation/Users/Active.php:126
#: src/Module/Moderation/Users/Blocked.php:126
#: src/Module/Moderation/Users/Create.php:70
@ -6287,16 +6287,16 @@ msgstr ""
msgid "Your Identity Address:"
msgstr ""
#: src/Module/Contact/Follow.php:170 src/Module/Contact/Profile.php:396
#: src/Module/Contact/Follow.php:170 src/Module/Contact/Profile.php:408
#: src/Module/Contact/Unfollow.php:129
#: src/Module/Moderation/Blocklist/Contact.php:133
#: src/Module/Moderation/Reports.php:105
#: src/Module/Moderation/Reports.php:104
#: src/Module/Notifications/Introductions.php:129
#: src/Module/Notifications/Introductions.php:198
msgid "Profile URL"
msgstr ""
#: src/Module/Contact/Follow.php:171 src/Module/Contact/Profile.php:408
#: src/Module/Contact/Follow.php:171 src/Module/Contact/Profile.php:420
#: src/Module/Notifications/Introductions.php:191
#: src/Module/Profile/Profile.php:234
msgid "Tags:"
@ -6335,257 +6335,312 @@ msgstr ""
msgid "Profile Match"
msgstr ""
#: src/Module/Contact/Profile.php:136
#: src/Module/Contact/Profile.php:140
msgid "Failed to update contact record."
msgstr ""
#: src/Module/Contact/Profile.php:186
#: src/Module/Contact/Profile.php:190
msgid "Contact has been unblocked"
msgstr ""
#: src/Module/Contact/Profile.php:190
#: src/Module/Contact/Profile.php:194
msgid "Contact has been blocked"
msgstr ""
#: src/Module/Contact/Profile.php:202
#: src/Module/Contact/Profile.php:206
msgid "Contact has been unignored"
msgstr ""
#: src/Module/Contact/Profile.php:206
#: src/Module/Contact/Profile.php:210
msgid "Contact has been ignored"
msgstr ""
#: src/Module/Contact/Profile.php:218
#: src/Module/Contact/Profile.php:222
msgid "Contact has been uncollapsed"
msgstr ""
#: src/Module/Contact/Profile.php:222
#: src/Module/Contact/Profile.php:226
msgid "Contact has been collapsed"
msgstr ""
#: src/Module/Contact/Profile.php:250
#: src/Module/Contact/Profile.php:254
#, php-format
msgid "You are mutual friends with %s"
msgstr ""
#: src/Module/Contact/Profile.php:251
#: src/Module/Contact/Profile.php:255
#, php-format
msgid "You are sharing with %s"
msgstr ""
#: src/Module/Contact/Profile.php:252
#: src/Module/Contact/Profile.php:256
#, php-format
msgid "%s is sharing with you"
msgstr ""
#: src/Module/Contact/Profile.php:268
#: src/Module/Contact/Profile.php:272
msgid "Private communications are not available for this contact."
msgstr ""
#: src/Module/Contact/Profile.php:278
#: src/Module/Contact/Profile.php:282
msgid "This contact is on a server you ignored."
msgstr ""
#: src/Module/Contact/Profile.php:281
#: src/Module/Contact/Profile.php:285
msgid "Never"
msgstr ""
#: src/Module/Contact/Profile.php:284
#: src/Module/Contact/Profile.php:288
msgid "(Update was not successful)"
msgstr ""
#: src/Module/Contact/Profile.php:284
#: src/Module/Contact/Profile.php:288
msgid "(Update was successful)"
msgstr ""
#: src/Module/Contact/Profile.php:286 src/Module/Contact/Profile.php:469
#: src/Module/Contact/Profile.php:290 src/Module/Contact/Profile.php:488
msgid "Suggest friends"
msgstr ""
#: src/Module/Contact/Profile.php:290
#: src/Module/Contact/Profile.php:294
#, php-format
msgid "Network type: %s"
msgstr ""
#: src/Module/Contact/Profile.php:295
#: src/Module/Contact/Profile.php:299
msgid "Communications lost with this contact!"
msgstr ""
#: src/Module/Contact/Profile.php:301
#: src/Module/Contact/Profile.php:305
msgid "Fetch further information for feeds"
msgstr ""
#: src/Module/Contact/Profile.php:303
#: src/Module/Contact/Profile.php:307
msgid ""
"Fetch information like preview pictures, title and teaser from the feed "
"item. You can activate this if the feed doesn't contain much text. Keywords "
"are taken from the meta header in the feed item and are posted as hash tags."
msgstr ""
#: src/Module/Contact/Profile.php:306
#: src/Module/Contact/Profile.php:310
msgid "Fetch information"
msgstr ""
#: src/Module/Contact/Profile.php:307
#: src/Module/Contact/Profile.php:311
msgid "Fetch keywords"
msgstr ""
#: src/Module/Contact/Profile.php:308
#: src/Module/Contact/Profile.php:312
msgid "Fetch information and keywords"
msgstr ""
#: src/Module/Contact/Profile.php:318 src/Module/Contact/Profile.php:323
#: src/Module/Contact/Profile.php:328 src/Module/Contact/Profile.php:334
#: src/Module/Contact/Profile.php:322 src/Module/Contact/Profile.php:327
#: src/Module/Contact/Profile.php:332 src/Module/Contact/Profile.php:338
msgid "No mirroring"
msgstr ""
#: src/Module/Contact/Profile.php:319 src/Module/Contact/Profile.php:329
#: src/Module/Contact/Profile.php:335
#: src/Module/Contact/Profile.php:323 src/Module/Contact/Profile.php:333
#: src/Module/Contact/Profile.php:339
msgid "Mirror as my own posting"
msgstr ""
#: src/Module/Contact/Profile.php:324 src/Module/Contact/Profile.php:330
#: src/Module/Contact/Profile.php:328 src/Module/Contact/Profile.php:334
msgid "Native reshare"
msgstr ""
#: src/Module/Contact/Profile.php:347
#: src/Module/Contact/Profile.php:344
msgid "Channel Settings"
msgstr ""
#: src/Module/Contact/Profile.php:359
msgid "Contact Information / Notes"
msgstr ""
#: src/Module/Contact/Profile.php:348
#: src/Module/Contact/Profile.php:360
msgid "Contact Settings"
msgstr ""
#: src/Module/Contact/Profile.php:356
#: src/Module/Contact/Profile.php:368
msgid "Contact"
msgstr ""
#: src/Module/Contact/Profile.php:360
#: src/Module/Contact/Profile.php:372
msgid "Their personal note"
msgstr ""
#: src/Module/Contact/Profile.php:362
#: src/Module/Contact/Profile.php:374
msgid "Edit contact notes"
msgstr ""
#: src/Module/Contact/Profile.php:366
#: src/Module/Contact/Profile.php:378
msgid "Block/Unblock contact"
msgstr ""
#: src/Module/Contact/Profile.php:367
#: src/Module/Contact/Profile.php:379
#: src/Module/Moderation/Report/Create.php:293
msgid "Ignore contact"
msgstr ""
#: src/Module/Contact/Profile.php:368
#: src/Module/Contact/Profile.php:380
msgid "View conversations"
msgstr ""
#: src/Module/Contact/Profile.php:373
#: src/Module/Contact/Profile.php:385
msgid "Last update:"
msgstr ""
#: src/Module/Contact/Profile.php:375
#: src/Module/Contact/Profile.php:387
msgid "Update public posts"
msgstr ""
#: src/Module/Contact/Profile.php:377 src/Module/Contact/Profile.php:479
#: src/Module/Contact/Profile.php:389 src/Module/Contact/Profile.php:498
msgid "Update now"
msgstr ""
#: src/Module/Contact/Profile.php:379
#: src/Module/Contact/Profile.php:391
msgid "Awaiting connection acknowledge"
msgstr ""
#: src/Module/Contact/Profile.php:380
#: src/Module/Contact/Profile.php:392
msgid "Currently blocked"
msgstr ""
#: src/Module/Contact/Profile.php:381
#: src/Module/Contact/Profile.php:393
msgid "Currently ignored"
msgstr ""
#: src/Module/Contact/Profile.php:382
#: src/Module/Contact/Profile.php:394
msgid "Currently collapsed"
msgstr ""
#: src/Module/Contact/Profile.php:383
#: src/Module/Contact/Profile.php:395
msgid "Currently archived"
msgstr ""
#: src/Module/Contact/Profile.php:386
#: src/Module/Contact/Profile.php:398
msgid "Manage remote servers"
msgstr ""
#: src/Module/Contact/Profile.php:388
#: src/Module/Contact/Profile.php:400
#: src/Module/Notifications/Introductions.php:192
msgid "Hide this contact from others"
msgstr ""
#: src/Module/Contact/Profile.php:388
#: src/Module/Contact/Profile.php:400
msgid ""
"Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
#: src/Module/Contact/Profile.php:389
#: src/Module/Contact/Profile.php:401
msgid "Notification for new posts"
msgstr ""
#: src/Module/Contact/Profile.php:389
#: src/Module/Contact/Profile.php:401
msgid "Send a notification of every new post of this contact"
msgstr ""
#: src/Module/Contact/Profile.php:391
#: src/Module/Contact/Profile.php:403
msgid "Keyword Deny List"
msgstr ""
#: src/Module/Contact/Profile.php:391
#: src/Module/Contact/Profile.php:403
msgid ""
"Comma separated list of keywords that should not be converted to hashtags, "
"when \"Fetch information and keywords\" is selected"
msgstr ""
#: src/Module/Contact/Profile.php:409
#: src/Module/Contact/Profile.php:421
#: src/Module/Settings/TwoFactor/Index.php:139
msgid "Actions"
msgstr ""
#: src/Module/Contact/Profile.php:411
#: src/Module/Contact/Profile.php:423
#: src/Module/Settings/TwoFactor/Index.php:119 view/theme/frio/theme.php:229
msgid "Status"
msgstr ""
#: src/Module/Contact/Profile.php:417
#: src/Module/Contact/Profile.php:429
msgid "Mirror postings from this contact"
msgstr ""
#: src/Module/Contact/Profile.php:419
#: src/Module/Contact/Profile.php:431
msgid ""
"Mark this contact as remote_self, this will cause friendica to repost new "
"entries from this contact."
msgstr ""
#: src/Module/Contact/Profile.php:489
msgid "Refetch contact data"
#: src/Module/Contact/Profile.php:435
msgid "Frequency of this contact in relevant channels"
msgstr ""
#: src/Module/Contact/Profile.php:500
msgid "Toggle Blocked status"
#: src/Module/Contact/Profile.php:436
msgid ""
"Depending on the type of the channel not all posts from this contact are "
"displayed. By default, posts need to have a minimum amount of interactions "
"(comments, likes) to show in your channels. On the other hand there can be "
"contacts who flood the channel, so you might want to see only some of their "
"posts. Or you don't want to see their content at all, but you don't want to "
"block or hide the contact completely."
msgstr ""
#: src/Module/Contact/Profile.php:437
msgid "Default frequency"
msgstr ""
#: src/Module/Contact/Profile.php:437
msgid ""
"Posts by this contact are displayed in the \"for you\" channel if you "
"interact often with this contact or if a post reached some level of "
"interaction."
msgstr ""
#: src/Module/Contact/Profile.php:438
msgid "Display all posts of this contact"
msgstr ""
#: src/Module/Contact/Profile.php:438
msgid "All posts from this contact will appear on the \"for you\" channel"
msgstr ""
#: src/Module/Contact/Profile.php:439
msgid "Display only few posts"
msgstr ""
#: src/Module/Contact/Profile.php:439
msgid ""
"When a contact creates a lot of posts in a short period, this setting "
"reduces the number of displayed posts in every channel."
msgstr ""
#: src/Module/Contact/Profile.php:440
msgid "Never display posts"
msgstr ""
#: src/Module/Contact/Profile.php:440
msgid "Posts from this contact will never be displayed in any channel"
msgstr ""
#: src/Module/Contact/Profile.php:508
msgid "Refetch contact data"
msgstr ""
#: src/Module/Contact/Profile.php:519
msgid "Toggle Blocked status"
msgstr ""
#: src/Module/Contact/Profile.php:527
msgid "Toggle Ignored status"
msgstr ""
#: src/Module/Contact/Profile.php:516
#: src/Module/Contact/Profile.php:535
msgid "Toggle Collapsed status"
msgstr ""
#: src/Module/Contact/Profile.php:523 src/Module/Contact/Revoke.php:106
#: src/Module/Contact/Profile.php:542 src/Module/Contact/Revoke.php:106
msgid "Revoke Follow"
msgstr ""
#: src/Module/Contact/Profile.php:525
#: src/Module/Contact/Profile.php:544
msgid "Revoke the follow from this contact"
msgstr ""
@ -6681,15 +6736,15 @@ msgstr ""
msgid "Network feed not available."
msgstr ""
#: src/Module/Conversation/Timeline.php:152
#: src/Module/Conversation/Timeline.php:155
msgid "Own Contacts"
msgstr ""
#: src/Module/Conversation/Timeline.php:156
#: src/Module/Conversation/Timeline.php:159
msgid "Include"
msgstr ""
#: src/Module/Conversation/Timeline.php:157
#: src/Module/Conversation/Timeline.php:160
msgid "Hide"
msgstr ""
@ -7585,7 +7640,7 @@ msgid "Block New Remote Contact"
msgstr ""
#: src/Module/Moderation/Blocklist/Contact.php:122
#: src/Module/Moderation/Reports.php:96
#: src/Module/Moderation/Reports.php:95
msgid "Photo"
msgstr ""
@ -8147,30 +8202,30 @@ msgstr ""
msgid "3. Pick posts"
msgstr ""
#: src/Module/Moderation/Reports.php:91
#: src/Module/Moderation/Reports.php:90
msgid "List of reports"
msgstr ""
#: src/Module/Moderation/Reports.php:92
#: src/Module/Moderation/Reports.php:91
msgid "This page display reports created by our or remote users."
msgstr ""
#: src/Module/Moderation/Reports.php:93
#: src/Module/Moderation/Reports.php:92
msgid "No report exists at this node."
msgstr ""
#: src/Module/Moderation/Reports.php:96
#: src/Module/Moderation/Reports.php:95
msgid "Category"
msgstr ""
#: src/Module/Moderation/Reports.php:102
#: src/Module/Moderation/Reports.php:101
#, php-format
msgid "%s total report"
msgid_plural "%s total reports"
msgstr[0] ""
msgstr[1] ""
#: src/Module/Moderation/Reports.php:105
#: src/Module/Moderation/Reports.php:104
msgid "URL of the reported contact."
msgstr ""

View file

@ -91,6 +91,16 @@
</div>
<div id="contact-info-end"></div>
{{/if}}
{{if $channel_settings_label}}
<h4>{{$channel_settings_label}}</h4>
<label>{{$frequency_label}}</label>
{{include file="field_radio.tpl" field=$frequency_default}}
{{include file="field_radio.tpl" field=$frequency_always}}
{{include file="field_radio.tpl" field=$frequency_reduced}}
{{include file="field_radio.tpl" field=$frequency_never}}
<p>{{$frequency_description}}</p>
{{/if}}
</div>
<input class="contact-edit-submit" type="submit" name="submit" value="{{$submit}}" />
{{/if}}

View file

@ -189,6 +189,33 @@
</div>
</div>
{{/if}}
{{if $channel_settings_label}}
<div class="panel">
<div class="section-subtitle-wrapper panel-heading" role="tab" id="contact-edit-channel">
<h4>
<button class="btn-link accordion-toggle collapsed" data-toggle="collapse" data-parent="#contact-edit-tools" href="#contact-edit-channel-collapse" aria-expanded="false" aria-controls="contact-edit-channel-collapse">
{{$channel_settings_label}}
</button>
</h4>
</div>
<div id="contact-edit-channel-collapse" class="panel-body panel-collapse collapse" role="tabpanel" aria-labelledby="contact-edit-channel">
<div class="section-content-tools-wrapper">
<label>{{$frequency_label}}</label>
{{include file="field_radio.tpl" field=$frequency_default}}
{{include file="field_radio.tpl" field=$frequency_always}}
{{include file="field_radio.tpl" field=$frequency_reduced}}
{{include file="field_radio.tpl" field=$frequency_never}}
<p>{{$frequency_description}}</p>
<div class="pull-right settings-submit-wrapper">
<button type="submit" name="submit" class="btn btn-primary" value="{{$submit}}">{{$submit}}</button>
</div>
<div class="clear"></div>
</div>
</div>
</div>
{{/if}}
</div>
</form>{{* End of the form *}}