diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index c5e854b1d..de4b69038 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -979,6 +979,11 @@ class Conversation $condition['author-hidden'] = false; } + if ($this->config->get('system', 'emoji_activities')) { + $emojis = $this->getEmojis($uriids); + $condition = DBA::mergeConditions($condition, ["(`gravity` != ? OR `origin`)", ItemModel::GRAVITY_ACTIVITY]); + } + $condition = DBA::mergeConditions($condition, ["`uid` IN (0, ?) AND (NOT `vid` IN (?, ?, ?) OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW), Verb::getID(Activity::VIEW), Verb::getID(Activity::READ)]); @@ -1081,6 +1086,8 @@ class Conversation } foreach ($items as $key => $row) { + $items[$key]['emojis'] = $emojis[$key] ?? []; + $always_display = in_array($mode, [self::MODE_CONTACTS, self::MODE_CONTACT_POSTS]); $items[$key]['user-blocked-author'] = !$always_display && in_array($row['author-id'], $blocks); @@ -1102,6 +1109,53 @@ class Conversation return $items; } + /** + * Fetch emoji reaction from the conversation + * + * @param array $uriids + * @return array + */ + private function getEmojis(array $uriids): array + { + $activity_emoji = [ + Activity::LIKE => '👍', + Activity::DISLIKE => '👎', + Activity::ATTEND => '✔️', + Activity::ATTENDMAYBE => '❓', + Activity::ATTENDNO => '❌', + Activity::ANNOUNCE => '♻', + Activity::VIEW => '📺', + ]; + + $index_list = array_values($activity_emoji); + $verbs = array_merge(array_keys($activity_emoji), [Activity::EMOJIREACT]); + + $condition = DBA::mergeConditions(['parent-uri-id' => $uriids, 'gravity' => ItemModel::GRAVITY_ACTIVITY, 'verb' => $verbs], ["NOT `deleted`"]); + $separator = chr(255) . chr(255) . chr(255); + + $sql = "SELECT `thr-parent-id`, `body`, `verb`, COUNT(*) AS `total`, GROUP_CONCAT(REPLACE(`author-name`, '" . $separator . "', ' ') SEPARATOR '". $separator ."' LIMIT 50) AS `title` FROM `post-view` WHERE " . array_shift($condition) . " GROUP BY `thr-parent-id`, `verb`, `body`"; + + $emojis = []; + + $rows = DBA::p($sql, $condition); + while ($row = DBA::fetch($rows)) { + $row['verb'] = $row['body'] ? Activity::EMOJIREACT : $row['verb']; + $emoji = $row['body'] ?: $activity_emoji[$row['verb']]; + if (!isset($index_list[$emoji])) { + $index_list[] = $emoji; + } + $index = array_search($emoji, $index_list); + + $emojis[$row['thr-parent-id']][$index]['emoji'] = $emoji; + $emojis[$row['thr-parent-id']][$index]['verb'] = $row['verb']; + $emojis[$row['thr-parent-id']][$index]['total'] = $emojis[$row['thr-parent-id']][$emoji]['total'] ?? 0 + $row['total']; + $emojis[$row['thr-parent-id']][$index]['title'] = array_unique(array_merge($emojis[$row['thr-parent-id']][$emoji]['title'] ?? [], explode($separator, $row['title']))); + } + DBA::close($rows); + + return $emojis; + } + /** * Plucks the children of the given parent from a given item list. * diff --git a/src/Core/System.php b/src/Core/System.php index 42f5ab36a..bbcb3ab09 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -166,7 +166,7 @@ class System $load = System::currentLoad(); if ($load) { if (intval($load) > $maxsysload) { - $this->logger->warning('system load for process too high.', ['load' => $load, 'process' => 'backend', 'maxsysload' => $maxsysload]); + $this->logger->notice('system load for process too high.', ['load' => $load, 'process' => 'backend', 'maxsysload' => $maxsysload]); return true; } } diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 90bce0a88..9d1fde85c 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -141,7 +141,7 @@ class Worker if (DI::lock()->acquire(self::LOCK_WORKER, 0)) { // Count active workers and compare them with a maximum value that depends on the load if (self::tooMuchWorkers()) { - Logger::notice('Active worker limit reached, quitting.'); + Logger::info('Active worker limit reached, quitting.'); DI::lock()->release(self::LOCK_WORKER); return; } @@ -188,7 +188,7 @@ class Worker { // Count active workers and compare them with a maximum value that depends on the load if (self::tooMuchWorkers()) { - Logger::notice('Active worker limit reached, quitting.'); + Logger::info('Active worker limit reached, quitting.'); return false; } @@ -511,7 +511,7 @@ class Worker while ($load = System::getLoadAvg($processes_cooldown != 0)) { if (($load_cooldown > 0) && ($load['average1'] > $load_cooldown)) { if (!$sleeping) { - Logger::notice('Load induced pre execution cooldown.', ['max' => $load_cooldown, 'load' => $load, 'called-by' => System::callstack(1)]); + Logger::info('Load induced pre execution cooldown.', ['max' => $load_cooldown, 'load' => $load, 'called-by' => System::callstack(1)]); $sleeping = true; } sleep(1); @@ -519,7 +519,7 @@ class Worker } if (($processes_cooldown > 0) && ($load['scheduled'] > $processes_cooldown)) { if (!$sleeping) { - Logger::notice('Process induced pre execution cooldown.', ['max' => $processes_cooldown, 'load' => $load, 'called-by' => System::callstack(1)]); + Logger::info('Process induced pre execution cooldown.', ['max' => $processes_cooldown, 'load' => $load, 'called-by' => System::callstack(1)]); $sleeping = true; } sleep(1); @@ -529,7 +529,7 @@ class Worker } if ($sleeping) { - Logger::notice('Cooldown ended.', ['max-load' => $load_cooldown, 'max-processes' => $processes_cooldown, 'load' => $load, 'called-by' => System::callstack(1)]); + Logger::info('Cooldown ended.', ['max-load' => $load_cooldown, 'max-processes' => $processes_cooldown, 'load' => $load, 'called-by' => System::callstack(1)]); } } @@ -814,7 +814,7 @@ class Worker } } - Logger::notice('Load: ' . $load . '/' . $maxsysload . ' - processes: ' . $deferred . '/' . $active . '/' . $waiting_processes . $processlist . ' - maximum: ' . $queues . '/' . $maxqueues); + Logger::info('Load: ' . $load . '/' . $maxsysload . ' - processes: ' . $deferred . '/' . $active . '/' . $waiting_processes . $processlist . ' - maximum: ' . $queues . '/' . $maxqueues); // Are there fewer workers running as possible? Then fork a new one. if (!DI::config()->get('system', 'worker_dont_fork', false) && ($queues > ($active + 1)) && self::entriesExists() && !self::systemLimitReached()) { diff --git a/src/DI.php b/src/DI.php index 24f06d279..78eb5bee4 100644 --- a/src/DI.php +++ b/src/DI.php @@ -382,14 +382,6 @@ abstract class DI return self::$dice->create(Factory\Api\Mastodon\Error::class); } - /** - * @return Factory\Api\Mastodon\FollowRequest - */ - public static function mstdnFollowRequest() - { - return self::$dice->create(Factory\Api\Mastodon\FollowRequest::class); - } - /** * @return Factory\Api\Mastodon\Poll */ diff --git a/src/Factory/Api/Mastodon/FollowRequest.php b/src/Factory/Api/Mastodon/FollowRequest.php deleted file mode 100644 index 2b12b1dbd..000000000 --- a/src/Factory/Api/Mastodon/FollowRequest.php +++ /dev/null @@ -1,61 +0,0 @@ -. - * - */ - -namespace Friendica\Factory\Api\Mastodon; - -use Friendica\App\BaseURL; -use Friendica\BaseFactory; -use Friendica\Contact\Introduction\Entity\Introduction; -use Friendica\Database\DBA; -use Friendica\Model\APContact; -use Friendica\Model\Contact; -use Friendica\Network\HTTPException; -use ImagickException; -use Psr\Log\LoggerInterface; - -class FollowRequest extends BaseFactory -{ - /** @var BaseURL */ - private $baseUrl; - - public function __construct(LoggerInterface $logger, BaseURL $baseURL) - { - parent::__construct($logger); - - $this->baseUrl = $baseURL; - } - - /** - * @param Introduction $introduction - * @return \Friendica\Object\Api\Mastodon\FollowRequest - * @throws ImagickException|HTTPException\InternalServerErrorException - */ - public function createFromIntroduction(Introduction $introduction): \Friendica\Object\Api\Mastodon\FollowRequest - { - $account = DBA::selectFirst('account-user-view', [], ['id' => $introduction->cid, 'uid' => [0, $introduction->uid]]); - if (empty($account)) { - $this->logger->warning('Wrong introduction data', ['Introduction' => $introduction]); - throw new HTTPException\InternalServerErrorException('Wrong introduction data'); - } - - return new \Friendica\Object\Api\Mastodon\FollowRequest($this->baseUrl, $introduction->id, $account); - } -} diff --git a/src/Model/APContact.php b/src/Model/APContact.php index 71446e969..215d7e317 100644 --- a/src/Model/APContact.php +++ b/src/Model/APContact.php @@ -169,7 +169,7 @@ class APContact $cachekey = 'apcontact:' . ItemURI::getIdByURI($url); $result = DI::cache()->get($cachekey); if (!is_null($result)) { - Logger::notice('Multiple requests for the address', ['url' => $url, 'update' => $update, 'callstack' => System::callstack(20), 'result' => $result]); + Logger::info('Multiple requests for the address', ['url' => $url, 'update' => $update, 'callstack' => System::callstack(20), 'result' => $result]); if (!empty($fetched_contact)) { return $fetched_contact; } diff --git a/src/Module/Api/Mastodon/FollowRequests.php b/src/Module/Api/Mastodon/FollowRequests.php index 723a98bcd..dfe3aadf3 100644 --- a/src/Module/Api/Mastodon/FollowRequests.php +++ b/src/Module/Api/Mastodon/FollowRequests.php @@ -105,8 +105,10 @@ class FollowRequests extends BaseApi foreach ($introductions as $key => $introduction) { try { self::setBoundaries($introduction->id); - $return[] = DI::mstdnFollowRequest()->createFromIntroduction($introduction); - } catch (HTTPException\InternalServerErrorException $exception) { + $return[] = DI::mstdnAccount()->createFromContactId($introduction->cid, $introduction->uid); + } catch (HTTPException\InternalServerErrorException + | HTTPException\NotFoundException + | \ImagickException $exception) { DI::intro()->delete($introduction); unset($introductions[$key]); } diff --git a/src/Module/DFRN/Notify.php b/src/Module/DFRN/Notify.php index 6001ae6dc..ce44dec80 100644 --- a/src/Module/DFRN/Notify.php +++ b/src/Module/DFRN/Notify.php @@ -80,7 +80,7 @@ class Notify extends BaseModule $msg = Diaspora::decodeRaw($postdata, '', true); if (!is_array($msg)) { // We have to fail silently to be able to hand it over to the salmon parser - $this->logger->warning('Diaspora::decodeRaw() has failed for some reason.'); + $this->logger->warning('Diaspora::decodeRaw() has failed for some reason.', ['post-data' => $postdata]); return false; } diff --git a/src/Navigation/Notifications/Repository/Notification.php b/src/Navigation/Notifications/Repository/Notification.php index 078346445..777832de6 100644 --- a/src/Navigation/Notifications/Repository/Notification.php +++ b/src/Navigation/Notifications/Repository/Notification.php @@ -282,7 +282,7 @@ class Notification extends BaseRepository 'parent-uri-id' => $itemUriId, ]; - $this->logger->notice('deleteForItem', ['conditionTarget' => $conditionTarget, 'conditionParent' => $conditionParent]); + $this->logger->info('deleteForItem', ['conditionTarget' => $conditionTarget, 'conditionParent' => $conditionParent]); return $this->db->delete(self::$table_name, $conditionTarget) diff --git a/src/Network/HTTPClient/Factory/HttpClient.php b/src/Network/HTTPClient/Factory/HttpClient.php index 20b999919..5d01d3e12 100644 --- a/src/Network/HTTPClient/Factory/HttpClient.php +++ b/src/Network/HTTPClient/Factory/HttpClient.php @@ -83,7 +83,7 @@ class HttpClient extends BaseFactory ResponseInterface $response, UriInterface $uri ) use ($logger) { - $logger->notice('Curl redirect.', ['url' => $request->getUri(), 'to' => $uri, 'method' => $request->getMethod()]); + $logger->info('Curl redirect.', ['url' => $request->getUri(), 'to' => $uri, 'method' => $request->getMethod()]); }; $userAgent = App::PLATFORM . " '" . diff --git a/src/Object/Api/Mastodon/FollowRequest.php b/src/Object/Api/Mastodon/FollowRequest.php deleted file mode 100644 index f401cad48..000000000 --- a/src/Object/Api/Mastodon/FollowRequest.php +++ /dev/null @@ -1,49 +0,0 @@ -. - * - */ - -namespace Friendica\Object\Api\Mastodon; - -use Friendica\App\BaseURL; -use Friendica\Collection\Api\Mastodon\Fields; - -/** - * Virtual entity to separate Accounts from Follow Requests. - * In the Mastodon API they are one and the same. - */ -class FollowRequest extends Account -{ - /** - * Creates a follow request entity from an introduction record. - * - * The account ID is set to the Introduction ID to allow for later interaction with follow requests. - * - * @param BaseURL $baseUrl - * @param int $introduction_id Introduction record id - * @param array $account entry of "account-user-view" - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - public function __construct(BaseURL $baseUrl, int $introduction_id, array $account) - { - parent::__construct($baseUrl, $account, new Fields()); - - $this->id = $introduction_id; - } -} diff --git a/src/Object/Post.php b/src/Object/Post.php index 0a05429df..17c0c1f68 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -534,6 +534,7 @@ class Post 'vote' => $buttons, 'like_html' => $responses['like']['output'], 'dislike_html' => $responses['dislike']['output'], + 'emojis' => $this->getEmojis($item), 'responses' => $responses, 'switchcomment' => DI::l10n()->t('Comment'), 'reply_label' => DI::l10n()->t('Reply to %s', $profile_name), @@ -602,6 +603,70 @@ class Post return $result; } + /** + * Fetch emojis + * + * @param array $item + * @return array + */ + private function getEmojis(array $item): array + { + if (empty($item['emojis'])) { + return []; + } + + $emojis = []; + foreach ($item['emojis'] as $index => $element) { + $actors = implode(', ', $element['title']); + switch ($element['verb']) { + case Activity::ANNOUNCE: + $title = DI::l10n()->t('Reshared by: %s', $actors); + $icon = ['fa' => 'fa-retweet', 'icon' => 'icon-retweet']; + break; + + case Activity::VIEW: + $title = DI::l10n()->t('Viewed by: %s', $actors); + $icon = ['fa' => 'fa-eye', 'icon' => 'icon-eye-open']; + break; + + case Activity::LIKE: + $title = DI::l10n()->t('Liked by: %s', $actors); + $icon = ['fa' => 'fa-thumbs-up', 'icon' => 'icon-thumbs-up']; + break; + + case Activity::DISLIKE: + $title = DI::l10n()->t('Disliked by: %s', $actors); + $icon = ['fa' => 'fa-thumbs-down', 'icon' => 'icon-thumbs-down']; + break; + + case Activity::ATTEND: + $title = DI::l10n()->t('Attended by: %s', $actors); + $icon = ['fa' => 'fa-check', 'icon' => 'icon-ok']; + break; + + case Activity::ATTENDMAYBE: + $title = DI::l10n()->t('Maybe attended by: %s', $actors); + $icon = ['fa' => 'fa-question', 'icon' => 'icon-question']; + break; + + case Activity::ATTENDNO: + $title = DI::l10n()->t('Not attended by: %s', $actors); + $icon = ['fa' => 'fa-times', 'icon' => 'icon-remove']; + break; + + default: + $title = DI::l10n()->t('Reacted with %s by: %s', $element['emoji'], $actors); + $icon = []; + break; + break; + } + $emojis[$index] = ['emoji' => $element['emoji'], 'total' => $element['total'], 'title' => $title, 'icon' => $icon]; + } + ksort($emojis); + + return $emojis; + } + /** * @return integer */ diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 6836eafe3..11267cfaf 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -505,7 +505,7 @@ class Processor $recursion_depth = $activity['recursion-depth'] ?? 0; if (!$in_background && ($recursion_depth < DI::config()->get('system', 'max_recursion_depth'))) { - Logger::notice('Parent not found. Try to refetch it.', ['parent' => $activity['reply-to-id'], 'recursion-depth' => $recursion_depth]); + Logger::info('Parent not found. Try to refetch it.', ['parent' => $activity['reply-to-id'], 'recursion-depth' => $recursion_depth]); $result = self::fetchMissingActivity($activity['reply-to-id'], $activity, '', Receiver::COMPLETION_AUTO); if (empty($result) && self::isActivityGone($activity['reply-to-id'])) { Logger::notice('The activity is gone, the queue entry will be deleted', ['parent' => $activity['reply-to-id']]); @@ -516,10 +516,10 @@ class Processor } elseif (!empty($result)) { $exists = Post::exists(['uri' => [$result, $activity['reply-to-id']]]); if ($exists) { - Logger::notice('The activity has been fetched and created.', ['parent' => $result]); + Logger::info('The activity has been fetched and created.', ['parent' => $result]); return $result; } elseif (DI::config()->get('system', 'fetch_by_worker') || DI::config()->get('system', 'decoupled_receiver')) { - Logger::notice('The activity has been fetched and will hopefully be created later.', ['parent' => $result]); + Logger::info('The activity has been fetched and will hopefully be created later.', ['parent' => $result]); } else { Logger::notice('The activity exists but has not been created, the queue entry will be deleted.', ['parent' => $result]); if (!empty($activity['entry-id'])) { @@ -1561,11 +1561,11 @@ class Processor } if (($completion == Receiver::COMPLETION_RELAY) && Queue::exists($url, 'as:Create')) { - Logger::notice('Activity has already been queued.', ['url' => $url, 'object' => $activity['id']]); + Logger::info('Activity has already been queued.', ['url' => $url, 'object' => $activity['id']]); } elseif (ActivityPub\Receiver::processActivity($ldactivity, json_encode($activity), $uid, true, false, $signer, '', $completion)) { - Logger::notice('Activity had been fetched and processed.', ['url' => $url, 'entry' => $child['entry-id'] ?? 0, 'completion' => $completion, 'object' => $activity['id']]); + Logger::info('Activity had been fetched and processed.', ['url' => $url, 'entry' => $child['entry-id'] ?? 0, 'completion' => $completion, 'object' => $activity['id']]); } else { - Logger::notice('Activity had been fetched and will be processed later.', ['url' => $url, 'entry' => $child['entry-id'] ?? 0, 'completion' => $completion, 'object' => $activity['id']]); + Logger::info('Activity had been fetched and will be processed later.', ['url' => $url, 'entry' => $child['entry-id'] ?? 0, 'completion' => $completion, 'object' => $activity['id']]); } return $activity['id']; diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index fd000dbe8..271b71b89 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -792,7 +792,7 @@ class Diaspora */ private static function key(WebFingerUri $uri): string { - Logger::notice('Fetching diaspora key', ['handle' => $uri->getAddr(), 'callstack' => System::callstack(20)]); + Logger::info('Fetching diaspora key', ['handle' => $uri->getAddr(), 'callstack' => System::callstack(20)]); try { return DI::dsprContact()->getByAddr($uri)->pubKey; } catch (HTTPException\NotFoundException|\InvalidArgumentException $e) { diff --git a/src/Util/HTTPSignature.php b/src/Util/HTTPSignature.php index 3936c70fc..f082fe32f 100644 --- a/src/Util/HTTPSignature.php +++ b/src/Util/HTTPSignature.php @@ -347,12 +347,13 @@ class HTTPSignature if (!empty($gsid)) { $insertFields['gsid'] = $gsid; } - if (!DBA::insert('inbox-status', $insertFields, Database::INSERT_IGNORE)) { + DBA::insert('inbox-status', $insertFields, Database::INSERT_IGNORE); + + $status = DBA::selectFirst('inbox-status', [], ['url' => $url]); + if (empty($status)) { Logger::warning('Unable to insert inbox-status row', $insertFields); return; } - - $status = DBA::selectFirst('inbox-status', [], ['url' => $url]); } if ($success) { diff --git a/src/Util/LDSignature.php b/src/Util/LDSignature.php index 359fbdf17..8cfadb16d 100644 --- a/src/Util/LDSignature.php +++ b/src/Util/LDSignature.php @@ -69,7 +69,7 @@ class LDSignature $dhash = self::hash(self::signableData($data)); $x = Crypto::rsaVerify($ohash . $dhash, base64_decode($data['signature']['signatureValue']), $pubkey); - Logger::notice('LD-verify', ['verified' => (int)$x, 'actor' => $profile['url']]); + Logger::info('LD-verify', ['verified' => (int)$x, 'actor' => $profile['url']]); if (empty($x)) { return false; diff --git a/static/defaults.config.php b/static/defaults.config.php index a8fa44038..bb82473fa 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -282,6 +282,10 @@ return [ // restricts develop log writes to requests originating from this IP address. 'dlogip' => '', + // emoji_activities (Boolean) + // Display received activities (like, dislike, reshare) as emojis + 'emoji_activities' => false, + // expire-notify-priority (integer) // Priority for the expirary notification 'expire-notify-priority' => Friendica\Core\Worker::PRIORITY_LOW, diff --git a/view/global.css b/view/global.css index 78e187c8b..9d8566542 100644 --- a/view/global.css +++ b/view/global.css @@ -98,6 +98,9 @@ span.connector { margin-right: 0px; } +.wall-item-emoji { + margin-right: 5px; +} .wall-item-like-expanded, .wall-item-dislike-expanded, diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 89ebb0aa4..723cbe87d 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2023.03-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-12 12:37+0000\n" +"POT-Creation-Date: 2023-02-18 06:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -294,7 +294,7 @@ msgstr "" #: mod/message.php:203 mod/message.php:360 mod/photos.php:1291 #: src/Content/Conversation.php:381 src/Content/Conversation.php:727 #: src/Module/Item/Compose.php:204 src/Module/Post/Edit.php:142 -#: src/Module/Profile/UnkMail.php:155 src/Object/Post.php:544 +#: src/Module/Profile/UnkMail.php:155 src/Object/Post.php:545 msgid "Please wait" msgstr "" @@ -311,7 +311,7 @@ msgstr "" #: src/Module/Install.php:331 src/Module/Invite.php:178 #: src/Module/Item/Compose.php:189 src/Module/Moderation/Item/Source.php:79 #: src/Module/Profile/Profile.php:274 src/Module/Profile/UnkMail.php:156 -#: src/Module/Settings/Profile/Index.php:231 src/Object/Post.php:993 +#: src/Module/Settings/Profile/Index.php:231 src/Object/Post.php:1058 #: view/theme/duepuntozero/config.php:85 view/theme/frio/config.php:171 #: view/theme/quattro/config.php:87 view/theme/vier/config.php:135 msgid "Submit" @@ -596,24 +596,24 @@ msgstr "" #: mod/photos.php:1135 mod/photos.php:1191 mod/photos.php:1265 #: src/Module/Contact.php:589 src/Module/Item/Compose.php:188 -#: src/Object/Post.php:990 +#: src/Object/Post.php:1055 msgid "This is you" msgstr "" #: mod/photos.php:1137 mod/photos.php:1193 mod/photos.php:1267 -#: src/Object/Post.php:538 src/Object/Post.php:992 +#: src/Object/Post.php:539 src/Object/Post.php:1057 msgid "Comment" msgstr "" #: mod/photos.php:1139 mod/photos.php:1195 mod/photos.php:1269 #: src/Content/Conversation.php:396 src/Module/Calendar/Event/Form.php:248 #: src/Module/Item/Compose.php:199 src/Module/Post/Edit.php:162 -#: src/Object/Post.php:1004 +#: src/Object/Post.php:1069 msgid "Preview" msgstr "" #: mod/photos.php:1140 src/Content/Conversation.php:351 -#: src/Module/Post/Edit.php:127 src/Object/Post.php:994 +#: src/Module/Post/Edit.php:127 src/Object/Post.php:1059 msgid "Loading..." msgstr "" @@ -1140,7 +1140,7 @@ msgid "Visible to everybody" msgstr "" #: src/Content/Conversation.php:321 src/Module/Item/Compose.php:198 -#: src/Object/Post.php:1003 +#: src/Object/Post.php:1068 msgid "Please enter a image/video/audio/webpage URL:" msgstr "" @@ -1185,42 +1185,42 @@ msgid "attach file" msgstr "" #: src/Content/Conversation.php:356 src/Module/Item/Compose.php:190 -#: src/Module/Post/Edit.php:168 src/Object/Post.php:995 +#: src/Module/Post/Edit.php:168 src/Object/Post.php:1060 msgid "Bold" msgstr "" #: src/Content/Conversation.php:357 src/Module/Item/Compose.php:191 -#: src/Module/Post/Edit.php:169 src/Object/Post.php:996 +#: src/Module/Post/Edit.php:169 src/Object/Post.php:1061 msgid "Italic" msgstr "" #: src/Content/Conversation.php:358 src/Module/Item/Compose.php:192 -#: src/Module/Post/Edit.php:170 src/Object/Post.php:997 +#: src/Module/Post/Edit.php:170 src/Object/Post.php:1062 msgid "Underline" msgstr "" #: src/Content/Conversation.php:359 src/Module/Item/Compose.php:193 -#: src/Module/Post/Edit.php:171 src/Object/Post.php:998 +#: src/Module/Post/Edit.php:171 src/Object/Post.php:1063 msgid "Quote" msgstr "" #: src/Content/Conversation.php:360 src/Module/Item/Compose.php:194 -#: src/Module/Post/Edit.php:172 src/Object/Post.php:999 +#: src/Module/Post/Edit.php:172 src/Object/Post.php:1064 msgid "Code" msgstr "" #: src/Content/Conversation.php:361 src/Module/Item/Compose.php:195 -#: src/Object/Post.php:1000 +#: src/Object/Post.php:1065 msgid "Image" msgstr "" #: src/Content/Conversation.php:362 src/Module/Item/Compose.php:196 -#: src/Module/Post/Edit.php:173 src/Object/Post.php:1001 +#: src/Module/Post/Edit.php:173 src/Object/Post.php:1066 msgid "Link" msgstr "" #: src/Content/Conversation.php:363 src/Module/Item/Compose.php:197 -#: src/Module/Post/Edit.php:174 src/Object/Post.php:1002 +#: src/Module/Post/Edit.php:174 src/Object/Post.php:1067 msgid "Link or Media" msgstr "" @@ -1504,25 +1504,25 @@ msgid "" "Contact birthday events are private to you." msgstr "" -#: src/Content/ForumManager.php:151 src/Content/Nav.php:278 +#: src/Content/ForumManager.php:157 src/Content/Nav.php:278 #: src/Content/Text/HTML.php:905 src/Content/Widget.php:524 msgid "Forums" msgstr "" -#: src/Content/ForumManager.php:153 +#: src/Content/ForumManager.php:159 msgid "External link to forum" msgstr "" -#: src/Content/ForumManager.php:156 src/Content/Widget.php:503 +#: src/Content/ForumManager.php:162 src/Content/Widget.php:503 msgid "show less" msgstr "" -#: src/Content/ForumManager.php:157 src/Content/Widget.php:405 +#: src/Content/ForumManager.php:163 src/Content/Widget.php:405 #: src/Content/Widget.php:504 msgid "show more" msgstr "" -#: src/Content/Item.php:326 src/Model/Item.php:2899 +#: src/Content/Item.php:326 src/Model/Item.php:2900 msgid "event" msgstr "" @@ -1530,7 +1530,7 @@ msgstr "" msgid "status" msgstr "" -#: src/Content/Item.php:335 src/Model/Item.php:2901 +#: src/Content/Item.php:335 src/Model/Item.php:2902 #: src/Module/Post/Tag/Add.php:123 msgid "photo" msgstr "" @@ -1936,8 +1936,8 @@ msgid "" "%2$s %3$s" msgstr "" -#: src/Content/Text/BBCode.php:1191 src/Model/Item.php:3572 -#: src/Model/Item.php:3578 src/Model/Item.php:3579 +#: src/Content/Text/BBCode.php:1191 src/Model/Item.php:3573 +#: src/Model/Item.php:3579 src/Model/Item.php:3580 msgid "Link to source" msgstr "" @@ -2761,22 +2761,22 @@ msgid "" "to version 2021.01 and wait until the postupdate finished version 1383." msgstr "" -#: src/Core/Update.php:186 +#: src/Core/Update.php:197 #, php-format msgid "%s: executing pre update %d" msgstr "" -#: src/Core/Update.php:228 +#: src/Core/Update.php:239 #, php-format msgid "%s: executing post update %d" msgstr "" -#: src/Core/Update.php:302 +#: src/Core/Update.php:313 #, php-format msgid "Update %s failed. See error logs." msgstr "" -#: src/Core/Update.php:342 +#: src/Core/Update.php:353 #, php-format msgid "" "\n" @@ -2788,16 +2788,16 @@ msgid "" "might be invalid." msgstr "" -#: src/Core/Update.php:348 +#: src/Core/Update.php:359 #, php-format msgid "The error message is\\n[pre]%s[/pre]" msgstr "" -#: src/Core/Update.php:352 src/Core/Update.php:380 +#: src/Core/Update.php:363 src/Core/Update.php:391 msgid "[Friendica Notify] Database update" msgstr "" -#: src/Core/Update.php:374 +#: src/Core/Update.php:385 #, php-format msgid "" "\n" @@ -3106,81 +3106,81 @@ msgstr "" msgid "Edit groups" msgstr "" -#: src/Model/Item.php:2000 +#: src/Model/Item.php:2001 #, php-format msgid "Detected languages in this post:\\n%s" msgstr "" -#: src/Model/Item.php:2903 +#: src/Model/Item.php:2904 msgid "activity" msgstr "" -#: src/Model/Item.php:2905 +#: src/Model/Item.php:2906 msgid "comment" msgstr "" -#: src/Model/Item.php:2908 src/Module/Post/Tag/Add.php:123 +#: src/Model/Item.php:2909 src/Module/Post/Tag/Add.php:123 msgid "post" msgstr "" -#: src/Model/Item.php:3058 +#: src/Model/Item.php:3059 #, php-format msgid "%s is blocked" msgstr "" -#: src/Model/Item.php:3060 +#: src/Model/Item.php:3061 #, php-format msgid "%s is ignored" msgstr "" -#: src/Model/Item.php:3062 +#: src/Model/Item.php:3063 #, php-format msgid "Content from %s is collapsed" msgstr "" -#: src/Model/Item.php:3066 +#: src/Model/Item.php:3067 #, php-format msgid "Content warning: %s" msgstr "" -#: src/Model/Item.php:3484 +#: src/Model/Item.php:3485 msgid "bytes" msgstr "" -#: src/Model/Item.php:3515 +#: src/Model/Item.php:3516 #, php-format msgid "%2$s (%3$d%%, %1$d vote)" msgid_plural "%2$s (%3$d%%, %1$d votes)" msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3517 +#: src/Model/Item.php:3518 #, php-format msgid "%2$s (%1$d vote)" msgid_plural "%2$s (%1$d votes)" msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3522 +#: src/Model/Item.php:3523 #, php-format msgid "%d voter. Poll end: %s" msgid_plural "%d voters. Poll end: %s" msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3524 +#: src/Model/Item.php:3525 #, php-format msgid "%d voter." msgid_plural "%d voters." msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3526 +#: src/Model/Item.php:3527 #, php-format msgid "Poll end: %s" msgstr "" -#: src/Model/Item.php:3560 src/Model/Item.php:3561 +#: src/Model/Item.php:3561 src/Model/Item.php:3562 msgid "View on separate page" msgstr "" @@ -6841,7 +6841,7 @@ msgstr "" msgid "Help:" msgstr "" -#: src/Module/Home.php:54 +#: src/Module/Home.php:63 #, php-format msgid "Welcome to %s" msgstr "" @@ -11280,50 +11280,90 @@ msgstr "" msgid "via Wall-To-Wall:" msgstr "" -#: src/Object/Post.php:539 +#: src/Object/Post.php:540 #, php-format msgid "Reply to %s" msgstr "" -#: src/Object/Post.php:542 +#: src/Object/Post.php:543 msgid "More" msgstr "" -#: src/Object/Post.php:560 +#: src/Object/Post.php:561 msgid "Notifier task is pending" msgstr "" -#: src/Object/Post.php:561 +#: src/Object/Post.php:562 msgid "Delivery to remote servers is pending" msgstr "" -#: src/Object/Post.php:562 +#: src/Object/Post.php:563 msgid "Delivery to remote servers is underway" msgstr "" -#: src/Object/Post.php:563 +#: src/Object/Post.php:564 msgid "Delivery to remote servers is mostly done" msgstr "" -#: src/Object/Post.php:564 +#: src/Object/Post.php:565 msgid "Delivery to remote servers is done" msgstr "" -#: src/Object/Post.php:584 +#: src/Object/Post.php:585 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "" msgstr[1] "" -#: src/Object/Post.php:585 +#: src/Object/Post.php:586 msgid "Show more" msgstr "" -#: src/Object/Post.php:586 +#: src/Object/Post.php:587 msgid "Show fewer" msgstr "" +#: src/Object/Post.php:623 +#, php-format +msgid "Reshared by: %s" +msgstr "" + +#: src/Object/Post.php:628 +#, php-format +msgid "Viewed by: %s" +msgstr "" + +#: src/Object/Post.php:633 +#, php-format +msgid "Liked by: %s" +msgstr "" + +#: src/Object/Post.php:638 +#, php-format +msgid "Disliked by: %s" +msgstr "" + +#: src/Object/Post.php:643 +#, php-format +msgid "Attended by: %s" +msgstr "" + +#: src/Object/Post.php:648 +#, php-format +msgid "Maybe attended by: %s" +msgstr "" + +#: src/Object/Post.php:653 +#, php-format +msgid "Not attended by: %s" +msgstr "" + +#: src/Object/Post.php:658 +#, php-format +msgid "Reacted with %s by: %s" +msgstr "" + #: src/Protocol/Delivery.php:547 msgid "(no subject)" msgstr "" diff --git a/view/templates/wall_thread.tpl b/view/templates/wall_thread.tpl index 86ec6a9fc..5e9dd96d6 100644 --- a/view/templates/wall_thread.tpl +++ b/view/templates/wall_thread.tpl @@ -178,7 +178,15 @@
- {{if $item.responses}} + {{if $item.emojis}} + {{foreach $item.emojis as $emoji}} + {{if $emoji.icon.icon}} + {{$emoji.total}} + {{else}} + {{$emoji.emoji}} {{$emoji.total}} + {{/if}} + {{/foreach}} + {{elseif $item.responses}} {{foreach $item.responses as $verb=>$response}}
{{$response.output nofilter}}
{{/foreach}} diff --git a/view/theme/frio/templates/search_item.tpl b/view/theme/frio/templates/search_item.tpl index f0ed02b90..4a3e006aa 100644 --- a/view/theme/frio/templates/search_item.tpl +++ b/view/theme/frio/templates/search_item.tpl @@ -277,12 +277,20 @@

{{* Display likes, dislike and attendance stats *}} - {{if $item.responses}} -
- {{foreach $item.responses as $verb=>$response}} -
{{$response.output nofilter}}
+ {{if $item.emojis}} + {{foreach $item.emojis as $emoji}} + {{if $emoji.icon.fa}} + {{$emoji.total}} + {{else}} + {{$emoji.emoji}} {{$emoji.total}} + {{/if}} {{/foreach}} -
+ {{elseif $item.responses}} +
+ {{foreach $item.responses as $verb=>$response}} +
{{$response.output nofilter}}
+ {{/foreach}} +
{{/if}}
diff --git a/view/theme/frio/templates/wall_thread.tpl b/view/theme/frio/templates/wall_thread.tpl index bfdbf9058..41738a0e4 100644 --- a/view/theme/frio/templates/wall_thread.tpl +++ b/view/theme/frio/templates/wall_thread.tpl @@ -582,13 +582,21 @@ as the value of $top_child_total (this is done at the end of this file) {{* Display likes, dislike and attendance stats *}} - {{if $item.responses}} -
- {{foreach $item.responses as $verb=>$response}} -
{{$response.output nofilter}}
+ {{if $item.emojis}} + {{foreach $item.emojis as $emoji}} + {{if $emoji.icon.fa}} + {{$emoji.total}} + {{else}} + {{$emoji.emoji}} {{$emoji.total}} + {{/if}} {{/foreach}} -
- {{/if}} + {{elseif $item.responses}} +
+ {{foreach $item.responses as $verb=>$response}} +
{{$response.output nofilter}}
+ {{/foreach}} +
+ {{/if}} {{* Insert comment box of threaded children *}} {{if $item.threaded && $item.comment_html && $item.indent==comment}} diff --git a/view/theme/quattro/templates/wall_thread.tpl b/view/theme/quattro/templates/wall_thread.tpl index 1382222c1..1683f10d0 100644 --- a/view/theme/quattro/templates/wall_thread.tpl +++ b/view/theme/quattro/templates/wall_thread.tpl @@ -160,7 +160,11 @@
- {{if $item.responses}} + {{if $item.emojis}} + {{foreach $item.emojis as $emoji}} + {{$emoji.emoji}} {{$emoji.total}} + {{/foreach}} + {{elseif $item.responses}} {{foreach $item.responses as $verb=>$response}}
{{$response.output nofilter}}
{{/foreach}}