3 * @copyright Copyright (C) 2010-2023, the Friendica project
5 * @license GNU AGPL version 3 or any later version
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 namespace Friendica\Content\Widget;
24 use Friendica\Content\ContactSelector;
25 use Friendica\Content\Text\BBCode;
26 use Friendica\Core\Logger;
27 use Friendica\Core\Protocol;
28 use Friendica\Core\Renderer;
29 use Friendica\Core\System;
31 use Friendica\Model\Contact;
32 use Friendica\Util\Network;
33 use Friendica\Util\Strings;
38 * @author Michael Vogel
43 * Get HTML for vcard block
45 * @template widget/vcard.tpl
48 public static function getHTML(array $contact): string
50 if (!isset($contact['network']) || !isset($contact['id'])) {
51 Logger::warning('Incomplete contact', ['contact' => $contact ?? [], 'callstack' => System::callstack(20)]);
54 if (!Network::isValidHttpUrl($contact['url']) && Network::isValidHttpUrl($contact['alias'])) {
55 $contact_url = $contact['alias'];
57 $contact_url = $contact['url'];
60 if ($contact['network'] != '') {
61 $network_link = Strings::formatNetworkName($contact['network'], $contact_url);
62 $network_avatar = ContactSelector::networkToIcon($contact['network'], $contact_url);
70 $wallmessage_link = '';
75 $photo = Contact::getPhoto($contact);
77 if (DI::userSession()->getLocalUserId()) {
78 if ($contact['uid']) {
80 $rel = $contact['rel'];
81 $pending = $contact['pending'];
83 $pcontact = Contact::selectFirst([], ['uid' => DI::userSession()->getLocalUserId(), 'uri-id' => $contact['uri-id'], 'deleted' => false]);
85 $id = $pcontact['id'] ?? 0;
86 $rel = $pcontact['rel'] ?? Contact::NOTHING;
87 $pending = $pcontact['pending'] ?? false;
89 if (!empty($pcontact) && in_array($pcontact['network'], [Protocol::MAIL, Protocol::FEED])) {
90 $photo = Contact::getPhoto($pcontact);
94 if (empty($contact['self']) && Protocol::supportsFollow($contact['network'])) {
95 if (in_array($rel, [Contact::SHARING, Contact::FRIEND])) {
96 $unfollow_link = 'contact/unfollow?url=' . urlencode($contact_url) . '&auto=1';
97 } elseif (!$pending) {
98 $follow_link = 'contact/follow?url=' . urlencode($contact_url) . '&auto=1';
102 if (in_array($rel, [Contact::FOLLOWER, Contact::FRIEND]) && Contact::canReceivePrivateMessages($contact)) {
103 $wallmessage_link = 'message/new/' . $id;
106 if ($contact['contact-type'] == Contact::TYPE_COMMUNITY) {
107 $mention_label = DI::l10n()->t('Post to group');
108 $mention_link = 'compose/0?body=!' . $contact['addr'];
109 $showgroup_link = 'network/group/' . $id;
111 $mention_label = DI::l10n()->t('Mention');
112 $mention_link = 'compose/0?body=@' . $contact['addr'];
116 return Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/vcard.tpl'), [
117 '$contact' => $contact,
119 '$url' => Contact::magicLinkByContact($contact, $contact_url),
120 '$about' => BBCode::convertForUriId($contact['uri-id'] ?? 0, $contact['about'] ?? ''),
121 '$xmpp' => DI::l10n()->t('XMPP:'),
122 '$matrix' => DI::l10n()->t('Matrix:'),
123 '$location' => DI::l10n()->t('Location:'),
124 '$network_link' => $network_link,
125 '$network_avatar' => $network_avatar,
126 '$network' => DI::l10n()->t('Network:'),
127 '$account_type' => Contact::getAccountType($contact['contact-type']),
128 '$follow' => DI::l10n()->t('Follow'),
129 '$follow_link' => $follow_link,
130 '$unfollow' => DI::l10n()->t('Unfollow'),
131 '$unfollow_link' => $unfollow_link,
132 '$wallmessage' => DI::l10n()->t('Message'),
133 '$wallmessage_link' => $wallmessage_link,
134 '$mention' => $mention_label,
135 '$mention_link' => $mention_link,
136 '$showgroup' => DI::l10n()->t('View group'),
137 '$showgroup_link' => $showgroup_link,