]> git.mxchange.org Git - friendica.git/commitdiff
Channels can now be based on the "network" feed as well
authorMichael <heluecht@pirati.ca>
Tue, 21 Nov 2023 23:13:26 +0000 (23:13 +0000)
committerMichael <heluecht@pirati.ca>
Tue, 21 Nov 2023 23:13:26 +0000 (23:13 +0000)
doc/Channels.md
src/Content/Conversation/Repository/UserDefinedChannel.php
src/Content/Text/BBCode.php
src/Model/Post/Engagement.php
src/Module/Conversation/Timeline.php
src/Module/Settings/Channels.php
src/Protocol/Relay.php
view/lang/C/messages.po

index 091b53930dda6efdb36b2aa88f5691c755780932..de3f6718d84e086a0dce81c5232474f516b7b73e 100644 (file)
@@ -57,6 +57,13 @@ Additionally to the search for content, there are additional keywords that can b
 * from - Use "from:nickname" or "from:nickname@domain.tld" to search for posts from a specific author.
 * to - Use "from:nickname" or "from:nickname@domain.tld" to search for posts with the given contact as receiver.
 * group - Use "from:nickname" or "from:nickname@domain.tld" to search for group post of the given group.
+* server - Use "server:hostname" to search for posts from a specific server. In the case of group postings, the search text contains both the hostname of the group server and the author's hostname.
+* source - The ActivityPub type of the post source. Use this for example to include or exclude group posts or posts from services (aka bots).
+    * source:person - The post is created by a regular user account.
+    * source:organization - The post is created by an organisation.
+    * source:group - The post is created by or distributed via a group.
+    * source:service - The posts originates from a service account. This source type is often used to mark bot accounts.
+    * source:application - The post is created by an application. This is most likely unused in the fediverse for post creation.
 * tag - Use "tag:tagname" to search for a specific tag.
 * network - Use this to include or exclude some networks from your channel.
     * network:apub - ActivityPub (Used by the systems in the Fediverse)
@@ -68,7 +75,7 @@ Additionally to the search for content, there are additional keywords that can b
     * network:dscs - Posts that are received by the Discourse connector.
     * network:tmbl - Posts that are received by the Tumblr connector.
     * network:bsky - Posts that are received by the Bluesky connector.
-* platform - Use this to include or exclude some platforms from your channel, e.g. "+platform:friendica".
+* platform - Use this to include or exclude some platforms from your channel, e.g. "+platform:friendica". In the case of group postings, the search text contains both the platform of the group server and the author's platform.
 * visibility - You have the choice between different visibilities. You can only see unlisted or private posts that you have the access for.
     * visibility:public
     * visibility:unlisted
index db7160ac8759b9ee4614f8baf89e3743f81a3a16..04cd155ed1f46e4bc504372d4ec23d93d0f62987 100644 (file)
@@ -27,6 +27,7 @@ use Friendica\Content\Conversation\Entity;
 use Friendica\Content\Conversation\Factory;
 use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
 use Friendica\Database\Database;
+use Friendica\Model\Post\Engagement;
 use Friendica\Model\User;
 use Psr\Log\LoggerInterface;
 
@@ -155,10 +156,10 @@ class UserDefinedChannel extends \Friendica\BaseRepository
 
                $store = false;
                $this->db->insert('check-full-text-search', ['pid' => getmypid(), 'searchtext' => $searchtext], Database::INSERT_UPDATE);
-               $channels = $this->db->select(self::$table_name, ['full-text-search', 'uid', 'label'], ["`full-text-search` != ?", '']);
+               $channels = $this->db->select(self::$table_name, ['full-text-search', 'uid', 'label'], ["`full-text-search` != ? AND `circle` = ?", '', 0]);
                while ($channel = $this->db->fetch($channels)) {
                        $channelsearchtext = $channel['full-text-search'];
-                       foreach (['from', 'to', 'group', 'tag', 'network', 'platform', 'visibility'] as $keyword) {
+                       foreach (Engagement::KEYWORDS as $keyword) {
                                $channelsearchtext = preg_replace('~(' . $keyword . ':.[\w@\.-]+)~', '"$1"', $channelsearchtext);
                        }
                        if ($this->db->exists('check-full-text-search', ["`pid` = ? AND MATCH (`searchtext`) AGAINST (? IN BOOLEAN MODE)", getmypid(), $channelsearchtext])) {
index fab4fba0234680184346be96e6dfcea2f49d192f..e9eeba61181e376c72bb95820a01c74a7175f5e8 100644 (file)
@@ -291,7 +291,7 @@ class BBCode
                // Remove all unneeded white space
                do {
                        $oldtext = $text;
-                       $text = str_replace(['  ', "\n", "\r", '"', '_'], ' ', $text);
+                       $text = str_replace(['  ', "\n", "\r", '"'], ' ', $text);
                } while ($oldtext != $text);
 
                return trim($text);
index 4aaaf0e45338bf1a2c8bd0b8d6ef952ad6df7a56..f88ce3bbc8c984457aeaf90b4dc574fd5238e5aa 100644 (file)
@@ -39,6 +39,8 @@ use Friendica\Util\DateTimeFormat;
 
 class Engagement
 {
+       const KEYWORDS = ['source', 'server', 'from', 'to', 'group', 'tag', 'network', 'platform', 'visibility'];
+
        /**
         * Store engagement data from an item array
         *
@@ -53,7 +55,7 @@ class Engagement
                }
 
                $parent = Post::selectFirst(['uri-id', 'created', 'author-id', 'owner-id', 'uid', 'private', 'contact-contact-type', 'language', 'network',
-                       'title', 'content-warning', 'body', 'author-contact-type', 'author-nick', 'author-addr', 'author-gsid', 'owner-contact-type', 'owner-nick', 'owner-addr'],
+                       'title', 'content-warning', 'body', 'author-contact-type', 'author-nick', 'author-addr', 'author-gsid', 'owner-contact-type', 'owner-nick', 'owner-addr', 'owner-gsid'],
                        ['uri-id' => $item['parent-uri-id']]);
 
                if ($parent['created'] < self::getCreationDateLimit(false)) {
@@ -134,6 +136,7 @@ class Engagement
                        'owner-contact-type'  => $author['contact-type'],
                        'owner-nick'          => $author['nick'],
                        'owner-addr'          => $author['addr'],
+                       'author-gsid'         => $author['gsid'],
                ];
 
                foreach ($receivers as $receiver) {
@@ -157,11 +160,21 @@ class Engagement
                $body = '[nosmile]network:' . $item['network'];
 
                if (!empty($item['author-gsid'])) {
-                       $gserver = DBA::selectFirst('gserver', ['platform'], ['id' => $item['author-gsid']]);
+                       $gserver = DBA::selectFirst('gserver', ['platform', 'nurl'], ['id' => $item['author-gsid']]);
                        $platform = preg_replace( '/[\W]/', '', $gserver['platform'] ?? '');
                        if (!empty($platform)) {
                                $body .= ' platform:' . $platform;
                        }
+                       $body .= ' server:' . parse_url($gserver['nurl'], PHP_URL_HOST);
+               }
+
+               if (($item['owner-contact-type'] == Contact::TYPE_COMMUNITY) && !empty($item['owner-gsid']) && ($item['owner-gsid'] != ($item['author-gsid'] ?? 0))) {
+                       $gserver = DBA::selectFirst('gserver', ['platform', 'nurl'], ['id' => $item['owner-gsid']]);
+                       $platform = preg_replace( '/[\W]/', '', $gserver['platform'] ?? '');
+                       if (!empty($platform) && !strpos($body, 'platform:' . $platform)) {
+                               $body .= ' platform:' . $platform;
+                       }
+                       $body .= ' server:' . parse_url($gserver['nurl'], PHP_URL_HOST);
                }
 
                switch ($item['private']) {
@@ -176,6 +189,18 @@ class Engagement
                                break;
                }
 
+               if (in_array(Contact::TYPE_COMMUNITY, [$item['author-contact-type'], $item['owner-contact-type']])) {
+                       $body .= ' source:group';
+               } elseif ($item['author-contact-type'] == Contact::TYPE_PERSON) {
+                       $body .= ' source:person';
+               } elseif ($item['author-contact-type'] == Contact::TYPE_NEWS) {
+                       $body .= ' source:service';
+               } elseif ($item['author-contact-type'] == Contact::TYPE_ORGANISATION) {
+                       $body .= ' source:organization';
+               } elseif ($item['author-contact-type'] == Contact::TYPE_RELAY) {
+                       $body .= ' source:application';
+               }
+
                if ($item['author-contact-type'] == Contact::TYPE_COMMUNITY) {
                        $body .= ' group:' . $item['author-nick'] . ' group:' . $item['author-addr'];
                } elseif (in_array($item['author-contact-type'], [Contact::TYPE_PERSON, Contact::TYPE_NEWS, Contact::TYPE_ORGANISATION])) {
index 3e71caac7b94a74807046654d747ede4fe3e54f4..b2234aae6f4984e4df1fdc9871778076ae422066 100644 (file)
@@ -40,6 +40,7 @@ use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\Model\Item;
 use Friendica\Model\Post;
+use Friendica\Model\Post\Engagement;
 use Friendica\Module\Response;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Profiler;
@@ -384,6 +385,8 @@ class Timeline extends BaseModule
                                $condition = ["`owner-id` IN (SELECT `pid` FROM `account-user-view` WHERE `uid` = ? AND `rel` IN (?, ?))", $uid, Contact::SHARING, Contact::FRIEND];
                        } elseif ($channel->circle == -2) {
                                $condition = ["`owner-id` IN (SELECT `pid` FROM `account-user-view` WHERE `uid` = ? AND `rel` = ?)", $uid, Contact::FOLLOWER];
+                       } elseif ($channel->circle == -3) {
+                               $condition = ["EXISTS(SELECT `uri-id` FROM `post-thread-user` WHERE `uid` = ? AND `post-thread-user`.`uri-id` = `post-engagement`.`uri-id`)", $uid];
                        } elseif ($channel->circle > 0) {
                                $condition = DBA::mergeConditions($condition, ["`owner-id` IN (SELECT `pid` FROM `group_member` INNER JOIN `account-user-view` ON `group_member`.`contact-id` = `account-user-view`.`id` WHERE `gid` = ? AND `account-user-view`.`uid` = ?)", $channel->circle, $uid]);
                        }
@@ -391,7 +394,7 @@ class Timeline extends BaseModule
 
                if (!empty($channel->fullTextSearch)) {
                        $search = $channel->fullTextSearch;
-                       foreach (['from', 'to', 'group', 'tag', 'network', 'platform', 'visibility'] as $keyword) {
+                       foreach (Engagement::KEYWORDS as $keyword) {
                                $search = preg_replace('~(' . $keyword . ':.[\w@\.-]+)~', '"$1"', $search);
                        }
                        $condition = DBA::mergeConditions($condition, ["MATCH (`searchtext`) AGAINST (? IN BOOLEAN MODE)", $search]);
index 112f06492265d07fc41033365ff3b2275af52ebd..5c638c85083bfc0700e0781bb864fa11b90158ff 100644 (file)
@@ -79,7 +79,7 @@ class Channels extends BaseSettings
                        return;
                }
 
-               foreach (array_keys($request['label']) as $id) {
+               foreach (array_keys((array)$request['label']) as $id) {
                        if ($request['delete'][$id]) {
                                $success = $this->channel->deleteById($id, $uid);
                                $this->logger->debug('Channel deleted', ['id' => $id, 'success' => $success]);
@@ -116,6 +116,7 @@ class Channels extends BaseSettings
 
                $circles = [
                        0  => $this->l10n->t('Global Community'),
+                       -3 => $this->l10n->t('Network'),
                        -1 => $this->l10n->t('Following'),
                        -2 => $this->l10n->t('Followers'),
                ];
index 8761cd7f3dbfd83bc11e7c88283512a6f177edd6..e7e878a02d7e60634641fedf6ef66d89ec6c5617 100644 (file)
@@ -66,6 +66,11 @@ class Relay
        {
                $config = DI::config();
 
+               if (Contact::hasFollowers($authorid)) {
+                       Logger::info('Author has got followers on this server - accepted', ['network' => $network, 'url' => $url, 'author' => $authorid, 'tags' => $tags]);
+                       return true;
+               }
+
                $scope = $config->get('system', 'relay_scope');
 
                if ($scope == self::SCOPE_NONE) {
index d770c18a0c4951ec4b1c812534466fdaff37026b..4c6d80bbe26f52237474bf83ca51eb0e67b14107 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 2023.09-rc\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-16 15:35+0000\n"
+"POT-Creation-Date: 2023-11-21 23:10+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"
@@ -282,7 +282,7 @@ msgstr ""
 msgid "Your message:"
 msgstr ""
 
-#: mod/message.php:199 mod/message.php:354 src/Content/Conversation.php:368
+#: mod/message.php:199 mod/message.php:354 src/Content/Conversation.php:370
 #: src/Module/Post/Edit.php:131
 msgid "Upload photo"
 msgstr ""
@@ -293,7 +293,7 @@ msgid "Insert web link"
 msgstr ""
 
 #: mod/message.php:201 mod/message.php:357 mod/photos.php:1301
-#: src/Content/Conversation.php:399 src/Content/Conversation.php:1582
+#: src/Content/Conversation.php:401 src/Content/Conversation.php:1584
 #: src/Module/Item/Compose.php:206 src/Module/Post/Edit.php:145
 #: src/Module/Profile/UnkMail.php:154 src/Object/Post.php:609
 msgid "Please wait"
@@ -386,7 +386,7 @@ msgstr ""
 
 #: mod/notes.php:57 src/Content/Text/HTML.php:859
 #: src/Module/Admin/Storage.php:142 src/Module/Filer/SaveTag.php:74
-#: src/Module/Post/Edit.php:129 src/Module/Settings/Channels.php:161
+#: src/Module/Post/Edit.php:129 src/Module/Settings/Channels.php:162
 msgid "Save"
 msgstr ""
 
@@ -482,7 +482,7 @@ msgstr ""
 msgid "Do not show a status post for this upload"
 msgstr ""
 
-#: mod/photos.php:736 mod/photos.php:1097 src/Content/Conversation.php:401
+#: mod/photos.php:736 mod/photos.php:1097 src/Content/Conversation.php:403
 #: src/Module/Calendar/Event/Form.php:253 src/Module/Post/Edit.php:183
 msgid "Permissions"
 msgstr ""
@@ -495,7 +495,7 @@ msgstr ""
 msgid "Delete Album"
 msgstr ""
 
-#: mod/photos.php:803 mod/photos.php:903 src/Content/Conversation.php:417
+#: mod/photos.php:803 mod/photos.php:903 src/Content/Conversation.php:419
 #: src/Module/Contact/Follow.php:173 src/Module/Contact/Revoke.php:109
 #: src/Module/Contact/Unfollow.php:126
 #: src/Module/Media/Attachment/Browser.php:77
@@ -614,23 +614,23 @@ msgid "Comment"
 msgstr ""
 
 #: mod/photos.php:1143 mod/photos.php:1199 mod/photos.php:1279
-#: src/Content/Conversation.php:414 src/Module/Calendar/Event/Form.php:248
+#: src/Content/Conversation.php:416 src/Module/Calendar/Event/Form.php:248
 #: src/Module/Item/Compose.php:201 src/Module/Post/Edit.php:165
 #: src/Object/Post.php:1162
 msgid "Preview"
 msgstr ""
 
-#: mod/photos.php:1144 src/Content/Conversation.php:367
+#: mod/photos.php:1144 src/Content/Conversation.php:369
 #: src/Module/Post/Edit.php:130 src/Object/Post.php:1150
 msgid "Loading..."
 msgstr ""
 
-#: mod/photos.php:1236 src/Content/Conversation.php:1497
+#: mod/photos.php:1236 src/Content/Conversation.php:1499
 #: src/Object/Post.php:261
 msgid "Select"
 msgstr ""
 
-#: mod/photos.php:1237 src/Content/Conversation.php:1498
+#: mod/photos.php:1237 src/Content/Conversation.php:1500
 #: src/Module/Moderation/Users/Active.php:136
 #: src/Module/Moderation/Users/Blocked.php:136
 #: src/Module/Moderation/Users/Index.php:151
@@ -667,108 +667,108 @@ msgstr ""
 msgid "Apologies but the website is unavailable at the moment."
 msgstr ""
 
-#: src/App/Page.php:248
+#: src/App/Page.php:249
 msgid "Delete this item?"
 msgstr ""
 
-#: src/App/Page.php:249
+#: src/App/Page.php:250
 msgid ""
 "Block this author? They won't be able to follow you nor see your public "
 "posts, and you won't be able to see their posts and their notifications."
 msgstr ""
 
-#: src/App/Page.php:250
+#: src/App/Page.php:251
 msgid ""
 "Ignore this author? You won't be able to see their posts and their "
 "notifications."
 msgstr ""
 
-#: src/App/Page.php:251
+#: src/App/Page.php:252
 msgid "Collapse this author's posts?"
 msgstr ""
 
-#: src/App/Page.php:252
+#: src/App/Page.php:253
 msgid "Ignore this author's server?"
 msgstr ""
 
-#: src/App/Page.php:253 src/Module/Settings/Server/Action.php:61
+#: src/App/Page.php:254 src/Module/Settings/Server/Action.php:61
 #: src/Module/Settings/Server/Index.php:108
 msgid ""
 "You won't see any content from this server including reshares in your "
 "Network page, the community pages and individual conversations."
 msgstr ""
 
-#: src/App/Page.php:255
+#: src/App/Page.php:256
 msgid "Like not successful"
 msgstr ""
 
-#: src/App/Page.php:256
+#: src/App/Page.php:257
 msgid "Dislike not successful"
 msgstr ""
 
-#: src/App/Page.php:257
+#: src/App/Page.php:258
 msgid "Sharing not successful"
 msgstr ""
 
-#: src/App/Page.php:258
+#: src/App/Page.php:259
 msgid "Attendance unsuccessful"
 msgstr ""
 
-#: src/App/Page.php:259
+#: src/App/Page.php:260
 msgid "Backend error"
 msgstr ""
 
-#: src/App/Page.php:260
+#: src/App/Page.php:261
 msgid "Network error"
 msgstr ""
 
-#: src/App/Page.php:263
+#: src/App/Page.php:264
 msgid "Drop files here to upload"
 msgstr ""
 
-#: src/App/Page.php:264
+#: src/App/Page.php:265
 msgid "Your browser does not support drag and drop file uploads."
 msgstr ""
 
-#: src/App/Page.php:265
+#: src/App/Page.php:266
 msgid ""
 "Please use the fallback form below to upload your files like in the olden "
 "days."
 msgstr ""
 
-#: src/App/Page.php:266
+#: src/App/Page.php:267
 msgid "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB."
 msgstr ""
 
-#: src/App/Page.php:267
+#: src/App/Page.php:268
 msgid "You can't upload files of this type."
 msgstr ""
 
-#: src/App/Page.php:268
+#: src/App/Page.php:269
 msgid "Server responded with {{statusCode}} code."
 msgstr ""
 
-#: src/App/Page.php:269
+#: src/App/Page.php:270
 msgid "Cancel upload"
 msgstr ""
 
-#: src/App/Page.php:270
+#: src/App/Page.php:271
 msgid "Upload canceled."
 msgstr ""
 
-#: src/App/Page.php:271
+#: src/App/Page.php:272
 msgid "Are you sure you want to cancel this upload?"
 msgstr ""
 
-#: src/App/Page.php:272
+#: src/App/Page.php:273
 msgid "Remove file"
 msgstr ""
 
-#: src/App/Page.php:273
+#: src/App/Page.php:274
 msgid "You can't upload any more files."
 msgstr ""
 
-#: src/App/Page.php:351
+#: src/App/Page.php:352
 msgid "toggle mobile"
 msgstr ""
 
@@ -798,12 +798,12 @@ msgstr ""
 #: src/BaseModule.php:439 src/Content/Conversation/Factory/Channel.php:45
 #: src/Content/Widget.php:239 src/Core/ACL.php:195 src/Module/Contact.php:414
 #: src/Module/PermissionTooltip.php:141 src/Module/PermissionTooltip.php:163
-#: src/Module/Settings/Channels.php:120
+#: src/Module/Settings/Channels.php:121
 msgid "Followers"
 msgstr ""
 
 #: src/BaseModule.php:444 src/Content/Widget.php:240 src/Module/Contact.php:417
-#: src/Module/Settings/Channels.php:119
+#: src/Module/Settings/Channels.php:120
 msgid "Following"
 msgstr ""
 
@@ -1196,14 +1196,14 @@ msgid_plural "%2$s reshared this."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Conversation.php:274
+#: src/Content/Conversation.php:276
 #, php-format
 msgid "<button type=\"button\" %2$s>%1$d person</button> likes this"
 msgid_plural "<button type=\"button\" %2$s>%1$d people</button> like this"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Conversation.php:277
+#: src/Content/Conversation.php:279
 #, php-format
 msgid "<button type=\"button\" %2$s>%1$d person</button> doesn't like this"
 msgid_plural ""
@@ -1211,309 +1211,309 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Conversation.php:280
+#: src/Content/Conversation.php:282
 #, php-format
 msgid "<button type=\"button\" %2$s>%1$d person</button> attends"
 msgid_plural "<button type=\"button\" %2$s>%1$d people</button> attend"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Conversation.php:283
+#: src/Content/Conversation.php:285
 #, php-format
 msgid "<button type=\"button\" %2$s>%1$d person</button> doesn't attend"
 msgid_plural "<button type=\"button\" %2$s>%1$d people</button> don't attend"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Conversation.php:286
+#: src/Content/Conversation.php:288
 #, php-format
 msgid "<button type=\"button\" %2$s>%1$d person</button> attends maybe"
 msgid_plural "<button type=\"button\" %2$s>%1$d people</button> attend maybe"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Conversation.php:289
+#: src/Content/Conversation.php:291
 #, php-format
 msgid "<button type=\"button\" %2$s>%1$d person</button> reshared this"
 msgid_plural "<button type=\"button\" %2$s>%1$d people</button> reshared this"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Conversation.php:336
+#: src/Content/Conversation.php:338
 msgid "Visible to <strong>everybody</strong>"
 msgstr ""
 
-#: src/Content/Conversation.php:337 src/Module/Item/Compose.php:200
+#: src/Content/Conversation.php:339 src/Module/Item/Compose.php:200
 #: src/Object/Post.php:1161
 msgid "Please enter a image/video/audio/webpage URL:"
 msgstr ""
 
-#: src/Content/Conversation.php:338
+#: src/Content/Conversation.php:340
 msgid "Tag term:"
 msgstr ""
 
-#: src/Content/Conversation.php:339 src/Module/Filer/SaveTag.php:73
+#: src/Content/Conversation.php:341 src/Module/Filer/SaveTag.php:73
 msgid "Save to Folder:"
 msgstr ""
 
-#: src/Content/Conversation.php:340
+#: src/Content/Conversation.php:342
 msgid "Where are you right now?"
 msgstr ""
 
-#: src/Content/Conversation.php:341
+#: src/Content/Conversation.php:343
 msgid "Delete item(s)?"
 msgstr ""
 
-#: src/Content/Conversation.php:353 src/Module/Item/Compose.php:175
+#: src/Content/Conversation.php:355 src/Module/Item/Compose.php:175
 msgid "Created at"
 msgstr ""
 
-#: src/Content/Conversation.php:363
+#: src/Content/Conversation.php:365
 msgid "New Post"
 msgstr ""
 
-#: src/Content/Conversation.php:366
+#: src/Content/Conversation.php:368
 msgid "Share"
 msgstr ""
 
-#: src/Content/Conversation.php:369 src/Module/Post/Edit.php:132
+#: src/Content/Conversation.php:371 src/Module/Post/Edit.php:132
 msgid "upload photo"
 msgstr ""
 
-#: src/Content/Conversation.php:370 src/Module/Post/Edit.php:133
+#: src/Content/Conversation.php:372 src/Module/Post/Edit.php:133
 msgid "Attach file"
 msgstr ""
 
-#: src/Content/Conversation.php:371 src/Module/Post/Edit.php:134
+#: src/Content/Conversation.php:373 src/Module/Post/Edit.php:134
 msgid "attach file"
 msgstr ""
 
-#: src/Content/Conversation.php:372 src/Module/Item/Compose.php:190
+#: src/Content/Conversation.php:374 src/Module/Item/Compose.php:190
 #: src/Module/Post/Edit.php:171 src/Object/Post.php:1151
 msgid "Bold"
 msgstr ""
 
-#: src/Content/Conversation.php:373 src/Module/Item/Compose.php:191
+#: src/Content/Conversation.php:375 src/Module/Item/Compose.php:191
 #: src/Module/Post/Edit.php:172 src/Object/Post.php:1152
 msgid "Italic"
 msgstr ""
 
-#: src/Content/Conversation.php:374 src/Module/Item/Compose.php:192
+#: src/Content/Conversation.php:376 src/Module/Item/Compose.php:192
 #: src/Module/Post/Edit.php:173 src/Object/Post.php:1153
 msgid "Underline"
 msgstr ""
 
-#: src/Content/Conversation.php:375 src/Module/Item/Compose.php:193
+#: src/Content/Conversation.php:377 src/Module/Item/Compose.php:193
 #: src/Module/Post/Edit.php:174 src/Object/Post.php:1155
 msgid "Quote"
 msgstr ""
 
-#: src/Content/Conversation.php:376 src/Module/Item/Compose.php:194
+#: src/Content/Conversation.php:378 src/Module/Item/Compose.php:194
 #: src/Module/Post/Edit.php:175 src/Object/Post.php:1156
 msgid "Add emojis"
 msgstr ""
 
-#: src/Content/Conversation.php:377 src/Module/Item/Compose.php:195
+#: src/Content/Conversation.php:379 src/Module/Item/Compose.php:195
 #: src/Object/Post.php:1154
 msgid "Content Warning"
 msgstr ""
 
-#: src/Content/Conversation.php:378 src/Module/Item/Compose.php:196
+#: src/Content/Conversation.php:380 src/Module/Item/Compose.php:196
 #: src/Module/Post/Edit.php:176 src/Object/Post.php:1157
 msgid "Code"
 msgstr ""
 
-#: src/Content/Conversation.php:379 src/Module/Item/Compose.php:197
+#: src/Content/Conversation.php:381 src/Module/Item/Compose.php:197
 #: src/Object/Post.php:1158
 msgid "Image"
 msgstr ""
 
-#: src/Content/Conversation.php:380 src/Module/Item/Compose.php:198
+#: src/Content/Conversation.php:382 src/Module/Item/Compose.php:198
 #: src/Module/Post/Edit.php:177 src/Object/Post.php:1159
 msgid "Link"
 msgstr ""
 
-#: src/Content/Conversation.php:381 src/Module/Item/Compose.php:199
+#: src/Content/Conversation.php:383 src/Module/Item/Compose.php:199
 #: src/Module/Post/Edit.php:178 src/Object/Post.php:1160
 msgid "Link or Media"
 msgstr ""
 
-#: src/Content/Conversation.php:382
+#: src/Content/Conversation.php:384
 msgid "Video"
 msgstr ""
 
-#: src/Content/Conversation.php:383 src/Module/Item/Compose.php:202
+#: src/Content/Conversation.php:385 src/Module/Item/Compose.php:202
 #: src/Module/Post/Edit.php:141
 msgid "Set your location"
 msgstr ""
 
-#: src/Content/Conversation.php:384 src/Module/Post/Edit.php:142
+#: src/Content/Conversation.php:386 src/Module/Post/Edit.php:142
 msgid "set location"
 msgstr ""
 
-#: src/Content/Conversation.php:385 src/Module/Post/Edit.php:143
+#: src/Content/Conversation.php:387 src/Module/Post/Edit.php:143
 msgid "Clear browser location"
 msgstr ""
 
-#: src/Content/Conversation.php:386 src/Module/Post/Edit.php:144
+#: src/Content/Conversation.php:388 src/Module/Post/Edit.php:144
 msgid "clear location"
 msgstr ""
 
-#: src/Content/Conversation.php:388 src/Module/Item/Compose.php:207
+#: src/Content/Conversation.php:390 src/Module/Item/Compose.php:207
 #: src/Module/Post/Edit.php:157
 msgid "Set title"
 msgstr ""
 
-#: src/Content/Conversation.php:390 src/Module/Item/Compose.php:208
+#: src/Content/Conversation.php:392 src/Module/Item/Compose.php:208
 #: src/Module/Post/Edit.php:159
 msgid "Categories (comma-separated list)"
 msgstr ""
 
-#: src/Content/Conversation.php:395 src/Module/Item/Compose.php:224
+#: src/Content/Conversation.php:397 src/Module/Item/Compose.php:224
 msgid "Scheduled at"
 msgstr ""
 
-#: src/Content/Conversation.php:400 src/Module/Post/Edit.php:146
+#: src/Content/Conversation.php:402 src/Module/Post/Edit.php:146
 msgid "Permission settings"
 msgstr ""
 
-#: src/Content/Conversation.php:410 src/Module/Post/Edit.php:155
+#: src/Content/Conversation.php:412 src/Module/Post/Edit.php:155
 msgid "Public post"
 msgstr ""
 
-#: src/Content/Conversation.php:424 src/Content/Widget/VCard.php:131
+#: src/Content/Conversation.php:426 src/Content/Widget/VCard.php:131
 #: src/Model/Profile.php:484 src/Module/Admin/Logs/View.php:92
 #: src/Module/Post/Edit.php:181
 msgid "Message"
 msgstr ""
 
-#: src/Content/Conversation.php:425 src/Module/Post/Edit.php:182
+#: src/Content/Conversation.php:427 src/Module/Post/Edit.php:182
 #: src/Module/Settings/TwoFactor/Trusted.php:143
 msgid "Browser"
 msgstr ""
 
-#: src/Content/Conversation.php:427 src/Module/Post/Edit.php:185
+#: src/Content/Conversation.php:429 src/Module/Post/Edit.php:185
 msgid "Open Compose page"
 msgstr ""
 
-#: src/Content/Conversation.php:595
+#: src/Content/Conversation.php:597
 msgid "remove"
 msgstr ""
 
-#: src/Content/Conversation.php:599
+#: src/Content/Conversation.php:601
 msgid "Delete Selected Items"
 msgstr ""
 
-#: src/Content/Conversation.php:754 src/Content/Conversation.php:757
-#: src/Content/Conversation.php:760 src/Content/Conversation.php:763
-#: src/Content/Conversation.php:766
+#: src/Content/Conversation.php:756 src/Content/Conversation.php:759
+#: src/Content/Conversation.php:762 src/Content/Conversation.php:765
+#: src/Content/Conversation.php:768
 #, php-format
 msgid "You had been addressed (%s)."
 msgstr ""
 
-#: src/Content/Conversation.php:769
+#: src/Content/Conversation.php:771
 #, php-format
 msgid "You are following %s."
 msgstr ""
 
-#: src/Content/Conversation.php:774
+#: src/Content/Conversation.php:776
 #, php-format
 msgid "You subscribed to %s."
 msgstr ""
 
-#: src/Content/Conversation.php:776
+#: src/Content/Conversation.php:778
 msgid "You subscribed to one or more tags in this post."
 msgstr ""
 
-#: src/Content/Conversation.php:796
+#: src/Content/Conversation.php:798
 #, php-format
 msgid "%s reshared this."
 msgstr ""
 
-#: src/Content/Conversation.php:798
+#: src/Content/Conversation.php:800
 msgid "Reshared"
 msgstr ""
 
-#: src/Content/Conversation.php:798
+#: src/Content/Conversation.php:800
 #, php-format
 msgid "Reshared by %s <%s>"
 msgstr ""
 
-#: src/Content/Conversation.php:801
+#: src/Content/Conversation.php:803
 #, php-format
 msgid "%s is participating in this thread."
 msgstr ""
 
-#: src/Content/Conversation.php:804
+#: src/Content/Conversation.php:806
 msgid "Stored for general reasons"
 msgstr ""
 
-#: src/Content/Conversation.php:807
+#: src/Content/Conversation.php:809
 msgid "Global post"
 msgstr ""
 
-#: src/Content/Conversation.php:810
+#: src/Content/Conversation.php:812
 msgid "Sent via an relay server"
 msgstr ""
 
-#: src/Content/Conversation.php:810
+#: src/Content/Conversation.php:812
 #, php-format
 msgid "Sent via the relay server %s <%s>"
 msgstr ""
 
-#: src/Content/Conversation.php:813
+#: src/Content/Conversation.php:815
 msgid "Fetched"
 msgstr ""
 
-#: src/Content/Conversation.php:813
+#: src/Content/Conversation.php:815
 #, php-format
 msgid "Fetched because of %s <%s>"
 msgstr ""
 
-#: src/Content/Conversation.php:816
+#: src/Content/Conversation.php:818
 msgid "Stored because of a child post to complete this thread."
 msgstr ""
 
-#: src/Content/Conversation.php:819
+#: src/Content/Conversation.php:821
 msgid "Local delivery"
 msgstr ""
 
-#: src/Content/Conversation.php:822
+#: src/Content/Conversation.php:824
 msgid "Stored because of your activity (like, comment, star, ...)"
 msgstr ""
 
-#: src/Content/Conversation.php:825
+#: src/Content/Conversation.php:827
 msgid "Distributed"
 msgstr ""
 
-#: src/Content/Conversation.php:828
+#: src/Content/Conversation.php:830
 msgid "Pushed to us"
 msgstr ""
 
-#: src/Content/Conversation.php:1525 src/Object/Post.php:248
+#: src/Content/Conversation.php:1527 src/Object/Post.php:248
 msgid "Pinned item"
 msgstr ""
 
-#: src/Content/Conversation.php:1542 src/Object/Post.php:548
+#: src/Content/Conversation.php:1544 src/Object/Post.php:548
 #: src/Object/Post.php:549
 #, php-format
 msgid "View %s's profile @ %s"
 msgstr ""
 
-#: src/Content/Conversation.php:1555 src/Object/Post.php:536
+#: src/Content/Conversation.php:1557 src/Object/Post.php:536
 msgid "Categories:"
 msgstr ""
 
-#: src/Content/Conversation.php:1556 src/Object/Post.php:537
+#: src/Content/Conversation.php:1558 src/Object/Post.php:537
 msgid "Filed under:"
 msgstr ""
 
-#: src/Content/Conversation.php:1564 src/Object/Post.php:562
+#: src/Content/Conversation.php:1566 src/Object/Post.php:562
 #, php-format
 msgid "%s from %s"
 msgstr ""
 
-#: src/Content/Conversation.php:1580
+#: src/Content/Conversation.php:1582
 msgid "View in context"
 msgstr ""
 
@@ -1551,7 +1551,7 @@ msgid "Posts from accounts that are followed by accounts that you follow"
 msgstr ""
 
 #: src/Content/Conversation/Factory/Channel.php:47
-#: src/Module/Settings/Channels.php:137 src/Module/Settings/Channels.php:153
+#: src/Module/Settings/Channels.php:138 src/Module/Settings/Channels.php:154
 msgid "Images"
 msgstr ""
 
@@ -1560,7 +1560,7 @@ msgid "Posts with images"
 msgstr ""
 
 #: src/Content/Conversation/Factory/Channel.php:48
-#: src/Module/Settings/Channels.php:139 src/Module/Settings/Channels.php:155
+#: src/Module/Settings/Channels.php:140 src/Module/Settings/Channels.php:156
 msgid "Audio"
 msgstr ""
 
@@ -1569,7 +1569,7 @@ msgid "Posts with audio"
 msgstr ""
 
 #: src/Content/Conversation/Factory/Channel.php:49
-#: src/Module/Settings/Channels.php:138 src/Module/Settings/Channels.php:154
+#: src/Module/Settings/Channels.php:139 src/Module/Settings/Channels.php:155
 msgid "Videos"
 msgstr ""
 
@@ -2049,7 +2049,8 @@ msgstr ""
 msgid "Terms of Service of this Friendica instance"
 msgstr ""
 
-#: src/Content/Nav.php:306 view/theme/frio/theme.php:239
+#: src/Content/Nav.php:306 src/Module/Settings/Channels.php:119
+#: view/theme/frio/theme.php:239
 msgid "Network"
 msgstr ""
 
@@ -2178,8 +2179,8 @@ msgstr ""
 msgid "last"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:751 src/Content/Text/BBCode.php:1692
-#: src/Content/Text/BBCode.php:1693
+#: src/Content/Text/BBCode.php:751 src/Content/Text/BBCode.php:1696
+#: src/Content/Text/BBCode.php:1697
 msgid "Image/photo"
 msgstr ""
 
@@ -2194,23 +2195,23 @@ msgstr ""
 msgid "Link to source"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1599 src/Content/Text/HTML.php:904
+#: src/Content/Text/BBCode.php:1603 src/Content/Text/HTML.php:904
 msgid "Click to open/close"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1632
+#: src/Content/Text/BBCode.php:1636
 msgid "$1 wrote:"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1697 src/Content/Text/BBCode.php:1698
+#: src/Content/Text/BBCode.php:1701 src/Content/Text/BBCode.php:1702
 msgid "Encrypted content"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1953
+#: src/Content/Text/BBCode.php:1957
 msgid "Invalid source protocol"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1972
+#: src/Content/Text/BBCode.php:1976
 msgid "Invalid link protocol"
 msgstr ""
 
@@ -2371,7 +2372,7 @@ msgid "All"
 msgstr ""
 
 #: src/Content/Widget.php:591 src/Module/BaseSettings.php:125
-#: src/Module/Settings/Channels.php:157 src/Module/Settings/Display.php:312
+#: src/Module/Settings/Channels.php:158 src/Module/Settings/Display.php:312
 msgid "Channels"
 msgstr ""
 
@@ -5891,7 +5892,7 @@ msgstr ""
 #: src/Module/Moderation/Blocklist/Server/Index.php:116
 #: src/Module/Moderation/Item/Delete.php:67 src/Module/Register.php:148
 #: src/Module/Security/TwoFactor/Verify.php:101
-#: src/Module/Settings/Channels.php:130 src/Module/Settings/Channels.php:146
+#: src/Module/Settings/Channels.php:131 src/Module/Settings/Channels.php:147
 #: src/Module/Settings/TwoFactor/Index.php:161
 #: src/Module/Settings/TwoFactor/Verify.php:158
 msgid "Required"
@@ -6791,15 +6792,15 @@ msgstr ""
 msgid "Network feed not available."
 msgstr ""
 
-#: src/Module/Conversation/Timeline.php:162
+#: src/Module/Conversation/Timeline.php:163
 msgid "Own Contacts"
 msgstr ""
 
-#: src/Module/Conversation/Timeline.php:166
+#: src/Module/Conversation/Timeline.php:167
 msgid "Include"
 msgstr ""
 
-#: src/Module/Conversation/Timeline.php:167
+#: src/Module/Conversation/Timeline.php:168
 msgid "Hide"
 msgstr ""
 
@@ -7145,7 +7146,7 @@ msgstr ""
 #: src/Module/Friendica.php:102
 #: src/Module/Moderation/Blocklist/Server/Index.php:87
 #: src/Module/Moderation/Blocklist/Server/Index.php:111
-#: src/Module/Settings/Channels.php:164
+#: src/Module/Settings/Channels.php:165
 msgid "Reason for the block"
 msgstr ""
 
@@ -7893,7 +7894,7 @@ msgstr ""
 
 #: src/Module/Moderation/Blocklist/Server/Index.php:86
 #: src/Module/Moderation/Blocklist/Server/Index.php:110
-#: src/Module/Settings/Channels.php:163
+#: src/Module/Settings/Channels.php:164
 msgid "Blocked server domain pattern"
 msgstr ""
 
@@ -9931,76 +9932,76 @@ msgstr ""
 msgid "No Addon settings configured"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:130 src/Module/Settings/Channels.php:146
+#: src/Module/Settings/Channels.php:131 src/Module/Settings/Channels.php:147
 #: src/Module/Settings/Display.php:334
 msgid "Label"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:131 src/Module/Settings/Channels.php:147
+#: src/Module/Settings/Channels.php:132 src/Module/Settings/Channels.php:148
 #: src/Module/Settings/Display.php:335
 #: src/Module/Settings/TwoFactor/AppSpecific.php:137
 msgid "Description"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:132 src/Module/Settings/Channels.php:148
+#: src/Module/Settings/Channels.php:133 src/Module/Settings/Channels.php:149
 msgid "Access Key"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:133 src/Module/Settings/Channels.php:149
+#: src/Module/Settings/Channels.php:134 src/Module/Settings/Channels.php:150
 msgid "Circle/Channel"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:134 src/Module/Settings/Channels.php:150
+#: src/Module/Settings/Channels.php:135 src/Module/Settings/Channels.php:151
 msgid "Include Tags"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:135 src/Module/Settings/Channels.php:151
+#: src/Module/Settings/Channels.php:136 src/Module/Settings/Channels.php:152
 msgid "Exclude Tags"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:136 src/Module/Settings/Channels.php:152
+#: src/Module/Settings/Channels.php:137 src/Module/Settings/Channels.php:153
 msgid "Full Text Search"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:140
+#: src/Module/Settings/Channels.php:141
 msgid "Delete channel"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:140
+#: src/Module/Settings/Channels.php:141
 msgid "Check to delete this entry from the channel list"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:146
+#: src/Module/Settings/Channels.php:147
 msgid "Short name for the channel. It is displayed on the channels widget."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:147
+#: src/Module/Settings/Channels.php:148
 msgid "This should describe the content of the channel in a few word."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:148
+#: src/Module/Settings/Channels.php:149
 msgid ""
 "When you want to access this channel via an access key, you can define it "
 "here. Pay attention to not use an already used one."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:149
+#: src/Module/Settings/Channels.php:150
 msgid "Select a circle or channel, that your channel should be based on."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:150
+#: src/Module/Settings/Channels.php:151
 msgid ""
 "Comma separated list of tags. A post will be used when it contains any of "
 "the listed tags."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:151
+#: src/Module/Settings/Channels.php:152
 msgid ""
 "Comma separated list of tags. If a post contain any of these tags, then it "
 "will not be part of nthis channel."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:152
+#: src/Module/Settings/Channels.php:153
 #, php-format
 msgid ""
 "Search terms for the body, supports the \"boolean mode\" operators from "
@@ -10008,39 +10009,39 @@ msgid ""
 "keywords: %s"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:153
+#: src/Module/Settings/Channels.php:154
 msgid "Check to display images in the channel."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:154
+#: src/Module/Settings/Channels.php:155
 msgid "Check to display videos in the channel."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:155
+#: src/Module/Settings/Channels.php:156
 msgid "Check to display audio in the channel."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:158
+#: src/Module/Settings/Channels.php:159
 msgid "This page can be used to define your own channels."
 msgstr ""
 
-#: src/Module/Settings/Channels.php:159
+#: src/Module/Settings/Channels.php:160
 msgid "Add new entry to the channel list"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:160
+#: src/Module/Settings/Channels.php:161
 msgid "Add"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:162
+#: src/Module/Settings/Channels.php:163
 msgid "Current Entries in the channel list"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:165
+#: src/Module/Settings/Channels.php:166
 msgid "Delete entry from the channel list"
 msgstr ""
 
-#: src/Module/Settings/Channels.php:166
+#: src/Module/Settings/Channels.php:167
 msgid "Delete entry from the channel list?"
 msgstr ""