From ed24d06e0c676662fe1c5a7656049daae8bf3358 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 5 Oct 2023 19:10:20 +0000 Subject: [PATCH] Now there are user defined channels --- database.sql | 2 +- src/Content/Conversation/Factory/Channel.php | 11 +--- .../Factory/UserDefinedChannel.php | 56 +++++++++++++++++++ src/Content/Widget.php | 8 ++- src/DI.php | 8 +++ src/Module/Conversation/Channel.php | 28 ++++++---- src/Module/Conversation/Network.php | 33 ++++++----- src/Module/Conversation/Timeline.php | 1 + src/Module/Settings/Display.php | 28 ++++++---- src/Module/Update/Channel.php | 2 +- src/Module/Update/Network.php | 2 +- static/dbstructure.config.php | 2 +- 12 files changed, 132 insertions(+), 49 deletions(-) create mode 100644 src/Content/Conversation/Factory/UserDefinedChannel.php diff --git a/database.sql b/database.sql index caf8d47b0a..ec7adc5c7a 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ -- Friendica 2023.09-rc (Giant Rhubarb) --- DB_UPDATE_VERSION 1535 +-- DB_UPDATE_VERSION 1536 -- ------------------------------------------ diff --git a/src/Content/Conversation/Factory/Channel.php b/src/Content/Conversation/Factory/Channel.php index 1a788d725c..b2ad4048f0 100644 --- a/src/Content/Conversation/Factory/Channel.php +++ b/src/Content/Conversation/Factory/Channel.php @@ -42,7 +42,7 @@ final class Channel extends Timeline * @param integer $uid * @return Timelines */ - public function getForUser(int $uid): Timelines + public function getTimelines(int $uid): Timelines { $language = User::getLanguageCode($uid); $languages = $this->l10n->getAvailableLanguages(true); @@ -58,18 +58,11 @@ final class Channel extends Timeline new ChannelEntity(ChannelEntity::VIDEO, $this->l10n->t('Videos'), $this->l10n->t('Posts with videos'), 'v'), ]; - foreach ($this->channel->selectByUid($uid) as $channel) { - $tabs[] = $channel; - } - return new Timelines($tabs); } - public function isTimeline(string $selectedTab, int $uid): bool + public function isTimeline(string $selectedTab): bool { - if (is_numeric($selectedTab) && $uid && $this->channel->existsById($selectedTab, $uid)) { - return true; - } return in_array($selectedTab, [ChannelEntity::WHATSHOT, ChannelEntity::FORYOU, ChannelEntity::FOLLOWERS, ChannelEntity::SHARERSOFSHARERS, ChannelEntity::IMAGE, ChannelEntity::VIDEO, ChannelEntity::AUDIO, ChannelEntity::LANGUAGE]); } } diff --git a/src/Content/Conversation/Factory/UserDefinedChannel.php b/src/Content/Conversation/Factory/UserDefinedChannel.php new file mode 100644 index 0000000000..fe469a7b6f --- /dev/null +++ b/src/Content/Conversation/Factory/UserDefinedChannel.php @@ -0,0 +1,56 @@ +. + * + */ + +namespace Friendica\Content\Conversation\Factory; + +use Friendica\Content\Conversation\Collection\Timelines; +use Friendica\Content\Conversation\Repository\Channel as ChannelRepository; +use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\L10n; +use Psr\Log\LoggerInterface; + +final class UserDefinedChannel extends Timeline +{ + public function __construct(ChannelRepository $channel, L10n $l10n, LoggerInterface $logger, IManageConfigValues $config) + { + parent::__construct($channel, $l10n, $logger, $config); + } + + /** + * List of available user defined channels + * + * @param integer $uid + * @return Timelines + */ + public function getForUser(int $uid): Timelines + { + foreach ($this->channel->selectByUid($uid) as $channel) { + $tabs[] = $channel; + } + + return new Timelines($tabs); + } + + public function isTimeline(string $selectedTab, int $uid): bool + { + return is_numeric($selectedTab) && $uid && $this->channel->existsById($selectedTab, $uid); + } +} diff --git a/src/Content/Widget.php b/src/Content/Widget.php index d69467ebcd..876fbc79e4 100644 --- a/src/Content/Widget.php +++ b/src/Content/Widget.php @@ -568,7 +568,13 @@ class Widget } } - foreach (DI::ChannelFactory()->getForUser($uid) as $channel) { + foreach (DI::ChannelFactory()->getTimelines($uid) as $channel) { + if (empty($enabled) || in_array($channel->code, $enabled)) { + $channels[] = ['ref' => $channel->code, 'name' => $channel->label]; + } + } + + foreach (DI::UserDefinedChannelFactory()->getForUser($uid) as $channel) { if (empty($enabled) || in_array($channel->code, $enabled)) { $channels[] = ['ref' => $channel->code, 'name' => $channel->label]; } diff --git a/src/DI.php b/src/DI.php index 22dec89dba..0cb194ef40 100644 --- a/src/DI.php +++ b/src/DI.php @@ -571,6 +571,14 @@ abstract class DI return self::$dice->create(Content\Conversation\Factory\Channel::class); } + /** + * @return Content\Conversation\Factory\UserDefinedChannel + */ + public static function UserDefinedChannelFactory() + { + return self::$dice->create(Content\Conversation\Factory\UserDefinedChannel::class); + } + /** * @return Content\Conversation\Factory\Network */ diff --git a/src/Module/Conversation/Channel.php b/src/Module/Conversation/Channel.php index 20b0187804..bb6a805d65 100644 --- a/src/Module/Conversation/Channel.php +++ b/src/Module/Conversation/Channel.php @@ -26,11 +26,13 @@ use Friendica\App\Mode; use Friendica\Content\BoundariesPager; use Friendica\Content\Conversation; use Friendica\Content\Conversation\Entity\Channel as ChannelEntity; +use Friendica\Content\Conversation\Factory\UserDefinedChannel as UserDefinedChannelFactory; use Friendica\Content\Conversation\Factory\Timeline as TimelineFactory; use Friendica\Content\Conversation\Repository\Channel as ChannelRepository; use Friendica\Content\Conversation\Factory\Channel as ChannelFactory; use Friendica\Content\Conversation\Factory\Community as CommunityFactory; use Friendica\Content\Conversation\Factory\Network as NetworkFactory; +use Friendica\Content\Conversation\Factory\UserDefinedChannel; use Friendica\Content\Feature; use Friendica\Content\Nav; use Friendica\Content\Text\HTML; @@ -62,22 +64,25 @@ class Channel extends Timeline protected $systemMessages; /** @var ChannelFactory */ protected $channel; + /** @var UserDefinedChannelFactory */ + protected $userDefinedChannel; /** @var CommunityFactory */ protected $community; /** @var NetworkFactory */ protected $networkFactory; - public function __construct(NetworkFactory $network, CommunityFactory $community, ChannelFactory $channelFactory, ChannelRepository $channel, TimelineFactory $timeline, Conversation $conversation, App\Page $page, SystemMessages $systemMessages, Mode $mode, IHandleUserSessions $session, Database $database, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, ICanCache $cache, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) + public function __construct(UserDefinedChannelFactory $userDefinedChannel, NetworkFactory $network, CommunityFactory $community, ChannelFactory $channelFactory, ChannelRepository $channel, TimelineFactory $timeline, Conversation $conversation, App\Page $page, SystemMessages $systemMessages, Mode $mode, IHandleUserSessions $session, Database $database, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, ICanCache $cache, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) { parent::__construct($channel, $mode, $session, $database, $pConfig, $config, $cache, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); - $this->timeline = $timeline; - $this->conversation = $conversation; - $this->page = $page; - $this->systemMessages = $systemMessages; - //$this->channel = $channelFactory; - $this->community = $community; - $this->networkFactory = $network; + $this->timeline = $timeline; + $this->conversation = $conversation; + $this->page = $page; + $this->systemMessages = $systemMessages; + $this->channel = $channelFactory; + $this->community = $community; + $this->networkFactory = $network; + $this->userDefinedChannel = $userDefinedChannel; } protected function content(array $request = []): string @@ -100,7 +105,8 @@ class Channel extends Timeline } if (empty($request['mode']) || ($request['mode'] != 'raw')) { - $tabs = $this->getTabArray($this->channel->getForUser($this->session->getLocalUserId()), 'channel'); + $tabs = $this->getTabArray($this->channel->getTimelines($this->session->getLocalUserId()), 'channel'); + $tabs = array_merge($tabs, $this->getTabArray($this->userDefinedChannel->getForUser($this->session->getLocalUserId()), 'channel')); $tabs = array_merge($tabs, $this->getTabArray($this->community->getTimelines(true), 'channel')); $tab_tpl = Renderer::getMarkupTemplate('common_tabs.tpl'); @@ -122,7 +128,7 @@ class Channel extends Timeline $o .= $this->conversation->statusEditor([], 0, true); } - if ($this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { + if ($this->channel->isTimeline($this->selectedTab) || $this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { $items = $this->getChannelItems(); $order = 'created'; } else { @@ -168,7 +174,7 @@ class Channel extends Timeline $this->selectedTab = ChannelEntity::FORYOU; } - if (!$this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId()) && !$this->community->isTimeline($this->selectedTab)) { + if (!$this->channel->isTimeline($this->selectedTab) && !$this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId()) && !$this->community->isTimeline($this->selectedTab)) { throw new HTTPException\BadRequestException($this->l10n->t('Channel not available.')); } diff --git a/src/Module/Conversation/Network.php b/src/Module/Conversation/Network.php index 656c4410c3..40f7d1239e 100644 --- a/src/Module/Conversation/Network.php +++ b/src/Module/Conversation/Network.php @@ -29,6 +29,7 @@ use Friendica\Content\Conversation\Entity\Network as NetworkEntity; use Friendica\Content\Conversation\Factory\Timeline as TimelineFactory; use Friendica\Content\Conversation\Repository\Channel; use Friendica\Content\Conversation\Factory\Channel as ChannelFactory; +use Friendica\Content\Conversation\Factory\UserDefinedChannel as UserDefinedChannelFactory; use Friendica\Content\Conversation\Factory\Community as CommunityFactory; use Friendica\Content\Conversation\Factory\Network as NetworkFactory; use Friendica\Content\Feature; @@ -101,23 +102,26 @@ class Network extends Timeline protected $timeline; /** @var ChannelFactory */ protected $channel; + /** @var UserDefinedChannelFactory */ + protected $userDefinedChannel; /** @var CommunityFactory */ protected $community; /** @var NetworkFactory */ protected $networkFactory; - public function __construct(NetworkFactory $network, CommunityFactory $community, ChannelFactory $channelFactory, Channel $channel, App $app, TimelineFactory $timeline, SystemMessages $systemMessages, Mode $mode, Conversation $conversation, App\Page $page, IHandleUserSessions $session, Database $database, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, ICanCache $cache, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) + public function __construct(UserDefinedChannelFactory $userDefinedChannel, NetworkFactory $network, CommunityFactory $community, ChannelFactory $channelFactory, Channel $channel, App $app, TimelineFactory $timeline, SystemMessages $systemMessages, Mode $mode, Conversation $conversation, App\Page $page, IHandleUserSessions $session, Database $database, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, ICanCache $cache, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) { parent::__construct($channel, $mode, $session, $database, $pConfig, $config, $cache, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); - $this->app = $app; - $this->timeline = $timeline; - $this->systemMessages = $systemMessages; - $this->conversation = $conversation; - $this->page = $page; - $this->channel = $channelFactory; - $this->community = $community; - $this->networkFactory = $network; + $this->app = $app; + $this->timeline = $timeline; + $this->systemMessages = $systemMessages; + $this->conversation = $conversation; + $this->page = $page; + $this->channel = $channelFactory; + $this->community = $community; + $this->networkFactory = $network; + $this->userDefinedChannel = $userDefinedChannel; } protected function content(array $request = []): string @@ -135,7 +139,7 @@ class Network extends Timeline $o = ''; - if ($this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { + if ($this->channel->isTimeline($this->selectedTab) || $this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { $items = $this->getChannelItems(); } elseif ($this->community->isTimeline($this->selectedTab)) { $items = $this->getCommunityItems(); @@ -282,7 +286,8 @@ class Network extends Timeline $network_timelines = $this->pConfig->get($this->session->getLocalUserId(), 'system', 'network_timelines', []); if (!empty($network_timelines)) { - $tabs = array_merge($tabs, $this->getTabArray($this->channel->getForUser($this->session->getLocalUserId()), 'network', 'channel')); + $tabs = array_merge($tabs, $this->getTabArray($this->channel->getTimelines($this->session->getLocalUserId()), 'network', 'channel')); + $tabs = array_merge($tabs, $this->getTabArray($this->userDefinedChannel->getForUser($this->session->getLocalUserId()), 'network', 'channel')); $tabs = array_merge($tabs, $this->getTabArray($this->community->getTimelines(true), 'network', 'channel')); } @@ -316,11 +321,11 @@ class Network extends Timeline if (!$this->selectedTab) { $this->selectedTab = self::getTimelineOrderBySession($this->session, $this->pConfig); - } elseif (!$this->networkFactory->isTimeline($this->selectedTab) && !$this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId()) && !$this->community->isTimeline($this->selectedTab)) { + } elseif (!$this->networkFactory->isTimeline($this->selectedTab) && !$this->channel->isTimeline($this->selectedTab) && !$this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId()) && !$this->community->isTimeline($this->selectedTab)) { throw new HTTPException\BadRequestException($this->l10n->t('Network feed not available.')); } - if (($this->network || $this->circleId || $this->groupContactId) && ($this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId()) || $this->community->isTimeline($this->selectedTab))) { + if (($this->network || $this->circleId || $this->groupContactId) && ($this->channel->isTimeline($this->selectedTab) || $this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId()) || $this->community->isTimeline($this->selectedTab))) { $this->selectedTab = NetworkEntity::RECEIVED; } @@ -345,7 +350,7 @@ class Network extends Timeline $this->mention = false; } elseif (in_array($this->selectedTab, [NetworkEntity::RECEIVED, NetworkEntity::STAR]) || $this->community->isTimeline($this->selectedTab)) { $this->order = 'received'; - } elseif (($this->selectedTab == NetworkEntity::CREATED) || $this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { + } elseif (($this->selectedTab == NetworkEntity::CREATED) || $this->channel->isTimeline($this->selectedTab) || $this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { $this->order = 'created'; } else { $this->order = 'commented'; diff --git a/src/Module/Conversation/Timeline.php b/src/Module/Conversation/Timeline.php index 3f7f3ef759..7d3a7b2971 100644 --- a/src/Module/Conversation/Timeline.php +++ b/src/Module/Conversation/Timeline.php @@ -26,6 +26,7 @@ use Friendica\App\Mode; use Friendica\BaseModule; use Friendica\Content\Conversation\Collection\Timelines; use Friendica\Content\Conversation\Entity\Channel as ChannelEntity; +use Friendica\Content\Conversation\Entity\UserDefinedChannel as UserDefinedChannelEntity; use Friendica\Content\Conversation\Repository\Channel; use Friendica\Core\Cache\Capability\ICanCache; use Friendica\Core\Cache\Enum\Duration; diff --git a/src/Module/Settings/Display.php b/src/Module/Settings/Display.php index 3c5311482f..68ac500212 100644 --- a/src/Module/Settings/Display.php +++ b/src/Module/Settings/Display.php @@ -28,6 +28,7 @@ use Friendica\Content\Conversation\Factory\Channel as ChannelFactory; use Friendica\Content\Conversation\Factory\Community as CommunityFactory; use Friendica\Content\Conversation\Factory\Network as NetworkFactory; use Friendica\Content\Conversation\Factory\Timeline as TimelineFactory; +use Friendica\Content\Conversation\Factory\UserDefinedChannel as UserDefinedChannelFactory; use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\Hook; use Friendica\Core\L10n; @@ -58,6 +59,8 @@ class Display extends BaseSettings private $systemMessages; /** @var ChannelFactory */ protected $channel; + /** @var UserDefinedChannelFactory */ + protected $userDefinedChannel; /** @var CommunityFactory */ protected $community; /** @var NetworkFactory */ @@ -65,18 +68,19 @@ class Display extends BaseSettings /** @var TimelineFactory */ protected $timeline; - public function __construct(NetworkFactory $network, CommunityFactory $community, ChannelFactory $channel, TimelineFactory $timeline, SystemMessages $systemMessages, App $app, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, IHandleUserSessions $session, App\Page $page, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) + public function __construct(UserDefinedChannelFactory $userDefinedChannel, NetworkFactory $network, CommunityFactory $community, ChannelFactory $channel, TimelineFactory $timeline, SystemMessages $systemMessages, App $app, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, IHandleUserSessions $session, App\Page $page, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) { parent::__construct($session, $page, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); - $this->config = $config; - $this->pConfig = $pConfig; - $this->app = $app; - $this->systemMessages = $systemMessages; - $this->timeline = $timeline; - $this->channel = $channel; - $this->community = $community; - $this->network = $network; + $this->config = $config; + $this->pConfig = $pConfig; + $this->app = $app; + $this->systemMessages = $systemMessages; + $this->timeline = $timeline; + $this->channel = $channel; + $this->community = $community; + $this->network = $network; + $this->userDefinedChannel = $userDefinedChannel; } protected function post(array $request = []) @@ -349,7 +353,11 @@ class Display extends BaseSettings return new Timelines($timelines); } - foreach ($this->channel->getForUser($uid) as $channel) { + foreach ($this->channel->getTimelines($uid) as $channel) { + $timelines[] = $channel; + } + + foreach ($this->userDefinedChannel->getForUser($uid) as $channel) { $timelines[] = $channel; } diff --git a/src/Module/Update/Channel.php b/src/Module/Update/Channel.php index 2cff325850..8435a7cc1b 100644 --- a/src/Module/Update/Channel.php +++ b/src/Module/Update/Channel.php @@ -38,7 +38,7 @@ class Channel extends ChannelModule $o = ''; if ($this->update || $this->force) { - if ($this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { + if ($this->channel->isTimeline($this->selectedTab) || $this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { $items = $this->getChannelItems(); } else { $items = $this->getCommunityItems(); diff --git a/src/Module/Update/Network.php b/src/Module/Update/Network.php index 140900876d..983680ac0b 100644 --- a/src/Module/Update/Network.php +++ b/src/Module/Update/Network.php @@ -41,7 +41,7 @@ class Network extends NetworkModule System::htmlUpdateExit($o); } - if ($this->channel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { + if ($this->channel->isTimeline($this->selectedTab) || $this->userDefinedChannel->isTimeline($this->selectedTab, $this->session->getLocalUserId())) { $items = $this->getChannelItems(); } elseif ($this->community->isTimeline($this->selectedTab)) { $items = $this->getCommunityItems(); diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 30aed566ee..3439b901d3 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -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', 1535); + define('DB_UPDATE_VERSION', 1536); } return [