use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
+use Friendica\Protocol\ActivityPub;
use Friendica\Protocol\Diaspora;
use Friendica\Protocol\OStatus;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Strings;
use Friendica\Util\XML;
use Friendica\Worker\Delivery;
-use Friendica\Protocol\ActivityPub;
use Text_LanguageDetect;
class Item extends BaseObject
return $item_id;
}
- ActivityPub\Processor::fetchMissingActivity($uri);
-
- /// @todo add Diaspora as well
+ if (ActivityPub\Processor::fetchMissingActivity($uri)) {
+ $item_id = self::searchByLink($uri, $uid);
+ } else {
+ $item_id = Diaspora::fetchByURL($uri);
+ }
- $item_id = self::searchByLink($uri, $uid);
if (!empty($item_id)) {
return $item_id;
}
/**
* Fetches missing posts
*
- * @param $url
- * @param $child
+ * @param string $url message URL
+ * @param array $child activity array with the child of this message
+ * @return boolean success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function fetchMissingActivity($url, $child = [])
$object = ActivityPub::fetchContent($url, $uid);
if (empty($object)) {
Logger::log('Activity ' . $url . ' was not fetchable, aborting.');
- return;
+ return false;
}
if (empty($object['id'])) {
Logger::log('Activity ' . $url . ' has got not id, aborting. ' . json_encode($object));
- return;
+ return false;
}
if (!empty($child['author'])) {
ActivityPub\Receiver::processActivity($ldactivity);
Logger::log('Activity ' . $url . ' had been fetched and processed.');
+
+ return true;
}
/**
return $msg;
}
+ /**
+ * @brief Fetches an item with a given URL
+ *
+ * @param string $url the message url
+ *
+ * @return int the message id of the stored message or false
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function fetchByURL($url, $uid = 0)
+ {
+ if (!preg_match("=([http|https].*)/(.*)/(.*)=ism", $url, $matches)) {
+ return false;
+ }
+
+ // Check for Diaspora (and Friendica) typical path components
+ if (!in_array($matches[2], ['posts', 'display'])) {
+ return false;
+ }
+
+ $item = Item::selectFirst(['id'], ['guid' => $matches[3], 'uid' => $uid]);
+ if (DBA::isResult($item)) {
+ return $item['id'];
+ }
+
+ self::storeByGuid($matches[3], $matches[1], $uid);
+
+ $item = Item::selectFirst(['id'], ['guid' => $matches[3], 'uid' => $uid]);
+ if (DBA::isResult($item)) {
+ return $item['id'];
+ } else {
+ return false;
+ }
+ }
+
/**
* @brief Fetches the item record of a given guid
*