+ /**
+ * @brief Tests if the given contact is a follower
+ *
+ * @param int $cid Either public contact id or user's contact id
+ * @param int $uid User ID
+ *
+ * @return boolean is the contact id a follower?
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function isFollower($cid, $uid)
+ {
+ if (self::isBlockedByUser($cid, $uid)) {
+ return false;
+ }
+
+ $cdata = self::getPublicAndUserContacID($cid, $uid);
+ if (empty($cdata['user'])) {
+ return false;
+ }
+
+ $condition = ['id' => $cdata['user'], 'rel' => [self::FOLLOWER, self::FRIEND]];
+ return DBA::exists('contact', $condition);
+ }
+
+ /**
+ * @brief Get the basepath for a given contact link
+ * @todo Add functionality to store this value in the contact table
+ *
+ * @param string $url The contact link
+ *
+ * @return string basepath
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function getBasepath($url)
+ {
+ $data = Probe::uri($url);
+ if (!empty($data['baseurl'])) {
+ return $data['baseurl'];
+ }
+
+ // When we can't probe the server, we use some ugly function that does some pattern matching
+ return PortableContact::detectServer($url);
+ }
+