mirror of
https://github.com/friendica/friendica
synced 2025-04-27 18:30:12 +00:00
Relocate functions in items.php into several classes
This commit is contained in:
parent
3ac1992237
commit
efa8dbcfb3
7 changed files with 304 additions and 285 deletions
77
src/Model/Conversation.php
Normal file
77
src/Model/Conversation.php
Normal file
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
/**
|
||||
* @file src/Model/Conversation
|
||||
*/
|
||||
namespace Friendica\Model;
|
||||
|
||||
use Friendica\Database\DBM;
|
||||
use dba;
|
||||
|
||||
require_once "include/dba.php";
|
||||
|
||||
class Conversation
|
||||
{
|
||||
/**
|
||||
* @brief Store the conversation data
|
||||
*
|
||||
* @param array $arr Item array with conversation data
|
||||
* @return array Item array with removed conversation data
|
||||
*/
|
||||
public static function insert($arr) {
|
||||
if (in_array(defaults($arr, 'network', NETWORK_PHANTOM), [NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS]) && !empty($arr['uri'])) {
|
||||
$conversation = ['item-uri' => $arr['uri'], 'received' => DBM::date()];
|
||||
|
||||
if (isset($arr['parent-uri']) && ($arr['parent-uri'] != $arr['uri'])) {
|
||||
$conversation['reply-to-uri'] = $arr['parent-uri'];
|
||||
}
|
||||
if (isset($arr['thr-parent']) && ($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'];
|
||||
}
|
||||
|
||||
$old_conv = dba::fetch_first("SELECT `item-uri`, `reply-to-uri`, `conversation-uri`, `conversation-href`, `protocol`, `source`
|
||||
FROM `conversation` WHERE `item-uri` = ?", $conversation['item-uri']);
|
||||
if (DBM::is_result($old_conv)) {
|
||||
// Don't update when only the source has changed.
|
||||
// Only do this when there had been no source before.
|
||||
if ($old_conv['source'] != '') {
|
||||
unset($old_conv['source']);
|
||||
}
|
||||
// Update structure data all the time but the source only when its from a better protocol.
|
||||
if (($old_conv['protocol'] < $conversation['protocol']) && ($old_conv['protocol'] != 0)) {
|
||||
unset($conversation['protocol']);
|
||||
unset($conversation['source']);
|
||||
}
|
||||
if (!dba::update('conversation', $conversation, ['item-uri' => $conversation['item-uri']], $old_conv)) {
|
||||
logger('Conversation: update for '.$conversation['item-uri'].' from '.$conv['protocol'].' to '.$conversation['protocol'].' failed', LOGGER_DEBUG);
|
||||
}
|
||||
} else {
|
||||
if (!dba::insert('conversation', $conversation, true)) {
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -11,6 +11,7 @@ use Friendica\Model\Term;
|
|||
use Friendica\Model\Contact;
|
||||
use Friendica\Database\DBM;
|
||||
use dba;
|
||||
use Text_LanguageDetect;
|
||||
|
||||
require_once 'include/tags.php';
|
||||
require_once 'include/threads.php';
|
||||
|
@ -290,4 +291,135 @@ class Item
|
|||
|
||||
logger("Stored public shadow for comment ".$item['uri']." under id ".$public_shadow, LOGGER_DEBUG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a "lang" specification in a "postopts" element of given $arr,
|
||||
* if possible and not already present.
|
||||
* Expects "body" element to exist in $arr.
|
||||
*
|
||||
* @todo change to "local", once the "Item::insert" is in this class
|
||||
*/
|
||||
public static function addLanguageInPostopts(&$arr)
|
||||
{
|
||||
if (x($arr, 'postopts')) {
|
||||
if (strstr($arr['postopts'], 'lang=')) {
|
||||
// do not override
|
||||
return;
|
||||
}
|
||||
$postopts = $arr['postopts'];
|
||||
} else {
|
||||
$postopts = "";
|
||||
}
|
||||
|
||||
$naked_body = preg_replace('/\[(.+?)\]/','', $arr['body']);
|
||||
$l = new Text_LanguageDetect();
|
||||
$lng = $l->detect($naked_body, 3);
|
||||
|
||||
if (sizeof($lng) > 0) {
|
||||
if ($postopts != "") {
|
||||
$postopts .= '&'; // arbitrary separator, to be reviewed
|
||||
}
|
||||
|
||||
$postopts .= 'lang=';
|
||||
$sep = "";
|
||||
|
||||
foreach ($lng as $language => $score) {
|
||||
$postopts .= $sep . $language . ";" . $score;
|
||||
$sep = ':';
|
||||
}
|
||||
$arr['postopts'] = $postopts;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Creates an unique guid out of a given uri
|
||||
*
|
||||
* @param string $uri uri of an item entry
|
||||
* @param string $host (Optional) hostname for the GUID prefix
|
||||
* @return string unique guid
|
||||
*/
|
||||
public static function GuidFromUri($uri, $host = "")
|
||||
{
|
||||
// Our regular guid routine is using this kind of prefix as well
|
||||
// We have to avoid that different routines could accidentally create the same value
|
||||
$parsed = parse_url($uri);
|
||||
|
||||
// When the hostname isn't given, we take it from the uri
|
||||
if ($host == "") {
|
||||
// Is it in the format data@host.tld?
|
||||
if ((count($parsed) == 1) && strstr($uri, '@')) {
|
||||
$mailparts = explode('@', $uri);
|
||||
$host = array_pop($mailparts);
|
||||
} else {
|
||||
$host = $parsed["host"];
|
||||
}
|
||||
}
|
||||
|
||||
// We use a hash of the hostname as prefix for the guid
|
||||
$guid_prefix = hash("crc32", $host);
|
||||
|
||||
// Remove the scheme to make sure that "https" and "http" doesn't make a difference
|
||||
unset($parsed["scheme"]);
|
||||
|
||||
// Glue it together to be able to make a hash from it
|
||||
$host_id = implode("/", $parsed);
|
||||
|
||||
// We could use any hash algorithm since it isn't a security issue
|
||||
$host_hash = hash("ripemd128", $host_id);
|
||||
|
||||
return $guid_prefix.$host_hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set "success_update" and "last-item" to the date of the last time we heard from this contact
|
||||
*
|
||||
* This can be used to filter for inactive contacts.
|
||||
* Only do this for public postings to avoid privacy problems, since poco data is public.
|
||||
* Don't set this value if it isn't from the owner (could be an author that we don't know)
|
||||
*
|
||||
* @Todo Set this to private, once Item::insert is there
|
||||
*
|
||||
* @param array $arr Contains the just posted item record
|
||||
*/
|
||||
public static function updateContact($arr) {
|
||||
// Unarchive the author
|
||||
$contact = dba::selectFirst('contact', [], ['id' => $arr["author-link"]]);
|
||||
if ($contact['term-date'] > NULL_DATE) {
|
||||
Contact::unmarkForArchival($contact);
|
||||
}
|
||||
|
||||
// Unarchive the contact if it is a toplevel posting
|
||||
if ($arr["parent-uri"] === $arr["uri"]) {
|
||||
$contact = dba::selectFirst('contact', [], ['id' => $arr["contact-id"]]);
|
||||
if ($contact['term-date'] > NULL_DATE) {
|
||||
Contact::unmarkForArchival($contact);
|
||||
}
|
||||
}
|
||||
|
||||
$update = (!$arr['private'] && (($arr["author-link"] === $arr["owner-link"]) || ($arr["parent-uri"] === $arr["uri"])));
|
||||
|
||||
// Is it a forum? Then we don't care about the rules from above
|
||||
if (!$update && ($arr["network"] == NETWORK_DFRN) && ($arr["parent-uri"] === $arr["uri"])) {
|
||||
$isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`",
|
||||
intval($arr['contact-id']));
|
||||
if (DBM::is_result($isforum)) {
|
||||
$update = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($update) {
|
||||
dba::update('contact', ['success_update' => $arr['received'], 'last-item' => $arr['received']],
|
||||
['id' => $arr['contact-id']]);
|
||||
}
|
||||
// Now do the same for the system wide contacts with uid=0
|
||||
if (!$arr['private']) {
|
||||
dba::update('contact', ['success_update' => $arr['received'], 'last-item' => $arr['received']],
|
||||
['id' => $arr['owner-id']]);
|
||||
|
||||
if ($arr['owner-id'] != $arr['author-id']) {
|
||||
dba::update('contact', ['success_update' => $arr['received'], 'last-item' => $arr['received']],
|
||||
['id' => $arr['author-id']]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue