]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Merge pull request #4387 from MrPetovan/task/3878-move-datetime-to-src
[friendica.git] / src / Model / Contact.php
index ba9536b391a11421dc7af5409308741066a7aa81..1d31c6cb5b38f5a50a547f2d54b1e2fcb4aeb341 100644 (file)
@@ -12,14 +12,15 @@ use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
-use Friendica\Network\Probe;
 use Friendica\Model\Photo;
 use Friendica\Model\Profile;
-use Friendica\Protocol\Diaspora;
+use Friendica\Network\Probe;
 use Friendica\Protocol\DFRN;
+use Friendica\Protocol\Diaspora;
 use Friendica\Protocol\OStatus;
 use Friendica\Protocol\PortableContact;
 use Friendica\Protocol\Salmon;
+use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
 use dba;
 
@@ -111,7 +112,7 @@ class Contact extends BaseObject
 
                $return = dba::insert('contact', [
                        'uid'         => $user['uid'],
-                       'created'     => datetime_convert(),
+                       'created'     => DateTimeFormat::utcNow(),
                        'self'        => 1,
                        'name'        => $user['username'],
                        'nick'        => $user['nickname'],
@@ -128,9 +129,9 @@ class Contact extends BaseObject
                        'poll'        => System::baseUrl() . '/dfrn_poll/'    . $user['nickname'],
                        'confirm'     => System::baseUrl() . '/dfrn_confirm/' . $user['nickname'],
                        'poco'        => System::baseUrl() . '/poco/'         . $user['nickname'],
-                       'name-date'   => datetime_convert(),
-                       'uri-date'    => datetime_convert(),
-                       'avatar-date' => datetime_convert(),
+                       'name-date'   => DateTimeFormat::utcNow(),
+                       'uri-date'    => DateTimeFormat::utcNow(),
+                       'avatar-date' => DateTimeFormat::utcNow(),
                        'closeness'   => 0
                ]);
 
@@ -209,10 +210,10 @@ class Contact extends BaseObject
                }
 
                if ($contact['term-date'] <= NULL_DATE) {
-                       dba::update('contact', ['term-date' => datetime_convert()], ['id' => $contact['id']]);
+                       dba::update('contact', ['term-date' => DateTimeFormat::utcNow()], ['id' => $contact['id']]);
 
                        if ($contact['url'] != '') {
-                               dba::update('contact', ['term-date' => datetime_convert()], ['`nurl` = ? AND `term-date` <= ? AND NOT `self`', normalise_link($contact['url']), NULL_DATE]);
+                               dba::update('contact', ['term-date' => DateTimeFormat::utcNow()], ['`nurl` = ? AND `term-date` <= ? AND NOT `self`', normalise_link($contact['url']), NULL_DATE]);
                        }
                } else {
                        /* @todo
@@ -223,7 +224,7 @@ class Contact extends BaseObject
 
                        /// @todo Check for contact vitality via probing
                        $expiry = $contact['term-date'] . ' + 32 days ';
-                       if (datetime_convert() > datetime_convert('UTC', 'UTC', $expiry)) {
+                       if (DateTimeFormat::utcNow() > DateTimeFormat::utc($expiry)) {
                                /* Relationship is really truly dead. archive them rather than
                                 * delete, though if the owner tries to unarchive them we'll start
                                 * the whole process over again.
@@ -687,7 +688,7 @@ class Contact extends BaseObject
                        $contact_id = $contact["id"];
 
                        // Update the contact every 7 days
-                       $update_contact = ($contact['avatar-date'] < datetime_convert('', '', 'now -7 days'));
+                       $update_contact = ($contact['avatar-date'] < DateTimeFormat::utc('now -7 days'));
 
                        // We force the update if the avatar is empty
                        if (!x($contact, 'avatar')) {
@@ -727,7 +728,7 @@ class Contact extends BaseObject
                if (!$contact_id) {
                        dba::insert('contact', [
                                'uid'       => $uid,
-                               'created'   => datetime_convert(),
+                               'created'   => DateTimeFormat::utcNow(),
                                'url'       => $data["url"],
                                'nurl'      => normalise_link($data["url"]),
                                'addr'      => $data["addr"],
@@ -748,9 +749,9 @@ class Contact extends BaseObject
                                'request'   => $data["request"],
                                'confirm'   => $data["confirm"],
                                'poco'      => $data["poco"],
-                               'name-date' => datetime_convert(),
-                               'uri-date'  => datetime_convert(),
-                               'avatar-date' => datetime_convert(),
+                               'name-date' => DateTimeFormat::utcNow(),
+                               'uri-date'  => DateTimeFormat::utcNow(),
+                               'avatar-date' => DateTimeFormat::utcNow(),
                                'writable'  => 1,
                                'blocked'   => 0,
                                'readonly'  => 0,
@@ -822,13 +823,13 @@ class Contact extends BaseObject
                }
 
                if (($data["addr"] != $contact["addr"]) || ($data["alias"] != $contact["alias"])) {
-                       $updated['uri-date'] = datetime_convert();
+                       $updated['uri-date'] = DateTimeFormat::utcNow();
                }
                if (($data["name"] != $contact["name"]) || ($data["nick"] != $contact["nick"])) {
-                       $updated['name-date'] = datetime_convert();
+                       $updated['name-date'] = DateTimeFormat::utcNow();
                }
 
-               $updated['avatar-date'] = datetime_convert();
+               $updated['avatar-date'] = DateTimeFormat::utcNow();
 
                dba::update('contact', $updated, ['id' => $contact_id], $contact);
 
@@ -1025,7 +1026,7 @@ class Contact extends BaseObject
                        if ($photos) {
                                dba::update(
                                        'contact',
-                                       ['avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'avatar-date' => datetime_convert()],
+                                       ['avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'avatar-date' => DateTimeFormat::utcNow()],
                                        ['id' => $cid]
                                );
 
@@ -1151,6 +1152,11 @@ class Contact extends BaseObject
 
                Addon::callHooks('follow', $arr);
 
+               if (empty($arr)) {
+                       $result['message'] = L10n::t('The contact could not be added. Please check the relevant network credentials in your Settings -> Social Networks page.');
+                       return $result;
+               }
+
                if (x($arr['contact'], 'name')) {
                        $ret = $arr['contact'];
                } else {
@@ -1255,7 +1261,7 @@ class Contact extends BaseObject
                        // create contact record
                        dba::insert('contact', [
                                'uid'     => $uid,
-                               'created' => datetime_convert(),
+                               'created' => DateTimeFormat::utcNow(),
                                'url'     => $ret['url'],
                                'nurl'    => normalise_link($ret['url']),
                                'addr'    => $ret['addr'],
@@ -1354,4 +1360,165 @@ class Contact extends BaseObject
 
                return $contact;
        }
+
+       public static function addRelationship($importer, $contact, $datarray, $item, $sharing = false) {
+               $url = notags(trim($datarray['author-link']));
+               $name = notags(trim($datarray['author-name']));
+               $photo = notags(trim($datarray['author-avatar']));
+
+               if (is_object($item)) {
+                       $rawtag = $item->get_item_tags(NAMESPACE_ACTIVITY,'actor');
+                       if ($rawtag && $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data']) {
+                               $nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'];
+                       }
+               } else {
+                       $nick = $item;
+               }
+
+               if (is_array($contact)) {
+                       if (($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING)
+                               || ($sharing && $contact['rel'] == CONTACT_IS_FOLLOWER)) {
+                               dba::update('contact', ['rel' => CONTACT_IS_FRIEND, 'writable' => true],
+                                               ['id' => $contact['id'], 'uid' => $importer['uid']]);
+                       }
+                       // send email notification to owner?
+               } else {
+                       // create contact record
+                       q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `name`, `nick`, `photo`, `network`, `rel`,
+                               `blocked`, `readonly`, `pending`, `writable`)
+                               VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, 1)",
+                               intval($importer['uid']),
+                               dbesc(DateTimeFormat::utcNow()),
+                               dbesc($url),
+                               dbesc(normalise_link($url)),
+                               dbesc($name),
+                               dbesc($nick),
+                               dbesc($photo),
+                               dbesc(NETWORK_OSTATUS),
+                               intval(CONTACT_IS_FOLLOWER)
+                       );
+
+                       $r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 LIMIT 1",
+                                       intval($importer['uid']),
+                                       dbesc($url)
+                       );
+                       if (DBM::is_result($r)) {
+                               $contact_record = $r[0];
+                               Contact::updateAvatar($photo, $importer["uid"], $contact_record["id"], true);
+                       }
+
+                       /// @TODO Encapsulate this into a function/method
+                       $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
+                               intval($importer['uid'])
+                       );
+                       if (DBM::is_result($r) && !in_array($r[0]['page-flags'], [PAGE_SOAPBOX, PAGE_FREELOVE, PAGE_COMMUNITY])) {
+                               // create notification
+                               $hash = random_string();
+
+                               if (is_array($contact_record)) {
+                                       dba::insert('intro', ['uid' => $importer['uid'], 'contact-id' => $contact_record['id'],
+                                                               'blocked' => false, 'knowyou' => false,
+                                                               'hash' => $hash, 'datetime' => DateTimeFormat::utcNow()]);
+                               }
+
+                               Group::addMember(User::getDefaultGroup($importer['uid'], $contact_record["network"]), $contact_record['id']);
+
+                               if (($r[0]['notify-flags'] & NOTIFY_INTRO) &&
+                                       in_array($r[0]['page-flags'], [PAGE_NORMAL])) {
+
+                                       notification([
+                                               'type'         => NOTIFY_INTRO,
+                                               'notify_flags' => $r[0]['notify-flags'],
+                                               'language'     => $r[0]['language'],
+                                               'to_name'      => $r[0]['username'],
+                                               'to_email'     => $r[0]['email'],
+                                               'uid'          => $r[0]['uid'],
+                                               'link'             => System::baseUrl() . '/notifications/intro',
+                                               'source_name'  => ((strlen(stripslashes($contact_record['name']))) ? stripslashes($contact_record['name']) : L10n::t('[Name Withheld]')),
+                                               'source_link'  => $contact_record['url'],
+                                               'source_photo' => $contact_record['photo'],
+                                               'verb'         => ($sharing ? ACTIVITY_FRIEND : ACTIVITY_FOLLOW),
+                                               'otype'        => 'intro'
+                                       ]);
+
+                               }
+                       } elseif (DBM::is_result($r) && in_array($r[0]['page-flags'], [PAGE_SOAPBOX, PAGE_FREELOVE, PAGE_COMMUNITY])) {
+                               q("UPDATE `contact` SET `pending` = 0 WHERE `uid` = %d AND `url` = '%s' AND `pending` LIMIT 1",
+                                               intval($importer['uid']),
+                                               dbesc($url)
+                               );
+                       }
+
+               }
+       }
+
+       public static function removeFollower($importer, $contact, array $datarray = [], $item = "") {
+
+               if (($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_SHARING)) {
+                       dba::update('contact', ['rel' => CONTACT_IS_SHARING], ['id' => $contact['id']]);
+               } else {
+                       Contact::remove($contact['id']);
+               }
+       }
+
+       public static function removeSharer($importer, $contact, array $datarray = [], $item = "") {
+
+               if (($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_FOLLOWER)) {
+                       dba::update('contact', ['rel' => CONTACT_IS_FOLLOWER], ['id' => $contact['id']]);
+               } else {
+                       Contact::remove($contact['id']);
+               }
+       }
+
+       /**
+        * @brief Create a birthday event.
+        *
+        * Update the year and the birthday.
+        */
+       public static function updateBirthdays()
+       {
+               // This only handles foreign or alien networks where a birthday has been provided.
+               // In-network birthdays are handled within local_delivery
+
+               $r = q("SELECT * FROM `contact` WHERE `bd` != '' AND `bd` > '0001-01-01' AND SUBSTRING(`bd`, 1, 4) != `bdyear` ");
+               if (DBM::is_result($r)) {
+                       foreach ($r as $rr) {
+                               logger('update_contact_birthday: ' . $rr['bd']);
+
+                               $nextbd = DateTimeFormat::utcNow('Y') . substr($rr['bd'], 4);
+
+                               /*
+                                * Add new birthday event for this person
+                                *
+                                * $bdtext is just a readable placeholder in case the event is shared
+                                * with others. We will replace it during presentation to our $importer
+                                * to contain a sparkle link and perhaps a photo.
+                                */
+
+                               // Check for duplicates
+                               $s = q("SELECT `id` FROM `event` WHERE `uid` = %d AND `cid` = %d AND `start` = '%s' AND `type` = '%s' LIMIT 1",
+                                       intval($rr['uid']), intval($rr['id']), dbesc(DateTimeFormat::utc($nextbd)), dbesc('birthday'));
+
+                               if (DBM::is_result($s)) {
+                                       continue;
+                               }
+
+                               $bdtext = L10n::t('%s\'s birthday', $rr['name']);
+                               $bdtext2 = L10n::t('Happy Birthday %s', ' [url=' . $rr['url'] . ']' . $rr['name'] . '[/url]');
+
+                               q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`,`adjust`)
+                               VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d' ) ", intval($rr['uid']), intval($rr['id']),
+                                       dbesc(DateTimeFormat::utcNow()), dbesc(DateTimeFormat::utcNow()), dbesc(DateTimeFormat::utc($nextbd)),
+                                       dbesc(DateTimeFormat::utc($nextbd . ' + 1 day ')), dbesc($bdtext), dbesc($bdtext2), dbesc('birthday'),
+                                       intval(0)
+                               );
+
+
+                               // update bdyear
+                               q("UPDATE `contact` SET `bdyear` = '%s', `bd` = '%s' WHERE `uid` = %d AND `id` = %d", dbesc(substr($nextbd, 0, 4)),
+                                       dbesc($nextbd), intval($rr['uid']), intval($rr['id'])
+                               );
+                       }
+               }
+       }
 }