protected function PollFeed($FeedURL, $LastImportDate)
{
$Pr = new ProxyRequest();
$FeedRSS = $Pr->Request(array('URL' => $FeedURL));
if (!$FeedRSS) {
return FALSE;
}
$RSSData = simplexml_load_string($FeedRSS);
if (!$RSSData) {
return FALSE;
}
$Channel = GetValue('channel', $RSSData, FALSE);
if (!$Channel) {
return FALSE;
}
if (!array_key_exists('item', $Channel)) {
return FALSE;
}
$Feed = $this->GetFeed($FeedURL, FALSE);
$DiscussionModel = new DiscussionModel();
$DiscussionModel->SpamCheck = FALSE;
$LastPublishDate = GetValue('LastPublishDate', $Feed, date('c'));
$LastPublishTime = strtotime($LastPublishDate);
$FeedLastPublishTime = 0;
foreach (GetValue('item', $Channel) as $Item) {
$FeedItemGUID = trim((string) GetValue('guid', $Item));
if (empty($FeedItemGUID)) {
Trace('guid is not set in each item of the RSS. Will attempt to use link as unique identifier.');
$FeedItemGUID = GetValue('link', $Item);
}
$FeedItemID = substr(md5($FeedItemGUID), 0, 30);
$ItemPubDate = (string) GetValue('pubDate', $Item, NULL);
if (is_null($ItemPubDate)) {
$ItemPubTime = time();
} else {
$ItemPubTime = strtotime($ItemPubDate);
}
if ($ItemPubTime > $FeedLastPublishTime) {
$FeedLastPublishTime = $ItemPubTime;
}
if ($ItemPubTime < $LastPublishTime && !$Feed['Historical']) {
continue;
}
$ExistingDiscussion = $DiscussionModel->GetWhere(array('ForeignID' => $FeedItemID));
if ($ExistingDiscussion && $ExistingDiscussion->NumRows()) {
continue;
}
$this->EventArguments['Publish'] = TRUE;
$this->EventArguments['FeedURL'] = $FeedURL;
$this->EventArguments['Feed'] =& $Feed;
$this->EventArguments['Item'] =& $Item;
$this->FireEvent('FeedItem');
if (!$this->EventArguments['Publish']) {
continue;
}
$StoryTitle = array_shift($Trash = explode("\n", (string) GetValue('title', $Item)));
$StoryBody = (string) GetValue('description', $Item);
$StoryPublished = date("Y-m-d H:i:s", $ItemPubTime);
$ParsedStoryBody = $StoryBody;
$ParsedStoryBody = '<div class="AutoFeedDiscussion">' . $ParsedStoryBody . '</div> <br /><div class="AutoFeedSource">Source: ' . $FeedItemGUID . '</div>';
$DiscussionData = array('Name' => $StoryTitle, 'Format' => 'Html', 'CategoryID' => $Feed['Category'], 'ForeignID' => substr($FeedItemID, 0, 30), 'Body' => $ParsedStoryBody);
// Post as Minion (if one exists) or the system user
if (Gdn::addonManager()->isEnabled('Minion', \Vanilla\Addon::TYPE_ADDON)) {
$Minion = Gdn::PluginManager()->GetPluginInstance('MinionPlugin');
$InsertUserID = $Minion->GetMinionUserID();
} else {
$InsertUserID = Gdn::UserModel()->GetSystemUserID();
}
$DiscussionData[$DiscussionModel->DateInserted] = $StoryPublished;
$DiscussionData[$DiscussionModel->InsertUserID] = $InsertUserID;
$DiscussionData[$DiscussionModel->DateUpdated] = $StoryPublished;
$DiscussionData[$DiscussionModel->UpdateUserID] = $InsertUserID;
$this->EventArguments['FeedDiscussion'] =& $DiscussionData;
$this->FireEvent('Publish');
if (!$this->EventArguments['Publish']) {
continue;
}
$InsertID = $DiscussionModel->Save($DiscussionData);
$this->EventArguments['DiscussionID'] = $InsertID;
$this->EventArguments['Validation'] = $DiscussionModel->Validation;
$this->FireEvent('Published');
// Reset discussion validation
$DiscussionModel->Validation->Results(TRUE);
}
$FeedKey = self::EncodeFeedKey($FeedURL);
$this->UpdateFeed($FeedKey, array('LastImport' => date('Y-m-d H:i:s'), 'LastPublishDate' => date('c', $FeedLastPublishTime)));
}