<?php
/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
return $root;
}
+ /**
+ * Determine the next birthday, but only if the birthday is published
+ * in the default profile. We _could_ also look for a private profile that the
+ * recipient can see, but somebody could get mad at us if they start getting
+ * public birthday greetings when they haven't made this info public.
+ *
+ * Assuming we are able to publish this info, we are then going to convert
+ * the start time from the owner's timezone to UTC.
+ *
+ * This will potentially solve the problem found with some social networks
+ * where birthdays are converted to the viewer's timezone and salutations from
+ * elsewhere in the world show up on the wrong day. We will convert it to the
+ * viewer's timezone also, but first we are going to convert it from the birthday
+ * person's timezone to GMT - so the viewer may find the birthday starting at
+ * 6:00PM the day before, but that will correspond to midnight to the birthday person.
+ */
+ private static function determineNextBirthday($uid, $tz)
+ {
+ $birthday = '';
+
+ if (!strlen($tz)) {
+ $tz = 'UTC';
+ }
+
+ $profile = DBA::selectFirst('profile', ['dob'], ['uid' => $uid]);
+ if (DBA::isResult($profile)) {
+ $tmp_dob = substr($profile['dob'], 5);
+ if (intval($tmp_dob)) {
+ $y = DateTimeFormat::timezoneNow($tz, 'Y');
+ $bd = $y . '-' . $tmp_dob . ' 00:00';
+ $t_dob = strtotime($bd);
+ $now = strtotime(DateTimeFormat::timezoneNow($tz));
+ if ($t_dob < $now) {
+ $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
+ }
+ $birthday = DateTimeFormat::convert($bd, 'UTC', $tz, DateTimeFormat::ATOM);
+ }
+ }
+
+ return $birthday;
+ }
+
/**
* Adds the author element in the header for the DFRN protocol
*
return $author;
}
- $birthday = feed_birthday($owner['uid'], $owner['timezone']);
+ $birthday = self::determineNextBirthday($owner['uid'], $owner['timezone']);
if ($birthday) {
XML::addElement($doc, $author, "dfrn:birthday", $birthday);
foreach ($mentioned as $mention) {
$condition = ['uid' => $owner["uid"], 'nurl' => Strings::normaliseLink($mention)];
- $contact = DBA::selectFirst('contact', ['forum', 'prv'], $condition);
+ $contact = DBA::selectFirst('contact', ['contact-type'], $condition);
- if (DBA::isResult($contact) && ($contact["forum"] || $contact["prv"])) {
+ if (DBA::isResult($contact) && ($contact['contact-type'] == Contact::TYPE_COMMUNITY)) {
XML::addElement(
$doc,
$entry,
}
// Quit if we already have an introduction for this person
- if (DBA::exists('intro', ['uid' => $uid, 'suggest-cid' => $cid])) {
+ if (DI::intro()->suggestionExistsForUser($cid, $uid)) {
return false;
}
$suggest['title'] = '';
$suggest['body'] = $note;
- $hash = Strings::getRandomHex();
- $fields = ['uid' => $suggest['uid'], 'suggest-cid' => $cid, 'contact-id' => $suggest['cid'],
- 'note' => $suggest['body'], 'hash' => $hash, 'datetime' => DateTimeFormat::utcNow(), 'blocked' => false];
- DBA::insert('intro', $fields);
+ DI::intro()->save(DI::introFactory()->createNew(
+ $suggest['uid'],
+ $suggest['cid'],
+ $suggest['body'],
+ null,
+ $cid
+ ));
DI::notify()->createFromArray([
'type' => Notification\Type::SUGGEST,
if ($item["thr-parent"] != $item["uri"]) {
$community = false;
- if ($importer["page-flags"] == User::PAGE_FLAGS_COMMUNITY || $importer["page-flags"] == User::PAGE_FLAGS_PRVGROUP) {
+ if ($importer['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) {
$sql_extra = "";
$community = true;
Logger::notice("possible community action");
// was the top-level post for this action written by somebody on this site?
// Specifically, the recipient?
- $parent = Post::selectFirst(['forum_mode', 'wall'],
+ $parent = Post::selectFirst(['wall'],
["`uri` = ? AND `uid` = ?" . $sql_extra, $item["thr-parent"], $importer["importer_uid"]]);
$is_a_remote_action = DBA::isResult($parent);
- /*
- * Does this have the characteristics of a community or private group action?
- * If it's an action to a wall post on a community/prvgroup page it's a
- * valid community action. Also forum_mode makes it valid for sure.
- * If neither, it's not.
- */
- if ($is_a_remote_action && $community && (!$parent["forum_mode"]) && (!$parent["wall"])) {
- $is_a_remote_action = false;
- Logger::notice("not a community action");
- }
-
if ($is_a_remote_action) {
return DFRN::REPLY_RC;
} else {
return false;
}
- $user = DBA::selectFirst('user', ['page-flags', 'nickname'], ['uid' => $uid]);
+ $user = DBA::selectFirst('user', ['account-type', 'nickname'], ['uid' => $uid]);
if (!DBA::isResult($user)) {
return false;
}
- $community_page = ($user['page-flags'] == User::PAGE_FLAGS_COMMUNITY);
- $prvgroup = ($user['page-flags'] == User::PAGE_FLAGS_PRVGROUP);
-
$link = Strings::normaliseLink(DI::baseUrl() . '/profile/' . $user['nickname']);
/*
return false;
}
- return $community_page || $prvgroup;
+ return ($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
}
/**