namespace Friendica\Model;
use Friendica\Contact\Avatar;
+use Friendica\Contact\Header;
use Friendica\Contact\Introduction\Exception\IntroductionNotFoundException;
+use Friendica\Contact\LocalRelationship\Entity\LocalRelationship;
use Friendica\Content\Conversation as ConversationContent;
use Friendica\Content\Pager;
use Friendica\Content\Text\HTML;
* @}
*/
- const MIRROR_DEACTIVATED = 0;
- const MIRROR_FORWARDED = 1; // Deprecated, now does the same like MIRROR_OWN_POST
- const MIRROR_OWN_POST = 2;
- const MIRROR_NATIVE_RESHARE = 3;
+ /** @deprecated Use Entity\LocalRelationship::MIRROR_DEACTIVATED instead */
+ const MIRROR_DEACTIVATED = LocalRelationship::MIRROR_DEACTIVATED;
+ /** @deprecated Now does the same as MIRROR_OWN_POST */
+ const MIRROR_FORWARDED = 1;
+ /** @deprecated Use Entity\LocalRelationship::MIRROR_OWN_POST instead */
+ const MIRROR_OWN_POST = LocalRelationship::MIRROR_OWN_POST;
+ /** @deprecated Use Entity\LocalRelationship::MIRROR_NATIVE_RESHARE instead */
+ const MIRROR_NATIVE_RESHARE = LocalRelationship::MIRROR_NATIVE_RESHARE;
/**
* @param array $fields Array of selected fields, empty for all
Contact\User::insertForContactArray($contact);
+ if ((empty($contact['baseurl']) || empty($contact['gsid'])) && Probe::isProbable($contact['network'])) {
+ Logger::debug('Update missing baseurl', ['id' => $contact['id'], 'url' => $contact['url'], 'callstack' => System::callstack(4, 0, true)]);
+ UpdateContact::add(['priority' => Worker::PRIORITY_MEDIUM, 'dont_fork' => true], $contact['id']);
+ }
+
return $contact['id'];
}
return self::isSharing($cid, $uid, $strict);
}
+ /**
+ * Checks if the provided public contact id has got followers on this system
+ *
+ * @param integer $cid
+ * @return boolean
+ */
+ public static function hasFollowers(int $cid): bool
+ {
+ return DBA::exists('account-user-view', ["`pid` = ? AND `uid` != ? AND `rel` IN (?, ?)", $cid, 0, self::SHARING, self::FRIEND]);
+ }
+
/**
* Get the basepath for a given contact link
*
$user = DBA::selectFirst(
'user',
['uid', 'username', 'nickname', 'pubkey', 'prvkey'],
- ['uid' => $uid, 'account_expired' => false]
+ ['uid' => $uid, 'verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false]
);
if (!DBA::isResult($user)) {
return false;
/**
* Updates the self-contact for the provided user id
*
- * @param int $uid
- * @param bool $update_avatar Force the avatar update
+ * @param int $uid
+ * @param bool $update_avatar Force the avatar update
* @return bool "true" if updated
- * @throws HTTPException\InternalServerErrorException
+ * @throws \Exception
*/
public static function updateSelfFromUserID(int $uid, bool $update_avatar = false): bool
{
return false;
}
- $fields = ['uid', 'nickname', 'page-flags', 'account-type', 'prvkey', 'pubkey'];
- $user = DBA::selectFirst('user', $fields, ['uid' => $uid, 'account_expired' => false]);
+ $fields = ['uid', 'username', 'nickname', 'page-flags', 'account-type', 'prvkey', 'pubkey'];
+ $user = DBA::selectFirst('user', $fields, ['uid' => $uid, 'verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false]);
if (!DBA::isResult($user)) {
return false;
}
$url = DI::baseUrl() . '/profile/' . $user['nickname'];
$fields = [
- 'name' => $profile['name'],
+ 'name' => $user['username'],
'nick' => $user['nickname'],
'avatar-date' => $self['avatar-date'],
'location' => Profile::formatLocation($profile),
'confirm' => DI::baseUrl() . '/dfrn_confirm/' . $user['nickname'],
];
-
$avatar = Photo::selectFirst(['resource-id', 'type'], ['uid' => $uid, 'profile' => true]);
if (DBA::isResult($avatar)) {
if ($update_avatar) {
}
$pm_url = '';
+ $mention_url = '';
$status_link = '';
$photos_link = '';
$pm_url = 'message/new/' . $contact['id'];
}
+ if ($contact['contact-type'] == Contact::TYPE_COMMUNITY) {
+ $mention_label = DI::l10n()->t('Post to group');
+ $mention_url = 'compose/0?body=!' . $contact['addr'];
+ } else {
+ $mention_label = DI::l10n()->t('Mention');
+ $mention_url = 'compose/0?body=@' . $contact['addr'];
+ }
+
$contact_url = 'contact/' . $contact['id'];
- $posts_link = 'contact/' . $contact['id'] . '/conversations';
+
+ if ($contact['contact-type'] == Contact::TYPE_COMMUNITY) {
+ $network_label = DI::l10n()->t('View group');
+ $network_url = 'network/group/' . $contact['id'];
+ } else {
+ $network_label = DI::l10n()->t('Network Posts');
+ $network_url = 'contact/' . $contact['id'] . '/conversations';
+ }
$follow_link = '';
$unfollow_link = '';
* Menu array:
* "name" => [ "Label", "link", (bool)Should the link opened in a new tab? ]
*/
+
+
if (empty($contact['uid'])) {
$menu = [
'profile' => [DI::l10n()->t('View Profile'), $profile_link, true],
- 'network' => [DI::l10n()->t('Network Posts'), $posts_link, false],
+ 'network' => [$network_label, $network_url, false],
'edit' => [DI::l10n()->t('View Contact'), $contact_url, false],
'follow' => [DI::l10n()->t('Connect/Follow'), $follow_link, true],
'unfollow' => [DI::l10n()->t('Unfollow'), $unfollow_link, true],
+ 'mention' => [$mention_label, $mention_url, false],
];
} else {
$menu = [
'status' => [DI::l10n()->t('View Status'), $status_link, true],
'profile' => [DI::l10n()->t('View Profile'), $profile_link, true],
'photos' => [DI::l10n()->t('View Photos'), $photos_link, true],
- 'network' => [DI::l10n()->t('Network Posts'), $posts_link, false],
+ 'network' => [$network_label, $network_url, false],
'edit' => [DI::l10n()->t('View Contact'), $contact_url, false],
'pm' => [DI::l10n()->t('Send PM'), $pm_url, false],
'follow' => [DI::l10n()->t('Connect/Follow'), $follow_link, true],
'unfollow' => [DI::l10n()->t('Unfollow'), $unfollow_link, true],
+ 'mention' => [$mention_label, $mention_url, false],
];
if (!empty($contact['pending'])) {
$fields = [
'uid' => $uid,
'url' => $data['url'],
+ 'baseurl' => $data['baseurl'] ?? '',
'nurl' => Strings::normaliseLink($data['url']),
'network' => $data['network'],
'created' => DateTimeFormat::utcNow(),
}
}
- $o .= DI::conversation()->create($items, ConversationContent::MODE_CONTACTS, $update, false, 'pinned_commented', DI::userSession()->getLocalUserId());
+ $o .= DI::conversation()->render($items, ConversationContent::MODE_CONTACTS, $update, false, 'pinned_commented', DI::userSession()->getLocalUserId());
} else {
$fields = array_merge(Item::DISPLAY_FIELDLIST, ['featured']);
$items = Post::toArray(Post::selectForUser(DI::userSession()->getLocalUserId(), $fields, $condition, $params));
}
}
- $o .= DI::conversation()->create($items, ConversationContent::MODE_CONTACT_POSTS, $update);
+ $o .= DI::conversation()->render($items, ConversationContent::MODE_CONTACT_POSTS, $update);
}
if (!$update) {
switch ($platform) {
case 'friendica':
case 'friendika':
- /**
- * Picture credits
- * @author Lostinlight <https://mastodon.xyz/@lightone>
- * @license CC0 https://creativecommons.org/share-your-work/public-domain/cc0/
- * @link https://gitlab.com/lostinlight/per_aspera_ad_astra/-/blob/master/friendica-404/friendica-promo-bubbles.jpg
- */
- $header = DI::baseUrl() . '/images/friendica-banner.jpg';
+ $header = DI::baseUrl() . (new Header(DI::config()))->getMastodonBannerPath();
break;
case 'diaspora':
/**
}
$update = false;
- $guid = ($ret['guid'] ?? '') ?: Item::guidFromUri($ret['url'], $ret['baseurl'] ?? $ret['alias']);
+ $guid = ($ret['guid'] ?? '') ?: Item::guidFromUri($ret['url'], $ret['baseurl'] ?? $ret['alias'] ?? '');
// make sure to not overwrite existing values with blank entries except some technical fields
$keep = ['batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'baseurl'];
// create contact record
self::insert([
- 'uid' => $uid,
- 'created' => DateTimeFormat::utcNow(),
- 'url' => $ret['url'],
- 'nurl' => Strings::normaliseLink($ret['url']),
- 'addr' => $ret['addr'],
- 'alias' => $ret['alias'],
- 'batch' => $ret['batch'],
- 'notify' => $ret['notify'],
- 'poll' => $ret['poll'],
- 'poco' => $ret['poco'],
- 'name' => $ret['name'],
- 'nick' => $ret['nick'],
- 'network' => $ret['network'],
- 'baseurl' => $ret['baseurl'],
- 'gsid' => $ret['gsid'] ?? null,
- 'protocol' => $protocol,
- 'pubkey' => $ret['pubkey'],
- 'rel' => $new_relation,
- 'priority' => $ret['priority'],
- 'writable' => $writeable,
- 'hidden' => $hidden,
- 'blocked' => 0,
- 'readonly' => 0,
- 'pending' => $pending,
- 'subhub' => $subhub
+ 'uid' => $uid,
+ 'created' => DateTimeFormat::utcNow(),
+ 'url' => $ret['url'],
+ 'nurl' => Strings::normaliseLink($ret['url']),
+ 'addr' => $ret['addr'],
+ 'alias' => $ret['alias'],
+ 'batch' => $ret['batch'],
+ 'notify' => $ret['notify'],
+ 'poll' => $ret['poll'],
+ 'poco' => $ret['poco'],
+ 'name' => $ret['name'],
+ 'nick' => $ret['nick'],
+ 'network' => $ret['network'],
+ 'baseurl' => $ret['baseurl'],
+ 'gsid' => $ret['gsid'] ?? null,
+ 'contact-type' => $ret['account-type'] ?? self::TYPE_PERSON,
+ 'protocol' => $protocol,
+ 'pubkey' => $ret['pubkey'],
+ 'rel' => $new_relation,
+ 'priority' => $ret['priority'],
+ 'writable' => $writeable,
+ 'hidden' => $hidden,
+ 'blocked' => 0,
+ 'readonly' => 0,
+ 'pending' => $pending,
+ 'subhub' => $subhub
]);
}
$contact_id = $contact['id'];
$result['cid'] = $contact_id;
- Circle::addMember(User::getDefaultCircle($uid), $contact_id);
+ if ($contact['contact-type'] == self::TYPE_COMMUNITY) {
+ Circle::addMember(User::getDefaultGroupCircle($uid), $contact_id);
+ } else {
+ Circle::addMember(User::getDefaultCircle($uid), $contact_id);
+ }
// Update the avatar
self::updateAvatar($contact_id, $ret['photo']);
return false;
}
- $fields = ['id', 'url', 'name', 'nick', 'avatar', 'photo', 'network', 'blocked'];
+ $fields = ['id', 'url', 'name', 'nick', 'avatar', 'photo', 'network', 'blocked', 'baseurl'];
$pub_contact = DBA::selectFirst('contact', $fields, ['id' => $datarray['author-id']]);
if (!DBA::isResult($pub_contact)) {
// Should never happen
'created' => DateTimeFormat::utcNow(),
'url' => $url,
'nurl' => Strings::normaliseLink($url),
+ 'baseurl' => $pub_contact['baseurl'] ?? '',
'name' => $name,
'nick' => $nick,
'network' => $network,
Post\UserNotification::insertNotification($pub_contact['id'], Activity::FOLLOW, $importer['uid']);
- $contact_record = DBA::selectFirst('contact', ['id', 'network', 'name', 'url', 'photo'], ['id' => $contact_id]);
+ $contact_record = DBA::selectFirst('contact', ['id', 'network', 'name', 'url', 'photo', 'contact-type'], ['id' => $contact_id]);
/// @TODO Encapsulate this into a function/method
$fields = ['uid', 'username', 'email', 'page-flags', 'notify-flags', 'language'];
DI::intro()->save($intro);
}
- Circle::addMember(User::getDefaultCircle($importer['uid']), $contact_record['id']);
+ if ($contact_record['contact-type'] == self::TYPE_COMMUNITY) {
+ Circle::addMember(User::getDefaultGroupCircle($importer['uid']), $contact_record['id']);
+ } else {
+ Circle::addMember(User::getDefaultCircle($importer['uid']), $contact_record['id']);
+ }
if (($user['notify-flags'] & Notification\Type::INTRO) && $user['page-flags'] == User::PAGE_FLAGS_NORMAL) {
DI::notify()->createFromArray([