diff --git a/include/items.php b/include/items.php index 285a5745aa..6456fa2cba 100644 --- a/include/items.php +++ b/include/items.php @@ -410,7 +410,60 @@ function uri_to_guid($uri, $host = "") { return $guid_prefix.$host_hash; } -/// @TODO Maybe $arr must be called-by-reference? This function modifies it +function store_conversation($arr) { + if (in_array($arr['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) { + $conversation = array('item-uri' => $arr['uri'], 'received' => dbm::date()); + + if (isset($arr['parent-uri']) AND ($arr['parent-uri'] != $arr['uri'])) { + $conversation['reply-to-uri'] = $arr['parent-uri']; + } + if (isset($arr['thr-parent']) AND ($arr['thr-parent'] != $arr['uri'])) { + $conversation['reply-to-uri'] = $arr['thr-parent']; + } + + if (isset($arr['conversation-uri'])) { + $conversation['conversation-uri'] = $arr['conversation-uri']; + } + + if (isset($arr['conversation-href'])) { + $conversation['conversation-href'] = $arr['conversation-href']; + } + + if (isset($arr['protocol'])) { + $conversation['protocol'] = $arr['protocol']; + } + + if (isset($arr['source'])) { + $conversation['source'] = $arr['source']; + } + + $conv = dba::fetch_first("SELECT `protocol` FROM `conversation` WHERE `item-uri` = ?", $conversation['item-uri']); + if (dbm::is_result($conv)) { + if (($conv['protocol'] < $conversation['protocol']) AND ($conv['protocol'] != 0)) { + unset($conversation['protocol']); + unset($conversation['source']); + } + // Replace the conversation entry when the new one is better + //if ((($conv['protocol'] == 0) OR ($conv['protocol'] >= $conversation['protocol'])) AND ($conversation['protocol'] > 0)) { + if (!dba::update('conversation', $conversation, array('item-uri' => $conversation['item-uri']))) { + logger('Conversation: update for '.$conversation['item-uri'].' from '.$conv['protocol'].' to '.$conversation['protocol'].' failed', LOGGER_DEBUG); + } + //} + } else { + if (!dba::insert('conversation', $conversation)) { + logger('Conversation: insert for '.$conversation['item-uri'].' (protocol '.$conversation['protocol'].') failed', LOGGER_DEBUG); + } + } + } + + unset($arr['conversation-uri']); + unset($arr['conversation-href']); + unset($arr['protocol']); + unset($arr['source']); + + return $arr; +} + /// @TODO add type-hint array function item_store($arr, $force_parent = false, $notify = false, $dontcache = false) { @@ -436,6 +489,9 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f } } + // Store conversation data + $arr = store_conversation($arr); + /* * If a Diaspora signature structure was passed in, pull it out of the * item array and set it aside for later storage. @@ -691,51 +747,6 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f $arr['thr-parent'] = $arr['parent-uri']; - if (in_array($arr['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) { - $conversation = array('item-uri' => $arr['uri'], 'received' => dbm::date()); - - if (isset($arr['thr-parent'])) { - if ($arr['thr-parent'] != $arr['uri']) { - $conversation['reply-to-uri'] = $arr['thr-parent']; - } - } - - if (isset($arr['conversation-uri'])) { - $conversation['conversation-uri'] = $arr['conversation-uri']; - } - - if (isset($arr['conversation-href'])) { - $conversation['conversation-href'] = $arr['conversation-href']; - } - - if (isset($arr['protocol'])) { - $conversation['protocol'] = $arr['protocol']; - } - - if (isset($arr['source'])) { - $conversation['source'] = $arr['source']; - } - - $conv = dba::fetch_first("SELECT `protocol` FROM `conversation` WHERE `item-uri` = ?", $conversation['item-uri']); - if (dbm::is_result($conv)) { - // Replace the conversation entry when the new one is better - if ((($conv['protocol'] == 0) OR ($conv['protocol'] > $conversation['protocol'])) AND ($conversation['protocol'] > 0)) { - if (!dba::update('conversation', $conversation, array('item-uri' => $conversation['item-uri']))) { - logger('Conversation: update for '.$conversation['item-uri'].' from '.$conv['protocol'].' to '.$conversation['protocol'].' failed', LOGGER_DEBUG); - } - } - } else { - if (!dba::insert('conversation', $conversation)) { - logger('Conversation: insert for '.$conversation['item-uri'].' (protocol '.$conversation['protocol'].') failed', LOGGER_DEBUG); - } - } - } - - unset($arr['conversation-uri']); - unset($arr['conversation-href']); - unset($arr['protocol']); - unset($arr['source']); - if ($arr['parent-uri'] === $arr['uri']) { $parent_id = 0; $parent_deleted = 0; diff --git a/include/ostatus.php b/include/ostatus.php index 1800a9cc81..40bcdcdcc5 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -916,6 +916,8 @@ class ostatus { ($item["verb"] == ACTIVITY_LIKE) OR ($conversation_url == "")) { $item_stored = item_store($item, $all_threads); return $item_stored; + } elseif (count($item) > 0) { + $item = store_conversation($item); } // Get the parent